Zum Inhalt springen
labkompass

Logbuch#backup#audit#victoriametrics#performance#homeos

Das erste Backup war 4 KB groß

Von Niclas Hennrich · veröffentlicht · geschehen am


BuildIm Einsatz

Selbst gebaut und in Betrieb genommen. Gehört zum Vorhaben HomeOS — Control Center mit drei Säulen.

erstes Wochenarchiv (statt 118 MB)
4KB
Live-Requests pro Tag und Ziel — ohne Zuschauer
86400
Tabellen ohne Wachstumsgrenze
15

Kurz zur Einordnung: HomeOS ist mein selbst gebautes Control Center fürs Homelab, aus dem Infrastruktur-NOC gewachsen, mit drei Säulen: Infrastruktur, Haus und Family. Nach zwei Tagen Säulenbau habe ich es einmal komplett durchleuchtet, statt das nächste Feature anzufangen — vier Code-Durchgänge (Datenmodell, Jobs, Frontend, Infrastruktur) plus eine Live-Baseline auf optimus.

Der Befund war ernüchternd. Kein automatisiertes Backup: Datenbank samt Familiendaten, drei Jahre Metriken und die .env existierten genau einmal, auf einer NVMe ohne ECC. Keine Log-Rotation bei sieben von acht Containern. Kein Selbst-Monitoring — das NOC sah jeden Ausfall außer den eigenen. 15 Tabellen ohne Wachstumsgrenze. Ein Live-Broker, der rund 86 400 Requests pro Tag und Ziel absetzte, auch wenn niemand zuschaute. Und ein Frontend, dessen Live-Stream nach einem Backend-Neustart endgültig stehen blieb.

Sortiert habe ich nach Schadensklasse: Datenverlust vor Stabilität vor Security vor Datenintegrität vor Performance. Und dann umgesetzt statt berichtet.

Backup zuerst. Täglicher pg_dump, wöchentlicher VictoriaMetrics-Snapshot, Kopie der .env, Rotation — und beide Restores real geprobt. Gut so: Das erste Wochenarchiv war 4 KB groß statt 118 MB. VictoriaMetrics-Snapshots sind Symlink-Bäume, und tar packt ohne -h nur die Links. Der erste Restore schlug ebenfalls fehl, weil ein Verzeichnis eine Ebene zu hoch lag. Beides hätte ich sonst im Ernstfall gelernt. Ein Backup ist erst nach der Restore-Probe ein Backup. Und es ist erst der Anfang: Ein Backup ist noch keine Katastrophenvorsorge.

Der teuerste Verbraucher war der ohne Zuschauer. Der Live-Broker fragte im Sekundentakt alle Ziele ab, 24/7, für niemanden. Die Idle-Erkennung — keine Abonnenten, keine Requests — kostete zehn Zeilen. Daneben: Der Cache hatte eine Lebensdauer von 2 s bei einem Poll alle 5 s, also lief fast jeder Poll in 74 sequenzielle Abfragen an den Zeitreihen-Speicher; jetzt sind es 10 s, angeglichen an den Poll. Die Uhr auf dem Wanddisplay renderte die Seite 86 400 Mal am Tag, jetzt einmal pro Minute. Und der Automations-Tick schrieb rund 17 000 leere Transaktionen pro Tag, nur um einen Countdown zu aktualisieren.

Datenmodell: Ein Retention-Framework für zehn wachsende Tabellen, täglich im Backend, als Regel-Registry je Domäne, damit der Grenztest zwischen den Säulen hält. Sechs Indizes — jede Traffic-Abfrage war bis dahin ein Seq Scan. Der Kalender-Zeitfilter läuft jetzt in SQL; vorher ging der Minuten-Tick über alle Termine. Dazu ein Test, der Migrations-Drift zwischen Modell und Datenbank meldet.

Stabilität: Reconnect für den Live-Stream mit Timeout und Backoff, Timeouts um jedes Adapter-Read, Datenbankarbeit der Loops in Worker-Threads, echte Healthchecks für Backend und Frontend. Und ein Logging-Setup — vorher verschwand jedes log.info des API-Prozesses im Nichts. Selbst-Monitoring über einen /metrics-Endpunkt mit Request-Zählern und Latenzen, plus HTTP-Probes auf die eigene Oberfläche.

Erste Controlling-Stufe: Eine Energie-Ansicht mit kWh für heute, gestern, 7 und 30 Tage je Gerät — per increase() direkt aus VictoriaMetrics, keine zweite Ablage. Der Endpunkt antwortet in rund 18 ms. Und die Mealie-Frage ist entschieden: Mealie bleibt die Quelle der Rezeptpflege (5 447 Rezepte), HomeOS importiert beim Verplanen eine schlanke, idempotente Kopie mit Quellverweis. Am Folgetag aktiviert; Fallstrick dabei: Pydantic liest die Container-Umgebung, nicht die .env — die Compose-Blöcke müssen die Variablen durchreichen.

Kleinigkeiten mit Biss: Eine Feld-Kollision in Pydantic-Settings ist stumm — die spätere Definition gewinnt kommentarlos. Mein neues Retention-Intervall hieß wie der Stundentakt des Flow-Collectors; aufgefallen nur, weil der Takt im Deploy-Log stand. Die Architektur-Doku beschrieb vier Services und einen Proxy, den es nie gab — beim Wiederaufbau wäre das gefährlich gewesen. Und die Datenschutz-Retention der Flow-Daten lief nur, wenn der NetFlow-Container lief: Eine Frist, die an einem optionalen Container hängt, ist eine Absichtserklärung.

Ergebnis: 1159 Tests grün (vorher 1135), 30 von 30 Scrape-Targets up, alle Container healthy, Backup-Crontab aktiv. Offen ist die Langzeit-Nachmessung — wie viel CPU der cAdvisor-Umbau und die eingesparte Poll-Last im 24-h-Mittel wirklich bringen, braucht Laufzeit.