From 290cb8949e5bc8cdfd44d093a8b0088c5616a5a7 Mon Sep 17 00:00:00 2001 From: Micha Date: Fri, 12 Jun 2026 16:06:42 +0200 Subject: [PATCH] ops: glance dashboard v2 - split config, stack widgets, releases page - Config per $include aufgeteilt (glance.yml -> pages/home/infrastructure/ops, containers-map zentral) - Neue Widgets: Komodo Stacks, Gitea GitOps, Paperless, Mealie, Scrutiny Disk Health, Wetter, To-do - Neue Seite Ops und Releases (releases-Widget fuer gepinnte Images, RSS, Commit-Log) - Homelab-Status in Tab-Gruppen Core/Apps/Ops, Speedtest-Widget mit ehrlichem Leerzustand - Theme-Presets (Catppuccin, Gruvbox, Light) + custom.css via Assets-Mount - Compose: 5 neue read-only Token-ENVs, Doku in SECRETS_MAP/MASTER_TODO nachgezogen Co-Authored-By: Claude Fable 5 --- docs/MASTER_TODO.md | 1 + docs/SECRETS_MAP.md | 4 +- ops/glance/assets/custom.css | 17 + ops/glance/config/containers-map.yml | 287 +++++++++ ops/glance/config/glance.yml | 876 +-------------------------- ops/glance/config/home.yml | 520 ++++++++++++++++ ops/glance/config/infrastructure.yml | 242 ++++++++ ops/glance/config/ops.yml | 80 +++ ops/glance/config/pages.yml | 3 + ops/glance/docker-compose.yml | 6 + 10 files changed, 1179 insertions(+), 857 deletions(-) create mode 100644 ops/glance/assets/custom.css create mode 100644 ops/glance/config/containers-map.yml create mode 100644 ops/glance/config/home.yml create mode 100644 ops/glance/config/infrastructure.yml create mode 100644 ops/glance/config/ops.yml create mode 100644 ops/glance/config/pages.yml diff --git a/docs/MASTER_TODO.md b/docs/MASTER_TODO.md index 7780a32..0e96c93 100644 --- a/docs/MASTER_TODO.md +++ b/docs/MASTER_TODO.md @@ -24,6 +24,7 @@ Host-Reports (`/mnt/user/backups/restore-reports/`) und in der Git-Historie. | Restore-Test Unraid OS Flash (Stick-Boot) | Operator | Artefakt-Validierung 2026-06-05 erledigt (`ops/maintenance/check-unraid-flash-backup.sh`). **Verbleibt:** physischer Ersatzstick-Boot-Test, wenn ein Wegwerf-Stick bereitliegt | `ops/restore-tests/unraid-flash-runbook.md` | | Restore-Test Tailscale | Operator | State-Validierung + Reconnect nur auf Wegwerf-Host/VM, danach Geraet in Tailscale-Admin entfernen | `ops/restore-tests/tailscale-runbook.md` | | Authelia OIDC fuer Apps | Operator/Claude | Live: Grafana + Mealie (verifiziert), Paperless deployed (Login-Test offen). Immich + Nextcloud bewusst geparkt bis Family-Onboarding (siehe `docs/DECISIONS.md` 2026-06-06) | `docs/AUTHELIA_OIDC_PLAN.md` | +| Glance-v2-Widgets: Tokens setzen | Operator | In Komodo Stack-ENV fuer `ops-glance` setzen: `GLANCE_KOMODO_API_KEY`/`_SECRET` (Komodo read-only API-Key), `GLANCE_GITEA_TOKEN` (read-only, scope `read:repository`), `GLANCE_PAPERLESS_TOKEN`, `GLANCE_MEALIE_TOKEN`; bis dahin zeigen die neuen Widgets Fehler/leer. Speedtest-Widget: falls weiter 0.0, API-Response pruefen | `ops/glance/config/` | | Audit-PDF aus `docs/` entfernen | Operator | `docs/KalliLab_CORE_Audit_2026-06-06.pdf` (untracked) extern ablegen (H:/ oder Documents-Share) und lokal loeschen; Binaerdateien gehoeren nicht ins GitOps-Repo | Doku-Regeln `docs/REPO_MAP.md` | --- diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index 1ffba2c..6cfeef5 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -40,7 +40,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Komodo Mongo | Root Password | `/mnt/user/appdata/secrets/komodo_mongo_password.txt` -> `MONGO_INITDB_ROOT_PASSWORD_FILE` | aktiv | | Komodo Core | App Secrets | Stack ENV `${KOMODO_SECRET_KEY}`, `${KOMODO_WEBHOOK_SECRET}`, `${KOMODO_JWT_SECRET}`, `${KOMODO_MONGO_PASSWORD}`, `${KOMODO_PERIPHERY_PASSKEY}` | aktiv | | Gitea Push Mirror | GitHub fine-grained PAT fuer `michaelkaleschke-spec/homelab-infra` | Gitea Repository Mirror Settings, persistent in `/mnt/user/services/gitea/data`; kein Datei-Secret im Repo | aktiv | -| Glance | Community Widget API Tokens | Stack ENV `${GLANCE_IMMICH_API_KEY}`, `${GLANCE_ADGUARD_USERNAME}`, `${GLANCE_ADGUARD_PASSWORD}`, `${GLANCE_SPEEDTEST_API_KEY}` | aktiv | +| Glance | Community Widget API Tokens | Stack ENV `${GLANCE_IMMICH_API_KEY}`, `${GLANCE_ADGUARD_USERNAME}`, `${GLANCE_ADGUARD_PASSWORD}`, `${GLANCE_SPEEDTEST_API_KEY}`, `${GLANCE_KOMODO_API_KEY}`, `${GLANCE_KOMODO_API_SECRET}`, `${GLANCE_GITEA_TOKEN}`, `${GLANCE_PAPERLESS_TOKEN}`, `${GLANCE_MEALIE_TOKEN}` (alle read-only anlegen) | aktiv | | speedtest-tracker | App Key / Admin-Zugang | Stack ENV `${APP_KEY}`, `${ADMIN_PASSWORD}` | aktiv | | Nextcloud | Admin User | `/mnt/user/appdata/secrets/nextcloud_admin_user.txt` -> `NEXTCLOUD_ADMIN_USER_FILE` | neu | | Nextcloud | Admin Password | `/mnt/user/appdata/secrets/nextcloud_admin_password.txt` -> `NEXTCLOUD_ADMIN_PASSWORD_FILE` | neu | @@ -141,7 +141,7 @@ Einige Secrets liegen bewusst nur als Komodo Stack Environment Variables vor, we | `speedtest-tracker` | `APP_KEY`, `ADMIN_PASSWORD` | Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | `APP_KEY` ist verschluesselungsrelevant; bei echtem Verlust App-State frisch initialisieren | | `komodo-core` | `KOMODO_SECRET_KEY`, `KOMODO_WEBHOOK_SECRET`, `KOMODO_JWT_SECRET`, `KOMODO_MONGO_PASSWORD`, `KOMODO_PERIPHERY_PASSKEY` | Vaultwarden -> externe Notiz (Henne-Ei: Komodo-Mongo-Dump ist hier **nicht** Restore-Quelle, weil Komodo dafuer schon laufen muesste) | siehe `docs/SERVICES_RECOVERY.md` Komodo-Bootstrap; ohne diese Werte ist der Self-Stack nicht reproduzierbar | | `hermes-agent` | `HERMES_DASHBOARD_HOST` plus Provider-/API-/Home-Assistant-Tokens in Host-`.env` | Vaultwarden -> externe Notiz | Stack ist aktuell geparkt (Review 2026-07-25); ohne Werte bleibt der Stack deaktiviert, kein Schaden am Rest | -| `glance` | `GLANCE_IMMICH_API_KEY`, `GLANCE_ADGUARD_USERNAME`, `GLANCE_ADGUARD_PASSWORD`, `GLANCE_SPEEDTEST_API_KEY` | Provider-UIs (Immich, AdGuard, Speedtest-Tracker) neu erzeugen | rebuildbar; Widgets bleiben leer bis Tokens neu erzeugt sind, kein kritischer Datentopf | +| `glance` | `GLANCE_IMMICH_API_KEY`, `GLANCE_ADGUARD_USERNAME`, `GLANCE_ADGUARD_PASSWORD`, `GLANCE_SPEEDTEST_API_KEY`, `GLANCE_KOMODO_API_KEY`, `GLANCE_KOMODO_API_SECRET`, `GLANCE_GITEA_TOKEN`, `GLANCE_PAPERLESS_TOKEN`, `GLANCE_MEALIE_TOKEN` | Provider-UIs (Immich, AdGuard, Speedtest-Tracker, Komodo, Gitea, Paperless, Mealie) neu erzeugen | rebuildbar; alle read-only; Widgets bleiben leer bis Tokens neu erzeugt sind, kein kritischer Datentopf | | `n8n` | `N8N_ENCRYPTION_KEY` | Host-Secret-Datei `/mnt/user/appdata/secrets/n8n_encryption_key.txt` -> Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | Bei Verlust aller Quellen: n8n startet, aber **alle gespeicherten Credentials sind unbrauchbar** (Re-Eingabe noetig: GMX IMAP, OpenAI, Gitea PAT). Workflows bleiben strukturell erhalten. | ### Komodo-Sonderfall diff --git a/ops/glance/assets/custom.css b/ops/glance/assets/custom.css new file mode 100644 index 0000000..6e69fed --- /dev/null +++ b/ops/glance/assets/custom.css @@ -0,0 +1,17 @@ +/* KalliLab Feinschliff - bewusst minimal, Theme bleibt in glance.yml */ + +::selection { + background: hsl(212, 100%, 50%, 0.35); +} + +/* Karten leicht abheben beim Hover, ohne Layout-Shift */ +.widget-content { + transition: opacity 0.15s ease; +} + +/* Grosse Zahlen etwas ruhiger setzen */ +.size-h1, +.size-h2, +.size-h3 { + letter-spacing: 0.01em; +} diff --git a/ops/glance/config/containers-map.yml b/ops/glance/config/containers-map.yml new file mode 100644 index 0000000..75902ae --- /dev/null +++ b/ops/glance/config/containers-map.yml @@ -0,0 +1,287 @@ +traefik: + name: Traefik + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg + url: https://traefik.kaleschke.info + description: Reverse Proxy + category: core + hide: false +gitea: + name: Gitea + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg + url: https://git.kaleschke.info + description: GitOps Origin + category: core + hide: false +authelia: + name: Authelia + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg + url: https://auth.kaleschke.info + description: ForwardAuth + category: core + hide: false +vaultwarden: + name: Vaultwarden + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vaultwarden.svg + url: https://vault.kaleschke.info + description: Password Vault + category: core + hide: false +postgresql17: + name: PostgreSQL 18 + icon: si:postgresql + description: Shared DB + category: core + hide: false +Redis: + name: Redis + icon: si:redis + description: Shared Cache + category: core + hide: false +adguard: + name: AdGuard + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg + url: http://192.168.178.58:8082 + description: DNS Filter + category: network + hide: false +unbound: + name: Unbound + icon: mdi:dns + description: Upstream Resolver + category: network + hide: false +ddns-updater: + name: DDNS Updater + icon: mdi:cloud-sync + description: Cloudflare DNS + category: network + hide: false +paperless-ngx: + name: Paperless-ngx + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg + url: https://paperless.kaleschke.info + description: Dokumente + category: apps + hide: false +paperless-gpt: + name: Paperless-GPT + icon: mdi:robot + url: https://paperless-gpt.kaleschke.info + description: Dokumenten-KI + category: apps + hide: false +immich_server: + name: Immich + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg + url: https://immich.kaleschke.info + description: Fotos und Videos + category: apps + id: immich + hide: false +immich_postgres: + name: DB + parent: immich + category: apps + hide: false +immich_redis: + name: Redis + parent: immich + category: apps + hide: false +immich_machine_learning: + name: ML + parent: immich + category: apps + hide: false +mealie: + name: Mealie + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg + url: https://mealie.kaleschke.info + description: Rezepte + category: apps + id: mealie + hide: false +mealie-postgres: + name: DB + parent: mealie + category: apps + hide: false +nextcloud: + name: Nextcloud + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + url: https://cloud.kaleschke.info + description: Dateien und Sync + category: apps + id: nextcloud + hide: false +nextcloud-postgres: + name: DB + parent: nextcloud + category: apps + hide: false +nextcloud-redis: + name: Redis + parent: nextcloud + category: apps + hide: false +mail-archiver: + name: Mail Archiver + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailcow.svg + url: https://mail.kaleschke.info + description: Mail-Archiv + category: apps + hide: false +ntfy: + name: ntfy + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ntfy.svg + url: https://ntfy.kaleschke.info + description: Push Alerts + category: apps + hide: false +bentopdf: + name: BentoPDF + icon: mdi:file-pdf-box + url: https://pdf.kaleschke.info + description: PDF Tools + category: apps + hide: false +glance: + name: Glance + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg + url: https://glance.kaleschke.info + description: Homelab Uebersicht + category: ops + hide: false +glance-docker-socket-proxy: + name: Glance Socket Proxy + icon: si:docker + description: Read-only Docker API + category: ops + hide: false +monitoring-grafana: + name: Monitoring Grafana + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg + url: https://monitoring.kaleschke.info + description: Observability UI + category: ops + id: monitoring + hide: false +monitoring-prometheus: + name: Prometheus + parent: monitoring + category: ops + hide: false +monitoring-loki: + name: Loki + parent: monitoring + category: ops + hide: false +monitoring-promtail: + name: Promtail + parent: monitoring + category: ops + hide: false +monitoring-alertmanager: + name: Alertmanager + parent: monitoring + category: ops + hide: false +monitoring-alertmanager-ntfy-bridge: + name: ntfy Bridge + parent: monitoring + category: ops + hide: false +monitoring-blackbox-exporter: + name: Blackbox + parent: monitoring + category: ops + hide: false +monitoring-node-exporter: + name: Node Exporter + parent: monitoring + category: ops + hide: false +monitoring-cadvisor: + name: cAdvisor + parent: monitoring + category: ops + hide: false +monitoring-influxdb3-core: + name: InfluxDB 3 + parent: monitoring + category: ops + hide: false +glances: + name: Glances + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg + url: https://glances.kaleschke.info + description: Host-Monitoring + category: ops + hide: false +scrutiny: + name: Scrutiny + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg + url: https://scrutiny.kaleschke.info + description: SMART + category: ops + hide: false +speedtest-tracker: + name: Speedtest + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png + url: https://speedtest.kaleschke.info + description: WAN-Messung + category: ops + hide: false +filebrowser: + name: Filebrowser + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/filebrowser.svg + url: https://files.kaleschke.info + description: Dateizugriff + category: ops + hide: false +code-server: + name: code-server + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vscode.svg + url: https://code.kaleschke.info + description: Web IDE + category: ops + hide: false +borg-ui: + name: Borg UI + icon: mdi:archive-sync + url: https://borg.kaleschke.info + description: Backup und Restore + category: ops + hide: false +hermes-dashboard: + name: Hermes + icon: mdi:shield-sparkles + url: https://hermes.kaleschke.info + description: Ops Agent UI + category: ops + id: hermes + hide: false +hermes-gateway: + name: Gateway + parent: hermes + category: ops + hide: false +komodo-core: + name: Komodo + icon: sh:komodo + url: https://komodo.kaleschke.info + description: Stack Manager + category: ops + id: komodo + hide: false +komodo-mongo: + name: Mongo + parent: komodo + category: ops + hide: false +komodo-periphery: + name: Periphery + parent: komodo + category: ops + hide: false diff --git a/ops/glance/config/glance.yml b/ops/glance/config/glance.yml index bd53b0c..723e945 100644 --- a/ops/glance/config/glance.yml +++ b/ops/glance/config/glance.yml @@ -1,5 +1,6 @@ server: proxied: true + assets-path: /app/assets branding: app-name: KalliLab Dashboard @@ -14,860 +15,25 @@ theme: contrast-multiplier: 1.25 text-saturation-multiplier: 0.9 disable-picker: false + custom-css-file: /assets/custom.css + presets: + catppuccin-mocha: + background-color: 240 21 15 + primary-color: 217 92 83 + positive-color: 115 54 76 + negative-color: 347 70 65 + contrast-multiplier: 1.2 + gruvbox-dark: + background-color: 0 0 16 + primary-color: 43 59 81 + positive-color: 61 66 44 + negative-color: 6 96 59 + kallilab-light: + light: true + background-color: 220 23 95 + primary-color: 212 100 35 + positive-color: 140 70 30 + negative-color: 0 70 45 pages: - - name: Home - slug: home - width: wide - head-widgets: - - type: search - search-engine: duckduckgo - new-tab: true - autofocus: true - placeholder: Suche im Web oder springe per Bang... - bangs: - - title: Gitea - shortcut: "!git" - url: https://git.kaleschke.info/explore/repos?q={QUERY} - - title: Paperless - shortcut: "!doc" - url: https://paperless.kaleschke.info/documents?query={QUERY} - - title: Nextcloud - shortcut: "!cloud" - url: https://cloud.kaleschke.info/apps/files/?dir=/{QUERY} - - title: Komodo - shortcut: "!komodo" - url: https://komodo.kaleschke.info - columns: - - size: small - widgets: - - type: group - widgets: - - type: custom-api - title: Day - body-type: string - skip-json-validation: true - cache: 1s - template: | - {{ $localTime := now }} - {{ $elapsedSeconds := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} - {{ $dayProgress := div (mul $elapsedSeconds 100.0) 86400.0 }} - {{ $gradient := "#70a1ff" }} - {{ if gt $dayProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} - {{ if gt $dayProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} - {{ if gt $dayProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} -
-
-
-
-
{{ printf "%.2f" $dayProgress }}% des Tages sind vorbei
-
- - - type: custom-api - title: Month - body-type: string - skip-json-validation: true - cache: 1s - template: | - {{ $localTime := now }} - {{ $month := $localTime.Month }} - {{ $daysInMonth := 31 }} - {{ if eq $month 2 }}{{ $daysInMonth = 28 }}{{ end }} - {{ if or (eq $month 4) (eq $month 6) (eq $month 9) (eq $month 11) }}{{ $daysInMonth = 30 }}{{ end }} - {{ $secondsToday := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} - {{ $daysElapsed := add (sub $localTime.Day 1) (div $secondsToday 86400.0) }} - {{ $monthProgress := mul (div $daysElapsed $daysInMonth) 100.0 }} - {{ $gradient := "#70a1ff" }} - {{ if gt $monthProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} - {{ if gt $monthProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} - {{ if gt $monthProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} -
-
-
-
-
{{ printf "%.2f" $monthProgress }}% des Monats sind vorbei
-
- - - type: custom-api - title: Year - body-type: string - skip-json-validation: true - cache: 1s - template: | - {{ $localTime := now }} - {{ $secondsToday := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} - {{ $secondsElapsed := add (mul (sub $localTime.YearDay 1) 86400) $secondsToday }} - {{ $yearProgress := div (mul $secondsElapsed 100.0) (mul 365 86400) }} - {{ $gradient := "#70a1ff" }} - {{ if gt $yearProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} - {{ if gt $yearProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} - {{ if gt $yearProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} -
-
-
-
-
{{ printf "%.2f" $yearProgress }}% des Jahres sind vorbei
-
- - - type: clock - hour-format: 24h - show-progress: true - timezones: - - timezone: Europe/Berlin - label: Berlin - - timezone: UTC - label: UTC - - - type: calendar - first-day-of-week: monday - - - type: bookmarks - title: Direkte Einstiege - groups: - - title: Core - color: 212 100 50 - links: - - title: Komodo - url: https://komodo.kaleschke.info - icon: sh:komodo - - title: Gitea - url: https://git.kaleschke.info - icon: si:gitea - - title: Monitoring - url: https://monitoring.kaleschke.info - icon: si:grafana - - title: Ops - color: 45 70 55 - links: - - title: Borg - url: https://borg.kaleschke.info - icon: mdi:archive - - title: Glances - url: https://glances.kaleschke.info - icon: sh:glances - - title: Scrutiny - url: https://scrutiny.kaleschke.info - icon: sh:scrutiny - - - size: full - widgets: - - type: server-stats - title: Server Stats - servers: - - type: local - name: Kallilabcore - hide-mountpoints-by-default: false - - - type: group - widgets: - - type: custom-api - title: Immich - title-url: https://immich.kaleschke.info - cache: 10m - url: http://immich_server:2283/api/server/statistics - headers: - x-api-key: ${GLANCE_IMMICH_API_KEY} - subrequests: - storage: - url: http://immich_server:2283/api/server/storage - headers: - x-api-key: ${GLANCE_IMMICH_API_KEY} - template: | - {{ $photos := .JSON.Int "photos" }} - {{ $videos := .JSON.Int "videos" }} - {{ $usageGiB := div (toFloat (.JSON.Int "usage")) 1073741824.0 }} - {{ $storage := .Subrequest "storage" }} - {{ $storageOK := and (ge $storage.Response.StatusCode 200) (le $storage.Response.StatusCode 299) }} - {{ $percentage := 0.0 }} - {{ if $storageOK }}{{ $percentage = $storage.JSON.Float "diskUsagePercentage" }}{{ end }} -
-
-
{{ $photos | formatNumber }}
-
Fotos
-
-
-
{{ $videos | formatNumber }}
-
Videos
-
-
-
{{ printf "%.0f" $usageGiB }} GiB
-
Medien
-
-
-
-
-
-
{{ if $storageOK }}{{ printf "%.1f" $percentage }}% Speicher belegt{{ else }}Speicher API nicht verfuegbar{{ end }}
- - - type: monitor - title: Homelab Status - cache: 1m - sites: - - title: AdGuard Home - url: http://192.168.178.58:8082 - check-url: http://adguard - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Authelia - url: https://auth.kaleschke.info - check-url: http://authelia:9091/api/health - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Gitea - url: https://git.kaleschke.info - check-url: http://gitea:3000/api/healthz - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Traefik - url: https://traefik.kaleschke.info - check-url: http://traefik:8082/metrics - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Vaultwarden - url: https://vault.kaleschke.info - check-url: http://vaultwarden/alive - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vaultwarden.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Komodo - url: https://komodo.kaleschke.info - check-url: http://komodo-core:9120 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/komodo.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Paperless-ngx - url: https://paperless.kaleschke.info - check-url: http://paperless-ngx:8000 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Paperless-GPT - url: https://paperless-gpt.kaleschke.info - check-url: http://paperless-gpt:8080 - icon: mdi:robot - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Immich - url: https://immich.kaleschke.info - check-url: http://immich_server:2283/api/server/ping - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Mealie - url: https://mealie.kaleschke.info - check-url: http://mealie:9000 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Nextcloud - url: https://cloud.kaleschke.info - check-url: http://nextcloud/status.php - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: ntfy - url: https://ntfy.kaleschke.info - check-url: http://ntfy/v1/health - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ntfy.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Mail Archiver - url: https://mail.kaleschke.info - check-url: http://mail-archiver:5000 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailcow.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: BentoPDF - url: https://pdf.kaleschke.info - check-url: http://bentopdf:8080 - icon: mdi:file-pdf-box - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Glance - url: https://glance.kaleschke.info - check-url: http://glance:8080 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Monitoring Grafana - url: https://monitoring.kaleschke.info - check-url: http://monitoring-grafana:3000/api/health - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Glances - url: https://glances.kaleschke.info - check-url: http://glances:61208 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Scrutiny - url: https://scrutiny.kaleschke.info - check-url: http://scrutiny:8080 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Speedtest Tracker - url: https://speedtest.kaleschke.info - check-url: http://speedtest-tracker - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Filebrowser - url: https://files.kaleschke.info - check-url: http://filebrowser - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/filebrowser.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: code-server - url: https://code.kaleschke.info - check-url: http://code-server:8443 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vscode.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Borg UI - url: https://borg.kaleschke.info - check-url: http://borg-ui:8081 - icon: mdi:archive-sync - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - - size: small - widgets: - - type: custom-api - title: Internet - title-url: https://speedtest.kaleschke.info - cache: 1h - url: http://speedtest-tracker/api/v1/results/latest - headers: - Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} - Accept: application/json - template: | - {{ $ip := .JSON.String "external_ip" }} - {{ if eq $ip "" }}{{ $ip = .JSON.String "data.interface.externalIp" }}{{ end }} - {{ $isp := .JSON.String "isp" }} - {{ if eq $isp "" }}{{ $isp = .JSON.String "data.isp" }}{{ end }} - {{ $server := .JSON.String "server_name" }} - {{ if eq $server "" }}{{ $server = .JSON.String "data.server_name" }}{{ end }} -
-
{{ if ne $ip "" }}{{ $ip }}{{ else }}WAN online{{ end }}
-
Speedtest Tracker
-
{{ if ne $isp "" }}{{ $isp }}{{ else }}{{ $server }}{{ end }}
-
- - - type: custom-api - title: Internet Speed - title-url: https://speedtest.kaleschke.info - cache: 1h - url: http://speedtest-tracker/api/v1/results/latest - headers: - Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} - Accept: application/json - subrequests: - stats: - url: http://speedtest-tracker/api/v1/stats - headers: - Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} - Accept: application/json - template: | - {{ $stats := .Subrequest "stats" }} - {{ $download := .JSON.Float "download" }} - {{ if eq $download 0.0 }}{{ $download = .JSON.Float "data.download" }}{{ end }} - {{ if eq $download 0.0 }}{{ $download = div (.JSON.Float "download_bits") 1000000.0 }}{{ end }} - {{ if eq $download 0.0 }}{{ $download = div (.JSON.Float "data.download_bits") 1000000.0 }}{{ end }} - {{ $upload := .JSON.Float "upload" }} - {{ if eq $upload 0.0 }}{{ $upload = .JSON.Float "data.upload" }}{{ end }} - {{ if eq $upload 0.0 }}{{ $upload = div (.JSON.Float "upload_bits") 1000000.0 }}{{ end }} - {{ if eq $upload 0.0 }}{{ $upload = div (.JSON.Float "data.upload_bits") 1000000.0 }}{{ end }} - {{ $ping := .JSON.Float "ping" }} - {{ if eq $ping 0.0 }}{{ $ping = .JSON.Float "data.ping" }}{{ end }} - {{ $downloadAvg := $stats.JSON.Float "avg_download" }} - {{ if eq $downloadAvg 0.0 }}{{ $downloadAvg = $stats.JSON.Float "data.download.avg" }}{{ end }} - {{ if eq $downloadAvg 0.0 }}{{ $downloadAvg = div ($stats.JSON.Float "data.download.avg_bits") 1000000.0 }}{{ end }} - {{ $uploadAvg := $stats.JSON.Float "avg_upload" }} - {{ if eq $uploadAvg 0.0 }}{{ $uploadAvg = $stats.JSON.Float "data.upload.avg" }}{{ end }} - {{ if eq $uploadAvg 0.0 }}{{ $uploadAvg = div ($stats.JSON.Float "data.upload.avg_bits") 1000000.0 }}{{ end }} - {{ $pingAvg := $stats.JSON.Float "avg_ping" }} - {{ if eq $pingAvg 0.0 }}{{ $pingAvg = $stats.JSON.Float "data.ping.avg" }}{{ end }} - {{ $downloadChange := percentChange $downloadAvg $download }} - {{ $uploadChange := percentChange $uploadAvg $upload }} - {{ $pingChange := percentChange $pingAvg $ping }} -
-
-
{{ printf "%+.1f%%" $downloadChange }}
-
{{ printf "%.1f" $download }}
-
DOWNLOAD
-
-
-
{{ printf "%+.1f%%" $uploadChange }}
-
{{ printf "%.1f" $upload }}
-
UPLOAD
-
-
-
{{ printf "%+.1f%%" $pingChange }}
-
{{ printf "%.0f ms" $ping }}
-
PING
-
-
- - - type: dns-stats - title: DNS Stats - service: adguard - url: http://adguard - username: ${GLANCE_ADGUARD_USERNAME} - password: ${GLANCE_ADGUARD_PASSWORD} - - - type: monitor - title: DNS und VPN - cache: 1m - sites: - - title: AdGuard Home - url: http://192.168.178.58:8082 - check-url: http://adguard - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Traefik - url: https://traefik.kaleschke.info - check-url: http://traefik:8082/metrics - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - - type: docker-containers - title: Network Container - category: network - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: &containers - traefik: - name: Traefik - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg - url: https://traefik.kaleschke.info - description: Reverse Proxy - category: core - hide: false - gitea: - name: Gitea - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg - url: https://git.kaleschke.info - description: GitOps Origin - category: core - hide: false - authelia: - name: Authelia - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg - url: https://auth.kaleschke.info - description: ForwardAuth - category: core - hide: false - vaultwarden: - name: Vaultwarden - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vaultwarden.svg - url: https://vault.kaleschke.info - description: Password Vault - category: core - hide: false - postgresql17: - name: PostgreSQL 18 - icon: si:postgresql - description: Shared DB - category: core - hide: false - Redis: - name: Redis - icon: si:redis - description: Shared Cache - category: core - hide: false - adguard: - name: AdGuard - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg - url: http://192.168.178.58:8082 - description: DNS Filter - category: network - hide: false - unbound: - name: Unbound - icon: mdi:dns - description: Upstream Resolver - category: network - hide: false - ddns-updater: - name: DDNS Updater - icon: mdi:cloud-sync - description: Cloudflare DNS - category: network - hide: false - paperless-ngx: - name: Paperless-ngx - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg - url: https://paperless.kaleschke.info - description: Dokumente - category: apps - hide: false - paperless-gpt: - name: Paperless-GPT - icon: mdi:robot - url: https://paperless-gpt.kaleschke.info - description: Dokumenten-KI - category: apps - hide: false - immich_server: - name: Immich - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg - url: https://immich.kaleschke.info - description: Fotos und Videos - category: apps - id: immich - hide: false - immich_postgres: - name: DB - parent: immich - category: apps - hide: false - immich_redis: - name: Redis - parent: immich - category: apps - hide: false - immich_machine_learning: - name: ML - parent: immich - category: apps - hide: false - mealie: - name: Mealie - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg - url: https://mealie.kaleschke.info - description: Rezepte - category: apps - id: mealie - hide: false - mealie-postgres: - name: DB - parent: mealie - category: apps - hide: false - nextcloud: - name: Nextcloud - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg - url: https://cloud.kaleschke.info - description: Dateien und Sync - category: apps - id: nextcloud - hide: false - nextcloud-postgres: - name: DB - parent: nextcloud - category: apps - hide: false - nextcloud-redis: - name: Redis - parent: nextcloud - category: apps - hide: false - mail-archiver: - name: Mail Archiver - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailcow.svg - url: https://mail.kaleschke.info - description: Mail-Archiv - category: apps - hide: false - ntfy: - name: ntfy - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ntfy.svg - url: https://ntfy.kaleschke.info - description: Push Alerts - category: apps - hide: false - bentopdf: - name: BentoPDF - icon: mdi:file-pdf-box - url: https://pdf.kaleschke.info - description: PDF Tools - category: apps - hide: false - glance: - name: Glance - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg - url: https://glance.kaleschke.info - description: Homelab Uebersicht - category: ops - hide: false - glance-docker-socket-proxy: - name: Glance Socket Proxy - icon: si:docker - description: Read-only Docker API - category: ops - hide: false - monitoring-grafana: - name: Monitoring Grafana - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg - url: https://monitoring.kaleschke.info - description: Observability UI - category: ops - id: monitoring - hide: false - monitoring-prometheus: - name: Prometheus - parent: monitoring - category: ops - hide: false - monitoring-loki: - name: Loki - parent: monitoring - category: ops - hide: false - monitoring-promtail: - name: Promtail - parent: monitoring - category: ops - hide: false - monitoring-alertmanager: - name: Alertmanager - parent: monitoring - category: ops - hide: false - monitoring-alertmanager-ntfy-bridge: - name: ntfy Bridge - parent: monitoring - category: ops - hide: false - monitoring-blackbox-exporter: - name: Blackbox - parent: monitoring - category: ops - hide: false - monitoring-node-exporter: - name: Node Exporter - parent: monitoring - category: ops - hide: false - monitoring-cadvisor: - name: cAdvisor - parent: monitoring - category: ops - hide: false - monitoring-influxdb3-core: - name: InfluxDB 3 - parent: monitoring - category: ops - hide: false - glances: - name: Glances - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg - url: https://glances.kaleschke.info - description: Host-Monitoring - category: ops - hide: false - scrutiny: - name: Scrutiny - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg - url: https://scrutiny.kaleschke.info - description: SMART - category: ops - hide: false - speedtest-tracker: - name: Speedtest - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png - url: https://speedtest.kaleschke.info - description: WAN-Messung - category: ops - hide: false - filebrowser: - name: Filebrowser - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/filebrowser.svg - url: https://files.kaleschke.info - description: Dateizugriff - category: ops - hide: false - code-server: - name: code-server - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vscode.svg - url: https://code.kaleschke.info - description: Web IDE - category: ops - hide: false - borg-ui: - name: Borg UI - icon: mdi:archive-sync - url: https://borg.kaleschke.info - description: Backup und Restore - category: ops - hide: false - hermes-dashboard: - name: Hermes - icon: mdi:shield-sparkles - url: https://hermes.kaleschke.info - description: Ops Agent UI - category: ops - id: hermes - hide: false - hermes-gateway: - name: Gateway - parent: hermes - category: ops - hide: false - komodo-core: - name: Komodo - icon: sh:komodo - url: https://komodo.kaleschke.info - description: Stack Manager - category: ops - id: komodo - hide: false - komodo-mongo: - name: Mongo - parent: komodo - category: ops - hide: false - komodo-periphery: - name: Periphery - parent: komodo - category: ops - hide: false - - - type: docker-containers - title: App Container - category: apps - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: *containers - - - type: docker-containers - title: Ops Container - category: ops - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: *containers - - - name: Infrastructure and Media - slug: infrastructure - width: wide - columns: - - size: small - widgets: - - type: bookmarks - title: Core - groups: - - title: Control Plane - color: 212 100 50 - links: - - title: Komodo - url: https://komodo.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/komodo.svg - - title: Gitea - url: https://git.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg - - title: Traefik - url: https://traefik.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg - - title: Authelia - url: https://auth.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg - - - type: bookmarks - title: Media und Apps - groups: - - title: Apps - color: 140 70 40 - links: - - title: Immich - url: https://immich.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg - - title: Paperless - url: https://paperless.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg - - title: Nextcloud - url: https://cloud.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg - - title: Mealie - url: https://mealie.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg - - - size: full - widgets: - - type: monitor - title: Platform Checks - cache: 1m - sites: - - title: Gitea - url: https://git.kaleschke.info - check-url: http://gitea:3000/api/healthz - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Monitoring Grafana - url: https://monitoring.kaleschke.info - check-url: http://monitoring-grafana:3000/api/health - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Glance - url: https://glance.kaleschke.info - check-url: http://glance:8080 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Immich - url: https://immich.kaleschke.info - check-url: http://immich_server:2283/api/server/ping - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Paperless-ngx - url: https://paperless.kaleschke.info - check-url: http://paperless-ngx:8000 - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - title: Nextcloud - url: https://cloud.kaleschke.info - check-url: http://nextcloud/status.php - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg - timeout: 5s - alt-status-codes: [200, 302, 401, 403] - - - type: docker-containers - title: Core Container - category: core - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: *containers - - - type: docker-containers - title: App Container - category: apps - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: *containers - - - type: docker-containers - title: Ops Container - category: ops - hide-by-default: true - sock-path: tcp://glance-docker-socket-proxy:2375 - containers: *containers - - - size: small - widgets: - - type: bookmarks - title: Ops - groups: - - title: Tools - color: 4 78 57 - links: - - title: Glances - url: https://glances.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg - - title: Scrutiny - url: https://scrutiny.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg - - title: Speedtest - url: https://speedtest.kaleschke.info - icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png + $include: pages.yml diff --git a/ops/glance/config/home.yml b/ops/glance/config/home.yml new file mode 100644 index 0000000..cdca458 --- /dev/null +++ b/ops/glance/config/home.yml @@ -0,0 +1,520 @@ +- name: Home + slug: home + width: wide + head-widgets: + - type: search + search-engine: duckduckgo + new-tab: true + autofocus: true + placeholder: Suche im Web oder springe per Bang... + bangs: + - title: Gitea + shortcut: "!git" + url: https://git.kaleschke.info/explore/repos?q={QUERY} + - title: Paperless + shortcut: "!doc" + url: https://paperless.kaleschke.info/documents?query={QUERY} + - title: Nextcloud + shortcut: "!cloud" + url: https://cloud.kaleschke.info/apps/files/?dir=/{QUERY} + - title: Komodo + shortcut: "!komodo" + url: https://komodo.kaleschke.info + - title: Immich + shortcut: "!foto" + url: https://immich.kaleschke.info/search?query={QUERY} + - title: Mealie + shortcut: "!rezept" + url: https://mealie.kaleschke.info/g/home/?search={QUERY} + columns: + - size: small + widgets: + - type: group + widgets: + - type: custom-api + title: Day + body-type: string + skip-json-validation: true + cache: 1s + template: | + {{ $localTime := now }} + {{ $elapsedSeconds := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} + {{ $dayProgress := div (mul $elapsedSeconds 100.0) 86400.0 }} + {{ $gradient := "#70a1ff" }} + {{ if gt $dayProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} + {{ if gt $dayProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} + {{ if gt $dayProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} +
+
+
+
+
{{ printf "%.2f" $dayProgress }}% des Tages sind vorbei
+
+ + - type: custom-api + title: Month + body-type: string + skip-json-validation: true + cache: 1s + template: | + {{ $localTime := now }} + {{ $month := $localTime.Month }} + {{ $daysInMonth := 31 }} + {{ if eq $month 2 }}{{ $daysInMonth = 28 }}{{ end }} + {{ if or (eq $month 4) (eq $month 6) (eq $month 9) (eq $month 11) }}{{ $daysInMonth = 30 }}{{ end }} + {{ $secondsToday := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} + {{ $daysElapsed := add (sub $localTime.Day 1) (div $secondsToday 86400.0) }} + {{ $monthProgress := mul (div $daysElapsed $daysInMonth) 100.0 }} + {{ $gradient := "#70a1ff" }} + {{ if gt $monthProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} + {{ if gt $monthProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} + {{ if gt $monthProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} +
+
+
+
+
{{ printf "%.2f" $monthProgress }}% des Monats sind vorbei
+
+ + - type: custom-api + title: Year + body-type: string + skip-json-validation: true + cache: 1s + template: | + {{ $localTime := now }} + {{ $secondsToday := add (mul $localTime.Hour 3600) (mul $localTime.Minute 60) | add $localTime.Second }} + {{ $secondsElapsed := add (mul (sub $localTime.YearDay 1) 86400) $secondsToday }} + {{ $yearProgress := div (mul $secondsElapsed 100.0) (mul 365 86400) }} + {{ $gradient := "#70a1ff" }} + {{ if gt $yearProgress 25.0 }}{{ $gradient = "#ff6b6b, #70a1ff" }}{{ end }} + {{ if gt $yearProgress 50.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df" }}{{ end }} + {{ if gt $yearProgress 75.0 }}{{ $gradient = "#ff6b6b, #f8e71c, #7ed6df, #70a1ff" }}{{ end }} +
+
+
+
+
{{ printf "%.2f" $yearProgress }}% des Jahres sind vorbei
+
+ + - type: clock + hour-format: 24h + show-progress: true + timezones: + - timezone: Europe/Berlin + label: Berlin + - timezone: UTC + label: UTC + + - type: weather + location: Berlin, Germany + units: metric + hour-format: 24h + + - type: calendar + first-day-of-week: monday + + - type: to-do + title: Operator-Notizen + + - type: bookmarks + title: Direkte Einstiege + groups: + - title: Core + color: 212 100 50 + links: + - title: Komodo + url: https://komodo.kaleschke.info + icon: sh:komodo + - title: Gitea + url: https://git.kaleschke.info + icon: si:gitea + - title: Monitoring + url: https://monitoring.kaleschke.info + icon: si:grafana + - title: Ops + color: 45 70 55 + links: + - title: Borg + url: https://borg.kaleschke.info + icon: mdi:archive + - title: Glances + url: https://glances.kaleschke.info + icon: sh:glances + - title: Scrutiny + url: https://scrutiny.kaleschke.info + icon: sh:scrutiny + + - size: full + widgets: + - type: server-stats + title: Server Stats + servers: + - type: local + name: Kallilabcore + hide-mountpoints-by-default: false + + - type: custom-api + title: Komodo Stacks + title-url: https://komodo.kaleschke.info + cache: 2m + url: http://komodo-core:9120/read + method: POST + body-type: json + body: + type: ListStacks + params: {} + headers: + X-Api-Key: ${GLANCE_KOMODO_API_KEY} + X-Api-Secret: ${GLANCE_KOMODO_API_SECRET} + Content-Type: application/json + template: | + {{ $stacks := .JSON.Array "@this" }} + {{ $total := len $stacks }} + {{ $running := 0 }} + {{ range $stacks }}{{ if eq (.String "info.state") "running" }}{{ $running = add $running 1 }}{{ end }}{{ end }} + {{ $problems := sub $total $running }} +
+
+
{{ $total }}
+
Stacks
+
+
+
{{ $running }}
+
Running
+
+
+
{{ $problems }}
+
Auffaellig
+
+
+ {{ if gt $problems 0 }} + + {{ end }} + + - type: custom-api + title: Immich + title-url: https://immich.kaleschke.info + cache: 10m + url: http://immich_server:2283/api/server/statistics + headers: + x-api-key: ${GLANCE_IMMICH_API_KEY} + subrequests: + storage: + url: http://immich_server:2283/api/server/storage + headers: + x-api-key: ${GLANCE_IMMICH_API_KEY} + template: | + {{ $photos := .JSON.Int "photos" }} + {{ $videos := .JSON.Int "videos" }} + {{ $usageGiB := div (toFloat (.JSON.Int "usage")) 1073741824.0 }} + {{ $storage := .Subrequest "storage" }} + {{ $storageOK := and (ge $storage.Response.StatusCode 200) (le $storage.Response.StatusCode 299) }} + {{ $percentage := 0.0 }} + {{ if $storageOK }}{{ $percentage = $storage.JSON.Float "diskUsagePercentage" }}{{ end }} +
+
+
{{ $photos | formatNumber }}
+
Fotos
+
+
+
{{ $videos | formatNumber }}
+
Videos
+
+
+
{{ printf "%.0f" $usageGiB }} GiB
+
Medien
+
+
+
+
+
+
{{ if $storageOK }}{{ printf "%.1f" $percentage }}% Speicher belegt{{ else }}Speicher API nicht verfuegbar{{ end }}
+ + - type: group + widgets: + - type: monitor + title: Core + cache: 1m + sites: + - title: AdGuard Home + url: http://192.168.178.58:8082 + check-url: http://adguard + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Authelia + url: https://auth.kaleschke.info + check-url: http://authelia:9091/api/health + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Gitea + url: https://git.kaleschke.info + check-url: http://gitea:3000/api/healthz + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Traefik + url: https://traefik.kaleschke.info + check-url: http://traefik:8082/metrics + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Vaultwarden + url: https://vault.kaleschke.info + check-url: http://vaultwarden/alive + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vaultwarden.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Komodo + url: https://komodo.kaleschke.info + check-url: http://komodo-core:9120 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/komodo.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Glance + url: https://glance.kaleschke.info + check-url: http://glance:8080 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + + - type: monitor + title: Apps + cache: 1m + sites: + - title: Paperless-ngx + url: https://paperless.kaleschke.info + check-url: http://paperless-ngx:8000 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Paperless-GPT + url: https://paperless-gpt.kaleschke.info + check-url: http://paperless-gpt:8080 + icon: mdi:robot + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Immich + url: https://immich.kaleschke.info + check-url: http://immich_server:2283/api/server/ping + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Mealie + url: https://mealie.kaleschke.info + check-url: http://mealie:9000 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Nextcloud + url: https://cloud.kaleschke.info + check-url: http://nextcloud/status.php + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: ntfy + url: https://ntfy.kaleschke.info + check-url: http://ntfy/v1/health + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ntfy.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Mail Archiver + url: https://mail.kaleschke.info + check-url: http://mail-archiver:5000 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailcow.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: BentoPDF + url: https://pdf.kaleschke.info + check-url: http://bentopdf:8080 + icon: mdi:file-pdf-box + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + + - type: monitor + title: Ops + cache: 1m + sites: + - title: Monitoring Grafana + url: https://monitoring.kaleschke.info + check-url: http://monitoring-grafana:3000/api/health + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Glances + url: https://glances.kaleschke.info + check-url: http://glances:61208 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Scrutiny + url: https://scrutiny.kaleschke.info + check-url: http://scrutiny:8080 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Speedtest Tracker + url: https://speedtest.kaleschke.info + check-url: http://speedtest-tracker + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Filebrowser + url: https://files.kaleschke.info + check-url: http://filebrowser + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/filebrowser.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: code-server + url: https://code.kaleschke.info + check-url: http://code-server:8443 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/vscode.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Borg UI + url: https://borg.kaleschke.info + check-url: http://borg-ui:8081 + icon: mdi:archive-sync + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + + - size: small + widgets: + - type: custom-api + title: Internet + title-url: https://speedtest.kaleschke.info + cache: 1h + url: http://speedtest-tracker/api/v1/results/latest + headers: + Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} + Accept: application/json + template: | + {{ $ip := .JSON.String "external_ip" }} + {{ if eq $ip "" }}{{ $ip = .JSON.String "data.interface.externalIp" }}{{ end }} + {{ $isp := .JSON.String "isp" }} + {{ if eq $isp "" }}{{ $isp = .JSON.String "data.isp" }}{{ end }} + {{ $server := .JSON.String "server_name" }} + {{ if eq $server "" }}{{ $server = .JSON.String "data.server_name" }}{{ end }} +
+
{{ if ne $ip "" }}{{ $ip }}{{ else }}WAN online{{ end }}
+
Speedtest Tracker
+
{{ if ne $isp "" }}{{ $isp }}{{ else }}{{ $server }}{{ end }}
+
+ + - type: custom-api + title: Internet Speed + title-url: https://speedtest.kaleschke.info + cache: 1h + url: http://speedtest-tracker/api/v1/results/latest + headers: + Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} + Accept: application/json + subrequests: + stats: + url: http://speedtest-tracker/api/v1/stats + headers: + Authorization: Bearer ${GLANCE_SPEEDTEST_API_KEY} + Accept: application/json + template: | + {{ $stats := .Subrequest "stats" }} + {{ $download := .JSON.Float "download" }} + {{ if eq $download 0.0 }}{{ $download = .JSON.Float "data.download" }}{{ end }} + {{ if eq $download 0.0 }}{{ $download = div (.JSON.Float "download_bits") 1000000.0 }}{{ end }} + {{ if eq $download 0.0 }}{{ $download = div (.JSON.Float "data.download_bits") 1000000.0 }}{{ end }} + {{ $upload := .JSON.Float "upload" }} + {{ if eq $upload 0.0 }}{{ $upload = .JSON.Float "data.upload" }}{{ end }} + {{ if eq $upload 0.0 }}{{ $upload = div (.JSON.Float "upload_bits") 1000000.0 }}{{ end }} + {{ if eq $upload 0.0 }}{{ $upload = div (.JSON.Float "data.upload_bits") 1000000.0 }}{{ end }} + {{ $ping := .JSON.Float "ping" }} + {{ if eq $ping 0.0 }}{{ $ping = .JSON.Float "data.ping" }}{{ end }} + {{ if and (eq $download 0.0) (eq $upload 0.0) }} +
Keine aktuellen Messdaten.
API-Token oder Antwortformat pruefen.
+ {{ else }} + {{ $downloadAvg := $stats.JSON.Float "avg_download" }} + {{ if eq $downloadAvg 0.0 }}{{ $downloadAvg = $stats.JSON.Float "data.download.avg" }}{{ end }} + {{ if eq $downloadAvg 0.0 }}{{ $downloadAvg = div ($stats.JSON.Float "data.download.avg_bits") 1000000.0 }}{{ end }} + {{ $uploadAvg := $stats.JSON.Float "avg_upload" }} + {{ if eq $uploadAvg 0.0 }}{{ $uploadAvg = $stats.JSON.Float "data.upload.avg" }}{{ end }} + {{ if eq $uploadAvg 0.0 }}{{ $uploadAvg = div ($stats.JSON.Float "data.upload.avg_bits") 1000000.0 }}{{ end }} + {{ $pingAvg := $stats.JSON.Float "avg_ping" }} + {{ if eq $pingAvg 0.0 }}{{ $pingAvg = $stats.JSON.Float "data.ping.avg" }}{{ end }} + {{ $downloadChange := percentChange $downloadAvg $download }} + {{ $uploadChange := percentChange $uploadAvg $upload }} + {{ $pingChange := percentChange $pingAvg $ping }} +
+
+
{{ printf "%+.1f%%" $downloadChange }}
+
{{ printf "%.1f" $download }}
+
DOWNLOAD
+
+
+
{{ printf "%+.1f%%" $uploadChange }}
+
{{ printf "%.1f" $upload }}
+
UPLOAD
+
+
+
{{ printf "%+.1f%%" $pingChange }}
+
{{ printf "%.0f ms" $ping }}
+
PING
+
+
+ {{ end }} + + - type: dns-stats + title: DNS Stats + service: adguard + url: http://adguard + username: ${GLANCE_ADGUARD_USERNAME} + password: ${GLANCE_ADGUARD_PASSWORD} + + - type: monitor + title: DNS und VPN + cache: 1m + sites: + - title: AdGuard Home + url: http://192.168.178.58:8082 + check-url: http://adguard + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Traefik + url: https://traefik.kaleschke.info + check-url: http://traefik:8082/metrics + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + + - type: docker-containers + title: Network Container + category: network + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml + + - type: docker-containers + title: App Container + category: apps + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml + + - type: docker-containers + title: Ops Container + category: ops + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml diff --git a/ops/glance/config/infrastructure.yml b/ops/glance/config/infrastructure.yml new file mode 100644 index 0000000..48bba6c --- /dev/null +++ b/ops/glance/config/infrastructure.yml @@ -0,0 +1,242 @@ +- name: Infrastructure and Media + slug: infrastructure + width: wide + columns: + - size: small + widgets: + - type: bookmarks + title: Core + groups: + - title: Control Plane + color: 212 100 50 + links: + - title: Komodo + url: https://komodo.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/komodo.svg + - title: Gitea + url: https://git.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg + - title: Traefik + url: https://traefik.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/traefik.svg + - title: Authelia + url: https://auth.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/authelia.svg + + - type: bookmarks + title: Media und Apps + groups: + - title: Apps + color: 140 70 40 + links: + - title: Immich + url: https://immich.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg + - title: Paperless + url: https://paperless.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg + - title: Nextcloud + url: https://cloud.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + - title: Mealie + url: https://mealie.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg + + - type: custom-api + title: Scrutiny Disk Health + title-url: https://scrutiny.kaleschke.info + cache: 30m + url: http://scrutiny:8080/api/summary + template: | + {{ $disks := .JSON.Array "data.summary.@values" }} + {{ if eq (len $disks) 0 }} +
Keine Disks gemeldet.
+ {{ else }} + + {{ end }} + + - size: full + widgets: + - type: custom-api + title: GitOps - homelab-infra + title-url: https://git.kaleschke.info/Micha/homelab-infra + cache: 5m + url: http://gitea:3000/api/v1/repos/Micha/homelab-infra/commits?limit=5&stat=false + headers: + Authorization: token ${GLANCE_GITEA_TOKEN} + Accept: application/json + subrequests: + repo: + url: http://gitea:3000/api/v1/repos/Micha/homelab-infra + headers: + Authorization: token ${GLANCE_GITEA_TOKEN} + Accept: application/json + template: | + {{ $repo := .Subrequest "repo" }} + {{ $repoOK := and (ge $repo.Response.StatusCode 200) (le $repo.Response.StatusCode 299) }} + {{ if $repoOK }} +
+
+
{{ $repo.JSON.Int "open_issues_count" }}
+
Issues
+
+
+
{{ $repo.JSON.Int "open_pr_counter" }}
+
PRs
+
+
+
{{ $repo.JSON.String "default_branch" }}
+
Branch
+
+
+ {{ end }} + + + - type: monitor + title: Platform Checks + cache: 1m + sites: + - title: Gitea + url: https://git.kaleschke.info + check-url: http://gitea:3000/api/healthz + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Monitoring Grafana + url: https://monitoring.kaleschke.info + check-url: http://monitoring-grafana:3000/api/health + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/grafana.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Glance + url: https://glance.kaleschke.info + check-url: http://glance:8080 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Immich + url: https://immich.kaleschke.info + check-url: http://immich_server:2283/api/server/ping + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Paperless-ngx + url: https://paperless.kaleschke.info + check-url: http://paperless-ngx:8000 + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + - title: Nextcloud + url: https://cloud.kaleschke.info + check-url: http://nextcloud/status.php + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + timeout: 5s + alt-status-codes: [200, 302, 401, 403] + + - type: docker-containers + title: Core Container + category: core + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml + + - type: docker-containers + title: App Container + category: apps + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml + + - type: docker-containers + title: Ops Container + category: ops + hide-by-default: true + sock-path: tcp://glance-docker-socket-proxy:2375 + containers: + $include: containers-map.yml + + - size: small + widgets: + - type: custom-api + title: Paperless-ngx + title-url: https://paperless.kaleschke.info + cache: 15m + url: http://paperless-ngx:8000/api/statistics/ + headers: + Authorization: Token ${GLANCE_PAPERLESS_TOKEN} + Accept: application/json + template: | + {{ $total := .JSON.Int "documents_total" }} + {{ $inbox := .JSON.Int "documents_inbox" }} +
+
+
{{ $total | formatNumber }}
+
Dokumente
+
+
+
{{ $inbox }}
+
Inbox
+
+
+ + - type: custom-api + title: Mealie + title-url: https://mealie.kaleschke.info + cache: 1h + url: http://mealie:9000/api/app/about/statistics + headers: + Authorization: Bearer ${GLANCE_MEALIE_TOKEN} + Accept: application/json + template: | +
+
+
{{ .JSON.Int "totalRecipes" | formatNumber }}
+
Rezepte
+
+
+
{{ .JSON.Int "totalCategories" }}
+
Kategorien
+
+
+
{{ .JSON.Int "totalUsers" }}
+
Nutzer
+
+
+ + - type: bookmarks + title: Ops + groups: + - title: Tools + color: 4 78 57 + links: + - title: Glances + url: https://glances.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg + - title: Scrutiny + url: https://scrutiny.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/scrutiny.svg + - title: Speedtest + url: https://speedtest.kaleschke.info + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png diff --git a/ops/glance/config/ops.yml b/ops/glance/config/ops.yml new file mode 100644 index 0000000..df6cba7 --- /dev/null +++ b/ops/glance/config/ops.yml @@ -0,0 +1,80 @@ +- name: Ops und Releases + slug: ops + width: wide + columns: + - size: small + widgets: + - type: rss + title: Selfhosted News + style: vertical-list + limit: 12 + collapse-after: 6 + cache: 6h + feeds: + - url: https://selfh.st/rss/ + title: selfh.st + - url: https://tailscale.com/blog/index.xml + title: Tailscale Blog + + - size: full + widgets: + - type: releases + title: Image Releases + cache: 12h + show-source-icon: true + collapse-after: 15 + repositories: + - glanceapp/glance + - traefik/traefik + - go-gitea/gitea + - moghtech/komodo + - immich-app/immich + - paperless-ngx/paperless-ngx + - AdguardTeam/AdGuardHome + - dani-garcia/vaultwarden + - authelia/authelia + - mealie-recipes/mealie + - nextcloud/server + - AnalogJ/scrutiny + - alexjustesen/speedtest-tracker + - binwiederhier/ntfy + - filebrowser/filebrowser + - coder/code-server + - qdm12/ddns-updater + - nicolargo/glances + + - size: small + widgets: + - type: custom-api + title: Letzte Commits + title-url: https://git.kaleschke.info/Micha/homelab-infra/commits/branch/master + cache: 5m + url: http://gitea:3000/api/v1/repos/Micha/homelab-infra/commits?limit=8&stat=false + headers: + Authorization: token ${GLANCE_GITEA_TOKEN} + Accept: application/json + template: | + + + - type: bookmarks + title: Deploy-Kette + groups: + - title: GitOps + color: 212 100 50 + links: + - title: Gitea Repo + url: https://git.kaleschke.info/Micha/homelab-infra + icon: si:gitea + - title: Komodo Stacks + url: https://komodo.kaleschke.info + icon: sh:komodo + - title: Grafana + url: https://monitoring.kaleschke.info + icon: si:grafana diff --git a/ops/glance/config/pages.yml b/ops/glance/config/pages.yml new file mode 100644 index 0000000..e2c7a54 --- /dev/null +++ b/ops/glance/config/pages.yml @@ -0,0 +1,3 @@ +$include: home.yml +$include: infrastructure.yml +$include: ops.yml diff --git a/ops/glance/docker-compose.yml b/ops/glance/docker-compose.yml index 8494613..7cdd055 100644 --- a/ops/glance/docker-compose.yml +++ b/ops/glance/docker-compose.yml @@ -9,8 +9,14 @@ services: GLANCE_ADGUARD_USERNAME: ${GLANCE_ADGUARD_USERNAME:-} GLANCE_ADGUARD_PASSWORD: ${GLANCE_ADGUARD_PASSWORD:-} GLANCE_SPEEDTEST_API_KEY: ${GLANCE_SPEEDTEST_API_KEY:-} + GLANCE_KOMODO_API_KEY: ${GLANCE_KOMODO_API_KEY:-} + GLANCE_KOMODO_API_SECRET: ${GLANCE_KOMODO_API_SECRET:-} + GLANCE_GITEA_TOKEN: ${GLANCE_GITEA_TOKEN:-} + GLANCE_PAPERLESS_TOKEN: ${GLANCE_PAPERLESS_TOKEN:-} + GLANCE_MEALIE_TOKEN: ${GLANCE_MEALIE_TOKEN:-} volumes: - ./config:/app/config:ro + - ./assets:/app/assets:ro networks: - frontend_net - glance_socket_net