Назад | Перейти на главную страницу

Как я могу настроить автоматическое зашифрованное резервное копирование живых баз данных MySQL на Ubuntu VPS на Google Диск с помощью Duplicity?

Мы используем DigitalOcean в качестве нашего VPS-провайдера. У них есть руководство о том, как настроить Duplicity для зашифрованных резервных копий, но не распространяется на резервные копии базы данных или конечную точку Google Диска.

Я нашел в Интернете несколько других руководств по Duplicity и Google Drive, но все они кажутся неполными или устаревшими.

Мне потребовалось чуть больше 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

Обновить дублирование

Текущая стабильная версия по состоянию на 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

Теперь вы должны перезагрузить кеш ldconfig Ubuntu:

sudo ldconfig

Установите PyDrive

Это библиотека, которая обрабатывает согласование OAuth2 между Duplicity и Google Drive API.

pip install pydrive

Шаг 4. Настройте аутентификацию Google Диска через OAuth2

Создать учетные данные API

Сделайте это через Google Консоль разработчика. Видеть:

Создайте файл конфигурации:

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. Проверьте незашифрованную фальшивую резервную копию

(Ссылка: https://www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-securely-automate-backups-on-ubuntu)

Мы создадим несколько тестовых файлов, чтобы убедиться, что мы можем успешно перенести их на Google Диск с помощью Duplicity.

Создайте тестовые файлы:

cd ~
mkdir test
touch test/file{1..100}

Выполните Duplicity:

duplicity ~/test gdocs://<google_account_name>@gmail.com/backup

Перейдите по созданной ссылке подтверждения и скопируйте полученный код подтверждения обратно в приглашение. Двойственность должен сохраните созданный токен авторизации в /home/<username>/.duplicity/gdrive.cache чтобы нам не приходилось снова выполнять этап проверки (и чтобы наша система могла автоматически делать это каждую ночь без нашего участия).

Шаг 6: Создайте ключ GPG

Вам понадобится ключ для GPG чтобы зашифровать данные резервной копии перед их отправкой на Google Диск. Чтобы сгенерировать ключ, просто запустите команду:

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#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 Диска обратно в ~/test:

sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test