144 lines
5.0 KiB
Markdown
144 lines
5.0 KiB
Markdown
# 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)
|
|
- 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).
|
|
|
|
## 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.
|