起因
前段时间服务器不是炸过一次
那倒是给我敲响了一次警钟
虽然数据基本没丢失,但要是丢失了对我来说也是挺伤的
NAS里有我拍的很多照片 我存的一些黑历史 还有我自己下的资源之类的
真要说多重要没了会死的数据那不至于
只是没了对我来讲是不小的损失
我就想到,我们可以加密把数据存储到云端,这样不会被网盘和谐(至少就目前来说应该百度网盘还是破解不了AES加密),也多了一份异地备份
我的NAS是三块4T组的RAID5,也就是8T的储存空间
刚好,我自己有百度网盘的会员,他给了12T的储存空间
确定方案
TrueNAS里其实有云备份的功能了,加密定时等等都有
但他也不是这么完美的
最简单的来说,百度网盘文件大小有限制,我最大的文件有60多个G(也就是某个街机音游的压缩包)
文件名太长,文件路径太长,小文件太多等等这都可能会出bug
所以我们需要一个能分块备份的
搜了一圈,有个项目名为Backrest非常符合我们的需求
加密存储+增量块备份+支持WebDev等+定时
这就是我们需要的
那就开始吧
看了一下这个项目的README,我选择用docker跑
以前不喜欢用docker,觉得麻烦
用了就真香
虚拟机内部用的虚拟交换机,那个是万兆的内网
那肯定是没瓶颈的,毕竟我硬盘性能拉满拉满也就几百MiB/s
但是如果说你要在别的虚拟机上跑backrest,就要过虚拟交换机去连接TrueNAS
我个人认为这没啥必要,因为这样会多过一层CPU
TrueNAS是支持docker的,直接跑我觉得更好
TrueNAS管这个叫应用
我一开始点的添加应用里的自定义应用程序
这不就是docker run的一堆东西
那我还得手动填进去
作为懒狗的我,亚达
然后我突然发现旁边有个通过yaml进行安装
我一拍脑袋,这不就是docker-compose.yml
吗
Backrest的README里面也有compose的模板,改一下直接填进去
services:
backrest:
image: garethgeorge/backrest:latest
container_name: backrest
hostname: backrest
volumes:
- ./backrest/data:/data
- ./backrest/config:/config
- ./backrest/cache:/cache
- ./backrest/tmp:/tmp
- /mnt/main:/nasdata #你truenas的存储集地址
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=Asia/Shanghai
ports:
- "9898:9898"
restart: unless-stopped
还真的能跑,完美
我们现在需要给Backrest添加repo,也就是远程存储仓库
百度网盘挂载
那问题来了
挂载百度网盘要用Alist(坚果云123云盘啥的可以用WebDev)
但是众所周知,Alist作者把项目卖了
你挂载网盘无论如何都是要用Alist的api的,那个并不开源
你可以说我数据没啥多机密的,但很显然把自己的数据丢给一个不开源的黑箱去处理是不明智的
找了一圈发现有个OpenAlist项目
老规矩,也是用docker把他跑起来,这里我们也把他部署在TrueNAS上
services:
openlist:
container_name: openlist
environment:
- UMASK=022
image: openlistteam/openlist:latest
ports:
- '5244:5244'
- '5246:5246'
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
user: '0:0'
volumes:
- /etc/openlist:/opt/openlist/data
运行起来之后手动查看下日志,他会把网页admin账户的密码给出来
然后按照官方文档挂载百度网盘
这里想吐槽的一点就是百度网盘把个人开发者的申请给关了
咋想的呢 文档都来不及改
2025.9.27更新:他又把个人申请打开了()
那理论来说可以做到用自己申请的apikey去挂载了,数据更透明
然后的话,大文件上传下载需要修改UserAgent
但是我考虑到我们的分片并不会特别大,可改可不改
他这里主要是要改浏览器的UA和aria2的
开始debug
挂载上百度网盘之后,我一开始想的是去创建S3对象存储
试了下发现不咋地,甚至可以说很难用
具体表现就是我用一些S3查看器发现文件传不上去
可能我是猪头肉不会整 但至少在我这OpenList的S3对象存储不可用
那没办法了,用Webdav吧
我的想法是百度网盘——OpenList——(webdav)—Rclone——Backrest
感觉是一坨石山,先试试能不能用
TrueNAS是自带rclone的
打开一个TrueNAS命令行,输入
rclone config
然后选择创建,输入你想要的rclone名字,服务提供商选择Webdav,我这里是序号52
地址的话填写http://openlist地址:5244/dav
然后供应商vendor直接回车
然后输入用户名密码
输入密码的时候是不显示的
然后高级设置的时候选是
headers填写Referer,https://pan.baidu.com/,User-Agent,pan.baidu.com
输入rclone ls 你的rclone名字:/
能看到你网盘的文件就算成功了
我怀着激动的心情去backrest尝试备份
首先我们得更改一下compose的配置
services:
backrest:
image: garethgeorge/backrest:latest
container_name: backrest
hostname: backrest
volumes:
- ./backrest/data:/data
- ./backrest/config:/config
- ./backrest/cache:/cache
- ./backrest/tmp:/tmp
- /mnt/main:/nasdata #你truenas的存储集地址
- /root/.config/rclone:/root/.config/rclone #rclone配置文件的地址
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=Asia/Shanghai
ports:
- "9898:9898"
restart: unless-stopped
然后的话新建一个repo
这里的baidu就是之前rclone的名字
下面的密码请牢牢记住,以后恢复文件没这个密码可恢复不了
接下来新建一个备份任务,我这里是每天凌晨5点备份
然后我加了一个参数--pack-size=128
,也就是分包为128M,默认的4M太小了,而且好像大于128就传不上去了 得在rclone那里分片才行
然后试一下备份
现在就是等待。。
过了几分钟不出意外报错一片片
[restic] rclone: 2025/09/27 03:15:06 ERROR : data/9d/9d91c28f8335c83773d782c682c7bc354e09ec26b96f175b46821653d5387168: Post request rcat error: Method Not Allowed: 405 Method Not Allowed
[restic] Save(<data/9d91c28f83>) returned error, retrying after 49.043625591s: unexpected HTTP response (500): 500 Internal Server Error
去Openlist的日志看到:
2025-09-27 13:39:41.854410+00:00#1: upload/download stream incomplete, possible network issue; error in uploading to baidu, will retry. response={"error_code":31299, "error_msg":"Invalid param keylist"}
我们去这个文档看到这个response 31299是第一个分片的大小小于4M
理论来说超级会员可以分片大于4M,我们管它呢
我们直接在Openlist改成4M分片大小
然后还是报错
没辙了 去搜了一下
我找到了这个issue
打开Web代理 Webdav代理改成本地 Upload Api改成这个
再试试
欸得了()传了几百个G 应该没啥问题了
不过有时候可能会断,不过restic会断点续传,再试一次就好
然后要注意的就是小心传太多被运营商当PCDN了