想法

原本是打算不再在这里写技术类博客了,结果最近的一个小成果确实没啥合适的地方存放,所以还是留在这里吧。

自从开始使用树莓派,忧虑的一个重要问题就是:万一我的硬盘坏了可怎么办?通常的方案是硬盘组磁盘列阵,例如 raid1,raid5,raid10。可惜这套方案价格太高,不符合我用树莓派做 NAS 的风格。所以还是追求一套通常且通用的数据备份方案。

其间尝试了一些手段,例如:rclone,Duplicati,rsync,自己写 shell 脚本等等,但是如何构建一个完善的数据备份方案还是比较复杂的,需要考虑包括备份的可靠性,备份文件的大小(冗余程度),备份的版本管理,按不同时效留档等很多的要素。

最终,终于遇到了 automation ,并依此打造了一套完善的备份方案。

备份方案的基本原则

  • 备份数据要保证本地非源数据的硬盘保存一份,云端保存一份;
  • 云端备份需要有数据加密机制;
  • 备份数据需要有类似 git 的版本管理机制,保证冗余数据不被重复存储,且按版本标签可方便的管理;
  • 云端保存需要支持各种云端数据源;
  • 本地需要有旧版本文件清理机制;
  • 可以对不同的数据源进行不同的备份机制设定;
  • 自动化管理备份,无需过多的人工干预和介入;

数据备份方案的基本组件

rclone

最早我是使用 rclone + shell 进行备份的,但是这只能解决云端备份和支持数据源的部分,而且设定异常的复杂。根本原因是在于,rclone 其实是一款同步数据应用,而不是数据备份应用。

但现在有了一个良好的开端:可以将数据同步到任何云端网盘中了。

restic

这是一款类似于 rclone 的软件,但是不同的是,restic 是专注于备份的软件,支持加密传输,增量备份,快照记录等等,而且还可以同 rclone 联动,利用 rclone 支持多种云端的能力,将数据备份到各种网盘中。

另外,restic 也可以非常便捷的还原任何一个版本的数据,总得来说,是一个很简单便捷的备份工具。但它是一个命令行工具,也就是说,并不是一个服务,无法提供自动备份的功能(定时备份),而且每一项操作都需要运行相关命令加参数。

如此一来,关于备份这件事,就只剩下自动化版本管理这个问题需要解决了。

autorestic

autorestic 是 restic 的一个「包装器」,通过自动调用 restic 的方法,加上了配置文件、定时执行(伪)等功能。将命令行程序扩展成了一个基于固定配置可重复运行的应用。

相关的命令说明还是需要自己看一下官方的文档。

但 autorestic 依然是一个命令行,不是服务,虽然提供了配置文件的方式可重复操作,但依然无法实现定时自动备份功能

crontab

autorestic 的官方文档推荐的方式即配合 crontab 每 5 分钟执行一次的方式 将 autorestic 配置成一个伪服务,进而提供定时自动备份功能。

docker

最后,终极的解决方案,是需要将这些工具组合起来,形成一套完整的工具链。于是将对应的工具打包进 docker image,就可以便捷的部署和使用对应的自动化备份方案了。

2023-12-18 更新

  • 之前一直没有能自动进行 forget 操作,导致备份的数据越来越多。这个问题需要在 autorestic 的配置文件中添加 forget 的配置。
  • 之前的镜像的 hostname 每次都是随机生成的,导致每次都会重新初始化,现在已经解决了这个问题,通过在 docker-compose 中添加 hostname,可以保证每次都是同一个 hostname 了。

最终的数据自动化备份解决方案

我通过 Github 的自动化流程,构建了实现上述 autorestic 服务的 镜像 ,使用说明如下:

Features

Often it is usefully to trigger backups automatically. So in this image, it would be trigger the command every 5min.

Install

  1. Create an initial config file (autorestic.yml) such as:
1
2
3
4
5
6
locations:
  my-location:
    from: /data
    to: my-backend
    forget: prune
    cron: '0 3 * * 0' # Every Sunday at 3:00

You can read full docs to configure it.

  1. Create an empty file (autorestic.lock.yml)
  2. run [[docker-compose]] as below:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: "3"
services:
  autorestic:
    image: guixi/autorestic
    container_name: autorestic
    restart: unless-stopped
    hostname: autorestic
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - $(pwd)/autorestic.yml:/root/.autorestic.yml:ro
      - $(pwd)/autorestic.lock.yml:/root/.autorestic.lock.yml
      - ~/.config/rclone/rclone.conf:/root/.config/rclone/rclone.conf:ro  #optional
      - my-volume:/data

Usage

you can use autorestic to show all buckups such as

1
docker exec -it autorestic autorestic exec -av -- snapshots

and also use restic directly such as

1
docker exec -it autorestic restic

License

MIT © Uglyboy