mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-05 21:47:48 +01:00
Compare commits
18 Commits
v1.6.1
...
06d8d9bd1d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06d8d9bd1d | ||
|
|
4031178831 | ||
|
|
b65c8399d8 | ||
|
|
6b63cfd491 | ||
|
|
196c51bf73 | ||
|
|
17c9b2631e | ||
|
|
1a21189643 | ||
|
|
b6b428363c | ||
|
|
e707fa46cf | ||
|
|
3d040362cb | ||
|
|
57b193b037 | ||
|
|
8a75c9b6e3 | ||
|
|
0dafc792f7 | ||
|
|
afc0fe29ee | ||
|
|
817a9bbce5 | ||
|
|
3ef7031eb0 | ||
|
|
6faf32eae9 | ||
|
|
455e86571a |
4
.github/workflows/docker-publish.yml
vendored
4
.github/workflows/docker-publish.yml
vendored
@@ -35,6 +35,7 @@ jobs:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
@@ -93,6 +94,7 @@ jobs:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
@@ -127,7 +129,7 @@ jobs:
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Setup QEMU
|
||||
uses: docker/setup-qemu-action@v3.6.0
|
||||
uses: docker/setup-qemu-action@v3.7.0
|
||||
|
||||
- name: Setup Docker buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@@ -51,6 +51,8 @@ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
|
||||
|
||||
RUN apk add --no-cache su-exec iputils-ping shadow
|
||||
|
||||
USER root
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOSTNAME=0.0.0.0
|
||||
ENV PORT=3000
|
||||
|
||||
@@ -57,8 +57,8 @@ if [ -d /app/.next ]; then
|
||||
fi
|
||||
|
||||
# Drop privileges (when asked to) if root, otherwise run as current user
|
||||
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
|
||||
su-exec ${PUID}:${PGID} "$@"
|
||||
if [ "$(id -u)" = "0" ] && [ "${PUID}" != "0" ]; then
|
||||
exec su-exec ${PUID}:${PGID} "$@"
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
@@ -571,3 +571,18 @@ or per service widget (`services.yaml`) with:
|
||||
```
|
||||
|
||||
If either value is set to true, the error message will be hidden.
|
||||
|
||||
## Disable Search Engine Indexing
|
||||
|
||||
You can request that search engines not to index your Homepage instance by enabling the `disableIndexing` setting.
|
||||
|
||||
```yaml
|
||||
disableIndexing: true
|
||||
```
|
||||
|
||||
When enabled, this will:
|
||||
|
||||
- Disallow all crawlers in `robots.txt`
|
||||
- Add `<meta name="robots" content="noindex, nofollow">` tags to prevent indexing
|
||||
|
||||
By default this feature is disabled.
|
||||
|
||||
@@ -8,6 +8,9 @@ Learn more about [Crowdsec](https://crowdsec.net).
|
||||
See the [crowdsec docs](https://docs.crowdsec.net/docs/local_api/intro/#machines) for information about registering a machine,
|
||||
in most instances you can use the default credentials (`/etc/crowdsec/local_api_credentials.yaml`).
|
||||
|
||||
!!! note
|
||||
Without the `limit24h` option, the widget will fetch all alerts which is limited to 100 by the API to avoid performance issues.
|
||||
|
||||
Allowed fields: `["alerts", "bans"]`.
|
||||
|
||||
```yaml
|
||||
@@ -16,4 +19,5 @@ widget:
|
||||
url: http://crowdsechostorip:port
|
||||
username: localhost # machine_id in crowdsec
|
||||
password: password
|
||||
limit24h: true # optional, limits alerts to last 24h. Default: false
|
||||
```
|
||||
|
||||
@@ -15,7 +15,7 @@ See the [official docs](https://github.com/ghostfolio/ghostfolio#authorization-b
|
||||
|
||||
_Note that the Bearer token is valid for 6 months, after which a new one must be generated._
|
||||
|
||||
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max"]`
|
||||
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max", "net_worth"]`
|
||||
|
||||
```yaml
|
||||
widget:
|
||||
|
||||
@@ -17,6 +17,6 @@ widget:
|
||||
url: http://komodo.hostname.or.ip:port
|
||||
key: K-xxxxxx...
|
||||
secret: S-xxxxxx...
|
||||
showSummary: true # optional, default: false
|
||||
showSummary: true # optional, default: false. Takes precedence over showStacks
|
||||
showStacks: true # optional, default: false
|
||||
```
|
||||
|
||||
@@ -3,7 +3,7 @@ title: Omada
|
||||
description: Omada Widget Configuration
|
||||
---
|
||||
|
||||
The widget supports controller versions 3, 4 and 5.
|
||||
The widget supports controller versions 3, 4, 5 and 6.
|
||||
|
||||
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homepage",
|
||||
"version": "1.6.1",
|
||||
"version": "1.7.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
@@ -63,13 +63,6 @@
|
||||
"optionalDependencies": {
|
||||
"osx-temperature-sensor": "^1.0.8"
|
||||
},
|
||||
"packageManager": "pnpm@10.8.1",
|
||||
"devEngines": {
|
||||
"packageManager": {
|
||||
"name": "pnpm",
|
||||
"version": "10.8.1"
|
||||
}
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"osx-temperature-sensor",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Vandag",
|
||||
"gross_percent_1y": "Een jaar",
|
||||
"gross_percent_max": "Alle tyd"
|
||||
"gross_percent_max": "Alle tyd",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podsendinge",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "سنة",
|
||||
"gross_percent_max": "كل الوقت"
|
||||
"gross_percent_max": "كل الوقت",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "بودكاست",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Една година",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un any",
|
||||
"gross_percent_max": "Sempre"
|
||||
"gross_percent_max": "Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Pòdcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Jeden rok",
|
||||
"gross_percent_max": "Za celou dobu"
|
||||
"gross_percent_max": "Za celou dobu",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Et År",
|
||||
"gross_percent_max": "Altid"
|
||||
"gross_percent_max": "Altid",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Heute",
|
||||
"gross_percent_1y": "Ein Jahr",
|
||||
"gross_percent_max": "Gesamt"
|
||||
"gross_percent_max": "Gesamt",
|
||||
"net_worth": ""
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Ένας χρόνος",
|
||||
"gross_percent_max": "Διαχρονικά"
|
||||
"gross_percent_max": "Διαχρονικά",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Hoy",
|
||||
"gross_percent_1y": "Un año",
|
||||
"gross_percent_max": "Todo el tiempo"
|
||||
"gross_percent_max": "Todo el tiempo",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Aujourd'hui",
|
||||
"gross_percent_1y": "Un an",
|
||||
"gross_percent_max": "Depuis le début"
|
||||
"gross_percent_max": "Depuis le début",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "היום",
|
||||
"gross_percent_1y": "שנה",
|
||||
"gross_percent_max": "כל הזמן"
|
||||
"gross_percent_max": "כל הזמן",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "פודקאסטים",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Danas",
|
||||
"gross_percent_1y": "Jedna godina",
|
||||
"gross_percent_max": "Svo vrijeme"
|
||||
"gross_percent_max": "Svo vrijeme",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasti",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Egy év",
|
||||
"gross_percent_max": "Mindig"
|
||||
"gross_percent_max": "Mindig",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Satu Tahun",
|
||||
"gross_percent_max": "Sepanjang Masa"
|
||||
"gross_percent_max": "Sepanjang Masa",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
"passes": "Tessere"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"playing": "In riproduzione",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams",
|
||||
@@ -313,7 +313,7 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Downloaded",
|
||||
"download": "Scaricati",
|
||||
"nondownload": "Non Scaricato",
|
||||
"read": "Read",
|
||||
"unread": "Unread",
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un anno",
|
||||
"gross_percent_max": "Sempre"
|
||||
"gross_percent_max": "Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "1年",
|
||||
"gross_percent_max": "全期間"
|
||||
"gross_percent_max": "全期間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "ポッドキャスト",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "오늘",
|
||||
"gross_percent_1y": "1년",
|
||||
"gross_percent_max": "전체 기간"
|
||||
"gross_percent_max": "전체 기간",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "팟캐스트",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Satu tahun",
|
||||
"gross_percent_max": "Sepanjang masa"
|
||||
"gross_percent_max": "Sepanjang masa",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podkas",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Vandaag",
|
||||
"gross_percent_1y": "Een jaar",
|
||||
"gross_percent_max": "Altijd"
|
||||
"gross_percent_max": "Altijd",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Ett år",
|
||||
"gross_percent_max": "Gjennom tidene"
|
||||
"gross_percent_max": "Gjennom tidene",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podkaster",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Dzisiaj",
|
||||
"gross_percent_1y": "Rok",
|
||||
"gross_percent_max": "Od początku"
|
||||
"gross_percent_max": "Od początku",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Um ano",
|
||||
"gross_percent_max": "Desde Sempre"
|
||||
"gross_percent_max": "Desde Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Hoje",
|
||||
"gross_percent_1y": "Um ano",
|
||||
"gross_percent_max": "Todo o tempo"
|
||||
"gross_percent_max": "Todo o tempo",
|
||||
"net_worth": "Patrimônio Líquido"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un an",
|
||||
"gross_percent_max": "Tot timpul"
|
||||
"gross_percent_max": "Tot timpul",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasturi",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Сегодня",
|
||||
"gross_percent_1y": "Один год",
|
||||
"gross_percent_max": "Все время"
|
||||
"gross_percent_max": "Все время",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасты",
|
||||
|
||||
@@ -362,8 +362,8 @@
|
||||
},
|
||||
"trilium": {
|
||||
"version": "Verzia",
|
||||
"notesCount": "Notes",
|
||||
"dbSize": "Database Size",
|
||||
"notesCount": "Poznámky",
|
||||
"dbSize": "Veľkosť databázy",
|
||||
"unknown": "Neznáme"
|
||||
},
|
||||
"navidrome": {
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Dnes",
|
||||
"gross_percent_1y": "Jeden rok",
|
||||
"gross_percent_max": "Za celý čas"
|
||||
"gross_percent_max": "Za celý čas",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
@@ -786,7 +787,7 @@
|
||||
"downloadCount": "Poradie",
|
||||
"downloadBytesRemaining": "Zostávajúce",
|
||||
"downloadTotalBytes": "Veľkosť",
|
||||
"downloadSpeed": "Speed"
|
||||
"downloadSpeed": "Rýchlosť"
|
||||
},
|
||||
"kavita": {
|
||||
"seriesCount": "Series",
|
||||
@@ -952,7 +953,7 @@
|
||||
"loading": "Načítava sa",
|
||||
"open": "Open - US Market",
|
||||
"closed": "Closed - US Market",
|
||||
"invalidConfiguration": "Invalid Configuration"
|
||||
"invalidConfiguration": "Neplatná konfigurácia"
|
||||
},
|
||||
"frigate": {
|
||||
"cameras": "Kamery",
|
||||
@@ -1022,10 +1023,10 @@
|
||||
"loading": "Načítava sa"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"issues": "Issues",
|
||||
"groups": "Skupiny",
|
||||
"issues": "Problémy",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"projects": "Projekty"
|
||||
},
|
||||
"apcups": {
|
||||
"status": "Stav",
|
||||
@@ -1035,7 +1036,7 @@
|
||||
},
|
||||
"karakeep": {
|
||||
"bookmarks": "Bookmarks",
|
||||
"favorites": "Favorites",
|
||||
"favorites": "Obľúbené",
|
||||
"archived": "Archived",
|
||||
"highlights": "Highlights",
|
||||
"lists": "Zoznamy",
|
||||
@@ -1065,13 +1066,13 @@
|
||||
"komodo": {
|
||||
"total": "Celkom",
|
||||
"running": "Beží",
|
||||
"stopped": "Stopped",
|
||||
"stopped": "Zastavené",
|
||||
"down": "Down",
|
||||
"unhealthy": "Nezdravý",
|
||||
"unknown": "Neznáme",
|
||||
"servers": "Servers",
|
||||
"servers": "Servery",
|
||||
"stacks": "Stacks",
|
||||
"containers": "Containers"
|
||||
"containers": "Kontajnery"
|
||||
},
|
||||
"filebrowser": {
|
||||
"available": "Dostupné",
|
||||
@@ -1080,8 +1081,8 @@
|
||||
},
|
||||
"wallos": {
|
||||
"activeSubscriptions": "Subscriptions",
|
||||
"thisMonthlyCost": "This Month",
|
||||
"nextMonthlyCost": "Next Month",
|
||||
"thisMonthlyCost": "Tento mesiac",
|
||||
"nextMonthlyCost": "Ďalší mesiac",
|
||||
"previousMonthlyCost": "Prev. Month",
|
||||
"nextRenewingSubscription": "Next Payment"
|
||||
},
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Eno leto",
|
||||
"gross_percent_max": "Celoten čas"
|
||||
"gross_percent_max": "Celoten čas",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasti",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Данас",
|
||||
"gross_percent_1y": "Једна година",
|
||||
"gross_percent_max": "Све време"
|
||||
"gross_percent_max": "Све време",
|
||||
"net_worth": "Нето вредност"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Bugün",
|
||||
"gross_percent_1y": "Bir yıl",
|
||||
"gross_percent_max": "Tüm zaman"
|
||||
"gross_percent_max": "Tüm zaman",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Один рік",
|
||||
"gross_percent_max": "Весь час"
|
||||
"gross_percent_max": "Весь час",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有時間"
|
||||
"gross_percent_max": "所有時間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "播客",
|
||||
|
||||
@@ -200,10 +200,10 @@
|
||||
"rutorrent": {
|
||||
"active": "活动中",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
"download": "下载"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"download": "下载",
|
||||
"upload": "",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
@@ -223,8 +223,8 @@
|
||||
"invalid": "Invalid"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有时间"
|
||||
"gross_percent_max": "所有时间",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "播客",
|
||||
|
||||
@@ -759,7 +759,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有時間"
|
||||
"gross_percent_max": "所有時間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -14,6 +14,8 @@ export default function Error({ error }) {
|
||||
|
||||
if (typeof error === "string") {
|
||||
error = { message: error }; // eslint-disable-line no-param-reassign
|
||||
} else if (typeof error === "number") {
|
||||
error = { message: `Error ${error}` }; // eslint-disable-line no-param-reassign
|
||||
}
|
||||
|
||||
if (error?.data?.error) {
|
||||
|
||||
@@ -400,6 +400,7 @@ function Home({ initialSettings }) {
|
||||
"A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
||||
}
|
||||
/>
|
||||
{settings.disableIndexing && <meta name="robots" content="noindex, nofollow" />}
|
||||
{settings.base && <base href={settings.base} />}
|
||||
{settings.favicon ? (
|
||||
<>
|
||||
|
||||
19
src/pages/robots.txt.js
Normal file
19
src/pages/robots.txt.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import { getSettings } from "utils/config/config";
|
||||
|
||||
export async function getServerSideProps({ res }) {
|
||||
const settings = getSettings();
|
||||
const content = ["User-agent: *", !!settings.disableIndexing ? "Disallow: /" : "Allow: /"].join("\n");
|
||||
|
||||
res.setHeader("Content-Type", "text/plain");
|
||||
res.write(content);
|
||||
res.end();
|
||||
|
||||
return {
|
||||
props: {},
|
||||
};
|
||||
}
|
||||
|
||||
export default function RobotsTxt() {
|
||||
// placeholder component
|
||||
return null;
|
||||
}
|
||||
@@ -279,6 +279,9 @@ export function cleanServiceGroups(groups) {
|
||||
slugs,
|
||||
symbols,
|
||||
|
||||
// crowdsec
|
||||
limit24h,
|
||||
|
||||
// customapi
|
||||
mappings,
|
||||
display,
|
||||
@@ -473,6 +476,10 @@ export function cleanServiceGroups(groups) {
|
||||
if (defaultinterval) widget.defaultinterval = defaultinterval;
|
||||
}
|
||||
|
||||
if (limit24h !== undefined) {
|
||||
widget.limit24h = !!limit24h;
|
||||
}
|
||||
|
||||
if (type === "docker") {
|
||||
if (server) widget.server = server;
|
||||
if (container) widget.container = container;
|
||||
|
||||
@@ -106,13 +106,19 @@ export default function Integration({ config, params, setEvents, hideErrors, tim
|
||||
};
|
||||
|
||||
const eventsToAdd = [];
|
||||
events.forEach((event, index) => {
|
||||
events.forEach((event) => {
|
||||
const occurrences = getOcurrencesFromRange(event);
|
||||
|
||||
occurrences.forEach((icalDate) => {
|
||||
const date = icalDate.toJSDate();
|
||||
|
||||
const hash = simpleHash(`${event.id}-${event.title}-${index}-${date.toString()}`);
|
||||
const occurrenceTimestamp = date.getTime();
|
||||
const eventIdentifier =
|
||||
event.id ??
|
||||
simpleHash(
|
||||
`${event.title ?? ""}-${event.type ?? ""}-${event.status ?? ""}-${event.url ?? ""}-${event.location ?? ""}`,
|
||||
);
|
||||
const hash = simpleHash(`${eventIdentifier}-${occurrenceTimestamp}`);
|
||||
|
||||
let title = event.title;
|
||||
if (showName) {
|
||||
|
||||
@@ -9,7 +9,7 @@ export default function Component({ service }) {
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: alerts, error: alertsError } = useWidgetAPI(widget, "alerts");
|
||||
const { data: alerts, error: alertsError } = useWidgetAPI(widget, !!widget.limit24h ? "alerts24h" : "alerts");
|
||||
const { data: bans, error: bansError } = useWidgetAPI(widget, "bans");
|
||||
|
||||
if (alertsError || bansError) {
|
||||
|
||||
@@ -9,6 +9,9 @@ const widget = {
|
||||
alerts: {
|
||||
endpoint: "alerts",
|
||||
},
|
||||
alerts24h: {
|
||||
endpoint: "alerts?limit=0&since=24h",
|
||||
},
|
||||
bans: {
|
||||
endpoint: "alerts?decision_type=ban&origin=crowdsec&has_active_decision=1",
|
||||
},
|
||||
|
||||
@@ -166,7 +166,11 @@ export default function Component({ service }) {
|
||||
refreshInterval: Math.max(1000, refreshInterval),
|
||||
});
|
||||
|
||||
if (customError) {
|
||||
// if mappings includes an error field and the data contains an error field then show data even if there is an error
|
||||
const mappingsIncludesError = Array.isArray(mappings) && mappings.find((mapping) => mapping.field === "error");
|
||||
const errorIsData = customData && typeof customData === "object" && "error" in customData;
|
||||
|
||||
if (customError && !(mappingsIncludesError && errorIsData)) {
|
||||
return <Container service={service} error={customError} />;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,12 @@ export default function Component({ service }) {
|
||||
return <Container service={service} error={resultError} />;
|
||||
}
|
||||
|
||||
if (!widget.fields || widget.fields.length === 0) {
|
||||
widget.fields = ["online", "offline", "offline_alt", "total"];
|
||||
} else if (widget.fields.length > 4) {
|
||||
widget.fields = widget.fields.slice(0, 4);
|
||||
}
|
||||
|
||||
if (!resultData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
|
||||
@@ -20,13 +20,15 @@ function getPerformancePercent(t, performanceRange) {
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
const includeNetWorth = widget.fields?.includes("net_worth");
|
||||
|
||||
const { data: performanceToday, error: ghostfolioErrorToday } = useWidgetAPI(widget, "today");
|
||||
const { data: performanceYear, error: ghostfolioErrorYear } = useWidgetAPI(widget, "year");
|
||||
const { data: performanceMax, error: ghostfolioErrorMax } = useWidgetAPI(widget, "max");
|
||||
const { data: userInfo, error: ghostfolioErrorUserInfo } = useWidgetAPI(widget, includeNetWorth ? "userInfo" : "");
|
||||
|
||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
|
||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax;
|
||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax || ghostfolioErrorUserInfo) {
|
||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax ?? ghostfolioErrorUserInfo;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
@@ -34,12 +36,13 @@ export default function Component({ service }) {
|
||||
return <Container service={service} error={performanceToday} />;
|
||||
}
|
||||
|
||||
if (!performanceToday || !performanceYear || !performanceMax) {
|
||||
if (!performanceToday || !performanceYear || !performanceMax || (includeNetWorth && !userInfo)) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="ghostfolio.gross_percent_today" />
|
||||
<Block label="ghostfolio.gross_percent_1y" />
|
||||
<Block label="ghostfolio.gross_percent_max" />
|
||||
{includeNetWorth && <Block label="ghostfolio.net_worth" />}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
@@ -49,6 +52,12 @@ export default function Component({ service }) {
|
||||
<Block label="ghostfolio.gross_percent_today" value={getPerformancePercent(t, performanceToday)} />
|
||||
<Block label="ghostfolio.gross_percent_1y" value={getPerformancePercent(t, performanceYear)} />
|
||||
<Block label="ghostfolio.gross_percent_max" value={getPerformancePercent(t, performanceMax)} />
|
||||
{includeNetWorth && (
|
||||
<Block
|
||||
label="ghostfolio.net_worth"
|
||||
value={`${performanceToday.performance.currentNetWorth.toFixed(2)} ${userInfo?.settings?.currency ?? ""}`}
|
||||
/>
|
||||
)}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/v2/portfolio/performance?range={endpoint}",
|
||||
api: "{url}/api/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
today: {
|
||||
endpoint: "1d",
|
||||
endpoint: "v2/portfolio/performance?range=1d",
|
||||
},
|
||||
year: {
|
||||
endpoint: "1y",
|
||||
endpoint: "v2/portfolio/performance?range=1y",
|
||||
},
|
||||
max: {
|
||||
endpoint: "max",
|
||||
endpoint: "v2/portfolio/performance?range=max",
|
||||
},
|
||||
userInfo: {
|
||||
endpoint: "v1/user",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -32,7 +32,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (
|
||||
(!widget.showStacks && !containersData) ||
|
||||
(widget.showSummary && (!stacksData || !serversData)) ||
|
||||
(widget.showSummary && (!containersData || !stacksData || !serversData)) ||
|
||||
(widget.showStacks && !stacksData)
|
||||
) {
|
||||
return widget.showSummary ? (
|
||||
|
||||
@@ -24,9 +24,9 @@ export default function Component({ service }) {
|
||||
if (!data || (data && data.length === 0)) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="myspeed.ping" />
|
||||
<Block label="myspeed.download" />
|
||||
<Block label="myspeed.upload" />
|
||||
<Block label="myspeed.ping" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user