Резервное копирование сайта на яндекс диск.
Backup на ya.disk

Админы делятся на тех кто не делает бэкапы, и тех кто уже делает. В моей практике только однажды был неприятный момент с фатальной потерей данных, когда хостинг, где лежал sawtech полег, и часть данных потерялась, в том числе и штатные бэкапы. Их конечно восстановили, но не очень свежие. Я давно знаю, что хранить резервные копии там же откуда их снимают - плохая идея, но в тот раз я прочувствовал всю боль. Поэтому стараюсь критичные вещи, например x-waters, бэкапить куда-то на сторону, например ya.disk, место 50Гб, скорость норм. И сейчас я ребе расскажу как провернуть такой же фокус.

Я буду рассматривать вариант, что у тебя вообще голая архитектура, т.е. минимально необходимые пакеты, чтобы осуществить задуманное:

  • Нужен сервер с bash
  • Там должен быть установлен zip архиватор (Опционально)
  • У тебя должен быть аккаунт на яндекс диске (Если дофига умный, можешь своё хранилище прикрутить)

Всё остальное я расскажу в процессе. Поехали ;)

Снимаем дампы баз данных и архивируем всё необходимое

Я не буду долго ходить вокруг да около, сразу дам скрипт, который делает дампы баз и zip’ует файлики в один архив пригодный для простых манипуляций

Допустим, назовем его backup.sh

#!/bin/bash

# назание сервера, чтобы потом без проблем отличать что и откуда
SERVER_NAME='MyOwnServer'

# Папка, котрую архивируем
ARCHIVATE_PATH='/path/to/your/sites'

# Папка, куда архивируем
ARCHIVATE_TO='/path/to/move/backups'

# проверим на ARCHIVATE_TO папку для дампов
if  [ ! -d $ARCHIVATE_TO ]; then
    mkdir $ARCHIVATE_TO
fi

# Куда сохраним дампы БД
DIR_DUMP_TO="$ARCHIVATE_PATH/db-backup"

# проверим на существование папку для дампов
if  [ ! -d $DIR_DUMP_TO ]; then
    mkdir $DIR_DUMP_TO
fi

# параметры соединения с БД
MYSQL_USER=user
MYSQL_PASS=pass

# Какие БД не нужны
NOT_NEED='Database information_schema mysql performance_schema phpmyadmin sys'

# Список доступных БД
DBS=$(echo "SHOW DATABASES;" | mysql -u$MYSQL_USER -p$MYSQL_PASS)
 
# Сбор дампов баз данных
for db_itm in $DBS; do 
	if [[ -z $(echo $NOT_NEED | grep $db_itm) ]]; then
		mysqldump -u$MYSQL_USER -p$MYSQL_USER $db_itm > "$DIR_DUMP_TO/$db_itm.sql" 2>&1
	fi
done

# текущая дата
NOW=`date +%Y-%m-%d`

# Запакуем в темпах и перенесем в нужную папку
zip -r "/tmp/$SERVER_NAME-$NOW.zip" $ARCHIVATE_PATH > /dev/null 2>&1
mv "/tmp/$SERVER_NAME-$NOW.zip" "$ARCHIVATE_TO/$SERVER_NAME-$NOW.zip"

rm -f $(echo $DIR_DUMP_TO/"*.sql")

echo 'backup done!'

Самое главное правило любых туториалов помнишь? Не занимайся тупым копированием! Внимательно почитай каждую строку, лишнее удали, своё добавь. Чико?!

Работа с яндекс диском

Начнем с установки секретного пакета.

sudo add-apt-repository ppa:abbat/ydcmd
sudo apt update
sudo apt install ydcmd

Тут снова ничего не обычного. Добавляем репозиторий и устанавливаем пакет ydcmd. На github’е есть полное описание и развернутая документация, если интересно, конечно, можно ознакомится со всеми командами подробнее, утилита достаточно мощная. А можно следовать за мной, и я тебя научу магии.

Следи за руками и не отставай

1. Вводишь в терминальчике

ydcmd token

получим нечто вроде такого

Текст как бы намекает, что ссылку надо скопировать и вставить в твой браузер, не мой, не соседа Коли, а именно твой.

2. Открываешь ссылку и говоришь, что тебе нужно это разрешение.

Если он не соглашаешься грозишь ему своим батей!

После чего тебе дадут чудо код

3. который нужно отправить в качестве параметра в первой команде.

Вот так

Тут должна быть гифка с Шайлой Лабафом (Этот тот который трансформеры): MAGIC.gif

Теперь главное не потеряй свой токен, а то второй раз магия может уже и не сработать, это ж не какая-то там точная наука.

4. В домашней директории создаем файлик .ydcmd.cfg с содержимым

[ydcmd]
token   = YOUR-TOKEN
verbose = yes

Проверим свои настройки командочкой,

$ ydcmd stat
        name: disk
        exif: {}
     created: 2012-04-04T20:00:00+00:00
 resource_id: 34201238:ef6a30932fd6ae8839616799893752b565e9c05bf2cb5fd149bc4d7f41f6fc31
    modified: 2012-04-04T20:00:00+00:00
        path: disk:/
 comment_ids: {}
        type: dir
    revision: 1380260406154226

Если ответ не такой, или ты его не дождался, то сорян. Я тебе помогал как мог, пробуй начать заклинание с шага 1.

Ладно, всё это лирика. Теперь пара чудесных скриптов, и дело в шляпе.

Отправка файла бэкапа на яндекс диск

А вот если бы ты почитал документацию, то этого вопроса у тебя бы не возникло! Или ты почитал? А чего это ты такой умный тогда? Иди отсюда, мальчик.

ya.disc-send.sh

#!/bin/bash

BACKUP_DIR='/local/backup/path'
YADISC_DIR='disk:/path-in-ya.disk/'

# найти последний .zip файл в папке бэкапов
LAST_BACKUP=$(ls -t $BACKUP_DIR/.zip | head -1)

LAST_BACKUP_PATH=$BACKUP_DIR$LAST_BACKUP

if [ -z $LAST_BACKUP ]
then
    echo -e "Бэкапов для отправки на ya.disk не найдено\n"
    exit
fi


/usr/bin/ydcmd put $LAST_BACKUP_PATH $YADISC_DIR

rm -f $LAST_BACKUP_PATH

echo 'done!'

На этом, в принципе, можно и закрывать нашу лавочку. Но с бэкапами знаешь какое дело случается? Если их не чистить, то твои овер-дофига места быстро быстро подойдет к концу. Поэтому

Ротация бэкапов

Есть много всяких готовых и более совершенных, но я слишком стар для этого дерьма и быстрее руками было написать простенький скриптик

ya.disc-rotate.sh

#!/bin/bash
SERVER_NAME='MyOwnServer'
CONFIG_PATH='/home/you/.ydcmd.cfg'
YD_COMMAND='/usr/bin/ydcmd --config='$CONFIG_PATH
YADISC_DIR='disk:/path-in-ya.disk/'

LIST=$($YD_COMMAND ls $YADISC_DIR)
ARCHIVES=$(echo "$LIST" | sed -r 's/.*[[:space:]](.*\.zip).*$//g')

# текущая дата
now=$(date)

for itm in $ARCHIVES
do
    # пропустить архивы, которые не относятся к правильным
    if [[ $itm != $SERVER_NAME* ]]
    then
        echo -e "Это архив не того бэкапа $YADISC_DIR$itm\n"
        continue
    fi

    cr=$($YD_COMMAND stat $YADISC_DIR$itm | grep created)
    cr=$(echo "$cr" | sed -r 's/.*created:(.*$)//g')
    weekday=$(date -d $cr '+%u')
    
    # разница между датами в днях
    SDIFF=$((((`date -d "$now" '+%s'` - `date -d "$cr" '+%s'`))/((60*60*24))))

    # Старые архивы удаляем. Старше 28 дней
    if (($SDIFF > 28))
    then
        echo -e "Удаляем старый $YADISC_DIR$itm'\n"
        $YD_COMMAND rm $YADISC_DIR$itm
        continue
    fi

    # архивы понедельника не трогаем
    if [ "$weekday" -eq "1" ]
    then
        echo -e "Понедельничный архив не трогаем $YADISC_DIR$itm\n"
        continue
    fi
    
    # последние 3 дня оставляем
    if (($SDIFF < 3))
    then
        echo -e "Оставляем $YADISC_DIR$itm\n"
        continue
    fi

    echo -e "Удаляем остальное $YADISC_DIR$itm\n"
    $YD_COMMAND rm $YADISC_DIR$itm
done

echo 'done!'

Ты ведь достаточно внимательный и увидел, что переменная с именем сервера такая как в первом скрипте? Это чтобы четко и резко, а самое главное почти однозначно идентифицировать те архивы, которые правильные, а то вдруг ты, мой френд, фигачишь все архивы в одну папку? А я уже о тебе позаботился и на всякий случай защитился от подобной небрежности и ленивости.

Логика ротации такая: условия проверяются в порядке приоритета от более строгого правила к более мягкому: бэкапы старше 25 дней удаляются → бэкапы понедельника оставляются → за последние 3 дня оставляем → всё что не попало под вышеозвученные правила строго удаляем.

На выходе имеем бэкапы за 3 последних дня + 4 последних понедельника. Обычно этого более чем достаточно, если ты хотя бы иногда проверяешь работоспособность своего сайта.

Добавляем в крон

Чтобы не запускать всю эту ботву руками, нужно использовать планировщик, мы ведь достаточно крутые парни, чтобы начать использовать крон? =)

10 2 * * * /path/to/scripts/backup.sh &>>/var/log/backup.log
10 4 * * * /path/to/scripts/ya.disk-send.sh &>>/var/log/backup.log
10 6 * * * /path/to/scripts/ya.disk-rotate.sh &>>/var/log/backup.log

На самом деле просто я говнарь, а так-то стоило все эти отдельные скрипты объединить в один, сделав их функциями, а в кроне вызывать только один жирный скрипт. Чтобы была более нативная последовательность, когда команды выстраиваются в цепочку, а то вдруг что-то где-то не отработает и всё сломается. Или может у тебя бэкап будет литься не 3 часа и ротация его пропустит, хотя это и не очень критично, тут больше критично, чтобы всё успело запаковаться, а то ничего не отправится)

Итог

Вот я дописал себе шпаргалку, время почти 2 часа ночи, поэтому я сейчас отключусь от сервера и пойду спать, а утром тебе расскажу работает ли вся эта шняга или я где-то накосячил. У меня была почти такая же схема, только бэкапы там без моего участия снимались через VestaCP, панель управления такая, бесплатная и достаточно удобная, хотя бывает глючная.

В общем, утро покажет, что из этого всего получится.

P.S.:

Утро показало, что ничего не работает =) Просто я дурачок, при отладке закомментировал отправку архива в ya.disc, а ещё и логов не сделал нормальных. Архива нет на сервере, архива нет в облаке — думал, что ничего не произошло. Добавил в крон вывод в лог файл (тут уже исправлено) и убрал комментарий и всё зашуршало. Так что не ссы, всё ок ;)

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.