Статьи

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

Викладати бекапи проектів (сайтів) на Яндекс.Діск може знадобитися з кількох причин, наприклад, через брак місця на сервері (хостингу, 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?

Новости

Как создать фото из видео
Кризис заставляет искать дополнительные источники дохода. Одним из таких источников может стать торговля на валютном рынке Форекс. Но чтобы не потерять свои деньги необходимо работать с надежным брокером.

Как оформить группу в вконтакте видео
Дано хотел свой магазин в вк, но не знал с чего начать его делать. Так как хотелось не банальный магазин с кучей ссылок и фото, а красиво оформленный. С меню, с аватаркой. После просмотра видео создал

Как оформить диск малыш от рождения до года из фото и видео
Оформить диск "Малыш от рождения до года" из фото и видео можно совершенно разными способами! Кто-то для достижения данной цели идет на шоу-таланты, кто-то пользуется услугами профессионалов, а кто-то