我们正在使用DigitalOcean作为我们的VPS提供商。 他们有关于如何为encryption备份设置Duplicity的教程 ,但不包括数据库备份或Google Drive端点。
我在网上发现了一些关于Duplicity和Google Drive的其他教程,但它们似乎都不完整或过时。
我花了12个多小时来拼凑所有我需要的信息,但是这是一个过程:
select一个现有的,或创build一个新的谷歌帐户,你将存储备份。 我喜欢有一个单独的帐户,所以我的业务备份数据不会混入我的个人Google帐户的东西。
我们将把Google帐户名称称为<google_account_name> 。
为此,我们将为数据库转储创build一个特殊的目录,并使用mysqldump命令。
我的Ubuntu发行版带有backup用户和组以及var/backups目录, 为什么不使用这些目录?
创build/var/backups的组backup所有者:
sudo chgrp backup /var/backups
给这个目录上的backup组读写权限:
sudo chmod g+rw /var/backups
将您自己的帐户添加到backup组中:
sudo usermod -aG backup <username>
这将使您更容易访问备份目录的内容。
您可能需要注销,然后重新login以使新的组成员身份生效。 要检查您的组成员身份,请使用命令groups 。
通过命令行login到MySQL:
mysql -u root -p
创build一个新的数据库用户帐户
我们不想通过给予更多的权限来让自己变得脆弱。 因此,我们将创build一个具有只读权限的新数据库用户帐户。 为了保持一致,我打电话给这个用户backup 。 为<db_password>select一个非常强大的密码。
CREATE USER 'backup'@'localhost' IDENTIFIED BY '<db_password>'
授予只读权限:
GRANT SELECT,EVENT,TRIGGER,SHOW DATABASES ON *.* TO 'backup'@'localhost';
testingdump命令(将<db_password>replace为之前为新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
该命令将所有数据库转储到单个文件,标有年份和当前星期编号。 每次我们运行这个,它都会更新当前的转储文件。 但是,当新的一周开始时,它将最终创build一个新的文件。 因此,我们保留了我们数据库的每周快照的历史。 您可以根据数据库大小以及您愿意为这些快照捐赠的空间,调整date部分以使这些快照频繁或不频繁。
我们需要以下库的最新版本才能使用最新版本的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
截至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需要这个环境variables,以便它能够find先前安装的librsync共享库对象。
sudo nano /etc/ld.so.conf.d/librsync.so.2.conf
librsync.so.2.conf :
/usr/local/lib
你现在必须重新加载Ubuntu的ldconfigcaching:
sudo ldconfig
这是处理Duplicity和Google Drive API之间OAuth2协商的库。
pip install pydrive
通过Google的开发者控制台执行此操作 。 看到:
PyDrive 使用此文件来存储Google API的凭据和configuration设置 。
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环境variables: export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
我还build议添加GOOGLE_DRIVE_SETTINGS到sudo环境variables :
sudo visudo
在结尾添加以下行:
Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"
(参考: https : //www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-securely-automate-backups-on-ubuntu )
我们将创build一些testing文件,以检查是否可以成功使用Duplicity将它们转移到Google云端硬盘。
cd ~ mkdir test touch test/file{1..100}
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
按照它创build的validation链接,将您收到的validation码复制粘贴回提示。 Duplicity 应该在/home/<username>/.duplicity/gdrive.cache存储创build的authentication令牌,以便我们不必再次执行validation步骤(所以我们的系统可以在没有我们的input的情况下每晚自动完成) 。
在将您的备份数据发送到Google云端硬盘之前,您需要一个GPG密钥来encryption您的备份数据。 要生成密钥,只需运行以下命令:
gpg --gen-key
遵循它提供的说明,并确保您select一个很好的密码。 如果遇到关于“不够熵”的消息,可以尝试运行sudo apt-get install rng-tools 。 安装本身应该产生足够的熵,GPG可以生成一个真正的随机密钥。 请参阅https://stackoverflow.com/a/12716881/2970321 。
完成后将显示GPG“指纹”。 您将需要来自此指纹的主要公钥ID 。 这只是以pub开始的行后面的8位hex代码。 请参阅https://security.stackexchange.com/a/110146/74909 。
sudo nano /root/.passphrase sudo chmod 700 /root/.passphrase
.passphrase :
PASSPHRASE="my passphrase"
如果你失去了你的GPG密钥,你的encryption备份将变得毫无用处。 所以,你应该把你的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密钥的私人部分放在一张纸上,然后将该纸张存放在保险箱中 。
duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup
cron脚本中 这将每晚运行,创build增量备份。 Duplicity默认会尝试备份磁盘上的所有文件,这在VPS上我们可能不需要。 所以,我们使用--exclude参数,以便它忽略除了通过--include包含的目录之外的--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
这将每周运行一次,创build完整备份并清除除最后三个完整备份外的所有备份以节省空间。 再次,你可以调整这个频率和数量的备份保留,以你的情况。
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.*目录中的任务由于某种原因(通常是由于权限问题)而没有自动运行,则可以将这些任务添加到root cron文件中:
sudo crontab -e
添加行(尝试select奇数次):
# 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
保存并退出。
您可以尝试将备份从Google Drive下载到~/test :
sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test