原本是打算不再在这里写技术类博客了,结果最近的一个小成果确实没啥合适的地方存放,所以还是留在这里吧。
自从开始使用树莓派,忧虑的一个重要问题就是:万一我的硬盘坏了可怎么办?通常的方案是硬盘组磁盘列阵,例如 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
- Create an initial config file (
autorestic.yml
) such as:
|
|
You can read full docs to configure it.
- Create an empty file (
autorestic.lock.yml
) - run [[docker-compose]] as below:
|
|
Usage
you can use autorestic to show all buckups such as
|
|
and also use restic directly such as
|
|
License
MIT © Uglyboy