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

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

Пример протестирован в Ubuntu Linux 16.10, но должен работать и в более старых версиях Ubuntu и Debian, а так же производных. Скорее всего, с небольшими доводками, можно будет использовать в CentOS. Резервное копирование в нашем случае осуществляется с помощью утилиты duplicity.

Решение предназначено для LAMP серверов и сохраняет резервные копии файлов и всех БД СУБД MySQL и (или) PostgreSQL.

Итак, начнем.

Установка необходимых компонентов

$ sudo apt-get update
$ sudo apt-get install duplicity lftp ncftp screen

Загрузка скрипта копирования

$ sudo wget http://net-manager.netpoint-dc.com/utils/backup-server.ubuntu
$ sudo mv backup-server.ubuntu /root/backup-server
$ sudo chmod 755 /root/backup-server

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

Мы копируем на наше файловое хранилище NetPoint с помощью FTP. Нет смысла использовать протоколы с шифрованием, так как duplicity уже шифрует передаваемые данные. Для шифрования данных и задания пароля доступа к хранилищу необходимо создать два файла:

$ sudo echo "MySuperGPGSecretKeyWorD123" > /root/.passphrase
$ sudo chmod 600 /root/.passphrase
$ sudo echo "MyFTPPassword" > /root/.backup-passwd
$ sudo chmod 600 /root/.backup-passwd

Где MySuperGPGSecretKeyWorD123 секретный ключ шифрования ваших архивов. Если потеряете данный ключ, ничего восстановить не получится. Сохраните сведения о нем в каком-нибудь надежном месте.

Фраза MyFTPPassword — пароль доступа к хранилищу.

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

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

#!/bin/bash

# ftp storage information
FTP_SERVER=c1-ftp1.netpoint-dc.com
FTP_PATH=/_data
FTP_LOGIN=CHANGEME

DUPLICITY_FULL_INTERVAL=1W
DUPLICITY_STORE_PERIOD=2W
DUPLICITY_VOLUME_SIZE=1000 # 1GB

# what to backup
BACKUP_DIRS="/databases /etc /var/www"

# when to launch
LAUNCH_EVERY=86400

Обратите внимание, ставить пробелы вокруг «=» нельзя! Без пробелов пишем. Итак, значения большинства переменных самоочевидны, необходимо поменять FTP_LOGIN, которая определяет имя пользователя FTP.

Интервалы полного резервного копирования и удаления старых копий DUPLICITY_FULL_INTERVAL и DUPLICITY_STORE_PERIOD заданы как 1 и 2 недели соответственно, можно изменить на другие значения.

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

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

Переменная LAUNCH_EVERY определяет время ожидания между циклами резервного копирования в секундах — в примере установлено в значение, равное 1 суткам.

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

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

$ sudo /root/backup-server
MySQL dump for cacti ... done
MySQL dump for mysql ... done
MySQL dump for sys ... done
MySQL dump for zabbix ... done
Backup /databases
LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: Thu Feb 9 17:49:50 2017
--------------[ Статистика резервного копирования ]--------------
StartTime 1486638297.68 (Thu Feb 9 18:04:57 2017)
EndTime 1486638297.69 (Thu Feb 9 18:04:57 2017)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 5
SourceFileSize 4908 (4.79 KB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
ChangedFiles 4
ChangedFileSize 812 (812 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 4
RawDeltaSize 32 (32 bytes)
TotalDestinationSizeChange 258 (258 bytes)
Errors 0
-----------------------------------------------------------------

LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: нету
Старые резервные копии не найдены, ничего не удалено.
Backup /etc
LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: Thu Feb 9 17:49:52 2017
--------------[ Статистика резервного копирования ]--------------
StartTime 1486638299.49 (Thu Feb 9 18:04:59 2017)
EndTime 1486638300.27 (Thu Feb 9 18:05:00 2017)
ElapsedTime 0.78 (0.78 seconds)
SourceFiles 2476
SourceFileSize 4023189 (3.84 MB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 0
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 112 (112 bytes)
Errors 0
-----------------------------------------------------------------

LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: нету
Старые резервные копии не найдены, ничего не удалено.
Backup /var/www
LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: Thu Feb 9 17:49:55 2017
--------------[ Статистика резервного копирования ]--------------
StartTime 1486638301.98 (Thu Feb 9 18:05:01 2017)
EndTime 1486638302.01 (Thu Feb 9 18:05:02 2017)
ElapsedTime 0.04 (0.04 seconds)
SourceFiles 8
SourceFileSize 329738808 (314 MB)
NewFiles 1
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 1
ChangedFileSize 290 (290 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 9 (9 bytes)
TotalDestinationSizeChange 257 (257 bytes)
Errors 0
-----------------------------------------------------------------

LFTP version is 4.7.2
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
Время последней полной резервной копии: нету
Старые резервные копии не найдены, ничего не удалено.
--------------------------------------------------------
Copy cycle end. Will repeat after 86400 seconds.
--------------------------------------------------------

Если все отработало правильно, нажимаем Ctrl+C и переходим к заключительному этапу настройки — настройке запуска в фоновом режиме. Цель — обеспечить автозапуск скрипта после перезагрузки.

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

Открываем для редактирования файл /etc/rc.local. Добавляем в него строку запуска нашего скрипта резервного копирования.

#!/bin/bash

screen -dmS backup-server /root/backup-server

exit 0

Запустим теперь скрипт для работы

$ sudo chmod 755 /etc/rc.local
$ sudo /etc/rc.local

Проверим что работа началась. Для этого запустите команду sudo screen -r и Вы должны увидеть результаты, аналогичные результатам тестового запуска. Настройка завершена. Нажимаем Ctrl+A, D чтобы выйти из текущей сессии screen.

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

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