refactor: Enhance backup and restore scripts for container data (#7055)

* refactor: enhance backup and restore scripts for container data management

* fix: ensure proper quoting in backup script to handle paths with spaces

* fix: ensure backup directory is only removed if tar command succeeds

* CodeRabbit fixes
This commit is contained in:
Manish Gupta 2025-05-14 12:33:53 +05:30 committed by GitHub
parent 4c3f7f27a5
commit 080cf70e3f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 52 additions and 24 deletions

View file

@ -508,43 +508,69 @@ function viewLogs(){
echo "INVALID SERVICE NAME SUPPLIED" echo "INVALID SERVICE NAME SUPPLIED"
fi fi
} }
function backupSingleVolume() { function backup_container_dir() {
backupFolder=$1 local BACKUP_FOLDER=$1
selectedVolume=$2 local CONTAINER_NAME=$2
# Backup data from Docker volume to the backup folder local CONTAINER_DATA_DIR=$3
# docker run --rm -v "$selectedVolume":/source -v "$backupFolder":/backup busybox sh -c 'cp -r /source/* /backup/' local SERVICE_FOLDER=$4
local tobereplaced="plane-app_"
local replacewith=""
local svcName="${selectedVolume//$tobereplaced/$replacewith}" echo "Backing up $CONTAINER_NAME data..."
local CONTAINER_ID=$(/bin/bash -c "$COMPOSE_CMD -f $DOCKER_FILE_PATH ps -q $CONTAINER_NAME")
if [ -z "$CONTAINER_ID" ]; then
echo "Error: $CONTAINER_NAME container not found. Make sure the services are running."
return 1
fi
docker run --rm \ # Create a temporary directory for the backup
-e TAR_NAME="$svcName" \ mkdir -p "$BACKUP_FOLDER/$SERVICE_FOLDER"
-v "$selectedVolume":/"$svcName" \
-v "$backupFolder":/backup \ # Copy the data directory from the running container
busybox sh -c 'tar -czf "/backup/${TAR_NAME}.tar.gz" /${TAR_NAME}' echo "Copying $CONTAINER_NAME data directory..."
docker cp -q "$CONTAINER_ID:$CONTAINER_DATA_DIR/." "$BACKUP_FOLDER/$SERVICE_FOLDER/"
local cp_status=$?
if [ $cp_status -ne 0 ]; then
echo "Error: Failed to copy $SERVICE_FOLDER data"
rm -rf $BACKUP_FOLDER/$SERVICE_FOLDER
return 1
fi
# Create tar.gz of the data
cd "$BACKUP_FOLDER"
tar -czf "${SERVICE_FOLDER}.tar.gz" "$SERVICE_FOLDER/"
local tar_status=$?
if [ $tar_status -eq 0 ]; then
rm -rf "$SERVICE_FOLDER/"
fi
cd - > /dev/null
if [ $tar_status -ne 0 ]; then
echo "Error: Failed to create tar archive"
return 1
fi
echo "Successfully backed up $SERVICE_FOLDER data"
} }
function backupData() { function backupData() {
local datetime=$(date +"%Y%m%d-%H%M") local datetime=$(date +"%Y%m%d-%H%M")
local BACKUP_FOLDER=$PLANE_INSTALL_DIR/backup/$datetime local BACKUP_FOLDER=$PLANE_INSTALL_DIR/backup/$datetime
mkdir -p "$BACKUP_FOLDER" mkdir -p "$BACKUP_FOLDER"
volumes=$(docker volume ls -f "name=$SERVICE_FOLDER" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") # Check if docker-compose.yml exists
# Check if there are any matching volumes if [ ! -f "$DOCKER_FILE_PATH" ]; then
if [ -z "$volumes" ]; then echo "Error: docker-compose.yml not found at $DOCKER_FILE_PATH"
echo "No volumes found starting with '$SERVICE_FOLDER'"
exit 1 exit 1
fi fi
for vol in $volumes; do backup_container_dir "$BACKUP_FOLDER" "plane-db" "/var/lib/postgresql/data" "pgdata" || exit 1
echo "Backing Up $vol" backup_container_dir "$BACKUP_FOLDER" "plane-minio" "/export" "uploads" || exit 1
backupSingleVolume "$BACKUP_FOLDER" "$vol" backup_container_dir "$BACKUP_FOLDER" "plane-mq" "/var/lib/rabbitmq" "rabbitmq_data" || exit 1
done backup_container_dir "$BACKUP_FOLDER" "plane-redis" "/data" "redisdata" || exit 1
echo "" echo ""
echo "Backup completed successfully. Backup files are stored in $BACKUP_FOLDER" echo "Backup completed successfully. Backup files are stored in $BACKUP_FOLDER"
echo "" echo ""
} }
function askForAction() { function askForAction() {
local DEFAULT_ACTION=$1 local DEFAULT_ACTION=$1

View file

@ -66,8 +66,10 @@ function restoreData() {
exit 1 exit 1
fi fi
local volume_suffix
volume_suffix="_pgdata|_redisdata|_uploads|_rabbitmq_data"
local volumes local volumes
volumes=$(docker volume ls -f "name=plane-app" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") volumes=$(docker volume ls -f "name=plane-app" --format "{{.Name}}" | grep -E "$volume_suffix")
# Check if there are any matching volumes # Check if there are any matching volumes
if [ -z "$volumes" ]; then if [ -z "$volumes" ]; then
echo ".....No volumes found starting with 'plane-app'" echo ".....No volumes found starting with 'plane-app'"
@ -87,7 +89,7 @@ function restoreData() {
echo "Found $BACKUP_FILE" echo "Found $BACKUP_FILE"
local docVol local docVol
docVol=$(docker volume ls -f "name=$restoreVolName" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") docVol=$(docker volume ls -f "name=$restoreVolName" --format "{{.Name}}" | grep -E "$volume_suffix")
if [ -z "$docVol" ]; then if [ -z "$docVol" ]; then
echo "Skipping: No volume found with name $restoreVolName" echo "Skipping: No volume found with name $restoreVolName"