LOADING

加载过慢请开启缓存 浏览器默认开启

记一次基于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

这不就是docker run的一堆东西

那我还得手动填进去

作为懒狗的我,亚达

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

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命令行,输入

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

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

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

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

然后还是报错

没辙了 去搜了一下

我找到了这个issue

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

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

再试试

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

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

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

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