diff --git a/docs/DISASTER_RECOVERY.md b/docs/DISASTER_RECOVERY.md index d941377..f731163 100644 --- a/docs/DISASTER_RECOVERY.md +++ b/docs/DISASTER_RECOVERY.md @@ -139,6 +139,7 @@ Erwartete Basis unter `/mnt/user/appdata/secrets/`: - `nextcloud_postgres_password.txt` - `postgres_password.txt` - `redis_password.txt` +- `borg_repo_passphrase.txt` - `vaultwarden_admin_token.txt` - `hermes_runner_id_ed25519` @@ -392,7 +393,7 @@ Wenn weder externer Mirror noch lokaler Clone verfuegbar sind, ist `services/git - Unraid-USB-/Flash-Backup pruefen - Borg-Passphrase extern sicher hinterlegen - Komodo Stack-ENV-Werte zentral ausserhalb von Komodo dokumentieren -- Restore-Smoke-Test fuer mindestens einen weiteren kritischen Dienst dokumentieren +- Restore-Smoke-Test fuer mindestens einen weiteren kritischen Dienst nach Vaultwarden dokumentieren - `komodo-mongo`-Dump nach Major-Upgrades gezielt kontrollieren --- diff --git a/docs/MIGRATION_LOG.md b/docs/MIGRATION_LOG.md index 1194a24..7ad87d1 100644 --- a/docs/MIGRATION_LOG.md +++ b/docs/MIGRATION_LOG.md @@ -16,6 +16,17 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab ## Historische Meilensteine +### 2026-05-07 - Vaultwarden Restore-Test praktisch verifiziert + +- Erster echter Vaultwarden-Mini-Restore gegen das produktive Borg-Repo `hetzner_borg_appdata_critical` erfolgreich durchgefuehrt. +- Restore lief isoliert nach `/mnt/user/backups/restore-lab/vaultwarden`, nicht gegen produktive Pfade. +- Testinstanz `restoretest-vaultwarden` wurde lokal auf `127.0.0.1:18080` gestartet; HTTP 200 und Login-Seite wurden erfolgreich bestaetigt. +- Report wurde unter `/mnt/user/backups/restore-reports/vaultwarden-2026-05-07.md` geschrieben. +- Fuer den praktischen Restore-Pfad wurden zwei hostseitige Voraussetzungen sichtbar und umgesetzt: + - `known_hosts` fuer das Hetzner-Ziel im `borg-ui`-Container + - Host-Secret-Datei `/mnt/user/appdata/secrets/borg_repo_passphrase.txt` fuer kuenftige Restore-Tests +- Testdaten unter `/mnt/user/backups/restore-lab/vaultwarden/data` wurden nach erfolgreichem Lauf wieder bereinigt. + ### 2026-05-06 - Komodo Webhook Secret getrennt - `KOMODO_WEBHOOK_SECRET` von `KOMODO_SECRET_KEY` getrennt und als eigene Stack-ENV-Variable dokumentiert. diff --git a/docs/RESTORE_MATRIX.md b/docs/RESTORE_MATRIX.md index 37bcd5c..3cde72a 100644 --- a/docs/RESTORE_MATRIX.md +++ b/docs/RESTORE_MATRIX.md @@ -34,7 +34,7 @@ Sie ist die fachliche Ergaenzung zu `docs/DISASTER_RECOVERY.md`. | Authelia | Borg | `/mnt/user/appdata/authelia/config`, `/mnt/user/appdata/secrets/*authelia*` | Shared PostgreSQL, optional Dump `postgresql17-authelia.dump` | JWT/Session/Storage/Postgres-/SMTP-Secret-Dateien | PostgreSQL 17, Traefik, GMX SMTP | Login-Seite und ForwardAuth funktionieren; SMTP-Notifier startet; aktive Sessions werden nach Restart neu aufgebaut | | Gitea | Borg / Share | `/mnt/user/services/gitea/data` | SQLite in `/data` | keine separaten Secret-Dateien dokumentiert | Traefik | Web-UI erreichbar, Repo sichtbar, SSH-Port reagiert | | Komodo | Borg / Share | `/mnt/user/appdata/komodo/core`, `/mnt/user/appdata/komodo/periphery` | `komodo-mongo.archive.gz` falls verifiziert | `komodo_mongo_password.txt`, `KOMODO_*` Stack ENV | Traefik, Mongo, Gitea | UI erreichbar, Periphery verbunden | -| Vaultwarden | Borg / Share | `/mnt/user/appdata/vaultwarden` | dateibasiert | `vaultwarden_admin_token.txt` | Traefik | Login-Seite erreichbar, Tresor-Daten sichtbar | +| Vaultwarden | Borg / Share | `/mnt/user/appdata/vaultwarden` | dateibasiert | `vaultwarden_admin_token.txt`, `borg_repo_passphrase.txt` fuer Restore-Tests | Traefik | Login-Seite erreichbar, Tresor-Daten sichtbar; Mini-Restore nach `/mnt/user/backups/restore-lab/vaultwarden` am 2026-05-07 erfolgreich validiert | --- @@ -95,6 +95,15 @@ Die Dump-Erzeugung ist host-seitig ueber `ops/borg-ui/scripts/pre-backup-dumps.s - Bei Unsicherheit zuerst in Testpfade oder Testinstanzen pruefen. - Der minimale Erfolg ist **nicht** "Container startet", sondern "fachlicher Smoke-Test gelingt". +### Validiertes Restore-Lab-Muster + +- Restore-Quelle bleibt das produktive Borg-Repo +- Testziel liegt unter `/mnt/user/backups/restore-lab/` +- Reports liegen unter `/mnt/user/backups/restore-reports` +- Borg-Zugriff kann ueber den vorhandenen `borg-ui`-Container laufen +- Borg-Passphrasen fuer Restore-Tests sollten aus Host-Secret-Dateien kommen, nicht aus UI-Interna +- Testinstanzen bekommen keine produktive Domain und keine Traefik-Route + --- ## Erste sinnvolle Referenz-Restores diff --git a/ops/restore-tests/README.md b/ops/restore-tests/README.md index c2cb774..5895c42 100644 --- a/ops/restore-tests/README.md +++ b/ops/restore-tests/README.md @@ -33,6 +33,20 @@ Ziel: - Meldung: `ntfy` - Hermes: optional nur fuer Zusammenfassung und Auswertung +## Validiertes Grundmuster + +Stand nach dem ersten echten Vaultwarden-Test: + +- Borg-Quelle bleibt das produktive Remote-Repo bei Hetzner +- Borg-Zugriff laeuft praktisch ueber den vorhandenen `borg-ui`-Container +- SSH-Trust wird ueber `known_hosts` im `borg-ui`-Container hergestellt +- die Borg-Passphrase kommt fuer Restore-Tests aus einer Host-Secret-Datei +- Restore-Ziel liegt immer getrennt unter `/mnt/user/backups/restore-lab` +- Reports liegen unter `/mnt/user/backups/restore-reports` +- Testinstanzen bekommen keine produktive Domain und keine Traefik-Route + +Das ist das bevorzugte Muster fuer weitere dateibasierte Restore-Tests wie `gitea`. + ## Status Aktuell ist hier nur die erste Repo-Vorbereitung angelegt. diff --git a/ops/restore-tests/vaultwarden-restore-test.ps1 b/ops/restore-tests/vaultwarden-restore-test.ps1 index 1748e22..2829e05 100644 --- a/ops/restore-tests/vaultwarden-restore-test.ps1 +++ b/ops/restore-tests/vaultwarden-restore-test.ps1 @@ -2,6 +2,7 @@ param( [string]$BackupSource = "/mnt/user/backups/borg", [string]$RestoreRoot = "/mnt/user/backups/restore-lab/vaultwarden", [string]$ReportRoot = "/mnt/user/backups/restore-reports", + [string]$BorgPassphraseFile = "/mnt/user/appdata/secrets/borg_repo_passphrase.txt", [switch]$WhatIf ) @@ -12,6 +13,7 @@ Write-Output "Vaultwarden restore test scaffold" Write-Output "BackupSource: $BackupSource" Write-Output "RestoreRoot: $RestoreRoot" Write-Output "ReportRoot: $ReportRoot" +Write-Output "BorgPassphraseFile: $BorgPassphraseFile" Write-Output "Expected Borg source path inside archive: local/appdata/vaultwarden" if ($WhatIf) { @@ -25,6 +27,7 @@ Write-Output "Planned steps:" Write-Output "1. Prepare restore-lab target under /mnt/user/backups/restore-lab/vaultwarden" Write-Output "2. Restore Vaultwarden data into an isolated test path" Write-Output ' Template: borg extract "$BORG_REPO" "::ARCHIVE_NAME" local/appdata/vaultwarden' +Write-Output ' Passphrase source: $(cat /mnt/user/appdata/secrets/borg_repo_passphrase.txt)' Write-Output "3. Start container restoretest-vaultwarden against test data only" Write-Output "4. Run smoke checks against the test instance" Write-Output "5. Write markdown report under /mnt/user/backups/restore-reports" diff --git a/ops/restore-tests/vaultwarden-runbook.md b/ops/restore-tests/vaultwarden-runbook.md index e3e696f..f922e23 100644 --- a/ops/restore-tests/vaultwarden-runbook.md +++ b/ops/restore-tests/vaultwarden-runbook.md @@ -4,14 +4,36 @@ - Borg-Quelle ist verfuegbar - Secret-Datei vorhanden: `/mnt/user/appdata/secrets/vaultwarden_admin_token.txt` +- Borg-Passphrase-Datei vorhanden: `/mnt/user/appdata/secrets/borg_repo_passphrase.txt` - Testpfade unter `/mnt/user/backups/restore-lab/` und `/mnt/user/backups/restore-reports/` sind freigegeben +## Bestaetigter Host-Stand + +- `borg` ist im Container `borg-ui` verfuegbar +- `BORG_BACKUP_PATH` ist im `borg-ui`-Container auf `/backups` gesetzt +- produktive Vaultwarden-Daten liegen unter `/mnt/user/appdata/vaultwarden` +- produktives Admin-Token liegt unter `/mnt/user/appdata/secrets/vaultwarden_admin_token.txt` +- `restore-lab` und `restore-reports` sind auf dem Host vorhanden + +## Beobachtete Borg-Hinweise + +- beobachtetes produktives Repo: `ssh://u565255@u565255.your-storagebox.de:23/./hetzner_borg_appdata_critical` +- beobachtete Archivnamen: + - `Taegliche-Sicherung-2026-04-16T04:30:02.798` + - `Taegliche-Sicherung-2026-04-17T04:30:31.660` + - aeltere manuelle Beispiele: + - `manual-backup-2026-04-12T17:17:30` + - `manual-backup-2026-04-12T17:35:17` + +Hinweis: +Vor dem ersten echten Restore-Lauf immer das aktuelle Archiv mit `borg list` erneut pruefen. + ## Platzhalter - `ARCHIVE_NAME`: Borg-Archiv fuer den Restore-Test - `REPORT_DATE`: z. B. `2026-05-06` - `BORG_REPO`: Host-Borg-Repo, z. B. das produktive `critical_infra` -- `BORG_PASSPHRASE`: wie im bestehenden Host-Setup +- `BORG_PASSPHRASE_FILE`: `/mnt/user/appdata/secrets/borg_repo_passphrase.txt` ## Ablauf @@ -29,7 +51,7 @@ Archiv zuerst pruefen: ```bash export BORG_REPO='...' -export BORG_PASSPHRASE='...' +export BORG_PASSPHRASE="$(cat /mnt/user/appdata/secrets/borg_repo_passphrase.txt)" borg list "$BORG_REPO" ``` @@ -95,3 +117,4 @@ rm -rf /mnt/user/backups/restore-lab/vaultwarden/data - Testdaten werden nach erfolgreichem Lauf geloescht. - `ntfy` wird nicht im ersten echten Lauf eingebunden. - `ntfy` folgt spaeter, wenn der manuelle Basisablauf stabil verifiziert ist. +- Die Borg-Passphrase wird fuer Restore-Tests aus einer Host-Secret-Datei gelesen, nicht aus Borg-UI-Interna.