9.3 KiB
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:
- Settings → Server → Hostname — указать FQDN (например,
mail.example.com) - Settings → SMTP → DKIM — сгенерировать ключи для домена
- Accounts — создать почтовые ящики
Подключение Rspamd и ClamAV (Stalwart milters)
После первого запуска добавить в конфигурацию Stalwart (WebAdmin → Settings → Configuration editor или напрямую в файл data/stalwart/etc/config.toml):
[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, они резолвятся внутри сети
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 |