Основной стек
> Исходные требования, сохранённые по темам. Рабочие команды и отличия реализации — в руководстве. Концептуальные примеры ниже не являются готовыми конфигурационными файлами.
3.1 Stalwart Mail Server
Использовать Stalwart Mail Server.
Он объединяет в одном контейнере:
- SMTP;
- SMTP Submission;
- IMAP;
- JMAP;
- пользователей;
- домены;
- WebUI администратора;
- аккаунты пользователей;
- DKIM/SPF/DMARC;
- встроенную фильтрацию спама;
- Sieve;
- маршрутизацию;
- ACL;
- quotas;
- API.
Это позволяет отказаться от набора:
Postfix
Dovecot
PostfixAdmin
Rspamd
Redis
MariaDB
и существенно упрощает обслуживание.
Stalwart официально предоставляет Docker-образ, а для production рекомендует фиксировать minor-версию вместо latest; актуальная документация использует ветку v0.16. Контейнер работает непривилегированным пользователем UID 2000.
Ресурсы
Ориентировочный лимит:
mem_limit: 768m
---
3.2 PostgreSQL
Использовать отдельный PostgreSQL.
Причина — не класть RocksDB или SQLite непосредственно на NFS.
Stalwart рекомендует RocksDB для обычной single-node установки на локальном быстром диске, но поддерживает PostgreSQL как полноценный основной DataStore. В PostgreSQL будут находиться:
- пользователи;
- настройки;
- состояния mailbox;
- metadata писем;
- настройки Stalwart;
- lookup-листы;
- ACL;
- домены;
- ключи/настройки сервера.
PostgreSQL официально разрешает размещение PGDATA на NFS, но NFS должен быть смонтирован с hard, а на стороне NFS-сервера рекомендуется sync export.
Ресурсы
mem_limit: 384m
Для этой нагрузки достаточно примерно:
shared_buffers = 64MB
max_connections = 30
---
3.3 Blob storage
Тела писем и вложения хранить не внутри PostgreSQL, а непосредственно в отдельной директории NAS.
Stalwart поддерживает отдельный filesystem BlobStore.
Использовать:
/mnt/omv/work/SMTP/data/blobs
В контейнере:
/var/lib/stalwart-blobs
Таким образом:
PostgreSQL
→ metadata
NAS filesystem
→ MIME-письма
→ вложения
→ Sieve blobs
Это проще бэкапить и не раздувает PostgreSQL.