From d71935def7e2f58d2104e24e4af35e85261795c6 Mon Sep 17 00:00:00 2001 From: "Dejan R." Date: Sat, 29 Nov 2025 18:37:43 +0000 Subject: [PATCH] added script --- backup.sh | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) mode change 100644 => 100755 backup.sh diff --git a/backup.sh b/backup.sh old mode 100644 new mode 100755 index e69de29..b081b22 --- a/backup.sh +++ b/backup.sh @@ -0,0 +1,117 @@ +#!/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 "==========================================" \ No newline at end of file