拒绝数据火葬场:使用 Rsync 全自动将云服务器数据“拉”回群晖 NAS
前言
最近给博客做了数据容灾。虽然云服务器(狐蒂云)本身还算稳定,但数据掌握在自己手里才是最安全的。
我的需求是:每天凌晨自动把 VPS 上的关键数据(Halo 博客、Docker 配置等)拉取到家里的群晖 NAS(黑群晖)上备份。
这里记录一下全套部署流程,特别是解决 rsync error code 43 和 .bashrc 干扰的深坑。
准备工作
源端:云服务器(Debian/Ubuntu),IP:
149.x.x.x目的端:群晖 NAS(已开启 SSH 功能)
核心工具:Rsync + Crontab(群晖任务计划)
策略:NAS 主动发起连接(无需公网暴露 NAS),增量备份。
第一步:打通 SSH 免密登录
为了让脚本自动运行,必须让 NAS 能免密码连上服务器。
在 NAS 上生成密钥:
SSH 登录群晖(切换到 root 权限),执行:
Bash
ssh-keygen -t rsa -f /root/.ssh/id_rsa # 一路回车,不要设置密码查看公钥:
Bash
cat /root/.ssh/id_rsa.pub复制输出的那串以
ssh-rsa开头的字符。上传到云服务器:
登录云服务器,将公钥写入授权文件:
Bash
mkdir -p /root/.ssh vim /root/.ssh/authorized_keys # 粘贴公钥并保存 chmod 600 /root/.ssh/authorized_keys chmod 700 /root/.ssh测试连接:
在 NAS 上执行 ssh root@服务器 IP,如果不需要密码直接进入,说明打通成功。
第二步:云服务器环境准备(避坑关键点!)
这是最容易报错的地方。如果 NAS 连接时报 code 43 或 rsync service is no running,通常是这里没配好。
安装 Rsync:
确保服务器上装了 rsync:
Bash
apt-get update && apt-get install rsync -y # 查看安装路径,通常是 /usr/bin/rsync which rsync修改 .bashrc(解决脚本无法执行的问题):
很多 VPS 的 .bashrc 文件里包含了一些只能在“人机交互”时运行的命令(如欢迎语、系统负载显示)。脚本自动连接时会被这些命令卡死。
解决方法:在 /root/.bashrc 文件的第一行加入“静音开关”:
Bash
vim /root/.bashrc在文件最顶部添加:
Bash
# 如果是非交互式 Shell(脚本),直接退出,不要加载后面的内容 [ -z "$PS1" ] && return
第三步:编写群晖备份脚本
在群晖上找个目录存放脚本,例如 /volume1/docker/backup/scripts/。
创建脚本:
Bash
vim /volume1/docker/backup/scripts/pull_hudi.sh写入内容:
Bash
#!/bin/bash # ==================== 配置区域 ==================== REMOTE_IP="你的服务器IP" REMOTE_PORT="22" # SSH端口 REMOTE_USER="root" # 用户名 # 要备份的远程目录 (用空格隔开) SOURCE_DIRS="/opt /etc /root /home" # 群晖本地存放位置 LOCAL_DIR="/volume1/docker/backup/hudi_data" # 日志文件 LOG_FILE="/volume1/docker/backup/backup_log.txt" # ================================================ # 初始化日志 echo "========== 备份开始: $(date) ==========" > ${LOG_FILE} # 循环同步每个目录 for DIR in ${SOURCE_DIRS}; do echo "正在同步目录: ${DIR} ..." >> ${LOG_FILE} # 核心命令: # --rsync-path: 强制指定远程程序位置,防止找不到 # --delete: 镜像模式(云端删了,NAS也删,保持一致) rsync -avz --delete --rsync-path="/usr/bin/rsync" -e "ssh -p ${REMOTE_PORT}" ${REMOTE_USER}@${REMOTE_IP}:${DIR} ${LOCAL_DIR}/ >> ${LOG_FILE} 2>&1 if [ $? -eq 0 ]; then echo "✅ ${DIR} 同步成功" >> ${LOG_FILE} else echo "❌ ${DIR} 同步失败" >> ${LOG_FILE} fi done echo "========== 备份结束: $(date) ==========" >> ${LOG_FILE}赋予权限:
Bash
chmod +x /volume1/docker/backup/scripts/pull_hudi.sh
第四步:设置定时任务(全自动)
打开群晖 控制面板 -> 任务计划。
新增 -> 计划的任务 -> 用户定义的脚本。
常规:
任务名称:
Backup Hudi Cloud账号:必须选 root
计划:设置为 每天 04:00。
任务设置 -> 脚本内容:
Bash
bash /volume1/docker/backup/scripts/pull_hudi.sh保存。
总结
至此,每天凌晨 4 点,NAS 就会像一只勤劳的蚂蚁,把云服务器上的数据搬回家。
验证方法:查看
/volume1/docker/backup/backup_log.txt日志,看到全绿的✅ 同步成功即为正常。数据安全建议:定期检查一次备份文件的完整性,确保万无一失。




