Files
betreuungs-cockpit/scripts/wiederherstellung.sh
T
Florian Wilde 38f4d8d91f fix: Skripte lagen ohne Ausfuehrungsrecht im Repository
Die Anleitung sagt "./scripts/update.sh" - auf Linux kam dort
"Permission denied". Die drei .sh-Dateien lagen mit Modus 644 statt 755
im Index.

Ursache ist der Entwicklungsrechner: Unter Windows steht
core.filemode=false, git nimmt ein fehlendes Ausfuehrungsrecht dort gar
nicht wahr. Gemeldet hat es der Betrieb, nicht der Bau.

Wer von 1.1.0 oder aelter kommt, braucht einmalig "bash
scripts/update.sh" - das alte Skript ist ja noch das nicht ausfuehrbare.
Steht jetzt in README und Installationsanleitung.

Zusaetzlich setzt update.sh nach dem Umschalten selbst ein chmod +x auf
scripts/*.sh. Das faengt den Fall ab, dass jemand Dateien von Hand
kopiert und das Recht dabei verliert - genau so kam man bisher an dieses
Skript, bevor es in der laufenden Fassung existierte.

Neu: tests/skripte.test.ts prueft nicht Verhalten, sondern Verpackung -
Ausfuehrungsrecht im Index, Shebang, scripts/ im Docker-Abbild, die
Sicherungsskripte in der Compose-Datei. Es ist der zweite Fehler dieser
Art (vorher fehlte scripts/ ganz im Abbild, 1.0.1); beide Male war der
Code richtig und kein Test sah hin, wie die Dateien beim Server
ankommen. Gegenprobe gemacht: mit zurueckgesetztem Recht schlaegt er
fehl und nennt die Datei.

Nebenbei aufgefallen: scripts/version.mjs datierte in UTC. Diese Fassung
waere um 00:08 deutscher Zeit auf den Vortag datiert worden. Rechnet
jetzt in Europe/Berlin.
2026-08-23 00:13:05 +02:00

101 lines
3.5 KiB
Bash
Executable File

#!/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 <pfad-zur-sicherung.dump.enc>" >&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."