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