Порой в ходе проекта резервные копии нужны “под рукой”: когда компоненты обновляются часто, появляется необходимость в быстром восстановлении, если что-то пойдет не так. Если мы ставим задачу организовать быстрый доступ к резервным копиям, то архивирование данных не подойдет — распаковка архива занимает время, и порой немалое.
В этой статье мы разберемся, как настроить регулярное создание резервных копий сайта в связке утилит rsync и mysqldump.
Перед тем как приступить к инструкции, стоит отметить недостаток данного метода — резервные копии будут храниться на диске не в сжатом виде, в силу чего бекапы будут занимать больше места, нежели архивированные данные.
Подготовка хранилища
В примере разобрано размещение резервных копий на Ice Storage — изолированном хранилище, что позволит работать с бекапами вне носителя, где размещен рабочий проект. В статье мы рассказали, почему важно хранить бекапы на отдельном диске.
- Переходим в личный кабинет и подключаем Ice Storage необходимого размера в меню управления боксом. Бокс будет перезагружен во время подключения Ice Storage.
- Подключаемся по SSH к боксу. Чтобы узнать путь к Ice Storage, выполняем команду lsblk:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 366K 0 rom vda 254:0 0 32G 0 disk └vda1 254:1 0 32G 0 part / vdb 254:16 0 32G 1 disk └vdb1 254:17 0 32G 1 part /mnt/sprintbox_storage/storage-123
Вместо /mnt/sprintbox_storage/storage-123 отобразится актуальный путь к хранилищу.
- Переходим в хранилище и создаем папки, где будут хранится резервные копии файлов и баз данных:
cd /mnt/sprintbox_storage/storage-123/ && mkdir file-backups-storage database-backups-storage
Хранилище для бекапов готово.
Установка rsync и настройка резервного копирования
rsync — удобная утилита для копирования файлов и каталогов.
Устанавливаем rsync командой:
Debian / Ubuntu:
apt-get install rsync
CentOS:
yum install rsync
Перейдем в корневой каталог пользователя и создадим bash-скрипт backup-tool.sh:
cd ~/ && touch backup-tool.sh
Заполним его содержимым:
now=`date +"%m_%d_%Y_%k:%M:%S"` rsync -av /var/www/www-root/data/www/domain.ru/ /mnt/sprintbox_storage/storage-123/file-backups-storage/domain.ru-backup-$now/ mysqldump -u wpress_dbuser -p9E7v9Q8j wpress_database > /mnt/sprintbox_storage/storage-123/database-backups-storage/database-dump-$now.sql /usr/bin/find /mnt/sprintbox_storage/storage-123/file-backups-storage/ -type d -name "domain.ru-backup-*" -ctime 7 -exec rm -rf {} \; /usr/bin/find /mnt/sprintbox_storage/storage-123/database-backups-storage/ -type f -name "database-dump-*" -ctime 7 -exec rm -rf {} \;
Подробно рассмотрим, что означает каждая строка.
Первая строка записывает в переменную now текущее время на сервере в формате: месяц-день-год-час:минута:секунда. В дальнейшем мы укажем переменную в имени бекапов. Например, папка с бекапом будет иметь вид:
domain.ru-backup-09_19_2019_17:02:06
Вторая строка состоит из трех частей:
rsync -av — вызов утилиты rsync в архивном режиме. Архивный режим использует рекурсивное копирование, а также сохранение прав и владельца на файлы и каталоги.
/var/www/www-root/data/www/domain.ru/ - путь к корневой папке сайта.
/mnt/sprintbox_storage/storage-123/file-backups-storage/domain.ru-backup-$now/ — путь до хранилища, где будет размещен бекап. Обратите внимание на название папки domain.ru-backup-$now. В имя папки с бекапом запишется значение переменной now, т.е время, в которое началось создание бекапа.
Третья строка:
mysqldump -u wpress_dbuser -p9E7v9Q8j wpress_database > — вызов утилиты mysqldump для экспорта резервной копии базы данных. Вместо wpress_dbuser и wpress_database укажите имя пользователя базы данных и её название. После ключа -p укажите пароль пользователя базы данных. Знак “>” указывает на путь хранилища резервной копии.
/mnt/sprintbox_storage/storage-123/database-backups-storage/database-dump-$now.sql — путь к хранилищу бекапов баз данных. В имени бекапа также будет записано серверное время.
Четвертые и пятые строки имеют общую структуру:
/usr/bin/find — вызов утилиты find, предназначенной для поиска файлов по определенным критериям.
/mnt/sprintbox_storage/storage-123/file-backups-storage/ - путь к каталогу, в котором будет выполняться поиск.
-type — данный ключ указывает на то, что мы собираемся найти. Значение d указывает на поиск каталогов, а f - на поиск файлов.
-ctime 7 — с помощью ключа ctime указываем, какой давности в днях нам требуется найти файлы. Вместо 7 укажите желаемое количество дней.
-delete — данный ключ означает, что обнаруженные файлы и каталоги будут удалены.
Не забудьте изменить пути в скрипте на актуальные.
Итого: скрипт скопирует содержимое сайта в хранилище, туда же выгрузит резервную копию базы данных, найдет бекапы недельной давности и удалит их.
Добавление задания в Сron
Чтобы резервные копии создавались регулярно, настроим выполнение созданного скрипта в cron. Для этого:
- Откроем crontab:
crontab -e
- Добавим задание:
30 0 * * * bash ~/backup-tool.sh
- Сохраняем изменения.
Готово! Каждый день, в 00:30 в Ice Storage будет сохраняться резервная копия файлов сайта и используемая база данных.
Восстановление из резервной копии
Для восстановления из резервной копии потребуется:
- Предварительно переименуем корневой каталог сайта:
mv /var/www/www-root/data/www/domain.ru/ /var/www/www-root/data/www/domain.ru-bak
- Создадим новый корневой каталог и скопируем туда содержимое бекапа:
mkdir /var/www/www-root/data/www/domain.ru && cp -r /mnt/sprintbox_storage/storage-123/file-backups-storage/domain.ru-backup-09_19_2019_17:02:06/* /var/www/www-root/data/www/domain.ru/
- Предварительно выгрузим текущее состояние базы данных:
mysqldump -u wpress_dbuser -p9E7v9Q8j wpress_database > /var/www/www-root/data/www/domain.ru/mysql-dump.sql
- Импортируем бекап в базу данных:
mysql -u wpress_dbuser -p9E7v9Q8j wpress_database < /mnt/sprintbox_storage/storage-123/database-backups-storage/database-dump-09_19_2019_17:02:06.sql
Проверяем работу сайта. Если всё работает исправно, то удалите ранее переименованный корневой каталог.
В данной статьей мы рассмотрели возможность создания и хранения бекапов на Ice Storage, созданных в связке утилит rsync и mysqldump. Если ваш проект занимает много дискового пространства, рекомендуем рассмотреть вариант создания сжатых бекапов по нашей инструкции.