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

5.0 KiB
Raw Permalink Blame History

title, sidebar_label
title sidebar_label
Backup & Restore / Disaster Recovery 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.