#!/bin/bash # ZTNet Docker Compose Backup Script # This script stops containers, backs up volumes and configs, then restarts set -e # Exit on error # Configuration BACKUP_DIR="./backup" COMPOSE_FILE="docker-compose.yml" MAX_BACKUPS=5 TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_NAME="ztnet_backup_${TIMESTAMP}" BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}" # Colors for output GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Function to print colored messages log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check if docker-compose file exists if [ ! -f "$COMPOSE_FILE" ]; then log_error "docker-compose.yml not found in current directory!" exit 1 fi # Create backup directory if it doesn't exist mkdir -p "$BACKUP_DIR" log_info "Starting backup process..." log_info "Backup will be saved to: ${BACKUP_PATH}" # Step 1: Stop containers log_info "Stopping Docker containers..." docker compose down # Step 2: Create backup directory for this backup mkdir -p "$BACKUP_PATH" # Step 3: Backup PostgreSQL data volume log_info "Backing up PostgreSQL data..." docker run --rm \ -v ztnet_postgres-data:/data \ -v "$(pwd)/${BACKUP_PATH}:/backup" \ alpine tar czf /backup/postgres-data.tar.gz -C /data . # Step 4: Backup ZeroTier volume log_info "Backing up ZeroTier data..." docker run --rm \ -v ztnet_zerotier:/data \ -v "$(pwd)/${BACKUP_PATH}:/backup" \ alpine tar czf /backup/zerotier.tar.gz -C /data . # Step 5: Backup docker-compose.yml log_info "Backing up docker-compose.yml..." cp "$COMPOSE_FILE" "${BACKUP_PATH}/docker-compose.yml" # Step 6: Create backup metadata cat > "${BACKUP_PATH}/backup_info.txt" << EOF Backup Information ================== Date: $(date) Timestamp: ${TIMESTAMP} Hostname: $(hostname) Docker Version: $(docker --version) Docker Compose Version: $(docker compose version) Backed up volumes: - postgres-data - zerotier Backed up files: - docker-compose.yml EOF log_info "Backup completed successfully!" # Step 7: Cleanup old backups (keep only last 5) log_info "Cleaning up old backups (keeping last ${MAX_BACKUPS})..." cd "$BACKUP_DIR" ls -t | grep "ztnet_backup_" | tail -n +$((MAX_BACKUPS + 1)) | xargs -r rm -rf cd - > /dev/null REMAINING_BACKUPS=$(ls -1 "$BACKUP_DIR" | grep "ztnet_backup_" | wc -l) log_info "Current number of backups: ${REMAINING_BACKUPS}" # Step 8: Restart containers log_info "Starting Docker containers..." docker compose up -d # Step 9: Wait for services to be ready log_info "Waiting for services to start..." sleep 5 # Check if containers are running log_info "Checking container status..." docker compose ps log_info "==========================================" log_info "Backup process completed successfully!" log_info "Backup location: ${BACKUP_PATH}" log_info "Backup size: $(du -sh "${BACKUP_PATH}" | cut -f1)" log_info "=========================================="