108 lines
3.0 KiB
Bash
Executable File
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)" |