Перейти к содержанию

Резервное копирование Borgmatic

Введение

Borgmatic — отличный способ организации резервного копирования вашей установки animails, так как он надежно шифрует данные и чрезвычайно прост в настройке.

Благодаря возможностям дедупликации вы можете хранить огромное количество резервных копий, не тратя много дискового пространства. Это позволяет запускать резервное копирование с очень короткими интервалами, обеспечивая минимальную потерю данных при возникновении необходимости их восстановления.

Этот документ проведет вас через процесс включения непрерывного резервного копирования для animails с помощью borgmatic. Функциональность borgmatic обеспечивается Docker-образом borgmatic. Ознакомьтесь с файлом README в этом репозитории, чтобы узнать о других доступных опциях (таких как push-уведомления). Данное руководство охватывает только основы.


Настройка borgmatic

Создание или изменение docker-compose.override.yml

В корневой папке animails создайте или отредактируйте файл docker-compose.override.yml и вставьте следующую конфигурацию:

services:
  borgmatic-animails:
    image: ghcr.io/borgmatic-collective/borgmatic
    hostname: animails
    restart: always
    dns: ${IPV4_NETWORK:-172.22.1}.254
    volumes:
      - vmail-vol-1:/mnt/source/vmail:ro
      - crypt-vol-1:/mnt/source/crypt:ro
      - redis-vol-1:/mnt/source/redis:ro
      - rspamd-vol-1:/mnt/source/rspamd:ro
      - postfix-vol-1:/mnt/source/postfix:ro
      - mysql-socket-vol-1:/var/run/mysqld/
      - borg-config-vol-1:/root/.config/borg
      - borg-cache-vol-1:/root/.cache/borg
      - ./data/conf/borgmatic/etc:/etc/borgmatic.d:Z
      - ./data/conf/borgmatic/ssh:/root/.ssh:Z
    environment:
      - TZ=${TZ}
      - BORG_PASSPHRASE=${BORG_PASSPHRASE}
      - DBNAME=${DBNAME}
      - DBUSER=${DBUSER}
      - DBPASS=${DBPASS}
    networks:
      animails-network:
        aliases:
          - borgmatic

volumes:
  borg-cache-vol-1:
  borg-config-vol-1:

Добавьте BORG_PASSPHRASE=YouBetterPutSomethingRealGoodHere в ваш файл animails.conf и убедитесь, что вы изменили BORG_PASSPHRASE на выбранную вами надежную парольную фразу.

Из соображений безопасности мы монтируем maildir в режиме «только для чтения» (ro). Если позже вы захотите восстановить данные, вам нужно будет удалить флаг ro перед началом восстановления. Это описано в разделе о восстановлении резервных копий.

Создание data/conf/borgmatic/etc/config.yaml

Далее необходимо создать конфигурацию borgmatic. Borgmatic поддерживает подстановку переменных окружения, что позволяет нам получать правильные учетные данные MySQL из Docker (а именно из animails.conf), не раскрывая их в самом конфиге.

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

cat <<EOF > data/conf/borgmatic/etc/config.yaml
source_directories:
    - /mnt/source/vmail
    - /mnt/source/crypt
    - /mnt/source/redis
    - /mnt/source/rspamd
    - /mnt/source/postfix
repositories:
    - path: ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./animails
      label: rsync
exclude_patterns:
    - '/mnt/source/postfix/public/'
    - '/mnt/source/postfix/private/'
    - '/mnt/source/rspamd/rspamd.sock'

keep_hourly: 24
keep_daily: 7
keep_weekly: 4
keep_monthly: 6

mariadb_databases:
    - name: ${DBNAME}
      username: ${DBUSER}
      password: ${DBPASS}
      options: "--default-character-set=utf8mb4 --skip-ssl"
      list_options: "--skip-ssl"
      restore_options: "--skip-ssl"
EOF

Внимание

Начиная с borgmatic 1.8.0 (выпущен 19 июля 2023 г.), синтаксис конфигурационного файла был изменен. Вы можете проверить логи Docker контейнера borgmatic на наличие предупреждений об устаревании, чтобы узнать, затронуты ли вы (т. е. был ли ваш конфиг создан для старой версии). В таком случае следует создать новый файл config.yaml, как описано выше, чтобы избежать проблем в будущих релизах.

Внимание

Начиная с borgmatic 1.9.4 (выпущен 11 декабря 2024 г.), включенные инструменты MariaDB пытаются принудительно использовать зашифрованные соединения по умолчанию. Отредактируйте config.yaml и добавьте --skip-ssl в options, restore_options и list_options, как показано выше. Также убедитесь, что вы изменили mysql_databases на mariadb_databases.

Этот файл является минимальным примером использования borgmatic с аккаунтом uXXXXX на Storage Box от провайдера Hetzner. Репозиторий называется animails (см. настройку repositories). Это значение необходимо изменить соответствующим образом.

Будут создаваться резервные копии как maildir, так и базы данных MySQL — этого достаточно для восстановления animails после инцидента.

Настройки хранения сохранят по одному архиву за каждый час последних 24 часов, по одному в день за неделю, по одному в неделю за месяц и по одному в месяц за последние полгода.

Ознакомьтесь с документацией borgmatic для использования других типов репозиториев. Если вы решите использовать локальную файловую систему, обязательно примонтируйте её в контейнер. Для этих целей в контейнере определен том /mnt/borg-repository.

Создание crontab

Создайте новый текстовый файл data/conf/borgmatic/etc/crontab.txt со следующим содержимым:

14 * * * * PATH=$PATH:/usr/local/bin /usr/local/bin/borgmatic --stats -v 0 2>&1

Этот файл использует синтаксис crontab. Данный пример будет запускать резервное копирование каждый час в 14 минут и выводить статистику в конце.

Размещение SSH-ключей

Поместите SSH-ключи для подключения к удаленному репозиторию в папку data/conf/borgmatic/ssh. OpenSSH ожидает стандартные файлы id_rsa, id_ed25519 или аналогичные. Убедитесь, что права на файл установлены как chmod 600, иначе OpenSSH откажется их использовать.

Запуск контейнера

Для следующего шага контейнер должен быть запущен. Для этого выполните:

docker compose up -d
docker-compose up -d

Инициализация репозитория

Контейнер запущен, но резервное копирование не удастся, пока репозиторий не инициализирован.

Для инициализации выполните:

docker compose exec borgmatic-animails borgmatic init --encryption repokey-blake2
docker-compose exec borgmatic-animails borgmatic init --encryption repokey-blake2

Вам будет предложено подтвердить SSH-ключ хоста вашего удаленного сервера репозитория. Убедитесь, что он совпадает, и подтвердите запрос, введя yes. Репозиторий будет инициализирован с парольной фразой, которую вы ранее установили в переменной окружения BORG_PASSPHRASE.

При использовании любого из методов шифрования repokey ключ шифрования будет храниться в самом репозитории, а не на клиенте, поэтому никаких дополнительных действий в этом отношении не требуется. Если вы решите использовать keyfile вместо repokey, обязательно экспортируйте ключ и сохраните его копию отдельно. О том, как получить ключ, читайте в разделе Экспорт ключей.

Перезапуск контейнера

После завершения настройки и инициализации перезапустите контейнер:

docker compose restart borgmatic-animails
docker-compose restart borgmatic-animails

Восстановление из резервной копии

Предполагается, что восстановление производится на чистую установку animails без пользовательских данных.

Восстановление maildir (полное)

Внимание

Это действие перезапишет файлы в вашем maildir! Не запускайте это, если не собираетесь восстанавливать почту.

Если вы используете SELinux в режиме Enforcing

Если вы используете animails на хосте с SELinux в режиме Enforcing, вам придется временно отключить его на время извлечения архива, так как при установке animails том vmail помечается как частный, принадлежащий исключительно контейнеру dovecot. SELinux (вполне обоснованно) будет препятствовать любому другому контейнеру, например, контейнеру borgmatic, записывать данные в этот том.

Перед запуском восстановления вы должны разрешить запись в том vmail в файле docker-compose.override.yml, удалив флаг ro у тома. Затем вы можете использовать следующую команду для восстановления maildir из резервной копии:

docker compose exec borgmatic-animails borgmatic extract --path mnt/source --archive latest
docker-compose exec borgmatic-animails borgmatic extract --path mnt/source --archive latest

Или вы можете указать любое имя архива из списка (см. раздел Список всех доступных архивов).

Восстановление maildir (отдельный ящик)

Можно восстановить только один почтовый ящик. Например, для user@example.com.

Снова убедитесь, что удалили флаг ro в docker-compose.override.yml. При указанной выше конфигурации borgmatic хранит бэкапы по пути mnt/source/vmail/example.com/user/.

Команда для восстановления:

docker compose exec borgmatic-animails borgmatic extract --path mnt/source/vmail/example.com/user --archive latest
docker-compose exec borgmatic-animails borgmatic extract --path mnt/source/vmail/example.com/user --archive latest

Примечание

Вместо latest вы также можете указать любое имя архива из списка доступных архивов (см. раздел Вывод списка всех доступных архивов).

В зависимости от того, как давно были удалены оригинальные данные, вам может потребоваться запустить переиндексацию почтового ящика через Dovecot, чтобы восстановленные письма появились в вашем почтовом клиенте:

docker compose exec dovecot-animails doveadm index -u user@example.com '*'
docker-compose exec dovecot-animails doveadm index -u user@example.com '*'

Восстановление MySQL

Внимание

Выполнение этой команды удалит и воссоздаст базу данных animails! Не запускайте её, если вы на самом деле не намерены восстановить базу данных animails из резервной копии.

Чтобы восстановить базу данных MySQL из последнего архива, используйте следующую команду:

docker compose exec borgmatic-animails borgmatic restore --archive latest
docker-compose exec borgmatic-animails borgmatic restore --archive latest

Или вы можете указать любое имя архива из списка (см. раздел [Вывод списка всех доступных архивов]#listing-all-available-archives)).

После восстановления

После завершения восстановления необходимо перезапустить animails. Если вы отключали режим принудительного исполнения SELinux (Enforcing), сейчас самое время включить его обратно.

Для перезапуска animails используйте следующую команду:

docker compose down && docker compose up -d
docker-compose down && docker-compose up -d

Если вы используете SELinux, это также запустит процесс перемаркировки (re-labeling) всех файлов в вашем томе vmail. Пожалуйста, проявите терпение, так как это может занять некоторое время, если у вас много файлов.


Полезные команды

Запуск архивации вручную (с выводом отладочной информации)

docker compose exec borgmatic-animails borgmatic -v 2
docker-compose exec borgmatic-animails borgmatic -v 2

Вывод списка всех доступных архивов

docker compose exec borgmatic-animails borgmatic list
docker-compose exec borgmatic-animails borgmatic list

Снятие блокировки (Break lock)

Если работа Borg была прервана во время архивации, он оставит после себя устаревшую блокировку, которую необходимо снять перед выполнением любых новых операций:

docker compose exec borgmatic-animails borgmatic break-lock
docker-compose exec borgmatic-animails borgmatic break-lock

Сейчас подходящий момент для ручного запуска архивации, чтобы убедиться в её успешном выполнении.

Экспорт ключей

При использовании любых методов шифрования keyfile вы ОБЯЗАНЫ самостоятельно позаботиться о резервном копировании файлов ключей. Файлы ключей создаются при инициализации репозитория. Методы repokey сохраняют файл ключа внутри самого репозитория, поэтому ручное резервное копирование в этом случае не так критично.

Учтите, что в обоих случаях вам также необходимо иметь парольную фразу для расшифровки архивов.

Для получения файла ключа выполните:

docker compose exec -e BORG_RSH="ssh -p 23" borgmatic-animails borg key export --paper uXXXXX@uXXXXX.your-storagebox.de:animails
docker-compose exec -e BORG_RSH="ssh -p 23" borgmatic-animails borg key export --paper uXXXXX@uXXXXX.your-storagebox.de:animails

Где uXXXXX@uXXXXX.your-storagebox.de:animails — это URI вашего репозитория.