Files
fotospiel-app/docs/ops/backup-restore.md

95 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 als bd-Issue 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.