diff --git a/backend/backup.py b/backend/backup.py index 87d795c..544bd4e 100644 --- a/backend/backup.py +++ b/backend/backup.py @@ -141,17 +141,22 @@ if [ -d "$P_DIR" ]; then fi echo "--- Performing zero-lock hot-backup of SQLite databases on VPS ---" -# Search in P_DIR, P_DIR/config, and $(dirname P_DIR) -for search_path in "$P_DIR" "$P_DIR/config" "$(dirname "$P_DIR")"; do - if [ -d "$search_path" ]; then - for db in $(find "$search_path" -maxdepth 2 -name "*.db" -o -name "*.sqlite" 2>/dev/null); do - dbname=$(basename "$db") - echo "Hot-backing up database: $dbname (source: $db)..." - mkdir -p "{remote_stage}/pangolin/config" - sqlite3 "$db" ".backup '{remote_stage}/pangolin/config/$dbname'" 2>/dev/null || cp -v "$db" "{remote_stage}/pangolin/config/$dbname" - done - fi +if [ -d "$P_DIR/config" ]; then + TARGET_BASE="{remote_stage}/pangolin/config" + SEARCH_BASE="$P_DIR/config" +else + TARGET_BASE="{remote_stage}/pangolin" + SEARCH_BASE="$P_DIR" +fi + +for db in $(find "$SEARCH_BASE" -maxdepth 4 -name "*.db" -o -name "*.sqlite" 2>/dev/null); do + rel=$(realpath --relative-to="$SEARCH_BASE" "$db") + mkdir -p "$TARGET_BASE/$(dirname "$rel")" + echo "Hot-backing up SQLite database: $rel..." + sqlite3 "$db" ".backup '$TARGET_BASE/$rel'" 2>/dev/null || cp -v "$db" "$TARGET_BASE/$rel" done +# Clean dangling lock/WAL files in staging archive +find "" -name "*.db-wal" -delete -o -name "*.db-shm" -delete 2>/dev/null || true # Backup any named Docker volumes attached to pangolin containers for vol in $(docker inspect --format '{{{{range .Mounts}}}}{{{{if eq .Type "volume"}}}}{{{{.Source}}}}{{{{"\\n"}}}}{{{{end}}}}{{{{end}}}}' $(docker ps -aq --filter "name=pangolin" 2>/dev/null) 2>/dev/null); do