yanchang
yanchang
发布于 2026-02-23 / 17 阅读
0
0

基于 Rsync 与青龙面板,如何低成本实现 3-2-1 数据容灾备份

碎碎念:

对于任何一个数字难民或者科研“搬砖人”来说,数据丢失绝对是堪比天塌的噩梦。我的服务器(yanchang.cc)里存放着 300GB+ 的重要数据,包括跑地质算法的项目代码、珍贵的视频资料以及几万个碎小文件。

单纯的“复制粘贴”早已无法给我安全感。为了彻底解决数据焦虑,我花时间重构了我的备份体系,最终以极低的成本,严格落实了业界著名的 3-2-1 备份黄金法则

🎯 我的 3-2-1 备份架构蓝图

所谓 3-2-1 法则,即:3 份副本、2 种介质、1 份异地。看看我的这套极客方案是如何对号入座的:

  • “3” 份数据副本

    1. 源数据:Ubuntu 家庭服务器(/DATA 目录)7x24 小时运行,作为主生产力库。

    2. 物理备份副本:我的大容量移动机械硬盘。

    3. 异地云端副本:联通云盘(通过 AList 挂载 WebDAV)。

  • “2” 种存储介质:服务器阵列硬盘 + 便携式物理机械硬盘。防范单一硬件批次性损坏。

  • “1” 份异地备份:云盘。即使家里发生断电、甚至物理损毁等极端不可抗力,远在云端的数据依然安然无恙。

两个部分共同守护:手动执行的物理同步(Rsync)全自动的云端同步(Rclone)


🛡️ 第一道防线:Rsync 物理冷备份 (人在哪,数据就在哪)

因为平时要去学校做科研,我会把移动硬盘带在身边。每次在学校安顿下来,我就会在终端跑一下这行早已烂熟于心的命令,将家里服务器的数据同步到手边的硬盘里:

Bash

nohup rsync -avzP --info=progress2 yanchang@yanchang.cc:/DATA/ ./ > sync.log 2>&1 &
  • 增量传输 (-a):只搬运修改过或新增的文件,绝不浪费时间重传几百 GB 数据。

  • 断点续传 (-P):校园网有时候不稳定,这个参数能保证几十 GB 的大视频文件即便断网,下次也能接着传。

  • 全局进度 (--info=progress2):不再疯狂刷屏细碎文件,而是给出一个优雅的总进度条。

  • 后台静默 (nohup ... &):敲完命令直接关掉终端去干饭,它会在后台默默跑完,并将所有日志吐到 sync.log 里,方便随时查账。


☁️ 第二道防线:青龙面板 Rclone 全自动异地云备份

物理备份虽然稳,但过于依赖人的“记性”。为了做到 100% 的自动化异地容灾,我在青龙面板里写了一个“终极” Rclone 备份脚本,每天深夜自动将数据推向联通云盘。

起初我只写了简单的 rclone copy,但在实战中遇到了诸如青龙环境丢失、密码明文裸奔、国内拉取极慢、动态 IP 导致企业微信推送失败等一堆痛点。

经过几轮重构,这个被我称为**“运维级”**的脚本诞生了,它拥有以下核心亮点:

  • 🔐 安全隔离(阅后即焚):通过 rclone obscure 动态加密密码,配置文件临时生成在 /tmp。结合 trap cleanup EXIT 进程守卫,无论脚本正常结束还是崩溃,临时凭证都会瞬间销毁,绝不留痕。

  • 📧 零依赖邮件告警:动态 IP 无法设置白名单?直接抛弃繁重的第三方库,纯靠 Linux 原生的 curl 配合 smtps 协议发信,执行极快且畅通无阻。

  • 🏥 环境自愈能力:运行时自动检测环境。若未安装 Rclone,会自动将 Alpine 源替换为阿里云镜像强制安装,告别断流。

  • WebDAV 专项调优:使用 --size-only 忽略 WebDAV 极易错乱的时间戳;同时利用 --stats 60s 限制日志输出频率,防止青龙日志爆炸卡死。

💻 完整源码

在青龙面板添加脚本,并在环境变量配置好 SMTP_SERVERSMTP_EMAILSMTP_PASSWORD(授权码)即可食用。

Bash

#!/bin/bash
##!name: 联通云盘自动备份
##!desc: 自动检查环境并增量同步 /DATA 到联通云盘,完成后发送邮件通知

# ================= 配置区域 =================
# 接收通知的邮箱地址
RECEIVER_EMAIL="yanchang@yanchang.cc"
# 临时邮件文件路径
MAIL_TMP="/tmp/mail_rclone_$$.txt"
# ===========================================

# ================= 核心优化:进程管控与清理 =================
cleanup() {
    # 无论脚本正常结束还是异常中断,都会清理临时文件,防止密码泄露
    rm -f "$MAIL_TMP"
    rm -f "/tmp/alist_webdav.conf"
}
trap cleanup EXIT

# ================= 发送邮件函数 =================
send_email() {
    local status="$1"
    local content=$(echo -e "$2")
    local subject="【青龙】Rclone联通云盘备份通知 - ${status}"
    
    echo "📧 正在发送邮件: $subject"
    
    # 检查青龙环境变量中是否配置了发件人信息
    if [ -z "${SMTP_SERVER:-}" ] || [ -z "${SMTP_EMAIL:-}" ] || [ -z "${SMTP_PASSWORD:-}" ]; then
        echo "❌ 邮件配置缺失:请在青龙环境变量中配置 SMTP_SERVER、SMTP_EMAIL、SMTP_PASSWORD"
        return 1
    fi

    # 构造邮件内容
    cat > "$MAIL_TMP" <<EOF
From: "青龙备份管家" <$SMTP_EMAIL>
To: <$RECEIVER_EMAIL>
Subject: $subject
Content-Type: text/plain; charset=UTF-8

任务名称:Rclone 联通云盘增量备份
执行时间:$(date "+%Y-%m-%d %H:%M:%S")
当前状态:$status

$content

-------------------------
此邮件由青龙面板自动发送
EOF

    # 使用 curl 调用 SMTP 发送邮件
    if ! timeout -k 5s 30s curl --silent --show-error --ssl-reqd \
        --url "smtps://$SMTP_SERVER:465" \
        --user "$SMTP_EMAIL:$SMTP_PASSWORD" \
        --mail-from "$SMTP_EMAIL" \
        --mail-rcpt "$RECEIVER_EMAIL" \
        --upload-file "$MAIL_TMP"; then
        echo "❌ 邮件发送失败"
        return 1
    fi
    echo "✅ 邮件发送成功"
    return 0
}

# ================= 1. 环境检测与准备阶段 =================
echo "================================================="
echo "环境检测与准备阶段..."
echo "================================================="

if command -v rclone &> /dev/null; then
    echo "✅ 检测到系统已安装 Rclone,跳过环境修复和安装步骤!"
    rclone --version | head -n 1
else
    echo "⚠️ 未检测到 Rclone,开始修复国内网络环境并强制安装..."
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    echo "✅ 已成功切换至阿里云高速镜像源!"

    apk update
    echo "正在下载并安装 Rclone..."
    apk add rclone

    if command -v rclone &> /dev/null; then
        echo "🎉 太棒了!Rclone 兜底安装成功!"
        rclone --version | head -n 1
    else
        echo "❌ 致命错误:安装失败!脚本中止执行。"
        send_email "环境异常" "❌ Rclone 兜底安装失败,备份任务未能启动。" || true
        exit 1 
    fi
fi

# ================= 2. 自动构建连接配置 =================
echo "================================================="
echo "正在自动构建 Rclone 连接配置..."
rm -f /tmp/alist_webdav.conf
OBSCURED_PASS=$(rclone obscure "你的WebDAV密码")

cat << EOF > /tmp/alist_webdav.conf
[unicom]
type = webdav
url = http://192.168.0.250:5244/dav/联通备份
vendor = other
user = yanchang
pass = ${OBSCURED_PASS}
EOF

echo "配置完成!开始执行 Rclone 增量同步:$(date)"
echo "================================================="

# ================= 3. 执行核心同步命令 =================
# 捕获 rclone 的退出码,防止因为部分文件同步失败导致脚本直接崩溃退出
RCLONE_EXIT_CODE=0
rclone --config /tmp/alist_webdav.conf copy /DATA unicom:/Server_DATA_Backup --size-only -v --stats 60s --transfers 4 || RCLONE_EXIT_CODE=$?

# ================= 4. 判断结果并发送通知 =================
if [ $RCLONE_EXIT_CODE -eq 0 ]; then
    echo "================================================="
    echo "✅ 增量同步完美完成!你的数据已安全入云。"
    send_email "成功 (Success)" "✅ 增量同步完美完成!你的数据已安全入云。\n\n源目录:/DATA\n目标目录:联通云盘备份目录\n耗时记录请查看青龙面板。" || true
else
    echo "❌ 同步出现错误,请向上滚动查看具体的红色报错信息。"
    send_email "失败 (Error)" "⚠️ 增量同步执行结束,但过程中出现错误。\n\n可能原因:\n1. 网络断流或超时\n2. 遇到不支持的大文件限制 (如 405 报错)\n3. 云盘容量不足\n\n请登录青龙面板,查看此任务的详细运行日志进行排查。" || true
    exit 1
fi

结语

数据备份的本质不是为了折腾工具,而是为了那一刻的心安。无论是敲下 rsync 回车键的那一瞬间,还是每天清晨收到青龙面板那封“同步成功”的邮件,这种对数据绝对掌控的踏实感,是每一个 HomeLab 玩家最大的乐趣所在。


评论