#!/bin/sh # ============================================================================= # Sicherung zurueckspielen # ============================================================================= # # docker compose exec sicherung /bin/sh /wiederherstellung.sh /backups/cockpit_2026-08-22_0315.dump.enc # # Das Skript spielt eine verschluesselte Sicherung zurueck. Es fragt # ausdruecklich nach, weil dabei der aktuelle Datenbestand ueberschrieben # wird. # # ZWEI DINGE, DIE MAN VORHER WISSEN MUSS: # # 1. Die Sicherung enthaelt die anwendungsseitig verschluesselten Felder, # aber NICHT den Schluessel. Ohne den passenden ENC_KEY_Vn aus der .env # bleiben Diagnosen, IBANs, Versicherungsnummern und Notizen unlesbar - # die Datenbank ist dann zwar da, aber halb blind. # # 2. Ein Backup, das nie zurueckgespielt wurde, ist kein Backup. Probiere # das hier einmal im Jahr auf einer Testdatenbank aus, bevor du es im # Ernstfall zum ersten Mal brauchst. Siehe README, Abschnitt # "Wiederherstellung ueben". # ============================================================================= set -eu DATEI="${1:-}" if [ -z "$DATEI" ]; then echo "Aufruf: $0 " >&2 echo "" >&2 echo "Vorhandene Sicherungen:" >&2 ls -lh "${SICHERUNG_ZIEL:-/backups}"/cockpit_*.dump.enc 2>/dev/null >&2 || echo " keine gefunden" >&2 exit 1 fi if [ ! -f "$DATEI" ]; then echo "FEHLER: $DATEI gibt es nicht." >&2 exit 1 fi if [ -z "${SICHERUNG_PASSWORT:-}" ]; then echo "FEHLER: SICHERUNG_PASSWORT ist nicht gesetzt." >&2 exit 1 fi # --- Pruefsumme ------------------------------------------------------------- if [ -f "$DATEI.sha256" ]; then echo "Pruefsumme wird geprueft ..." if sha256sum -c "$DATEI.sha256" >/dev/null 2>&1; then echo " in Ordnung." else echo "FEHLER: Die Pruefsumme stimmt nicht. Die Datei ist beschaedigt." >&2 exit 1 fi else echo "WARNUNG: Keine Pruefsummendatei gefunden - es wird ungeprueft fortgefahren." fi # --- Sicherheitsabfrage ------------------------------------------------------ echo "" echo "Es wird zurueckgespielt nach:" echo " Datenbank: ${PGDATABASE:-?} auf ${PGHOST:-?}" echo " Aus Datei: $DATEI" echo "" echo "DER AKTUELLE DATENBESTAND WIRD DABEI UEBERSCHRIEBEN." echo "" if [ "${SICHERUNG_OHNE_RUECKFRAGE:-}" != "ja" ]; then printf "Zum Fortfahren bitte JA eingeben: " read -r antwort if [ "$antwort" != "JA" ]; then echo "Abgebrochen." exit 1 fi fi # --- Zurueckspielen ---------------------------------------------------------- echo "" echo "$(date -Iseconds) Wiederherstellung beginnt ..." # --clean --if-exists raeumt vorhandene Objekte ab, bevor sie neu angelegt # werden. --no-owner, weil der Eigentuemer auf einem anderen Server anders # heissen kann. openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 \ -pass env:SICHERUNG_PASSWORT -in "$DATEI" \ | pg_restore --clean --if-exists --no-owner --no-privileges \ --dbname="${PGDATABASE:-postgres}" --exit-on-error echo "$(date -Iseconds) Wiederherstellung abgeschlossen." echo "" echo "Naechste Schritte:" echo " 1. Die SQL-Skripte erneut ausfuehren (Volltextsuche und Audit-Schutz):" echo " docker compose exec app npm run db:sql" echo " 2. Pruefen, ob ENC_KEY_V1 in der .env zu diesem Bestand passt -" echo " ohne den richtigen Schluessel bleiben die verschluesselten" echo " Felder unlesbar." echo " 3. In der Anwendung eine betreute Person oeffnen und nachsehen, ob" echo " die Diagnosen im Klartext erscheinen. Erst dann ist die" echo " Wiederherstellung wirklich gelungen."