Ausgangslage: ein fertiges Paket, das nicht gelaufen wäre
Am Anfang stand ein fertiges Paket aus einem KI-Chat: Skripte, Docker-Datei, Sicherungsstrategie, gedacht für meinen Raspberry Pi. Bevor ich etwas davon ausgeführt habe, habe ich jede Annahme am echten Gerät nachgesehen. Fünf Voraussetzungen stimmten nicht, drei davon standen im Paket als „hast du bereits“ abgehakt: Docker war nicht installiert, es gab keine SD-Karte, und die Ports 80 und 443 belegte schon der vorhandene Webserver.
Dazu drei Konstruktionsfehler in der Docker-Datei. Die gewählte Nextcloud-Variante bringt keinen Webserver mit, die nötige Konfiguration fehlte im Paket. Die Ressourcenlimits gelten nur im Swarm-Modus und wären still ignoriert worden. Und leere Ordner hätten Teile des Programms überdeckt. Die Sicherung schließlich hätte ausgerechnet die Konfiguration ausgelassen, ohne die sich nichts zurückspielen lässt.
Die Entscheidung: eine eigene VM statt des Pi
Auf dem Pi hängt die Namensauflösung für das ganze Haus. Nextcloud, PostgreSQL und Redis daneben zu stellen, wäre vom Speicher her gegangen. Aber jedes Update, jeder Neustart und jede Fehlersuche hätte den Haus-DNS mitbetroffen. Für ein Vorhaben, bei dem man absichtlich oft von vorn anfangen will, ist das die falsche Grundlage. In einer VM springt man per Snapshot in Sekunden zurück, und wenn etwas kaputtgeht, ist es nur die VM.
Die Docker-Datei habe ich neu geschrieben: ein vollständiges Nextcloud-Abbild, wirksame Limits, Passwörter nur in einer .env, die ich selbst eintippe, und ein Sicherungsskript mit Wartungsmodus, Datenbankauszug und Zeitsteuerung über systemd statt cron.
Der Test: alles zerstören und zurückholen
Vorgehen: eine Markierungsdatei in die laufende Installation legen, sichern, dann alles löschen, auch die Datenträger der Container, zurückspielen und vergleichen. Die Markierung kam Zeichen für Zeichen identisch zurück. Auf dem Weg dahin zeigten sich vier Fehler, die auf dem Papier unsichtbar waren:
- Docker benennt Datenträger nach dem Ordner. Die Anleitung nannte einen anderen Namen. Docker hätte beim Zurückspielen still einen neuen, leeren Datenträger angelegt und Erfolg gemeldet. Jetzt sind die Namen fest vorgegeben.
- Der Datenbankauszug enthielt den Datenbankbenutzer nicht. Nach dem Zurückspielen fehlte er, und Nextcloud antwortete mit einem Serverfehler, obwohl alle Daten da waren. Jetzt werden die Benutzer getrennt gesichert und vor der Datenbank eingespielt.
- Der Wartungsmodus steckt in der Sicherung. Gesichert wird im Wartungsmodus, also wird er mitgesichert. Der Schritt, ihn nach dem Zurückspielen abzuschalten, ist damit Pflicht und nicht Kosmetik.
- Alte Datenträger blieben liegen. Nach dem Umbenennen lagen die alten noch da, und es sah so aus, als käme alles zurück. Der Test war erst etwas wert, nachdem ich sie von Hand entfernt hatte.
Mit echten Daten: der fünfte Fehler
Danach kamen 1.295 eigene Fotos in die Cloud, zusammen 7,3 GB. Damit zeigte sich ein Fehler, den der Test mit ein paar hundert Megabyte nicht zeigen konnte. Die Aufbewahrungsregel lautete „lösche alles, was älter als 30 Tage ist“. Das klingt vernünftig, löscht aber vor Tag 31 gar nichts. Bei 7,5 GB je Sicherung wäre die Platte nach etwa acht Tagen voll gewesen, bevor das Aufräumen ein einziges Mal gegriffen hätte.
| Vorher | Jetzt |
|---|---|
| Aufbewahrung nach Alter, 30 Tage | nach Anzahl, die letzten 7 Stände |
| Platzbedarf hängt von der Datenmenge ab | rechenbar: Anzahl mal Größe |
| volle Platte bricht mitten im Schreiben ab | Platzprüfung vor dem ersten Schreiben |
Der letzte Punkt ist wichtiger, als er aussieht: Eine Sicherung, die mitten im Schreiben an einer vollen Platte scheitert, hinterlässt ein halbes Archiv, das im Verzeichnis aussieht wie ein gültiges.
Die zweite Rückspielung, nach Anleitung
Die zweite Wiederherstellung habe ich mit den echten Fotos gemacht und dabei nur der schriftlichen Anleitung gefolgt, so wie es jemand täte, der das System nicht kennt. Beim Einspielen der Datenbankbenutzer kam eine Fehlermeldung, die in der Anleitung nicht stand. Sie ist harmlos, aber wer sie nicht erwartet, bricht an dieser Stelle ab. Sie steht jetzt in der Anleitung, mit Erklärung.
Kapazitätsregeln müssen mit echten Datenmengen geprüft werden, mit einem leeren System sieht jede Regel richtig aus. Und eine Anleitung zeigt ihre Lücken erst, wenn sie jemand Schritt für Schritt abarbeitet, statt sie zu kennen.
Technik
| Teil | Womit |
|---|---|
| Umgebung | eigene VM unter VMware mit Ubuntu, Snapshots als Rückweg |
| Anwendung | Nextcloud 31 mit PostgreSQL und Redis, drei Container über Docker Compose |
| Sicherung | Shell-Skript mit Wartungsmodus, Datenbank- und Benutzerauszug, systemd-Timer, Aufbewahrung nach Anzahl, Platzprüfung |
| Abnahme | status.php, occ user:list, occ files:scan, Markierungsdatei |