Files
docker-configs/backup_docker.sh
2025-07-14 18:18:56 -05:00

108 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
# Docker configurations backup script with retention policy
# Retains: 3 daily, 3 weekly, 3 monthly backups
BACKUP_DIR="/home/will/docker_backups"
SOURCE_DIR="/home/will/docker"
REPO_URL="https://git.will123song.xyz/will/docker-configs.git"
DATE=$(date +%Y%m%d_%H%M%S)
DAY_OF_WEEK=$(date +%u) # 1-7 (Monday is 1)
DAY_OF_MONTH=$(date +%d)
# Create backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"
# Function to create git backup
create_git_backup() {
echo "Creating git backup for $DATE"
cd "$SOURCE_DIR"
# Add any new files and commit changes
git add .
if git diff --cached --quiet; then
echo "No changes to backup"
else
git commit -m "Automated backup - $DATE"
git push origin master 2>/dev/null || echo "Failed to push to remote (may need manual setup)"
fi
}
# Function to clean old backups
cleanup_backups() {
echo "Cleaning up old backups..."
cd "$BACKUP_DIR"
# Keep last 3 daily backups (delete older daily backups)
ls -t daily_*.tar.gz 2>/dev/null | tail -n +4 | xargs rm -f 2>/dev/null
# Keep last 3 weekly backups (delete older weekly backups)
ls -t weekly_*.tar.gz 2>/dev/null | tail -n +4 | xargs rm -f 2>/dev/null
# Keep last 3 monthly backups (delete older monthly backups)
ls -t monthly_*.tar.gz 2>/dev/null | tail -n +4 | xargs rm -f 2>/dev/null
echo "Cleanup completed"
}
# Create tar backup based on schedule
create_tar_backup() {
cd "$SOURCE_DIR"
# Determine backup type
if [ "$DAY_OF_MONTH" = "01" ]; then
# Monthly backup on 1st of month
BACKUP_TYPE="monthly"
BACKUP_FILE="$BACKUP_DIR/monthly_$DATE.tar.gz"
elif [ "$DAY_OF_WEEK" = "1" ]; then
# Weekly backup on Monday
BACKUP_TYPE="weekly"
BACKUP_FILE="$BACKUP_DIR/weekly_$DATE.tar.gz"
else
# Daily backup
BACKUP_TYPE="daily"
BACKUP_FILE="$BACKUP_DIR/daily_$DATE.tar.gz"
fi
echo "Creating $BACKUP_TYPE backup: $BACKUP_FILE"
# Create tar backup excluding data directories
tar -czf "$BACKUP_FILE" \
--exclude='*/data/*' \
--exclude='*/postgres/*' \
--exclude='*/vw-data/*' \
--exclude='*/db_data/*' \
--exclude='*/caddy_data/*' \
--exclude='*/caddy_config/*' \
--exclude='*/config/*' \
--exclude='HA/config/*' \
--exclude='HA/db_data/*' \
--exclude='.git' \
--exclude='gitea/postgres' \
--exclude='HA/db_data' \
--warning=no-file-changed \
--warning=no-file-removed \
. 2>/dev/null || true
if [ -f "$BACKUP_FILE" ]; then
echo "$BACKUP_TYPE backup created successfully: $BACKUP_FILE"
ls -lh "$BACKUP_FILE"
else
echo "Error creating $BACKUP_TYPE backup"
exit 1
fi
}
# Main execution
echo "Starting backup process at $(date)"
# Create git backup
create_git_backup
# Create tar backup
create_tar_backup
# Clean up old backups
cleanup_backups
echo "Backup process completed at $(date)"