拒绝数据火葬场:使用 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 能免密码连上服务器。

  1. 在 NAS 上生成密钥:

    SSH 登录群晖(切换到 root 权限),执行:

    Bash

    ssh-keygen -t rsa -f /root/.ssh/id_rsa
    # 一路回车,不要设置密码
    
  2. 查看公钥

    Bash

    cat /root/.ssh/id_rsa.pub
    

    复制输出的那串以 ssh-rsa 开头的字符。

  3. 上传到云服务器:

    登录云服务器,将公钥写入授权文件:

    Bash

    mkdir -p /root/.ssh
    vim /root/.ssh/authorized_keys
    # 粘贴公钥并保存
    chmod 600 /root/.ssh/authorized_keys
    chmod 700 /root/.ssh
    
  4. 测试连接:

    在 NAS 上执行 ssh root@服务器 IP,如果不需要密码直接进入,说明打通成功。


第二步:云服务器环境准备(避坑关键点!)

这是最容易报错的地方。如果 NAS 连接时报 code 43rsync service is no running,通常是这里没配好。

  1. 安装 Rsync:

    确保服务器上装了 rsync:

    Bash

    apt-get update && apt-get install rsync -y
    # 查看安装路径,通常是 /usr/bin/rsync
    which rsync
    
  2. 修改 .bashrc(解决脚本无法执行的问题):

    很多 VPS 的 .bashrc 文件里包含了一些只能在“人机交互”时运行的命令(如欢迎语、系统负载显示)。脚本自动连接时会被这些命令卡死。

    解决方法:在 /root/.bashrc 文件的第一行加入“静音开关”:

    Bash

    vim /root/.bashrc
    

    在文件最顶部添加:

    Bash

    # 如果是非交互式 Shell(脚本),直接退出,不要加载后面的内容
    [ -z "$PS1" ] && return
    

第三步:编写群晖备份脚本

在群晖上找个目录存放脚本,例如 /volume1/docker/backup/scripts/

  1. 创建脚本

    Bash

    vim /volume1/docker/backup/scripts/pull_hudi.sh
    
  2. 写入内容

    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}
    
  3. 赋予权限

    Bash

    chmod +x /volume1/docker/backup/scripts/pull_hudi.sh
    

第四步:设置定时任务(全自动)

  1. 打开群晖 控制面板 -> 任务计划

  2. 新增 -> 计划的任务 -> 用户定义的脚本

  3. 常规

    • 任务名称:Backup Hudi Cloud

    • 账号:必须选 root

  4. 计划:设置为 每天 04:00

  5. 任务设置 -> 脚本内容

    Bash

    bash /volume1/docker/backup/scripts/pull_hudi.sh
    
  6. 保存。


总结

至此,每天凌晨 4 点,NAS 就会像一只勤劳的蚂蚁,把云服务器上的数据搬回家。

  • 验证方法:查看 /volume1/docker/backup/backup_log.txt 日志,看到全绿的 ✅ 同步成功 即为正常。

  • 数据安全建议:定期检查一次备份文件的完整性,确保万无一失。


消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息