← Почта · Все разделы

Основной стек

> Исходные требования, сохранённые по темам. Рабочие команды и отличия реализации — в руководстве. Концептуальные примеры ниже не являются готовыми конфигурационными файлами.

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.