• Уважаемый посетитель! Рады приветствовать тебя на обновленном форуме. Большая часть рекламы(90%) видна только гостям. После регистрации она убирается. Спасибо за внимание.

Инструкция Автоматический бекап сайта на Яндекс.Диск

akhomlyuk

/etc/shadow
Сообщения
229
Симпатии
47
#1
В данной инструкции я расскажу как настроить автоматическое создание резервных копий вашего сайта (файлы + база данных) с последующей отправкой их на Яндекс.Диск.
Для этого нам понадобится создать скрипт.
Код скрипта ниже.
Чтобы скрипт заработал, нам необходимо зарегистрировать наше новое приложение по адресу: https://oauth.yandex.ru/

yd-1.png

Выдаем права "Доступ к информации о Диске" и "Доступ к папке приложения на Диске"

ya.png

Выставляем "Callback URL"

ya2.png
Сохраняем и получаем данные нашего приложения. Нас интересует ID.

ya3.png
Осталось самое главное, получаем токен, для этого в ссылке в самом конце вводим ID приложения из скриншота выше
и переходим по адресу https://oauth.yandex.ru/authorize?response_type=token&client_id=тут_вводим_ID
Посреди страницы будет длинный набор символов (например, AQAFFAAeQV5FAARKLDC61izdM0cBotCeDTFN8Ko) это и есть наш токен.

Bash:
#!/bin/bash

# Сервер БД
MYSQL_SERVER=localhost

# Пользователь БД, под которым будем делать бекап доступных баз, руту mysql обычно доступны все БД, отдельному пользователю обычно доступна БД конкретного проекта
MYSQL_USER=db_user

# Пароль пользователя базы данных (Пароль от рута сервера и от рута mysql разные не путайте)
MYSQL_PASSWORD=vash_parol

# # # # # # # # # # ОБЩИЕ НАСТРОЙКИ # # # # # # # # # #
# Директория для временного хранения бекапов, которые удаляются после отправки на Яндекс.Диск
BACKUP_DIR='/home/user/backup'

# Название проекта, используется в логах и именах архивов
PROJECT='vash_site.ru'

# Максимальное количество хранимых на Яндекс.Диске бекапов (0 - хранить все бекапы):
MAX_BACKUPS='0'

# Дата, используется в именах архивов
DATE=`date '+%Y-%m-%d'`

# Директории для архивации (указываются через пробел), которые будут помещены в единый архив и отправлены на Яндекс.Диск
DIRS='/home/user/vash_site/public_html'

# Yandex.Disk токен, указываем свой
TOKEN='AQAFFAAeQV5FAARKLDC61izdM0cBotCeDTFN8Ko'

# Имя лог-файла, хранится в директории, указанной в $BACKUP_DIR
LOGFILE='site.ru.log'

# E-mail для отправки результата выполнения скрипта. Оставьте пустым, если отправлять результаты не требуется.
sendLog='mail@site.ru'

# Отправлять только ошибки (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 "Завершение скрипта"
 
Последнее редактирование:

akhomlyuk

/etc/shadow
Сообщения
229
Симпатии
47
#3
Так а скрипт в задание крона надо добавлять?
Ну если хочется по расписанию, то надо :)
Например так - [INLINE]0 4 * * * /opt/backups/myopenweb.ru/backup_myopenweb.ru.sh > /var/log/myopenweb.ru.log[/INLINE]
 

Begemot

Сообщения
33
Симпатии
5
#4
Странно. На ЯД был бэкап датированный вчерашним числом (запускал скрипт вручную), сегодня, при ручном бэкапе мне пишет: DiskResourceAlreadyExistsError - файл с названием уже существует. Но ведь уже 3 число.

Задание настроил, посмотрим.
 

akhomlyuk

/etc/shadow
Сообщения
229
Симпатии
47
#5
Странно. На ЯД был бэкап датированный вчерашним числом (запускал скрипт вручную), сегодня, при ручном бэкапе мне пишет: DiskResourceAlreadyExistsError - файл с названием уже существует. Но ведь уже 3 число.

Задание настроил, посмотрим.
Ну там со временем "косяк", уже разобрались ))
 

TRAFF

Сообщения
1
Симпатии
0
#6
Сори! А какой именно сайт , точнее на каком движке можно делать бекап..на XENFORO можно?
 

Begemot

Сообщения
33
Симпатии
5
#8
TRAFF, скрипт бэкапит-то директорию и базу, а не движок. По сути, можно вообще весь сервак забэкапить.
 

dreemix

Сообщения
6
Симпатии
0
#9
Какие права нужно поставить на файл, чтобы никто со стороны не залез и не отредактировал его? Насколько безопасно хранить в нем пароли - файл запросто читается в браузере и может быть даже проиндексирован ботом.
 

Begemot

Сообщения
33
Симпатии
5
#10
dreemix, в файле не хранятся пароли, а если посмотрите видео, то узнаете и про права на скрипт:

Bash:
chmod +x скрипт_бэкапа[code]

что соответствует 755. Разрешение на выполнение скрипта.

[QUOTE="dreemix, post: 956, member: 443"]файл запросто читается в браузере и может быть даже проиндексирован ботом.[/QUOTE]

Чего, серьезно??? Куда же вы его запихнули, в корень сайта? :D
 

dreemix

Сообщения
6
Симпатии
0
#11
Я просто ооочень далек от сис.администрирования. Запускаю из /var/www/admin/www/sitename.com.ua/

Но по идее, если тскрипт выполняется, то все же дело не в правах на файл?
 

Begemot

Сообщения
33
Симпатии
5
#12
+x - это разрешение на выполнение. Вы вообще можете создать длинную цепочку каталогов, с непонятными именами и запускать скрипт оттуда.
 

dreemix

Сообщения
6
Симпатии
0
#13
Копии теперь есть, но они на том же сервере, где и сайты. Может, у кого-то в закладках есть скрипт по переносу директории по ftp?
 

dreemix

Сообщения
6
Симпатии
0
#15
Я могу: настроить контекст, создать магаз, продвинуть сайт, что-то несложное сверстать, но еще и сервера администрировать - я тогда просто есть и пить перестану. Сильно много всего знать приходится.
 

Begemot

Сообщения
33
Симпатии
5
#16
Ну да, так сложно сделать по готовому ману, что на "есть-пить" времени не останется :)
 

dreemix

Сообщения
6
Симпатии
0
#17
Ну да, так сложно сделать по готовому ману, что на "есть-пить" времени не останется :)
сделать не сложно. Скрипт взят отсюда и если вы прочитаете комментарии, то там также у некоторых проблемы, очевидно из-за того, что используются одинарные кавычки.
Железо и софт разные - конфликты всегда могут быть.
 

akhomlyuk

/etc/shadow
Сообщения
229
Симпатии
47
#18
Истина где то рядом, говорю же, на 5-6 серверов ставил, проблем не было. Видео ролик даже записал, там все пошагово и в конце бекапы появляются. В чем сложность внимательно все посмотреть и один раз правильно настроить.
Никаких склеек при монтаже видео я не использовал. Никакой магии :(
 

Loner

Сообщения
1
Симпатии
0
#20
Добрый день, не подскажете с двойной аутентификацией на яндексе , будет ли работать данный скрипт?