October 16, 2022

Свой приватный Интернет-клуб (на платформе Vas3k.Club) #6

Всем привет! В прошлых сериях мы с вами успешно запустили Клуб на платформе Vas3k'а. Вы большой молодец, но остался маленький нюанс - нам нужно обеспечить периодический бэкап данных нашего Клуба, а то мало ли что.

Предыдущие части:

  1. Делаем форк и поднимаем базовые сервисы
  2. Готовим конфигурационные файл и поднимаем клуб локально
  3. Кастомизируем Клуб под себя
  4. Настройка публикации Клуба
  5. Запускаем Клуб
  6. Дополнительно: настраиваем свой почтовый сервер

Схема резервного копирования

  • Цитата спонсора проекта: "знаешь схему - знаешь всё"

Для резервного копирования нашего Клуба мы будем придерживаться следующих принципов:

  • Статические файлы копировать не нужно.
  • Файлы конфигурации Docker-сервисов нужно скопировать один раз.
  • Нужно периодическое копирования Базы данных. При этом, нужно обеспечить транзакционность и атомарность операции, а не просто копирование файлов.
  • Нужно периодически копировать медиа файлы, созданные пользователями.

Резервные копии должны храниться на другом физическом сервере. Значит, что нам нужен какой-то внешний сервер с возможностью копирования данных.

Не реклама, но я использую сервис ihc.ru. За ~1к рублей в год предоставляют ~55 гб места под резервное хранилище.

Алгоритм резервного копирования

  1. На сервере Клуба периодически по расписанию выгружаем дамп Базы Данных Postgress во внешнюю директорию. Выгруженный дамп сжимаем с помощью gzip.
  2. На бэкап сервере периодически подключаемся к Серверу Клуба и копируем файлы бэкапов Базы Данных и файлы сервиса 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
Должны быть созданы дампы базы данных:
Можете скачать созданные файлы (по факту, создался всего лишь один файл, а все остальное - это ссылки на него).

Настраиваем бэкап сервер

Для периодического резервного копирования Клуба:

  • Дампов базы данных
  • Медиа файлов Pepic

Предлагаю использовать утилиту rsync (что-то не зашел мне rdiff-backup).

Для GitHub Actions deploy.xml мы делали SSH ключи для доступа к серверу. Тут ситуация аналогичная.

На бэкап сервере:

  • Переходим в директорию "~/.ssh" (если директория не существует, то создайте ее + погуглите):
cd ~/.ssh
  • Выполняем команды для генерации SSH ключей:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • Задать название файла и задать пустой пароль.
  • Сгенерировать SSH-ключи
  • Скопировать содержимое pub-файла (например: cat pmi-adm.pub)

На сервере Клуба:

  • Перейти в директорию ./ssh:
cd ~/.ssh
  • В файл authorized_keys нужно добавить содержимое pub-файла из предыдущего раздела.

Осуществляем резервное копирование

Шаги выполняются на бэкап-сервере

Осуществлять резервное копирование мы будем используя следующий шаблон команды:

rsync -avz -e "ssh -i ~/.ssh/<SSH_KEY> -o StrictHostKeyChecking=no" <club_user_name>@<club_ip>:~/<remote directory> ~/backup/<local directory>

где:

  • <SSH_KEY> - приватный файл ключа (см. предыдущий раздел)
<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

Настроим CRON:

  • Выполним команду "crontab -e"
  • Добавим строку:
0 5 * * 0 /bin/sh ~/backup.sh > /dev/null 2>&1
В 00:00 с воскресенье на понедельник выполняем скрипт backup.sh

Готово!

Заключение

Цикл статей про создание кастомизации Vas3k клуба завершен. Прошу поблагодарить автора лайком, лойсом и всем чем захотите :) Мне будет приятно!

❤️ До новых встреч! ❤️