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
+
+
+
+
+ - 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