#!/usr/bin/env bash
# backup-site.sh - 个人服务器站点备份脚本（tar + 可选远端同步 + 保留策略）
#
# 用法:
#   ./backup-site.sh /var/www /backups            # 备份目录到本地备份目录
#   RSYNC_TARGET=user@nas:/volume/backups ./backup-site.sh /var/www /backups
#
# 环境变量:
#   RETENTION_DAYS  保留天数，默认 14
#   RSYNC_TARGET    远端 rsync 目标，设置后备份完自动同步
#   EXTRA_TARS      空格分隔的额外备份项，如 "/etc /var/lib/docker/volumes"
set -euo pipefail

SRC="${1:?用法: backup-site.sh <源目录> <备份目录>}"
DEST="${2:?用法: backup-site.sh <源目录> <备份目录>}"
RETENTION_DAYS="${RETENTION_DAYS:-14}"
STAMP="$(date +%Y%m%d_%H%M%S)"
NAME="$(basename "$SRC")_${STAMP}.tar.gz"
LOG="${DEST}/backup.log"

mkdir -p "$DEST"

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

log "开始备份: $SRC -> $DEST/$NAME"
tar --exclude='*.log' --exclude='cache' --exclude='.cache' \
    -czf "${DEST}/${NAME}" -C "$(dirname "$SRC")" "$(basename "$SRC")"

# 可选：额外备份项（如系统配置）
for extra in ${EXTRA_TARS:-}; do
    [ -e "$extra" ] || { log "跳过不存在的路径: $extra"; continue; }
    extra_name="$(basename "$extra")_${STAMP}.tar.gz"
    log "附加备份: $extra -> $DEST/$extra_name"
    tar -czf "${DEST}/${extra_name}" -C "$(dirname "$extra")" "$(basename "$extra")"
done

# 可选：同步到远端（NAS / 另一台服务器）
if [ -n "${RSYNC_TARGET:-}" ]; then
    log "同步到远端: $RSYNC_TARGET"
    rsync -a --delete-after "${DEST}/" "${RSYNC_TARGET}/"
fi

# 清理过期备份
log "清理 ${RETENTION_DAYS} 天前的备份"
find "$DEST" -name "${NAME%%_*}*.tar.gz" -mtime "+${RETENTION_DAYS}" -delete

log "备份完成: $(du -sh "$DEST" | cut -f1)"
