mail-server/README.md
2026-06-30 22:50:17 +03:00

252 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 |