🚀 前言:你的数据真的安全吗?

想象一下:某天你的Unraid阵列突然罢工,而appdata里存着精心调校的Docker配置,boot分区躺着启动密钥...

今天我们就来搞个全自动数据保险箱——介通过Unraid的插件生态(Appdata Backup、User Scripts、rclone)实现boot分区和appdata数据的自动化云备份!


🔧 第一步:安装必要插件

插件名称

角色定位

Appdata Backup

📦 用于备份Docker容器的appdata数据(应用配置和持久化数据)

User Scripts

⏰ 用于添加自定义脚本和定时任务

rclone

🚚 用于将备份文件同步到云盘(需提前配置好rclone远程存储)

💡 小贴士rclone的远程存储配置,就像给司机办理一张快递公司的【送货员通行证】——告诉云盘:“这个司机是我的人,允许他往我的仓库送货!”,所以建议在命令行用rclone config提前搞定!


📂 第二步:配置Appdata Backup插件

  1. 备份路径设置
    打开Appdata Backup插件 → 设置备份路径(比如/mnt/disks/T2312040410/backup/normal)→ 勾选需要备份的容器。

  2. 排除无关文件
    Global exclusion list里添加*.tmp, cache/等临时文件,避免浪费打包空间。

Backup the flash drive? 记得勾选yes,不然不会备份flash


💾 第三步:打包压缩加密(User Scripts插件)

在User Scripts中点击Add New Script新建一个脚本backup_appdata_boot,打包压缩并且加密:

#!/bin/bash

# 定义输出目录
output_dir="/mnt/disks/T2312040410/backup/encrypted"
start_time=$(date +%s)  # 记录开始时间戳(秒级)

# 创建输出目录(如果不存在)
mkdir -p "$output_dir"

# 获取第一个子目录名称(按名称排序)
first_dir=$(ls -d /mnt/disks/T2312040410/backup/normal/*/ 2>/dev/null | sort | tail -n1 | xargs basename)

# 检查是否找到目录
if [ -z "$first_dir" ]; then
  echo "Error: No subdirectory found in /mnt/disks/T2312040410/backup/normal"
  exit 1
fi

# 压缩并加密
echo "开始压缩和加密: $(date '+%Y-%m-%d %H:%M:%S')"
tar -czvf - -C /mnt/disks/T2312040410/backup/normal --exclude="jellyfin.tar.gz" "$first_dir" | openssl enc -aes-256-cbc -salt -pbkdf2 -iter 1000000 -pass pass:'这里输入你的密码' -out "${output_dir}/${first_dir}.tar.gz"

# 计算耗时
end_time=$(date +%s)
duration=$((end_time - start_time))

# 格式化耗时(时:分:秒)
formatted_duration=$(printf "%02d:%02d:%02d" $((duration/3600)) $(( (duration%3600)/60 )) $((duration%60)))

echo "---------------------------------"
echo "压缩完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "总耗时: $formatted_duration"
echo "输出文件: ${output_dir}/${first_dir}.tar.gz"

我这里挂载了一块硬盘专门用于备份,其中:

/mnt/disks/T2312040410/backup/encrypted:打包压缩加密文件到哪里

/mnt/disks/T2312040410/backup/normal:之前Appdata Backup配置的备份路径

--exclude="jellyfin.tar.gz":需要排除的文件,如果没有要排除的文件,直接去掉这个就行了


☁️ 第四步:备份到云盘(User Scripts插件、rclone插件)

在User Scripts中点击Add New Script新建一个脚本rclone_sync ,备份到云盘:

#!/bin/bash

start_time=$(date +%s)  # 记录开始时间戳(秒级)

# 获取第一个文件名称(按名称排序)
first_dir=$(ls /mnt/disks/T2312040410/backup/encrypted/ 2>/dev/null | sort | tail -n1 | xargs basename)

# 检查是否找到目录
if [ -z "$first_dir" ]; then
  echo "Error: No subdirectory found in /mnt/disks/T2312040410/backup/encrypted"
  exit 1
fi

# 同步数据
echo "同步 ${first_dir}.tar.gz 到阿里云盘: $(date '+%Y-%m-%d %H:%M:%S')"
rclone copy /mnt/disks/T2312040410/backup/encrypted/${first_dir} AliPan:unraid

echo "同步 ${first_dir}.tar.gz 到夸克云盘: $(date '+%Y-%m-%d %H:%M:%S')"
rclone copy /mnt/disks/T2312040410/backup/encrypted/${first_dir} Quark:备份/unraid

# 计算耗时
end_time=$(date +%s)
duration=$((end_time - start_time))

# 格式化耗时(时:分:秒)
formatted_duration=$(printf "%02d:%02d:%02d" $((duration/3600)) $(( (duration%3600)/60 )) $((duration%60)))

echo "---------------------------------"
echo "同步完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "总耗时: $formatted_duration"

注意:AliPan:unraidQuark:备份/unraid都是我在rclone提前配置好的

如需了解rclone的安装和基础操作命令,请点击跳转


⏰ 第五步:给自动化流水线定闹钟

任务

Cron表达式

人类语言解释

backup_appdata_boot

0 9 * * 3,5,7

每周星期三, 星期五,星期日的09:00执行

rclone_sync

0 17 * * 3,5,7

每周星期三, 星期五,星期日的17:00执行

⚡ 高级操作:如果不会Cron表达式,可以通过搜索引擎搜索:在线Cron表达式生成器,可视化生成Cron表达式


🚨 第六步:避坑指南(血泪经验总结)

  1. 空间刺客
    本地备份目录云盘存储都要设置监控,避免被备份文件“吃光硬盘”。可以用df -hrclone size mycloud:unraid_backup定期检查。

  2. 沉默的失败
    可以在同步完成后发送Gotify通知或者TG机器人通知,表示同步已经完成,或者同步出现异常

  3. 验收测试
    每隔几个月,随机选一个云盘备份文件,下载到本地通过hash或者md5对比文件是否完整3

  4. rclone同步卡顿/中断

    • 限速保平安:加上 --bwlimit 10M 限制上传带宽,避免挤占日常使用。

    • 断点续传:添加 --retries 3--retries-sleep 30s,失败后自动重试。

    • API限额规避:针对谷歌盘、OneDrive等平台,用 --drive-chunk-size 64M --tpslimit 10 绕过接口限制。


💡 终极安全口诀

“日志不落地,等于没备份;恢复没验证,等于看运气!”