Backrest + OpenList 加密备份数据到网盘

为什么我要用Backrest加密备份到网盘,而不是仅仅依赖RAID?RAID 解决的是硬盘故障时的可用性问题——某块盘坏了,阵列还能继续工作。但你误删了文件,RAID 会在所有盘上同步删除文件;勒索软件加密了你的数据,RAID 会保存加密后的版本;文件系统损坏、bug导致数据写坏等等,RAID一样无能为力。更别提火灾、被盗这些物理因素——数据和 NAS 一起没了,再怎么冗余也救不回来。

所以RAID只是冗余,而不是备份,真正可靠的数据保护需要遵循 3-2-1 备份原则

  • 3 份数据副本(原始数据 + 2 份备份)
  • 2 种不同的存储介质(比如本地硬盘 + 云端)
  • 1 份异地备份(物理上与原始数据不在同一个地方)

本地存储解决手滑删错和硬盘故障的问题,异地云端副本解决”整台设备没了”的问题。两者缺一不可。

前置说明

优点

  • 数据安全不依赖网盘。restic 对所有数据进行 AES-256 加密并附带完整性校验,网盘只能看到一堆密文。即使网盘账号泄露,别人拿到的也只是无法解密的二进制块。
  • 增量备份 + 去重,省空间也省带宽。restic 按内容分块去重,只有真正变化的部分才会被上传。日常备份场景下,每次的实际传输量很小。
  • 快照机制,可以回滚到任意历史版本。每次备份生成一个独立快照,配合保留策略,你可以精确恢复到某一天、某一周的状态,而不是只有最新的一份。
  • 全程 Web 界面管理。Backrest 提供可视化的备份调度、快照浏览、恢复操作界面,日常使用不需要碰命令行。
  • Docker 部署,迁移方便。整套方案一个 compose 文件拉起,换机器时搬走配置目录即可。

整体链路

Backrest → restic → rclone → WebDAV → OpenList → 网盘

各组件的角色:

  • restic:负责加密、去重、快照,是实际干活的备份引擎
  • rclone:restic 不直接支持 WebDAV,rclone 作为中间层桥接协议
  • OpenList:把网盘挂载成 WebDAV 服务,让 rclone 能访问
  • Backrest:给 restic 套了一层 Web UI,提供调度、快照浏览、恢复操作

这套方案我自己已经稳定跑了很长一段时间,整体链路验证下来是可靠的。

Docker Compose 部署

先把 OpenList 和 Backrest 两个服务拉起来。下面是 compose 文件,几个需要注意的地方我直接标在后面:

version: "3.8"

services:
  openlist:
    image: openlistteam/openlist:latest
    restart: unless-stopped
    user: "${UID}:${GID}"
    ports:
      - "7801:5244"
    volumes:
      - ./openlist:/opt/openlist/data
    environment:
      - TZ=Asia/Shanghai

  backrest:
    image: garethgeorge/backrest:latest
    restart: unless-stopped
    depends_on:
      - openlist
    ports:
      - "7800:9898"
    volumes:
      - ./backrest/data:/data
      - ./backrest/config:/config
      - ./backrest/cache:/cache
      - ./rclone:/root/.config/rclone
      - /path/to/your/data:/userdata:ro
    environment:
      - BACKREST_DATA=/data
      - BACKREST_CONFIG=/config/config.json
      - XDG_CACHE_HOME=/cache
      - TZ=Asia/Shanghai
Code language: PHP (php)

几点说明:

  • user 字段:OpenList v4.1.0 起容器内默认用户为 openlist(1001),映射目录需要有对应权限。这里用 ${UID}:${GID} 环境变量来适配你的实际用户,你也可以直接写死(例如 "1000:1000")。如果不想折腾权限问题,"0:0" 以 root 运行最省事,但生产环境请酌情考虑安全性。
  • ports:按你的喜好自定义宿主机端口映射,本文以 7801(OpenList)和 7800(Backrest)为例。
  • /path/to/your/data:/userdata:ro:把 /path/to/your/data 改成你想备份的宿主机目录。如果只用作备份(不需要通过 Backrest 写入源数据),建议保持 :ro 只读挂载,防止误操作。

两个服务在同一个 compose 项目里,会自动加入同一个 Docker 网络。后面 rclone 配置 WebDAV 地址时可以直接用容器名 openlist 互通,不需要走宿主机 IP。

启动服务:

docker compose up -d

验证两个容器都在跑:docker compose ps,确认状态都是 Up

配置 OpenList

获取初始密码

OpenList 首次启动会随机生成 admin 密码,查看容器日志拿到它:

docker logs -f backrest-openlist-1

在日志输出中找到类似 Initial password: xxxxxxxx 的行,记下这个密码。

登录后台

浏览器访问 http://你的机器IP:7801/,用 admin 账号和上一步拿到的密码登录。

添加存储

进入存储页面,点击添加

我用的是百度网盘,所以驱动选择百度网盘(按实际情况选择其他网盘亦可),填写以下关键配置项,完成后点击添加

注意:强烈建议参考 OpenList 官方文档按需配置,本文的配置仅供参考,不一定有普适性!

各字段含义:

  • 挂载路径:该存储在 OpenList 里对外显示的虚拟路径,例如 /baidu。后面 rclone 通过 WebDAV 访问时会用到这个路径。
  • 缓存过期时间:个人使用场景下可以调低到 1(分钟),让文件列表更及时刷新。
  • 启用签名:建议开启,避免文件链接被直接访问。
  • 根文件夹路径:指定网盘里的哪个目录作为此存储的根目录,例如 /Backup,避免暴露网盘中的其他内容。
  • 使用在线 API、客户端 ID、客户端密钥、刷新令牌:这几项是接入百度网盘 API 的核心凭据,请务必仔细参照官方文档获取。

如果你无法信任官方提供的 Token Generator,可以自行部署:https://github.com/OpenListTeam/OpenList-APIPages

开启 WebDAV

restic 不直接支持网盘,我们需要通过 OpenList 的 WebDAV 功能,再配合 rclone 来桥接。默认情况下 admin 账号的 WebDAV 写入权限未开启,需要手动配置。

点击用户,编辑 admin:

勾选 WebDAV 管理(备份场景需要完整的读写权限,如果还有”WebDAV 读取”等选项也一并勾选):

配置 rclone

Backrest 的 Docker 镜像已经内置了 rclone,直接在容器内配置。

进入交互式配置:

docker exec -it backrest-backrest-1 rclone config

按以下步骤操作:

  1. 选择 n(New remote)
  2. Name:随意,例如 openlist
  3. Type:选择 webdav(编号 59,可能因版本不同而变化)
  4. URL:填写 http://openlist:5244/dav/(两个容器在同一 compose 网络里,直接用服务名互通)
  5. Vendor:直接回车留空
  6. User / Password:填写 OpenList 的用户名和密码
  7. Bearer token:直接回车留空
  8. Edit advanced config:选择 n
  9. Keep this “openlist” remote:选择 y,然后 q 退出

配置完成后,验证连通性:

docker exec -it backrest-backrest-1 rclone lsd openlist:

如果能看到你在 OpenList 中挂载的存储目录(例如 baidu),说明 rclone → WebDAV → OpenList 这条链路已经通了。如果报错,先检查 OpenList 容器是否正常运行、WebDAV 权限是否开全。

配置 Backrest

初始设置

浏览器访问 http://你的机器IP:7800/,首次进入需要配置实例 ID、用户名和密码。

添加仓库

点击添加仓库,填写以下配置:

  • 仓库名称:任意,例如 baidu
  • 仓库 URI:格式为 rclone:remote名称:路径,例如 rclone:openlist:/baidu/restic。其中 openlist 是上一步创建的 rclone remote 名称,/baidu/restic 是 OpenList 中的路径(/baidu 对应挂载路径,/restic 是备份仓库的子目录)。
  • 密码:设置一个足够复杂的密码,restic 会用它对整个备份仓库进行 AES-256 加密。这个密码丢了就无法恢复数据,请务必妥善保管。

填完后先点测试配置验证连通性,没问题再提交。Backrest 会自动初始化 restic 仓库,完成后你能在百度网盘对应目录下看到 restic 的标准仓库结构(configdata/index/keys/ 等)。

配置备份计划

点击添加调度计划,填写以下内容:

  • 调度计划名称:随意,例如 daily-backup
  • 仓库:选择刚刚创建的仓库
  • 路径:填写你想备份的容器内目录,例如 /userdata(对应 compose 中挂载的宿主机目录)
  • 备份周期:按需配置,例如每天凌晨执行
  • 快照保留策略:配置保留多少个快照,常见策略如保留最近 7 个、每天 1 个保留 14 天、每周 1 个保留 8 周等,根据你的存储空间和需求调整

备份参数中可以进一步调优:

  • 包大小(单位 MB):restic 打包数据的块大小。如果网络不稳定,可以适当调小,降低单次传输失败的影响。
  • 上传限速(单位 KB/s):避免备份任务占满带宽影响其他服务,按需设置即可。

配置完成后,备份计划会按设定的周期自动执行。你也可以在 Backrest 界面手动触发一次备份,验证整条链路是否畅通。

小结

这套方案能够做到异地备份,端到端加密 + 增量去重,加上 Backrest 的 Web 管理界面,日常维护成本不高。

如果你的备份目标不是百度网盘,只需要把 OpenList 里的存储驱动换成对应网盘,其余配置基本不变。

另外需要说明的是:通过 OpenList 挂载网盘不一定能做到 100% 稳定可靠。网盘侧可能会有接口限流、鉴权刷新失败、偶发超时、以及对大文件/高频小文件写入的兼容性差异。因此更稳妥的做法是把备份当作“多副本”来设计:同时备份到两个不同的网盘(或两种不同介质),避免单一链路故障导致备份不可用。如果预算充足、且更在意长期稳定性与可维护性,也可以考虑使用云厂商提供的对象存储作为备份后端。

Azure99

底层码农,休闲音游玩家,偶尔写写代码

看看这些?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注