--- 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** - MySQL‑Datenbank (alle Schemas/Tables des Fotospiel‑Backends). - Enthält Tenants, Events, Fotos‑Metadaten, Join‑Tokens, Abrechnungsdaten, Logs (soweit in DB). - **Medienspeicher** - Hot‑Storage: 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), Dokploy‑Compose‑Konfigurationen, Secrets für externe Dienste. - Optional: Horizon‑Konfiguration, Monitoring‑Dashboards. > TODO: Füge hier konkrete Pfade/Bucket‑Namen und die verwendeten Backup‑Tools (z.B. `mysqldump`, S3‑Snapshots, Dokploy‑Backups) ein. ## 2. Backup-Strategie - **Datenbank-Backups** - Frequenz: mindestens täglich (idealerweise alle 4–6 Stunden für Produktions‑DB). - Aufbewahrung: z.B. 7–30 Tage, mit Off‑Site‑Kopie. - Prüfschritte: - Dump/Backupfile auf Plausibilität (Größe, letzte Änderung). - Regelmäßige Test‑Restores in eine Staging‑DB: - 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** - Hot‑Storage: - Snapshot/Incremental‑Backup der Storage‑Volumes oder S3‑Buckets. - Archive: - Sicherstellen, dass Archiv‑Backups nicht versehentlich durch Lifecycle‑Policies gelöscht werden, bevor gesetzliche Retention erfüllt ist. - **Konfig-Backups** - `.env` und Secrets nur verschlüsselt speichern (z.B. in einem Secrets‑Manager, nicht in Klartext‑Backups). - Dokploy‑/Compose‑Konfiguration 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 Medien‑Blob) ist. 2. **DB‑Restore (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/Archive‑Storage 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 Staging‑Umgebung 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** - Hot‑Storage‑Backup auf Volumes/Buckets zurückspielen (z.B. Docker‑Volume `app-storage` oder zugeordneten Bucket). - Archiv‑Buckets ggf. unverändert lassen, sofern noch intakt. 3. **App & Queues** - App mit readonly/maintenance‑Flag 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, Health‑Checks) und definierte RTO/RPO‑Ziele. ## 4. Tests & DR-Übungen - Mindestens 1–2 Mal pro Jahr einen vollständigen Restore in einer separaten Umgebung durchspielen: - DB‑Backup einspielen. - Medien‑Backups anbinden. - Eine Handvoll Tenants/Events kompletter durchklicken (Upload, Galerie, Admin‑Funktionen). - Ergebnisse im `docs/process/changes/`‑Ordner dokumentieren (z.B. „DR‑Übung 2026‑Q1“ 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 DR‑Szenarien 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‑/Archive‑Storage‑Problemen (voll, hängende Archivierung, fehlende Medien). Dieses Dokument bleibt die High‑Level‑Übersicht – für konkrete Fälle solltest du immer auch die entsprechenden Playbooks konsultieren.