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.
101 lines
3.5 KiB
Bash
Executable File
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."
|