67ec40b762
Six files had outdated status notes that the F-09 first run on 2026-05-30 made wrong: - ops/restore-tests/komodo-bootstrap-runbook.md: "Erster echter Lauf steht noch aus" -> first run confirmed - ops/restore-tests/komodo-bootstrap-plan.md: "Noch offen vor dem ersten echten Lauf" section -> "Bestaetigte Laeufe" table with the --what-if and --keep-data runs - ops/restore-tests/immich-runbook.md: status note still said "Erster echter Lauf steht noch aus" although the Immich first run was 2026-05-27; correcting in the same sweep - docs/AUDIT_2026-05-25_TODO.md: Sprint 2 entry on Komodo bootstrap path no longer carries the "Trockenlauf-Skript bleibt als offene Folgeaufgabe" tail - docs/SERVICES_RECOVERY.md: replaced the "Trockenlauf-Idee (Doku-only, nicht ausgefuehrt)" section with the confirmed repo-script flow and marked the two "Naechste Aufgaben" rows about the dry-run as done - docs/RESTORE_DRILL_ROUTINE.md: Q2 2026 DR-Sanity-Check entry now splits Komodo-Bootstrap-Pfad (done) from the two still-open items (Gitea bundles, secrets inventory) No behavior change, only documentation consistency. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
89 lines
4.4 KiB
Markdown
89 lines
4.4 KiB
Markdown
# Komodo Bootstrap Trockenlauf - Plan
|
|
|
|
## Ziel
|
|
|
|
Nachweisen, dass `ops/komodo/docker-compose.yml` als Recovery-Anker fuer einen Komodo-Kaltstart tauglich ist, ohne den produktiven Komodo-Stack anzufassen.
|
|
|
|
Bewusst **nicht** Teil dieses Tests:
|
|
|
|
- Restore aus dem produktiven `komodo-mongo.archive.gz`-Dump (eigene Folgeaufgabe; dieser Test prueft nur das Compose-Bootstrap, nicht den Daten-Restore).
|
|
- docker.sock-Mount fuer die Test-Periphery (die Test-Periphery darf nie produktive Container managen).
|
|
- Traefik-Route oder Authelia-Anbindung (Test laeuft ausschliesslich auf `127.0.0.1:19120`).
|
|
|
|
## Quelle
|
|
|
|
- Bootstrap-Anker: `ops/komodo/docker-compose.yml` (Soll-Stand laut `docs/SERVICES_RECOVERY.md` Stufe A-F).
|
|
- Image-Digests: identisch zur Produktion fuer komodo-core und komodo-periphery; Mongo-Image identisch.
|
|
|
|
## Test-Ziel
|
|
|
|
- Restore-Lab: `/mnt/user/backups/restore-lab/komodo`
|
|
- Wegwerf-Pfade:
|
|
- `/mnt/user/backups/restore-lab/komodo/mongo` (Test-Mongo-Datadir)
|
|
- `/mnt/user/backups/restore-lab/komodo/core` (Repo-Cache)
|
|
- `/mnt/user/backups/restore-lab/komodo/keys` (gemeinsamer Keys-Pfad fuer Core+Periphery)
|
|
- `/mnt/user/backups/restore-lab/komodo/periphery` (Periphery-Etc)
|
|
- Testcontainer:
|
|
- `restoretest-komodo-mongo`
|
|
- `restoretest-komodo-core` (Test-Port `127.0.0.1:19120`)
|
|
- `restoretest-komodo-periphery` (ohne docker.sock)
|
|
- Compose-Project: `restoretest-komodo` (isoliert von Produktions-Project `komodo`)
|
|
- Report-Ziel: `/mnt/user/backups/restore-reports/komodo-bootstrap-YYYY-MM-DD.md`
|
|
|
|
## Schutzregeln
|
|
|
|
- produktive Datadirs `/mnt/user/appdata/komodo/{mongo,core,periphery}` werden **nicht** gemountet
|
|
- produktive Container `komodo-mongo`, `komodo-core`, `komodo-periphery` werden **nicht** gestoppt
|
|
- produktive `KOMODO_*`-Secrets werden **nicht** verwendet
|
|
- Test-Compose enthaelt nur Wegwerf-Werte fuer `KOMODO_SECRET_KEY`, `KOMODO_WEBHOOK_SECRET`, `KOMODO_JWT_SECRET`, `KOMODO_PASSKEY` und Mongo-Root-Password
|
|
- Test-Periphery laeuft ohne docker.sock-Mount und ohne `/mnt/user/services`-Mount
|
|
- Test-Port nur auf `127.0.0.1:19120`, keine LAN-/Tailscale-Bindung
|
|
|
|
## Geplanter Ablauf
|
|
|
|
1. Restore-Lab-Pfade leer anlegen
|
|
2. `docker compose config` auf dem Test-Compose validieren
|
|
3. Mongo und Core hochfahren, auf Mongo-`healthy` warten
|
|
4. HTTP-Smoke gegen `http://127.0.0.1:19120` (Login-Seite oder Auth-Redirect erwartet)
|
|
5. Periphery dazustarten, kurz beobachten
|
|
6. Mongo-`authenticated ping` mit Test-Credentials
|
|
7. Report schreiben
|
|
8. Cleanup `docker compose down -v` und Restore-Lab loeschen (ausser `--keep-data`)
|
|
|
|
## Smoke-Test
|
|
|
|
Minimal erfolgreich:
|
|
|
|
- `docker compose config` valid
|
|
- Test-Mongo erreicht `healthy`
|
|
- Mongo-Authentifizierung mit Test-Creds funktioniert (`db.adminCommand({ping:1}).ok = 1`)
|
|
- Komodo-Core HTTP `200`, `302`, `303` oder `401` (alles ist ein valider Lebenszeichen)
|
|
- Test-Periphery container state `running`
|
|
|
|
Optional spaeter:
|
|
|
|
- Periphery-Verbindung gegen Test-Core verifizieren (braucht Periphery-Konfig mit `core_url`)
|
|
- Echtes Restore aus `komodo-mongo.archive.gz`-Dump in die Test-Mongo
|
|
- Schreiben einer Wegwerf-Resource (Server/Stack) ueber die API
|
|
|
|
## Bekannte Komplikationen
|
|
|
|
| Risiko | Beschreibung | Mitigation |
|
|
|---|---|---|
|
|
| Image-Drift | Komodo-Images aktualisieren ihre Major-Tag-Digests | Compose pinnt denselben Digest wie Produktion; bei Image-Update auch Test-Compose nachziehen |
|
|
| Port-Konflikt | wenn 19120 anderweitig belegt ist | nur `127.0.0.1`-Bind; bei Konflikt Port im Compose anpassen |
|
|
| Volume-Reste | unterbrochener Lauf laesst Wegwerf-Datadir liegen | Skript loescht Restore-Lab vor jedem Lauf; `--keep-data` ueberschreibt das bewusst |
|
|
| Periphery-Erreichbarkeit | Core sucht Periphery initial nicht aktiv | Test prueft nur Periphery `State.Status=running`; voller Handshake ist optional |
|
|
|
|
## Bestaetigte Laeufe
|
|
|
|
| Datum | Mode | Ergebnis | Report |
|
|
|---|---|---|---|
|
|
| 2026-05-30 | `--what-if` | Plan-Ausgabe wie erwartet | (kein Report, nur stdout) |
|
|
| 2026-05-30 | `--keep-data` | `SUCCESS`, 5/5 Checks gruen, Core HTTP `200`, Mongo healthy in ~6 s | `/mnt/user/backups/restore-reports/komodo-bootstrap-2026-05-30.md` |
|
|
|
|
## Folgeschritte
|
|
|
|
- Quartals-Belegung: Komodo-Bootstrap passt zum DR-Sanity-Check (`docs/RESTORE_DRILL_ROUTINE.md` Q2/Q4) und kann ohne Borg-Archiv jederzeit wiederholt werden.
|
|
- Optional fuer kuenftige Laeufe: echtes Restore aus `komodo-mongo.archive.gz` in die Test-Mongo, danach Schreiben einer Wegwerf-Resource ueber die API.
|