Скрипт резервного копирования сайта с шифрованием и выгрузкой на Яндекс.диск

Прошло некоторое время и замечательная утилита 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-инфраструктуре — это быть уверенным в завтрашнем дне.

Для того, чтобы сделать заказ:

Заполните форму обратной связи и мы обязательно с вам свяжемся:
Форма обратной связи
Позвоните нам по телефону:
+7(909)952-44-33
Напишите нам на электронную почту:
order@blackdiver.net
Напишите нам в Telegram:
Telegram
Другие способы связи Вы сможете найти в разделе Контакты.

4 мысли о “Скрипт резервного копирования сайта с шифрованием и выгрузкой на Яндекс.диск”

  1. Хранить пароль от всех сервисов яндекса в открытом виде не есть хорошо (лучше сказать совсем плохо). Почему бы не использовать OAuth токен и REST API?

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

    1. Я периодически чищу их вручную. Но можно и написать скрипт. Зная имена файлов и принцип их генерации это не сложно.