fix(updater): retain two verified backup generations
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user