HestiaCP 自带的备份功能提供了强大的数据保护功能,可以轻松地对用户数据进行全量备份。其实现方式是打包整个用户目录下的所有文件,这对于大多数用户来说已经足够。但如果你需要更高效、灵活的备份方式,尤其是增量备份,那么使用 Restic 进行备份将是一个更好的选择。
增量备份相比全量备份,能够只备份发生变化的数据,从而大幅减少备份数据量,节省存储空间并提高备份速度。虽然 HestiaCP 在未来的版本中计划内建对 Restic 增量备份的支持,但它仍然局限于备份位于用户目录下的文件。为了实现更灵活的备份,我们可以通过安装 Restic 和配置 Autorestic 来实现自动化增量备份,并且不仅限于用户目录的文件。
在本篇教程中,我们将详细介绍如何在 HestiaCP 中安装 Restic、配置 Autorestic,并通过定时任务实现自动增量备份。
安装使用 Restic
安装
Restic 的安装很简单。
sudo apt update
sudo apt install restic
安装后更新 Restic
sudo restic self-update
设置存储库
之前我们介绍了 MinIO 的安装方法。
Restic 支持将备份保存到本地或远程存储库,我们将使用 MinIO 作为 S3 兼容的存储库来保存备份数据。
首先,在 MinIO 中创建一个新的存储桶,命名为 restic
,然后生成一对 Access Keys(访问密钥)。接下来,使用 MinIO 的凭据设置以下环境变量:
export AWS_ACCESS_KEY_ID=<YOUR-MINIO-ACCESS-KEY-ID>
export AWS_SECRET_ACCESS_KEY=<YOUR-MINIO-SECRET-ACCESS-KEY>
接着,初始化 Restic 存储库:
restic -r s3:https://xxx.com/restic init
在初始化过程中,系统会提示你设置一个密码。请务必妥善保存此密码,因为一旦丢失,无法访问或恢复存储库中的备份数据。
备份
现在,我们准备备份一些数据。在 Restic 中,特定时间点的目录内容被称为“快照”。运行以下命令进行备份,并输入你之前设置的存储库密码:
restic -r s3:https://xxx.com/restic --verbose backup /data
- 在这里,
--verbose
参数将提供更多的备份信息。
备份完成后,Restic 会创建一个名为十六进制字符的快照。如果你再次运行相同的备份命令,Restic 会创建另一个快照,但由于之前的数据已经存在,新的快照不会增加新的数据。
你甚至可以只备份单个文件,例如:
restic -r s3:https://xxx.com/restic --verbose backup /data/test.txt
快照可以拥有一个或多个标签,用来为快照添加标识信息。使用 --tag
参数逐一指定标签:
restic -r s3:https://xxx.com/restic --verbose backup --tag projectX --tag foo --tag bar /data
要查看所有的快照,可以使用以下命令:
restic -r s3:https://xxx.com/restic snapshots
假设你已经有两个存储库:一个本地存储库和一个远程存储库。可以使用以下命令将快照从本地存储库复制到远程存储库:
restic -r /srv/restic-repo-copy copy --from-repo /srv/restic-repo
- 源存储库使用
--from-repo
指定
更多关于排除文件、备份功能以及快照比较等高级用法,请参考 Restic 官方文档。
恢复
要恢复快照的内容,可以使用 restic restore
命令。以下命令将最新快照的内容恢复到 /data
目录:
restic -r s3:https://xxx.com/restic restore 1c33a516 --target /data
在这个命令中:
1c33a516
是要恢复的快照 ID。你可以从restic snapshots
命令中获取到快照 ID。--target /data
指定恢复的目标目录。
如果你希望恢复最新的备份,可以使用 latest
关键字来代替快照 ID:
restic -r s3:https://xxx.com/restic restore latest --target /data
这会自动恢复最近创建的快照。
关于如何恢复单个文件或选择性恢复,请参考 Restic 官方文档 获取更多高级用法。
删除
如果你需要删除某个特定的快照,可以使用 restic forget
命令,并在命令行中指定要删除的快照 ID。例如,要删除 /home/art
目录的快照,可以运行:
restic -r s3:https://xxx.com/restic forget bdbd3439
你可以通过运行 restic snapshots
命令获取快照 ID。
清理未引用的数据
执行 forget
命令后,虽然指定的快照被删除,但这些快照中的文件引用的数据仍然保留在存储库中。要完全清理这些未引用的数据,必须运行 prune
命令:
restic -r s3:https://xxx.com/restic prune
定义快照保留策略
Restic 允许你通过指定保留策略来自动管理快照的生命周期。使用 --keep-*
选项,你可以定义保留哪些快照,删除不符合条件的其他快照。以下是一些常用的保留策略:
--keep-last n
保留最近的n
个快照,删除其他的。--keep-hourly n
保留过去n
小时内每小时一个快照,删除更早的。--keep-daily n
保留过去n
天内每天一个快照,删除更早的。--keep-weekly n
保留过去n
周内每周一个快照,删除更早的。--keep-monthly n
保留过去n
个月内每月一个快照,删除更早的。--keep-yearly n
保留过去n
年内每年一个快照,删除更早的。
例如,想要保留最近的 5 个快照、每小时一个、每周一个和每月一个快照,可以运行:
restic -r s3:https://xxx.com/restic forget --keep-last 5 --keep-hourly 24 --keep-weekly 4 --keep-monthly 12
这将根据你指定的策略,自动保留符合条件的快照,并删除不符合条件的旧快照。
管理存储卡密钥
Restic 允许你管理每个存储库的密钥,使用 key
命令,你可以列出、添加、删除和更改密码。常用命令如下:
- 列出密钥
查看存储库中的所有密钥:
restic -r s3:https://xxx.com/restic key list
会显示每个密钥的 ID、用户和创建时间。
- 添加新密钥
向存储库中添加新密钥:
restic -r s3:https://xxx.com/restic key add
输入存储库密码并设置新密钥的密码。
- 删除密钥
删除一个密钥:
restic -r s3:https://xxx.com/restic remove <KEY-ID>
使用 key list
命令获取要删除的密钥 ID。
- 更改密码
更改存储库的访问密码:
restic -r s3:https://xxx.com/restic key passwd
输入当前密码并设置新密码。
安装使用 Autorestic
Restic 本身没有内置的定时备份功能,因为它是一个手动运行的工具。
为了自动定期备份,我们需要使用 Autorestic。它可以帮助你安排和自动执行备份任务,确保数据定期备份而不需要手动操作。
安装
wget -qO - https://raw.githubusercontent.com/cupcakearmy/autorestic/master/install.sh | bash
配置
默认情况下,Autorestic 会在以下路径中查找 .autorestic.yml
配置文件:
./.autorestic.yml
~/.autorestic.yml
~/.config/autorestic/.autorestic.yml
你也可以通过 -c
选项指定一个自定义的配置文件路径:
autorestic -c path/to/some/config.yml
下面是一个示例配置:
version: 2
locations:
hestiacp_backup:
from: /backup # 备份的源路径
to: HETZNER # 存储位置名称
cron: '0 3 * * *' # 定时备份任务,每天3点执行
forget: prune # 删除策略:使用prune来清理旧备份
options:
all:
tag: hes_backup # 为所有备份添加标签
forget:
keep-last: 50 # 保留最近的50个快照
keep-daily: 7 # 保留最近7天的备份
keep-weekly: 4 # 保留最近4周的备份
keep-monthly: 12 # 保留最近12个月的备份
keep-yearly: 3 # 保留最近3年的备份
backends:
HETZNER:
type: s3 # 使用S3存储后端
path: https://xxx.com/restic # 存储库地址
key: 123456789 # 存储库密钥
env:
AWS_ACCESS_KEY_ID: AAAAAAAAAAAAAA # S3访问密钥
AWS_SECRET_ACCESS_KEY: AAAAAAAAAAAAAAA # S3秘密访问密钥
- locations:指定备份的位置,包括备份源 (
from
)、存储目标 (to
)、以及定时任务 (cron
)。 - backends:配置备份存储后端,在这个例子中是 S3,指定了存储库路径、密钥和相关环境变量。
使用 copy
选项
可以使用 copy
命令将快照从一个存储库复制到另一个,避免重新计算备份。
locations:
my-location:
from: /data
to:
- a
- b
copy:
a:
- c
定时备份
定时备份配置
首先,打开 crontab
编辑模式:
crontab -e
在文件底部添加以下内容并保存:
# 设置环境变量,确保能找到 restic 命令
PATH="/usr/local/bin:/usr/bin:/bin"
# 每5分钟触发一次备份
*/5 * * * * autorestic -c /path/to/my/.autorestic.yml --ci cron
autorestic cron 的工作原理
- 定时触发备份:
autorestic cron
会根据配置文件中定义的备份任务(如locations
部分)自动执行备份,无需手动操作。 - 独立于位置的 cron 设置:每个位置的
cron
属性独立配置,autorestic cron
会定期检查并执行所有任务。
手动备份与自动备份
手动执行的备份(如 autorestic backup
)与定时任务(cron
)相互独立,不会互相影响。手动备份立即执行,而定时备份根据设定的时间表自动触发。
更多请参考官方文档。
注意事项
Restic 备份操作的基础和原理
- 增量备份原理: Restic 是增量备份软件,每次备份时会仅保存自上次备份以来发生变化的文件。Restic 会通过文件的内容、路径、标签和主机来判断哪些文件需要备份。
- 判断依据: Restic 判断是否需要进行备份,主要依赖以下几个参数:只要你能够“欺骗” Restic,让它认为文件发生了变化(即使内容没有变),你就可以使 Restic 执行新的备份。
- Host:主机名。
- Tags:标签。
- Paths:备份的文件路径。
- 由于使用的是 HestiaCP,在不同的主机上安装时需要配置不同的域名,因此通常情况下,即使不使用标签(Tags),也不会触发增量备份,因为 Restic 会根据主机名(Host)来判断是否为新的备份。
迁移 Restic 存储库到新服务器
如果你将 Restic 存储库迁移到新的服务器,并且新服务器能够正确访问原有的 S3 存储桶(即存储库所在位置),只要提供了正确的访问凭证,你无需重新初始化存储库。
配置完凭证后,你可以直接使用现有的存储库进行备份、恢复等操作,而不需要重新初始化存储库。