- 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 subrequests: stats: url: http://speedtest-tracker/api/v1/stats 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 }} {{ if eq $ip "" }}{{ $ip = .JSON.String "data.data.interface.externalIp" }}{{ end }} {{ $isp := .JSON.String "isp" }} {{ if eq $isp "" }}{{ $isp = .JSON.String "data.isp" }}{{ end }} {{ if eq $isp "" }}{{ $isp = .JSON.String "data.data.isp" }}{{ end }} {{ $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 }} {{ if eq $download 0.0 }}{{ $download = div (mul (.JSON.Float "data.data.download.bandwidth") 8.0) 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 }} {{ if eq $upload 0.0 }}{{ $upload = div (mul (.JSON.Float "data.data.upload.bandwidth") 8.0) 1000000.0 }}{{ end }} {{ $ping := .JSON.Float "ping" }} {{ if eq $ping 0.0 }}{{ $ping = .JSON.Float "data.ping" }}{{ end }} {{ if eq $ping 0.0 }}{{ $ping = .JSON.Float "data.data.ping.latency" }}{{ end }}
{{ if ne $ip "" }}{{ $ip }}{{ else }}WAN online{{ end }}
{{ if ne $isp "" }}{{ $isp }}{{ else }}Speedtest Tracker{{ end }}
{{ if and (eq $download 0.0) (eq $upload 0.0) }}
Keine aktuellen Messdaten
{{ else }}
{{ printf "%.0f" $download }}
DOWN
{{ printf "%.0f" $upload }}
UP
{{ 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: custom-api title: Borg Backup title-url: https://borg.kaleschke.info cache: 15m url: http://monitoring-prometheus:9090/api/v1/query?query=(time()-homelab_borg_last_completed_timestamp_seconds)/3600 subrequests: success: url: http://monitoring-prometheus:9090/api/v1/query?query=homelab_borg_last_success template: | {{ $ageHours := .JSON.Float "data.result.0.value.1" }} {{ $archive := .JSON.String "data.result.0.metric.archive" }} {{ $succ := .Subrequest "success" }} {{ $ok := $succ.JSON.Float "data.result.0.value.1" }} {{ $status := $succ.JSON.String "data.result.0.metric.status" }} {{ if eq (len (.JSON.Array "data.result")) 0 }}
Keine Backup-Metrik gefunden
{{ else }}
vor {{ printf "%.0f" $ageHours }} h
letztes abgeschlossenes Backup
{{ if eq $ok 1.0 }}letzter Job erfolgreich{{ else }}letzter Job: {{ $status }}{{ end }}
{{ if ne $archive "" }}
{{ $archive }}
{{ end }}
{{ end }} - type: group widgets: - type: docker-containers title: Network category: network hide-by-default: true sock-path: tcp://glance-docker-socket-proxy:2375 containers: $include: containers-map.yml - type: docker-containers title: Apps category: apps hide-by-default: true sock-path: tcp://glance-docker-socket-proxy:2375 containers: $include: containers-map.yml - type: docker-containers title: Ops category: ops hide-by-default: true sock-path: tcp://glance-docker-socket-proxy:2375 containers: $include: containers-map.yml