Shell скрипт бекапа сайта по WebDAV с использованием REST API


Скрипт хорошо документирован, что не составит труда изменить его под свои нужды.

Что умеет скрипт:
  • Создавать на сервере резервные копии:
    • — Файлов
    • — Баз данных
  • Безопасно авторизовываться по OAuth-токену.
  • Шифровать файлы бекапов с помощью GnuPG (Асимметричное шифрование).
  • Сохранять резервные копии на Яндекс диск.

Для его роботы необходимо oauth приложение и токен.
— зарегистрировать можно тут
— выставляем права в Яндекс.Диск REST API на Доступ к информации о Диске и Доступ к папке приложения на Диске
— в Callback URL «подставляем URL для разработки» и нажимаем сохранить
— подставляем наш id в oauth.yandex.ru/authorize?response_type=token&client_id= и подтверждаем разрешения
— после подстановки получаем токен, он выдается на 1 год

.sh
#!/bin/bash
#
#Переменные Базы данных
DBHOST="localhost" #Адрес MySQL сервера
DBUSER="user_db" #Имя пользователя базы данных
DBPASS="pass_db" #Пароль пользователя базы данных
DBNAME="name" #Имя базы данных
DBARC=$DBNAME.sql.gz #Имя архива базы данных
#
#Переменные сайта
SCRIPTDIR="/home/backup/" #Абсолютный путь откуда запускается скрипт и где храняться архивы
SCRDIR="/home/www/site.ru/" #Абсолютный путь к сайту от корня диска
SCREXCLUDE="tmp" #Что не попадет в архив
SCRARC="site.ru.tar.gz" #Имя архива файлов сайта
#
#Переменные Резерных копий
ARCNAME="site.ru"=$(date '+%F(%H:%M)')".tar" #Имя архивной копии сайта
ARCMAX="2" #Количество файлов в локальном хранилище
#
#Yandex.Disk TOKEN
TOKEN="TOKEN"
#
#Шифрование GnuPG
PGUSER="user"
PGOUT="site.ru"=$(date '+%F(%H:%M)')".tar.gpg"
#
#Переходим в корневую директорию вебсервера
cd $SCRDIR
#
#Создаем файловый архив со сжатием, учитываем исключения
tar cfz $SCRIPTDIR$SCRARC --exclude=$SCREXCLUDE *
#
#Возвращаемся в папку со скриптом, где лежат все архивы
cd $SCRIPTDIR
#
#Архивируем базу данных со сжатием
mysqldump -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME | gzip > $DBARC
#
#Объединяем файловый архив и дамп базы данных, теперь уже без сжатия
tar cf $SCRIPTDIR$ARCNAME $SCRARC $DBARC
#
#Шифруем файл с помощью GnuPG, асимметричное шифрование
gpg -e -r $PGUSER $ARCNAME
#
#Убираем промежуточные архивы
rm *.gz *.tar
#
#Удаляем старые копии сайта, оставляем несколько свежих копий
ls -t *.gpg | tail -n+$ARCMAX | xargs rm -f
#
#Парсер
function parseJson()
{
    local output
    regex="(\"$1\":[\"]?)([^\",\}]+)([\"]?)"
    [[ $2 =~ $regex ]] && output=${BASH_REMATCH[2]}
    echo $output
}
#
#Получаем урл для загрузки
function getUploadUrl()
{
    json_out=`curl -s -H "Authorization: OAuth $TOKEN" https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/${PGOUT}&overwrite=true`
    output=$(parseJson 'href' $json_out)
    echo $output
}
#
#Задаем функцию для загрузки файлов по полученному урлу
function uploadFile
{
    local json_out
    local uploadUrl
    uploadUrl=$(getUploadUrl)
    json_out=`curl -s -T $1 -H "Authorization: OAuth $TOKEN" $uploadUrl`
}
#
#Загружаем архив бекапа
uploadFile $SCRIPTDIR/$ARCNAME

GnuPG — Генерируем пару ключей:
При генерации, задаем наше имя, оно будет использоваться в переменной PGUSER.
# gpg --gen-key

Делаем скрипт исполняемым:
# chmod +x backup.sh

Добавляем скрипт в Crontab:
# crontab -e
 - самый простой вариант
@weekly /home/backup/backup.sh

UPD:
— Обновление
— Добавлено GPG шифрование [20.05.17]

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

avatar
+1 Давно ждал!))
avatar
спасибо буду тестить
комментарий был удален
avatar
По крайне мере, базу данных нужно защищать более надежно. Хотя бы, архивировать ZIP-ом с длинным паролем. Там же персональные данные ваших пользователей, уверены что админы Яндекса не иммеют доступа к этим файлам? :)

Дальше, y нас, например, полный бакап сайта сейчас — 10GB. Если каждый день такое пулять никакого места не хватит. будетет за бекапы больше чем за зхочтинкг платить, потому что хранить надо сосотояние хотябы за пару недель. Нужны инкрементальные бекапы. Чего досттаочно легко сделать по картинкам, которые и жрут основное место.

Ну и Яндекс.Диск, похоже, далеко не самый дешовый вариант. Если много зранить.
avatar
Кстати на Яндекс Диске сейчас можно 32 гб получить, нужно приложение установить и залить пару фоток
avatar
Да, в свое время воспользовался )) Сейчас 45Гб, не много конечно… У некоторых +200GB
avatar
Вот список довольно неплохих программ и их форков =)
Поддержка полных и инкрементальных бекапов. Aes и gpg шифрования.
— Backup-Manager
— Duplicaty
— duplicati
— dejadup
— Rsync
— luckybackup
avatar
Прошлая версия скрипта сломалась… Обновил
avatar
Сюда по коду скрипт универсальный и можно применять к любому сайту. Ведь так?
Какие минусы у данного решения, если не брать в расчёт Yandex Disk?
avatar
Так. Зависит от ваших потребностей =)
avatar
Добавил в скрипт ассиметричное PGP шифрование, т.е. шифрование по ключу =) GnuPG | OpenNet
avatar
Шикарно
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.