Я буду рассматривать вариант, что у тебя вообще голая архитектура, т.е. минимально необходимые пакеты, чтобы осуществить задуманное:
- Нужен сервер с 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).*$/\1/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:(.*$)/\1/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, а ещё и логов не сделал нормальных. Архива нет на сервере, архива нет в облаке — думал, что ничего не произошло. Добавил в крон вывод в лог файл (тут уже исправлено) и убрал комментарий и всё зашуршало. Так что не ссы, всё ок