5.2 KiB
Restore Test Schedule
Ziel
Regelmaessige Restore-Tests mit wenig Handarbeit und klaren Nachweisen.
Intervalle
Woechentlich:
- Backup-/Dump-Frische pruefen
- keine echten Restore-Container starten
- pruefen:
- Dump-Dateien vorhanden
- Dump-Dateien nicht zu alt
- letzte Reports vorhanden
Monatlich:
vaultwardenMini-RestoregiteaMini-Restore, versetzt zum Vaultwarden-Lauf
Alle 2 Monate:
paperlessMini-Restore
Quartalsweise:
- Restore-/DR-Sanity-Check
immichRestore-Smoke-Test (DB + UI, ohne produktive Foto-Mounts; Erstlauf 2026-05-27 erfolgreich)adguardRestore-Smoke-Test (Config + HTTP/DNS, nach DNS-Aenderungen auch ausserhalb des Quartals)- pruefen:
- Restore-Lab-Struktur
- Reports
- Skripte und Pfade
- Doku noch passend
Quartals-Belegung:
| Quartal | Mini-Restore | Sanity-Fokus |
|---|---|---|
| Q1 | paperless |
Tier-1-Reihenfolge, Posture-Check, Borg-Frische |
| Q2 | immich |
Komodo-Bootstrap, Gitea-Bundles, Secrets-Inventur |
| Q3 | mealie oder nextcloud |
DNS-Pfad und Cert-Expiry-Sicht |
| Q4 | vaultwarden oder gitea |
Externe Abhaengigkeiten, Hetzner, GitHub-Mirror |
Bestaetigte Mini-Restores: Vaultwarden, Gitea und Paperless am 2026-05-07; Immich am 2026-05-27; Paperless erneut am 2026-05-31; Authelia am 2026-06-03 (Config-Smoke ohne produktiven Dump-Restore); AdGuard Home am 2026-06-06 (Config + HTTP/DNS-Smoke).
Konkreter Kalender
- Jeden Montag, 06:30:
check-restore-freshness.sh
- Jeden 1. Samstag im Monat, 07:00:
vaultwarden
- Jeden 3. Samstag im Monat, 07:00:
gitea
- Jeden 2. Samstag in ungeraden Monaten, 08:00:
paperless
- Jeden 2. Samstag in geraden Monaten, 07:30:
authelia
- Jeden 1. des Monats, 09:00:
monthly-random-restore.sh
- Quartalsweise am 1. Werktag des Quartals:
- DR-/Restore-Sanity-Check
- Quartalsweise am 2. Sonntag im zweiten Quartalsmonat, 08:30:
immich
Unraid User Scripts Cron
Vixie-Cron (Unraid) verknuepft day-of-month und day-of-week mit OR, sobald beide gesetzt sind. "n-ter Samstag im Monat" laesst sich deshalb nicht direkt im Cron-Ausdruck ausdruecken. Wir triggern stattdessen an jedem Samstag/Sonntag und filtern den Monatstag im User-Script per Shell-Guard.
| Script | Cron | Shell-Guard (zusaetzlich) | Bedeutung |
|---|---|---|---|
restore-freshness-weekly |
30 6 * * 1 |
- | jeden Montag 06:30 |
restore-vaultwarden-monthly |
0 7 * * 6 |
[ "$(date +%-d)" -le 7 ] |
erster Samstag im Monat 07:00 |
restore-gitea-monthly |
15 7 * * 6 |
d=$(date +%-d); [ "$d" -ge 15 ] && [ "$d" -le 21 ] |
dritter Samstag im Monat 07:15 |
restore-paperless-bimonthly |
0 8 * * 6 |
m=$(date +%-m); d=$(date +%-d); case "$m" in 1|3|5|7|9|11) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac |
zweiter Samstag in ungeraden Monaten 08:00 |
restore-authelia-bimonthly |
30 7 * * 6 |
m=$(date +%-m); d=$(date +%-d); case "$m" in 2|4|6|8|10|12) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac |
zweiter Samstag in geraden Monaten 07:30 |
restore-immich-quarterly |
30 8 * * 0 |
m=$(date +%-m); d=$(date +%-d); case "$m" in 2|5|8|11) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac |
zweiter Sonntag in Feb/Mai/Aug/Nov 08:30 |
monthly-random-restore |
0 9 1 * * |
- | erster Kalendertag im Monat 09:00 |
Warum so: ein frueheres Schema wie 0 7 1-7 * 6 haette in Vixie-Cron die OR-Semantik ausgeloest und an jedem Tag 1-7 zusaetzlich zu jedem Samstag gefeuert (~11 Laeufe statt 1 pro Monat). Die obige Trennung Cron-Trigger + Shell-Guard ist die einzige robuste Loesung in Standard-Cron.
Betriebsmodus
- V1:
- Bash-Jobs laufen hostseitig manuell oder per User Script
ntfy-Wrapper ist vorhanden; Erfolg geht nachhomelab-info, Fehler nachhomelab-alerts- Hermes wertet spaeter optional Reports aus
- V2:
- fester Host-Schedule
ntfybei Erfolg/Fehler ueberrun-restore-job-with-ntfy.sh- Hermes erzeugt Zusammenfassungen und Overviews
Automatisierung
Automatisch:
- Testpfad vorbereiten
- Restore in
restore-lab - Testcontainer
restoretest-*starten - Smoke-Test ausfuehren
- Markdown-Report schreiben
ntfyErfolg/Fehler senden- alte Testartefakte bereinigen
Manuell:
- neue Testfaelle einfuehren
- riskante oder produktionsnahe Sondertests
- Aenderungen an Restore-Logik
- Freigabe fuer den ersten echten Restore je Dienst
Ablage
- Quelle:
/mnt/user/backups/borg - Restore-Lab:
/mnt/user/backups/restore-lab - Reports:
/mnt/user/backups/restore-reports
Quartals-Sanity
Kurz pruefen:
docs/DISASTER_RECOVERY.mdPhase 1-5 passt noch zum Repo.docs/RESTORE_MATRIX.mdTier-Klassifizierung und letzte Restore-Erfolge stimmen.docs/SECRETS_MAP.mdenthaelt die noetigen Secret-Pfade ohne Werte.- Gitea-Bundles sind frisch und klonbar.
- GitHub-Mirror ist erreichbar und aktuell.
- ntfy-Testnachricht an
homelab-infokommt an. - Offline-Kopie der Borg-Passphrase ist auffindbar.
- Capacity-Stand passt zu
docs/CAPACITY_AND_LIFECYCLE.md.
Erfolgsregel
Ein Test gilt erst dann als erfolgreich, wenn:
- Restore abgeschlossen ist
- Testcontainer startet
- definierter Smoke-Test erfolgreich ist
- Report geschrieben wurde
Nur "Container laeuft" reicht nicht.