fix(restore): nextcloud dump from host path instead of borg extract

Erstlauf 2026-06-03: borg_extract fuer den Nextcloud-Dump scheiterte
still (Pfad local/borg-dumps/latest/nextcloud.dump existiert im
Archiv moeglicherweise unter einem anderen Prefix). Der Dump liegt
taeglich frisch auf dem Host unter /mnt/user/backups/borg/dumps/latest/
und wird von dort in Borg gesichert - der Smoke-Wert ist identisch.

HTML (App-Code + config) kommt weiterhin aus dem Borg-Archiv.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 11:03:45 +02:00
parent 5d1ae68705
commit 6fec64d0a1
+16 -15
View File
@@ -50,9 +50,9 @@ Mode: WhatIf
RestoreRoot: $RESTORE_ROOT RestoreRoot: $RESTORE_ROOT
ReportRoot: $REPORT_ROOT ReportRoot: $REPORT_ROOT
Expected Borg source paths: Expected Borg source paths:
- local/appdata/nextcloud/html - local/appdata/nextcloud/html (aus Borg-Archiv)
- local/documents/nextcloud-data (nur Strukturpruefung, nicht das volle Nutzdatenvolumen) Host source paths:
- local/borg-dumps/latest/nextcloud.dump - /mnt/user/backups/borg/dumps/latest/nextcloud.dump (vom Host, taeglich frisch)
Planned isolation: Planned isolation:
- Test-Postgres: postgres:18.4 mit Wegwerf-Credentials - Test-Postgres: postgres:18.4 mit Wegwerf-Credentials
- Test-Redis: redis:8.8.0-alpine (rebuildbar, kein Restore) - Test-Redis: redis:8.8.0-alpine (rebuildbar, kein Restore)
@@ -99,28 +99,29 @@ if [ -z "$archive" ] || [ -z "$repo" ]; then
exit 1 exit 1
fi fi
# Stufe 1: Nextcloud-App-Pfade und Dump aus Borg extrahieren. # Stufe 1: Nextcloud-App-Pfade aus Borg, Dump vom Host.
# Wir extrahieren html (App-Code + config) und den Dump. # HTML (App-Code + config) kommt aus dem Borg-Archiv.
# Nutzdaten (local/documents/nextcloud-data) extrahieren wir NUR das # Der Dump liegt frisch auf dem Host unter /mnt/user/backups/borg/dumps/latest/
# Verzeichnis-Listing (--strip-components wuerde hier nicht helfen), # (wird taeglich von pre-backup-dumps.sh erzeugt und dann in Borg gesichert).
# um zu pruefen, dass der Pfad im Archiv existiert. Die vollen # Der Borg-Extract des Dumps wuerde dieselbe Datei liefern, braucht aber eine
# Nutzdaten sind zu gross fuer einen regelmaessigen Smoke. # eigene Remote-Roundtrip-Zeit; wir nutzen die Host-Kopie direkt.
DUMP_HOST_PATH="/mnt/user/backups/borg/dumps/latest/nextcloud.dump"
borg_extract "/restore/nextcloud-extract" \ borg_extract "/restore/nextcloud-extract" \
"local/appdata/nextcloud/html" \ "local/appdata/nextcloud/html"
"local/borg-dumps/latest/nextcloud.dump"
if [ ! -d "$EXTRACT_DIR/local/appdata/nextcloud/html" ]; then if [ ! -d "$EXTRACT_DIR/local/appdata/nextcloud/html" ]; then
echo "Nextcloud html path missing in Borg archive" >&2 echo "Nextcloud html path missing in Borg archive" >&2
exit 1 exit 1
fi fi
if [ ! -f "$EXTRACT_DIR/local/borg-dumps/latest/nextcloud.dump" ]; then if [ ! -f "$DUMP_HOST_PATH" ]; then
echo "nextcloud.dump missing in Borg archive" >&2 echo "nextcloud.dump missing on host at $DUMP_HOST_PATH" >&2
exit 1 exit 1
fi fi
# App-Code + Config ins Restore-Lab verschieben # App-Code + Config ins Restore-Lab verschieben
cp -a "$EXTRACT_DIR/local/appdata/nextcloud/html/." "$RESTORE_ROOT/html/" cp -a "$EXTRACT_DIR/local/appdata/nextcloud/html/." "$RESTORE_ROOT/html/"
mv "$EXTRACT_DIR/local/borg-dumps/latest/nextcloud.dump" "$RESTORE_ROOT/dumps/latest/nextcloud.dump" cp "$DUMP_HOST_PATH" "$RESTORE_ROOT/dumps/latest/nextcloud.dump"
# Nextcloud braucht einen beschreibbaren data-Pfad, auch wenn er leer ist. # Nextcloud braucht einen beschreibbaren data-Pfad, auch wenn er leer ist.
# Im Restore-Lab ist das /mnt/user/backups/restore-lab/nextcloud/data. # Im Restore-Lab ist das /mnt/user/backups/restore-lab/nextcloud/data.
@@ -265,7 +266,7 @@ write_report "$REPORT_FILE" <<EOF
## Checks ## Checks
- Borg extract of html: \`ok\` - Borg extract of html: \`ok\`
- Borg extract of dump: \`ok\` - Host dump copy: \`ok\`
- config.php patched for test DB: \`$config_patched\` - config.php patched for test DB: \`$config_patched\`
- Dump import into isolated Postgres: \`ok\` - Dump import into isolated Postgres: \`ok\`
- HTTP status from /status.php: \`$http_status\` - HTTP status from /status.php: \`$http_status\`