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 комментариев
Дальше, y нас, например, полный бакап сайта сейчас — 10GB. Если каждый день такое пулять никакого места не хватит. будетет за бекапы больше чем за зхочтинкг платить, потому что хранить надо сосотояние хотябы за пару недель. Нужны инкрементальные бекапы. Чего досттаочно легко сделать по картинкам, которые и жрут основное место.
Ну и Яндекс.Диск, похоже, далеко не самый дешовый вариант. Если много зранить.
Поддержка полных и инкрементальных бекапов. Aes и gpg шифрования.
— Backup-Manager
— Duplicaty
— duplicati
— dejadup
— Rsync
— luckybackup
Какие минусы у данного решения, если не брать в расчёт Yandex Disk?