# Sprint 6H-B – Private Medien: Backup und Restore

Der private Medienbereich `private-media/capture/` gehört gemeinsam mit `health_data.db` zur konsistenten Patientendatensicherung. Er liegt außerhalb des Webroots und darf weder in Git noch unverschlüsselt in externe Speicher gelangen.

## Backup

1. Dashboard-Aktionsworker anhalten oder sicherstellen, dass keine Aktion verarbeitet wird.
2. SQLite mit `sqlite3.Connection.backup()` konsistent sichern und `PRAGMA integrity_check` prüfen.
3. Den privaten Medienordner descriptor-/dateibasiert ohne Symlink-Folgen in dasselbe lokale Backup-Staging übernehmen.
4. Nur reguläre, eigentümergeführte Dateien mit Modus `0600` und Verzeichnisse mit Modus `0700` akzeptieren.
5. Manifest mit relativen opaque Dateinamen, Größe und SHA-256 erzeugen; keine Patiententexte oder Originaldateinamen aufnehmen.
6. Datenbank, Medien und Manifest gemeinsam verschlüsseln. Nur das verschlüsselte Archiv darf extern gesichert werden.

Die Quarantäne `health-dashboard-actions/quarantine/` ist kurzlebiger Runtime-Zustand und kein kanonischer Patienteneintrag. Vor einem kontrollierten Backup werden abgelaufene, nicht referenzierte Dateien bereinigt; noch ausstehende Aktionen müssen zusammen mit Action-Inbox und Quarantäne konsistent behandelt werden.

## Restore-Test

1. Verschlüsseltes Archiv in ein privates temporäres Verzeichnis entschlüsseln.
2. Datenbank wiederherstellen und `integrity_check` sowie `foreign_key_check` ausführen.
3. Jede Medienmanifestzeile gegen Dateityp, Modus, Größe und SHA-256 prüfen; Symlinks ablehnen.
4. Prüfen, dass jede Zeile in `capture_attachments` auf vorhandene Original- und Thumbnail-Dateien verweist und keine unerwartete Datei im Medienordner liegt.
5. Read-only-Test der Tageschronik und eines lokalen Thumbnails durchführen, ohne Patientendaten zu protokollieren.
6. Temporäre Klartextdaten kontrolliert entfernen.

Ein Datenbank-Restore ohne zugehörigen Medienstand oder ein Medien-Restore ohne passende Datenbank gilt als unvollständig und darf nicht als erfolgreich gemeldet werden.
