mirror of
https://github.com/Yaslonane/backup_to_yandex.disk.git
synced 2026-05-19 09:47:58 +03:00
add script and config
This commit is contained in:
@@ -1 +1,176 @@
|
||||
echo "my first script for backup";
|
||||
#!/bin/bash
|
||||
#
|
||||
# Yandex.Disk backup script v1.0 by Sergey Lukonin (neblog.info)
|
||||
#
|
||||
# # # # # # # # # # НАСТРОЙКИ БЕКАПА MYSQL # # # # # # # # # #
|
||||
|
||||
# Сервер БД
|
||||
MYSQL_SERVER=$(awk -F "=" '/server_db/ {print $2}' config.notgit)
|
||||
|
||||
# Юзер, под которым будем делать бекап доступных баз, руту mysql обычно доступны все БД, отдельному пользователю обычно доступна БД конкретного проекта
|
||||
MYSQL_USER=$(awk -F "=" '/user_db/ {print $2}' config.notgit)
|
||||
|
||||
# Пароль пользователя базы данных (Пароль от рута сервера и от рута mysql разные не путайте)
|
||||
MYSQL_PASSWORD=$(awk -F "=" '/password_db/ {print $2}' config.notgit)
|
||||
|
||||
# # # # # # # # # # ОБЩИЕ НАСТРОЙКИ # # # # # # # # # #
|
||||
|
||||
# Директория для временного хранения бекапов, которые удаляются после отправки на Яндекс.Диск
|
||||
BACKUP_DIR=$(awk -F "=" '/dir_temp/ {print $2}' config.notgit)
|
||||
|
||||
# Название проекта, используется в логах и именах архивов
|
||||
PROJECT='backup'
|
||||
|
||||
# Максимальное количество хранимых на Яндекс.Диске бекапов (0 - хранить все бекапы):
|
||||
MAX_BACKUPS=$(awk -F "=" '/max_backup/ {print $2}' config.notgit)
|
||||
|
||||
# Дата, используется в именах архивов
|
||||
DATE=`date '+%Y-%m-%d'`
|
||||
|
||||
# Директории для архивации (указываются через пробел), которые будут помещены в единый архив и отправлены на Яндекс.Диск
|
||||
DIRS=$(awk -F "=" '/dir_for_backup/ {print $2}' config.notgit)
|
||||
|
||||
# Yandex.Disk токен (как получить - см. на neblog.info)
|
||||
TOKEN=$(awk -F "=" '/kye_yandex.disk/ {print $2}' config.notgit)
|
||||
|
||||
# Имя лог-файла, хранится в директории, указанной в $BACKUP_DIR
|
||||
LOGFILE='backup.log'
|
||||
|
||||
# E-mail для отправки результата выполнения скрипта. Оставьте пустым, если отправлять результаты не требуется.
|
||||
sendLog=$(awk -F "=" '/admin_email/ {print $2}' config.notgit)
|
||||
|
||||
# Отправлять только ошибки (true). Укажите false, если нужно отправлять логи при любом результате выполнения скрипта.
|
||||
sendLogErrorsOnly='false'
|
||||
|
||||
# # # # # # # # # # КОНЕЦ НАСТРОЕК # # # # # # # # # # # # #
|
||||
# # # # # # # # ДАЛЬШЕ НИЧЕГО НЕ МЕНЯЕМ! # # # # # # # # # #
|
||||
echo $MYSQL_SERVER;
|
||||
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 "Завершение скрипта бекапа"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user