sudo apt-get install libpopt-dev libpopt0
sudo apt-get install libbz2-dev
cd ~
wget https://github.com/librsync/librsync/archive/v2.0.0.tar.gz
tar xzvf v2.0.0.tar.gz -C librsync
cd librsync
sudo cmake .
sudo make all check
sudo make && sudo make install
更新重复
截至 2016 年 10 月 6 日的当前稳定版本为 0.7.10。
cd ~
wget https://code.launchpad.net/duplicity/0.7-series/0.7.10/+download/duplicity-0.7.10.tar.gz
tar xzvf duplicity*
cd duplicity*
sudo python setup.py install
这将每晚运行,创建增量备份。Duplicity 默认情况下会尝试备份磁盘上的所有文件,这在 VPS 上可能不想要。因此,我们使用该--exclude参数,以便它忽略除我们包含的目录之外的所有内容 via --include。您可以使用多个--include参数来包含多个目录。
sudo nano /etc/cron.daily/duplicity.inc
重复性.inc:
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg
# Run MySQL dump. This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
# Performs an incremental backup by default. Since we create a new dump file every week, we have a history
# of weekly snapshots, and the current week is incrementally updated each day.
duplicity --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg
# Run MySQL dump. This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
# Create a brand new full backup, which contains all the weekly dumps located in /var/backups/sql
duplicity full --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
# Clean out old full backups
duplicity remove-all-but-n-full 3 --force gdocs://<google_account_name>@gmail.com/backup
# Incremental backup every day at HH:MM
MM HH * * * /etc/cron.daily/duplicity.inc >> /var/log/backups.log 2>&1
# Full backup every Saturday at HH:MM
MM HH * * 6 /etc/cron.weekly/duplicity.full >> /var/log/backups.log 2>&1
我花了 12 个多小时才拼凑出我需要的所有信息,但过程如下:
第 1 步:谷歌帐户
选择一个现有的或创建一个新的 Google 帐户,您将在其中存储备份。我喜欢拥有一个单独的帐户,这样我的业务备份数据就不会与我的个人 Google 帐户内容混在一起。
我们将 Google 帐户名称称为
<google_account_name>
。第 2 步:设置数据库转储
为此,我们将为数据库转储创建一个特殊目录,并使用该
mysqldump
命令。创建一个备份目录并给自己必要的权限
我的 Ubuntu 发行版带有一个
backup
用户和组以及一个var/backups
目录,那么为什么不使用这些呢?使组
backup
所有者/var/backups
:sudo chgrp backup /var/backups
授予
backup
组对该目录的读写权限:sudo chmod g+rw /var/backups
将您自己的帐户添加到
backup
组中:sudo usermod -aG backup <username>
这将使您更容易访问备份目录的内容。
您可能需要注销然后重新登录才能使新的组成员身份生效。要检查您的组成员身份,请使用命令
groups
。创建用于执行备份的特殊 SQL 用户帐户
通过命令行登录 MySQL:
mysql -u root -p
创建一个新的数据库用户帐户
我们不想通过给予比我们绝对必须更多的权限来使自己变得脆弱。因此,我们将创建一个具有只读权限的新数据库用户帐户。为了保持一致,我打电话给这个用户
backup
。为 .选择一个非常强大的密码<db_password>
。CREATE USER 'backup'@'localhost' IDENTIFIED BY '<db_password>'
授予只读权限:
GRANT SELECT,EVENT,TRIGGER,SHOW DATABASES ON *.* TO 'backup'@'localhost';
设置数据库备份命令:
测试转储命令(替换
<db_password>
为您之前为新 MySQL 用户设置的密码):此命令会将所有数据库转储到单个文件中,并标有年份和当前周数。每次我们运行它时,它都会更新当前的转储文件。但是,当新的一周开始时,它将最终创建一个新文件。因此,我们维护了我们数据库每周快照的历史记录。您可以调整日期部分以增加或减少这些快照的频率,具体取决于数据库的大小和您愿意为这些快照捐赠的空间。
第 3 步:安装 Duplicity 的依赖项
我们需要以下库的最新版本才能使用最新版本的 Duplicity:
popt
libbz2
librsync
运行以下命令:
更新重复
截至 2016 年 10 月 6 日的当前稳定版本为 0.7.10。
设置一个定义
LD_LIBRARY_PATH
(参见如何在 Ubuntu 中设置 $LD_LIBRARY_PATH?):Duplicity 需要这个环境变量,以便它可以找到
librsync
之前安装的共享库对象。sudo nano /etc/ld.so.conf.d/librsync.so.2.conf
librsync.so.2.conf:
您现在必须重新加载 Ubuntu 的 ldconfig 缓存:
sudo ldconfig
安装 PyDrive
这是处理 Duplicity 和 Google Drive API 之间的 OAuth2 协商的库。
pip install pydrive
第 4 步:通过 OAuth2 设置 Google Drive 身份验证
创建 API 凭据
通过 Google 的开发者控制台执行此操作。看:
创建配置文件:
PyDrive使用此文件来存储 Google API 的凭据和配置设置。
nano /home/<username>/.duplicity/credentials
设置
GOOGLE_DRIVE_SETTINGS
环境变量:export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
我还建议添加
GOOGLE_DRIVE_SETTINGS
到sudo 环境变量:sudo visudo
在末尾添加以下行:
Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"
第 5 步:测试未加密的虚假备份
(参考:https ://www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-securely-automate-backups-on-ubuntu )
我们将创建一些测试文件,只是为了检查我们是否可以使用 Duplicity 成功地将它们传输到 Google Drive。
创建测试文件:
运行重复性:
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
按照它创建的验证链接,将收到的验证码复制粘贴回提示中。Duplicity应该存储它创建的身份验证令牌,
/home/<username>/.duplicity/gdrive.cache
这样我们就不必再次执行验证步骤(因此我们的系统可以在没有我们输入的情况下每晚自动执行此操作)。第 6 步:创建 GPG 密钥
在将备份数据发送到 Google Drive 之前,您需要GPG的密钥来加密您的备份数据。要生成密钥,只需运行以下命令:
gpg --gen-key
按照它提供的说明进行操作,并确保您选择了一个好的密码。如果遇到关于“熵不足”的消息,您可以尝试运行
sudo apt-get install rng-tools
. 安装本身应该生成足够的熵,GPG 可以生成真正的随机密钥。请参阅https://stackoverflow.com/a/12716881/2970321。完成后将显示 GPG“指纹”。您将需要此指纹中的主公钥 ID。
/
这只是以开头的行之后的 8 位十六进制代码pub
。请参阅https://security.stackexchange.com/a/110146/74909。将您为 GPG 密钥设置的密码添加到机密文件:
.密码:
备份您的 GPG 密钥:
如果您丢失了 GPG 密钥,您的加密备份将变得毫无用处。因此,您应该将 GPG 密钥备份到 VPS 以外的某个地方。
例如,要备份到本地计算机:
然后在您的本地机器上:
看:
https://help.ubuntu.com/community/GnuPrivacyGuardHowto#Backing_up_and_restoring_your_keypair
根据数据的性质,您可能需要考虑将 GPG 密钥的私有部分放在一张纸上,然后将该纸存放在保险箱中。
步骤 7:测试 SQL 转储的加密备份
第 8 步:将数据库转储和 Duplicity 命令一起放入
cron
脚本中设置每日增量备份
这将每晚运行,创建增量备份。Duplicity 默认情况下会尝试备份磁盘上的所有文件,这在 VPS 上可能不想要。因此,我们使用该
--exclude
参数,以便它忽略除我们包含的目录之外的所有内容 via--include
。您可以使用多个--include
参数来包含多个目录。sudo nano /etc/cron.daily/duplicity.inc
重复性.inc:
设置权限:
chmod 755 /etc/cron.daily/duplicity.inc
设置每周完整备份
这将每周运行一次,创建一个完整备份并清除除最后三个完整备份之外的所有备份以节省空间。同样,您可以根据您的情况调整此频率和要保留的备份数量。
sudo nano /etc/cron.weekly/duplicity.full
duplicity.full:
设置权限:
chmod 755 /etc/cron.weekly/duplicity.full
如果您在这些
cron.*
目录中的任务由于某种原因没有自动运行(通常是由于权限问题),您可以将这些任务添加到根 cron 文件中:sudo crontab -e
添加行(尝试选择奇数时间):
保存并退出。
步骤 9:测试和验证备份
您可以尝试将您的备份从 Google Drive 下载回
~/test
:sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test