Cluster-side backups are healthier than assumed: three nightly Borg jobs to a Hetzner Storage Box, all completing with plausible volumes and working prune (synapse 199MB/247 files, authentik ~150MB, wikijs 223kB DB-only). No silent failures. Critical finding for #0030: the Borg passphrase and SSH key needed to READ those backups are SOPS-encrypted under a single age key that exists only in the cluster being backed up and on one laptop — no documented cold copy. Losing both makes all three repos permanently unreadable. Cold escrow must precede any restore drill. For #0010 this shrinks the work: the Storage Box + Borg pattern already exists and is proven, so Gitea needs only its own repo there. The disabled cron (no backups since 2026-07-30) remains separately urgent. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.3 KiB
type, id, status, created, milestone, priority, host, area, gitlab_iid, related
| type | id | status | created | milestone | priority | host | area | gitlab_iid | related |
|---|---|---|---|---|---|---|---|---|---|
| issue | 0010 | in-progress | 2026-08-01 | M1 | medium | cfgmon | security | 10 |
CFGMON-09: Gitea-Backups off-host (Borg/Storage Box) — Backup-Cron ist DEAKTIVIERT
Import aus management#10 (2026-08-11). Kommentare und Verlauf bleiben dort; kanonisch ist ab jetzt diese Datei (ADR-0012).
⚠️ Seit 2026-07-30 laufen KEINE Gitea-Backups — der nächtliche Cron ist
auskommentiert (Crontab rantanplan), letzter Stand
/opt/backup/gitea-dump-2026-07-30.tar.gz. Beim Erledigen/Verwerfen dieses Punkts
den Cron wieder aktivieren.
Plan: eigenes Borg-Repo auf einer Hetzner Storage Box (spricht Borg nativ über
SSH Port 23). Dump unkomprimiert an Borg geben (gzip im Script entfällt, sonst
greift Dedup nicht); Retention via borg prune (7d/4w/6m); optional Sub-Account.
Kontext: Platte 73 % voll, Script rotiert auf genau einen Stand, Off-host-Kopie
fehlt komplett — bei Verlust des Hosts wäre Gitea (inkl. Mirror-Kopien) weg.
Voraussetzungen (User): Storage-Box/Sub-Account im Robot anlegen; Host hat keinen SSH-Key → generieren und Public Key in der Storage Box hinterlegen.
Quelle: hosts/cfgmon.md
Übernommen aus dem Backlogs-Markdown beim Framework-Umbau 2026-08-01 (voller Wortlaut: Git-Historie der Datei).
In Arbeit 2026-08-14 — Muster existiert bereits (Aufwand deutlich kleiner als geplant)
Bei der Bestandsaufnahme für #0030 zeigte sich: Borg auf Hetzner Storage Box läuft im Matrix-Cluster bereits produktiv — der für dieses Issue geplante Aufbau muss also nicht erfunden, sondern nur auf Gitea übertragen werden.
Vorhandenes Muster (erprobt, nächtlich, verifiziert):
- Storage Box
u641795@u641795.your-storagebox.de:23, drei getrennte Repos (/./synapse-backup,/./authentik-backup,/./wikijs-backup). - Image
rohana.axion1337.de/sorb/axion-backup:v2; Retentionborg prune7d/4w/6m. - Credentials (Borg-Passphrase + SSH-Key) als SOPS-Secret, per Env in den Job.
Konsequenz für Gitea: kein neuer Storage-Box-Vertrag nötig — ein zusätzliches Repo
/./gitea-backup auf derselben Box (oder ein Sub-Account) genügt. Der Host braucht weiterhin
einen eigenen SSH-Key (CFGMON ist nicht der Cluster), dessen Public Key in der Storage Box
hinterlegt wird. Wie im Issue vorgesehen: Dump unkomprimiert an Borg geben (gzip aus
backup/gitea-backup.sh entfernen), sonst greift die Deduplizierung nicht.
⚠️ Unverändert akut: Der nächtliche Cron auf CFGMON ist seit 2026-07-30 auskommentiert —
seit über zwei Wochen läuft kein Gitea-Backup, der letzte Stand ist
/opt/backup/gitea-dump-2026-07-30.tar.gz. Das ist unabhängig von der Borg-Umstellung sofort
behebbar (Cron wieder einkommentieren) und sollte nicht auf das Off-host-Projekt warten.
⚠️ Vorrang laut #0030: Bevor Backups erweitert werden, muss die kalte Kopie des age-Schlüssels stehen (dort dokumentierte Zirkelabhängigkeit) — sonst wächst nur die Menge potenziell unlesbarer Sicherungen.
Offen (nur mit Host-Zugang, kein SSH zu CFGMON von hier): Cron reaktivieren; SSH-Key auf
CFGMON erzeugen + in der Storage Box hinterlegen; gitea-backup.sh auf Borg umstellen.