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

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

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

Автоматический бэкап сайта

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

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/yadisk/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_2020-12-01_04-10.tar.gz, внутри которой будет лежать папка www со всем содержимым. Изначально, эта папка располагалась по адресу /web/sites/site1.ru/www. Здесь я применил tar с параметром для того, чтобы в архиве не было точного пути /web/sites/site1.ru, а была только папка www. Мне просто так удобнее.

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

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

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

#!/bin/sh
# Задаем переменные
# Текущая дата в формате 2020-12-01_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/mnt/yadisk/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_2020-12-01_04-10.sql.gz. Дамп хранится в текстовом формате, можно открывать и редактировать любым редактором. Если у вас несколько баз mysql и вы хотите их разом забекапить, автоматически разложив по отдельным файлам, читайте отдельную статью по теме - бэкап всех баз mysql в отдельные файлы.

Настройка яндекс диска в CentOS 8

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

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

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

У меня в качестве сервера выступает CentOS 8, поэтому я расскажу как настроить консольный клиент linux для работы с яндекс диском в нем. Если у вас еще нет своего сервера, то читайте мои статьи по этому поводу - установка и настройка centos.

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

# rpm -ivh http://repo.yandex.ru/yandex-disk/yandex-disk-latest.x86_64.rpm

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

mcedit /etc/yum.repos.d/yandex.repo
[yandex]
name=Yandex
failovermethod=priority
baseurl=http://repo.yandex.ru/yandex-disk/rpm/stable/$basearch/
enabled=1
metadata_expire=1d
gpgcheck=1
gpgkey=http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
# rpm --import http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
# dnf install yandex-disk

Клиент диска установили, теперь его надо настроить. Это можно сделать с помощью консольной команды.

# yandex-disk setup

Запустится мастер настройки, комментировать которые особо нет смысла, там и так все понятно.

Настройка yandex disk на linux

Теперь все файлы, положенные в директорию /mnt/yadisk будут синхронизированы с облаком и загружены в него. Файлы не обязательно класть физически, подойдут и символьные ссылки. Статус синхронизации можно посмотреть отдельной командой.

Синхронизация яндекс диска на linux

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

Автоматический архив сайта по дням

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

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

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

Привожу 3 полных скрипта по созданию резервной копии сайта по схеме, предложенной выше.

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

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_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'

# Создание архива исходников
/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 {} \;

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

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_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'

# Создание архива исходников
/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 {} \;

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

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_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'

# Создание архива исходников
/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
Не забудьте создать директорию /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

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

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

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

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

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

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

# tar -xzvf www_2020-12-01_04-10.tar.gz

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

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

# gunzip mysql_2020-12-01_04-10.sql.gz

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

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

> source mysql_2020-12-01_04-10.sql;

Все, база данных восстановлена.

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

Заключение

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

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

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

26 комментариев

  1. Странное поведение клиента, у меня на VPS 10 гигов памяти, после установки яндекс диск загрузил мои данные на VPS и не осталось свободного места, нужно дополнительно настраивать, чтобы каталоги с яндекса диска не грузились на VPS и не занимали место?

    • Да, надо настраивать это. По умолчанию он все синхронизирует с облачным диском.

      • Понял, и без костыля из комментария ниже, будут резервные копии занимать место на сервере) Спасибо

  2. При копировании на Яндекс диск есть одна неприятная особенность:
    Это ротация резервных копий, точнее ее отсуттвие.
    Когда на в локальной папке Яндекс Диска удаляешь каку-либо файл, либо директорию, локально она удаляется, далее изменения синхронизируются и в облачной копии удаленные файлы помещаются в корзину.
    Самое интересное, что в консольном клиенте под Linux нет опции "Очистить Корзину".
    Удаленные копии копятся в корзине, при этом они занимают общую квоту!!!
    Нигде , кроме как в веб интерфейсе , нет кнопки очистить корзину.
    Лично у меня была цель полностью автоматизировать резервное копирование, но из-за этой бяки этого не получилось сделать . Приходилось вруную в веб интрефейсе нажимать "Очистить Корзину".
    Из-за этого пришлось перейти на ЯндексОблако S3 .
    Такое ощущение что программисты Яндекса специально сделали так, чтобы не использовали Яндекс Диск для автоматических бэкапов.

    • Да, все верно. С той же проблемой сталкивался постоянно, когда использовал яндекс диск. Не понимал, почему не дали такой функционал клиенту.

  3. Стефан

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

    yandex-disk start
    sleep 30
    STATUS=`yandex-disk status | grep -o "ожидание команды"`
    until [ "$STATUS" == 'ожидание команды' ]
    do
    sleep 30
    STATUS=`yandex-disk status | grep -o "ожидание команды"`
    done
    yandex-disk stop
    rm -f /home/yadk/bkp_tmp/*
    mount -t davfs https://webdav.yandex.ru /mnt/yadav
    mv /mnt/yadav/bkp_tmp/* /mnt/yadav/bkp
    sleep 10
    umount -t davfs https://webdav.yandex.ru /mnt/yadav
  4. василий

    была информация, что Яндекс помимо удушения webdav начал отлавливать подключателей к ЯД api через rclone, например, и предлагать им переходить на ЯД для бизнеса

    • Не слышал об этом. Сам яндекс постоянно заявлял в тех. поддержке, что гарантирует работу своего сервиса только через свой родной клиент. Так что не удивительно, если у других возникают проблемы. Все же цена за гигабайт у яндекса низкая, поэтому понятно его желание отвадить от использования продукта коммерческих пользователей, которые дают большую нагрузку на сервис. Одно дело у меня сейчас личные 1,5 Тб своих данных, которые меняются в сутки мегабайт на 500-1000 максимум. И другое дело я те же 1,5 Тб коммерческих данных организации туда заливал бэкапов ежедневно.

  5. Подскажите, у кого-то сейчас пашет https://webdav.yandex.ru ?
    Не могу примонтировать по протоколу webdav, не в винде не в linux. В linux --
    /sbin/mount.davfs: Mounting failed.
    Could not authenticate to server: rejected Basic challenge

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

  6. Приветствую! Около года пользуюсь данным методом, для создания бекапов всех своих сайтов и сайтов клиентов. Примерно с 16 декабря 2018 года бекапы перестали заливаться на яндекс диск. На сервере ничего не менялось, учётная запись в яндексе тоже не изменялась. При ручном запуске скрипта вижу что диск монтируется, создаются бекапы и их видно в папке сайта (на сервере), но в яндекс диске пусто. Т.е. вроде как не работает синхронизация. Вы с таким не сталкивались? Как можно выяснить причину?

    • Отбой. Оказывается закончилось место на яндекс диске, хотя внизу информер пишет что свободно 52гб из 52

  7. Алексей

    Подскажите, как добавить информацию (сообщение) о выполнении бэкапа например в /var/log/backup.log ?
    Просто что бы была запись типа: дата вермя, скрипт отработал или нет и все..

  8. Здравствуйте!
    Спасибо за прекрасный материал, я почерпнул для себя много нового. Возможно, Вы сможете подсказать, как победить запрос на доверие к сертификатам при работе из-под Centos 6.5?

    # mount -t davfs https://webdav.yandex.ru /mnt/yadisk/
    /sbin/mount.davfs: the server certificate is not trusted
    issuer: Yandex Certification Authority, Yandex LLC, RU
    subject: Russian Federation, Moscow, ITO, Yandex LLC, RU
    identity: *.disk.yandex.net
    fingerprint: e1:a6:16:2d:40:11:8d:6f:87:fd:32:96:71:9b:28:27:36:f6:b2:da
    You only should accept this certificate, if you can
    verify the fingerprint! The server might be faked
    or there might be a man-in-the-middle-attack.
    Accept certificate for this session? [y,N]

    Ввиду этого запроса не получается полностью автоматизировать процесс.
    Не хочется использовать колхозное решение:
    echo 'y' | mount -t davfs https://webdav.yandex.ru /mnt/yadisk/
    Заранее спасибо!

    • В принципе, решение нормальное, не вижу тут каких-то проблем, если у вас нет повышенных требований к безопасности. А так я понял, в чем проблема. Вот как раз сегодня опубликовал статью с решением похожей проблемы с системными сертификатами - https://serveradmin.ru/oshibka-v-postfix-certificate-verification-failed/
      Смысл ошибки в том, что у вас в системе нет корневого СА, который выдал сертификат яндекса. Его можно добавить вручную. В статье я показал как. Вам нужно только найти, где хранятся в CentOS 6 корневые сертификаты и добавить туда издателя Yandex Certification Authority, Yandex LLC, RU.

  9. Александр

    Добрый день.
    Сложно ли будет сделать такой плагин для вордпресс? Чтобы не разбирающимся в программировании было просто установить и настроить? Есть похожие плагины для wordpress, но либо являются большими комбайнами с оплатой за установку на каждый сайт, либо не работают (напр. updraftplus, WP MyBackup Lite).

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar