further rework to the documentation

This commit is contained in:
Codex Agent
2025-11-20 12:31:21 +01:00
parent 6afa44d947
commit 9afcaa7836
90 changed files with 1721 additions and 29 deletions

View File

@@ -0,0 +1,94 @@
---
title: Backup & Restore / Disaster Recovery
sidebar_label: Backup & DR
---
Dieses Dokument beschreibt, was gesichert werden sollte, wie Backups geprüft werden und wie ein Restore im Notfall abläuft.
## 1. Was muss gesichert werden?
- **Datenbank**
- MySQLDatenbank (alle Schemas/Tables des FotospielBackends).
- Enthält Tenants, Events, FotosMetadaten, JoinTokens, Abrechnungsdaten, Logs (soweit in DB).
- **Medienspeicher**
- HotStorage: Pfade unter `storage/app/private` / `storage/app/public` oder konfigurierten „hot“Disks.
- Archivspeicher: Buckets/Disks, in denen `event_media_assets` mit Status `archived` liegen.
- **Konfiguration**
- `.env` Dateien (ohne sie in Git zu speichern), DokployComposeKonfigurationen, Secrets für externe Dienste.
- Optional: HorizonKonfiguration, MonitoringDashboards.
> TODO: Füge hier konkrete Pfade/BucketNamen und die verwendeten BackupTools (z.B. `mysqldump`, S3Snapshots, DokployBackups) ein.
## 2. Backup-Strategie
- **Datenbank-Backups**
- Frequenz: mindestens täglich (idealerweise alle 46 Stunden für ProduktionsDB).
- Aufbewahrung: z.B. 730 Tage, mit OffSiteKopie.
- Prüfschritte:
- Dump/Backupfile auf Plausibilität (Größe, letzte Änderung).
- Regelmäßige TestRestores in eine StagingDB:
- Beispiel (einfacher Dump auf Host Pfade/Passwörter an Umgebung anpassen):
- `mysqldump -h 127.0.0.1 -u fotospiel -p fotospiel > fotospiel-$(date +%F).sql`
- Restore in temporäre DB (z.B. `fotospiel_restore`) und kurze Stichproben:
- `mysql -h 127.0.0.1 -u fotospiel -p fotospiel_restore < fotospiel-YYYY-MM-DD.sql`
- **Medien-Backups**
- HotStorage:
- Snapshot/IncrementalBackup der StorageVolumes oder S3Buckets.
- Archive:
- Sicherstellen, dass ArchivBackups nicht versehentlich durch LifecyclePolicies gelöscht werden, bevor gesetzliche Retention erfüllt ist.
- **Konfig-Backups**
- `.env` und Secrets nur verschlüsselt speichern (z.B. in einem SecretsManager, nicht in KlartextBackups).
- Dokploy/ComposeKonfiguration versionieren (Git) und zusätzlich sicher exportieren.
## 3. Restore-Szenarien
### 3.1 Einzelner Tenant/Event defekt
1. Reproduzieren, ob der Fehler rein logisch (Datenkonsistenz) oder physisch (Fehlender MedienBlob) ist.
2. **DBRestore (punktuell)**:
- Wenn möglich, nur relevante Tabellenbereiche (z.B. `tenants`, `events`, `photos`, `event_media_assets`, `event_packages`) aus Backup in eine temporäre DB laden.
- Differenzanalyse: welche Daten fehlen/fehlerhaft? Manuell oder via Skript zurückspielen.
3. **Medien-Check**
- Fehlende Dateien im Hot/ArchiveStorage identifizieren (z.B. per `event_media_assets` Pfade + `Storage::disk()->exists`).
- Wenn Dateien im Backup vorhanden, gezielt an den richtigen Pfad zurückkopieren.
> Diese Schritte sollten zuerst in einer StagingUmgebung eingeübt werden, bevor sie in Produktion angewendet werden.
### 3.2 Betriebsweite Störung (DB/Storage Verlust)
1. **DB wiederherstellen**
- Leere Datenbank aufsetzen, letztes konsistentes Backup einspielen.
2. **Storage wiederherstellen**
- HotStorageBackup auf Volumes/Buckets zurückspielen (z.B. DockerVolume `app-storage` oder zugeordneten Bucket).
- ArchivBuckets ggf. unverändert lassen, sofern noch intakt.
3. **App & Queues**
- App mit readonly/maintenanceFlag starten, Queues gestoppt lassen.
- Konsistenzprüfungen (z.B. stichprobenartige Tenants, Events, Medien, Abrechnungsdaten).
4. **Queues wieder freigeben**
- Wenn die wichtigsten Funktionen wieder intakt sind, Queues/Horizon graduell zuschalten.
> TODO: Ergänze konkrete Kommandos (Migrationsstatus prüfen, HealthChecks) und definierte RTO/RPOZiele.
## 4. Tests & DR-Übungen
- Mindestens 12 Mal pro Jahr einen vollständigen Restore in einer separaten Umgebung durchspielen:
- DBBackup einspielen.
- MedienBackups anbinden.
- Eine Handvoll Tenants/Events kompletter durchklicken (Upload, Galerie, AdminFunktionen).
- Ergebnisse im `docs/process/changes/`Ordner dokumentieren (z.B. „DRÜbung 2026Q1“ mit Learnings).
## 5. Verantwortlichkeiten
- **Backup-Ownership**: Wer stellt sicher, dass Backups laufen und testweise wiederhergestellt werden?
- **DR-Ownership**: Wer führt die DRÜbungen durch und wer entscheidet im Ernstfall über Failover/Restore?
Diese Punkte sollten mit konkreten Namen/Rollen befüllt werden, damit im Ernstfall keine Unklarheiten bestehen.
## 6. Ergänzende DR-Playbooks
Spezielle DRSzenarien sind in separaten Runbooks beschrieben:
- `docs/ops/dr-tenant-event-restore.md` Vorgehen bei versehentlich gelöschten oder beschädigten Tenants/Events.
- `docs/ops/dr-storage-issues.md` Vorgehen bei Hot/ArchiveStorageProblemen (voll, hängende Archivierung, fehlende Medien).
Dieses Dokument bleibt die HighLevelÜbersicht für konkrete Fälle solltest du immer auch die entsprechenden Playbooks konsultieren.