Как настроить автоматическое зашифрованное резервное копирование действующих баз данных MySQL на Vbu Ubuntu VPS на Google Drive с помощью Duplicity?
Мы используем DigitalOcean в качестве нашего VPS-провайдера. У них есть руководство по настройке Duplicity для зашифрованных резервных копий, но оно не распространяется на резервные копии базы данных или конечную точку Google Диска.
В Интернете я нашел несколько других учебных пособий, касающихся Duplicity и Google Drive, но все они кажутся либо неполными, либо устаревшими.
1 ответ
У меня ушло чуть более 12 часов, чтобы собрать всю необходимую информацию, но вот процесс:
Шаг 1: учетная запись 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_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
Текущая стабильная версия на 6 октября 2016 г. - 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
(см. Как установить $LD_LIBRARY_PATH в Ubuntu?):
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
Это библиотека, которая обрабатывает согласование OAuth2 между Duplicity и Google Drive API.
pip install pydrive
Шаг 4. Настройка аутентификации на Google Диске через OAuth2
Создать учетные данные API
Сделайте это через Google Developer Console. Увидеть:
- 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 использует этот файл для хранения учетных данных и параметров конфигурации для API Google.
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: Тестирование незашифрованного поддельного бэкапа
Мы создадим несколько тестовых файлов, просто чтобы убедиться, что мы можем успешно перенести их на Google Диск с помощью Duplicity.
Создать тестовые файлы:
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
Вам понадобится ключ для GPG, чтобы зашифровать ваши резервные данные перед отправкой на Google Drive. Чтобы сгенерировать ключ, просто запустите команду:
gpg --gen-key
Следуйте инструкциям, которые он предоставляет, и убедитесь, что вы выбрали хорошую фразу-пароль. Если он застрял с сообщением о "недостаточно энтропии", вы можете попробовать запустить sudo apt-get install rng-tools
, Сама установка должна генерировать достаточно энтропии, чтобы GPG мог генерировать действительно случайный ключ. См. https://stackoverflow.com/a/12716881/2970321.
GPG "отпечаток пальца" будет отображаться после завершения. Вам понадобится первичный идентификатор открытого ключа из этого отпечатка пальца. Это просто 8-значный шестнадцатеричный код после /
на линии, которая начинается с pub
, См. https://security.stackexchange.com/a/110146/74909.
Добавьте фразу-пароль, которую вы установили для своего ключа GPG, в секретный файл:
sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase
.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
В зависимости от характера ваших данных, вы можете подумать о том, чтобы положить частную часть вашего ключа 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