Настройка резервного копирования сервера Linux с помощью duplicity

Резервное копирование файлов является критически важной задачей, которая необходима для уверенной эксплуатации серверов и спокойного сна системного администратора. Эффективная система резервного копирования обеспечивает нужную надежность и производительность как сохранения, так и восстановление данных. В рамках данной статьи мы рассмотрим подход, который мы сами используем для обеспечения резервного копирования данных наших серверов.

Создание бэкапов будет выполняться с помощью утилиты с открытым кодом duplicity. После выполнение настройки, резервное копирование данных будет выполняться для заданных в настройке каталогов. Кроме того, для баз данных СУБД MySQL и PostgreSQL будут создаваться дампы данных, которые, как и другие каталоги, будут сохраняться в архив резервного копирования.

Установка в Ubuntu 16.04, Ubuntu 18.04 и Debian Linux

sudo apt-get update && sudo apt-get install -y duplicity lftp

Установка в CentOS 7

sudo yum install http://mirrors.kernel.org/fedora-epel/7/x86_64/e/epel-release-7-5.noarch.rpm 	

sudo yum update
sudo yum install ftp

sudo yum groupinstall Development Tools
sudo yum install python-devel librsync-devel librsync python-setuptools python-lockfile python-boto wget

sudo wget https://code.launchpad.net/duplicity/0.7-series/0.7.06/+download/duplicity-0.7.06.tar.gz

sudo tar xvf duplicity-0.7.06.tar.gz
cd duplicity-0.7.06/
sudo python setup.py build
sudo python setup.py install
duplicity –version

Загрузка скрипта копирования для вашей ОС

Скрипт реализован на языке оболочки bash и может быть изменен в соответствии с вашими потребностями, однако решает большинство задач и в базовом варианте. Скачайте скрипт себе на сервер:

curl -o backup-server http://net-manager.netpoint-dc.com/utils/backup-server
sudo mv backup-server /usr/local/bin/backup-server
sudo chmod 755 /usr/local/bin/backup-server

Создание файлов паролей для резервного копирования на FTP

Если вы выполняете резервное копирование в защищенной сети, то нет необходимости использовать сетевые протоколы с шифрованием, так как duplicity уже шифрует хранимые в резервных копиях данные. В этом случае вы можете использовать протокол FTP.

В том случае, если резервное копирование осуществляется в облачные хранилища или файловые серверы, которые находятся в небезопасном сегменте, мы рекомендуем использовать протоколы с шифрованием трафика (FTPS, SFTP, SCP).

Полный список протоколов удаленных хранилищ может быть найден в man duplicity. В этом руководстве мы настроим резервное копирование по протоколу FTP или FTPS.

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

Для шифрования данных и задания пароля доступа к хранилищу необходимо создать два файла, в которых будет храниться секретная фраза шифрования PGP и пароль для доступа к серверу FTP:

echo "MySuperGPGSecretKeyWorD123" | sudo tee /root/.passphrase
sudo chmod 600 /root/.passphrase

echo "MyFTPPassword" | sudo tee /root/.backup-passwd
sudo chmod 600 /root/.backup-passwd

Обязательно сохраните ключевую фразу шифрования в надежном месте. Если вы утратите эту фразу, вы не сможете восстановить данные из резервной копии.

Настройка скрипта резервного копирования

Теперь необходимо настроить сам скрипт резервного копирования. Для этого создайте файл /root/backup-config и откройте его в любимом редакторе. Добавьте в файл переменные, которые будет использовать скрипт в качестве настроечных параметров:

#!/bin/bash
FTP_SERVER=c1-ftp1.netpoint-dc.com
FTP_PATH=/_data
FTP_LOGIN=CHANGEME
# ftp or ftps
FTP_PROTO=ftp
DUPLICITY_FULL_INTERVAL=1W
DUPLICITY_STORE_PERIOD=2W
DUPLICITY_VOLUME_SIZE=1000 # 1GB 
# what to backup 
BACKUP_DIRS="/databases /etc /var/www"

Обратите внимание, ставить пробелы вокруг = нельзя.

Переменная FTP_LOGIN определяет имя пользователя FTP.

Интервалы полного резервного копирования и удаления старых копий DUPLICITY_FULL_INTERVAL и DUPLICITY_STORE_PERIOD заданы как 1 и 2 недели соответственно. Если требуется, вы можете изменить на другие значения (часто используются d — Day, w — Week, m — Month, y — Year). Полный список поддерживаемых интервалов смотрите в man duplicity.

Переменная DUPLICITY_VOLUME_SIZE определяет какой размер будет у сохраненных томов, в примере 1 GB. Если вы выполняете копирование по сети с высоким шансом обрыва передачи данных, уменьшайте это значение.

Помните, что, задав слишком малое значение, вы получите огромное количество файлов, что может оказать негативное влияние, если сервер медленно обрабатывает листинги каталогов или имеет ограничение на количество inode в файловой системе. С другой стороны, малый размер тома ускорит время восстановления файлов, поскольку время распаковки тома будет меньше, чем для большого тома.

Переменная BACKUP_DIRS содержит перечень каталогов, которые будут помещены в архив. Специальный каталог /databases создается скриптом автоматически для дампов MySQL. Убирать этот каталог из списка не надо, иначе базы данных не будут сохраняться в резервную копию.

Настройка резервного копирования баз данных MySQL

Дампы баз данных сохраняются в каталог /databases/день-недели, для MySQL дампы имеют префикс my_. Такая структура хранения (по дням недели) значительно упрощает восстановление данных без обращения к резервным копиям.

Для активации бэкапа баз MySQL необходимо создать файл с настройками для подключения к серверу MySQL:

sudo mkdir -p /root/mysql

sudo tee /root/mysql/my.cnf >/dev/null

[client]
host     = localhost
user     = backup
password = secret

Ctrl^D

У указанной учетной записи должен быть достаточный доступ для листинга (SHOW DATABASES) и дампа баз данных.

Настройка резервного копирования баз PostgreSQL

Дампы баз данных сохраняются в каталог /databases/день-недели, для PostgreSQL дампы имеют префикс pg_. Такая структура хранения (по дням недели) значительно упрощает восстановление данных без обращения к резервным копиям.

Для того, чтобы базы данных Postgres сохранялись в копии, необходимо только наличие PostgreSQL и пользователя postgres, который имеет доступ к psql.

Тестовый запуск

Проверьте выполнение резервного копирования с заданными настройками. В результате тестового запуска в хранилище должны образоваться каталоги вида backup-<hostname>_<my_dir_path>, содержащие данные.

sudo bash /root/backup-server

Если все отработало правильно, то переходим к заключительному этапу настройки — запуску по расписанию.

Добавление запуска по расписанию

Создайте файл /etc/cron.daily/backup-server. Добавьте в него скрипт запуска резервного копирования:

#!/bin/bash
bash /root/backup-server
exit 0

Установите корректные права и проверьте работоспособность скрипта:

sudo chmod 755 /etc/cron.daily/backup-server
sudo /etc/cron.daily/backup-server

Если резервное копирование успешно выполнено, значит все в порядке. Для уверенности проверьте, что резервные копии обновились через сутки.

Дальнейшие шаги

Необходимо регулярно наблюдать, что в хранилище создаются бэкапы. Периодически необходимо проводить тестовое восстановление данных с помощью duplicity.

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