- BACKUP_ARCHITECTURE, STORAGE_MAP, RECOVERY_RUNBOOK - TRANSFORMATION_BASELINE, DUPLICATE_RESOLUTION_PLAN - CANONICAL_KNOWLEDGE_PRINCIPLE, SEARCH_ARCHITECTURE_PROPOSAL - KNOWLEDGE_GRAPH_PRINCIPLE, FORGEJO_TOLARIA_SYNC_PRINCIPLE - HOST_CONTAINER_DISCOVERY Fresh Checker PASS (deleg_a19028bc). No productive vault mutation.
85 lines
3.4 KiB
Markdown
85 lines
3.4 KiB
Markdown
# DISASTER RECOVERY RUNBOOK — Tolaria (Mission 002)
|
|
|
|
Datum: 2026-08-25 · Red Queen · Status: **GETESTET (isolierter Restore PASS)**
|
|
|
|
> **Frage:** "Wenn Tolaria morgen kaputt ist, wie bekommen wir den letzten
|
|
> sicheren Zustand zurück?"
|
|
> **Antwort:** Dieses Runbook beschreibt den kontrollierten, getesteten Weg.
|
|
|
|
> ⚠️ **WICHTIG:** Dieser Runbook ist **manuell**. Es wird **kein** automatischer,
|
|
> gefährlicher Restore aktiviert. Jeder Restore erfordert ausdrückliche Freigabe.
|
|
|
|
---
|
|
|
|
## PRECONDITIONS
|
|
- Backup-Verzeichnis vorhanden: `/opt/data/tolaria_backups/TOLARIA-BACKUP-YYYYMMDD-HHMMSS/`
|
|
- Manifest `manifest.json` vorhanden und `RESULT=SUCCESS`
|
|
- `BACKUP_SHA256` im Manifest entspricht dem Neu-Berechnen (Integrity)
|
|
- Backup-Zielpfad (isolierter Restore) existiert bzw. ist erzeugbar
|
|
|
|
## STEPS
|
|
|
|
### 1. STOP SERVICES
|
|
- Tolaria-Dienst stoppen, **falls** er aktiv schreibt (während Restore auf prod)
|
|
- Hinweis: Restore-Test läuft **immer isoliert** — produktive Services werden für Tests **nie** gestoppt
|
|
|
|
### 2. SELECT BACKUP
|
|
- Neuestes verifiziertes Backup wählen: `TOLARIA-BACKUP-YYYYMMDD-HHMMSS`
|
|
- Referenz-Baseline: `TOLARIA-BACKUP-20260825-051420` (Pre-Transformation-Anker)
|
|
|
|
### 3. VERIFY BACKUP
|
|
- `manifest.json` prüfen: `RESULT=SUCCESS`, `FILE_COUNT`, `SIZE`
|
|
- **Unabhängig** verifizieren (nicht nur "exit 0"):
|
|
- jede Datei existiert + SHA-256 stimmt mit Manifest überein
|
|
- Manifest-`BACKUP_SHA256` neu berechnen und vergleichen
|
|
- Befehl: `python3 bin/tolaria_backup.py verify TOLARIA-BACKUP-<ID>`
|
|
|
|
### 4. PRESERVE BROKEN STATE (wichtig)
|
|
- **Vor** dem Überschreiben des produktiven Vaults: den defekten Zustand
|
|
sichern/kopieren (z.B. `/app/vault` → `/app/vault.broken`) — **nur wenn prod
|
|
angefasst wird**. Für den normalen Restore-Test ist dies nicht nötig.
|
|
|
|
### 5. RESTORE DATA
|
|
- Isolierte Zielumgebung für Tests: `/opt/data/tolaria_restore_test/<BACKUP_ID>/`
|
|
- Produktiven Vault **niemals** für Tests überschreiben.
|
|
- Restore: alle `manifest["FILES"]`-Dateien aus Backup in Zielverzeichnis kopieren.
|
|
|
|
### 6. RESTORE CONFIG
|
|
- Falls App-Config (`~/.config/com.laputa.app/`, `~/.laputa/`) gesichert wurde:
|
|
wiederherstellen. **Aktuell UNKNOWN** (kein Host-Zugang) → als Annahme behandeln.
|
|
|
|
### 7. PERMISSIONS
|
|
- Sicherstellen, dass wiederhergestellte Dateien lesbar/schreibbar sind
|
|
(Owner/Berechtigungen des Tolaria-Benutzers).
|
|
|
|
### 8. START
|
|
- Tolaria-Dienst starten (falls gestoppt).
|
|
|
|
### 9. HEALTH CHECK
|
|
- Port 5173 erreichbar.
|
|
- Vault-API `POST /api/vault/list {"path":"/app/vault"}` liefert 84 `.md`.
|
|
|
|
### 10. DATA CHECK
|
|
- Anzahl Dateien == Manifest `FILE_COUNT`.
|
|
- Stichproben-Hashes stimmen.
|
|
|
|
### 11. SEARCH CHECK
|
|
- Suche funktioniert (keyword-Substring; semantic identisch — kein Vector-Store).
|
|
|
|
### 12. GRAPH CHECK
|
|
- Kein implementierter Graph vorhanden (nur ADR-Doku). Kein Check nötig.
|
|
|
|
### 13. ROLLBACK OF RESTORE
|
|
- Falls Restore fehlschlägt: Zielverzeichnis verwerfen (isoliert),
|
|
produktiven Vault NICHT anfassen, Runbook-Status an Christian melden.
|
|
|
|
---
|
|
|
|
## Annahmen & UNKNOWN
|
|
- **Host-Restore-Prozedur** (Container-Neubau): UNKNOWN ohne Docker/Host-Zugang.
|
|
Ports 5173 (Tolaria) / 3000 (Forgejo) sind erreichbar; Container-Provisionsmethode
|
|
ist nicht verifiziert.
|
|
- App-Config-Lage: UNKNOWN (nur mit Container-Shell verifizierbar).
|
|
|
|
## Verifikation (Test am 2026-08-25)
|
|
- **Restore-Test: PASS** — 454/454 Dateien, Hash-Match, isoliert, produktiver Vault unangetastet (HEAD 69aecf2 unverändert).
|