IT

Сделать резервную копию сайта на яндекс диск

В современном мире все большую ценность получает информация, потеря которой может обернуться серьезными финансовыми расходами. Сайт является ценной информацией, резервную копию которого, или просто бэкап, мы сделаем в этой статье на примере wordpress и разместим на яндекс диске. Я рассмотрю вариант автоматизации процесса, который придумал для своих нужд и использую достаточно давно и успешно.


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

Скрипт для архива файлов сайта

Тут я не изобретал велосипеда, а воспользовался стандартным способом архивирования файлов — архиватором tar. Все комментарии и пояснения напишу сразу в скрипте:

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/backup/site1.ru'
# Директория на уровень выше той, где лежат файлы
inf_dir='/web/sites/site1.ru/'
# Название непосредственно директории с файлами
dir_to_bk='www'

# Создание архива
/usr/bin/tar -czvf $bk_dir/www_$date_time.tar.gz -C $inf_dir $dir_to_bk

На выходе после работы скрипта имеем папку с именем www_2015-09-29_04-10.tar.gz, внутри которой будет лежать папка www со всем содержимым. Изначально, эта папка располагалась по адресу /web/sites/site1.ru/www. Здесь я применил tar с параметром  для того, чтобы в архиве не было точного пути /web/sites/site1.ru, а была только папка www. Мне просто так удобнее.

Можно пользоваться отдельно этим скриптом для создания архивов файлов, не обязательно сайта. Кладем его в cron и получаем регулярную архивацию.

Скрипт для бэкапа базы данных

Теперь сделаем скрипт для резервной копии базы данных. Тут тоже ничего особенного, использую стандартное средство mysqldamp:

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/backup/site1.ru'
# Пользователь базы данных
user='user1'
# Пароль пользователя
password='pass1'
# Имя базы для бэкапа
bd_name='bd1'

# Выгружаем базу
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /usr/bin/gzip -c > $bk_dir/mysql_$date_time.sql.gz

На выходе имеем файл с дампом базы mysql_2015-09-29_04-10.sql.gz. Дамп хранится в текстовом формате, можно открывать и редактировать любым редактором.


Подключение яндекс диска в CentOS 7 по webdav

Существует достаточно удобный и бесплатный сервис Яндекс.Диск, который может использовать любой желающий. Бесплатно дается не так много места, но для бэкапа сайта на wordpress хватит. К слову, у меня с помощью всевозможных акций бесплатно доступно 368 ГБ:

Бэкап сайта на яндекс диск

Яндекс.Диск можно подключить с помощью webdav. У меня в качестве сервера выступает CentOS 7, я расскажу как подмонтировать в ней. Первым делом подключаем репозиторий epel. Затем устанавливаем пакет davfs2:

# yum -y install davfs2

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

# mkdir /mnt/yadisk

# mount -t davfs https://webdav.yandex.ru /mnt/yadisk/

Please enter the username to authenticate with server
https://webdav.yandex.ru or hit enter for none.
Username:
Please enter the password to authenticate user zeroxzed@yandex.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

Яндекс.Диск смонтирован в папку /mnt/yadisk.

Чтобы автоматизировать процесс архивации и не вводить каждый раз имя пользователя и пароль, отредактируем файл /etc/davfs2/secrets, добавив в конец новую строку с именем пользователя и паролем:

# mcedit  /etc/davfs2/secrets

/mnt/yadisk/ user@yandex.ru password
/mnt/yadisk/точка монтирования
user@yandex.ruимя пользователя яндекса
passwordпароль пользователя

Теперь при монтировании диска никаких вопросов задаваться не будет. Можно добавить подключение яндекс диска в fstab, чтобы он монтировался автоматически при загрузке, но я считаю это лишним. Я подключаю и отключаю диск в скрипте бэкапа. Если же вы хотите его монтировать автоматически, добавьте в fstab:

https://webdav.yandex.ru /mnt/yadisk davfs rw,user,_netdev   0   0

Автоматизация архивации сайта

По отдельности разобрали все элементы создания резервной копии сайта, теперь пришел черед собрать все это в одном месте. Я использую следующую схему бэкапа сайта:

  • Папка day, где хранится 7 архивов сайта за последние 7 дней.
  • Папка week, где хранятся 4 бэкапа за последние 4 недели.
  • Папка month, где хранятся все резервные копии сайта за все время, эту папку я автоматически не очищаю.

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

Привожу 3 полных скрипта по созданию резервной копии сайта wordpress, именно этот движок я чаще всего использую, но реально можно бэкапить любой сайт — joomla, drupal, modx и др. Принципиального значения cms или фреймворк не имеет.

Скрипт ежедневного бэкапа сайта backup-day.sh:

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/yadisk/site1.ru/day'
# Директория для архива
inf_dir='/web/sites/site1.ru/'
# Название непосредственно директории с файлами
dir_to_bk='www'
# Пользователь базы данных
user='user1'
# Пароль пользователя
password='pass1'
# Имя базы для бэкапа
bd_name='bd1'

# Монтируем яндекс.диск
mount -t davfs https://webdav.yandex.ru /mnt/yadisk/
# Создание архива исходников
/usr/bin/tar -czvf $bk_dir/www_$date_time.tar.gz -C $inf_dir $dir_to_bk
# Выгружаем базу данных
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /usr/bin/gzip -c > $bk_dir/mysql_$date_time.sql.gz
# Удаляем архивы старше 7-ми дней
/usr/bin/find $bk_dir -type f -mtime +7 -exec rm {} \;
# Отключаем яндекс.диск
umount /mnt/yadisk

Скрипт еженедельного бэкапа сайта backup-week.sh:

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/yadisk/site1.ru/weeek'
# Директория для архива
inf_dir='/web/sites/site1.ru/'
# Название непосредственно директории с файлами
dir_to_bk='www'
# Пользователь базы данных
user='user1'
# Пароль пользователя
password='pass1'
# Имя базы для бэкапа
bd_name='bd1'

# Монтируем яндекс.диск
mount -t davfs https://webdav.yandex.ru /mnt/yadisk/
# Создание архива исходников
/usr/bin/tar -czvf $bk_dir/www_$date_time.tar.gz -C $inf_dir $dir_to_bk
# Выгружаем базу данных
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /usr/bin/gzip -c > $bk_dir/mysql_$date_time.sql.gz
# Удаляем архивы старше 30-ти дней
/usr/bin/find $bk_dir -type f -mtime +30 -exec rm {} \;
# Отключаем яндекс.диск
umount /mnt/yadisk

Скрипт ежемесячного бэкапа сайта backup-month.sh:

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/yadisk/site1.ru/month'
# Директория для архива
inf_dir='/web/sites/site1.ru/'
# Название непосредственно директории с файлами
dir_to_bk='www'
# Пользователь базы данных
user='user1'
# Пароль пользователя
password='pass1'
# Имя базы для бэкапа
bd_name='bd1'

# Монтируем яндекс.диск
mount -t davfs https://webdav.yandex.ru /mnt/yadisk/
# Создание архива исходников
/usr/bin/tar -czvf $bk_dir/www_$date_time.tar.gz -C $inf_dir $dir_to_bk
# Выгружаем базу данных
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /usr/bin/gzip -c > $bk_dir/mysql_$date_time.sql.gz
# Отключаем яндекс.диск
umount /mnt/yadisk

Не забудьте создать директорию /mnt/yadisk/site1.ru на яндекс диске, а в ней еще 3 папки: day, week, month: # cd /mnt/yadisk/site1.ru && mkdir day week month


Теперь для автоматизации добавляем эти 3 файла в cron:

# mcedit /etc/crontab

# site backup to yandex.disk
# ежедневно в 4:10
10 4 * * * root /root/bin/backup-day.sh >/dev/null 2>&1
# еженедельно в 4:20 в воскресенье
20 4 * * 0 root /root/bin/backup-week.sh >/dev/null 2>&1
# ежемесячно в 4:30 1-го числа месяца
30 4 1 * * root /root/bin/backup-month.sh >/dev/null 2>&1

Все, наш wordpress надежно забэкаплен. По идее, сюда нужно прикрутить оповещение на почту, но у меня всю руки не доходят это сделать. Да и за несколько месяцев использования у меня не было ни одного сбоя.

Восстановление сайта wordpress из резервной копии

Теперь рассмотрим вариант, когда вам необходимо восстановить сайт из резервной копии. Для этого нам понадобятся оба архива: исходники и база данных. Разархивировать в принципе можно где угодно. В windows архивы открываются бесплатным архиватором 7zip. Дамп базы данных в обычном текстовом формате, его можно открыть блокнотом, скопировать и вставить в phpmyadmin.

Восстановление сайта из резервной копии

Так что вариантов восстановления может быть много, этим мне и нравится такой подход. Все файлы в открытом виде, с ними можно работать любыми подручными средствами.


Вот пример того, как извлечь файлы из архива в консоли сервера. Разархивируем каталог www из бэкапа:

# tar -xzvf www_2015-10-01_04-10.tar.gz

Файлы извлечены в папку www. Теперь их можно скопировать в папку с сайтом.

Для восстановления базы данных поступаем следующим образом. Сначала распакуем архив:

# gunzip mysql_2015-10-01_04-10.sql.gz

Теперь зальем дамп в базу данных:

# mysql --host=localhost --user=user1 --password=pass1 bd1;

MariaDB [(none)]> source mysql_2015-10-01_04-10.sql;

Все, база данных восстановлена.Необходимо учесть, что база будет восстановлена в базу с оригинальным именем и заменит ее содержимое, если таковая на сервере есть. Чтобы восстановить базу в другую, необходимо отредактировать начало дампа и заменить там название базы на новое. Если восстановление происходит на другом сервере, то это не имеет значения.


Заключение

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

Схема создания бэкапа позволяет откатиться практически на неограниченное время назад. Глубину архивов вы можете сами задавать, изменяя параметр mtime в скрипте. Можно хранить, к примеру, ежедневный архив не 7 дней, как делаю я, а 30, если у вас есть такая потребность. Так что пробуйте, адаптируйте под себя. Если есть какие-то замечания по работе, ошибки или предложения по улучшению функционала, делитесь своими мыслями в комментариях, буду рад их услышать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *