diff --git a/backup_named_volumes.sh b/backup_named_volumes.sh index 445f6d2..7314108 100644 --- a/backup_named_volumes.sh +++ b/backup_named_volumes.sh @@ -2,72 +2,37 @@ set -euo pipefail -WORKDIR="${1:-$(pwd)}" -COMPOSE_FILE="${WORKDIR}/docker-compose.yml" +PROJECT_NAME=$(basename "$(pwd)") +echo "📦 Docker Compose project: $PROJECT_NAME" -echo "DEBUG: Looking for Compose file at $COMPOSE_FILE" -ls -l "$COMPOSE_FILE" || echo "⚠️ File not found!" +# Get all named volumes for this project +VOLUMES=$(docker volume ls --format '{{.Name}}' | grep "^${PROJECT_NAME}_") - -if [[ ! -f "$COMPOSE_FILE" ]]; then - echo "❌ No docker-compose.yml found in $WORKDIR" +if [[ -z "$VOLUMES" ]]; then + echo "❌ No volumes found for project '$PROJECT_NAME'" exit 1 fi -# Determine project name (Docker Compose style) -PROJECT_NAME=$(basename "$WORKDIR") -echo "📦 Working in (${PROJECT_NAME})" +for FULL_VOL in $VOLUMES; do + SHORT_VOL="${FULL_VOL#${PROJECT_NAME}_}" -# Get original user details (in case script is run via sudo -E or similar) -ORIGINAL_USER="${SUDO_USER:-$USER}" -ORIGINAL_UID=$(id -u "$ORIGINAL_USER") -ORIGINAL_GID=$(id -g "$ORIGINAL_USER") + VOLUME_PATH="/var/lib/docker/volumes/${FULL_VOL}/_data" + OUTPUT_FILE="${SHORT_VOL}.tar.gz" -# Get services -SERVICE_NAMES=$(sudo yq e '.services | keys | .[]' "$COMPOSE_FILE") + echo "📁 Found volume: $SHORT_VOL" + read -rp "→ Backup this volume to ${OUTPUT_FILE}? (Y/n) " REPLY + REPLY=${REPLY:-Y} -for SERVICE in $SERVICE_NAMES; do - echo "🔍 Found service (${SERVICE})" - - # Get service volumes - VOLUMES=$(sudo yq e ".services.${SERVICE}.volumes[]" "$COMPOSE_FILE" 2>/dev/null || true) - - while IFS= read -r VOLUME; do - # Clean up quotes/whitespace - VOLUME=$(echo "$VOLUME" | sed 's/^"//;s/"$//;s/^[[:space:]]*//;s/[[:space:]]*$//') - - # Skip bind mounts - if [[ "$VOLUME" == ./* || "$VOLUME" == /* ]]; then + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + if [[ ! -d "$VOLUME_PATH" ]]; then + echo "⚠️ Volume path not found: $VOLUME_PATH" continue fi - SOURCE=$(echo "$VOLUME" | cut -d':' -f1) - echo "📁 Found named volume (${SOURCE})" - - read -rp "→ Tar.gz and save as ${SOURCE}.tar.gz? (Y/n) " REPLY - REPLY=${REPLY:-Y} - - if [[ "$REPLY" =~ ^[Yy]$ ]]; then - VOLUME_PATH="/var/lib/docker/volumes/${PROJECT_NAME}_${SOURCE}/_data" - OUTPUT_FILE="${WORKDIR}/${SOURCE}.tar.gz" - - if ! sudo test -d "$VOLUME_PATH"; then - echo "⚠️ Volume path not found: $VOLUME_PATH" - continue - fi - - echo "📦 Backing up $VOLUME_PATH → $OUTPUT_FILE" - - # Use sudo to read, but write file as your user - sudo tar -czf "$OUTPUT_FILE" -C "$VOLUME_PATH" . - - # Fix ownership in case sudo did anything funny - chown "$ORIGINAL_UID:$ORIGINAL_GID" "$OUTPUT_FILE" - - echo "✅ Backup done: $OUTPUT_FILE" - else - echo "⏭️ Skipping ${SOURCE}" - fi - - done <<< "$VOLUMES" + echo "📦 Backing up $VOLUME_PATH → $OUTPUT_FILE" + sudo tar -czf "$OUTPUT_FILE" -C "$VOLUME_PATH" . + echo "✅ Done." + else + echo "⏭️ Skipped $SHORT_VOL" + fi done