fix(updater): retain two verified backup generations

This commit is contained in:
2026-10-02 15:27:07 +02:00
parent 23d49f7186
commit b01cf2c207
5 changed files with 434 additions and 6 deletions

View File

@@ -222,6 +222,42 @@ Aufträge liegen dauerhaft und root-lesbar unter `.updates/service/`. Nach einem
7. Compose-Datei und `.env` einzeln atomar ersetzen. In `.env` wird ausschließlich `FEDEO_VERSION` verändert; `.env.example` und Setup-Skript werden erneuert. Den laufenden Updater ersetzt dieser Vorgang nicht.
8. Infrastruktur starten, Bucket-Einrichtung ausführen und Migrationen explizit in einem benannten Einmalcontainer starten. Beim anschließenden regulären Backend-Start läuft dessen bestehende Migrationsprüfung nochmals; bereits angewendete Migrationen werden dabei übersprungen.
9. Stack mit `up --wait` starten. Backend-/Frontend-Image-IDs und Healthchecks sowie öffentlich gemeldete Version und Commit prüfen. Erst dann den Release als installiert speichern.
10. Nach erfolgreichem Abschluss die **zwei neuesten Sicherungen erfolgreicher Updates** behalten und ältere reguläre Update-Sicherungen entfernen. Beide behaltenen Sicherungen werden zuvor vollständig gegen ihre SHA-256-Manifeste geprüft. Die Sicherungen enthalten jeweils den Stand **vor** dem zugehörigen Update. Auftragsprotokolle und Release-Dateien bleiben erhalten; `backup-pruned.json` dokumentiert entfernte Sicherungen. Fehlgeschlagene, unterbrochene und manuell wiederhergestellte Aufträge sowie separate Speichermigrationssicherungen werden nicht automatisch bereinigt.
### Backup-Aufbewahrung und bereits belegte Hosts
Die automatische Bereinigung läuft unter derselben Sperre wie das Update und erst
nach erfolgreicher öffentlicher Funktionsprüfung. Eine unvollständige oder beschädigte
aufzubewahrende Sicherung verhindert das Löschen älterer Sicherungen. Links, fremde
Dateien, eingehängte Verzeichnisse und von Containern verwendete Backup-Pfade werden
nicht gelöscht. Docker-Images, Container, Volumes und aktive Daten gehören nicht zu
dieser Bereinigung.
Ein Fehler bei der Bereinigung stoppt die aktualisierte Anwendung nicht und macht
ein erfolgreiches Update nicht nachträglich zum Wiederherstellungsfall. Das
Updateprotokoll enthält eine Meldung; `.updates/backup-retention.json` dokumentiert
das Ergebnis. Eine unterbrochene Löschung kann bei der nächsten Bereinigung anhand
ihres Löschprotokolls fortgesetzt werden. Die zwei behaltenen Generationen werden
dabei erneut geprüft.
Für bestehende Hosts, deren Platte bereits durch alte Sicherungen belegt ist,
die neuen Host-Dienstdateien installieren und zunächst die Vorschau ausführen:
```bash
sudo python3 /usr/local/lib/fedeo-updater/selfhost-update.py prune-backups --directory /opt/fedeo --dry-run
sudo python3 /usr/local/lib/fedeo-updater/selfhost-update.py prune-backups --directory /opt/fedeo
```
Dieser Befehl verwendet dieselbe Aufbewahrungsregel und Prüfsummenprüfung, benötigt
keinen Image-Download und verändert den aktuellen Update-Status nicht. Laufende
Aufträge und offene Wiederherstellungen blockieren ihn. Der letzte erfolgreiche
Updateauftrag muss zum installierten Release und zur aktuellen Compose-Datei passen.
`check` und fehlgeschlagene Updates löschen keine Sicherungen, auch nicht bei
Platzmangel. Für jedes neue Update muss weiterhin Platz für neue Images und eine
zusätzliche vollständige Sicherung verfügbar sein; die automatische Aufbewahrung
ersetzt keine externe Datensicherung. Der Host-Updater wird durch ein Anwendungsupdate
nicht selbst ersetzt: bestehende andere Instanzen benötigen ebenfalls die neuen
Host-Dienstdateien.
Status und Phasen werden atomar in `.updates/status.json` und pro Auftrag in `status.json` gespeichert. `events.jsonl` enthält den Verlauf, `commands.log` Fehlermeldungen der Werkzeuge. Das Verzeichnis hat Modus `0700`; Status- und Konfigurationsdateien werden mit `0600` angelegt. Backups und Werkzeugausgaben enthalten vertrauliche Daten und dürfen nicht ungefiltert an eine Oberfläche ausgeliefert werden. Backups werden nicht automatisch gelöscht.
@@ -264,7 +300,8 @@ cd ../frontend && node --test tests/selfhost-updates.test.cjs
Die Update-Tests verwenden den echten Compose-Parser und einen simulierten Docker-Daemon. Sie prüfen u. a. Erfolg, Prüfsummen, Release-Auswahl, unveränderte Konfiguration, Speicherplatz, parallele Aufträge, Backupfehler, Migrationsfehler, falsche laufende Versionen und unterbrochene Aufträge. Die Matrix-Tests prüfen Stilllegung, Daten-/Container-Erhalt, Backup vor Änderung der Neustartrichtlinien, Fehler und Unterbrechungen sowie die weitere Ablehnung unbekannter Dienste. Ein vollständiger Test mit realem PostgreSQL-/MinIO-/Matrix-Restore auf einer separaten Selfhost-Testinstanz ist vor dem Produktionseinsatz zusätzlich erforderlich.
`python3 -B scripts/update/tests/host_storage_integration.py` prüft zusätzlich
MinIO-Migration, Speicherübernahme, zwei Anwendungsupdates und Restore der
MinIO-Migration, Speicherübernahme, drei Anwendungsupdates, automatische Aufbewahrung
von zwei Sicherungsgenerationen und Restore der
regulären SeaweedFS-Updatesicherung mit echten Docker-Containern. Anwendung und
Release-/HTTP-Antworten sind isolierte Testdaten. Benötigte Images und Aufbau
stehen in `scripts/storage/README.md`. Die fachliche Abnahme des veröffentlichten