E1 Backup & Restore: Umsetzungs-Log
Verlauf der Umsetzung nach dem Umsetzungsplan. Der Plan bleibt als Vorlage unverändert. Hier steht, was tatsächlich passiert ist: je Task das Ergebnis, Abweichungen vom Plan (als „Entscheidung“) und Funde nebenbei. Neueste Einträge oben.
Stand
| Task |
Issue |
Status |
Datum |
| 0 Issues, Ausgangslage |
– |
erledigt |
30.10.2026 |
| 1 NUC-Configs ins Git |
#283 |
auf dem NUC umgesetzt (homeserver#290), Morgen-Check 03.11. offen |
02.11.2026 |
| 2 Storage Box |
#283 |
Runbook und homeserver#291 bereit, wartet auf Robin |
02.11.2026 |
| 3 rclone-Mount weg |
#283 |
Runbook bereit |
02.11.2026 |
| 4 UNAS-Ziel |
#284 |
offen |
|
| 5 VPS |
#285 |
offen |
|
| 6 Aufbewahrung, Dumps, Excludes |
#286 |
Code fertig (homeserver#292), Deploy offen, Frist ollama-Exclude 31.12.2026 |
02.11.2026 |
| 7 Alarmierung, Morgenstatus |
#287 |
Code fertig (homeserver#293), Deploy offen |
02.11.2026 |
| 8 Restore-Proben |
#288 |
offen |
|
| 9 Störungs-Handbuch |
#289 |
offen |
|
| 10 Abschluss |
– |
offen |
|
Tasks 1–3, 6, 7 · Vorbereitung und Task 1 (30.10.–02.11.2026)
- Task 1 umgesetzt (Robin, 02.11. 20:18, ohne Fehler): Die NUC-Configs kommen aus dem Git (homeserver#290), die Secrets liegen unter
credentials/, der Kuma-Push ist raus. Lesend geprüft: vier neue Credential-Dateien 0600, kein uptime_kuma mehr.
- Entscheidung:
healthchecks.ping_url kommt per !include aus credentials/. borgmatic 2.1.5 löst {credential …} nur für Benutzer-, Passwort- und Token-Optionen auf. Der Repo-Pfad nimmt denselben Weg, weil die Konto-ID der Box darin steht.
- Gegenprobe Live-Config gegen Repo-Fassung, mit maskierten Secrets: einziger Unterschied ist
uptime_kuma. Das Extraktions-Skript aus Runbook 1.2 lief vorher gegen nachgebaute Configs.
- Task 2/3 vorbereitet: Runbook-Abschnitte (homelab-documentation#86),
hetzner.yaml für den Sub-Account in homeserver#291, erst direkt vor Runbook Task 2 mergen.
- Gefunden: Das Home eines Sub-Accounts darf nicht das Repo sein, weil dort
.ssh/ liegt. Deshalb ziehen die Repos nach backups/<host>/repo.
- Gefunden: Auf dem aiserver gilt
ssh_command global. Der Box-Key kommt deshalb über einen Host-Block.
- Gefunden: Einen read-only Sub-Account kann man nicht mit einem Key versehen. Der Restore-Key kommt deshalb vor dem Read-only-Schalter.
- Gefunden: Docker hängt per Drop-in an
/mnt/storagebox.
- Task 6 und 7, Code vorgezogen (berührt keinen Host):
predeploy-backup.sh endet bei einem gescheiterten Dump mit Exit 2, db-dumps.sh meldet das an Healthchecks (homeserver#292).
- Morgenstatus-Skript mit 12 Tests, Python 3.10, und ein vierteljährlicher
verify-data-Timer (homeserver#293).
- Alle Tests waren vorher rot und sind jetzt grün. Die Mutationsprobe auf die Schwellen macht jeweils einen Test rot.
- Fund nebenbei: Laut Kommentar im Dump-Skript liegen die HA-Backups im Borg-Archiv. Tatsächlich schließt
**/backups/* sie aus. Kommt in Task 6, Schritt 5 dran.
- Panne: Eine parallele Session hat im selben Checkout
~/repos/homeserver den Branch gewechselt. Dadurch landete ein Commit kurz auf dem falschen Branch. Ohne Schaden behoben: Der fremde PR #294 blieb sauber, mein Commit wurde neu gebaut (#293). Lehre: Bei parallelen Sessions nur noch in einem eigenen Worktree arbeiten.
- Offen: Morgen-Check 03.11. (Runbook 1.6), danach Task 2 durch Robin.
Task 0 · Issues und Ausgangslage (30.10.2026)
- Teil-Issues #283–#289 angelegt und aufs Board (Projects #4) gelegt.
- Kommentare mit den Links in #179 und #216.
- Übergaben aus Design Abschnitt 18 als Kommentare: #278 (Kaltstart-Drill → E3), #188 (Lars ins Tailnet → E5), #182 (geschützter Snapshot vor dem VPS-Rebuild).
- Entscheidung: Jeder Healthchecks-Check wird in der Task angelegt, die ihn zuerst anpingt:
vps-box in Task 5, nuc-db-dumps in Task 6, der Rest in Task 7. Sonst könnte Task 5 bzw. 6 ihre Erwartung („Check up“) gar nicht erfüllen.
- Entscheidung: Log und Runbook-Gerüst kommen mit in homelab-documentation#85, weil das Design dort noch nicht gemergt ist. Die Nav-Einträge zeigen sonst ins Leere.
Ausgangslage (lesend erhoben, 28.–30.10.2026)
|
NUC |
aiserver |
| borgmatic |
2.1.5 (pipx) |
2.0.11 (apt) |
| borg |
1.4.0 (Binary /usr/local/bin/borg) |
1.4.4 (apt) |
| Nachtläufe, letzte 7 Tage |
14 von 14 Successfully (beide Configs) |
7 von 7 |
| Configs |
local.yaml, hetzner.yaml, immich_db_password, credentials/{local,hetzner}.pass |
aiserver.yaml (ungelesen, braucht sudo) |
- Storage Box: 667 012 038 656 B von 1 099 511 627 776 B belegt (61 %).
backups/nuc hat unique_csize 663 GB.
- USB-RAID
/dev/md0: 676 GB von 12,0 TB belegt. Das lokale NUC-Repo hat unique_csize 671 GB.
- Borg auf der Box: Aufruf
borg serve ohne --remote-path, also Hetzner-Standard 1.2.
- Docker hängt über
docker.service.d/10-wait-for-mounts.conf an /mnt/storagebox (RequiresMountsFor).