docs(issues): #0030 cadence set — monthly drill, and backups now alert

Monthly restore-drill CronJob (verified before commit) plus the finding that
mattered more: there was no backup alerting at all, so a failed nightly job
would have gone unnoticed. Added BackupJobFailed/BackupNotRunning/
RestoreDrillStale; the last one alerts on the absence of the check itself.
Alert rules still need deploying on CFGMON.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-14 12:00:00 +00:00
co-authored by Claude Opus 4.8
parent 6f74642659
commit d73a3b7658
@@ -189,3 +189,48 @@ einen Mirror. Begründung steht im README des Notfallhandbuchs, damit sie nicht
Das ist eine **dauerhafte Ausnahme von der Spiegel-Topologie** (ADR-0001) und daher als
**ADR-0016** festgehalten.
## Schritt 4 erledigt 2026-08-14 — Rhythmus festgelegt (automatisiert + überwacht)
**Monatlich, 4. um 04:20**, als CronJob `restore-drill`
(`gitops:apps/production/restore-drill.yaml`, Commit `b61dfd9`) — nach den nächtlichen
Backups, damit er den frischen Stand zieht. Er spielt die Sicherungen in eine
Wegwerf-Postgres **im Pod** zurück und besteht nur, wenn Zeilen ankommen. Vor dem Commit
manuell ausgelöst und bestanden (synapse 31.908, MAS 16.085, wiki 251).
**Automatisiert statt dokumentiert:** ein Prüfrhythmus, den niemand ausführt, ist derselbe
Fehler wie ein ungetestetes Backup — nur eine Ebene höher.
**Abdeckung:** synapse + matrixauthenticationservice + wiki (die unersetzlichen Daten).
Authentik ist bewusst **nicht** im automatischen Lauf: Flows/Provider liegen als Blueprints
deklarativ im Repo, die DB ist also weitgehend reproduzierbar — und der Job müsste sonst
wegen der namespace-gebundenen Credentials dupliziert werden. Auf Zuruf über
`notfall.sh` Stufe 3 (deckt alle drei Repos ab) jederzeit prüfbar.
### Nebenbefund, der wichtiger war als der Rhythmus selbst
**Es gab überhaupt keine Alarmregel zu Backups.** Ein fehlgeschlagenes nächtliches Backup
wäre unbemerkt geblieben — exakt der stille Ausfall, den dieses Issue beschreibt, nur an
der Stelle, die ihn hätte melden sollen. Behoben in
`threadnet-operating:monitoring/prometheus/alerts.yml` (Commit `1bbff5e`), neue Gruppe
`axion-backup`:
| Alarm | feuert wenn |
|---|---|
| `BackupJobFailed` | ein Backup- oder Probe-Job fehlschlägt |
| `BackupNotRunning` | ein CronJob seit >26h nicht mehr geplant hat |
| `RestoreDrillStale` | die Probe seit >40 Tagen nicht lief |
Der letzte ist Absicht: **auch das Ausbleiben der Prüfung ist ein Alarm.** Metrikweg
verifiziert (kube-state-metrics → Alloy → remote_write; der Filter verwirft nur
`go_.*|process_.*`, `kube_job_*`/`kube_cronjob_*` kommen an).
⚠️ **Deploy offen:** Die Alarmregeln liegen im Repo, sind aber noch **nicht auf CFGMON
ausgerollt** (Prometheus dort, kein Zugang von hier). Bis zum Reload greifen sie nicht.
### Restaufwand
Nur noch **Phase A/B**: Wiederanlauf auf einem leeren Host (K3s, die zwei Bootstrap-Secrets,
Flux) und die Rückspielung der Synapse-**Medien** sind weiterhin abgeleitet, nicht erprobt —
dafür braucht es eine Wegwerf-Umgebung. Ebenso ungeprüft: die Homelab-Seite
(GitLab/Overmind → MinIO/DSM).