介绍
Duplicity是一个用Python编写的命令行实用程序,它产生加密的tar卷以存储在本地或远程存储库上。 它使用GNU Privacy Guard(GPG)对其存档和rsync算法进行加密和签名,以创建增量,节省空间的备份。 备份可以传输到各种存储库,包括本地文件存储,SFTP或FTP服务器以及S3兼容对象存储。
在本教程中,我们将安装Duplicity,并了解如何将项目数据备份到兼容S3的对象存储服务DigitalOcean Spaces。 我们将为此创建一个Spaces存储库,并介绍如何手动备份数据。 最后,我们将通过创建一个脚本来自动执行此过程,该脚本将设置增量和每周完整备份计划。
先决条件
对于本教程,您将需要:
一个Ubuntu 16.04服务器, 在Ubuntu 16.04教程初始服务器安装后设置 。 遵循本教程之后,您应该有一个非root用户。
按照如何创建DigitalOcean空间和API密钥创建DigitalOcean空间和API密钥 。 请务必记下您的空间的以下凭据:
- 访问密钥
- 密钥
- 空间URL
- 存储桶名称
一旦你建立了空间并掌握了这些信息,就可以继续安装Duplicity。
安装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
然后安装haveged
, python-boto
,然后输入:
sudo apt-get install duplicity haveged python-boto
出现提示时按y
确认安装。 我们现在已经在我们的系统上安装了Duplicity,并准备创建我们的项目文件夹和配置文件。
创建一个备份目录
为了演示备份过程如何工作,我们将在非root用户的主目录中创建一个备份目录以及一些示例数据。 我们将调用我们的目录sammy_backups
:
mkdir ~/sammy_backups
接下来,创建一个名为historical_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来完成此操作。
- 用户名/真实姓名。 输入你的名字 。
- 电子邮件地址。 输入你的电邮地址 。
- 评论。 在这里,您可以输入一个可选的注释 ,该注释在您的签名中可见。
- 更改(N)ame,(C)omment,(E)邮件或(O)kay /(Q)uit? 如果您准备好继续,请键入O.
- 输入密码。 你会被要求在这里输入密码 。 一定要记下这个密码 。 我们将在本教程的其余部分回顾它作为
your-GPG-key-passphrase
。
创建这些设置后, gpg
将根据系统中的熵级别生成密钥。 由于我们安装了haveged
,我们的密钥应该很快或者立即生成。 您将看到包含以下内容的输出:
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
命令时不需要在命令行上输入任何机密信息。 这些变量将在我们当前的会话期间提供给我们的用户,我们将它们存储在一个隐藏的目录中,以便它们可供以后使用。 我们将定义为环境变量的duplicity
需要的变量包括我们的空间访问密钥和秘密,以及我们的GPG公钥ID和密码。
首先,让我们在用户的主目录中创建一个隐藏的目录来存储配置文件:
mkdir ~/.duplicity
接下来,让我们创建一个名为.env_variables.conf
的文件来定义我们的变量,我们将使用export
语句来执行这些变量。 这些语句将使这些变量可供程序供以后使用。 输入以下内容打开文件:
nano ~/.duplicity/.env_variables.conf
在文件中,设置空间访问密钥和秘密,以及您的GPG公钥ID和密码:
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
接下来,我们将运行duplicity
来创建我们~/ sammy_backups
目录的手动完整备份。 在没有full
操作的情况下运行duplicity
操作将创建初始完整备份,然后是增量备份。 我们将在第一次使用该命令时创建完整备份,但是如果您希望为该目录创建另一个完全手动备份,则需要指定full
操作。
我们将在我们的命令中定义的其他选项包括:
-
--verbosity
:这将在我们的输出中指定我们想要的信息的级别。 我们将指定info
,它将提供比默认notice
设置更多的详细信息。 -
--encrypt-sign-key
:这将告诉我们在GPG_KEY
变量中用your-GPG-public-key-id
的GPG_KEY
your-GPG-public-key-id
中的GPG_KEY
。 它还会告诉用户使用相同的标识符来启用签名功能。 -
--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
是您的端点。
我们的duplicity
命令最终将如下所示:
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
-------------------------------------------------
要按照预期检查文件上传到您的空间,您可以导航到DigitalOcean控制面板中的Spaces页面,检查它们是否在那里。
恢复文件
为了测试我们可以恢复我们的数据,我们现在将删除我们的示例文件并从我们的存储库中恢复它。 要用Duplicity恢复文件,我们可以使用--file-to-restore
选项。 还需要颠倒我们的duplicity
命令中的项目顺序:我们的存储库URL现在将作为原点,而我们的备份目录将成为我们恢复的文件的目标。
输入以下命令删除文件:
rm ~/sammy_backups/historical_sharks.txt
检查以确保文件已被删除:
cat ~/sammy_backups/historical_sharks.txt
您应该看到以下输出:
Outputcat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory
接下来,让我们从我们的空间恢复这个文件。 使用--file-to-restore
选项可以指定我们想要恢复的文件的路径。 该路径应该与我们备份的目录相关; 在我们的例子中,我们的相对路径是historical_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
将输出已还原的historical_sharks.txt
文件的内容:
cat ~/sammy_backups/historical_sharks.txt
OutputThe 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
计划任务的更多信息,请查看我们的关于如何使用Cron和Anacron在VPS上安排例行任务的教程。
首先,我们在~/.duplicity
目录下创建一个备份脚本:
nano ~/.duplicity/.backup.sh
在这个文件中,我们将首先指定这个脚本将由Bash shell运行:
#!/bin/bash
接下来,我们将创建一个HOME
变量来与我们的source
和duplicity
命令一起使用。 请务必将突出显示的用户名,备份目录和存储桶名称替换为您的信息:
...
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
,此选项指定每周完成一次完整备份,一旦最后一次完整备份超过七天。
我们的脚本中的最后一个元素将是未unset
命令,它将删除我们的环境变量作为安全措施:
...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE
完整的脚本将如下所示:
#!/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
因为这是我们第一次编辑这个文件,我们将被要求选择一个编辑器:
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
,或输入与您选择的编辑器相对应的编号。
在文件底部,我们将添加一行来指定脚本应该运行的频率。 为了测试它的功能,我们可以将我们的时间间隔设置为两分钟,如下所示:
...
*/2 * * * * /home/sammy/.duplicity/.backup.sh
保存并关闭文件。 两分钟后,您可以导航到DigitalOcean控制面板中的Spaces页面 ,您应该在该页面上看到增量备份文件。 您现在可以修改crontab
文件以指定您希望用于增量备份的时间间隔。
结论
在本教程中,我们介绍了如何将特定目录的内容备份到Spaces存储库。 使用配置文件来存储我们的存储库信息,我们创建了数据的手动备份,我们通过恢复示例文件来测试数据,以及自动备份计划。
有关Duplicity的更多信息,您可以查看项目网站以及duplicity
手册页 。 本文档涵盖了Duplicity的许多功能,并提供了有关创建完整系统备份的指导。