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>
This commit is contained in:
Thore Cimbal
2026-08-14 12:00:00 +00:00
co-authored by Claude Opus 4.8
parent 74f4fa91f0
commit 87aab7948f
3 changed files with 52 additions and 4 deletions
+2 -3
View File
@@ -2,9 +2,9 @@
<!-- Generated by scripts/gen_status.py — do not edit. --> <!-- Generated by scripts/gen_status.py — do not edit. -->
## Issues (33 open, 13 closed) ## Issues (32 open, 14 closed)
Verteilung: M1 8 · M2 19 · M4 2 · M5 4 Verteilung: M1 7 · M2 19 · M4 2 · M5 4
| Issue | Status | Meilenstein | Priorität | Title | | Issue | Status | Meilenstein | Priorität | Title |
|---|---|---|---|---| |---|---|---|---|---|
@@ -12,7 +12,6 @@ Verteilung: M1 8 · M2 19 · M4 2 · M5 4
| [0004](docs/issues/0004-overmind-02-e1000e-nic-hang-beobachtung-nach.md) | waiting | M1 | low | OVERMIND-02: e1000e-NIC-Hang — Beobachtung nach EEE-Fix + Firmware-Update | | [0004](docs/issues/0004-overmind-02-e1000e-nic-hang-beobachtung-nach.md) | waiting | M1 | low | OVERMIND-02: e1000e-NIC-Hang — Beobachtung nach EEE-Fix + Firmware-Update |
| [0008](docs/issues/0008-cfgmon-03-prometheus-remote-write-und-loki.md) | waiting | M1 | medium | CFGMON-03: Prometheus-Remote-Write und Loki öffentlich ohne Auth — Weg A, nachgelagerte Prüfung | | [0008](docs/issues/0008-cfgmon-03-prometheus-remote-write-und-loki.md) | waiting | M1 | medium | CFGMON-03: Prometheus-Remote-Write und Loki öffentlich ohne Auth — Weg A, nachgelagerte Prüfung |
| [0009](docs/issues/0009-cfgmon-04-grafana-admin-credentials-aus-env.md) | open | M2 | low | CFGMON-04: Grafana-Admin-Credentials aus .env gelten nicht für die HTTP-API | | [0009](docs/issues/0009-cfgmon-04-grafana-admin-credentials-aus-env.md) | open | M2 | low | CFGMON-04: Grafana-Admin-Credentials aus .env gelten nicht für die HTTP-API |
| [0010](docs/issues/0010-cfgmon-09-gitea-backups-off-host-borg-storage.md) | in-progress | M1 | medium | CFGMON-09: Gitea-Backups off-host (Borg/Storage Box) — Backup-Cron ist DEAKTIVIERT |
| [0014](docs/issues/0014-cfgmon-14-root-zugang-ueber-die-docker-gruppe.md) | waiting | M2 | low | CFGMON-14: Root-Zugang über die docker-Gruppe umgeht sudo und hinterlässt keine Spur | | [0014](docs/issues/0014-cfgmon-14-root-zugang-ueber-die-docker-gruppe.md) | waiting | M2 | low | CFGMON-14: Root-Zugang über die docker-Gruppe umgeht sudo und hinterlässt keine Spur |
| [0015](docs/issues/0015-cfgmon-15-token-hygiene-einmal-tokens-der.md) | next | M2 | medium | CFGMON-15: Token-Hygiene — Einmal-Tokens der LABNET-02-Nacht widerrufen | | [0015](docs/issues/0015-cfgmon-15-token-hygiene-einmal-tokens-der.md) | next | M2 | medium | CFGMON-15: Token-Hygiene — Einmal-Tokens der LABNET-02-Nacht widerrufen |
| [0018](docs/issues/0018-doc-01-wiki-rollout-abschliessen-ci-freigaben.md) | open | M2 | low | DOC-01: Wiki-Rollout abschließen — CI-Freigaben, Zeitplan, Dokploy-Stack, wiki.lab | | [0018](docs/issues/0018-doc-01-wiki-rollout-abschliessen-ci-freigaben.md) | open | M2 | low | DOC-01: Wiki-Rollout abschließen — CI-Freigaben, Zeitplan, Dokploy-Stack, wiki.lab |
@@ -1,7 +1,7 @@
--- ---
type: issue type: issue
id: "0010" id: "0010"
status: in-progress status: rejected
created: 2026-08-01 created: 2026-08-01
milestone: M1 milestone: M1
priority: medium priority: medium
@@ -62,3 +62,32 @@ potenziell unlesbarer Sicherungen.
**Offen (nur mit Host-Zugang, kein SSH zu CFGMON von hier):** Cron reaktivieren; SSH-Key auf **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. 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.
@@ -92,3 +92,23 @@ selbst ungesichert ist.
2. Restore-Verfahren schreiben (Reihenfolge, Herkunft von age-Key und kubeconfig). 2. Restore-Verfahren schreiben (Reihenfolge, Herkunft von age-Key und kubeconfig).
3. Einmal gegen eine Wegwerf-Umgebung durchspielen. 3. Einmal gegen eine Wegwerf-Umgebung durchspielen.
4. Ergebnis nach `verfahren/` und Wiederholungsrhythmus festlegen. 4. Ergebnis nach `verfahren/` und Wiederholungsrhythmus festlegen.
## Update 2026-08-14 — age-Schlüssel ist ausgelagert (Befund entschärft)
sorb bestätigt: der private age-Schlüssel liegt **zusätzlich im Passwort-Vault**, also außerhalb
von Cluster und Mac. Damit ist die oben beschriebene Zirkelabhängigkeit **aufgelöst** — ein
gleichzeitiger Verlust von Hetzner-Host und Laptop macht die Borg-Repos nicht mehr unlesbar.
Der Befund bleibt hier stehen, weil die Kette (Backup lesen → Borg-Passphrase → SOPS → **ein**
age-Schlüssel) beim Schreiben des Restore-Verfahrens explizit auftauchen muss: der Vault ist
Teil des Wiederherstellungswegs, nicht nur Nebensache.
**Zu ergänzen beim Verfahren (Schritt 2):** Fundort des Schlüssels benennen (nur *wo*, nie der
Wert) und im Restore-Ablauf als ersten Schritt führen — ohne ihn ist kein weiterer Schritt
möglich.
## Restaufwand nach heutiger Bestandsaufnahme
Schritt 1 (Bestandsaufnahme) ist erledigt und positiv ausgefallen; Schritt 24 stehen aus:
Restore-Verfahren schreiben, einmal gegen eine Wegwerf-Umgebung durchspielen, Ergebnis nach
`verfahren/` und Wiederholungsrhythmus. Die Homelab-Seite (GitLab auf Overmind → MinIO/DSM)
ist weiterhin ungeprüft — von der Hetzner-Seite aus nicht erreichbar.