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

Архитектура

Для HomeMaster применяется разделение сетей и шлюзов: Public NPM → web → Roundcube, Internal NPM → admin → Stalwart. База остаётся в собственной internal-сети SMTP, Stalwart получает отдельную сеть для исходящего трафика. Схема с портами ниже описывает автономный режим.


Browser → nginx HTTPS :18443 → portal / docs / Roundcube /mail/

Browser → nginx HTTPS :18444 → Stalwart /admin, /account, API

Roundcube → authenticated STARTTLS :587 / IMAPS :993 → Stalwart

Internet → SMTP :25 → Stalwart → filesystem blobs on NAS

Stalwart → SMTP2GO :587 with mandatory STARTTLS → Internet

Stalwart + Roundcube → separate PostgreSQL databases → local Docker volume

Конфигурацию Compose генерирует scripts/stack.py в формате JSON. Версии образов фиксируются в IMAGES. Готовые файлы — STATE_ROOT/compose/compose.json и отдельный init.json без опубликованных портов. STATE_ROOT — Mountpoint локального Docker volume mail_state; указатель хранится в /etc/mail-stack/location.json. Клон может находиться на NAS, а systemd использует копию runtime из локального volume.

PostgreSQL, конфигурация Stalwart, сертификаты, секреты и runtime находятся в локальном Docker volume. Тела писем (blobs) и полные backup-архивы — на NAS под UID владельца каталога. Этот UID получает процесс Stalwart. Roundcube использует собственные БД и роль PostgreSQL для адресной книги, настроек и сессий. Индексы, метаданные и аккаунты также локальны: отдельные blobs не заменяют резервную копию.

Отличия от исходного ТЗ

- Webmail теперь обязателен: Roundcube Elastic включён сразу.

- Мастер Stalwart заменён автоматическим Bootstrap API; вручную переключать storage не нужно.

- HTTPS для портала и админки готов без NPM; локальная CA позволяет работать до выпуска публичного сертификата.

- NAS может быть смонтирован родительским каталогом: проверяется фактическая NFS-файловая система через findmnt -T. Маркер хранится в NAS_ROOT.

- restart: no: автозапуск хоста контролирует systemd с проверкой NAS, а не Docker unless-stopped.

- Секреты имеют 0600, но владельцем отдельных файлов является читающий контейнерный UID.

- На NAS не выполняется chown: операции выполняются с UID/GID, сохранёнными из sudo. Root_squash поддерживается без изменения export.

- Требования из specification/ сохранены для трассировки; концептуальные старые примеры не следует запускать. Рабочие команды находятся в руководствах.

Redis, RocksDB/SQLite на NFS, ClamAV, отдельный policy-сервис и отдельный frontend backend не требуются.