Files
management/docs/issues/0010-cfgmon-09-gitea-backups-off-host-borg-storage.md
Thore CimbalandClaude Opus 4.8 87aab7948f docs(issues): reject #0010 (Gitea is a mirror), age key escrow resolves #0030 risk
sorb's call: Gitea on rohana is a push mirror of the canonical git.lab, so a
nightly gitea dump would back up a copy — effort not justified, cron stays off.
Documented the one non-mirror asset for the record: the container registry holds
four images the cluster pulls (incl. threadnet-web and the backup image itself),
which is rebuild time rather than data loss and is covered by #0022/#0033.

For #0030, sorb confirms the age key is also in the password vault, dissolving
the circular dependency found earlier. Noted that the vault is now part of the
restore path and must lead the procedure.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-14 12:00:00 +00:00

4.9 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 rejected 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; Retention borg prune 7d/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.

Verworfen 2026-08-14 — Gitea braucht kein eigenes Backup (Entscheidung sorb)

Begründung: Gitea auf rohana ist Push-Mirror, nicht Quelle. Kanonisch ist git.lab (ADR-0001); alle gespiegelten Repos lassen sich nach einem Totalverlust schlicht neu befüllen. Die Issues liegen seit der Migration ohnehin auf git.lab, der Gitea-Tracker ist leer. Ein nächtlicher gitea dump sichert damit im Wesentlichen eine Kopie — der Aufwand (Borg-Repo, Host-SSH-Key, Script-Umbau) steht in keinem Verhältnis.

Der auskommentierte Cron bleibt entsprechend aus; die Platte (73 % voll) wird nicht weiter belastet, der Altstand /opt/backup/gitea-dump-2026-07-30.tar.gz kann weg.

Dokumentierte Nuance: was auf rohana kein Spiegel ist

Nicht aus git.lab wiederherstellbar sind die Gitea-Packages (Container-Registry) — der Cluster zieht vier Images ausschließlich von dort:

Image Rolle
threadnet-web:v0.4.3 Element-Web-Fork, den die Nutzer im Browser laden
axion-backup:v2 führt die drei nächtlichen Borg-Backups aus (7 Pods)
axion-secret-rotation:v1 TURN-Secret-Rotation
clamav-http-scanner:v1.0.0 client-seitiges Scannen

Bei Verlust von rohana laufende Pods weiter, aber neue Pods können nicht mehr pullen, bis die Images neu gebaut sind — und Flux verliert zugleich seine Source. Das ist kein Datenverlust (alle vier sind aus dem Quellcode reproduzierbar: Dockerfiles in gitops bzw. den Fork-Repos), sondern Wiederherstellungszeit. Bewusst akzeptiert; die Reproduzierbarkeit des Build-Wegs ist ohnehin über #0022/#0033 adressiert.