Свой приватный Интернет-клуб (на платформе Vas3k.Club) #6
Всем привет! В прошлых сериях мы с вами успешно запустили Клуб на платформе Vas3k'а. Вы большой молодец, но остался маленький нюанс - нам нужно обеспечить периодический бэкап данных нашего Клуба, а то мало ли что.
- Делаем форк и поднимаем базовые сервисы
- Готовим конфигурационные файл и поднимаем клуб локально
- Кастомизируем Клуб под себя
- Настройка публикации Клуба
- Запускаем Клуб
- Дополнительно: настраиваем свой почтовый сервер
Схема резервного копирования
Для резервного копирования нашего Клуба мы будем придерживаться следующих принципов:
- Статические файлы копировать не нужно.
- Файлы конфигурации Docker-сервисов нужно скопировать один раз.
- Нужно периодическое копирования Базы данных. При этом, нужно обеспечить транзакционность и атомарность операции, а не просто копирование файлов.
- Нужно периодически копировать медиа файлы, созданные пользователями.
Резервные копии должны храниться на другом физическом сервере. Значит, что нам нужен какой-то внешний сервер с возможностью копирования данных.
Не реклама, но я использую сервис ihc.ru. За ~1к рублей в год предоставляют ~55 гб места под резервное хранилище.
Алгоритм резервного копирования
- На сервере Клуба периодически по расписанию выгружаем дамп Базы Данных Postgress во внешнюю директорию. Выгруженный дамп сжимаем с помощью gzip.
- На бэкап сервере периодически подключаемся к Серверу Клуба и копируем файлы бэкапов Базы Данных и файлы сервиса Pepic.
Однократно копируем конфигурационные файлы на бэкап сервер из сервера Клуба.
Периодический бэкап базы данных Клуба
В четвертой части статей про Клубостроительство отдельно упоминался сервис pgbackups. Давайте вспомним, а что же делает этот сервис.
pgbackups: image: prodrigestivill/postgres-backup-local restart: always volumes: - /home/pmi-admin/backup/pmi/pgdata:/backups links: - postgres depends_on: - postgres environment: - POSTGRES_HOST=postgres - POSTGRES_DB=pmi_club - POSTGRES_USER=pmiclub - POSTGRES_PASSWORD=pmiclub - POSTGRES_EXTRA_OPTS=-Z6 --schema=public --blobs - SCHEDULE=@weekly - BACKUP_KEEP_DAYS=7 - BACKUP_KEEP_WEEKS=4 - BACKUP_KEEP_MONTHS=6 - HEALTHCHECK_PORT=8080 networks: - club
- Используется образ "prodrigestivill/postgres-backup-local"
- Дамп базы данных Клуба записывается в директорию "/home/pmi-admin/backup/pmi/pgdata".
- Расписание записи дампа Базы данных: @weekly (это CRON макрос, который означает 00:00 с воскресенье на понедельник)
Сервис pgbackups описан в файле docker-compose.production.yml
Необходимо указать абсолютный путь до директории, куда будет сохраняться дамп базы данных Клуба.
Права доступа для директории Backup
Если запустить сервис как есть, то директория "backup" будет создана с правами доступа root. Нужно исправить это недоразумение самостоятельно, для этого:
- Создадим директории для резервного копирования вручную
- Разрешим читать и писать в эту директорию для текущего пользователя
sudo chown -R pmi-admin: /backup
- pmi-admin - имя пользователя (команда "whoami")
- /backup - директория для резервного копирования
- -R - флаг выполнять команду рекурсивно
Исправим права для директории:
sudo chmod 755 /backup
В итоге, получиться должно как-то так:
Принудительный запуск бэкапа Базы Данных
Предположим у вас запущен сервис резервного копирования Базы данных Клуба
Давайте выполним принудительное резервное копирование базы данных Клуба в созданную ранее бэкап-директорию. Для этого выполним команду:
docker exec -it <идентификатор сервиса pgbackups> /backup.sh
Должны быть созданы дампы базы данных:
Можете скачать созданные файлы (по факту, создался всего лишь один файл, а все остальное - это ссылки на него).
Настраиваем бэкап сервер
Для периодического резервного копирования Клуба:
Предлагаю использовать утилиту rsync (что-то не зашел мне rdiff-backup).
Для GitHub Actions deploy.xml мы делали SSH ключи для доступа к серверу. Тут ситуация аналогичная.
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Задать название файла и задать пустой пароль.
- Сгенерировать SSH-ключи
- Скопировать содержимое pub-файла (например: cat pmi-adm.pub)
cd ~/.ssh
Осуществляем резервное копирование
Шаги выполняются на бэкап-сервере
Осуществлять резервное копирование мы будем используя следующий шаблон команды:
rsync -avz -e "ssh -i ~/.ssh/<SSH_KEY> -o StrictHostKeyChecking=no" <club_user_name>@<club_ip>:~/<remote directory> ~/backup/<local directory>
<club_user_name> - имя пользователя для подключения к серверу Клуба
- <club_ip> - IP-адрес сервера Клуба.
- <remote directory> - директория на сервере Клуба, которую необходимо скопировать
- backup/<local directory> - локальная директория, куда требуется сохранить резервную копию (прим. backup директорию можно опустить).
rsync -avz -e "ssh -i ~/.ssh/pmi_adm -o StrictHostKeyChecking=no" club_user@123.456.789.012:~/backup/pmi/pgdata/ ~/backup/pmi/pgdata
Периодическое резервное копирование
Для периодического резервного копирования будем использовать CRON.
На бэкап сервере создадим файл backup.sh
touch backup.sh
Добавим в него содержимое (указываем абсолютные пути):
#!/bin/sh /usr/bin/rsync -avz -e "ssh -i ~/.ssh/pmi_adm -o StrictHostKeyChecking=no" pmi-admin@123.456.789.123:~/backup/mail/ ~/backup/mail /usr/bin/rsync -avz -e "ssh -i ~/.ssh/pmi_adm -o StrictHostKeyChecking=no" pmi-admin@123.456.789.123:~/backup/pmi/pgdata/ ~/backup/pmi/pgdata /usr/bin/rsync -avz -e "ssh -i ~/.ssh/pmi_adm -o StrictHostKeyChecking=no" pmi-admin@123.456.789.123:~/pepic/uploads/ ~/backup/pepic
Актуализируйте файл под себя
Отметим данный файл как исполняемый:
chmod +x backup.sh
0 5 * * 0 /bin/sh ~/backup.sh > /dev/null 2>&1
В 00:00 с воскресенье на понедельник выполняем скрипт backup.sh
Заключение
Цикл статей про создание кастомизации Vas3k клуба завершен. Прошу поблагодарить автора лайком, лойсом и всем чем захотите :) Мне будет приятно!