Настроим резервное копирование сервера VDS с помощью утилиты duplicity на операционной системе CentOS 7. Для хранения резервных копий будем использовать Yandex Disk. Бэкапы защитим с помощью надежного шифрования OpenPGP. Возможность автоматического создания архивов.

Введение

В предыдущей статье «Backup сайта на Яндекс Диск» мы рассмотрели как настроить резервное копирование файлов и базы данных сайтов, но для полного спокойствия этого мало. Как правило, ресурсы предоставляющие VDS не делают резервных копий и заботится о безопасности приходится самим владельцам VDS. Мне гораздо спокойней перед любыми действиями с сервером создать полную резервную копию. Сюрпризы после обновления или настройкой могут вывести сервер из работы. Без резервной копии придется  потратить много времени и нервов для восстановления работы сервера.

Установка Duplicity

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

Установим репозиторий Epel без вопросов, если он не был установлен ранее:

yum -y install epel-release

Установим Duplicity без вопросов:

yum -y install duplicity

Создания ключа OpenPGP

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

Создадим необходимый ключ выполнив команду:

gpg --gen-key
= вывод команды с пояснениями. Часть информации удалена. =
Выберите требуемый тип ключа:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (только для подписи)
 (4) RSA (только для подписи)
Ваш выбор (?-подробнее)? 1
ключи RSA могут иметь длину от 1024 до 4096 бит.
Какой размер ключа необходим? (2048) 
Запрашиваемый размер ключа 2048 бит
Выберите срок действия ключа.
 0 = без ограничения срока действительности
 <n> = срок действительности n дней
 <n>w = срок действительности n недель
 <n>m = срок действительности n месяцев
 <n>y = срок действительности n лет
Ключ действителен до? (0) 
Ключ не имеет ограничения срока действительности
Все верно? (y/N) y
GnuPG необходимо составить UserID в качестве идентификатора ключа.
Ваше настоящее имя: sevo44
Email-адрес: test@sevo44.ru
Комментарий: duplicity-backup
Вы выбрали следующий User ID:
 "sevo44 (duplicity-backup) <test@sevo44.ru>"
Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (O)Принять/(Q)Выход? o
Для защиты секретного ключа необходима фраза-пароль.
!!! Ввводим пароль 2 раза и не забываем его !!!

gpg: ключ 37D34631 помечен как абсолютно доверяемый.
открытый и закрытый ключи созданы и подписаны.
pub 2048R/37D34631 2017-05-08
Отпечаток ключа = 0AFF 9E2E 52DB 7ED2 480D 5DE2 971F 83F8 37D3 4631
uid sevo44 (duplicity-backup) <info@sevo44.ru>
sub 2048R/C5730EC9 2017-05-08

Для создания ключа откройте новый терминал и делайте там любые действия. У меня генерация длилась минут 30.

Вот наш ID ключа 37D34631 который мы и будем использовать.

Обязательно сохраните ключ в надежное место и не забывайте пароль который указывали при создании ключа!

Подключение Yandex disk

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

yum -y install davfs2

Создадим папку куда будем монтировать:

mkdir /mnt/ydisk_backup_vds

Подключим Yandex Disk:

mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
= вывод команды =
 Please enter the username to authenticate with server
 https://webdav.yandex.ru or hit enter for none.
 Username: test@sevo44.ru
 Please enter the password to authenticate user test@sevo44.ru with server
 https://webdav.yandex.ru or hit enter for none.
 Password: ********
 /sbin/mount.davfs: Warning: can't write entry into mtab, but will mount the file system anyway

Для отмантирования диска:

umount /mnt/ydisk_backup_vds

Вводить каждый раз данные не удобно и мы настроим подключение без этих вопросов:

mcedit /etc/davfs2/secrets
= необходимые данные для добавления =
# Данные для подключения к Yandex Disk
/mnt/ydisk_backup_vds/ test@sevo44.ru password

Теперь при подключении не будет запроса логина и пароля.

Cсоздадим папку на сервере куда будем распаковывать из архива:

mkdir /restore

Все подготовительные действия выполнены и можно приступать к работе с сервисом.

Работа с Duplicity

Рассмотрим основные моменты работы с сервисом.

Ручное создание архивов

Можно настроить автоматическое монтирование Yandex Diska при загрузке сервера указав нужные параметры в файл /etc/fstab.  Мне кажется это не разумно, но как именно настраивать решать только вам.

Создадим полный архив с помощью ключа и исключим папки не нужные для резервной копии.

Можно указать full для полной резервной копии. Если ничего не указывать то создастся вначале полный архив а последующие будут создаваться incremental.

Имейте в виду, что надо точно указать папку куда создаете резервную копию! Если ошибетесь то создаётся папка что указали.

Внимательно отнеситесь к папкам которые мы исключаем из резервного копирования! Настройте при необходимости под свои требования.

duplicity --encrypt-key=37D34631 --exclude=/restore --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/spool --exclude=/var/cache --exclude=/var/tmp --exclude=/swap / file:///mnt/ydisk_backup_vds/backup_vds
= вывод команды =
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
 Время последней полной резервной копии: нету
 Сигнатуры не найдены, переключение на полную резервную копию.
 !!!! Процесс не быстрый, ждем !!!!
-------------[ Статистика резервного копирования ]-------------
 StartTime 1494264679.29 (Mon May 8 20:31:19 2017)
 EndTime 1494264988.55 (Mon May 8 20:36:28 2017)
 ElapsedTime 309.26 (5 minutes 9.26 seconds)
 SourceFiles 43662
 SourceFileSize 1504877467 (1.40 GB)
 NewFiles 43662
 NewFileSize 1504877467 (1.40 GB)
 DeletedFiles 0
 ChangedFiles 0
 ChangedFileSize 0 (0 bytes)
 ChangedDeltaSize 0 (0 bytes)
 DeltaEntries 43662
 RawDeltaSize 1481346284 (1.38 GB)
 TotalDestinationSizeChange 627905129 (599 MB)
 Errors 0

Распакуем все что есть в папку restore:

duplicity --encrypt-key=37D34631 --file-to-restore / file:///mnt/ydisk_backup_vds/backup_vds /restore
 = вывод команды =
 Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
 Время последней полной резервной копии: Mon May 8 20:42:33 2017
 Кодовая фраза GnuPG: тот пароль что указывали при генерации ключа!

После появления строки приглашения консоли проверяем папку restore.

Если необходимо выдернуть из архива только определенные папки или файлы необходимо выполнить команду ( в нашем случае мы распаковали папки etc):

duplicity --encrypt-key=37D34631 --file-to-restore etc file:///mnt/ydisk_backup_vds/backup_vds /restore/etc

Полуавтоматическое создание архивов

Немного автоматизируем процесс работы с сервисом. Напишем скрипт который выполнит монтирование Yandex Disk, произведёт резервное копирование и отключать диск.

Создадим скрипты для бэкапа и восстановления в папку restore.

mcedit /root/duplicity_bakup.sh
 = необходимые данные =
 #!/bin/sh
 # Монтируем Yandex.Disk
 mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
 # Создаем резервную копию
 duplicity --encrypt-key=37D34631 --exclude=/restore --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/spool --exclude=/var/cache --exclude=/var/tmp --exclude=/swap / file:///mnt/ydisk_backup_vds/backup_vds
 # Отключаем Yandex.Disk
 umount /mnt/ydisk_backup_vds/
mcedit /root/duplicity_restore.sh
 = необходимые данные =
 #!/bin/sh
 # Монтируем Yandex.Disk
 mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
 # Распаковываем архив в папку restore
 duplicity --encrypt-key=37D34631 --file-to-restore / file:///mnt/ydisk_backup_vds/backup_vds /restore
 # Отключаем Yandex.Disk
 umount /mnt/ydisk_backup_vds/

Дадим необходимые права файлам:

chmod +x /root/duplicity_bakup.sh
chmod +x /root/duplicity_restore.sh

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

Для постоянного автоматического резервного копирование можно добавить строчку в /etc/crontab и копии будет создаваться по расписанию.

Проверка и удаление архивов

Посмотрим информацию о резервных копиях в необходимом каталоге:

duplicity collection-status --encrypt-key=37D34631 file:///mnt/ydisk_backup_vds/backup_vds/
= вывод команды =
 Синхронизация удалённых метаданных с локальными временными файлами...
 Время последней полной резервной копии: Tue May 9 11:49:43 2017
 Состояние сбора
 -----------------
 Соединение с внутренним интерфейсом: BackendWrapper
 Папка архива: /root/.cache/duplicity/7662853acae7adf7fc3957d15d7c9b58

Найдено 0 вторичных цепочек резервных копий.

Найдена первичная цепочка резервного копирования с соответствующей цепочкой подписи:
 -------------------------
 Цепочка начата: Tue May 9 11:49:43 2017
 Цепочка завершена: Tue May 9 11:49:43 2017
 Количество содержащихся наборов резервного копирования: 1
 Общее число содержащихся томов: 4
 Тип резервной копии: Время: Число томов:
 Полная Tue May 9 11:49:43 2017 4
 -------------------------
 Отсутствуют изолированные или неполные наборы резервного копирования.

Удаление всех резервных копий кроме последней:

duplicity --encrypt-key=37D34631 remove-all-but-n-full 1 --force file:///mnt/ydisk_backup_vds/backup_vds/

Удаление копий старше 1 месяца:

duplicity --encrypt-key=37D34631 remove-older-than 1M file:///mnt/ydisk_backup_vds/backup_vds/

Есть команда для просмотра файлов в архиве но смысла выводить эту портянку просто нет. Гораздо быстрей восстановить все что надо в папку restore и спокойно с ней работать.

Результат

Данная утилита очень гибкая в настройке и позволяет использовать её в разных вариантах. Существуют готовые скрипты автоматизации управления которые у меня не получилось настроить да и незачем усложнять то что не надо. Шифрование архивов еще никому не вредило и сервис делает это просто и понятно.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!