Dokumente mitsichern - eine Akte ohne ihre Dateien ist wertlos
Der Sicherungsdienst machte taeglich ein pg_dump und sonst nichts. Nach einem Plattenschaden waere die Akte vollstaendig wiederhergestellt worden - mit allen Eintraegen, Verweisen und Pruefsummen, aber ohne eine einzige Datei dahinter. Die Pruefsumme in der Akte haette dann ein Dokument belegt, das es nicht mehr gibt. Gegenueber dem Betreuungsgericht ist das der schlechteste denkbare Zustand. Je Lauf entstehen jetzt zwei verschluesselte Dateien mit demselben Zeitstempel: der Datenbankstand und ein Archiv des Ablageverzeichnisses. Beide mit Pruefsumme, beide in der Aufbewahrung, beide im Monatsstand, beide in der Selbstpruefung. Schlaegt der Dokumententeil fehl, bricht der Lauf ab und raeumt den angefangenen Datenbankstand wieder weg. Eine Sicherung, die nur die halbe Wahrheit enthaelt, aber vollstaendig aussieht, ist schlimmer als gar keine: Man verlaesst sich darauf und merkt es erst im Ernstfall. ## Abweichung von der urspruenglichen Idee Im Issue stand "mc mirror statt rohem Verzeichnis". Beim Umsetzen zeigte sich, dass der MinIO-Client in diesem Behaelter fehlt und bei jedem Lauf aus dem Netz geholt werden muesste. Eine Internetabhaengigkeit im Sicherungspfad ist genau das, was man dort nicht will. Stattdessen wird das Verzeichnis direkt eingepackt. Das ist vertretbar, weil MinIO ein Objekt erst vollstaendig unter .minio.sys/tmp schreibt und dann an seinen Platz umbenennt: Ein laufender Upload liegt nie halbfertig im Archiv, er fehlt hoechstens. Derselbe Weg deckt den Dateitreiber mit ab. ## Nur lesend Der Sicherungsdienst bekommt das Ablageverzeichnis mit ":ro" eingehaengt. Er laeuft unbeaufsichtigt per cron; ein Fehler im Skript oder ein kompromittierter Behaelter wuerde sonst Sicherung und Bestand auf einmal treffen - genau der Fall, gegen den eine Sicherung da ist. Deshalb schreibt die Wiederherstellung die Dateien auch nicht selbst an ihren Platz, sondern packt sie nach ./backups aus und gibt den letzten Handgriff als Einzeiler aus. In ein laufendes MinIO hineinzuschreiben wuerde dessen Datenbestand ohnehin beschaedigen. ## Geprueft Die Kernlogik einmal von Hand durchgespielt: packen, verschluesseln, Selbstpruefung, zurueckholen - der Inhalt kam bitgleich zurueck, der Klartext war im Archiv nicht auffindbar, und die Selbstpruefung schlug sowohl bei einem beschaedigten Archiv als auch bei falschem Passwort an. Dazu elf Pruefungen in tests/skripte.test.ts gegen vier Mutationen: Dokumententeil entfernt, Abbruch entfernt, Aufraeumen halbiert, Schreibrecht erteilt - jede wird rot. Refs #41
This commit is contained in:
@@ -155,9 +155,20 @@ services:
|
||||
PGDATABASE: ${POSTGRES_DB:-betreuungs_cockpit}
|
||||
SICHERUNG_PASSWORT: ${SICHERUNG_PASSWORT:?SICHERUNG_PASSWORT fehlt in der .env}
|
||||
SICHERUNG_AUFBEWAHRUNG_TAGE: ${SICHERUNG_AUFBEWAHRUNG_TAGE:-30}
|
||||
SICHERUNG_DOKUMENTE_QUELLE: /dokumente
|
||||
TZ: Europe/Berlin
|
||||
volumes:
|
||||
- ./backups:/backups
|
||||
# Die Dokumente, ausdruecklich NUR LESEND.
|
||||
#
|
||||
# Der Sicherungsdienst laeuft unbeaufsichtigt per cron. Ein Dienst,
|
||||
# der die Daten zerstoeren kann, die er sichern soll, ist ein Risiko
|
||||
# ohne Gegenwert - ein Fehler im Skript oder ein kompromittierter
|
||||
# Behaelter wuerde beides auf einmal treffen.
|
||||
#
|
||||
# Zurueckspielen geschieht deshalb nicht hierher, sondern in ein
|
||||
# Verzeichnis unter ./backups; siehe scripts/wiederherstellung.sh.
|
||||
- minio-daten:/dokumente:ro
|
||||
- ./scripts/sicherung.sh:/sicherung.sh:ro
|
||||
- ./scripts/wiederherstellung.sh:/wiederherstellung.sh:ro
|
||||
entrypoint: ['/bin/sh', '-c']
|
||||
|
||||
Reference in New Issue
Block a user