记一次基于Backrest+百度网盘 TrueNAS的云端块备份

1719 字
9 分钟
记一次基于Backrest+百度网盘 TrueNAS的云端块备份

前言#

前段时间服务器不是炸过一次

那倒是给我敲响了一次警钟

虽然数据基本没丢失,但要是丢失了对我来说也是挺伤的

NAS里有我拍的很多照片 我存的一些黑历史 还有我自己下的资源之类的

真要说多重要没了会死的数据那不至于

只是没了对我来讲是不小的损失

我就想到,我们可以加密把数据存储到云端,这样不会被网盘和谐(至少就目前来说应该百度网盘还是破解不了AES加密),也多了一份异地备份

我的NAS是三块4T组的RAID5,也就是8T的储存空间

刚好,我自己有百度网盘的会员,他给了12T的储存空间

确定方案#

TrueNAS里其实有云备份的功能了,加密定时等等都有

但他也不是这么完美的

最简单的来说,百度网盘文件大小有限制,我最大的文件有60多个G(也就是某个街机音游的压缩包)

文件名太长,文件路径太长,小文件太多等等这都可能会出bug

所以我们需要一个能分块备份的

搜了一圈,有个项目名为Backrest非常符合我们的需求

加密存储+增量块备份+支持WebDev等+定时

这就是我们需要的

那就开始吧#

看了一下这个项目的README,我选择用docker跑

以前不喜欢用docker,觉得麻烦

用了就真香

虚拟机内部用的虚拟交换机,那个是万兆的内网

那肯定是没瓶颈的,毕竟我硬盘性能拉满拉满也就几百MiB/s

但是如果说你要在别的虚拟机上跑backrest,就要过虚拟交换机去连接TrueNAS

我个人认为这没啥必要,因为这样会多过一层CPU

TrueNAS是支持docker的,直接跑我觉得更好

TrueNAS管这个叫应用

我一开始点的添加应用里的自定义应用程序

image.png
image.png

这不就是docker run的一堆东西

那我还得手动填进去

作为懒狗的我,亚达

然后我突然发现旁边有个通过yaml进行安装

image.png
image.png

我一拍脑袋,这不就是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命令行,输入

Terminal window
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的名字

下面的密码请牢牢记住,以后恢复文件没这个密码可恢复不了

35380971-0245-4e69-a95d-6a89b4d19d53.png
35380971-0245-4e69-a95d-6a89b4d19d53.png

接下来新建一个备份任务,我这里是每天凌晨5点备份

eb871b0e-b31c-4607-a416-d4ee0148e4f6.png
eb871b0e-b31c-4607-a416-d4ee0148e4f6.png

然后我加了一个参数--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,我们管它呢

0971f5dd-8b1c-444f-8381-c95fa7016d24.png
0971f5dd-8b1c-444f-8381-c95fa7016d24.png

我们直接在Openlist改成4M分片大小

然后还是报错

没辙了 去搜了一下

我找到了这个issue

1e919ca1-3956-4fc5-bfa4-5e91940f1b79.png
1e919ca1-3956-4fc5-bfa4-5e91940f1b79.png

打开Web代理 Webdav代理改成本地 Upload Api改成这个

再试试

371ba569-ef1e-4716-95c1-efea37e0ed2a.png
371ba569-ef1e-4716-95c1-efea37e0ed2a.png

欸得了()传了几百个G 应该没啥问题了

不过有时候可能会断,不过restic会断点续传,再试一次就好

然后要注意的就是小心传太多被运营商当PCDN了

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

记一次基于Backrest+百度网盘 TrueNAS的云端块备份
https://cainongw.github.io/posts/backrest-buildup/
作者
Cainong
发布于
2025-07-03
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
记一次基于OpenWRT+Nginx反代的局域网服务小改造
HomeLab 前言 随着服务器上面跑的东西越来越多,docker跑的服务也越来越多了 我常访问所以我可以记住每个虚拟机的ip或者docker的端口 但是每次在浏览器输入都得输入192然后手动补全,有时候甚至得冒号加端口号才可以 太特么麻烦了
2
记一次基于small-step对局域网内证书的自签名
HomeLab 我们已经解决了K8s内集群的证书 现在需要解决我们直接跑在虚拟机上的一些服务的证书签名了 之前是自己签名 现在发现可以用根证书+ACME统一签名 因为是根证书 实际上可以在Ingress里设置任何一个域名(即使他已经存在) 甚至可以把baidu换成google(
3
记一次Kubernetes集群的完善
HomeLab 前言 我们成功搭建起了K8s 接下来我们需要搭建一些额外的服务来满足我的需求
4
记一次Kubernetes完整集群的搭建
HomeLab 写在前面 太好了孩子们 这次基本全都是命令行操作 我不用截图了 以下几乎全是命令 几乎一张图片没有 如果你想做为参考的话请仔细阅读每一行 前言 昨天我在折腾Authentik认证服务的时候 一直在思考用什么反代服务 常见的可以用Nginx Proxy Manager,Caddy,Traefik 这里面我觉得比较好用的是Traefik,但是即使是Traefik
5
记一次断电重启后ESXi的恢复
HomeLab 该说不说实不相瞒服务器我早就修好了,因为懒才拖到现在发 blog应该一边折腾一边写才对,不然弄完了就懒得发了 我不知道因为这个咕咕多少篇blog了 写在前面 woc 要不是阿里云发短信给我我都忘了我还有这么个blog在这 一看我已经两年没发东西了,我当初刚好续了两年的域名 合着我的钱就这么打水漂了 屎啊
随机文章 随机推荐
Profile Image of the Author
Cainong
Caiw there 👋
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
站点统计
文章
38
分类
16
标签
48
总字数
57,650
运行时长
0
最后活动
0 天前

文章目录