252 lines
9.3 KiB
Markdown
252 lines
9.3 KiB
Markdown
# 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) — обязательно для доставки почты
|
||
|
||
---
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
# 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`):
|
||
|
||
```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, они резолвятся внутри сети `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` | ☑ рекоменд. |
|
||
|
||
---
|
||
|
||
## Проверка после настройки
|
||
|
||
```bash
|
||
# Проверить 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
|
||
```
|
||
|
||
---
|
||
|
||
## Обновление
|
||
|
||
```bash
|
||
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 |
|