最后更新于

NAS 数据备份:Borgmatic 与 Docker 的部署实践


一次数据丢失引发的“惨剧”

最近在调整家庭实验室的存储结构时,我不小心删除了自己的电子书。这次经历让我深刻体会到,我们常常以为数据在别处有备份,直到误删后才发现根本没有。

为了避免类似的“惨剧”再次发生,我认为有两种行之有效的方法(业界备份 321 原则的个人化表达):

1. 增加备份地点,打造“触不可及”的保险库

需要让自己的数据备份地点尽可能多,多到自己甚至会“懒得去碰”其中一个。只有这样,这个“被遗忘”的备份点才能成为我的救命稻草。试想一下,如果两个硬盘都在同一台机器里,很可能会为了方便而顺手把它们都删掉。因此,分散存储是关键,让自己的备份散布在不同的设备、不同的物理介质,甚至是不同的地点。

2. 自动化备份流程,让数据保护不再依赖“自觉”

除了增加备份地点,另一个重要的策略是自动化的备份流程。手动备份容易遗漏,也容易在忙碌或疲惫时被忽略。设置自动同步和备份,确保重要数据能够定期、自动地复制到自己预设的多个存储位置。这样一来,即使忘记了,系统也会帮我完成,大大降低了数据丢失的风险。


绿联 NAS 内置备份功能的局限与我的选择

由于我的存储中心放在了绿联 NAS 上,我也重点体验了一下其内置的备份功能,发现和我想象中的有些不一样。

绿联内置的“同步与备份”应用:

  • 同步功能: 它本质上是一个自建的云盘服务,主要用于让用户将本地电脑的文件双向同步到绿联 NAS。但我觉得绿联的电脑客户端体验不佳,像是一个 Electron 套壳应用。而且我已自行部署了 Nextcloud,所以这个同步功能对我来说用处不大。
  • 备份功能: 绿联的备份应该是基于 rsync 的文件复制。然而,rsync 并不具备传统备份软件的多版本功能,这对于需要回溯历史版本的备份场景来说是个明显的不足。

在咨询了 Gemini 后,我在 Duplicati 和 Restic 中权衡,最终选择了 BorgBackup + Borgmatic 的组合。


Borgmatic 在绿联 NAS 上的部署实践(小白版)

Borgmatic 有一个 Docker 版本,这更适合在绿联 NAS 上部署。考虑到涉及到一些加密数据,我对数据做了脱敏处理,并将一个模板项目放在了 GitHub 上。

具体如何“食用”:

  1. 打开模板项目 https://github.com/Tomyail/borgmatic-template
  2. 点击 Code -> Download ZIP 并解压。
  3. 调整项目文件夹中 data/borgmatic.d/ 下的配置文件。每个配置代表一个备份任务,根据自己的需求修改 source_directoriesrepositories
  4. 进入绿联 NAS 的 Web UI,打开文件管理,选中 Docker 共享文件夹,点击“上传文件夹”,选择你刚刚解压的项目文件夹。
  5. 上传完毕后,选择“Docker”,点击“项目”,然后点击“创建”。
    1. 存放路径选择你刚刚上传的地址,如果报错“该路径已存在 Compose 配置,请重新选择路径或导入该配置”,则选择“导入该配置”,Compose 文件会自动加载。
      • 修改 volume,适配自己的需求。
      • 修改环境变量,适配自己的需求。
    2. 项目名称随意填写。
    3. 点击“部署”。
  6. 部署成功后,选择运行中的 Borgmatic 容器,切换到“终端”选项卡,新建一个 Bash 终端,输入 borgmatic init --encryption repokey 初始化仓库。
  7. 一切成功后,执行 borgmatic --stats -v 1 --files

监控与结果解读

为了更全面地监控备份状态和结果,可以采用以下方法:

一. Healthchecks.io 状态监控:

data/borgmatic.d/includes/common.yaml 配置中有一个 healthchecks.ping_url 的占位符,如果不需要可以删除。如果需要,可以前往 https://healthchecks.io/ 注册并替换。它的作用是按照指定的通知周期接受预期的通知消息,如果没有收到,它就会认为备份服务出现问题,并发送通知。通过 Healthchecks 的事件日志,我也能看到每次备份的执行结果,例如首次备份照片目录的结果(如下图所示):

二. Prometheus + Grafana 可视化监控:

为了更深入地分析备份数据和趋势,可以利用 borgmatic-exporter 将备份指标数据导出,然后通过 Prometheus 进行收集,并在 Grafana 中进行可视化展示。具体安装 exporter 可以参考 docker 安装 exporter。配置好 Prometheus 的抓取规则后,就能在 Grafana 中看到类似下面的详细备份结果面板:

备份数据解读

无论是 Healthchecks 的日志还是 Grafana 面板,都应该重点关注 This archiveDeduplicated size。它表示每次备份实际新增的数据量。由于是首次备份,这个值会是全量数据的大小;后续的备份则会显示增量数据的大小。

另外需要注意的是,备份完毕后 Borg 会执行 consistency check(一致性检查)。如果备份数据量很大,这个过程可能会非常耗时。因此,可以根据需求在 data/borgmatic.d/includes/common.yamlchecks 配置中调整检查频率,以平衡效率和数据完整性。


部署过程中的问题与思考

  1. 绿联 Docker Compose 文件独立维护: 比如我声明项目存放在 /volume2/docker/borgbackup/volume2/docker/borgbackup/docker-compose.yaml 文件是主要配置文件。此时 /volume2/docker/borgbackup 是一个 Git 项目,但我在其他地方修改完 docker-compose.yaml 后,在绿联中对该项目 Git Pull,docker-compose.yaml 文件虽然更新了,但控制台看到的仍然是旧文件。
  2. GitOps 实践受阻: 我原本希望实现 GitOps,即 Git 仓库更新后 Docker Compose 可以自动更新。尝试了 Portainer,虽然可以实现定期或通过 Webhook 更新 Docker Compose,但是社区版的 Docker Compose 中的 volume 必须使用绝对路径,只有商业版才能使用相对路径。所以最终还是在 Git 有更新后,手动 SSH 到绿联的机器获取配置并 docker compose restart
  3. SSH 密钥问题: 我已经 ssh-copy-id 私钥,但每次 SSH 登录绿联 NAS 还是需要输入密码 🤷。

其他参考