Files
AI-Profile-Router/docs/BARE_METAL_RECOVERY.md
T

187 lines
8.6 KiB
Markdown

# Vollständige Bare-Metal-Wiederherstellung
Dieses Dokument ist die verbindliche Anleitung für den Verlust der Athena-
System-SSD. Wissen aus früheren Chats ist weder Voraussetzung noch gültige
Dokumentation.
## Was woher wiederkommt
| Bestandteil | Quelle beim Recovery |
|---|---|
| Plattform, Router, Profile, MCP-Builds und Patches | dieses Git-Repository, exakter Commit |
| Qwen-, Projektor- und Bildmodelle | dokumentierte URLs und SHA256 in `config/install.env.example` beziehungsweise der gesicherten Installationskonfiguration |
| Navidrome-MCP 2.2.0 samt llama.cpp-Schemafix | `platform/mcp/Dockerfile.navidrome` |
| OpenWebUI-Benutzer, Chats, Arbeitsbereichsmodelle, Filter und Verbindungen | verschlüsseltes Recovery-Bundle |
| Hermes-Sitzungen, Skills, Konfiguration und Arbeitsfläche | `/data/hermes` im verschlüsselten Recovery-Bundle |
| Router-, WireGuard-, HA-, ARR-, Unraid- und Navidrome-Zugangsdaten | verschlüsseltes Recovery-Bundle |
| Last.fm API-Key | `/etc/mike-ai/navidrome-mcp.env` im verschlüsselten Bundle |
| Navidrome-Bibliothek und Benutzer | bleiben auf dem separaten Unraid-Server |
Das Last.fm Shared Secret wird nicht verwendet und daher nicht gesichert.
Modelldateien müssen nicht im Bundle liegen: Der Installer lädt sie erneut und
verifiziert jede Datei kryptografisch. Ein vorhandenes intaktes `/data` kann
den Download lediglich beschleunigen.
## Einmalige Vorbereitung
Die geheime age-Identität muss **außerhalb Athenas** liegen, beispielsweise
auf dem Mac und zusätzlich in einem Passwortmanager oder Offline-Datenträger:
```bash
age-keygen -o athena-recovery.agekey
age-keygen -y athena-recovery.agekey > athena-recovery.recipient
```
Nur die öffentliche Zeile aus `athena-recovery.recipient` wird auf Athena als
`/etc/mike-ai/recovery.age-recipient` mit Modus `0600` abgelegt. Die Datei
`athena-recovery.agekey` darf niemals auf Athena oder im Git liegen.
## Sicherung erzeugen
Das Ziel muss nach einem SSD-Verlust noch existieren. Bevorzugt wird ein
gemountetes, ausschließlich für Backups beschreibbares Verzeichnis auf Unraid;
`/data` allein schützt nur vor dem Verlust der System-SSD, nicht vor Verlust
des gesamten Rechners.
```bash
sudo /opt/mike-ai/stack/platform/recovery/create-recovery-bundle.sh \
/PFAD/AUF/UNRAID/athena-recovery-$(date +%F).tar.age
```
Das Skript nimmt ausschließlich auf:
- `/etc/mike-ai` einschließlich aller Fach-MCP-Secrets,
- `/root/mike-ai-install.env`,
- das produktive Dokumentations-Overlay unter `/opt/mike-ai/stack/docs`,
- Vorschläge, Sicherungen und Auditstatus des Platform Context MCP unter
`/data/mike-ai-platform-context`,
- Hermes-Sitzungen, Skills, Konfiguration und Arbeitsfläche unter
`/data/hermes`,
- den kleinen eigenen Zustand der optionalen Hermes Community-WebUI unter
`/data/hermes-webui/state` (Agent-Code und Image werden reproduzierbar neu
erzeugt),
- das vollständige OpenWebUI-Datenvolume,
- Prüfsummen und den eingesetzten Git-Commit.
Der Klartext liegt nur in einem kurzlebigen root-only Verzeichnis unter
`/tmp` und wird beim Ende entfernt. Das Ergebnis ist vollständig mit age
verschlüsselt. Ohne erfolgreiche Ausgabe `RECOVERY_BUNDLE_OK` gilt die
Sicherung als fehlgeschlagen. Für ein konsistentes SQLite-Abbild verwendet das
Skript die Online-Backup-Schnittstelle der Datenbank. OpenWebUI, laufende
LLM-Profile und MCP-Dienste bleiben während der Sicherung verfügbar.
## Wiederherstellung nach SSD-Verlust
1. Debian 12 oder 13 installieren, Netzwerk herstellen und den administrativen
Benutzer aus der Installationskonfiguration anlegen.
2. Root-SSH-Zugriff mit dem vorhandenen Schlüssel herstellen.
3. Dieses Repository klonen und exakt den in `METADATA` des Bundles genannten
Commit auschecken. Normalerweise ist das der Commit, mit dem die Sicherung
erzeugt wurde.
4. Recovery-Bundle und `athena-recovery.agekey` temporär auf den Host kopieren.
5. Einen Befehl ausführen:
```bash
sudo ./platform/recovery/restore-recovery-bundle.sh \
/root/athena-recovery-YYYY-MM-DD.tar.age \
/root/athena-recovery.agekey
```
Der Wiederhersteller:
1. installiert nur die zum Entschlüsseln benötigten Basispakete,
2. prüft Verschlüsselung, Archivstruktur, SHA256 und Git-Commit,
3. stellt Installationskonfiguration und Secrets ohne Ausgabe ihrer Werte her,
4. führt den idempotenten Hostinstaller aus,
5. signalisiert einen notwendigen NVIDIA-/Netzwerk-Reboot mit Status 20/21;
danach wird derselbe Befehl erneut ausgeführt,
6. sichert den vorhandenen OpenWebUI-Stand als Rückfallarchiv und stellt dann
das geprüfte OpenWebUI-Datenvolume wieder her,
7. installiert die versionierten Modelleinstellungen, Filter und MCP-
Verbindungen erneut,
8. startet alle durch vorhandene Secret-Dateien freigegebenen Toolprofile,
9. prüft Navidrome, sämtliche Werkzeug-Schemas, Last.fm und den OpenWebUI-
Verbindungseintrag ohne Musik- oder Zugangsdaten auszugeben.
Erst die Ausgabe `BARE_METAL_RECOVERY_OK` bedeutet Erfolg.
## Navidrome-Abnahmekriterium
Bei vorhandenem `LASTFM_API_KEY` müssen 45 Werkzeuge erscheinen, andernfalls
38. Playback-Werkzeuge dürfen auf Athena nicht auftauchen. Sämtliche Regex-
Patterns müssen für llama.cpp vollständig mit `^…$` verankert sein. Eine
öffentliche Last.fm-Trendabfrage muss funktionieren; Bibliothek, Playlists und
Hörverlauf werden während der Abnahme nicht gelesen.
Die Prüfung kann jederzeit wiederholt werden:
```bash
sudo /opt/mike-ai/stack/platform/mcp/verify-navidrome.sh
```
## Regelmäßige Kontrolle
Mindestens nach jeder Änderung an OpenWebUI, WireGuard oder einem MCP-Secret
wird ein neues Bundle erzeugt und **außerhalb Athenas** aufbewahrt. Quartalsweise
wird ein Restore in einer isolierten Testinstallation durchgeführt. Eine
Sicherung ohne getestete Entschlüsselung und Abnahmemarker ist nur eine
Hoffnung, kein Backup.
## Maßgeblicher Recovery-Punkt
Der aktuell verwendete Commit steht im verschlüsselten `METADATA` des Bundles,
in `/opt/mike-ai/stack/.mike-ai-source-commit` und im begrenzten
Platform-Context-Snapshot. Eine hier hart eingetragene Commit-ID würde nach der
nächsten Plattformänderung sofort veralten und ist daher kein
Abnahmekriterium.
- Athena: neuestes geprüftes Bundle unter `/data/recovery/`
- zweite verschlüsselte Kopie auf dem Mac unter
`~/.config/mike-ai-recovery/bundles/`
- private age-Identität ausschließlich auf dem Mac:
`~/.config/mike-ai-recovery/athena-recovery.agekey`
- öffentliche Empfängerdatei auf Athena:
`/etc/mike-ai/recovery.age-recipient`
Für jeden neuen Recovery-Punkt muss die Mac-Kopie erfolgreich entschlüsselt
werden. Sämtliche inneren SHA256-Prüfsummen, der aufgezeichnete Git-Commit und
der konsistente `openwebui-data.tar.gz`-Datenbankeintrag müssen geprüft sein.
Der produktive OpenWebUI-Datenträger wird dabei nicht verändert. Dateien mit
dem Namensbestandteil `pre-online-backup` sind keine freigegebenen
Recovery-Punkte.
Noch organisatorisch zwingend: Die private age-Identität muss eine zweite,
vom Mac unabhängige Kopie in einem Passwortmanager oder auf einem Offline-
Datenträger erhalten. Ohne diese Identität ist das verschlüsselte Bundle nicht
wiederherstellbar.
## Selbsttragender Recovery-Koffer auf der Data-SSD
Für den speziellen Ausfall **nur der System-SSD** kann zusätzlich ein
vollständiger Recovery-Koffer unter `/data/mike-ai-recovery-kit` liegen. Er
enthält das verschlüsselte Bundle, den dafür benötigten Schlüssel, die gesamte
Git-Historie und ein eigenständiges Startskript. Auf einem frischen Debian:
```bash
mount <DATA-PARTITION> /data
sudo /data/mike-ai-recovery-kit/reinstall-athena.sh
```
Nach dem einmaligen Start läuft der Wiederaufbau selbständig. Falls NVIDIA-
Treiber oder der stabile Interface-Name einen Neustart erfordern, hinterlegt
das Skript einen systemd-Fortsetzer, bindet `/data` über die vorhandene UUID
dauerhaft ein und setzt den Ablauf nach dem Reboot fort. Nach drei erfolglosen
Versuchen bricht es gegen eine Bootschleife ab.
Diese Bequemlichkeit besitzt bewusst eine andere Sicherheitsgrenze: Weil der
Entschlüsselungsschlüssel auf derselben Data-SSD liegt, kann eine Person mit
Lesezugriff auf diese SSD auch die enthaltenen Secrets entschlüsseln. Das
separate Off-Host-Bundle mit getrennt verwahrtem Schlüssel bleibt daher die
maßgebliche Sicherung gegen Diebstahl oder Verlust des gesamten Hosts.
Der stabile Einstieg `/data/mike-ai-recovery-kit` zeigt immer auf das neueste
geprüfte, unveränderlich benannte Release. Sämtliche Kit-Dateien müssen per
SHA256 geprüft sein, das Git-Bundle muss den in `kit.env` geforderten Commit
enthalten und das Reinstall-Skript muss die Syntaxprüfung bestehen. Der
Abnahmemarker lautet `DATA_KIT_ACCEPTANCE_OK`.