Бекап сайта и mysql на яндекс диск REST API + Bash

10618
27

Когда бекап Вашего сайта занимает 10Гб то невольно начинаешь думать об экономии места на VPS, да и ручками копировать созданные бекапы довольно трудоемко. Некоторые вообще бекапами не заморачиваются, а потом кусают локти. Сегодня мы рассмотрим как с помощью инструмента REST API от Яндекс диска сделать полный бекап сайта и базы mysql на этот самый облачный диск Яндекса.

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

Преимущества бекапа на Яндекс Диск

Первое и наверное самое важное преимущество — скорость и автономность работы без использования средств CMS и php скриптов, так как делать скрипт мы будем писать в bash. Дополнительное пространство на яндекс диске можно приобрести довольно дешево. Например я прикупил на 1 год + 100 Гб за 1500 рублей, кроме этого 15 Гб выдается бесплатно.

Еще одним преимуществом такого резервного копирования является то, что мы будем использовать токен вместо имени и пароля. Если бы мы просто копировали данные по фтп то пришлось бы указать имя и пароль пользователя в открытом виде, что не есть гуд.

Создание скрипта для бекапа сайта и базы на Yadndex.Disk

Спланируем нашу работу на несколько частей:

  • Подготовим токен и приложение на Яндексе
  • Подготовим скрипт архивации
  • Пропишем скрипт в Cron

Получаем token

Начнем с того что залогинимся в Яндекс под своим аккаунтом на котором у нас есть яндекс диск. Для доступа к Яндекс Диску можно пройти по ссылке disk.yandex.ru

Если Вы увидели что то на подобии этого… то все в порядке

Яндекс.Диск
Яндекс.Диск

Теперь давайте зарегистрируем новое приложение, которое будет иметь доступ к папке на нашем Яндекс Диске. Для этого переходим по ссылке https://oauth.yandex.ru/ и регистрируем новое приложение как показано на следующих скриншотах.

Регистрируем приложение
Регистрируем приложение
Настройки приложения
Настройки приложения

Мы ставим галочку только на против «Доступ к папке приложения на диске», это означает, что приложение будет иметь доступ только к одной единственной папке. Эта папка на Яндекс.Диске называется Приложения — Название приложение, то есть если Ваше приложение называется backup то доступная для приложения папка будет в Приложения-backup. Кроме этой папки наше приложение не сможет никуда ничего записывать, однако для пользователя эта папка будет доступна как и остальные. Надеюсь объяснил доступно.

Чуть ниже на странице нажимаем на ссылке «Подставить URL для разработки» и жмем сохранить.

Подставить URL для разработки
Подставить URL для разработки

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

Данные приложения
Данные приложения

Не спешите закрывать это окно, ID приложения нам сейчас понадобится. Кому интересно о получении токена для веб-приложения можно почитать тут, а все остальные переходят по ссылке https://oauth.yandex.ru/authorize?response_type=token&client_id= и вписывают ID недавно полученного приложения, в параметр client_id.

Получаем token доступа
Получаем token доступа

В ответ Яндекс должен запросить доступ для приложения (нажимаем разрешить) и выдать нам токен веб-приложения, который мы сможем использовать для доступа к нашему Яндекс.Диску

Запрос доступа для приложения
Запрос доступа для приложения
Токен доступа для приложения
Токен доступа для приложения

Данный токен выдается не менее чем на год, в крайнем случае если скрипт перестанет работать мы можем просто получить новый токен и вписать его в скрипт. Протестировать свой токен можно на полигоне, вот ссылка: https://tech.yandex.ru/disk/poligon/, там достаточно вставить свой токен и понажимать кнопки для проверки работоспособности токена.

Пишем скрипт ya-backup.sh для создания архива и отправки его на Yandex Disk

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

Запуск скрипта

Вы можете разместить скрипт в любой папке на сервер и запускать его вручную или повесить на Cron. Но для начала сделайте файл запускаемым. К примеру файл у вас лежит в /usr/bin/ тогда сделать его запускаемым можно с помощью команды:

Для того чтобы повесить скрипт на автоматическое выполнение в определенное время Вам нужно будет изучить формат файла конфигурации крона. Для того что бы скрипт выполнялся в час ночи каждый день выполняем команду:

и вписываем в конец файла следующую строку:

где ya-backup.sh — это Ваш скрипт. После выполнения скрипта в папке приложения на яндекс диске должны появится ваши архивы.
Всем спасибо, все свободны, комментируйте, пинайте.

27 КОММЕНТАРИИ

  1. Это все конечно интересно и крайне познавательно, но вот я ищу способ очистки корзины Яндекс Диска, без использования веб интерфейса. На полигоне API Диска ( ссылка на полигон — https://tech.yandex.ru/disk/poligon/#!//v1/disk/trash/resources/ClearTrash ) описан способ, но как его реализовать в виде простого PHP или Bash скрипта, что то не догоняю…

    Я был бы крайне признателен, за рабочий пример такого скрипта.

  2. Спасибо за скрипт!
    Бекап ушел на яндекс и файлы с фтп удалились а папки приложений на яндекс так и нет оО

  3. При выполнении скрипта, начиная с 54 строки ошибки вида:
    $: syntax error near unexpected token ;&'
    $:
    ] && output=${BASH_REMATCH[2]}’

    Что я могу делать не так?

  4. Скрипт не работает, при запуске:
    строка 56: ошибка синтаксиса около неожиданной лексемы ;&'
    строка 56:
    echo « File $BACKUP: $1» >> $BACKUP/$LOGFILE’

  5. Спасибо за познавательную и полезную информацию. А будет ли работать с двухфакторной авторизацией? Хотелось бы повысить безопасность данных!

  6. Подскажите, не получается сделать бекап mysql. У меня сайт на хостинге, рута нет. Есть Имя базы, Пользователь базы, пароль пользователя базы( ‘username»password»database’) В скрипте вписывается только пользователь и пароль бд, а куда вписать саму базу данных?

    • Скрипт архивирует все базы к которым есть доступ у данного пользователя. Конкретная база в скрипте не указывается. Скрипт сначала выбирает все базы которые есть на сервере и потом выгружает их по очереди в папку, затем архивирует эту папку.

  7. Экспериментальным путем выяснил, что проблема была в символах из пароля. В пароле к базе данных присутствовали знаки ( */| вперемешку с буквами и цифрами. Сменил пароль в котором только буквы и цифры, все, база данных сразу бекапнулась и оказалась на яндекс диске). Спасибо огромное за скрипт, сколько перепробывал скриптов, ваш самый понятный, безопасный с моей точки зрения, и главное работоспособный)))

  8. sh /usr/bin/backup.sh
    /usr/bin/backup.sh: 36: /usr/bin/backup.sh: Syntax error: «(» В чём ошибка при проверке скрипта выдает мне? @Debian-82-jessie-64-LAMP

    Помогите пожалуйста!!! Делал все по инструкций.

    • Ну наверное стоит глянуть в строке 36 что там не так :) скобочка похоже у Вас не закрыта, может скопировалось как нибудь коряво.

          • Смотрел.
            так и не понял, где не хватает скобки.
            function mailing()
            {
            #Function’s arguments:
            # $1 — email subject
            # $2 — email body
            if ;then
            if [ «$mailLogErrorOnly» == true ];
            then
            if echo «$1» | grep -q ‘error’
            then
            echo «$2» | mail -s «$1» $mailLog > /dev/null
            fi
            else
            echo «$2» | mail -s «$1» $mailLog > /dev/null
            fi
            fi
            }

        • В вашем коде ошибки, сравните с тем что у меня на сайте в данном посте, двойные кавычки в частности корявые, да и вообще код какой то не полный. Вот тут: $mailLog

  9. Подскажите пж. по механизму REST API — правильно ли я понимаю, что самому нельзя сгенерировать прямую ссылку на скачивание публичного файла, а можно получить ее только в виде ответа от URL cloud-api.yandex.net:443…? Т.е. могу ли я обойтись без этого предварительного запроса зная публичный URL файла?

    • Насколько я понимаю механизм работы, то публичный урл — это урл на страницу на которой есть еще какая то ссылка для скачивания, если я правильно вас понял.

      • Как я понял из документации REST API Яндекса диска и тестов в их полигоне, то что бы скачать файл с диска делая это например в JS на клиенте и зная публичную ссылку на него нужно сначала запросить у Яндекс диска прямой URL на скачку. Получается нужно делать два запроса в js 1й сначала получить прямой URL, а только затем уже по нему получить сам файл. Я просто подумал что может можно как то сразу прямой URL самому собрать без запроса к Яндекс диску, если он основан на алгоритме каком то, может есть готовые функции.

  10. Спасибо за скрипт. На никру работает.
    А вот на другом хостинге при запуске скрипта в консоли выводится вот такое сообщение WARNING:root:could not open file ‘/etc/apt/sources.list’

    Что не так и куда копать?
    Спасибо!

  11. А почему файлы могут не появляться в Я.диске?
    По логу всё получается отрабатывает.
    во время работы скрипта вижу создаваемые архивые файлов и БД, потом они удаляются. А на Я.Диске не появляются.
    Что может быть?
    Спасибо!

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here