如何使用 Restic 备份客户端将数据备份到对象存储服务

介绍

Restic是用Go语言编写的安全高效的备份客户端,可以将本地文件备份到多种不同的后端存储库,如本地目录、SFTP服务器或S3兼容的对象存储服务。

在本教程中,我们将安装Restic并在对象存储服务上初始化一个存储库,然后将一些文件备份到存储库,最后,我们将自动化我们的备份以拍摄每小时的快照,并在需要时自动切割旧的快照。

前提条件

虽然Restic适用于Mac,Linux和Windows,但本教程中使用的命令和技术只会在MacOS和Linux上工作。

Restic 需要大量的内存运行,所以您应该有 1 GB 或更多 RAM 以避免收到错误。

您还需要了解有关您的对象存储服务的下列细节:

  • 访问密钥 * 秘密密密钥 * 服务器 URL * 桶名称

如果您正在使用 DigitalOcean Spaces对象存储服务,您可以设置空间并通过遵循我们的教程(How to Create a DigitalOcean Space and API Key)获取上述所有信息(https://andsky.com/tech/tutorials/how-to-create-a-digitalocean-space-and-api-key)。

一旦你有你的对象存储信息,继续到下一个部分来安装Restic软件。

安装 Restic 备份客户端

Restic 可作为许多平台的预编译执行程序提供,这意味着我们可以下载单个文件并运行它,无需包管理器或依赖性。

要找到正确的文件来下载,首先使用您的网页浏览器导航到GitHub上的Restic的发布页面(https://github.com/restic/restic/releases/latest)。

对于 64 位 Linux 系统(最常见的服务器环境),您想要的文件以 _linux_amd64.bz2 结束。

对于 macOS,请寻找包含 _darwin_amd64.bz2 的文件。

右键单击正确的文件为您的系统,然后选择 Copy Link Address (文本可能在您的浏览器中略有不同)。

接下来,在您正在备份的计算机上的终端会话中(如果是远程计算机,您可能需要先通过SSH登录),请确保您在您的主目录中,然后下载文件以弯曲:

1cd ~
2curl -LO https://github.com/restic/restic/releases/download/v0.7.3/restic_0.7.3_linux_amd64.bz

删除我们下载的文件:

1bunzip2 restic*

然后将文件复制到 /usr/local/bin,并更新其权限以使其可执行. 我们需要使用 sudo' 来执行这两个操作,因为正常用户没有权限来写到 /usr/local/bin`:

1sudo cp restic* /usr/local/bin/restic
2sudo chmod a+x /usr/local/bin/restic

测试安装是否成功,通过呼叫restic命令而没有参数:

1restic

一些帮助文本应该打印到您的屏幕上。如果是这样,则restic二进制已经正确安装了。接下来,我们将为Restic创建一个配置文件,然后初始化我们的对象存储库。

创建配置文件

Restic 需要知道我们的访问密钥、秘密密钥、对象存储连接细节和存储密码,以便初始化我们可以备份的存储库。

环境变量是您可以在壳中定义的信息,这些信息被传递给您运行的程序,例如,您在命令行上运行的每个程序都可以看到您的$PWD环境变量,其中包含当前目录的路径。

将敏感代币和密码放在环境变量中是常见的做法,因为在命令行中指定它们是不安全的,因为我们将在以后自动化我们的备份,我们将将这些信息保存到一个文件中,我们的脚本可以访问它。

首先,在您的家庭目录中打开一个文件:

1nano ~/.restic-env

这将打开一个带有nano文本编辑器的空格文件。当我们完成时,该文件将由四个出口命令组成。

1[label .restic-env]
2export AWS_ACCESS_KEY_ID="your-access-key"
3export AWS_SECRET_ACCESS_KEY="your-secret-key"
4export RESTIC_REPOSITORY="s3:server-url/bucket-name"
5export RESTIC_PASSWORD="a-strong-password"

访问和秘密密密钥将由您的对象存储服务提供,您可能希望仅为 Restic 生成一个独特的密钥集,以便在密钥丢失或被破坏的情况下,可以轻松撤销访问。

例如,RESTIC_REPOSITORY 的值是: s3:nyc3.digitaloceanspaces.com/example-bucket. 如果您需要连接到非标准端口或仅通过不安全的 HTTP 连接到服务器,请将此信息包含在 URL 中,例如 s3:http://example-server:3000/example-bucket

「RESTIC_PASSWORD」定义了一个密码,Restic将使用它来加密您的备份. 此加密发生在本地,所以您可以备份到一个不受信任的离岸服务器,而不必担心您的文件的内容被曝光。

您应该在这里选择一个强大的密码,并将其复制到安全的地方进行备份。 生成强大的随机密码的一种方法是使用openssl命令:

1openssl rand -base64 24
1[secondary_label Output]
2j8CGOSdz8ibUYK137wtdiD0SJiNroGUp

这会输出一个24个字符的随机字符串,您可以复制并粘贴到配置文件中。

一旦所有变量都正确填写,保存并关闭文件。

初始化存储器

要将配置加载到我们的壳环境中,我们我们刚刚创建的文件:

1source ~/.restic-env

您可以检查通过打印其中一个变量来确保此工作:

1echo $RESTIC_REPOSITORY

现在我们可以用 Restic 命令初始化我们的仓库:

1restic init
1[secondary_label Output]
2created restic backend 57f73c1afc at s3:nyc3.digitaloceanspaces.com/example-bucket
3
4Please note that knowledge of your password is required to access
5the repository. Losing your password means that your data is
6irrecoverably lost.

存储器现在已经准备好接收备份数据,我们将接下来发送这些数据。

备份一个目录

现在,我们的远程对象存储库已初始化,我们可以将备份数据推向它。除了加密,Restic在备份时还会变异,并且在备份时会消除重复性。这意味着我们的第一份备份将是所有文件的完整备份,后续备份只需要传输新文件和更改。

在我们备份之前,如果您在裸体系统上测试东西,需要一些示例文件来备份,请在您的主目录中创建一个简单的文本文件:

1echo "sharks have no organs for producing sound" >> ~/facts.txt

这将创建一个facts.txt文件,现在将其备份,以及您的家庭目录的其他部分:

1restic backup ~
1[secondary_label Output]
2scan [/home/sammy]
3scanned 4 directories, 14 files in 0:00
4[0:04] 100.00%  2.558 MiB/s 10.230 MiB / 10.230 MiB 18 / 18 items 0 errors ETA 0:00
5duration: 0:04, 2.16MiB/s
6snapshot 427696a3 saved

Restic将工作一段时间,在途中向您显示实时状态更新,然后输出新快照的ID(上面强调)。

<$>[注] 注: 如果您想备份不同的目录,请用上面的~代替目录路径。如果目标目录不属于您的用户,您可能需要使用sudorestic backup前面。

接下来,我们将学习如何了解存储在我们的存储库中的快照的更多信息。

列出Snapshots

要列出存储在存储库中的备份,请使用snapshots子命令:

1restic snapshots
1[secondary_label Output]
2ID Date Host Tags Directory
3----------------------------------------------------------------------
4427696a3 2017-10-23 16:37:17 restic-test              /home/sammy

您可以看到我们第一次备份时收到的快照ID、拍摄快照时刻标记、主机名称、标签和备份的目录。

我们的 标签 列是空的,因为我们在本示例中没有使用任何标签。您可以通过添加一个 --tag 旗帜,然后是标签名称,将标签添加到快照中。

标签可用于在稍后设置保留策略时过滤即时截图,或在手动搜索某个特定的即时截图以恢复时。

您需要将存储密码复制到每个机器,您还可以为您的存储设置多个密码,以便获得更精确的访问控制。您可以在 [官方的 Restic 文件] 中找到有关管理存储密码的更多信息(https://restic.readthedocs.io/en/stable/manual.html# manage-repository-keys)。

现在,我们已经上传了一个快照,并知道如何列出我们的存储库内容,我们将使用我们的快照ID来测试恢复备份。

恢复一个 Snapshot

我们将恢复一个完整的快照到一个临时目录,以确认一切正常工作. 使用从上一步的列表中的快照ID. 我们将将恢复的文件发送到新目录中的 /tmp/restore:

1restic restore 427696a3 --target /tmp/restore
1[secondary_label Output]
2restoring <Snapshot 427696a3 of [/home/sammy] at 2017-10-23 16:37:17.573706791 +0000 UTC by sammy@restic-test> to /tmp/restore

更改目录并列出其内容:

1cd /tmp/restore
2ls

您应该看到我们备份的目录. 在本示例中,它将是用户 sammy 的首页目录. 输入恢复的目录并列出内部的文件:

1cd sammy
2ls
1[secondary_label Output]
2facts.txt restic_0.7.3_linux_amd64

我们的facts.txt文件在那里,以及我们在教程开始时提取的残留的二进制文件,在屏幕上打印facts.txt,以确保它是我们期望的:

1cat facts.txt

你应该看到鲨鱼的事实,我们把它放在文件之前。

如果您不想在一张照片中恢复所有文件,您可以使用 --包括--排除 选项来精确调整您的选择。阅读 Restic 文档中的 Restore**部分以了解更多信息。

现在我们知道备份和恢复工作了,让我们自动创建新的快照。

自动备份

Restic 包含一个忘记命令,以帮助维护正在运行的快照档案。 您可以使用忘记 – prune来设置每日、每小时、每周等备份的数量的策略。

我们将使用cron系统服务每小时执行备份任务. 首先,打开用户的crontab:

1crontab -e

您可能会被要求选择文本编辑器。 选择您最喜欢的 - 或者nano如果您没有意见 - 然后按ENTER。 您的用户的默认 crontab 将在文本编辑器中打开。

1[label crontab]
2. . .
342 * * * * . /home/sammy/.restic-env; /usr/local/bin/restic backup -q /home/sammy; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7

让我们通过这个命令步骤. 该 42 *** ** 定义了什么时候 cron 应该运行任务. 在这种情况下,它将运行在每一个** 小时** ,** 日** ,** 月** ,和** 周日** 的第42** 分钟。 有关这个语法的更多信息,请阅读我们的教程 如何使用 Cron 来自动化任务

接下来, . /home/sammy/.restic-env; 等同于 source ~/.restic-env,我们先前运行,将我们的密钥和密码加载到我们的壳环境中。

「/usr/local/bin/restic backup -q /home/sammy;」是我們的 Restic 備份命令. 我們使用到「restic」二進制的完整路徑,因為「cron」服務不會自動尋找「/usr/local/bin」的命令。 同樣地,我們用「/home/sammy」來明確地寫出主文件夾的路徑,而不是使用「~」的捷徑。 在寫作「cron」命令時,最好盡可能明確。

最后, /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7 将根据指定保留旗帜不再需要的旧快照剪除。

当您更新命令以满足您的需求时,保存文件并离开文本编辑器. crontab 将被安装和激活. 几小时后,再次运行restic snapshots,以验证新 snapshots 正在上传。

结论

在本教程中,我们创建了对象存储身份验证细节的Restic配置文件,使用Restic初始化一个存储库,备份了一些文件,并测试了备份。

要了解更多关于 Restic 的信息,请参阅他们的 官方文件主要网站

Published At
Categories with 技术
comments powered by Disqus