Прошло некоторое время и замечательная утилита Grive для выгрузки файлов на Google Drive перестала корректно работать, в связи с чем перестало работать резервное копирование. Поэтому было решено использовать Яндекс.диск для хранения резервных копий, а он поддерживает работу по протоколу WebDAV, что сильно упрощает работу с ним.
Итак, создадим новый скрипт для резервного копирования.
Для его работы потребуются дополнительные утилиты: mysqldump, openssl, curl.
установим их:
apt-get install openssl curl mysql-client
Далее сам скрипт резервного копирования и пояснения к нему.
#! /bin/bash
#Переменные для создания имени файла
#Время в формате ДД-ММ-ГГГГ.ЧЧ-мм-СС
DATE=$(date +%d-%m-%Y.%H-%M-%S)
#Имя сайта
SITE_NAME='blackdiver.net'
#Переменная для имени SQL файла
FILE_SQL_NAME=$SITE_NAME'.sql'
#Переменная для имени файла с архивом папок сайта
FILE_DIR_NAME=$SITE_NAME'-files.tar'
#Финальное имя архива резервной копии
FILE_BACKUP_NAME=$SITE_NAME'-'$DATE'.tar.gz'
#Имя шифрованного архива резервной копии
FILE_ENC_NAME=$SITE_NAME'-'$DATE'.tar.gz.aes256'
#Директории
#Путь до папки, где создается резервная копия
BACKUP_DIR='/data/backup'
#Путь до папки, где находятся файлы сайта
WEB_DIR='/sites/blackdiver.net/webroot/'
#MySQL
#Имя пользователя MySQL
SQL_USER='mysql_user'
#Пароль пользователя MySQL
SQL_PASS='mysql_password'
#Сервер MySQL
SQL_HOST='mysql.blackdiver.net'
#Имя базы данных
SQL_DB='blackdiver_db'
#Пароль архива
ARC_PASS='password'
#WebDAV
#Имя пользователя WebDAV
WEBDAV_USER='user@yandex.ru'
#WebDAV Пароль
WEBDAV_PASS='yandex_password'
#WebDAV Сервер и путь
WEBDAV_DIR='https://webdav.yandex.ru/backup/'
#Смена рабочей директории на директорию для резервного копирования
cd $BACKUP_DIR
#Создание утилитой mysqldump резервной копию БД и сохранение ее в файл с именем из переменой FILE_SQL_NAME
mysqldump -u$SQL_USER -p$SQL_PASS -h $SQL_HOST $SQL_DB > $FILE_SQL_NAME
#Создание не сжатого архива файловой структуры сайта (имя архива берется из переменной FILE_DIR_NAME)
tar -cf $FILE_DIR_NAME -C $WEB_DIR .
#Создание общего сжатого архива из резервной копии SQL и резервной копии файловой структуры сайта
tar -czf $FILE_BACKUP_NAME $FILE_DIR_NAME $FILE_SQL_NAME
#Перед выгрузкой шифруем файл с помощью OpenSSL
openssl enc -e -aes-256-cbc -k $ARC_PASS -in $FILE_BACKUP_NAME -out $FILE_ENC_NAME
#Выгрузка по протоколу WebDAV
curl --user $WEBDAV_USER':'$WEBDAV_PASS -T $BACKUP_DIR'/'$FILE_ENC_NAME $WEBDAV_DIR
#Удаление предварительных резервных копий SQL и файловой структуры
rm $FILE_SQL_NAME $FILE_DIR_NAME $FILE_ENC_NAME
Разберем что делает этот скрипт:
Для начала задается набор переменных для удобства работы
Переменные описаны в комментариях, в самом скрипте. Поэтому повторяться не буду, а лучше опишу логику работы.
Сначала задается массив переменных для формирования имен файлов. Основные переменные это DATE (текущее время) и SITE_NAME (имя сайта для архива). Остальные переменные вспомогательные, для формирования имен файлов.
Потом задаем пути BACKUP_DIR (место хранения локальных резервных копий) и WEB_DIR (путь до файлов сайта).
После этого указываем реквизиты доступа к базе MySQL.
Пароль для архива хранится в переменной ARC_PASS.
И заканчиваем переменными для хранения реквизитов доступа к WebDAV серверу.
WEBDAV_USER – имя пользователя (для Яндекс.диска указывается целиком в формате имя_пользователя@yandex.ru)
WEBDAV_PASS – пароль
WEBDAV_DIR – конечный путь сохранения файлов. Указывается вместе с папками на удаленном сервере ( для резервных копий на Яндекс.диске была создана папка backup. Адрес WebDAV сервера Яндекс.диска: https://webdav.yandex.ru/)
Далее мы меняем рабочую директорию на место хранения резервных копий.
Описание этих команд есть в предыдущей статье: Резервное копирование MySQL и всех файлов web сервера
Создаем резервную копию базы данных и записываем ее в файл.
Создаем не сжатую резервную копию всех файлов (tar с опциями -cf).
Далее берем файл резервной комии БД и файл резервной копии файлов и создаем из них один общий сжатый (tar с опциями -czf) архив.
Далее шифруем получившийся архив с помощью OpenSSL.
Параметры OpenSSL:
enc – режим шифрования
-e – указываем, что будем шифровать файл
-aes-256-cbc – указываем алгоритм шифрования
-k – указываем пароль шифрования
-in – файл, который будем шифровать
-out – файл который получится после шифрования.
Теперь вызываем curl и подключаемся к WebDAV серверу.
–user – передаем имя пользователя в формате имя_пользователя:пароль
-T – загрузить файл
и указываем путь к серверу WebDAV.
Остается только стереть лишнее. Оставим локально только незашифрованную копию, остальное сотрем командой rm.
После создания скрипта его нужно добавить в cron для автоматического выполнения по расписанию, как это сделать описывается в статье Добавление задачи в cron.
Резервное копирование на внешний сервер настроено, остается только рассказать, как расшифровывать архив.
Для расшифровки архива нам так же потребуется утилита openssl, но параметр -e (зашифровать) изменится на параметр -d (расшифровать).
Соответственно расшифровывать будем командой:
openssl enc -d -aes-256-cbc -k password -in ИМЯ_ФАЙЛА.tar.gz.aes256 -out ИМЯ_ФАЙЛА.tar.gz
получив на выходе обычный архив tar.gz. Главное не забывать пароль!
Заказать создание и поддержку безопасной IT-инфраструктуры любой сложностиБыть уверенным в своей IT-инфраструктуре – это быть уверенным в завтрашнем дне. Для того, чтобы сделать заказ:
|
Хранить пароль от всех сервисов яндекса в открытом виде не есть хорошо (лучше сказать совсем плохо). Почему бы не использовать OAuth токен и REST API?
Эта статья рассчитывалась для новичков и не хотелось ее усложнять, поэтому вопрос серьезной безопасности не ставились. Да и под бекапы лучше использовать отдельные аккаунты. Все равно серьезные проекты бекапить будут по другому, но раз есть потребность в описании более безопасной схемы, без хранения паролей, то в ближайшее время напишу дополнение к статье.
А как удалять устаревшие бекапы с удаленного хранилища ?
Я периодически чищу их вручную. Но можно и написать скрипт. Зная имена файлов и принцип их генерации это не сложно.