Introduction

Duplicity是用Python编写的命令行实用程序,可生成加密的tar卷以存储在本地或远程存储库中。它使用GNU Privacy Guard(GPG)对其存档进行加密和签名,并使用rsync算法创建节省空间的增量备份。备份可以传输到各种存储库,包括本地文件存储,SFTP或FTP服务器以及与S3兼容的对象存储。

在本教程中,我们将安装Duplicity并介绍如何将项目数据备份到DigitalOcean Spaces(与S3兼容的对象存储服务)。为此,我们将创建一个Spaces存储库,并介绍如何手动将数据备份到该存储库。最后,我们将通过创建一个脚本来自动执行此过程,该脚本将设置增量备份和每周完整备份计划。

先决条件

对于本教程,您将需要:

  • 一台Ubuntu 16.04服务器,按照我们的Ubuntu 16.04初始服务器设置教程进行设置。遵循本教程之后,您应该具有非root用户sudo用户。
  • 通过遵循如何创建DigitalOcean空间和API密钥来创建DigitalOcean空间和API密钥。请务必注意您的Space的以下凭证:    访问密钥  密钥  空间网址  铲斗名称

设置好空间并掌握好此信息后,即可继续安装Duplicity。

安装双重性

要获取Duplicity的最新版本,我们可以从Duplicity发布的“个人软件包存档”(PPA)中进行安装:

  • sudo apt-add-repository ppa:duplicity-team/ppa

我们还将安装python-boto软件包,以访问Boto,这是一个提供与Amazon Web Services的接口的Python软件包。这将帮助我们利用Spaces与AWS S3 API的互操作性。我们将从官方Ubuntu存储库中安装python-boto,因为该版本与Ubuntu服务器映像随附的Python版本兼容。如果您仍希望使用Boto3,则可以从源代码安装它,尽管仍在开发与Python 3.3+的功能兼容性。

除了python-boto,我们还将安装Haveged,该工具将帮助我们生成创建GPG密钥所需的熵。为了创建这些密钥,GPG利用了我们系统中熵或不可预测性的级别。安装Haveged将帮助我们加快密钥创建过程。

在安装这些软件包之前,请更新本地存储库索引:

  • sudo apt-get update

然后通过输入以下命令安装duplicity,python-boto和hadged:

  • sudo apt-get install duplicity haveged python-boto

当提示您确认安装时,按y。现在,我们在系统上安装了Duplicity,并准备创建我们的项目文件夹和配置文件。

创建备份目录

为了演示备份过程的工作原理,我们将在非root用户的主目录中为备份创建目录,并提供一些示例数据。我们将目录称为sammy_backups:

  • mkdir ~/sammy_backups

接下来,创建一个名为history_sharks.txt的示例项目文件:

  • echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt

有了我们的备份目录和测试数据之后,我们就可以为非root用户生成GPG密钥了。

生成GPG密钥

接下来,我们将为用户生成一个GPG密钥对。为了确保信息的安全传输,GPG使用公钥加密。在我们的上下文中,这意味着数据将被加密为我们的公钥并发送到我们的存储库。有关GPG密钥和加密的更多信息,请参见有关如何使用GPG签名和加密消息的教程。

我们的密钥环将存储在用户帐户的〜/ .gnupg目录中,该目录将在生成密钥时创建。当我们使用duplicity命令时,我们将指定一个指向我们的密钥对的公共密钥标识符。使用此标识符可启用数据加密和签名,以验证我们对私钥的所有权。加密的数据将被传输到我们的存储库中,在这里很难从文件本身推断出文件大小和上载时间。这样可以保护我们的数据,我们的用户可以随时使用私钥将其完全还原。

默认情况下,GPG应该安装在我们的服务器上。要对此进行测试,请键入:

  • gpg --version

确认已安装GPG后,您可以生成密钥对,如下所示:

  • gpg --gen-key

系统将提示您一系列问题来配置密钥:

  • 密钥类型。选择(1)RSA和RSA(默认)。
  • 密钥大小。按ENTER将确认默认大小为2048位。
  • 密钥到期日期。输入1y,我们将创建一个密钥,该密钥将在一年后失效。
  • 确认您的选择。您可以通过输入y来执行此操作。
  • 用户ID /真实姓名。输入你的名字 。
  • 电子邮件地址。输入你的电子邮箱地址 。
  • Comment. Here, you can enter an optional comment that will be visible with your signature.
  • 更改(N)ame,©omment,(E)mail或(O)kay /(Q)uit?如果您准备继续,请键入O。
  • 输入密码。系统将要求您在此处输入密码。请务必注意此密码短语。在本教程的其余部分中,我们将其称为your-GPG-key-passphrase。

创建这些设置后,gpg将根据系统中的熵级别生成密钥。由于我们安装了hadged,因此应该很快或立即生成密钥。您将看到包含以下内容的输出:

Output
... gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created gpg: key your-GPG-public-key-id marked as ultimately trusted public and secret key created and signed. ...

记下your-GPG-public-key-id,因为我们将在下一部分中使用它来配置我们的本地环境变量。

创建手动备份

现在,我们将设置环境变量,因此在运行duplicity命令时,无需在命令行上输入任何机密信息。这些变量将在我们当前的会话期间提供给我们的用户,并且我们会将它们存储在隐藏目录中,以便以后使用。重复性将需要的变量(我们将其定义为环境变量)包括空间访问密钥和机密,以及GPG公共密钥ID和密码短语。

首先,让我们在用户的主目录中创建一个隐藏目录,该目录将存储配置文件:

  • mkdir ~/.duplicity

接下来,我们创建一个名为.env_variables.conf的文件来定义我们的变量,我们将使用export语句进行此操作。这些语句将使变量可供程序使用,以供以后使用。通过键入以下内容打开文件:

  • nano ~/.duplicity/.env_variables.conf

在文件中,设置您的Spaces Access Key和Secret,以及GPG公钥ID和密码:

~/.duplicity/.env_variables.conf
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

完成后保存并关闭文件。

现在,我们可以在文件上设置权限,以确保只有我们当前的非root用户具有读写访问权限:

  • chmod 0600 ~/.duplicity/.env_variables.conf

通过键入以下命令,使这些变量可在当前Bash会话中使用:

  • source ~/.duplicity/.env_variables.conf

接下来,我们将运行重复性以创建〜/ sammy_backups目录的手动完整备份。在没有完整操作的情况下运行重复性将创建初始完整备份,然后进行增量备份。我们将在第一次使用该命令时创建一个完整备份,但是如果您希望为该目录创建另一个完整的手动备份,则需要指定完整操作。

我们将在命令中定义的其他选项包括:

  • --verbosity:这将指定我们想要在输出中提供的信息级别。我们将指定info,它将提供比默认通知设置更多的详细信息。
  • --encrypt-sign-key:这将告诉重复性加密到我们在GPG_KEY变量中用your-GPG-public-key-id标识的对中的公钥。它还会告诉重复使用相同的标识符来启用签名功能。
  • --log-file:此选项将为日志文件指定一个位置,该位置也可用于其他程序。如果需要进行故障排除,这将为我们提供一个直接的地方。我们将日志文件位置指定为/ home / sammy /.duplicity/info.log。

最后,我们将指定要备份的目录和存储库端点。我们将备份用户主目录中的〜/ sammy_backups目录。我们的存储库将是我们的空间,我们将使用以下信息进行定义:s3:// spaces_endpoint / bucket_name /。您可以按以下方式确定端点和存储桶名称:如果您空间的URL为https:// sammys-bucket .nyc3.digitaloceanspaces.com,则sammys-bucket是您的存储桶名称,而nyc3.digitaloceanspaces.com是您的端点。

Our duplicity command will ultimately look like this:

  • duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
  • s3://nyc3.digitaloceanspaces.com/sammys-bucket/

运行此命令后,我们将看到如下输出:

Output
... --------------[ Backup Statistics ]-------------- StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018) EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018) ElapsedTime 0.01 (0.01 seconds) SourceFiles 2 SourceFileSize 4226 (4.13 KB) NewFiles 2 NewFileSize 4226 (4.13 KB) DeletedFiles 0 ChangedFiles 0 ChangedFileSize 0 (0 bytes) ChangedDeltaSize 0 (0 bytes) DeltaEntries 2 RawDeltaSize 130 (130 bytes) TotalDestinationSizeChange 955 (955 bytes) Errors 0 -------------------------------------------------

要检查文件是否按预期上传到您的Space,您可以导航到DigitalOcean控制面板中的Spaces页面以检查它们是否在那里。

还原档案

为了测试我们是否可以还原数据,我们现在将删除示例文件并将其从存储库中还原。要使用Duplicity恢复文件,我们可以使用--file-to-restore选项。还必须在duplicity命令中反转项目的顺序:现在,存储库URL将充当源,而备份目录将成为还原文件的目标。

通过键入以下内容删除文件:

  • rm ~/sammy_backups/historical_sharks.txt

检查并确保已删除文件:

  • cat ~/sammy_backups/historical_sharks.txt

您应该看到以下输出:

Output
cat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

接下来,让我们从Space还原此文件。 --file-to-restore选项允许我们指定要还原的文件的路径。此路径应相对于我们已备份的目录;在我们的例子中,我们的相对路径将为history_sharks.txt。我们还将颠倒空间URL和备份目录的顺序,以表明我们正在从存储库中还原文件:

  • duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
  • s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

您将看到如下输出:

Output
... Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195) Found 1 volumes in manifest Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6 Processed volume 1 of 1

再次运行cat将输出已还原的history_sharks.txt文件的内容:

  • cat ~/sammy_backups/historical_sharks.txt
Output
The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

现在,我们已经创建了〜/ sammy_backups目录的手动备份并从我们的存储库中恢复了数据,我们准备继续进行自动化备份过程。

自动备份

自动化备份过程可以帮助确保〜/ sammy_backups目录中的数据保持可恢复和最新状态。我们可以使用cron作业计划程序来创建一个备份计划,该计划将包括每周的完整备份,否则包括增量备份。要了解有关使用cron安排任务的更多信息,请查看有关如何在VPS上使用Cron和Anacron安排例行任务的教程。

首先,让我们在〜/ .duplicity目录中创建一个备份脚本:

  • nano ~/.duplicity/.backup.sh

在此文件中,我们将首先指定该脚本将由Bash shell运行:

~/.duplicity/.backup.sh
#!/bin/bash

接下来,我们将创建一个HOME变量以与我们的source和duplicity命令一起使用。确保用您的信息替换突出显示的用户名,备份目录和存储桶名称:

~/.duplicity/.backup.sh
...
HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

source和duplicity命令在这里执行与创建手动备份时相同的工作:source将环境变量加载到当前上下文中,而duplicity创建加密的tar卷以发送到我们的存储库。除了增加了--full-if-older-than选项之外,我们的所有选项均保持不变。设置为7D时,此选项指定一旦上次完整备份的日期超过7天,每周将进行一次完整备份。

脚本中的最后一个元素将是未设置的命令,这些命令将删除我们的环境变量作为一种安全措施:

~/.duplicity/.backup.sh
...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

完整的脚本如下所示:

~/.duplicity/.backup.sh
#!/bin/bash

HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

对脚本满意后,可以保存并关闭文件。我们还将设置权限,以确保只有我们当前的非sudo用户才能读取,写入和执行文件:

  • chmod 0700 ~/.duplicity/.backup.sh

最后,我们可以通过编辑用户的crontab文件来自动执行备份计划。通过键入以下内容打开此文件以进行编辑:

  • crontab -e

因为这是我们第一次编辑此文件,所以将要求我们选择编辑器:

crontab
no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]: 
...

您可以为nano选择2,或者输入与您选择的编辑器相对应的数字。

在文件的底部,我们将添加一行以指定脚本运行的频率。要测试其功能,我们可以将时间间隔设置为两分钟,如下所示:

crontab
...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

保存并关闭文件。两分钟后,您可以导航到DigitalOcean控制面板中的“空间”页面,您应该在其中看到增量备份文件。现在,您可以修改crontab文件,以指定要用于增量备份的时间间隔。

结论

In this tutorial, we have covered how to back up the contents of a specific directory to a Spaces repository. Using a configuration file to store our repository information, we created a manual backup of our data, which we tested by restoring a sample file, and an automated backup schedule.

有关Duplicity的更多信息,您可以查看项目网站以及duplicity手册页。本文档介绍了Duplicity的许多功能,并提供了创建完整系统备份的指南。