Организация бэкапов на разные аккаунты Яндекс диска с сохранением дампов БД и уведомлением по почте
В базе знаний Vscale уже есть похожая статья об организации бэкапов на Я диск: https://community.vscale.io/hc/ru/community/posts/211685549-%D0%A0%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D0%B5%D0%B1-%D1%81%D0%B0%D0%B9%D1%82%D0%B0-%D0%BD%D0%B0-%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81-%D0%94%D0%B8%D1%81%D0%BA
Основные отличия подхода данной статьи от вышеприведенной:
1. Мы будем работать с другим клиентом Я диска.
2. Мы научимся бэкапить сайты на разные Я диски, это полезно если у вас на сервере несколько клиентов, которых вы поддерживаете, и вам нужно организовать бэкапы на разные Я диски ваших клиентов.
3. Мы будет уведомлять себя по почте о наших бэкапах.
4. Мы научимся делать бэкапы через день, и сохранять три последние копии.
5. Бэкапы у нас будут храниться в zip архивах с говорящими названиями, например: backup_your_site.ru_12.05.2017.zip. В этих архивах будут не только файлы, но и дампы БД.
Рассмотренный в статье алгоритм работает на сервере Ubuntu 16.04.
Важно: ваши домены должны быть делегированы на Яндекс, у вас есть доступ как к вашему аккаунту на Яндексе, так и к аккаунтам ваших клиентов. У вас есть почта на Яндексе вида root@your-site.ru, от имени которой будут приходить письма о бэкапах, и которая будет основной почтой на вашем сервере.
Предварительная подготовка: устанавливаем и настраиваем ssmtp для отправки писем с сервера
В сети много статей об организации отправки почты с сервера. Обычно пишут о настройке Postfix. На самом деле, сегодня, можно всё сделать намного проще. Мы делегировали домены на Яндекс, и теперь пусть он работает с нашей почтой по протоколу SMTP. Свой сервер грузить не будем.
Для установки ssmtp на наш сервер выполним команду:
sudo apt install ssmtp
Отредактируем конфиг SSMTP:
sudo nano /etc/ssmtp/ssmtp.conf
И приведем его к виду:
root=root@your_site.ru
mailhub=smtp.yandex.ru:465
AuthUser=root@your_site.ru
AuthPass=your_passwd
AuthMethod=LOGIN
FromLineOverride=YES
UseTLS=YES
Hostname=your_site.ru
В директории /root создадим файл rsync_email_orig, он нам пригодится в дальнейшем. И приведем его к виду, как ниже:
su
cd /root
nano rsync_email_orig
To: your_email@gmail.com
From: root@your-site
Subject: Backup sites
Info on backup:
В поле To: должен быть ваш емайл, на который будут отсылаться письма о бэкапах.
В поле From: емайл, прописанный в конфиге ssmtp.
Копируем файл rsync_email_orig (его портить не надо - это шаблон), и пробуем отправить себе письмо:
cp rsync_email_orig rsync_email_orig_test
echo 'Test msg' >> rsync_email_orig_test && ssmtp your_email@gmail.com < rsync_email_orig_test && rm -f rsync_email_orig_test
Если всё сделали правильно, на почту придет письмо. Если письмо не пришло, особенно это характерно для mail.ru, проверяем папку спам. Хотя в спам наше письмо попасть не должно. Мы делегировали домены на Яндекс, и наши письма подписываются цифровой подписью dkim.
Но, вообще настройка элементарна, проблем быть не должно
Всё! Для наших задач этого достаточно, более подробную информацию о настройке SSMTP можно найти в Интернете.
Предварительная подготовка: настраиваем клиент Я диска
Автор использует для работы клиент Я диска от разработчика Anton Batenev: https://github.com/abbat/ydcmd.
Почему был выбран именно этот клиент:
- можно работать с разными аккаунтами Яндекса;
- можно синхронизировать только то, что нужно.
Для установки ydcmd, последовательно выполним команды:
sudo add-apt-repository ppa:abbat/ydcmd
sudo apt update
sudo apt install ydcmd
Проверим, что всё прошло успешно:
which ydcmd
/usr/bin/ydcmd
Теперь нам надо получить токены для наших клиентов. У автора два токена - один общий для всех своих сайтов, другой - для отдельного сайта, с владельцем которого заключен договор на обслуживание.
Подробное описание процедуры получения Я токенов выходит за рамки этой статьи, т.к. всё очень хорошо описано у автора на Гитхабе: https://github.com/abbat/ydcmd
Также рекомендуем изучить статью: https://moonback.ru/page/vestacp-backup-to-yandex-disk#more-5320
После того, как вы получили токены для ваших клиентов, необходимо создать конфиги для ydcmd. Основной конфиг должен храниться по адресу /root/.ydcmd.cfg:
su
nano /root/.ydcmd.cfg
И выглядеть примерно так:
[ydcmd]
token = 1234567890
Создадим второй конфиг, например:
nano /root/.ydcmd_vet.cfg
Также приведем его к виду:
[ydcmd]
token = any_token
Проверим работу клиента Я диска:
su
cd /root
ydcmd stat
Если всё нормально, должны получить примерно такой вывод:
name: disk
exif: {}
resource_id: 21239186:e9065863c345ergdfghjfgy51da3c5e06bc12345afeb14158ddcaae
created: 2012-04-04T20:00:00+00:00
modified: 2012-04-04T20:00:00+00:00
path: disk:/
comment_ids: {}
type: dir
revision: 1354646733351472
Проверим работу с другим конфигом:
ydcmd --config=.ydcmd_vet.cfg stat
Создадим с помощью ydcmd папки для бэкапов на Я дисках
ydcmd mkdir backup
ydcmd --config=.ydcmd_vet.cfg mkdir backup
Больше о командах ydcmd можно узнать, запустив его c параметром --help:
ydcmd --help
На этом подготовка к организации бэкапов на разные Я диски закончена. Мы можем отправлять письма, и у нас работает клиент Я диска.
Организация бэкапов на разные Я диски
Важно: у автора домашние директории пользователей и их домены расположены в папке /var/www:
/var/www/user_name1/public_html/site1.ru
/var/www/user_name2/public_html/site2.ru
...
Если у вас иная структура каталогов, это можно будет поправить путем изменения переменных в bash скрипте ниже.
Перечень шагов для организации бэкапов
1. В папке суперпользователя root создадим файл, например user_list_all:
su
cd /root/
nano user_list_all
Приведем его к виду:
user1;site1.ru;DB_name1;user_DB_1;passwd_DB_1
user2;site2.ru;DB_name2;user_DB_2;passwd_DB_2
user3;site3.ru;DB_name3;user_DB_3;passwd_DB_3
...
Как мы видим user_list_all не что иное как csv файл, организованный по принципу:
имя_системного_пользователя;домен;БД_для_дампа;имя_пользователя_БД;пароль_БД
Важно: при работе с данным файлом не допускайте пустых строк, сохраняйте данные тогда и только тогда, когда курсор у вас находится в конце последней строки.
Подробности про возможную ошибку с пустыми строками: https://community.vscale.io/hc/ru/community/posts/115002769709-%D0%9D%D0%B5%D1%8F%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%B8%D0%B7-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0-bash-%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%B2-bash
Создадим второй файл, для отдельного бэкапа, например:
nano user_list_vet
И приведем его к такому же виду:
имя_системного_пользователя;домен;БД_для_дампа;имя_пользователя_БД;пароль_БД
2. Создадим bash скрипт и выставим ему права на исполнение, например:
touch rsync.sh ; chmod +x rsync.sh
Откроем файл для редактирования:
nano rsync.sh
Вставим, ctrl + shift + v, код скрипта:
#!/bin/bash
DATE=`/bin/date '+%d.%m.%Y'`
USER=$1
DIR=/var/www
DIR_SITES=public_html
EMAIL=your_email@gmail.com
TEMPLATE_EMAIL=/root/rsync_email
D=`date +%j`
# Четный или нечетный день в году. Остаток от деления на 2 в bash. Можно выставить или == 1, или == 0. Т.е. скрипт будет отрабатывать через день
if [ $((10#$D % 2)) == 1 ];then
case $USER in
vet)
FILE=user_list_vet
cnf=.ydcmd_vet.cfg
DIR_BACKUP=/root/backup_vet
;;
*)
FILE=user_list_all
cnf=.ydcmd.cfg
DIR_BACKUP=/root/backup
;;
esac
else
exit 1
fi
if ! [[ -d $DIR_BACKUP ]]; then
mkdir $DIR_BACKUP
fi
cp rsync_email_orig rsync_email
echo "$DATE" >> $TEMPLATE_EMAIL
echo "==============================================" >> $TEMPLATE_EMAIL
while read line;do
IFS=";"
set -- $line
USER=$1
SITES=$2
DB=$3
DB_USER=$4
DB_PASSWD=$5
FILE_NAME=$DIR_BACKUP/backup_"$SITES"_"$DATE".zip
cd $DIR/$USER/$DIR_SITES
mysqldump -u$DB_USER -p$DB_PASSWD $DB > $DB.sql
zip -r9 $FILE_NAME $SITES $DB.sql > /dev/null
rm ./$DB.sql
zip -T $FILE_NAME >> $TEMPLATE_EMAIL
echo "==============================================" >> $TEMPLATE_EMAIL
chown $USER:$USER $FILE_NAME
done < /root/$FILE
find $DIR_BACKUP/ -mtime +4 -exec rm -f {} \;
/usr/bin/ydcmd --config=/root/$cnf put --rsync $DIR_BACKUP/ disk:/backup >> $TEMPLATE_EMAIL
/usr/sbin/ssmtp $EMAIL < $TEMPLATE_EMAIL
exit 0
Отредактируем под себя переменные:
DIR=/var/www
DIR_SITES=public_html
EMAIL=your_email@gmail.com
Переменная DIR - путь к домашней папке пользователей.
DIR_SITES - папка с сайтами пользователя, она должна быть одинаковой у всех пользователей, например: public_html.
EMAIL - ваш email на который должно прийти письмо.
Внимательно изучите блок кода
case $USER in
vet)
FILE=user_list_vet
cnf=.ydcmd_vet.cfg
DIR_BACKUP=backup_vet
;;
*)
FILE=user_list_all
cnf=.ydcmd.cfg
DIR_BACKUP=backup
;;
esac
И отредактируйте его под себя:
Выражение vet) говорит следующее: если $USER равна vet, установить значения переменных:
FILE=user_list_vet
cnf=.ydcmd_vet.cfg
DIR_BACKUP=backup_vet
Где:
- переменная FILE - название файла для чтения вида:
имя_системного_пользователя;домен;БД_для_дампа;имя_пользователя_БД;пароль_БД
- переменная cnf - файл конфига ydcmd для пользователя vet с токеном Я диска для этого пользователя;
- переменная DIR_BACKUP - папка для бэкапов для пользователя vet;
Выражение *) устанавливает значения по умолчанию, если ни одно имя пользователя не подошло ранее.
Т.е. в этом блоке вы также должны прописать своих пользователей, их файлы для чтения, конфиги для ydcmd, папки для хранения бэкапов.
Например:
case $USER in
user1)
FILE=user_list_1
cnf=.ydcmd_one.cfg
DIR_BACKUP=backup_one
;;
user2)
FILE=user_list_2
cnf=.ydcmd_two.cfg
DIR_BACKUP=backup_two
;;
*)
FILE=user_list_all
cnf=.ydcmd.cfg
DIR_BACKUP=backup
;;
esac
Также обратите внимание на строку:
find ~/$DIR_BACKUP/ -mtime +4 -exec rm -f {} \;
Команда говорит следующее: в папке с бэкапами удалить файлы (у нас это архивы zip) старше 4-х дней. Автор напоминает, что данный скрипт отрабатывает через день и сохраняет три последние версии бэкапов. Если вам нужно другое количество сохраненных файлов - измените число 4 на нужное вам.
Примечание: на образе автора, от Vscale.io, с Ubuntu 16.04, архиватор zip был уже установлен. На всякий случай выполните команды:
sudo apt install zip unzip
3. Можно пробовать запускать скрипт для организации бэкапов rsync.sh.
Важно: перед запуском скрипта перечитайте материал еще раз, и всё внимательно проверьте. Убедитесь, что у вас созданы все необходимые файлы и прописаны верные переменные.
Также убедитесь, что в csv файле нет лишних пустых строк: https://community.vscale.io/hc/ru/community/posts/115002769709-%D0%9D%D0%B5%D1%8F%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%B8%D0%B7-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0-bash-%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%B2-bash
Выберите пользователя у которого не много данных для бэкапа, для первого запуска скрипта, и запустите скрипт, находясь в папке /root с параметром user_name, например:
./rsync.sh vet
vet - имя пользователя, для которого мы будем создавать бэкап.
Если ничего не происходит: в скрипте rsync.sh производится проверка:
$((10#$D % 2)) == 1
Попробуйте изменить 1 (нечетный день текущего года) на 0 (четный день текущего года).
Если команда:
./rsync.sh vet
выдаст ошибку:
mysqldump: [Warning] Using a password on the command line interface can be insecure.
То, не обращаем внимание.
Если скрипт выдает другие ошибки, то перечитываем статью, и еще раз всё проверяем. Автор гарантирует корректность предложенного алгоритма для организации бэкапов разных пользователей на разные Я диски на сервере Ubuntu 16.04.
В результате работы скрипта:
- В папке /root будет создана директория для хранения бэкапов backup_vet, с архивом вида: backup_your_site.ru_date_data.zip;
- Папка backup_vet будет сихронизирована с папкой Я диска backup пользователя vet;
- Вам придет письмо вида:
Info on backup:
Fri May 12 07:49:15 MSK 2017
==============================================
test of /root/backup_vet/your-site_date_data.zip OK
==============================================
Настраиваем cron для запуска заданий по расписанию
Выполним команды (задание в cron будет создано для суперпользователя root):
su
crontab -e
И впишем сами команды, например:
00 01 * * * /bin/bash /root/rsync.sh all
00 03 * * * /bin/bash /root/rsynс.sh vet
Где all и vet - это наши пользователи с своими файлами csv, файлами конфигурации для клиента Я диска, и своими папками для бэкапов.
Эти команды будут запускаться каждый день в час ночи и три часа ночи. Скрипт /root/rsync.sh будет отрабатывать через день.
Примечание: у автора в csv файле user_list_all записано более 10 пользователей, у некоторых из них больше одного сайта. И всё работает корректно.
Заключение
В данной статье мы рассмотрели порядок организации бэкапов на разные аккаунты Я диска.
- Бэкапы сохраняются через день;
- Хранятся три последние версии архивов;
- Сохраняются не только файлы, но и дампы БД;
- Мы получаем письма об успешности бэкапов.
Алгоритм
- Устанавливаем, настраиваем и проверяем работу SSMTP;
- Устанавливаем и настраиваем клиент Я диска ydcmd (получаем токены для наших клиентов и создаем конфиги);
- Создаем и редактируем скрипт для организации бэкапа rsync.sh, и csv файлы пользователей;
- Прописываем задание в cron.
-
Антон, в баш скрипте есть такой код
DIR=/var/www
DIR_SITES=public_htmlТ.е. у меня все домашние папки пользователей находятся в /var/www
Например, /var/www/user
В папке /var/www/user/public_html находятся сайты пользователя user
У вас пути другие, скорее всего.
Т.е. вам надо для начала прописать ваши пути
DIR=your_path_to_home_dir
DIR_SITES=your_dir_for_sites_in_home_dir
Думаю, что проблема в этом. А так пишите на proctoleha@gmail.com - разберемся.
Войдите в службу, чтобы оставить комментарий.
Комментарии
Комментариев: 3