Сервис:
mail.4gain.pro(poste.io). Compose-стек на firefly. Backup → annalium daily 03:00 MSK.
Systemd-timer backup-mail.timer запускает /usr/local/sbin/backup-mail.sh каждый день в 03:00 MSK. Раскатывается ансибл-плейбуком service-mail-backup.yml.
Архивы складываются на annalium: /mnt/storage/firefly-backup/mail/mail-YYYY-MM-DD-HHMM.tar.gz. Retention 30 дней (find -mtime +30 -delete).
# С control-machine (mac/admin)
cd ansible/playbooks
ansible-playbook -c ssh service-mail-backup.yml -e sm2c_backup_mail_run_now=true
# Или прямо на firefly
ssh -p 21150 root@firefly.e1.4gain.pro 'systemctl start backup-mail.service'
journalctl -u backup-mail -f # следить за прогрессом
/mnt/compose/pro-4gain-mail/data целиком (исключаются */log и */cache):
data/server.crt + server.key — TLS-сертификаты poste.iodata/admin/admin.json + data/server.json — БД и конфигиdata/domains/<domain>/<user>/Maildir — все письма каждого ящикаdata/letsencrypt/ — ACME-state (если poste.io был хост LE)data/var/ — internal state Dovecot/HarakaРазмер ~5 GB у текущей конфигурации. Streaming tar | ssh без локального tmp-файла (root partition firefly забит).
ssh root@10.19.1.13 'ls -lh /mnt/storage/firefly-backup/mail/ | tail -3'
Предусловия:
system-traefik-bootstrap.yml отработал).mail.4gain.pro → public IP firefly валидна.Шаги:
# 1. Получить backup с annalium
ssh -p 21150 root@firefly.e1.4gain.pro
cd /tmp
scp root@10.19.1.13:/mnt/storage/firefly-backup/mail/mail-2026-05-15-0300.tar.gz .
# 2. Развернуть data
mkdir -p /mnt/compose/pro-4gain-mail
cd /mnt/compose/pro-4gain-mail
tar -xzf /tmp/mail-2026-05-15-0300.tar.gz
# Должен появиться каталог data/ с mailboxes
# 3. Поднять стек через ансибл-роль (compose-файл генерится из template)
exit # назад на admin-mac
cd ansible/playbooks
ansible-playbook -c ssh service-mail-bootstrap.yml
# 4. Проверка
curl -kI https://mail.4gain.pro/admin
# → HTTP/2 301, Location: /admin/
# 5. Logs
ssh -p 21150 root@firefly.e1.4gain.pro 'docker logs pro-4gain-mailserver --tail 30'
Если mailbox удалили / повредили без потери остальных:
# 1. Достать только нужный ящик из backup
ssh -p 21150 root@firefly.e1.4gain.pro
mkdir /tmp/mailbox-restore && cd /tmp/mailbox-restore
ssh root@10.19.1.13 'cat /mnt/storage/firefly-backup/mail/mail-YYYY-MM-DD-HHMM.tar.gz' \
| tar -xz data/domains/4gain.pro/<user>/Maildir
# 2. Скопировать в running-стек, поверх существующего (overwrite)
docker exec pro-4gain-mailserver chown -R 33:33 /data/domains/4gain.pro/<user>
cp -r data/domains/4gain.pro/<user>/Maildir/cur/* \
/mnt/compose/pro-4gain-mail/data/domains/4gain.pro/<user>/Maildir/cur/
# 3. Restart Dovecot indexes
docker exec pro-4gain-mailserver doveadm force-resync -u <user>@4gain.pro INBOX
sm2c-cloud host-bootstrap (для swarm + traefik).service-traefik-bootstrap.yml (поднимет traefik + acme.json).mail.4gain.pro → public IP нового хоста.service-mail-bootstrap.yml (раскатает compose).tar -xzf в /mnt/compose/pro-4gain-mail/data).docker compose -f /home/compose/pro-4gain-mail/docker/docker-compose.yml up -d --force-recreate.| Симптом | Причина | Решение |
|---|---|---|
| Maildir пустые / IMAP не видит писем после restore | Permissions у poste.io user (uid 33) | docker exec pro-4gain-mailserver chown -R 33:33 /data |
https://mail.4gain.pro/ отдаёт 502 |
poste.io healthcheck не прошёл | Подождать 30–60 сек пока стартует. docker logs pro-4gain-mailserver |
| ERR_TOO_MANY_REDIRECTS | traefik backend = HTTP-port poste.io | В pro-4gain-mail.yml traefik route — backend на HTTPS (5081) с insecureSkipVerify: true |
| Cert уже истёк | Backup старый > 90 дней (LE cert TTL) | poste.io автоматически перевыпустит при первом обращении (если HTTPS=Letsencrypt в env) |
| Не приходит почта снаружи | DNS MX, PTR, SPF, DKIM указывают на старый IP | Обновить DNS — обычно из admin-панели poste.io после login. PTR — у хостинга firefly. |
Changelog