ale*_*exw 5 mysql backup gpg duplicity google-drive
我们使用 DigitalOcean 作为我们的 VPS 提供商。他们有一个关于如何为加密备份设置 Duplicity的教程,但它不包括数据库备份或 Google Drive 端点。
我在网上找到了一些关于 Duplicity 和 Google Drive 的其他教程,但它们似乎都不完整或过时。
我花了 12 个多小时才拼凑出我需要的所有信息,但过程如下:
选择一个现有的或创建一个新的 Google 帐户来存储您的备份。我喜欢拥有一个单独的帐户,这样我的业务备份数据就不会与我的个人 Google 帐户内容混合在一起。
我们将 Google 帐户名称称为<google_account_name>。
为此,我们将为数据库转储创建一个特殊目录,并使用该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。
通过命令行登录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 用户设置的密码):
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
Run Code Online (Sandbox Code Playgroud)
此命令将所有数据库转储到单个文件中,标有年份和当前周数。每次我们运行它时,它都会更新当前的转储文件。但是,当新的一周开始时,它最终会创建一个新文件。因此,我们维护数据库每周快照的历史记录。您可以调整日期部分以增加或减少这些快照的频率,具体取决于数据库的大小和您愿意为这些快照贡献的空间。
我们需要以下库的最新版本才能使用最新版本的 Duplicity:
poptlibbz2librsync运行以下命令:
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
Run Code Online (Sandbox Code Playgroud)
截至 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
Run Code Online (Sandbox Code Playgroud)
设置定义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
Run Code Online (Sandbox Code Playgroud)
您现在必须重新加载 Ubuntu 的 ldconfig 缓存:
sudo ldconfig
这是处理 Duplicity 和 Google Drive API 之间 OAuth2 协商的库。
pip install pydrive
通过 Google 的Developer Console执行此操作。看:
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
Run Code Online (Sandbox Code Playgroud)
GOOGLE_DRIVE_SETTINGS环境变量:export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
我还建议添加GOOGLE_DRIVE_SETTINGS到sudo 环境变量:
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)
我们将创建一些测试文件,只是为了检查我们是否可以使用 Duplicity 成功将它们传输到 Google Drive。
cd ~
mkdir test
touch test/file{1..100}
Run Code Online (Sandbox Code Playgroud)
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
按照它创建的验证链接,将收到的验证码复制粘贴回提示中。Duplicity应该存储它创建的身份验证令牌,/home/<username>/.duplicity/gdrive.cache以便我们不必再次执行验证步骤(因此我们的系统可以在没有我们输入的情况下每晚自动执行此操作)。
在将备份数据发送到 Google Drive 之前,您需要一个GPG密钥来加密您的备份数据。要生成密钥,只需运行以下命令:
gpg --gen-key
按照它提供的说明进行操作,并确保您选择了一个好的密码。如果它被一条关于“没有足够的熵”的消息卡住了,你可以尝试运行sudo apt-get install rng-tools. 安装本身应该生成足够的熵,GPG 可以生成真正的随机密钥。请参阅/sf/answers/890181701/。
完成后将显示 GPG“指纹”。您将需要来自此指纹的主公钥 ID。这只是以/开头的行后面的 8 位十六进制代码pub。请参阅https://security.stackexchange.com/a/110146/74909。
sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase
Run Code Online (Sandbox Code Playgroud)
.密码:
PASSPHRASE="my passphrase"
Run Code Online (Sandbox Code Playgroud)
如果您丢失了 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>
Run Code Online (Sandbox Code Playgroud)
然后在您的本地机器上:
scp <username>@<vps_host>:~/gpg-public.key ~/gpg-public.key
scp <username>@<vps_host>:~/gpg-private.key ~/gpg-private.key
Run Code Online (Sandbox Code Playgroud)
看:
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
Run Code Online (Sandbox Code Playgroud)
cron脚本中这将每晚运行,创建增量备份。Duplicity 默认尝试备份磁盘上的所有文件,我们可能不希望在 VPS 上这样做。因此,我们使用该--exclude参数使其忽略除通过--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
Run Code Online (Sandbox Code Playgroud)
设置权限:
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
Run Code Online (Sandbox Code Playgroud)
设置权限:
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
Run Code Online (Sandbox Code Playgroud)
保存并退出。
您可以尝试将您的备份从 Google Drive 下载回~/test:
sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |