碎碎念:
对于任何一个数字难民或者科研“搬砖人”来说,数据丢失绝对是堪比天塌的噩梦。我的服务器(yanchang.cc)里存放着 300GB+ 的重要数据,包括跑地质算法的项目代码、珍贵的视频资料以及几万个碎小文件。
单纯的“复制粘贴”早已无法给我安全感。为了彻底解决数据焦虑,我花时间重构了我的备份体系,最终以极低的成本,严格落实了业界著名的 3-2-1 备份黄金法则。
🎯 我的 3-2-1 备份架构蓝图
所谓 3-2-1 法则,即:3 份副本、2 种介质、1 份异地。看看我的这套极客方案是如何对号入座的:
“3” 份数据副本:
源数据:Ubuntu 家庭服务器(
/DATA目录)7x24 小时运行,作为主生产力库。物理备份副本:我的大容量移动机械硬盘。
异地云端副本:联通云盘(通过 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_SERVER、SMTP_EMAIL 和 SMTP_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 玩家最大的乐趣所在。