Статьи

Скрипт бекапу на Яндекс.Діск

Викладати бекапи проектів (сайтів) на Яндекс.Діск може знадобитися з кількох причин, наприклад, через брак місця на сервері (хостингу, VDS, VPS) або для підвищення безпеки зберігання бекапів (на випадок, якщо сервер без рейду і він вийде з ладу).

У зв'язку з цим я написав для себе і вирішив викласти для інших невеликої bash-скрипт для бекапу на Яндекс.Діск. Функції скрипта:
- Створення на сервері бекапу проектів (файлів + баз даних MySQL);
- Авторизація на Яндекс.Діск як додаток (по токені, більш безпечний спосіб, ніж використання логіна і пароля);
- Відправлення бекапів з сервера на Яндекс.Діск;
- Видалення старих бекапів з Яндекс.Діск для економії місця (налаштовується максимальну кількість збережених бекапів);
- Запис і відправка балки на e-mail (налаштовується).

Для того, щоб скористатися скриптом, необхідно спочатку отримати токен від Яндекс.Діск. Приступимо.

1. логін на Яндексі під аккаунтом, на диск якого будемо робити бекап, заходимо на oauth.yandex.ru і натискаємо «Зареєструвати новий додаток».

2. Заповнюємо назву програми (наприклад, «backup») і видаємо потрібні права в розділі «Яндекс.Діск REST API», а саме: «Доступ до інформації про Диску» і «Доступ до теки програми на Диску».

Нижче на тій же сторінці під полем «Callback URL» натискаємо «підставити URL для розробки» і натискаємо «Зберегти»:

3. Після збереження параметрів програми нас перенаправляють на сторінку з даними про програму:

4. Тепер отримаємо сам токен (якщо хочете, можете почитати докладніше про це в мануале Яндекса ), Для цього копіюємо ID, підставляємо в кінець URL ru/authorize?response_type=token&client_id=> https://oauth.yandex.ru/authorize?response_type=token&client_id= , Переходимо з що вийшло адресою і підтверджуємо видачу дозволів з додатком:

У підсумку на сторінці буде відображений токен, який видається не менше, ніж на 1 рік, тому якщо скрипт бекапа раптом перестане працювати, ми зможемо отримати новий токет і підставити його в скрипт. Протестувати можливості роботи з Яндекс.Діск, використовуючи отриманий токен, можна на спеціальному полігоні .

А тепер сам bash-скрипт для бекапу на Яндекс.Діск:

#! / Bin / bash # # Yandex.Disk backup script v1.0 by Sergey Lukonin (neblog.info) # # # # # # # # # # # НАЛАШТУВАННЯ бекап MYSQL # # # # # # # # # # # Сервер БД MYSQL_SERVER = mysql.some-server.ru # Юзер, під яким будемо робити бекап доступних баз, руту mysql зазвичай доступні всі БД, окремому користувачеві зазвичай доступна БД конкретного проекту MYSQL_USER = some-user # Пароль користувача бази даних (Пароль від рута сервера і від рута mysql різні не плутайте) MYSQL_PASSWORD = some-password # # # # # # # # # # ЗАГАЛЬНІ НАЛАШТУВАННЯ # # # # # # # # # # # Директорія для тимчасового зберігання бекапів, які видаляються після відправки на Яндекс.Діск BACKUP_DIR = '/ home / www / backup' # Назва проек та, використовується в логах і іменах архівів PROJECT = 'neblog.info' # Максимальна кількість збережених на Яндекс.Діск бекапів (0 - зберігати все бекапи): MAX_BACKUPS = '14 '# Дата, використовується в іменах архівів DATE = `date' + % Y-% m-% d' '# Директорії для архівації (вказуються через пробіл), які будуть поміщені в єдиний архів і відправлені на Яндекс.Діск DIRS =' / home / www / projects / neblog '# Yandex.Disk токен ( як отримати - см. на neblog.info) TOKEN = '' # Ім'я лог-файлу, зберігається в директорії, зазначеної в $ BACKUP_DIR LOGFILE = 'backup.log' # E-mail для відправки результату виконання скрипта. Залиште порожнім, якщо відправляти результати не потрібно. sendLog='[email protected] '# Відправляти тільки помилки (true). Вкажіть false, якщо потрібно відправляти логи при будь-якому результаті виконання скрипта. sendLogErrorsOnly = 'false' # # # # # # # # # # КІНЕЦЬ НАСТРОЕК # # # # # # # # # # # # # # # # # # # # # ДАЛІ НІЧОГО НЕ МІНЯЄМО! # # # # # # # # # # Function mailing () {if [! $ SendLog = '']; then if [ "$ sendLogErrorsOnly" == true]; then if echo "$ 1" | grep -q 'error' then echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi else echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi fi} function logger () {echo "[" `date" +% Y-% m-% d% H:% M:% S "` "] File $ BACKUP_DIR: $ 1 ">> $ BACKUP_DIR / $ LOGFILE} function parseJson () {local output regex =" (\ "$ 1 \": [\ "]?) ([^ \", \}] +) ([\ "]?)" [[$ 2 = ~ $ regex]] && output = $ {BASH_REMATCH [2]} echo $ output} function checkError () {echo $ (parseJson 'error' "$ 1")} function getUploadUrl () { json_out = `curl -s -H" Authorization: OAuth $ TOKEN "https: //cloud-api.yandex.net: 443 / v1 / disk / resources / upload /? path = app: / $ backupName & overwrite = true` json_error = $ (checkError "$ json_out") if [[$ json_error! = '']]; then logger "$ PROJECT - Yandex.Disk error: $ json_error" mailing "$ PROJECT - Yandex.Disk backup error" "ERROR copy file $ FILENAME. Yandex.Disk error: $ json_error "echo '' else output = $ (parseJson 'href' $ json_out) echo $ output fi} function uploadFile {local json_out local uploadUrl local json_error uploadUrl = $ (getUploadUrl) if [[$ uploadUrl! = '']]; then echo $ UploadUrl json_out = `curl -s -T $ 1 -H" Authorization: OAuth $ TOKEN "$ uploadUrl` json_error = $ (checkError" $ json_out ") if [[$ json_error! = ''] ]; then logger "$ PROJECT - Yandex.Disk error: $ json_error" mailing "$ PROJECT - Yandex.Disk backup error" "ERROR copy file $ FILENAME. Yandex.Disk error: $ json_error "else logger" $ PROJECT - Copying file to Yandex.Disk success "mailing" $ PROJECT - Yandex.Disk backup success "" SUCCESS copy file $ FILENAME "fi else echo 'Some errors occured. Check log file for detail 'fi} function backups_list () {# Шукаємо в директорії додатку всі файли бекапів і виводимо їх назви: curl -s -H "Authorization: OAuth $ TOKEN" "https://cloud-api.yandex.net:443 / v1 / disk / resources? path = app: / & sort = created & limit = 100 "| tr" {}, [] "" \ n "| grep" name [[: graph:]] *. tar.gz "| cut -d: -f 2 | tr -d ' "'} function backups_count () {local bkps = $ (backups_list | wc -l) # Якщо ми бекап і файли, і БД, то на 1 бекап у нас припадає 2 файли. Тому кількість бекапів = кількість файлів / 2: expr $ bkps / 2} function remove_old_backups () {bkps = $ (backups_count) old_bkps = $ ((bkps - MAX_BACKUPS)) if [ "$ old_bkps" -gt "0"]; then logger "Видаляємо старі бекапи з Яндекс.Діск" # Цикл видалення старих бекапів: # Виконуємо видалення першого в списку файлу 2 * old_bkps раз for i in `eval echo {1 .. $ ((old_bkps * 2))}`; do curl -X DELETE -s -H "Authorization: OAuth $ TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk '(NR == 1) ') & permanently = true "done fi} logger" --- $ PROJECT START BACKUP $ DATE --- "logger" Вивантажуємо дампи баз "mkdir $ BACKUP_DIR / $ DATE for i in` mysql -h $ MYSQL_SERVER - u $ MYSQL_USER -p $ MYSQL_PASSWORD -e'show databases; ' | grep -v information_schema | grep -v Database`; do mysqldump -h $ MYSQL_SERVER -u $ MYSQL_USER -p $ MYSQL_PASSWORD $ i> $ BACKUP_DIR / $ DATE / $ i.sql; done logger "Створюємо архів mysql $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz" tar -czf $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz $ BACKUP_DIR / $ DATE rm -rf $ BACKUP_DIR / $ DATE logger "Створюємо архів каталогів $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz" tar -czf $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz $ DIRS FILENAME = $ DATE-mysql- $ PROJECT. tar.gz logger "Вивантажуємо на Яндекс.Діск архів mysql $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz" backupName = $ DATE-mysql- $ PROJECT.tar.gz uploadFile $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz FILENAME = $ DATE-files- $ PROJECT.tar.gz logger "Вивантажуємо на Яндекс.Діск архів з файлами $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz" backupName = $ DATE-files- $ PROJECT.tar.gz uploadFile $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz logger "Видаляємо архіви з диска" find $ BACKUP_DIR -type f -name "* .gz" -exec rm '{}' \; # Видаляємо старі бекапи з Яндекс.Діск (якщо MAX_BACKUPS> 0) if [$ MAX_BACKUPS -gt 0]; then remove_old_backups; fi logger "Завершення скрипта бекапу"

Також ви можете скачати готовий файл скрипта . Скрипт слід розташувати на сервері, замінити в ньому параметри на свої, дати права на запуск (chmod + x) і поставити на щоденне виконання в cron. Якщо ви плануєте виконувати кілька таких завдань, задайте час між їх запуском (5-10 хвилин).

PS Архіви можна створювати з шифруванням, см. коментар від Walkman .

Ru/authorize?
Quot;$ 1 \": [\ "]?
Quot;]?
Net: 443 / v1 / disk / resources / upload /?
Net:443 / v1 / disk / resources?
Net:443/v1/disk/resources?

Новости