一、在服务器(dms.rongyi.site)上创建同步用户
useradd -m syncer
passwd syncer
配置只读备份目录权限:
chown -R syncer:syncer /bak
chmod -R 755 /bak
二、在本地 Debian 生成 SSH 密钥
ssh-keygen -t ed25519 -C "backup"
上传公钥到服务器:
ssh-copy-id syncer@dms.rongyi.site
测试免密登录:
ssh syncer@dms.rongyi.site
三、创建 rsync 同步脚本
#!/bin/bash
REMOTE_USER="syncer"
REMOTE_HOST="dms.rongyi.site"
REMOTE_DIR="/bak"
LOCAL_DIR="/root/dms_backups"
LOG="/root/log/sync_dms_backup.log"
EXCLUDES=(
--exclude='flask_session'
)
RETENTION_DAYS=7
SERVERCHAN_SENDKEY="SCTxxxxxxxxxxxx"
# ============ 双输出日志函数 ============
log(){
echo -e "$1" | tee -a "$LOG"
}
# ============ Server 酱通知 ============
push_message(){
TITLE="$1"
CONTENT="$2"
curl -s -X POST "https://sctapi.ftqq.com/${SERVERCHAN_SENDKEY}.send" \
-d "title=${TITLE}" \
-d "desp=${CONTENT}" >/dev/null 2>&1
}
# ============ 开始 ============
log "====== $(date '+%Y-%m-%d %H:%M:%S') 开始增量同步 ======"
START_TIME=$(date +%s)
# -------- 1) rsync 增量同步 --------
log "[*] 开始同步远程备份目录..."
rsync -avz --delete \
"${EXCLUDES[@]}" \
$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ \
$LOCAL_DIR/ 2>&1 | tee -a "$LOG"
RSYNC_STATUS=${PIPESTATUS[0]}
if [ $RSYNC_STATUS -eq 0 ]; then
log "[OK] $(date '+%H:%M:%S') 数据同步成功"
else
log "[ERROR] $(date '+%H:%M:%S') 数据同步失败!错误代码:$RSYNC_STATUS"
push_message \
"❌ DMS 本地备份同步失败" \
"失败时间:$(date '+%Y-%m-%d %H:%M:%S')
错误代码:$RSYNC_STATUS
请检查网络、SSH 或服务器目录是否正常。"
exit 1
fi
# -------- 2) 清理过期备份 --------
log "[*] 清理超过 $RETENTION_DAYS 天的本地备份..."
find $LOCAL_DIR -maxdepth 1 -type d -name "day_*" -mtime +$RETENTION_DAYS \
-print -exec rm -rf {} \; 2>&1 | tee -a "$LOG"
CLEAN_STATUS=${PIPESTATUS[0]}
if [ $CLEAN_STATUS -ne 0 ]; then
log "[ERROR] 清理旧备份失败!"
push_message \
"⚠️ DMS 同步成功,但清理旧备份失败" \
"请检查本地目录权限或磁盘空间。"
exit 1
fi
END_TIME=$(date +%s)
RUN_SECONDS=$((END_TIME - START_TIME))
# -------- 3) 成功通知 --------
log "[OK] $(date '+%H:%M:%S') 同步与清理全部完成"
push_message \
"✅ DMS 本地同步备份成功" \
"完成时间:$(date '+%Y-%m-%d %H:%M:%S')
耗时:${RUN_SECONDS} 秒
排除目录:flask_session
保留天数:$RETENTION_DAYS
本地路径:\`${LOCAL_DIR}\`
状态:全部成功。"
log ""
保存为 dms.sh
赋予执行权限
chmod +x dms.sh
四、手动运行测试
./dms.sh
五、设置计划任务
crontab -e
0 1 * * * /root/dms.sh
