介绍
Duplicity是一个用Python编写的命令行实用程序,用于在本地或远程存储库中存储加密的tar卷。它使用GNU Privacy Guard(GPG)(https://www.gnupg.org/)来加密和签署其档案,并使用rsync算法创建增量、空间高效的备份。备份可以传输到各种存储库,包括本地文件存储、SFTP或FTP服务器和S3兼容的对象存储。
在本教程中,我们将安装Duplicity,并讨论如何将项目数据备份到DigitalOcean Spaces,一个S3兼容的对象存储服务. 我们将为此创建一个Spaces存储库,并介绍如何手动备份数据。
前提条件
对于这个教程,你将需要:
- 一个 Ubuntu 16.04 服务器,根据我们的 初始服务器设置与 Ubuntu 16.04 教程设置。 遵循本教程后,您应该有一个非根源的 sudo 用户。
- 一个数字海洋空间和 API 密钥,由以下创建 如何创建数字海洋空间和 API 密钥。
一旦您有空间设置和此信息在手中,您可以继续安装重复性。
安装重复性
要获取最新的 Duplicity 版本,我们可以从 Duplicity releases Personal Package Archive (PPA)中安装它:
1sudo apt-add-repository ppa:duplicity-team/ppa
我们还将安装python-boto
包,以便访问 Boto,这是一个向亚马逊 Web Services 提供接口的 Python 包,这将有助于我们利用 Spaces 与 AWS S3 API 的互操作性。我们将从官方 Ubuntu 存储库中安装python-boto
,因为这个版本与我们的 Ubuntu 服务器图像搭载的 Python 版本兼容。
除了「python-boto」,我們還會安裝 Haveged,這是一個工具,可以幫助我們生成所需的 entropy來創建我們的 GPG 鑰匙。
在安装这些包之前,请更新本地存储索引:
1sudo apt-get update
然后安装重复性
,python-boto
和haveged
,键入:
1sudo apt-get install duplicity haveged python-boto
当被要求确认安装时按y
,我们现在已在我们的系统上安装了Duplicity,并准备创建我们的项目文件夹和配置文件。
创建备份目录
为了展示备份过程的运作方式,我们将在我们的非根用户主目录中创建我们的备份目录,以及一些样本数据。
1mkdir ~/sammy_backups
接下来,创建一个名为historical_sharks.txt
的样本项目文件:
1echo "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
有了我们的备份目录和测试数据,我们准备为我们的非根用户生成GPG密钥。
生成 GPG 密钥
接下来,我们将为我们的用户生成一个GPG密钥对。为了确保信息的安全传输,GPG使用公共密钥加密。在我们的背景下,这意味着数据将加密到我们的公共密钥并发送到我们的存储库。 有关GPG密钥和加密的更多信息,请参阅我们的教程 如何使用GPG来签名和加密消息。
我们的密钥将存储在我们的用户帐户中,名为~/.gnupg
的目录中,当我们生成密钥时将被创建。当我们使用重复性
命令时,我们将指定一个指向我们的密钥对的公共密钥标识符。使用这个标识符将允许数据加密和签名,以验证我们对私钥的所有权。加密数据将传输到我们的存储库,在那里很难从文件本身推断的文件大小和上传时间。
GPG 应该默认安装在我们的服务器上. 要测试这一点,键入:
1gpg --version
一旦您确认 GPG 已安装,您可以如下生成一个密钥对:
1gpg --gen-key
您将被问到一系列问题来配置您的密钥:
- 密钥类型. 选择 (1) RSA 和 RSA (默认).
- 密钥大小. 点击
ENTER
将确认 2048 的默认大小. - 密钥到期日. 输入 1y,我们将创建一个在一年后到期的密钥。
- 确认您的选择. 您可以通过输入 y.
- 用户 ID/真实姓名. 输入 您的姓名.
- 电子邮件地址. 输入 您的电子邮件地址.
- 评论. 在这里,您可以输入 ** 可选评论**,将与您的签名可见。
创建这些设置后,gpg
将基于系统内度水平生成密钥. 由于我们安装了haveged
,我们的密钥应该很快或立即生成。
1[secondary_label Output]
2...
3gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
4gpg: key your-GPG-public-key-id marked as ultimately trusted
5public and secret key created and signed.
6...
请注意你的GPG-公共密钥-id
,因为我们将在下一节中使用它来配置我们的本地环境变量。
创建手动备份
我们现在将设置环境变量,以便在运行重复性
命令时不需要在命令行中输入任何机密信息。这些变量将在当前会话期间为我们的用户提供,我们将它们存储在隐藏的目录中,以便它们可用于以后使用。
首先,让我们在我们的用户主目录中创建一个隐藏的目录,该目录将存储配置文件:
1mkdir ~/.duplicity
接下来,让我们创建一个名为 .env_variables.conf’的文件来定义我们的变量,我们将使用
export` 语句进行定义。
1nano ~/.duplicity/.env_variables.conf
在文件中,设置您的空间访问密钥和秘密,以及您的GPG公共密钥ID和密码:
1[label ~/.duplicity/.env_variables.conf]
2export AWS_ACCESS_KEY_ID="your-access-key"
3export AWS_SECRET_ACCESS_KEY="your-secret-key"
4export GPG_KEY="your-GPG-public-key-id"
5export PASSPHRASE="your-GPG-key-passphrase"
保存并关闭文件,当你完成。
现在我们可以对文件设置权限,以确保只有我们当前的非根用户才能访问阅读和写入:
1chmod 0600 ~/.duplicity/.env_variables.conf
通过键入,使这些变量可用于当前Bash会话中:
1source ~/.duplicity/.env_variables.conf
接下来,我们将运行重复性
,以创建我们的~/sammy_backups
目录的手动完整备份。在没有完整
操作的情况下运行重复性
将创建一个初始的完整备份,然后是增量备份。
我们将在我们的命令中定义的其他选项包括:
--verbosity
:这将指定我们在我们的输出中想要的信息的水平。我们将指定info
,这将提供比默认通知
设置的更多细节。--encrypt-sign-key
: 这将告诉duplicity
加密到我们在GPG-public-key-id
变量中识别的对公共密钥中的公共密钥。 它还会告诉duplicity
使用相同的标识符来启用签名功能。-log-file
: 此选项将指定日志文件的位置,这也将为其他程序提供。 这将给我们一个简单的地方,如果我们需要解决问题。 我们将指定日志文件的位置为 `/home/sammy/.d
最后,我们将指定我们正在备份的目录和我们的存储终端点。我们将在我们的用户主目录中备份 ~/sammy_backups
目录。我们的存储将是我们的空间,我们将使用以下信息定义: s3://spaces_endpoint/bucket_name/
. 您可以确定您的终端点和桶名如下:如果您的空间的 URL 是 https://sammys-bucket.nyc3.digitaloceanspaces.com
,那么 sammys-bucket
是您的桶名,而 nyc3.digitaloceanspaces.com
是您的终端点。
我们的双重性
命令最终将看起来如下:
1duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
2s3://nyc3.digitaloceanspaces.com/sammys-bucket/
运行此命令后,我们将看到如下的输出:
1[secondary_label Output]
2...
3--------------[ Backup Statistics ]--------------
4StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
5EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
6ElapsedTime 0.01 (0.01 seconds)
7SourceFiles 2
8SourceFileSize 4226 (4.13 KB)
9NewFiles 2
10NewFileSize 4226 (4.13 KB)
11DeletedFiles 0
12ChangedFiles 0
13ChangedFileSize 0 (0 bytes)
14ChangedDeltaSize 0 (0 bytes)
15DeltaEntries 2
16RawDeltaSize 130 (130 bytes)
17TotalDestinationSizeChange 955 (955 bytes)
18Errors 0
19-------------------------------------------------
要检查将文件按预期上传到您的空间,您可以导航到您的 DigitalOcean 控制面板中的空间页面来检查它们是否在那里。
恢复文件
为了测试我们能恢复数据,我们现在将删除我们的样本文件并从我们的存储库中恢复它. 为了使用 Duplicity 恢复文件,我们可以使用 --file-to-restore
选项。 在我们的 duplicity
命令中,还需要扭转项目的顺序:我们的存储 URL 现在将作为来源,我们的备份目录将是我们恢复的文件的目的地。
通过键入删除文件:
1rm ~/sammy_backups/historical_sharks.txt
检查以确保文件已删除:
1cat ~/sammy_backups/historical_sharks.txt
你应该看到以下结果:
1[secondary_label Output]
2cat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory
接下来,让我们从我们的空间恢复这个文件. 选项 --file-to-restore
允许我们指定我们想要恢复的文件的路径. 这个路径应该与我们已经备份的目录相对; 在我们的情况下,我们的相对路径将是 historical_sharks.txt
. 我们还会扭转我们的空间 URL 和备份目录的顺序,表示我们正在从我们的存储库中恢复该文件:
1duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
2s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt
你会看到这样的输出:
1[secondary_label Output]
2...
3Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
4Found 1 volumes in manifest
5Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
6Processed volume 1 of 1
再次运行cat
将输出恢复的historical_sharks.txt
文件的内容:
1cat ~/sammy_backups/historical_sharks.txt
1[secondary_label Output]
2The 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
来安排任务的更多信息,请参阅我们的教程(How To Schedule Routine Tasks With Cron and Anacron on a VPS)(https://andsky.com/tech/tutorials/how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps)。
首先,让我们在我们的~/.duplicity
目录中创建备份脚本:
1nano ~/.duplicity/.backup.sh
在此文件中,我们首先将指定此脚本将由Bash壳运行:
1[label ~/.duplicity/.backup.sh]
2#!/bin/bash
接下来,我们将创建一个HOME
变量以与我们的源
和重复性
命令一起使用。
1[label ~/.duplicity/.backup.sh]
2...
3HOME="/home/sammy"
4
5source "$HOME/.duplicity/.env_variables.conf"
6
7duplicity \
8 --verbosity info \
9 --encrypt-sign-key="$GPG_KEY" \
10 --full-if-older-than 7D \
11 --log-file "$HOME/.duplicity/info.log" \
12 /home/sammy/sammy_backups \
13 s3://nyc3.digitaloceanspaces.com/sammys-bucket/
这里的源
和重复性
命令与我们创建手动备份时的工作相同:源
将我们的环境变量加载到当前的背景中,而重复性
会创建加密的 tar 卷来发送到我们的存储库。
我们的脚本中的最终元素将是启动
命令,将删除我们的环境变量作为安全措施:
1[label ~/.duplicity/.backup.sh]
2...
3unset AWS_ACCESS_KEY_ID
4unset AWS_SECRET_ACCESS_KEY
5unset GPG_KEY
6unset PASSPHRASE
完整的剧本将是这样的:
1[label ~/.duplicity/.backup.sh]
2#!/bin/bash
3
4HOME="/home/sammy"
5
6source "$HOME/.duplicity/.env_variables.conf"
7
8duplicity \
9 --verbosity info \
10 --encrypt-sign-key="$GPG_KEY" \
11 --full-if-older-than 7D \
12 --log-file "$HOME/.duplicity/info.log" \
13 /home/sammy/sammy_backups \
14 s3://nyc3.digitaloceanspaces.com/sammys-bucket/
15
16unset AWS_ACCESS_KEY_ID
17unset AWS_SECRET_ACCESS_KEY
18unset GPG_KEY
19unset PASSPHRASE
当你对脚本满意时,你可以保存和关闭文件,我们还会设置权限,以确保只有我们当前的非sudo用户才能读取,写入和执行文件:
1chmod 0700 ~/.duplicity/.backup.sh
最后,我们可以通过编辑我们的用户的crontab
文件来自动化我们的备份时间表。
1crontab -e
由于这是我们第一次编辑这个文件,我们将被要求选择一个编辑器:
1[label crontab]
2no crontab for root - using an empty one
3Select an editor. To change later, run 'select-editor'.
4 1. /bin/ed
5 2. /bin/nano <---- easiest
6 3. /usr/bin/vim.basic
7 4. /usr/bin/vim.tiny
8Choose 1-4 [2]:
9...
您可以选择2
为nano,或输入与您选择的编辑器相应的号码。
在文件的底部,我们将添加一行,以指定我们的脚本应该运行多少次. 为了测试其功能,我们可以将时间间隔设置为两分钟如下:
1[label crontab]
2...
3
4*/2 * * * * /home/sammy/.duplicity/.backup.sh
保存和关闭文件. 两分钟后,您可以导航到您的 DigitalOcean 控制面板中的空间页面,在那里您应该看到增量备份文件。
结论
在本教程中,我们涵盖了如何将特定目录的内容备份到 Spaces 存储库. 使用配置文件存储我们的存储库信息,我们创建了我们数据的手动备份,我们通过恢复样本文件和自动备份时间表来测试。
有关 Duplicity 的更多信息,您可以查看 项目网站以及 duplicity
人的页面。