New docs/FAMILY_VIEW_DASHBOARD.md specifies the homelab-family-view Grafana dashboard: 8 panels covering endpoints up, Borg freshness, cert days, critical containers, disk usage, endpoint table, cert table and container status. Includes PromQL queries, thresholds, layout grid, datasource references, build order and smoke test. Dashboard JSON is intentionally not created yet because the Borg-stale / cert-expiry / container-down metrics from Sprint 3 are still pending. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.7 KiB
Family-View Dashboard - Spezifikation
Status: Spezifikation (Doku-only), kein Grafana-JSON in diesem Schritt.
Audit-Bezug: docs/AUDIT_2026-05-25.md Finding F-08 (Alerts/Sichtbarkeit) und das Sprint-3-TODO "Family-View Dashboard definieren" aus docs/AUDIT_2026-05-25_TODO.md.
Zweck
Ein Grafana-Dashboard, das beim Morgen-Check in unter 30 Sekunden zeigt, ob das Homelab gesund ist. Zielgruppe ist primaer der Operator. Wenn die Familie es zufaellig anschaut, soll niemand erschrecken: ueberall gruene Felder bedeuten "alles in Ordnung", ohne dass man die Technik dahinter verstehen muss.
Das Dashboard ist die Konsolidierung des morgendlichen Pruefablaufs:
- Sind die wichtigsten Apps erreichbar?
- Hat das Backup gestern Nacht funktioniert?
- Wann laufen die Zertifikate aus?
- Sind die Disks ausreichend frei?
- Laufen die kritischen Container?
Abgrenzung
Diese Datei beschreibt nur Layout, Datenquellen und PromQL-Queries. Die JSON-Datei monitoring/grafana/dashboards/family-view.json wird bewusst noch nicht angelegt, weil:
- Es noch keine Live-Pruefung gegen die echte Grafana-Instanz gab.
- Die Alert-Regeln (Borg-Stale, Cert-Expiry, Container-Down) sind laut
docs/AUDIT_2026-05-25_TODO.mdSprint 3 selbst noch im "in Arbeit (Regeln vorbereitet)"-Status. - Bei einem halbgaren Dashboard-JSON entstehen mehr Wartungsfragen als Klarheit.
Die JSON-Datei wird angelegt, sobald (a) die genannten Metriken stabil verfuegbar sind und (b) ein erster manueller Build im Grafana-UI das Layout bestaetigt hat.
Datenquellen
Authoritativ ist monitoring/grafana/provisioning/datasources/datasources.yml. Das Dashboard nutzt nur die schon provisionierten Datasources:
Prometheus- Blackbox, node-exporter, cAdvisor, Traefik-Metrics- optional
Loki- Log-Volume-Spike als Zusatz-Panel - bewusst nicht:
InfluxDB 3 Core(das ist Home-Assistant-/Ecowitt-Sicht, nicht Homelab-Health)
Layout (4x4 Grid, mobile-vertraeglich)
| Zeile | Panel | Breite (Grafana w) | Hoehe (Grafana h) |
|---|---|---|---|
| 1 | Endpoints up (Stat, gross gruen/rot) | 12 | 5 |
| 1 | Backup heute Nacht (Stat) | 6 | 5 |
| 1 | Naechster Cert-Ablauf (Stat, Tage) | 6 | 5 |
| 2 | Kritische Container running (Stat-Liste) | 12 | 6 |
| 2 | Disk-Fuellung (Bargraph, je Mountpoint) | 12 | 6 |
| 3 | Endpoint-Tabelle (Table: Host, Status, Latenz) | 24 | 8 |
| 4 | Cert-Tage-Tabelle (Table: Host, Tage bis Ablauf) | 12 | 6 |
| 4 | Container-Status-Tabelle (Table: kritischer Container, Running, letztes Restart) | 12 | 6 |
Dashboard-Metadaten:
- UID:
homelab-family-view - Title:
Homelab / Family View - Tags:
homelab,family-view,morning-check - Refresh:
30s - Default-Zeitfenster:
now-24hbisnow - Folder:
Homelab
Panel-Spezifikation
Panel 1: Endpoints up
- Type:
stat - Title:
Apps online - Query:
sum(probe_success{job="blackbox-http"}) - Anzeige: gruene Zahl bei Gesamtzahl, Wechsel auf rot wenn
< Soll-Anzahl. - Threshold: Soll-Anzahl wird aus
monitoring/blackbox/blackbox.ymlund Prometheus-Scrape-Liste abgeleitet (zum Doku-Zeitpunkt 19 HTTPS-Ziele lautdocs/MIGRATION_LOG.md2026-05-25-Monitoring-Konsolidierung). - Subtitel im Panel:
von <N> erreichbar. (Soll-Wert wird beim Bau aus dem aktuellen Target-Count gesetzt; nicht hartcoden.)
Panel 2: Backup heute Nacht
- Type:
stat - Title:
Borg-Lauf - Query (sobald Borg-Stale-Metrik im Textfile-Collector live ist):
(time() - homelab_borg_last_completed_timestamp_seconds) / 3600 - Einheit:
h - Threshold:
- 0-26 h gruen
- 26-30 h gelb
-
30 h rot
- Subtitel im Panel:
Stunden seit letztem completed-Lauf. - Fallback bis Metrik live: Panel zeigt
n/a, Doku-Hinweis in der Beschreibung.
Panel 3: Naechster Cert-Ablauf
- Type:
stat - Title:
Cert laeuft in - Query:
min((probe_ssl_earliest_cert_expiry{job="blackbox-http"} - time()) / 86400) - Einheit:
d(Tage) - Threshold:
-
14 gruen
- 7-14 gelb
- <7 rot
-
- Subtitel:
Tage bis kleinste Restlaufzeit aller geprueften Hosts.
Panel 4: Kritische Container running
- Type:
stat - Title:
Kritische Container - Query (sobald Container-Up-Metrik live ist):
sum(homelab_critical_container_running) - Threshold: erwartete Anzahl gruen, jeder fehlende Container rot.
- Subtitel:
von <N> erwartet. Erwartete Liste pflegen wir inservices/posture-check/ Textfile-Exporter (siehedocs/AUDIT_2026-05-25_TODO.mdSprint 3 "Container-Down-Alert"). - Fallback: cAdvisor-Query als Naeherung, solange Textfile-Metrik noch nicht produktiv ist:
count(rate(container_last_seen{name=~"traefik|authelia|postgresql17|Redis|gitea|komodo-core|komodo-mongo|komodo-periphery|monitoring-prometheus|monitoring-grafana|monitoring-loki|monitoring-alertmanager"}[5m]) > 0)
Panel 5: Disk-Fuellung
- Type:
bargauge - Title:
Disk-Fuellung - Query:
100 * (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) - Anzeige: pro Mountpoint, sortiert absteigend.
- Threshold:
- <70 gruen
- 70-85 gelb
-
85 rot
- Subtitel:
Prozent belegt.
Panel 6: Endpoint-Tabelle
- Type:
table - Title:
Endpoint-Status - Spalten:
- Host (Instance)
- Status (
UP/DOWN) - Antwortzeit (probe_duration_seconds)
- Queries:
probe_success{job="blackbox-http"}-> Mapping:1->UP(gruen),0->DOWN(rot)probe_duration_seconds{job="blackbox-http"}-> Sekunden
- Sortierung: DOWN oben, dann nach Antwortzeit absteigend.
Panel 7: Cert-Tage-Tabelle
- Type:
table - Title:
Cert-Tage bis Ablauf - Spalten: Host, Tage
- Query:
(probe_ssl_earliest_cert_expiry{job="blackbox-http"} - time()) / 86400 - Sortierung: aufsteigend (am ehesten ablaufende oben).
- Color-Mapping wie Panel 3.
Panel 8: Container-Status-Tabelle
- Type:
table - Title:
Kritische Container - Spalten: Container, Running (1/0), letztes Restart (Sekunden seit Start)
- Queries:
- sobald Textfile-Metrik live:
homelab_critical_container_running(Labelname) - Fallback aus cAdvisor:
container_start_time_seconds{name=~"<Whitelist>"}
- sobald Textfile-Metrik live:
- Sortierung: nicht-running zuerst.
Spaeter ergaenzbar (nicht Teil der ersten Version)
- Loki-Log-Volume-Spike-Panel
- node_exporter Memory-Saturation-Panel
- Plex-Sessions (nur wenn Plex-Exporter eingerichtet ist; aktuell nicht geplant)
- Immich Asset-Wachstum (eigenes Dashboard, nicht Family-View)
Build-Reihenfolge fuer den spaeteren JSON
Wenn das JSON gebaut wird, bitte in dieser Reihenfolge:
- Sicherstellen, dass alle Metriken aus den Queries oben in Prometheus auffindbar sind (
/graphSmoke-Test). - Dashboard in Grafana-UI manuell zusammenklicken; Layout an dieser Spezifikation entlang.
- JSON exportieren, in
monitoring/grafana/dashboards/family-view.jsonablegen. - Provisioning-Provider laesst die Datei automatisch laden (siehe
monitoring/grafana/provisioning/dashboards/dashboards.yml). - Bei jeder Schema-Aenderung Doku hier nachziehen, damit Spec und JSON nicht driften.
Smoke-Test nach Aktivierung
- Dashboard laedt unter
https://monitoring.kaleschke.info/d/homelab-family-view/. - Alle 8 Panels rendern ohne
No data. - Im Normalbetrieb erscheinen Panel 1-5 vollstaendig gruen.
- Ein bewusster Test-Stale-Borg oder ein Container-Stop laesst die zugehoerigen Panels auf gelb/rot wechseln.
Was das Dashboard NICHT ersetzt
- ntfy-Alerts: das Dashboard ist passiv (Pull), ntfy ist aktiv (Push). Beide sind notwendig.
- DR-Doku:
docs/DISASTER_RECOVERY.mdbleibt die Recovery-Quelle. - Restore-Tests:
docs/RESTORE_DRILL_ROUTINE.mdist die Kadenz, die das Dashboard nicht ersetzt. - Familien-Onboarding:
docs/FAMILY_ONBOARDING.mdist die Doku fuer die Familie, dieses Dashboard ist Operator-Tool.