Настройка простого бэкапа сайтов и их баз, крутящихся в 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 и сделать руками.