#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" . "$SCRIPT_DIR/common.sh" WHATIF=0 KEEP_DATA=0 for arg in "$@"; do case "$arg" in --what-if) WHATIF=1 ;; --keep-data) KEEP_DATA=1 ;; *) echo "Unknown argument: $arg" >&2; exit 1 ;; esac done RESTORE_ROOT="/mnt/user/backups/restore-lab/paperless" REPORT_ROOT="/mnt/user/backups/restore-reports" EXTRACT_DIR="$BORG_RESTORE_HOST_ROOT/paperless-extract" COMPOSE_FILE="$SCRIPT_DIR/paperless-compose.test.yml" REPORT_FILE="$REPORT_ROOT/paperless-$(date +%F).md" if [ "$WHATIF" -eq 1 ]; then cat </dev/null until docker exec restoretest-paperless-postgres pg_isready -U paperless -d paperless >/dev/null 2>&1; do sleep 2; done # Postgres-Entrypoint kann kurz nach "ready" noch vom Init- auf den finalen # Server wechseln. pg_restore toleriert transiente Start-/Shutdown-Fehler und # retried; harte Fehler (z. B. Dump-Korruption) brechen wie bisher ab. restore_ok=0 for attempt in $(seq 1 12); do if docker exec -i restoretest-paperless-postgres \ pg_restore -U paperless -d paperless --clean --if-exists --no-owner --no-privileges \ < "$RESTORE_ROOT/dumps/latest/postgresql17-paperless.dump" 2>/tmp/paperless-pg-restore.err; then restore_ok=1 break fi if grep -qiE "starting up|shutting down|connection refused|database .* does not exist" /tmp/paperless-pg-restore.err; then sleep 5 continue fi cat /tmp/paperless-pg-restore.err >&2 exit 1 done if [ "$restore_ok" -ne 1 ]; then cat /tmp/paperless-pg-restore.err >&2 exit 1 fi docker compose -f "$COMPOSE_FILE" up -d restoretest-paperless >/dev/null sleep 12 status="$(curl -s -o /tmp/paperless-body.html -w '%{http_code}' -L http://127.0.0.1:18120)" grep -qi "Paperless-ngx sign in" /tmp/paperless-body.html doc_count="$(docker exec restoretest-paperless-postgres psql -U paperless -d paperless -tAc "select count(*) from documents_document;" | tr -d '[:space:]')" doc_sample="$(find "$RESTORE_ROOT/media/documents/originals" -type f | sed -n '1p')" write_report "$REPORT_FILE" < $REPORT_FILE"