fix: die Sicherung liess den Papierkorb aus -- ein Versprechen, das sie nicht halten konnte

GEFUNDEN BEIM NACHSEHEN, nicht beim Suchen: das Sicherungsskript packte

    tar czf ... -C /data files -C /data/.sicherung media.db

also die Bilder und die Datenbank. Die EINTRAEGE des Papierkorbs stehen in
media.db und waren damit laengst gesichert -- die DATEIEN lagen unter
/data/papierkorb und waren es nicht.

Nach einem Zurueckspielen haette der Papierkorb also Zeilen gezeigt, deren
"zurueckholen" ins Leere greift: die Oberflaeche verspricht etwas, das die
Platte nicht hergibt. Genau die Sorte stiller Abweichung, wegen der dieses
Projekt Sicherungen ueberhaupt gegenprueft.

Er ist jetzt im Archiv, und er kostet fast nichts: was darin liegt, ist
hoechstens 30 Tage alt, danach raeumt der Dienst selbst auf. Die Abfrage
`if [ -d /data/papierkorb ]` davor ist noetig -- hat noch nie jemand etwas
geloescht, gibt es den Ordner gar nicht, und tar braeche mit "Cannot stat" ab.
Ein `mkdir` als Ausweg ginge nicht: das Volume haengt nur lesend.

Gemessen an einem echten Lauf, nicht angenommen:

    d4rk_media-2026-08-11-2307.tar.gz -- 311,9 MB
    in der Sicherung: 4452 Medieneintraege, 4452 Dateien, 2 Token, 2 Benutzer
    hochgeladen (201), zurueckgeholt und verglichen: identisch
    Inhalt:  4459 files/   1 media.db   1 papierkorb/

UND DER PAPIERKORB SAGT ES JETZT SELBST. Die Liste prueft je Zeile, ob die
Datei wirklich noch daliegt (hoechstens 500 stat-Aufrufe), und zeigt fehlende
durchgestrichen samt Erklaerung. Die Sicherung nimmt ihn zwar inzwischen mit --
aber ein Papierkorb, der etwas verspricht, muss es halten koennen, und wenn
nicht, soll er es SAGEN statt es beim Druecken herauszufinden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 23:11:38 +02:00
co-authored by Claude Opus 5
parent 92b49a59a5
commit 06e924daf5
5 changed files with 94 additions and 15 deletions
+22 -5
View File
@@ -114,13 +114,29 @@ $erwartet = if ($ausgabe -match '(\d+) Medieneintraege') { [int]$Matches[1] } el
# -- 2. Alles in ein Archiv ----------------------------------------------------
Schritt 'Bilder und Datenbank packen'
# Zwei -C: die Bilder kommen als files/... in das Archiv, die Aufnahme als
# media.db daneben. Bewusst das eigene Abbild statt alpine -- dort ist GNU tar
# drin, und das kann mehrere -C.
# Drei -C: die Bilder kommen als files/... in das Archiv, die Aufnahme als
# media.db daneben, und der Papierkorb als papierkorb/. Bewusst das eigene
# Abbild statt alpine -- dort ist GNU tar drin, und das kann mehrere -C.
#
# DER PAPIERKORB MUSS MIT, und das ist nachgerechnet und nicht Vorsicht: seine
# EINTRAEGE stehen in media.db und waren damit laengst gesichert -- die DATEIEN
# lagen unter /data/papierkorb und waren es nicht. Nach einem Zurueckspielen
# haette der Papierkorb also Zeilen gezeigt, deren "zurueckholen" ins Leere
# greift. Ein Papierkorb, der ein Versprechen gibt, das er nach einer
# Wiederherstellung nicht halten kann, ist schlimmer als keiner.
#
# Er kostet fast nichts: was darin liegt, ist hoechstens 30 Tage alt, danach
# raeumt der Dienst selbst auf.
#
# Die Abfrage davor ist noetig: hat noch nie jemand etwas geloescht, gibt es den
# Ordner gar nicht, und tar braeche mit "Cannot stat" ab. Eine Sicherung, die
# daran scheitert, dass nichts im Papierkorb liegt, waere absurd. Das Volume
# haengt NUR LESEND -- ein `mkdir` als Ausweg ginge hier also ohnehin nicht.
$packen = "if [ -d /data/papierkorb ]; then tar czf '/out/$name' -C /data files -C /data/.sicherung media.db -C /data papierkorb; else tar czf '/out/$name' -C /data files -C /data/.sicherung media.db; fi"
docker run --rm `
-v "${Volume}:/data:ro" `
-v "${Ziel}:/out" `
--entrypoint sh $Abbild -c "tar czf '/out/$name' -C /data files -C /data/.sicherung media.db"
--entrypoint sh $Abbild -c $packen
if ($LASTEXITCODE -ne 0) { Schlecht 'Packen fehlgeschlagen.'; exit 1 }
# Die Zwischenaufnahme im Volume wieder weg: sie gehoert nicht zum Bestand und
@@ -315,5 +331,6 @@ Melde $true $zahlen.media $groesse $inDerWolke $null
Write-Host ''
Gut "Fertig: $archiv"
Write-Host " Zurueckspielen: tar xzf <archiv>, dann media.db und files/ ins Volume legen," -ForegroundColor DarkGray
Write-Host " Zurueckspielen: tar xzf <archiv>, dann media.db, files/ und papierkorb/" -ForegroundColor DarkGray
Write-Host " ins Volume legen," -ForegroundColor DarkGray
Write-Host " waehrend der Container steht. Siehe ROADMAP." -ForegroundColor DarkGray