![如何使用 Duplicity 设置 Ubuntu VPS 上的实时 MySQL 数据库到 Google Drive 的自动加密备份?](https://linux22.com/image/691284/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Duplicity%20%E8%AE%BE%E7%BD%AE%20Ubuntu%20VPS%20%E4%B8%8A%E7%9A%84%E5%AE%9E%E6%97%B6%20MySQL%20%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%B0%20Google%20Drive%20%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E5%AF%86%E5%A4%87%E4%BB%BD%EF%BC%9F.png)
我们使用 DigitalOcean 作为 VPS 提供商。他们有一个教程关于如何设置 Duplicity 进行加密备份,但它不包括数据库备份或 Google Drive 端点。
我在网上找到了一些有关 Duplicity 和 Google Drive 的其他教程,但它们似乎都不完整或过时。
答案1
我花了 12 个多小时才拼凑起我需要的所有信息,具体过程如下:
步骤 1:Google 帐户
选择现有的 Google 帐户,或者创建一个新的 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备份命令:
测试 dump 命令(替换<db_password>
为您之前为新 MySQL 用户设置的密码):
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<db_password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
此命令会将所有数据库转储到一个文件中,并标有年份和当前周数。每次运行此命令时,它都会更新当前转储文件。但是,当新的一周开始时,它最终会创建一个新文件。因此,我们维护了数据库的每周快照历史记录。您可以调整日期部分使这些快照更频繁或更少,取决于您的数据库的大小和您愿意为这些快照捐献的空间。
步骤 3:安装 Duplicity 依赖项
我们需要以下库的最新版本才能使用最新版本的 Duplicity:
popt
libbz2
librsync
运行以下命令:
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
更新 Duplicity
截至 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
为LD_LIBRARY_PATH
(见如何在 Ubuntu 中设置 $LD_LIBRARY_PATH?):
Duplicity 需要这个环境变量,以便它可以找到librsync
之前安装的共享库对象。
sudo nano /etc/ld.so.conf.d/librsync.so.2.conf
librsync.so.2.conf:
/usr/local/lib
您现在必须重新加载 Ubuntu 的 ldconfig 缓存:
sudo ldconfig
安装 PyDrive
这是处理 Duplicity 和 Google Drive API 之间的 OAuth2 协商的库。
pip install pydrive
步骤 4:通过 OAuth2 设置 Google Drive 身份验证
创建 API 凭证
通过 Google 的开发者控制台。 看:
- https://stackoverflow.com/questions/31370102/how-do-i-backup-to-google-drive-using-duplicity
- http://6ftdan.com/danielpclark/2016/04/21/encrypted-linux-backup-with-google-drive-and-duplicity/
创建配置文件:
PyDrive使用此文件存储 Google API 的凭据和配置设置。
nano /home/<username>/.duplicity/credentials
client_config_backend: settings
client_config:
client_id: <your client ID>.apps.googleusercontent.com
client_secret: <your client secret>
save_credentials: True
save_credentials_backend: file
save_credentials_file: /home/<username>/.duplicity/gdrive.cache
get_refresh_token: True
设置GOOGLE_DRIVE_SETTINGS
环境变量:
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
我还建议GOOGLE_DRIVE_SETTINGS
添加sudo 环境变量:
sudo visudo
在最后添加以下行:
Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"
步骤 5:测试未加密的假备份
我们将创建一些测试文件,只是为了检查我们是否可以使用 Duplicity 成功地将它们传输到 Google Drive。
创建测试文件:
cd ~
mkdir test
touch test/file{1..100}
运行 Duplicity:
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
按照它创建的验证链接,然后将收到的验证码复制粘贴回提示中。Duplicity应该存储它创建的身份验证令牌,/home/<username>/.duplicity/gdrive.cache
这样我们就不必再次执行验证步骤(因此我们的系统可以在无需我们输入的情况下每晚自动执行此操作)。
步骤6:创建GPG密钥
你需要一把钥匙通用石油气在将备份数据发送到 Google Drive 之前对其进行加密。要生成密钥,只需运行以下命令:
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 密钥设置的密码添加到秘密文件中:
sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase
.密码:
PASSPHRASE="my passphrase"
备份你的 GPG 密钥:
如果您丢失了 GPG 密钥,您的加密备份将变得毫无用处。因此,您应该将 GPG 密钥备份到 VPS 以外的某个地方。
例如,备份到本地机器:
gpg --list-keys
gpg -ao ~/gpg-public.key --export <gpg_public_key_id>
gpg --list-secret-keys
gpg -ao ~/gpg-private.key --export-secret-keys <gpg_private_key_id>
然后在本地机器上:
scp <username>@<vps_host>:~/gpg-public.key ~/gpg-public.key
scp <username>@<vps_host>:~/gpg-private.key ~/gpg-private.key
看:
https://help.ubuntu.com/community/GnuPrivacyGuardHowto#Backing_up_and_restoring_your_keypair
根据数据的性质,您可能需要考虑将私人的将 GPG 密钥的一部分写在一张纸上,然后把那张纸存放在保险箱里。
步骤 7:测试 SQL 转储的加密备份
duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup
步骤 8:将数据库转储和 Duplicity 命令一起放入cron
脚本中
设置每日增量备份
这将每晚运行,创建增量备份。默认情况下,Duplicity 会尝试备份磁盘上的所有文件,而这在 VPS 上可能不是我们想要的。因此,我们使用参数,--exclude
以便它忽略除我们通过 包含的目录之外的所有内容--include
。您可以使用多个--include
参数来包含多个目录。
sudo nano /etc/cron.daily/duplicity.inc
duplicity.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
设置权限:
chmod 755 /etc/cron.daily/duplicity.inc
设置每周完整备份
它将每周运行一次,创建完整备份并清除除最后三个完整备份之外的所有备份以节省空间。同样,您可以根据自己的情况调整此频率和要保留的备份数量。
sudo nano /etc/cron.weekly/duplicity.full
duplicity.full:
#!/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
设置权限:
chmod 755 /etc/cron.weekly/duplicity.full
如果这些目录中的任务cron.*
由于某种原因(通常是由于权限问题)未自动运行,您可以将这些任务添加到根 cron 文件中:
sudo crontab -e
添加行(尝试选择奇数时间):
# 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
保存并退出。
步骤 9:测试并验证备份
您可以尝试将 Google Drive 中的备份下载回~/test
:
sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test