Backups: Großvater-Vater-Sohn über Lokal, SFTP, S3 und WebDAV
„Kein Backup – kein Mitleid." Mit diesem Satz bin ich durch die Ausbildung und spätere Aufträge gegangen. Ein ganzes Repository geht einem nur einmal aus Vergesslichkeit flöten – aber Daten aus der Werkbank? Eingangsbelege, die komplette Datenbank, Zugriffsschlüssel? Dafür reicht mir „Aufgabe des Nutzers" nicht, auch wenn der Reflex naheliegt: Mehr als einmal wird er nicht alle Eingangsbelege verlieren, dafür sorgt der Schmerz beim Wiedereinspielen schon selbst. Nutzerfreundlich oder vertrauenserweckend ist das trotzdem nicht. Also brauchte es einen Weg, mit dem auch Nutzer mit ein paar IT-Grundkenntnissen ihre Daten sicher und GoBD-konform verwahren können.
State of the Art ist das Großvater-Vater-Sohn-Prinzip – in meinem Fall erweitert um einen Urgroßvater, der alle zehn Jahre sichert (danke, GoBD). Gesichert wird der komplette Data-Folder, in dem die Werkbank alle Eingangsbelege, die Datenbank und die Zugriffsschlüssel ablegt. Bei den Zielen wollte ich niemanden ausschließen: Manche Nutzer sichern lieber lokal auf einem anderen Pfad desselben Servers, andere in die eigene Nextcloud oder den eigenen S3-Space. Am Ende steht Lokal, SFTP, S3 (und alles S3-Kompatible, z. B. Hetzner Object Storage) und WebDAV – parallel zu mehreren Zielen gleichzeitig, mit Rotation nach GoBD-Fristen, optional verschlüsselt (dd52e90).
Der Teil, der in keiner Roadmap steht, war der Weg dahin. „Tar den Ordner, im Zweifel wieder entpacken" klingt nach einem Nachmittag Arbeit – war es nicht. Verschlüsseln, Rotieren, der Web-Download waren der leichte Teil. Der eigentliche Gegner hieß Berechtigungen: Postgres besteht zu Recht darauf, dass sein Datenordner nur für den eigenen Prozess-User lesbar ist – und ausgerechnet das Verschieben dieses Ordners scheiterte selbst als root an einer Windows/WSL2-Bind-Mount- Übersetzung, quittiert mit einem schlichten „Access denied". Umgebaut auf Kopieren statt Verschieben, und plötzlich ging's.
Auf dem Weg dahin gab's auch den Moment, in dem ein fehlgeschlagener Restore-Testlauf fast den Ordner mit den Verschlüsselungsschlüsseln mitgerissen hätte – einmal manuell aus einem älteren Backup zurückgeholt, danach ein echtes Sicherheitsnetz eingebaut: Ein gescheiterter Restore rollt jetzt immer vollständig zurück, statt irgendetwas nur halb zu verschieben. Nicht die Art Lektion, die man zweimal braucht.
Dazu zwei Kleinigkeiten am Rand, die trotzdem Zeit gekostet haben: ein S3-Fehler, der laut AWS SDK nur „Exception of type '...' was thrown" hieß, bis ein Decompiler verraten hat, wo der eigentliche HTTP-Statuscode versteckt liegt. Und WebDAV, das beim Hochladen größerer Dateien mit „broken pipe" abbrach – weil .NET bei Basic Auth standardmäßig erst unauthentifiziert anfragt und Zugangsdaten erst nach einer 401-Antwort nachreicht. Bei einem gestreamten Upload kommt der Server damit schon mal nicht mehr hinterher.
Einen weiteren Schmerzpunkt aus dieser Runde habe ich am Ende fallen gelassen – diesmal nur mit ein paar Ehrenrunden mehr als erwartet.