2026-07-03 21:44:29 +03:00
2026-07-03 21:44:29 +03:00
2026-06-30 23:20:33 +03:00
2026-07-03 21:44:29 +03:00
2026-07-03 21:44:29 +03:00
2026-07-01 00:06:45 +03:00

stalwart-mail

Self-hosted почтовый стек: Stalwart (SMTP/IMAP/CalDAV/CardDAV) + Rspamd (антиспам, milter) + ClamAV (антивирус, milter).

Состав

Сервис Образ Роль
stalwart stalwartlabs/stalwart MTA + IMAP + CalDAV/CardDAV + WebAdmin
rspamd rspamd/rspamd Антиспам, milter на порту 11332
clamav clamav/clamav:stable Антивирус, milter на порту 7357

Требования к хосту

  • Docker + Docker Compose v2
  • RAM: минимум 2 ГБ (ClamAV держит ~500 МБ1 ГБ на сигнатурах)
  • Открытые порты: 25, 465, 587, 143, 993 (почта), 443/8080 (WebAdmin)
  • Статический IP и PTR-запись (reverse DNS) — обязательно для доставки почты

Быстрый старт

# 1. Клонировать / распаковать
cd stalwart-mail

# 2. Задать домен в .env
cp .env .env.local
# отредактировать MAIL_DOMAIN

# 3. Первый запуск — Stalwart создаст конфиг и задаст пароль admin
docker compose up -d

# 4. Посмотреть пароль администратора (выводится при первом старте)
docker compose logs stalwart | grep -i password

# 5. Открыть WebAdmin
# http://<IP>:8080/admin

После входа в WebAdmin:

  1. Settings → Server → Hostname — указать FQDN (например, mail.example.com)
  2. Settings → SMTP → DKIM — сгенерировать ключи для домена
  3. Accounts — создать почтовые ящики

Подключение Rspamd и ClamAV (Stalwart milters)

После первого запуска добавить в конфигурацию Stalwart

  • в старых версиях (WebAdmin → Settings → Configuration editor или напрямую в файл data/stalwart/etc/config.toml)
  • в новых версиях (WebAdmin → Settings → MTA → Filters → Milters) - http://YOUR_IP:8080/account/Settings/x:MtaMilter
[session.milter."rspamd"]
enable = true
hostname = "rspamd"
port = 11332
stages = ["connect", "ehlo", "mail", "rcpt", "data"]
tls = false
allow-invalid-certs = false
tempfail-on-error = false

[session.milter."clamav"]
enable = true
hostname = "clamav"
port = 7357
stages = ["data"]
tls = false
allow-invalid-certs = false
tempfail-on-error = false

Имена rspamd и clamav — это имена сервисов в Docker Compose, они резолвятся внутри сети mail автоматически.


DNS-записи

Все записи настраиваются у регистратора домена / DNS-провайдера. Заменить mail.example.com и example.com на свои значения, 1.2.3.4 — на IP сервера.

1. A-запись (адрес почтового сервера)

mail.example.com.   A   1.2.3.4

2. MX-запись (куда доставлять почту для домена)

example.com.   MX   10   mail.example.com.

Приоритет 10 — стандарт. Если MX несколько, меньшее число = выше приоритет.

3. PTR / Reverse DNS (rDNS)

Настраивается у хостинг-провайдера (не у DNS-регистратора).

1.2.3.4  →  mail.example.com

Это обязательное условие для нормальной доставки — большинство почтовых серверов отклоняют письма с IP без PTR.

4. SPF (кто имеет право отправлять от имени домена)

TXT-запись для example.com:

"v=spf1 mx a:mail.example.com ~all"
  • mx — разрешает MX-серверам домена отправку
  • a:mail.example.com — явно разрешает A-запись почтового сервера
  • ~all — softfail для остальных (можно -all для строгого режима)

5. DKIM (подпись исходящей почты)

Ключи генерирует Stalwart (WebAdmin → Settings → SMTP → DKIM → Generate).

Stalwart покажет готовую TXT-запись вида:

stalwart._domainkey.example.com.   TXT   "v=DKIM1; k=rsa; p=MIIBIjAN..."

Скопировать и добавить в DNS. Селектор по умолчанию — stalwart, можно изменить.

6. DMARC (политика обработки писем без SPF/DKIM)

TXT-запись для _dmarc.example.com:

"v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com; fo=1"
  • p=quarantine — подозрительные письма в спам (начать с p=none для мониторинга)
  • rua — агрегированные отчёты (раз в сутки)
  • ruf — forensic-отчёты по каждому инциденту

7. MTA-STS (принудительный TLS для входящей почты)

Опционально, но рекомендуется. Требует HTTPS на хосте.

TXT-запись для _mta-sts.example.com:

"v=STSv1; id=20240101"

Файл политики по адресу https://mta-sts.example.com/.well-known/mta-sts.txt:

version: STSv1
mode: enforce
mx: mail.example.com
max_age: 604800

8. Autodiscovery (автонастройка клиентов)

Stalwart отдаёт /mail/config-v1.1.xml и /.well-known/autoconfig/mail/config-v1.1.xml автоматически. Для полного autodiscovery добавить CNAME:

autoconfig.example.com.   CNAME   mail.example.com.
autodiscover.example.com.  CNAME   mail.example.com.

Сводная таблица DNS

Запись Тип Значение Обязательно
mail.example.com A 1.2.3.4
example.com MX 10 mail.example.com
PTR для 1.2.3.4 PTR mail.example.com (у провайдера)
example.com TXT v=spf1 mx a:mail.example.com ~all
stalwart._domainkey.example.com TXT v=DKIM1; k=rsa; p=... (из WebAdmin)
_dmarc.example.com TXT v=DMARC1; p=quarantine; rua=mailto:dmarc@...
_mta-sts.example.com TXT v=STSv1; id=20240101 ☑ рекоменд.
autoconfig.example.com CNAME mail.example.com ☑ рекоменд.
autodiscover.example.com CNAME mail.example.com ☑ рекоменд.

Проверка после настройки

# Проверить SPF
dig TXT example.com

# Проверить DKIM
dig TXT stalwart._domainkey.example.com

# Проверить MX
dig MX example.com

# Проверить PTR
dig -x 1.2.3.4

# Комплексный тест доставки и спам-рейтинга
# https://www.mail-tester.com  — отправить тестовое письмо и получить оценку
# https://mxtoolbox.com        — проверить все записи разом

Структура файлов

stalwart-mail/
├── docker-compose.yml
├── .env
├── config/
│   └── rspamd/
│       └── milter.conf       # Rspamd milter bind
└── data/
    ├── stalwart/             # Конфиг и данные Stalwart (персистентные)
    ├── rspamd/               # Баейс Bayes и статистика Rspamd
    └── clamav/
        ├── db/               # Сигнатурные базы ClamAV (freshclam обновляет сам)
        └── run/              # Unix-сокет clamd

Обновление

docker compose pull
docker compose up -d

ClamAV обновляет сигнатуры автоматически через встроенный freshclamd.


Порты

Порт Протокол Назначение
25 SMTP Входящая почта (MX)
465 SMTPS Отправка клиентами (TLS)
587 SMTP STARTTLS Отправка клиентами (STARTTLS)
143 IMAP Получение почты
993 IMAPS Получение почты (TLS)
4190 ManageSieve Управление фильтрами
8080 HTTP WebAdmin / JMAP / autodiscovery
443 HTTPS WebAdmin + JMAP по TLS
Description
No description provided
Readme 51 KiB
Languages
Shell 48.6%
PHP 32.4%
Dockerfile 19%