Мы используем DigitalOcean в качестве нашего VPS-провайдера. У них есть руководство о том, как настроить Duplicity для зашифрованных резервных копий, но не распространяется на резервные копии базы данных или конечную точку Google Диска.
Я нашел в Интернете несколько других руководств по 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
Эта команда выгружает все базы данных в один файл, помеченный годом и номером текущей недели. Каждый раз, когда мы запускаем это, он обновляет текущий файл дампа. Однако, когда начинается новая неделя, вместо этого создается новый файл. Таким образом, мы ведем историю еженедельных снимков наших баз данных. Вы можете настроить часть даты чтобы делать эти снимки чаще или реже, в зависимости от размера вашей базы данных и пространства, которое вы готовы выделить для этих снимков.
Нам нужны последние версии следующих библиотек, чтобы можно было использовать последнюю версию 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
Это библиотека, которая обрабатывает согласование OAuth2 между Duplicity и Google Drive API.
pip install pydrive
Сделайте это через 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"
Мы создадим несколько тестовых файлов, чтобы убедиться, что мы можем успешно перенести их на Google Диск с помощью Duplicity.
cd ~
mkdir test
touch test/file{1..100}
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
Перейдите по созданной ссылке подтверждения и скопируйте полученный код подтверждения обратно в приглашение. Двойственность должен сохраните созданный токен авторизации в /home/<username>/.duplicity/gdrive.cache
чтобы нам не приходилось снова выполнять этап проверки (и чтобы наша система могла автоматически делать это каждую ночь без нашего участия).
Вам понадобится ключ для 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.
sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase
.passphrase:
PASSPHRASE="my passphrase"
Если вы потеряете свой ключ 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 на листе бумаги, а затем хранить этот листок бумаги в сейфе.
duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup
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
Сохранить и выйти.
Вы можете попробовать загрузить резервную копию с Google Диска обратно в ~/test
:
sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test