Backup для сайтов в Docker’е

Автор: Admin | 14.04.2018

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *