Files
homelab-infra/ops/restore-tests/schedule.md
T
2026-06-06 08:11:03 +02:00

5.4 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:

  • vaultwarden Mini-Restore
  • gitea Mini-Restore, versetzt zum Vaultwarden-Lauf

Alle 2 Monate:

  • paperless Mini-Restore

Quartalsweise:

  • Restore-/DR-Sanity-Check
  • immich Restore-Smoke-Test (DB + UI, ohne produktive Foto-Mounts; Erstlauf 2026-05-27 erfolgreich)
  • adguard Restore-Smoke-Test (Config + HTTP/DNS, nach DNS-Aenderungen auch ausserhalb des Quartals)
  • redis Restore-Smoke-Test (Pre-Cutover-Artefakt + Redis 8, vor/nach Major-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); Redis 8 am 2026-06-06 (Pre-Cutover-Artefakt + PING/INFO/DBSIZE-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 nach homelab-info, Fehler nach homelab-alerts
    • Hermes wertet spaeter optional Reports aus
  • V2:
    • fester Host-Schedule
    • ntfy bei Erfolg/Fehler ueber run-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
  • ntfy Erfolg/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.md Phase 1-5 passt noch zum Repo.
  • docs/RESTORE_MATRIX.md Tier-Klassifizierung und letzte Restore-Erfolge stimmen.
  • docs/SECRETS_MAP.md enthaelt die noetigen Secret-Pfade ohne Werte.
  • Gitea-Bundles sind frisch und klonbar.
  • GitHub-Mirror ist erreichbar und aktuell.
  • ntfy-Testnachricht an homelab-info kommt 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.