Update backup_named_volumes.sh
This commit is contained in:
@@ -2,72 +2,37 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
WORKDIR="${1:-$(pwd)}"
|
PROJECT_NAME=$(basename "$(pwd)")
|
||||||
COMPOSE_FILE="${WORKDIR}/docker-compose.yml"
|
echo "📦 Docker Compose project: $PROJECT_NAME"
|
||||||
|
|
||||||
echo "DEBUG: Looking for Compose file at $COMPOSE_FILE"
|
# Get all named volumes for this project
|
||||||
ls -l "$COMPOSE_FILE" || echo "⚠️ File not found!"
|
VOLUMES=$(docker volume ls --format '{{.Name}}' | grep "^${PROJECT_NAME}_")
|
||||||
|
|
||||||
|
if [[ -z "$VOLUMES" ]]; then
|
||||||
if [[ ! -f "$COMPOSE_FILE" ]]; then
|
echo "❌ No volumes found for project '$PROJECT_NAME'"
|
||||||
echo "❌ No docker-compose.yml found in $WORKDIR"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Determine project name (Docker Compose style)
|
for FULL_VOL in $VOLUMES; do
|
||||||
PROJECT_NAME=$(basename "$WORKDIR")
|
SHORT_VOL="${FULL_VOL#${PROJECT_NAME}_}"
|
||||||
echo "📦 Working in (${PROJECT_NAME})"
|
|
||||||
|
|
||||||
# Get original user details (in case script is run via sudo -E or similar)
|
VOLUME_PATH="/var/lib/docker/volumes/${FULL_VOL}/_data"
|
||||||
ORIGINAL_USER="${SUDO_USER:-$USER}"
|
OUTPUT_FILE="${SHORT_VOL}.tar.gz"
|
||||||
ORIGINAL_UID=$(id -u "$ORIGINAL_USER")
|
|
||||||
ORIGINAL_GID=$(id -g "$ORIGINAL_USER")
|
|
||||||
|
|
||||||
# Get services
|
echo "📁 Found volume: $SHORT_VOL"
|
||||||
SERVICE_NAMES=$(sudo yq e '.services | keys | .[]' "$COMPOSE_FILE")
|
read -rp "→ Backup this volume to ${OUTPUT_FILE}? (Y/n) " REPLY
|
||||||
|
REPLY=${REPLY:-Y}
|
||||||
|
|
||||||
for SERVICE in $SERVICE_NAMES; do
|
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
|
||||||
echo "🔍 Found service (${SERVICE})"
|
if [[ ! -d "$VOLUME_PATH" ]]; then
|
||||||
|
echo "⚠️ Volume path not found: $VOLUME_PATH"
|
||||||
# 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
|
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SOURCE=$(echo "$VOLUME" | cut -d':' -f1)
|
echo "📦 Backing up $VOLUME_PATH → $OUTPUT_FILE"
|
||||||
echo "📁 Found named volume (${SOURCE})"
|
sudo tar -czf "$OUTPUT_FILE" -C "$VOLUME_PATH" .
|
||||||
|
echo "✅ Done."
|
||||||
read -rp "→ Tar.gz and save as ${SOURCE}.tar.gz? (Y/n) " REPLY
|
else
|
||||||
REPLY=${REPLY:-Y}
|
echo "⏭️ Skipped $SHORT_VOL"
|
||||||
|
fi
|
||||||
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"
|
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user