Compare commits

..

2 Commits

Author SHA1 Message Date
shamoon
0d788e3d06 Documentation: note instructions for enabling IPv6 in Docker
Some checks are pending
Docker CI / Linting Checks (push) Waiting to run
Docker CI / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Waiting to run
Docs / Test Build Docs (push) Blocked by required conditions
Docs / Build & Deploy Docs (push) Blocked by required conditions
2025-12-07 08:49:27 -08:00
shamoon
8887281246 Documentation: make docker.sock mount read-only in docs
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Docs / Linting Checks (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docs / Test Build Docs (push) Has been cancelled
Docs / Build & Deploy Docs (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
2025-11-30 20:04:42 -08:00
61 changed files with 95 additions and 193 deletions

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: crowdin action
uses: crowdin/github-action@v2
with:

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Install python
uses: actions/setup-python@v6
@@ -62,7 +62,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Extract Docker metadata
id: meta

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Install python
uses: actions/setup-python@v6
with:
@@ -32,7 +32,7 @@ jobs:
needs:
- pre-commit
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: 3.x
@@ -54,7 +54,7 @@ jobs:
needs:
- pre-commit
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v5
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]

View File

@@ -571,18 +571,3 @@ 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.

View File

@@ -14,7 +14,7 @@ services:
- 3000:3000
volumes:
- /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
environment:
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
```
@@ -36,7 +36,7 @@ services:
- 3000:3000
volumes:
- /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations, see alternative methods
environment:
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
PUID: $PUID

View File

@@ -68,7 +68,19 @@ All service widgets work essentially the same, that is, homepage makes a proxied
If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container.
## Disabling IPv6
## Enabling IPv6 for the homepage container
To enable IPv6 support for the homepage container, you can set the `HOSTNAME` environment variable, for example:
```yaml
services:
homepage:
...
environment:
- HOSTNAME=::
```
## Disabling IPv6 for http requests {#disabling-ipv6}
If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), in certain setups you may need to disable IPv6. You can set the environment variable `HOMEPAGE_PROXY_DISABLE_IPV6` to `true` to disable IPv6 for the homepage proxy.

View File

@@ -8,9 +8,6 @@ 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
@@ -19,5 +16,4 @@ widget:
url: http://crowdsechostorip:port
username: localhost # machine_id in crowdsec
password: password
limit24h: true # optional, limits alerts to last 24h. Default: false
```

View File

@@ -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", "net_worth"]`
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max"]`
```yaml
widget:

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Vandag",
"gross_percent_1y": "Een jaar",
"gross_percent_max": "Alle tyd",
"net_worth": "Net Worth"
"gross_percent_max": "Alle tyd"
},
"audiobookshelf": {
"podcasts": "Podsendinge",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "سنة",
"gross_percent_max": "كل الوقت",
"net_worth": "Net Worth"
"gross_percent_max": "كل الوقت"
},
"audiobookshelf": {
"podcasts": "بودكاست",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Една година",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Подкасти",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Un any",
"gross_percent_max": "Sempre",
"net_worth": "Net Worth"
"gross_percent_max": "Sempre"
},
"audiobookshelf": {
"podcasts": "Pòdcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Jeden rok",
"gross_percent_max": "Za celou dobu",
"net_worth": "Net Worth"
"gross_percent_max": "Za celou dobu"
},
"audiobookshelf": {
"podcasts": "Podcasty",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Et År",
"gross_percent_max": "Altid",
"net_worth": "Net Worth"
"gross_percent_max": "Altid"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Heute",
"gross_percent_1y": "Ein Jahr",
"gross_percent_max": "Gesamt",
"net_worth": ""
"gross_percent_max": "Gesamt"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Ένας χρόνος",
"gross_percent_max": "Διαχρονικά",
"net_worth": "Net Worth"
"gross_percent_max": "Διαχρονικά"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Hoy",
"gross_percent_1y": "Un año",
"gross_percent_max": "Todo el tiempo",
"net_worth": "Net Worth"
"gross_percent_max": "Todo el tiempo"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -142,8 +142,8 @@
"connectionStatusDisconnected": "Déconnecté",
"connectionStatusConnected": "Connecté",
"uptime": "Démarré depuis",
"maxDown": "Réception max",
"maxUp": "Envoi max",
"maxDown": "Réception max.",
"maxUp": "Envoi max.",
"down": "Réception",
"up": "Envoi",
"received": "Reçu",
@@ -229,7 +229,7 @@
"seed": "En partage"
},
"develancacheui": {
"cachehitbytes": "Octets acquis du cache",
"cachehitbytes": "Cache Hit (B)",
"cachemissbytes": "Cache Miss (B)"
},
"downloadstation": {
@@ -294,7 +294,7 @@
"queries": "Requêtes",
"blocked": "Bloqué",
"blocked_percent": "% bloqué",
"gravity": "Listes dom. Bloqués"
"gravity": "Listes dom. bloqués"
},
"adguard": {
"queries": "Requêtes",
@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Aujourd'hui",
"gross_percent_1y": "Un an",
"gross_percent_max": "Depuis le début",
"net_worth": "Patrimoine net"
"gross_percent_max": "Depuis le début"
},
"audiobookshelf": {
"podcasts": "Podcasts",
@@ -1092,7 +1091,7 @@
"NEW_ARRAY": "Nouveau tableau",
"RECON_DISK": "Reconstruction du disque",
"DISABLE_DISK": "Disque désactivé",
"SWAP_DSBL": "Désactiver le swap",
"SWAP_DSBL": "Swap Disable",
"INVALID_EXPANSION": "Extension invalide",
"PARITY_NOT_BIGGEST": "La parité n'est pas la plus grande",
"TOO_MANY_MISSING_DISKS": "Trop de disques manquants",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "היום",
"gross_percent_1y": "שנה",
"gross_percent_max": "כל הזמן",
"net_worth": "Net Worth"
"gross_percent_max": "כל הזמן"
},
"audiobookshelf": {
"podcasts": "פודקאסטים",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Danas",
"gross_percent_1y": "Jedna godina",
"gross_percent_max": "Svo vrijeme",
"net_worth": "Net Worth"
"gross_percent_max": "Svo vrijeme"
},
"audiobookshelf": {
"podcasts": "Podcasti",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Egy év",
"gross_percent_max": "Mindig",
"net_worth": "Net Worth"
"gross_percent_max": "Mindig"
},
"audiobookshelf": {
"podcasts": "Podcast",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Satu Tahun",
"gross_percent_max": "Sepanjang Masa",
"net_worth": "Net Worth"
"gross_percent_max": "Sepanjang Masa"
},
"audiobookshelf": {
"podcasts": "Podcast",

View File

@@ -168,7 +168,7 @@
"passes": "Tessere"
},
"tautulli": {
"playing": "In riproduzione",
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
@@ -313,7 +313,7 @@
"total": "Total"
},
"suwayomi": {
"download": "Scaricati",
"download": "Downloaded",
"nondownload": "Non Scaricato",
"read": "Read",
"unread": "Unread",
@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Un anno",
"gross_percent_max": "Sempre",
"net_worth": "Net Worth"
"gross_percent_max": "Sempre"
},
"audiobookshelf": {
"podcasts": "Podcast",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "1年",
"gross_percent_max": "全期間",
"net_worth": "Net Worth"
"gross_percent_max": "全期間"
},
"audiobookshelf": {
"podcasts": "ポッドキャスト",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "오늘",
"gross_percent_1y": "1년",
"gross_percent_max": "전체 기간",
"net_worth": "Net Worth"
"gross_percent_max": "전체 기간"
},
"audiobookshelf": {
"podcasts": "팟캐스트",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Satu tahun",
"gross_percent_max": "Sepanjang masa",
"net_worth": "Net Worth"
"gross_percent_max": "Sepanjang masa"
},
"audiobookshelf": {
"podcasts": "Podkas",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Vandaag",
"gross_percent_1y": "Een jaar",
"gross_percent_max": "Altijd",
"net_worth": "Net Worth"
"gross_percent_max": "Altijd"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Ett år",
"gross_percent_max": "Gjennom tidene",
"net_worth": "Net Worth"
"gross_percent_max": "Gjennom tidene"
},
"audiobookshelf": {
"podcasts": "Podkaster",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Dzisiaj",
"gross_percent_1y": "Rok",
"gross_percent_max": "Od początku",
"net_worth": "Net Worth"
"gross_percent_max": "Od początku"
},
"audiobookshelf": {
"podcasts": "Podcasty",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Um ano",
"gross_percent_max": "Desde Sempre",
"net_worth": "Net Worth"
"gross_percent_max": "Desde Sempre"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Hoje",
"gross_percent_1y": "Um ano",
"gross_percent_max": "Todo o tempo",
"net_worth": "Patrimônio Líquido"
"gross_percent_max": "Todo o tempo"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Un an",
"gross_percent_max": "Tot timpul",
"net_worth": "Net Worth"
"gross_percent_max": "Tot timpul"
},
"audiobookshelf": {
"podcasts": "Podcasturi",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Сегодня",
"gross_percent_1y": "Один год",
"gross_percent_max": "Все время",
"net_worth": "Net Worth"
"gross_percent_max": "Все время"
},
"audiobookshelf": {
"podcasts": "Подкасты",

View File

@@ -362,8 +362,8 @@
},
"trilium": {
"version": "Verzia",
"notesCount": "Poznámky",
"dbSize": "Veľkosť databázy",
"notesCount": "Notes",
"dbSize": "Database Size",
"unknown": "Neznáme"
},
"navidrome": {
@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Dnes",
"gross_percent_1y": "Jeden rok",
"gross_percent_max": "Za celý čas",
"net_worth": "Net Worth"
"gross_percent_max": "Za celý čas"
},
"audiobookshelf": {
"podcasts": "Podcasty",
@@ -787,7 +786,7 @@
"downloadCount": "Poradie",
"downloadBytesRemaining": "Zostávajúce",
"downloadTotalBytes": "Veľkosť",
"downloadSpeed": "Rýchlosť"
"downloadSpeed": "Speed"
},
"kavita": {
"seriesCount": "Series",
@@ -953,7 +952,7 @@
"loading": "Načítava sa",
"open": "Open - US Market",
"closed": "Closed - US Market",
"invalidConfiguration": "Neplatná konfigurácia"
"invalidConfiguration": "Invalid Configuration"
},
"frigate": {
"cameras": "Kamery",
@@ -1023,10 +1022,10 @@
"loading": "Načítava sa"
},
"gitlab": {
"groups": "Skupiny",
"issues": "Problémy",
"groups": "Groups",
"issues": "Issues",
"merges": "Merge Requests",
"projects": "Projekty"
"projects": "Projects"
},
"apcups": {
"status": "Stav",
@@ -1036,7 +1035,7 @@
},
"karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Obľúbené",
"favorites": "Favorites",
"archived": "Archived",
"highlights": "Highlights",
"lists": "Zoznamy",
@@ -1066,13 +1065,13 @@
"komodo": {
"total": "Celkom",
"running": "Beží",
"stopped": "Zastavené",
"stopped": "Stopped",
"down": "Down",
"unhealthy": "Nezdravý",
"unknown": "Neznáme",
"servers": "Servery",
"servers": "Servers",
"stacks": "Stacks",
"containers": "Kontajnery"
"containers": "Containers"
},
"filebrowser": {
"available": "Dostupné",
@@ -1081,8 +1080,8 @@
},
"wallos": {
"activeSubscriptions": "Subscriptions",
"thisMonthlyCost": "Tento mesiac",
"nextMonthlyCost": "Ďalší mesiac",
"thisMonthlyCost": "This Month",
"nextMonthlyCost": "Next Month",
"previousMonthlyCost": "Prev. Month",
"nextRenewingSubscription": "Next Payment"
},

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Eno leto",
"gross_percent_max": "Celoten čas",
"net_worth": "Net Worth"
"gross_percent_max": "Celoten čas"
},
"audiobookshelf": {
"podcasts": "Podcasti",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Данас",
"gross_percent_1y": "Једна година",
"gross_percent_max": "Све време",
"net_worth": "Нето вредност"
"gross_percent_max": "Све време"
},
"audiobookshelf": {
"podcasts": "Подкасти",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Bugün",
"gross_percent_1y": "Bir yıl",
"gross_percent_max": "Tüm zaman",
"net_worth": "Net Worth"
"gross_percent_max": "Tüm zaman"
},
"audiobookshelf": {
"podcasts": "Podcast",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "Один рік",
"gross_percent_max": "Весь час",
"net_worth": "Net Worth"
"gross_percent_max": "Весь час"
},
"audiobookshelf": {
"podcasts": "Подкасти",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time",
"net_worth": "Net Worth"
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "一年",
"gross_percent_max": "所有時間",
"net_worth": "Net Worth"
"gross_percent_max": "所有時間"
},
"audiobookshelf": {
"podcasts": "播客",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "一年",
"gross_percent_max": "所有时间",
"net_worth": "Net Worth"
"gross_percent_max": "所有时间"
},
"audiobookshelf": {
"podcasts": "播客",

View File

@@ -759,8 +759,7 @@
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "一年",
"gross_percent_max": "所有時間",
"net_worth": "Net Worth"
"gross_percent_max": "所有時間"
},
"audiobookshelf": {
"podcasts": "Podcasts",

View File

@@ -14,8 +14,6 @@ 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) {

View File

@@ -400,7 +400,6 @@ 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 ? (
<>

View File

@@ -1,19 +0,0 @@
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;
}

View File

@@ -279,9 +279,6 @@ export function cleanServiceGroups(groups) {
slugs,
symbols,
// crowdsec
limit24h,
// customapi
mappings,
display,
@@ -476,10 +473,6 @@ 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;

View File

@@ -9,7 +9,7 @@ export default function Component({ service }) {
const { widget } = service;
const { data: alerts, error: alertsError } = useWidgetAPI(widget, !!widget.limit24h ? "alerts24h" : "alerts");
const { data: alerts, error: alertsError } = useWidgetAPI(widget, "alerts");
const { data: bans, error: bansError } = useWidgetAPI(widget, "bans");
if (alertsError || bansError) {

View File

@@ -9,9 +9,6 @@ const widget = {
alerts: {
endpoint: "alerts",
},
alerts24h: {
endpoint: "alerts?limit=0&since=24h",
},
bans: {
endpoint: "alerts?decision_type=ban&origin=crowdsec&has_active_decision=1",
},

View File

@@ -166,11 +166,7 @@ export default function Component({ service }) {
refreshInterval: Math.max(1000, refreshInterval),
});
// 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)) {
if (customError) {
return <Container service={service} error={customError} />;
}

View File

@@ -20,15 +20,13 @@ 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 || ghostfolioErrorUserInfo) {
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax ?? ghostfolioErrorUserInfo;
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax;
return <Container service={service} error={finalError} />;
}
@@ -36,13 +34,12 @@ export default function Component({ service }) {
return <Container service={service} error={performanceToday} />;
}
if (!performanceToday || !performanceYear || !performanceMax || (includeNetWorth && !userInfo)) {
if (!performanceToday || !performanceYear || !performanceMax) {
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>
);
}
@@ -52,12 +49,6 @@ 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>
);
}

View File

@@ -1,21 +1,18 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/{endpoint}",
api: "{url}/api/v2/portfolio/performance?range={endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
today: {
endpoint: "v2/portfolio/performance?range=1d",
endpoint: "1d",
},
year: {
endpoint: "v2/portfolio/performance?range=1y",
endpoint: "1y",
},
max: {
endpoint: "v2/portfolio/performance?range=max",
},
userInfo: {
endpoint: "v1/user",
endpoint: "max",
},
},
};

View File

@@ -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>
);
}