1. Зачем свой почтовый сервер
Корпоративная почта на Google Workspace стоит $7 в месяц за каждый ящик при годовой оплате и $8,40 — при помесячной. Команда из пяти человек — это $35 в месяц, или $420 в год. Почта на Яндекс 360 тоже стала платной. А VPS с почтовым сервером — один и тот же счёт за любое число ящиков.
| Критерий | Google Workspace | Stalwart на VPS |
|---|---|---|
| Стоимость (5 ящиков) | $35/мес | Цена одного VPS |
| Число ящиков | Платить за каждый | Без ограничений |
| Хранилище | По тарифу | Весь диск VPS |
| Контроль данных | На серверах Google | Только ваш сервер |
| Зависимость от сервиса | Высокая | Нулевая |
| Настройка | Ничего не нужно | Один раз, по этому гайду |
| Технические навыки | Не нужны | Базовые знания Linux |
Stalwart — это почтовый сервер нового поколения, написанный на Rust. Поддерживает все нужные протоколы: SMTP для отправки/получения, IMAP для почтовых клиентов, JMAP (современный протокол вместо IMAP), CalDAV и CardDAV для календарей и контактов. Всё это в одном процессе без зависимостей.
Честное предупреждение
Почтовый сервер — это не Nginx и не Docker-контейнер. Это сложная система с репутацией IP, DNS-записями, чёрными списками и строгими проверками у получателей. Гайд максимально упрощает процесс, но будьте готовы уделить настройке DNS особое внимание — от этого зависит доставляемость писем.
2. Что нужно до начала
VPS с открытым портом 25
Это самое важное. Порт 25 — стандартный порт для передачи почты между серверами: по нему письма и приходят к вам, и уходят от вас. Провайдеры закрывают его для борьбы со спамом — иногда только исходящий, иногда оба. Политика разная у всех, и мы это поле не сверяем: спросите в поддержке до оплаты, открыты ли входящий и исходящий 25. Минимум RAM: 1 ГБ (лучше 2 ГБ), диск: 20+ ГБ.
Домен
Нужен зарегистрированный домен, например example.ru. Купите у любого регистратора: REG.RU, 2domains, Namecheap. У вас должен быть доступ к управлению DNS-записями домена — именно туда вы будете добавлять MX, SPF, DKIM и DMARC.
Статический IP-адрес
На большинстве VPS он уже есть. Статический — значит не меняется при перезапуске. Именно на этот IP будут указывать DNS-записи и PTR-запись. Проверьте: нет ли вашего IP в спам-базах. Используйте MXToolbox Blacklist Check.
Поддомен для почтового сервера
Рекомендуется использовать поддомен mail.example.ru как FQDN (полное имя) почтового сервера. Основной домен example.ru остаётся для сайта. На mail.example.ru указывает A-запись на IP вашего VPS.
Проверьте порт 25 до покупки VPS
Если VPS уже есть — проверьте, что исходящий порт 25 не заблокирован. Подключитесь к серверу и выполните команду:
timeout 5 bash -c 'exec 3<>/dev/tcp/gmail-smtp-in.l.google.com/25; head -n 1 <&3'Если появилась строка вида 220 mx.google.com ESMTP — порт открыт, можно продолжать. Если команда молчит пять секунд и завершается — порт заблокирован, свяжитесь с провайдером. Ничего доустанавливать не нужно: это встроенная возможность bash.
Учтите: так проверяется только исходящий порт. Входящий с самого сервера не проверить — про него надо прямо спросить поддержку.
Если сервера ещё нет
2 ГБ RAM · 20 ГБ диска
Почтовый сервер хранит и письма, и поисковый индекс: 20 ГБ расходуются быстрее, чем кажется. Открытого порта 25 в наших данных нет, уточняйте в поддержке.
В каталоге под эти требования подходит 105 тарифов, самый дешёвый за 429 ₽/мес (AdminVPS, 2 ГБ, 30 ГБ NVMe).
Добавьте A-запись для поддомена mail
Сделайте это до установки: по этому имени Stalwart сам получит TLS-сертификат, а без рабочей A-записи получить его неоткуда. DNS-записи распространяются до 24 часов (обычно быстрее, 10–30 минут). В панели вашего DNS-провайдера добавьте:
| Тип | Имя | Значение | TTL |
|---|---|---|---|
| A | IP вашего VPS | 3600 |
Это создаст запись mail.example.ru → ваш IP. Stalwart будет использовать этот адрес как своё имя.
3. Установка Stalwart
Stalwart распространяется с официальным скриптом установки. Он сам определяет архитектуру сервера, скачивает нужный бинарник, создаёт системного пользователя, настраивает systemd-службу и запускает сервер. Это самый простой способ.
Шаг 1: обновите систему
Заодно ставим dnsutils — в нём команда dig, которой мы будем проверять DNS-записи в разделах 5 и 6.
apt update && apt upgrade -y
apt install -y dnsutilsШаг 2: установите Stalwart
Скрипт неинтерактивный и вопросов не задаёт — вся настройка будет дальше, в браузере.
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
sudo sh install.shКуда всё установится
- программа —
/usr/local/bin/stalwart - настройки —
/etc/stalwart/ - письма и база —
/var/lib/stalwart/ - логи —
/var/log/stalwart/ - служба systemd —
stalwart
Сразу после установки сервер поднимается в режиме первичной настройки: почтовые порты ещё закрыты, работает только веб-мастер на порту 8080. Пройдём его в разделе 4.
Временный пароль администратора сервер печатает в свой лог при запуске. Достаньте его оттуда — он понадобится через пару минут:
journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'В выводе будет пара строк вида username: admin и password: …. Это одноразовые данные только для мастера настройки — постоянный пароль он выдаст в конце сам.
Шаг 3: откройте порты в файрволе
Stalwart слушает сразу несколько портов. Первым правилом обязательно разрешите SSH — иначе последняя команда отрежет вам доступ к серверу:
# SSH — строго первым, иначе потеряете доступ к серверу
ufw allow 22/tcp
# SMTP — приём почты от других серверов
ufw allow 25/tcp
# SMTP Submission — отправка из почтового клиента
ufw allow 587/tcp
ufw allow 465/tcp
# IMAP — получение почты в клиенте
ufw allow 143/tcp
ufw allow 993/tcp
# HTTPS — веб-панель и автоматический TLS-сертификат
ufw allow 443/tcp
ufw enableПорт 8080 наружу не открываем: мастер настройки работает на нём по обычному HTTP, и пароль администратора ушёл бы по сети открытым текстом. Для первого входа мы пробросим его через SSH — это следующий раздел. Дальше панель живёт на 443 по HTTPS, и 8080 снаружи уже не нужен.
Шаг 4: проверьте, что служба запустилась
systemctl status stalwartДолжно быть Active: active (running). Если статус failed — смотрите детали командой journalctl -u stalwart -n 50.
Альтернатива: Docker Compose
⚠️ Образ переименован
Старый образ stalwartlabs/mail-server на Docker Hub архивирован (последнее обновление ~год назад). Используйте новый stalwartlabs/stalwart:latest. Если на сервере уже стоял старый — он не получает обновлений безопасности.
Stalwart сам управляет TLS через ACME, поэтому отдельный Nginx или Traefik ему не нужен — и ставить их рядом не получится: порт 443 занят самим Stalwart.
services:
stalwart:
image: stalwartlabs/stalwart:latest
container_name: stalwart
restart: unless-stopped
ports:
- "25:25"
- "587:587"
- "465:465"
- "143:143"
- "993:993"
- "443:443"
- "127.0.0.1:8080:8080" # Только localhost: Docker обходит UFW
volumes:
- stalwart-etc:/etc/stalwart
- stalwart-data:/var/lib/stalwart
volumes:
stalwart-etc:
stalwart-data:mkdir -p /opt/stalwart
cd /opt/stalwart
# Создайте здесь docker-compose.yml с конфигом выше
docker compose up -d
# Временный пароль для первого входа
docker logs stalwart 2>&1 | grep -A8 'bootstrap mode'Тома именованные, а не папки хоста — так и в официальной документации: контейнер работает от непривилегированного пользователя и на каталогах хоста спотыкается о права. Дальше всё как в варианте со скриптом, только служба перезапускается командой docker restart stalwart.
4. Первый вход и мастер настройки
Мастер настройки живёт на порту 8080 и работает по обычному HTTP. Наружу мы его не открывали, поэтому пробросим порт через SSH. Выполните на своём компьютере, не на сервере:
ssh -L 8080:localhost:8080 root@ВАШ_IPПока это окно открыто, откройте в браузере http://localhost:8080/admin и войдите с логином admin и временным паролем из лога. Тот же приём работает и для установки через Docker.
Мастер настройки: пять шагов
Значения по умолчанию уже подходят для одиночного VPS. Руками нужно заполнить только первый шаг, на остальных достаточно нажимать Next:
- Server Identity — Server Hostname:
mail.example.ru, Default Email Domain:example.ru. Галочки на сертификате и ключах подписи оставьте включёнными — Stalwart сам получит сертификат Let's Encrypt и сгенерирует DKIM-ключи. - Storage — RocksDB для основной базы, остальные три слоя переиспользуют её. Просто Next.
- Account Directory — встроенный каталог пользователей. Next.
- Logging — логи в файл. Next.
- Automatic DNS Management — оставьте ручной режим: записи мы добавим сами в разделе 5.
Почему имя сервера так важно
При отправке письма ваш сервер представляется получателю командой EHLO, называя своё имя. Если это имя не совпадает с PTR-записью вашего IP — многие почтовые серверы отклонят письмо или пометят как спам. Поэтому здесь должно стоять ровно то же имя, что вы пропишете в PTR в разделе 6.
Сохраните постоянный пароль
На последнем экране мастер создаст постоянную учётную запись администратора и покажет логин с паролем. Больше он их не покажет — выпишите сразу. Затем перезапустите сервер, чтобы новая конфигурация вступила в силу:
systemctl restart stalwartЧерез минуту-другую, когда сертификат будет получен, панель откроется по HTTPS — https://mail.example.ru/admin, и SSH-туннель больше не нужен. Пароль меняется в Account → Credentials → Password, а имя сервера, если понадобится его поправить, — в Settings → Network → General.
5. DNS-записи домена
Это самая важная часть — именно от DNS-записей зависит, попадут ли ваши письма в папку «Входящие» или в спам.
Возьмите готовые записи из панели
Домен вы уже указали в мастере, и DKIM-ключи для него сгенерированы. Осталось забрать записи: Management → Domains → Domains, кнопка «…» в строке домена → View Zone File. Stalwart покажет готовую зону с правильными значениями — её нужно перенести в панель вашего DNS-провайдера.
Какие записи нужно добавить
Обязательный минимум — четыре записи ниже, вот что каждая из них означает. Остальное из зоны (SRV, CAA, MTA-STS) можно добавить позже, а вот autoconfig и autodiscover стоит перенести сразу: по ним почтовые клиенты настраиваются сами, без ручного ввода портов.
MX-запись — куда доставлять почту
Главная запись. Говорит другим серверам: «Для домена example.ru письма нужно отправлять на mail.example.ru». Без неё вам не смогут написать.
example.ru. MX 10 mail.example.ru.SPF — кто имеет право отправлять от имени домена
Защищает от подделки отправителя. Записью TXT вы объявляете: только сервер, указанный в MX, может отправлять письма от @example.ru.
example.ru. TXT "v=spf1 mx -all"DKIM — цифровая подпись писем
Каждое исходящее письмо подписывается криптографическим ключом. Получатель проверяет подпись и убеждается, что письмо не изменялось в пути. Ключи Stalwart создал сам в мастере настройки: ed25519 (короткий) и RSA (длинный — для совместимости).
selector._domainkey.example.ru. TXT "v=DKIM1; k=ed25519; p=..."DMARC — политика для писем, не прошедших SPF/DKIM
Говорит получателям, что делать с письмами, которые пришли от вашего имени, но не прошли SPF или DKIM — отклонять (reject), отправлять в спам (quarantine) или принимать (none). Начните с none, потом ужесточайте.
_dmarc.example.ru. TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.ru"Важно: используйте точные значения из Stalwart
Не копируйте примеры выше — они для иллюстрации. Реальные значения DKIM-ключей и остальные детали берите из зоны, которую показывает панель: Management → Domains → Domains → «…» → View Zone File.
Проверьте, что записи применились
После добавления записей подождите 10–30 минут и проверьте из командной строки:
# MX-запись домена
dig MX example.ru +short
# SPF-запись
dig TXT example.ru +short
# DKIM-запись (подставьте ваш селектор из зоны Stalwart)
dig TXT СЕЛЕКТОР._domainkey.example.ru +short6. PTR-запись: обратный DNS
PTR-запись (она же rDNS, обратный DNS) — это запись, которая по IP-адресу возвращает имя хоста. Обычный DNS работает в сторону «имя → IP», PTR работает в сторону «IP → имя».
Почтовые серверы крупных провайдеров (Gmail, Outlook, Mail.ru) обязательно проверяют PTR. Если проверка провалится — письмо попадёт в спам или будет отклонено. Это один из самых частых камней преткновения при настройке почтового сервера.
PTR не настраивается в панели DNS вашего домена
PTR-запись настраивается у вашего VPS-провайдера, в его панели управления. Только провайдер владеет IP-адресом, поэтому только он может задать обратную запись.
Найдите в панели вашего провайдера раздел «Обратный DNS», «rDNS» или «PTR». Введите значение:
# IP вашего VPS → mail.example.ru
# Например: 185.123.45.67 → mail.example.ruПроверьте через пару минут:
# Замените на IP вашего VPS
dig -x 185.123.45.67 +short
# Должно вернуть: mail.example.ru.Проверка согласованности
Убедитесь, что всё согласовано: IP → mail.example.ru (PTR) и mail.example.ru → IP (A-запись). Обе должны совпадать. И Server Hostname в Stalwart тоже должен быть mail.example.ru.
7. Создание почтовых ящиков
После настройки DNS создайте первый почтовый ящик. Идём в веб-панель: Management → Directory → Accounts и создаём новую учётную запись.
| Поле | Что вводить |
|---|---|
| Username | ivan — только часть до собаки |
| Domain | example.ru — выбирается из списка |
| Full Name | Иван Иванов |
| Credentials | Надёжный пароль |
| Roles | User |
| Email Aliases | Дополнительные адреса, если нужны |
Адрес ящика собирается сам: Username плюс Domain дают ivan@example.ru. Именно этот полный адрес будет логином в почтовом клиенте.
Добавьте алиас postmaster
По стандарту RFC 5321 у каждого почтового домена должен быть адрес postmaster@example.ru: на него шлют отчёты о недоставке и жалобы, и его наличие проверяют некоторые почтовые системы. Добавьте его первому ящику в поле Email Aliases.
Алиасы и перенаправления
Один пользователь может получать почту на несколько адресов. Например, ivan@example.ru, info@example.ru и support@example.ru — все в один ящик. Добавьте нужные адреса в поле Email Aliases аккаунта.
8. Подключение в Thunderbird
У Stalwart пока нет встроенного веб-почтового интерфейса (webmail) — используйте отдельный почтовый клиент. Thunderbird — бесплатный, кроссплатформенный (Windows, macOS, Linux) и отлично работает с IMAP.
Roadmap: разработчики Stalwart планируют встроенный webmail на Rust+Dioxus после выхода стабильной v1.0 (по их публичному roadmap — в течение 2026). Пока используйте внешний клиент — Thunderbird (десктоп) или один из webmail-вариантов в конце раздела.
Откройте Thunderbird: меню ☰ → Add Account → Email (или File → New → Email Account). Введите имя, адрес ivan@example.ru и пароль. Если вы добавили в DNS записи autoconfig из зоны Stalwart, клиент подхватит настройки сам. Если нет — нажмите «Настроить вручную» и введите:
| Параметр | Значение |
|---|---|
| Тип входящей почты | IMAP |
| Сервер входящей почты | mail.example.ru |
| Порт IMAP | 993 |
| Защита IMAP | SSL/TLS |
| Сервер исходящей почты (SMTP) | mail.example.ru |
| Порт SMTP | 587 |
| Защита SMTP | STARTTLS |
| Метод аутентификации | Normal password |
| Имя пользователя | ivan@example.ru |
Настройка мобильного приложения
На Android: используйте FairEmail или K-9 Mail — оба бесплатны. На iOS: встроенное приложение «Почта» — самый простой вариант, или Canary Mail. Настройки IMAP/SMTP — те же, что в таблице выше.
Веб-почта: Bulwark или Roundcube
Если нужен браузерный интерфейс — два варианта на выбор:
🆕 Bulwark (рекомендуется)
Современный JMAP-клиент специально для Stalwart (bulwarkmail.org). Использует JMAP-протокол вместо IMAP — это быстрее и эффективнее по трафику. Помимо почты включает календарь, контакты и файлы. Open source.
Установка: github.com/bulwarkmail/webmail — есть готовый Docker-образ.
Roundcube (классика)
Хорошо проверенный временем веб-клиент через IMAP. Работает с любым почтовым сервером, интерфейс стабильный, документации много. Подходит, если важна предсказуемость.
Конфиг ниже.
Вариант с Roundcube — Docker:
services:
roundcube:
image: roundcube/roundcubemail:latest
container_name: roundcube
restart: unless-stopped
ports:
- "127.0.0.1:8090:80" # Только localhost: Docker обходит UFW
environment:
- ROUNDCUBEMAIL_DEFAULT_HOST=ssl://mail.example.ru
- ROUNDCUBEMAIL_DEFAULT_PORT=993
- ROUNDCUBEMAIL_SMTP_SERVER=tls://mail.example.ru
- ROUNDCUBEMAIL_SMTP_PORT=587
volumes:
- roundcube-db:/var/roundcube/db
volumes:
roundcube-db:mkdir /opt/roundcube && cd /opt/roundcube
# Создайте docker-compose.yml с конфигом выше
docker compose up -dПрефиксы ssl:// и tls:// обязательны: без них Roundcube пойдёт на сервер по открытому каналу, и Stalwart не примет пароль. Том нужен, чтобы настройки и адресная книга пережили пересоздание контейнера.
Порт 8090 привязан к localhost, и заходить в Roundcube проще всего тем же SSH-туннелем, что и в панель: ssh -L 8090:localhost:8090 root@ВАШ_IP. Публичный адрес с HTTPS на этом же сервере не сделать — порт 443 занят Stalwart, и Nginx или Caddy рядом просто не запустятся. Если веб-почта нужна всем и с любого устройства, выносите её на отдельный сервер.
9. Проверка доставляемости
Прежде чем начать использовать сервер по-настоящему — проверьте доставляемость. Иначе вы будете думать, что письма отправились, а они тихо ложатся в спам.
mail-tester.com — главный инструмент
Зайдите на mail-tester.com. Сайт даёт вам временный адрес вида test-abc123@mail-tester.com. Отправьте на него письмо из Thunderbird. Затем нажмите «Check your score» на сайте.
Вы получите оценку по десятибалльной шкале с детальным отчётом: что настроено правильно, что нет, и как исправить. Стремитесь к 9/10 или 10/10. Бесплатно даётся три проверки в сутки, поэтому сначала прочитайте отчёт целиком и исправьте всё разом, а не по одной записи за раз.
| Что проверяет mail-tester | Критичность |
|---|---|
| SPF-запись | Высокая |
| DKIM-подпись на письме | Высокая |
| DMARC-запись | Средняя |
| PTR / обратный DNS | Высокая |
| IP не в блок-листах | Высокая |
| Правильный HELO hostname | Средняя |
| HTML-письмо не выглядит как спам | Низкая |
Проверка через MXToolbox
Зайдите на mxtoolbox.com → MX Lookup → введите ваш домен. Убедитесь, что MX-запись найдена и ведёт на ваш сервер. Там же в разделе Blacklist Check — проверьте, что ваш IP не в спам-листах.
Отправьте тестовое письмо на Gmail
Отправьте письмо на любой Gmail-адрес. В Gmail нажмите на письмо → кнопка "⋮" → «Show original» / «Показать оригинал». Вы увидите заголовки письма. Проверьте строки:
# Хорошо выглядит так:
Authentication-Results: mx.google.com;
dkim=pass header.i=@example.ru;
spf=pass smtp.mailfrom=example.ru;
dmarc=pass (p=NONE) action=none header.from=example.ru
# Если dkim=fail или spf=fail — проверьте DNS-записи