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

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

Вручную

Вы можете использовать прилагаемый скрипт helper-scripts/backup_and_restore.sh для автоматического резервного копирования animails.

Внимание

Пожалуйста, не копируйте этот скрипт в другое место.

Чтобы запустить резервное копирование, укажите "backup" в качестве первого параметра, а затем один или несколько компонентов для копирования в качестве последующих параметров. Вы также можете использовать "all" в качестве второго параметра, чтобы создать резервную копию всех компонентов. Добавьте --delete-days n, чтобы удалить резервные копии старше n дней.

# Синтаксис:
# ./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)

# Создать полную копию, удалить копии старше 3 дней
./helper-scripts/backup_and_restore.sh backup all --delete-days 3

# Создать копию vmail, crypt и mysql, удалить копии старше 30 дней
./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30

# Создать копию vmail
./helper-scripts/backup_and_restore.sh backup vmail

Переменные для скрипта резервного копирования/восстановления

Многопоточность

С обновлением 2022-10 стало возможным запускать скрипт с поддержкой многопоточности. Это можно использовать как для резервного копирования, так и для восстановления.

Чтобы запустить резервное копирование/восстановление с многопоточностью, вам нужно добавить THREADS как переменную окружения перед командой выполнения скрипта.

THREADS=14 /opt/animails/helper-scripts/backup_and_restore.sh backup all
Число после символа = указывает количество потоков. Пожалуйста, оставьте число ядер вашего процессора минус 2, чтобы сохранить достаточно мощности CPU для работы самой системы animails.

Путь к резервной копии

Скрипт запросит у вас местоположение резервной копии. Внутри этого места он создаст папки в формате "animails_DATE". Вам не следует переименовывать эти папки, чтобы не нарушить процесс восстановления.

Чтобы запустить резервное копирование в автоматическом режиме, определите MAILCOW_BACKUP_LOCATION как переменную окружения перед запуском скрипта:

MAILCOW_BACKUP_LOCATION=/opt/backup /opt/animails/helper-scripts/backup_and_restore.sh backup all

Совет

Обе упомянутые выше переменные можно комбинировать! Например:

MAILCOW_BACKUP_LOCATION=/opt/backup THREADS=14 /opt/animails/helper-scripts/backup_and_restore.sh backup all

Задание Cron

Вы можете запускать скрипт резервного копирования регулярно через cron. Убедитесь, что BACKUP_LOCATION существует:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
5 4 * * * cd /opt/animails/; MAILCOW_BACKUP_LOCATION=/mnt/animails_backups /opt/animails/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3

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

Следующий скрипт можно поместить в /etc/cron.daily/animails-backup — не забудьте пометить его как исполняемый с помощью chmod +x:

#!/bin/sh

# Резервное копирование данных animails
# https://docs.animails.email/backup_restore/b_n_r-backup/

set -e

OUT="$(mktemp)"
export MAILCOW_BACKUP_LOCATION="/opt/backup"
SCRIPT="/opt/animails/helper-scripts/backup_and_restore.sh"
PARAMETERS="backup all"
OPTIONS="--delete-days 30"

# запуск команды
set +e
"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2>&1 > "$OUT"
RESULT=$?

if [ $RESULT -ne 0 ]
    then
            echo "${SCRIPT} ${PARAMETERS} ${OPTIONS} столкнулся с ошибкой:"
            echo "РЕЗУЛЬТАТ=$RESULT"
            echo "STDOUT / STDERR:"
            cat "$OUT"
fi

Стратегия резервного копирования с помощью rsync и скрипта animails

Создайте целевой каталог для вспомогательного скрипта animails:

mkdir -p /external_share/backups/backup_script

Создайте задания cron:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
25 1 * * * rsync -aH --delete /opt/animails /external_share/backups/animails
40 2 * * * rsync -aH --delete /var/lib/docker/volumes /external_share/backups/var_lib_docker_volumes
5 4 * * * cd /opt/animails/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/animails/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
# При желании используйте утилиту acl для резервного копирования прав доступа папок/файлов: getfacl -Rn /path

В месте назначения (в данном случае /external_share/backups) желательно иметь возможность создания снимков (ZFS, Btrfs и т. д.). Делайте снимки ежедневно и храните их в течение n дней для обеспечения согласованности резервной копии. Не используйте rsync для копирования на сетевой ресурс Samba, вам необходимо сохранить правильные права доступа!

Для восстановления вам просто нужно запустить rsync в обратном направлении и перезапустить Docker для повторного считывания томов. Выполните:

docker compose pull
docker compose up -d
docker-compose pull
docker-compose up -d

Если вам повезет, Redis и MariaDB смогут автоматически исправить несогласованные базы данных (если они окажутся несогласованными). В случае повреждения базы данных вам потребуется использовать вспомогательный скрипт для восстановления поврежденных элементов. Если восстановление не удалось, попробуйте извлечь резервные копии и скопировать файлы вручную. Сохраняйте права доступа к файлам!