Resume pending publications under local pressure, allow verified offsite-only history as a final local recovery stage, and prune old complete remote sets against actual upload quota while preserving the newest verified copies. Document defaults, recovery limits and validation; add pressure and quota regression coverage.
392 lines
24 KiB
Markdown
392 lines
24 KiB
Markdown
# Automatische Speicherbereinigung
|
||
|
||
## Adaptive Bereinigung bei Platznot – 22.10.2026
|
||
|
||
Der Bericht vom 22.10. nennt 74.630.297.390 benötigte und 59.122.741.248 freie
|
||
Bytes auf `/var`: Es fehlen 15.507.556.142 Bytes (14,44 GiB). Die geschützte
|
||
hochgeladene lokale Sicherung belegt 34.408.038.400 Bytes (32,05 GiB).
|
||
Ihre Freigabe kann diesen Engpass lösen. Eine Löschung in OneDrive schafft dagegen
|
||
keinen Platz auf Gemini. Der historische/unbestätigte Satz wird nicht blind entfernt.
|
||
|
||
Die folgende Strategie ersetzt die frühere unbedingte lokale Mindestkopie.
|
||
Neue Standardwerte gelten auch bei bestehenden Konfigurationen ohne diese Einträge:
|
||
|
||
```bash
|
||
SPACE_KEEP_LOCAL=1
|
||
SPACE_ALLOW_REMOTE_ONLY=true
|
||
SPACE_REMOTE_CLEANUP=true
|
||
SPACE_KEEP_REMOTE=1
|
||
```
|
||
|
||
1. Wie bisher: erkannte Arbeitsreste bereinigen, Snapshotbedarf plus Reserve
|
||
schätzen, Writer erst nach erfolgreichem Preflight anhalten.
|
||
2. Vor einem Upload die Remote-Quote über `rclone about --json` abfragen.
|
||
Unter Platzdruck darf `SPACE_REMOTE_CLEANUP=true` ältere vollständige v2-Sätze
|
||
unabhängig von Altersretention und `ENABLE_REMOTE_RETENTION` entfernen.
|
||
Die neuesten `SPACE_KEEP_REMOTE` geprüften vollständigen Sätze bleiben erhalten
|
||
(Default und Minimum eins). Nur Verzeichnisse mit passendem Laufnamen,
|
||
gültigem Manifest und Abschlussmarker sowie vollständigem Dateibestand in
|
||
Manifestgrößen zählen als gültig. Unvollständige, unbekannte oder abweichende
|
||
Bestände werden weder gelöscht noch als Rückfallkopie gezählt. Vor jeder
|
||
Entfernung werden Kandidat und geschützte Rückfallkopien erneut geprüft.
|
||
Der aktuelle Upload und eine ausdrücklich ausgewählte Remote-Restore-Quelle
|
||
werden ausgenommen. Gelöscht wird ältester Satz zuerst, nur bis ausreichend
|
||
Quote verfügbar ist. Der Quotenbedarf enthält zusätzlich 5 % plus 1 MiB für
|
||
Verschlüsselungs-/Datei-Overhead. Nach jeder Entfernung wird die Quote neu
|
||
gelesen; ein erfolgreicher Purge gilt nicht als Beleg für freien Speicher.
|
||
3. Bei lokalem Archivplatzmangel vollständige unbestätigte lokale v2-Sätze prüfen.
|
||
Ist ihre Remote-Veröffentlichung schon vollständig und identisch, wird der
|
||
lokale `UPLOADED`-Marker nach erneuter Prüfung nachgetragen. Andernfalls wird
|
||
der Upload mit `--immutable` wiederholt: Archive und Manifest zuerst,
|
||
Dateiprüfung, Abschlussmarker zuletzt, Identitätsprüfung, dann `UPLOADED`.
|
||
Fehlerhafte, unvollständige oder weiterhin nicht veröffentlichte Sätze bleiben
|
||
geschützt. Eine beschädigte Remote-Datei wird nicht überschrieben.
|
||
4. Zunächst wie bisher ältere bestätigte lokale Kopien bis `SPACE_KEEP_LOCAL`
|
||
bereinigen. Reicht das nicht, erlaubt `SPACE_ALLOW_REMOTE_ONLY=true` auch die
|
||
Freigabe dieser lokalen Mindestkopien, wenn ihre belegten Blöcke das Defizit
|
||
voraussichtlich decken können. Auch hier: vollständige lokale Inhaltsprüfung,
|
||
Remote-Dateien/-Größen sowie bytegleiche Remote-Manifeste und Abschlussmarker;
|
||
erst danach lokale Entfernung, ältester Satz zuerst, erneute Platzmessung und
|
||
Stopp bei ausreichender Kapazität. Eine ausgewählte lokale Restore-Quelle
|
||
bleibt ausgeschlossen. Mit `SPACE_ALLOW_REMOTE_ONLY=false` bleibt die bisherige
|
||
feste lokale Untergrenze erhalten.
|
||
5. Vor der Veröffentlichung des neuen lokalen Satzes Remote-Quote anhand seiner
|
||
tatsächlichen Archivgröße prüfen. Das unkomprimierte Snapshotbudget ist keine
|
||
Remote-Platzanforderung und blockiert keinen kleineren komprimierten Upload.
|
||
Nach erfolgreichem Lauf bleibt der neue lokale Satz erhalten; die normale Altersretention gilt weiterhin separat.
|
||
|
||
**Abwägung:** In der letzten lokalen Notstufe kann bis zur Fertigstellung des
|
||
neuen Backups ausschließlich die geprüfte Offsite-Sicherung existieren. Schlägt
|
||
der neue Lauf fehl, steht diese weiter bereit; ein lokaler Restore erfordert dann
|
||
zunächst einen Download. Die Prüfungen lesen keine Archive aus OneDrive zurück.
|
||
Gleich große Inhaltsbeschädigungen erkennt erst der vollständige Restore-Test.
|
||
Die Änderungen ersetzen dessen weiterhin offene produktive Abnahme nicht.
|
||
|
||
`SPACE_REMOTE_CLEANUP=false` deaktiviert Quotenbereinigung, `SPACE_KEEP_REMOTE`
|
||
erhöht die geschützte Remote-Anzahl. Die normale Altersretention behält ihre
|
||
separaten Werte `RETENTION_KEEP_LAST`, `LOCAL_RETENTION_DAYS` und
|
||
`REMOTE_RETENTION_DAYS`; Quotenbereinigung ändert diese Konfiguration nicht.
|
||
`--no-retention` unterdrückt weiterhin nur die normale Altersretention, nicht
|
||
die notwendige lokale oder Remote-Platzbeschaffung. `--check` bleibt ohne
|
||
Bereinigung, Upload oder Remote-Löschung. `--prepare-space` kann diese Schritte
|
||
bereits ausführen und stoppt dabei keine produktiven Writer.
|
||
|
||
Kann das Backend keine brauchbare freie Quote melden, wird dies protokolliert;
|
||
es erfolgt keine Remote-Notbereinigung, der normale Upload wird weiter versucht.
|
||
Signalisierte Abbrüche werden weitergereicht. Bei nicht freigegebener Provider-
|
||
Quote (z. B. verzögerte Abrechnung), ausschließlich geschützten Beständen,
|
||
Remote-Prüffehlern oder einem selbst für einen neuen Satz zu kleinen Dateisystem
|
||
bleibt ein gezielter Abbruch erforderlich. Keine Automatik kann diese Fälle
|
||
sicher durch Löschen der letzten Offsite-Sicherung lösen. Speicherreserve,
|
||
Recovery-Journale, historische Formate, Mounts und unbekannte Daten bleiben geschützt.
|
||
|
||
Installation erfolgt als vollständiges Update-Paket nach
|
||
[UPDATE_ANLEITUNG.md](UPDATE_ANLEITUNG.md). Der dortige alte Abnahmenachweis vom
|
||
19.10. gilt für den damaligen Stand. Der Fix vom 22.10. muss nach Installation
|
||
auf Gemini anhand des nächsten erfolgreichen Backup-Berichts abgenommen werden.
|
||
|
||
### Lokale Prüfung am 22.10.2026
|
||
|
||
Shell-Syntax und ShellCheck bestanden. Von 157 Testfällen bestanden alle 149
|
||
aktivierten Fälle; acht optionale Tests für echten User-systemd beziehungsweise
|
||
Docker-Restore bleiben übersprungen. Die Suite verwendet echte Archive, eine
|
||
isolierte MariaDB und lokale rclone-Crypt-Ziele. Geprüft sind insbesondere ein
|
||
neuer erfolgreicher Backup-/Upload-Lauf nach Freigabe der letzten lokalen Kopie,
|
||
fehlende beziehungsweise beschädigte Offsite-Metadaten, nachgeholte Uploads,
|
||
Quotenbereinigung mit erhaltener neuester Offsite-Sicherung, unveränderte Quote
|
||
nach Purge, unbekannte Quote, Abbruchsignale und die Verwendung komprimierter
|
||
Archivgrößen statt des Snapshotbudgets für die Remote-Platzprüfung.
|
||
Die produktive Installation und Abnahme auf Gemini sind damit nicht ersetzt.
|
||
|
||
Die folgenden datierten Abschnitte dokumentieren frühere Stände; bei abweichenden
|
||
Schutzgrenzen und Upload-Regeln gilt die oben beschriebene Strategie vom 22.10.2026.
|
||
|
||
## Platznot vor dem Backup: Korrektur vom 21.09.2026
|
||
|
||
Der Mailbericht vom 20.09. nennt 55.823.183.174 benötigte und
|
||
47.615.086.592 verfügbare Bytes: Es fehlen 8.208.096.582 Bytes (7,64 GiB).
|
||
Die alte Bereinigung schützt dieselben drei lokalen Kopien wie die reguläre
|
||
Retention. Dadurch kann sie bereits vor dem nächsten Backup blockieren.
|
||
|
||
`SPACE_KEEP_LOCAL=1` setzt jetzt eine eigene Untergrenze für Platznot, auch bei
|
||
bestehender Konfiguration ohne diesen Eintrag. Die neuesten so vielen gültigen,
|
||
als hochgeladen markierten lokalen Sätze bleiben erhalten. `RETENTION_KEEP_LAST=3`
|
||
gilt weiterhin für die normale Retention und wird nicht verändert. Wer die alte
|
||
Grenze ausdrücklich beibehalten möchte, setzt `SPACE_KEEP_LOCAL=3`. Null ist
|
||
unzulässig. Die Reserve `MIN_FREE_GB=10` und die Snapshot-Schätzung bleiben bestehen.
|
||
|
||
Gelöscht wird ältester Satz zuerst, nur bis der Bedarf gedeckt ist und nur nach
|
||
vollständiger lokaler Inhaltsprüfung, Remote-Datei-/Größenvergleich und bytegenauem
|
||
Vergleich von Remote-Manifest und `COMPLETE`. Für die beiden kleinen Kontrolldateien
|
||
gelten dieselben begrenzten Versuche/Zeitlimits; Archive werden nicht heruntergeladen.
|
||
Die geschützten neuesten lokalen Kopien werden zuvor ebenfalls vollständig geprüft.
|
||
Ist eine davon beschädigt oder unvollständig, bleiben alle älteren Kandidaten
|
||
erhalten; ein bloßer `UPLOADED`-Marker genügt nicht als Rückfallabsicherung.
|
||
Signalisierte Abbrüche beenden die Bereinigung, statt weitere Kandidaten zu versuchen.
|
||
Nach jeder Entfernung wird der tatsächlich freie Platz neu gemessen. Mountpoints,
|
||
auch Bind-Mounts einzelner Dateien, werden nicht rekursiv gelöscht.
|
||
|
||
Das schafft Platz, wenn ausreichend bestätigte lokale Kopien vorhanden sind.
|
||
Bei geschützten Beständen, Remote-Fehlern oder einem zu kleinen Datenträger kann
|
||
die Software keinen sicheren Platz erzwingen: Sie bricht vor dem Writer-Stopp ab
|
||
und protokolliert Bedarf, Verfügbarkeit, Defizit sowie verbleibende Archivbestände
|
||
mit belegten Bytes und Schutzgrund. Nicht bestätigte Uploads bleiben erhalten.
|
||
Das Update führt diese Bereinigung bereits vor der Installation aus; sie ist
|
||
daher auch dann wirksam, wenn der bisher installierte Stand nicht mehr starten kann.
|
||
|
||
### Wenn die geschützten Bestände den Platz belegen
|
||
|
||
`preflight.log` beziehungsweise das Backup-Log zeigt, ob bestätigte lokale Sätze
|
||
oder unbestätigte/unklare Bestände übrig sind. Zunächst lesend prüfen:
|
||
|
||
```bash
|
||
sudo du -xhd2 /var/backups/app-backup
|
||
df -h /var/backups/app-backup
|
||
sudo find /var/backups/app-backup/archives -maxdepth 2 -name UPLOADED -printf '%h\n'
|
||
```
|
||
|
||
Unbestätigte vollständige Sätze müssen außerhalb dieses automatischen Ablaufs
|
||
gesondert geprüft und offsite veröffentlicht oder auf einen anderen Datenträger
|
||
verschoben werden. Keinen `UPLOADED`-Marker manuell vortäuschen. Reicht auch danach
|
||
der Platz nicht, das Backup-Dateisystem erweitern oder `WORKDIR`/`STAGING_ROOT`/
|
||
`ARCHIVE_DIR` auf einen ausreichend großen dedizierten Datenträger umstellen.
|
||
Eine Verlagerung erfolgt bei gestoppten Backup-/Restore-/Update-Aufträgen; vorhandene
|
||
Sätze, Besitzrechte und Modus 700 müssen erhalten bleiben. Anschließend
|
||
`--prepare-space` und `--check` mit der neuen Konfiguration ausführen.
|
||
Weder geschützte Recovery-Daten noch die letzte bestätigte lokale Sicherung
|
||
werden als Ausweg automatisch gelöscht.
|
||
|
||
Der auf Gemini gemeldete Abbruch vom 12.09.2026 erfolgte nach dem erfolgreichen
|
||
Wiederanlauf der Dienste, während der Kompression: Unter `/var` waren nur noch
|
||
9,2 GiB frei, die konfigurierte Reserve beträgt 10 GiB. Rund 29 GiB Staging und
|
||
91 GiB Archive belegten denselben Datenträger. Eine reine Reserveprüfung vor dem
|
||
Backup konnte den zusätzlichen Platzbedarf nicht erkennen.
|
||
|
||
## Neuer Ablauf
|
||
|
||
Backup, Restore und Update teilen sich dieselbe Sperre. Vor einem echten Backup
|
||
oder der Update-Vorbereitung werden folgende Schritte ausgeführt:
|
||
|
||
1. Einen unterbrochenen, eindeutig markierten monatlichen Restore-Test bereinigen.
|
||
Eine möglicherweise noch laufende Test-DB wird zuerst entfernt. Ist Docker
|
||
dafür nicht erreichbar, bleiben ihre Dateien geschützt; die Bereinigung meldet
|
||
einen Fehler und der Bereinigungsdienst versucht es erneut.
|
||
2. Erkannte Backup-Arbeitsreste früherer Läufe entfernen. Dazu müssen privates
|
||
Verzeichnis, Laufname, `meta/run-id.txt` und `meta/format.txt` zusammenpassen.
|
||
Das zugehörige unvollständige Archivverzeichnis wird ebenfalls entfernt.
|
||
Damit ist der im Gemini-Log gezeigte Fehlerfall auch aus älteren Paketständen
|
||
erkennbar. Unbekannte Ordner werden nicht anhand ihres Alters gelöscht.
|
||
3. Den Snapshot-Bedarf mit einem rsync-Trockenlauf unter denselben Excludes wie
|
||
beim Backup und einer lesenden DB-Größenabfrage schätzen. Die Planung enthält
|
||
Dateisystem-/Archiv-Metadaten, zusätzliche Dump-/Wachstumsreserven und bei
|
||
gemeinsamem Dateisystem Platz für Snapshot plus Archiv. Erst nach erfolgreicher
|
||
Platzprüfung werden produktive Writer angehalten.
|
||
4. Bei Platzmangel ältere geeignete lokale v2-Sätze prüfen. Nur Sätze mit gültigem
|
||
Manifest, `COMPLETE` und lokalem `UPLOADED` kommen infrage. Die neuesten
|
||
`SPACE_KEEP_LOCAL` geeigneten Kopien bleiben geschützt (Default und Minimum eins).
|
||
Ältere Kandidaten werden lokal vollständig validiert und mit
|
||
`rclone check --size-only` inklusive Manifest und `COMPLETE` auf
|
||
Remote-Dateiexistenz und passende Größen geprüft (ohne Archivdownload). Erst bei erfolgreicher Prüfung wird die lokale
|
||
Kopie entfernt; zusätzlich müssen Remote-Manifest und `COMPLETE` bytegenau
|
||
mit den lokalen Dateien übereinstimmen. Fehlende Remote-Dateien oder Größenabweichungen verhindern die Löschung.
|
||
Gleich große Inhaltsbeschädigungen werden erst beim Restore erkannt. Es wird nur so lange bereinigt, bis der geplante Platz reicht.
|
||
|
||
Diese Offsite-Vergleiche verwenden ebenfalls die begrenzten Prüfanläufe und
|
||
Zeitlimits aus [REMOTE_READBACK.md](REMOTE_READBACK.md). Ein fehlgeschlagener
|
||
Vergleich erlaubt auch nach mehreren Versuchen keine lokale Löschung.
|
||
|
||
Die Platzbereinigung benötigt keinen vorherigen neuen Sicherungslauf. Sie darf
|
||
das lokale Aufbewahrungsalter und `RETENTION_KEEP_LAST` unterschreiten,
|
||
**niemals die eigene Mindestanzahl `SPACE_KEEP_LOCAL`**.
|
||
Sie verändert keine Offsite-Daten. Die normale Altersretention nach einem neuen
|
||
erfolgreichen Backup bleibt davon getrennt. `--no-retention` im Update unterdrückt
|
||
die Altersretention, erlaubt aber weiterhin die hier beschriebene Platzbereinigung.
|
||
|
||
Nach dem Ende des Kopierfensters werden Dienste wie bisher wieder gestartet.
|
||
Während der Kompression wird jede Komponente vollständig als Archiv geprüft;
|
||
danach wird ihre unkomprimierte Arbeitskopie sofort entfernt. Die kleinen
|
||
Metadaten bleiben bis zum Abschluss für Veröffentlichung und Wiedererkennung.
|
||
Der Mailbericht erfasst die ursprünglichen Staging-Größen vor dieser Freigabe.
|
||
|
||
Bei einem fehlgeschlagenen Backup werden dessen Staging und unvollständige Archive
|
||
nach erfolgreicher Dienstwiederherstellung ebenfalls entfernt. Der Fehler bleibt
|
||
im Status und Bericht sichtbar. Ein vollständiger lokaler Satz, dessen Upload
|
||
fehlgeschlagen ist, bleibt erhalten.
|
||
|
||
## Grenzen der automatischen Löschung
|
||
|
||
Folgende Daten bleiben geschützt:
|
||
|
||
- vollständige lokale Sätze ohne bestätigten Upload;
|
||
- die neuesten `SPACE_KEEP_LOCAL` geeigneten lokalen Sicherungen;
|
||
- ein `.partial`-Verzeichnis, das bereits einen `COMPLETE`-Marker enthält;
|
||
- sämtliche Arbeitsreste bei vorhandenem `recovery-*.json` oder angefangener
|
||
Recovery-Datei: zunächst muss der Dienst-/Restore-Zustand geklärt werden;
|
||
- manuell entpackte Restores, historische v1-Archive und unbekannte Verzeichnisse;
|
||
- Symlink-Ziele, eingehängte Dateisysteme, fremde Container, Images und Volumes.
|
||
|
||
Es gibt kein `docker system prune`, keine pauschale Löschung von `/var/backups`
|
||
und keine automatische Entfernung von Paketrollback-Sicherungen. Die entfernte
|
||
lokale Historie wird durch einen Paketrollback nicht wiederhergestellt; ihre
|
||
geprüften Offsite-Kopien stehen weiterhin zum Download bereit.
|
||
|
||
Scheitert die Platzbeschaffung an diesen Grenzen, beendet sich das Backup vor
|
||
dem Anhalten der Writer mit einer konkreten Platzmeldung. Bei Änderungen durch
|
||
andere Prozesse oder ungewöhnlich wachsenden Dumps können spätere Prüfungen
|
||
trotzdem scheitern. Die Schätzung ist keine Dateisystemquote. Fehler bei produktiver
|
||
Dienstwiederherstellung oder einem echten Restore erfordern weiterhin einen
|
||
Admin; sie werden nicht durch automatisches Löschen oder Neustarten verdeckt.
|
||
|
||
Ein bereits vollständig lokaler, aber noch nicht hochgeladener Satz wird nicht
|
||
automatisch nachträglich hochgeladen. Solche Sätze bleiben bei wiederholten
|
||
Remote-Ausfällen erhalten und können einen Eingriff nötig machen.
|
||
|
||
## Restore und MariaDB-Vorbereitung
|
||
|
||
Der monatliche Restore-Test verarbeitet alle Komponenten einzeln. Standardmäßig
|
||
begrenzt `RESTORE_TEST_MAX_WORK_GB=0` das Arbeitsvolumen anhand der tatsächlich
|
||
freien Kapazität bei mindestens `RESTORE_TEST_MIN_FREE_GB=2` GiB Reserve. Ein
|
||
positiver Wert setzt zusätzlich eine feste Obergrenze. Die Update-Option
|
||
`--enable-restore-test` aktiviert den Test und setzt ausdrücklich das adaptive
|
||
Budget; ohne diese Option bleibt eine bestehende feste Grenze erhalten.
|
||
|
||
Vor Download und Entpacken versucht der Test bei Platzmangel die oben beschriebene
|
||
lokale Bereinigung. Während des laufenden Imports werden Grenzen überwacht;
|
||
bei Unterschreitung wird abgebrochen und bereinigt. Dabei werden nicht nebenher
|
||
Sicherungen gelöscht. Vorbereitete MariaDB-Images bleiben zur Wiederverwendung
|
||
erhalten. Ein Image-Download prüft zusätzlich Platz auf dem Docker-Dateisystem.
|
||
|
||
`app-restore.sh --remote-run ... --verify-only` lädt jeweils nur ein komprimiertes
|
||
Archiv herunter, validiert es vollständig und entfernt es sofort. Lokale
|
||
`--verify-only`-Aufrufe prüfen den Satz direkt ohne Kopie. Bei Fehlern werden die
|
||
eigenen Prüftemporärdateien entfernt; neue abgebrochene Download-Prüfungen sind
|
||
durch einen Marker beim nächsten Lauf erkennbar. Manuelle `--extract-only`- und
|
||
produktive `--apply`-Restores benötigen weiterhin Platz für ihren vollständigen
|
||
Arbeitsbestand; zusätzliche Kopier- und Entpackgrößen werden vorab geprüft. Ihre Daten werden bei Fehlern zur Prüfung erhalten und nicht
|
||
automatisch als Testreste gelöscht. Eine ausgewählte lokale Restore-Quelle ist
|
||
von der Platzbereinigung ausgenommen.
|
||
|
||
## Vorgehen auf Gemini
|
||
|
||
Das neue Update-Paket wie in [UPDATE_ANLEITUNG.md](UPDATE_ANLEITUNG.md) mit
|
||
`--enable-restore-test` starten. Es bereinigt vor der Vorprüfung erkannte alte
|
||
Arbeitsreste, bereitet MariaDB vor und führt Backup mit Remote-Dateiprüfung
|
||
aus. Nach erfolgreicher Update-Abnahme aktiviert es die Timer; der vollständige
|
||
Restore-Test folgt beim Monatstermin. Der alte fehlgeschlagene Update-Ordner
|
||
bleibt als Diagnose-/Rollback-Nachweis erhalten; ein pauschales `rm` ist unnötig.
|
||
|
||
Nach bereits erfolgter Installation kann die Platzvorbereitung separat gestartet
|
||
werden. Dieser Befehl **bereinigt tatsächlich** nach den obigen Regeln, erstellt
|
||
aber kein Backup und hält keine Anwendungen an:
|
||
|
||
```bash
|
||
sudo bash /usr/local/sbin/app-backup.sh --prepare-space
|
||
sudo bash /usr/local/sbin/app-backup.sh --check
|
||
df -h /var/backups/app-backup
|
||
```
|
||
|
||
`--check` allein bleibt eine Prüfung ohne Bereinigung. Vollständige
|
||
lokale Inhaltsprüfungen können dauern; remote werden nur Dateiexistenz und Größen geprüft. Der Starter
|
||
nennt sein Verzeichnis mit `preflight.log`; der spätere Worker schreibt `update.log`
|
||
und `result.txt`. `SUCCESS` im aktuellen `result.txt` bestätigt das Update; der
|
||
Restore-Teststatus ist ein separater Nachweis nach dem Monatslauf. Scheitert ein Update trotz der
|
||
sicheren Bereinigung, bleiben die Timer nach begonnener Installation gestoppt;
|
||
der Fehler muss behoben und das Paket erneut ausgeführt werden.
|
||
|
||
## Gemini: historische Archive erhalten, Staging trennen – 18.10.2026
|
||
|
||
**Am 19.10.2026 produktiv abgenommen:** Revision 2 beendete die Verlagerung und
|
||
beide Preflights am 18.10. um 17:22:34 MESZ erfolgreich. Der anschließend gestartete
|
||
Lauf `appbackup_2026-10-18_15-22-34_fe0edb31` endete am 19.10. um 03:53:28 MESZ
|
||
mit `SUCCESS`, `Result=success` und Status 0. Die durch Johannes ausgeführte
|
||
ursprüngliche Root-Diagnose bestätigte rund 48 GB
|
||
historische flache Archive sowie drei vollständige lokale Sätze ohne `UPLOADED`.
|
||
Die Platzprüfung des Nachtlaufs bricht vor dem Snapshot ab. Diese Daten werden
|
||
nicht als automatische Löschkandidaten freigegeben.
|
||
|
||
`operations/gemini_backup_repair.py` ist eine feste Gemini-Operation. Sie wird
|
||
zusammen mit der ACME-Reparatur aus dem ai-rem-maintenance-Paket gestartet:
|
||
|
||
```bash
|
||
sudo bash /var/tmp/resume-gemini-repair-20261018.sh
|
||
sudo journalctl -fu jr-gemini-repair-20261018-r2.service --no-pager
|
||
```
|
||
|
||
Der einmalige Hintergrundauftrag erfordert das Betreiberpasswort. Quellen,
|
||
Prüfsumme und vollständiger Ablauf stehen im
|
||
[Wartungsrepository](https://gitea.jr-it-services.de/johannes/ai-rem-maintenance).
|
||
|
||
Die Speicheroperation erhält die bisherigen Archive wie folgt:
|
||
|
||
- Historische flache Archive und bei Bedarf ältere vollständige, nicht als
|
||
hochgeladen bestätigte Sätze werden auf die freie Root-Partition unter
|
||
`/srv/app-backup-preserved-20261018/` **verlagert**. Quelle und Ziel jeder Datei
|
||
werden mit SHA-256 sowie rsync-Metadatenprüfung verglichen und Zielzustand
|
||
synchronisiert. Das ursprüngliche Objekt wird erst danach entfernt; die
|
||
Sicherung bleibt unter ihrem bisherigen Namen am neuen Ort erhalten.
|
||
- Bestätigte aktuelle lokale Sätze bleiben im aktiven Archivverzeichnis. Die
|
||
Verlagerung macht aus unbestätigten Sätzen keine bestätigten Uploads. Unter
|
||
`/var/lib/jr-app-backup-space-20261018/` liegen ursprüngliche Konfiguration,
|
||
Planung und ein Prüfnachweis mit Quell-/Zielort pro Objekt, ausschließlich root-
|
||
lesbar. Alte Pfade nach einer erfolgreichen Verlagerung nicht weiterverwenden.
|
||
- `STAGING_ROOT` wechselt nach erfolgreicher Prüfung auf
|
||
`/home/.app-backup-staging`; `ARCHIVE_DIR` bleibt unter `/var`. Neue und alte
|
||
Pfade dürfen keine Backup-Quellen einschließen oder in Quellen liegen.
|
||
- Die normale gemeinsame Backup-Sperre wird gehalten. Bestehende Recovery-Marker,
|
||
belegtes Staging, unbekannte Zielkopien, Symlinks, Hardlinks, fremde Besitzer,
|
||
beschreibbare Archive und zu wenig Platz führen zum Abbruch. Vor der
|
||
Konfigurationsaktivierung laufen die echten `--prepare-space`- und `--check`-
|
||
Prüfungen mit der vorgeschlagenen Konfiguration und geerbter echter Sperre.
|
||
- `MIN_FREE_GB`, Aufbewahrung und Schätzung bleiben unverändert. Auf `/` verbleiben
|
||
mindestens die konfigurierte Reserve plus 2 GiB. Auf `/var` wird Platz für das
|
||
aktuell geschätzte Snapshotbudget plus Reserve plus 10 GiB zusätzlichen
|
||
Spielraum geschaffen. Die aktuelle Live-Schätzung ist trotzdem maßgeblich.
|
||
|
||
Danach wird der normale `app-backup.service` gestartet. Der erfolgreiche
|
||
Reparaturauftrag bestätigt nur die Vorbereitung und das Einreihen dieses Laufs.
|
||
Erst dessen `SUCCESS` einschließlich Offsite-Prüfung bestätigt die Backup-Abnahme.
|
||
Der Kopier-/Dumpabschnitt hält wie bisher die konfigurierten Writer kurz an.
|
||
|
||
Bei Teilfehlern bleiben verifizierte Zielkopien erhalten. Die alte Konfiguration
|
||
wird bis zum erfolgreichen Preflight nicht ersetzt. Eine Rücknahme der
|
||
Konfiguration allein stellt verlagerten Bestand und freien Platz nicht zurück;
|
||
kein blindes Zurückkopieren oder Löschen. Den Nachweis pro Objekt zur gezielten
|
||
Wiederherstellung beziehungsweise Auswahl historischer Restore-Quellen nutzen.
|
||
|
||
Acht lokale Tests prüfen Datei- und Verzeichnisverlagerung, Kopierkorruption
|
||
mit erhaltenem Original, Schutz vor Quellenüberschneidung/Links und Platzreserve.
|
||
Die produktive Backup-Abnahme ist bestätigt; ein vollständiger Restore-Test
|
||
steht weiterhin aus.
|
||
|
||
### Abschlussprüfung am 19.10.2026
|
||
|
||
Das Serverjournal bestätigt SHA-256-/Metadatenprüfung der verlagerten Objekte,
|
||
die neue Staging-Konfiguration und erfolgreiche echte Preflights. Das neue Backup
|
||
enthält 16 Komponentenarchive und das Manifest (32,053 GiB Upload). Alle 17 Dateien
|
||
bestanden die Remote-Datei-/Größenprüfung mit null Unterschieden; der zuletzt
|
||
veröffentlichte Abschlussmarker wurde bestätigt. Es erfolgte kein vollständiges
|
||
Rücklesen der Archive. Die Erfolgsmail wurde dem lokalen MTA übergeben; eine
|
||
Zustellung beim Empfänger ist damit nicht nachgewiesen.
|
||
|
||
Die Writer-Prüfung bestand; Nextcloud verließ den Wartungsmodus. Die angehaltenen
|
||
Anwendungen und ai-rem-Timer wurden bis 17:29:00 MESZ wieder gestartet. Bei der
|
||
Abschlussprüfung laufen Web, Datenbank, Mail, Gitea, Cron und ai-rem. Backup- und
|
||
Restore-Test-Timer sind aktiviert und aktiv. Nächste Termine laut systemd:
|
||
Backup 20.10.2026 gegen 02:34 MESZ, Restore-Test 01.11.2026 gegen 06:02 MEZ.
|
||
Freier Platz: `/` rund 14 GiB, `/home` 77 GiB, `/var` 51 GiB.
|
||
|
||
Der erste reguläre ai-rem-Update-Lauf bestand am 19.10.2026 von 05:23:43 bis
|
||
05:23:54 MESZ einschließlich eigener Sicherung mit Gzip-/SHA-256-Prüfung,
|
||
Cache-Prüfung und Versionsvergleich (1.10.3 aktuell, keine Probleme).
|
||
Nur die alte fehlgeschlagene Reparatur-Unit der ersten Revision bleibt in
|
||
`systemctl --failed` sichtbar; Revision 2 und der Backup-Lauf sind erfolgreich.
|
||
|
||
### Fortsetzung nach Certbot-Abbruch
|
||
|
||
Der erste Auftrag vom 18.10.2026 scheiterte bei Certbot, bevor die
|
||
Speicheroperation begann. Revision 2 schätzt den aktuellen Bedarf lesend aus
|
||
rsync-Dateistatistiken mit denselben Excludes und aus DB-Größen. Dateimetadaten,
|
||
SQL-Ausdehnung und Wachstumsreserve entsprechen dem bestehenden Backup-Programm.
|
||
Ältere Journalzeilen werden dafür nicht benötigt; die vorhandenen echten
|
||
`--prepare-space`-/`--check`-Prüfungen bleiben die abschließende Voraussetzung.
|