Настройка простого бэкапа сайтов и их баз, крутящихся в Docker'е
Настройка бэкапа сайтов, работающих в Docker'е на LEMP, описанного в предыдущей статье, при помощи стандартных инструментов Linux. Плюс, как фича, копирование бэкапов на яндекс диск.
Начальные данные из статьи по ссылке выше, это Docker в котором крутится классический LEMP с двумя сайтами. Пусть корневым каталогом проекта будет /docker. Тогда бэкапить надо:
- Базы
- Файлы сайтов, каталог
/docker/volumes/sites - Конфигурацию контейнеров, каталог
/docker/images
Настройка Яндекс.Диск
Можно пойти двумя путями - это поставить официальный клиент или использовать протокол WebDAV. Поскольку мне лень разбираться с работой клиента, то далее будет описан второй вариант.
Установка:
apt install davfs2
В ходе установки спросит разрешать ли обычным пользователям монтировать WebDAV ресурсы. Если надо дать права пользователям - да, если планируется монтировать только от рута - нет. В заметке приведены варианты настроек для обоих случаев.
Монтирование для рута
Авторизация:
mkdir /mnt/yadisk # Внести логин и пароль в файл echo '/mnt/yadisk/ login password' >> /etc/davfs2/secrets
Если пароль содержит спецсимволы, то их надо отбить или заключить пароль в кавычки. Примеры есть в файле /etc/davfs2/secrets.
Монтирование и автомонтирование при ребуте:
echo 'https://webdav.yandex.ru /mnt/yadisk davfs rw,_netdev,uid=root 0 0' >> /etc/fstab # Смонтировать руками без перезагрузки mount -a # Проверить df -h | grep yandex
Монтирование для пользователя
Авторизация:
mkdir /home/user/yadisk # Внести логин и пароль в файл echo '/home/user/yadisk login password' >> /home/user/.davfs2/secrets # Назначить секьюрные права на файл chown user:user /home/user/.davfs2/secrets chmod 400 /home/user/.davfs2/secrets # Добавить юзера в группу для предоставления права использовать davfs # Необходимо перелогиниться для применения прав доступа, если это текущий пользователь usermod -a -G davfs2 user
С монтированием можно пойти несколькими путями
1. Монтировать только руками:
echo 'https://webdav.yandex.ru /home/user/yadisk davfs rw,user,noauto 0 0' >> /etc/fstab
Команда для монтирования пользователем:
mount ~/yadisk
2. Автомонтирование:
Тут снова можно пойти двумя путями, в зависимости от задачи:
2.1. При логине пользователя:
echo 'mount ~/yadisk' >> /home/user/.profile
2.2. При старте системы. Быть может другой способ и существует, но я его не искал, поскольку не вижу смысла в этом варианте.
Как и у рута придется положить логин\пароль в /etc/davfs2/secrets:
echo '/home/user/yadisk login password' >> /etc/davfs2/secrets
И монтировать с другими опциями:
echo 'https://webdav.yandex.ru /home/user/yadisk davfs rw,user,_netdev 0 0' >> /etc/fstab
Настройка бэкапа
Некоторые оговорки:
- Название баз одинаковое во всех MySQL контейнерах. Один контейнер - одна база.
- Бэкап делается раз в сутки. Если надо чаще, то следует изменить переменную DATE на что-то типа
DATE=`date +%Y-%m-%d-%Hh` - Бэкап производится из родительской системы на которой крутятся контейнеры
Для удобства сделал все в одном скрипте, который надо будет самостоятельно внести в крон. Скрипт бэкапа /docker/backup.sh :
#!/bin/sh
DATE=`date +%Y-%m-%d`
### Бэкап сайтов
# Объявить сайты, которые надо бэкапить
for SITE in example.ru site.com
do
# Путь в родительской системе до каталога, который смонтирован в mysql контейнерах в /var/lib/mysql
DBPATH=/docker/volumes/mysql/$SITE
# Путь в родительской системе до каталога, в котором располагаются файлы сайта
FILESPATH=/docker/volumes/sites/$SITE
# Путь в родительской системе до каталога, в которой класть бэкап
BACKUPPATH=/root/backup/$SITE
# Путь в родительской системе до каталога, в которой смонтирован ядиск
COPYTO=/mnt/yadisk/backup/$SITE
# Создать каталоги
mkdir -p $BACKUPPATH
mkdir -p $COPYTO
# Дамп Mysql внутри контейнера
docker exec mysql-$SITE sh -c "mysqldump site > /var/lib/mysql/$DATE-site.sql"
# Переместить созданный дамп в $BACKUPPATH
mv $DBPATH/$DATE-site.sql $BACKUPPATH
# Сжать файлы сайта и положить в $BACKUPPATH
tar -cpzf $BACKUPPATH/$DATE.tgz $FILESPATH
# Проверить смонтирован ли ядиск и если да, то скопировать туда бэкапы
df -h | grep webdav.yandex.ru > /dev/null
if [ $? -eq 0 ]
then
cp $BACKUPPATH/$DATE-site.sql $COPYTO
cp $BACKUPPATH/$DATE.tgz $COPYTO
else exit
fi
# Удалить файлы на сервере старше двух дней
find $BACKUPPATH -mtime +1 -exec rm '{}' \;
# Удалить файлы на ядиске старше десяти дней
find $COPYTO -mtime +9 -exec rm '{}' \;
done
### Бэкап конфигов докера
DOCKERPATH=/docker
COPYTO=/mnt/yadisk/backup/docker
BACKUPPATH=/root/backup/docker
mkdir -p $BACKUPPATH
mkdir -p $COPYTO
cp $DOCKERPATH/backup.sh $COPYTO/$DATE-backup.sh
cp $DOCKERPATH/docker-compose.yml $COPYTO/$DATE-docker-compose.yml
tar -cpzf $BACKUPPATH/$DATE-docker.tgz $DOCKERPATH/images
cp $BACKUPPATH/$DATE-docker.tgz $COPYTO
find $BACKUPPATH -mtime +1 -exec rm '{}' \;
find $COPYTO -mtime +9 -exec rm '{}' \;
Восстановление
Файлы
Распаковать и скопировать в нужный каталог.
Базы
# Скопировать файл бэкапа в примапленный каталог нужного контейнера cp /mnt/yadisk/backup/$SITE/$TIME-site.sql /docker/volumes/mysql/$SITE/$TIME-site.sql # Залить дамп в базу для нужного контейнера docker exec mysql-$SITE sh -c "mysql -f site < /var/lib/mysql/$TIME-site.sql"
Если будут какие-то косяки с восстановлением - остановить нужный контейнер, тупо удалить все данные MySQL для нужного сайта и снова запустить его:
docker-compose stop mysql-$SITE rm -rf /docker/volumes/mysql/$SITE/* docker-compose start mysql-$SITE
Затем создать базу по-новой и залить дамп:
docker exec -it mysql-$SITE mysql -e 'CREATE DATABASE `site` CHARACTER SET utf8 COLLATE utf8_general_ci;' docker exec mysql-$SITE sh -c "mysql -f site < /var/lib/mysql/$TIME-site.sql"
Или поднять контейнер phpMyAdmin и сделать руками.