#!/bin/bash
#=====================================================
# 文件增量备份脚本 - 基于rsync的增量同步
# 来源: 整合自运维社区最佳实践
# 用法: ./sync-rsync.sh
#=====================================================

# === 配置 ===
SOURCE_DIR="/data/app"
DEST_DIR="/backup/app"
EXCLUDE_FILE="/etc/rsync-exclude.conf"   # 排除列表文件
LOG_FILE="/var/log/rsync-backup.log"
# ===========

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

if ! command -v rsync &>/dev/null; then
    echo -e "${RED}错误: rsync 未安装${NC}"
    exit 1
fi

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log "========== 增量备份开始 =========="

RSYNC_OPTS="-avz --delete --stats --exclude-from=${EXCLUDE_FILE}"

# 创建排除文件（如果不存在）
if [ ! -f "$EXCLUDE_FILE" ]; then
    cat > "$EXCLUDE_FILE" << 'EOF'
*.log
*.tmp
*.swp
.git/
node_modules/
__pycache__/
*.pyc
.DS_Store
EOF
    log "已创建默认排除文件: $EXCLUDE_FILE"
fi

# 执行同步
if rsync $RSYNC_OPTS "$SOURCE_DIR/" "$DEST_DIR/" 2>&1 | tee -a "$LOG_FILE"; then
    echo -e "${GREEN}[✓] 增量备份成功${NC}"
else
    echo -e "${RED}[✗] 增量备份失败${NC}"
    exit 1
fi

# 创建快照（带时间戳）
SNAPSHOT_DIR="${DEST_DIR}_snapshot_$(date +%Y%m%d)"
if [ ! -d "$SNAPSHOT_DIR" ]; then
    cp -al "$DEST_DIR" "$SNAPSHOT_DIR" 2>/dev/null
    log "创建快照: $SNAPSHOT_DIR"
fi

# 保留最近7个快照
SNAPSHOT_COUNT=$(ls -d ${DEST_DIR}_snapshot_* 2>/dev/null | wc -l)
if [ "$SNAPSHOT_COUNT" -gt 7 ]; then
    ls -dt ${DEST_DIR}_snapshot_* 2>/dev/null | tail -n +8 | while read dir; do
        rm -rf "$dir"
        log "删除旧快照: $dir"
    done
fi

log "========== 增量备份完成 =========="