Собственный почтовый сервер на базе poste.io
Приветствую.
Цифровая независимость — это не только вектор, по которому двигается страна, но и тенденция, которую я замечаю среди малых бизнесов независимо от направления деятельности. Крупный бизнес может позволить себе использовать облака условного «Сбера» или «Яндекса», что малому бизнесу может быть не по карману. Тогда они задумываются: «Может, дешевле выйдет собрать свою серверную инфраструктуру?»
Именно с таким вопросом в начале года к нам пришла одна небольшая Московская компания. Одним из элементов инфраструктуры было поднятие собственного почтового сервера на базе Mailcow.
Почему для малого бизнеса удобен свой почтовый сервер:
Контроль над данными. Вся переписка и пользовательские данные хранятся внутри компании, а не у внешнего провайдера. Можно подключить различное анализирующее ПО.
Гибкость настроек. Возможность тонко настроить фильтрацию спама, политики безопасности, автоматические правила и маршруты доставки.
Снижение долгосрочных затрат. Да, на старте требуется вложение в инфраструктуру, но со временем это может быть дешевле, чем оплачивать подписки для десятков сотрудников. С ростом компании инфраструктуру легко масштабировать или вовсе перевезти в ЦОД.
Брендирование почтовых адресов. Например,
info@company.ru
илиsupport@company.ru
выглядит солиднее, чемcompany@gmail.com
. Также, можно создавать почтовые ящики, используя доменные адреса проектов или областей, например,order@obrabotka-metala.ru
илиcontact@expo2025.ru
.Быстрое управление доступами. Можно мгновенно заблокировать ящик уволенного сотрудника или сохранить доступ к переписке.
Снижение зависимости от сторонних сервисов. Не нужно бояться, что провайдер изменит тарифы, заблокирует аккаунт или решит "оптимизировать" функциональность. Среднего сервера хватит на годы вперёд, из расходов только электричество и обслуживание накопителей.
Что такое почтовый сервер?
Почтовый сервер — это совокупность программного обеспечения и протоколов, обеспечивающих приём, доставку и хранение электронной почты.
Основные компоненты:
Протоколы:
SMTP (25/587/465) — для передачи и отправки почты.
POP3 (110/995) — скачивает письма на устройство (обычно удаляет их с сервера).
IMAP (143/993) — даёт возможность работать с письмами на сервере (синхронизация, папки).
MTA (Mail Transfer Agent): получает письма от отправителей (через SMTP), проверяет и передаёт их другим серверам до достижения получателя.
MDA (Mail Delivery Agent): после передачи от MTA кладёт письма в почтовые ящики (Maildir/mbox), может фильтровать спам и вызывать пользовательские скрипты.
MUA (Mail User Agent): почтовый клиент (Outlook, Thunderbird или веб-почта), который через IMAP/POP3 получает письма с сервера и отправляет их на MTA по SMTP.
Антиспам/антивирус: проверяют входящие сообщения, помечают или удаляют вредоносное и нежелательное содержимое.
Аутентификация и хранение: база учётных записей (пароли, квоты) и физическое хранилище для писем (файловая система или СУБД).
Шифрование (SSL/TLS): защищает соединения клиент–сервер и между серверами.
Пара слов о Mailcow и Docker Mailserver
Оба решения представляют собой «готовые решения» для организации self-hosted почтового сервера, однако они находятся на разных «уровнях».
Mailcow (оф. сайт) — практически ультимативное решение «всё-в-одном». Помимо стандартного функционала почтового сервера, он предоставляет веб-почту SOGo и многофункциональную админ-панель.
На мой взгляд, чересчур перегруженное решение. Если у вас много ящиков, несколько доменов и отдельный сервер под всё это, возможно, тогда оно оправдано.
Минимальные системные требования: 6 ГБ ОЗУ и 20 ГБ ПЗУ (без учёта писем).
Docker Mailserver (оф. сайт) — полная противоположность. Это лёгкий почтовый сервер, обладающий всеми возможностями организации почты, но без админки и веб-почты. Он у нас на салфетке последние полтора года исправно работал, пока мы не решили переехать на более производительный VPS. Про то, как развернуть Docker Mailserver, есть две статьи: первая и вторая.
Главный минус Docker Mailserver в том, что он крайне минималистичен. Отсутствие админ-панели накладывает ряд ограничений на опыт использования: все действия выполняются непосредственно на сервере, в консоли. Если один раз настроил и «забыл», это ещё приемлемо, но когда нужно добавлять ящики, управлять банами и карантином, пользоваться становится некомфортно.
Минимальные системные требования: 512 МБ ОЗУ (2 ГБ рекомендовано).
Переход на poste.io
Совсем недавно мы переехали на новый, более производительный VPS, и острой необходимости «ужиматься» уже не было. Мы решили сменить Docker Mailserver на что-то другое.
Сначала я подумал о Mailcow, но достаточно быстро отбросил этот вариант, поскольку требуемые «корове» ресурсы не оправданы нашим объёмом потребления, и начал искать альтернативы.
В итоге был найден poste.io
(оф. сайт). Это нечто среднее между упомянутыми решениями: poste.io предоставляет простенькую админ-панель и веб-почту на основе Roundcube.
Строгих системных требований у poste.io нет, есть лишь рекомендация: «свободное ОЗУ, желательно побольше».
Poste.io
поставляется в двух версиях: FREE и PRO. Платная версия отличается наличием дополнительных логов и расширенных настроек.
Для наших задач достаточно бесплатной версии. О том, как её развернуть и настроить — далее в статье.
Подготовка сервера
Перед запуском poste.io
необходимо подготовить сервер: подключить домен, открыть нужные порты и, при необходимости, настроить веб-сервер.
Почтовый домен
Прежде чем приступать к дальнейшим действиям, нужно определиться с почтовым доменом. Обычно это mail.<ваш_домен>
, но можно использовать любой другой.
В DNS-записях вашего домена укажите A-запись, указывающую на IP вашего VPS.
Например:
PTR-запись
Чтобы IP-адрес ссылался на почтовый домен, нужно установить PTR-запись. Обычно это делается через поддержку хостинга или провайдера.
Небольшая история: обратившаяся к нам компания арендует "белый" IP-адрес у провайдера интернета и когда нам нужно было настроить PTR-запись нам пришлось дозваниваться провайдеру и долго продираться к оператору. Оператор нам помочь не смог, но отправил нас в Telegram-поддержку, в которой буквально за пять минут установили нужную запись.
В TimeWeb эта настройка находится на вкладке «Сеть» у сервера:
У других хостеров может быть аналогичный интерфейс, а может и отсутствовать — в таком случае придётся обращаться в поддержку для установки записи. Обратите внимание: «белые» IP-адреса провайдера изменить вручную не получится, только через поддержку.
Открытие портов
Для работы poste.io требуются следующие порты:
25 — SMTP — для обработки входящих писем от удалённых почтовых серверов.
80 — HTTP — перенаправление на HTTPS и аутентификация для сервиса Let’s Encrypt.
110 — POP3 — стандартный протокол доступа к почтовому ящику, перед аутентификацией клиента требуется STARTTLS.
143 — IMAP — стандартный протокол доступа к почтовому ящику, перед аутентификацией клиента требуется STARTTLS.
443 — HTTPS — доступ к административной панели или веб-клиенту почты.
465 — SMTPS — устаревший порт для SMTP с шифрованием.
587 — MSA — SMTP-порт, преимущественно используемый почтовыми клиентами после STARTTLS и аутентификации.
993 — IMAPS — альтернативный порт для IMAP с шифрованием с начала соединения.
995 — POP3S — порт POP3 с шифрованием с начала соединения.
4190 — Sieve — удалённые настройки Sieve.
Если в системе нет фаервола, можно пропустить этот шаг или ознакомиться со статьёй «Гайд по первоначальной настройке VPS» и настроить его по инструкции.
Если у вас используется фаервол, отличный от ufw
, вы наверняка знаете, как открыть нужные порты.
Для открытия портов в ufw
выполните команды:
sudo ufw allow 25/tcp
sudo ufw allow 80/tcp
sudo ufw allow 110/tcp
sudo ufw allow 143/tcp
sudo ufw allow 443/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 993/tcp
sudo ufw allow 995/tcp
sudo ufw allow 4190/tcp
Можно открыть все порты одной командой, но это не всегда удобно:
sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
Внимание! У некоторых хостинг-провайдеров почтовые порты могут быть закрыты с их стороны. В этом случае необходимо обратиться в поддержку для их открытия.
Веб-сервер
Веб-сервер нужен, когда на одном сервере вместе с poste.io развёрнуты и другие сервисы (например, сайт). Если сервер используется только для почты, этот шаг можно пропустить.
Nginx
Если вы используете Nginx, добавьте следующие настройки в конфигурационный файл:
server {
listen 80;
server_name mail.codeonanapkin.ru;
location / {
proxy_pass http://poste:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
server_name mail.codeonanapkin.ru;
ssl_certificate /etc/letsencrypt/live/mail.codeonanapkin.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.codeonanapkin.ru/privkey.pem;
location / {
proxy_pass https://poste:443;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Обратите внимание на пути ssl_certificate
и ssl_certificate_key
— замените их на актуальные для ваших сертификатов. Также замените mail.codeonanapkin.ru
на ваш почтовый домен.
Caddy
Для Caddy настройки ещё проще. Добавьте в Caddyfile
следующий блок:
http://mail.codeonanapkin.ru {
reverse_proxy poste:80
}
https://mail.codeonanapkin.ru {
tls info@pressanybutton.ru
reverse_proxy poste:443 {
transport http {
tls_insecure_skip_verify
}
}
}
Замените mail.codeonanapkin.ru
на ваш почтовый домен, а в блоке tls
укажите адрес электронной почты для получения сертификата.
Запуск poste.io в Docker Compose
Docker Compose удобнее, чем запуск контейнера напрямую.
Создадим и сразу откроем директорию, в которой будут находиться файлы poste:
mkdir poste && cd poste
Создадим новый файл docker-compose.yaml
и сразу откроем его для редактирования:
nano docker-compose.yaml
Внутри файла пропишем следующий конфиг:
services:
poste:
image: analogic/poste.io
container_name: poste
hostname: mail.codeonanapkin.ru
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "25:25"
- "110:110"
- "143:143"
- "587:587"
- "993:993"
- "995:995"
- "4190:4190"
environment:
- LETSENCRYPT_EMAIL=info@pressanybutton.ru
- LETSENCRYPT_HOST=mail.codeonanapkin.ru
- VIRTUAL_HOST=mail.codeonanapkin.ru
volumes:
- ./data/mail:/data
- /etc/localtime:/etc/localtime:ro
# Необязательно, если не используется веб-сервер.
#networks:
# default:
# name: caddy_net
# external: true
На что стоит обратить внимание:
Порты 80 и 443. Если используется внешний веб-сервер, их необходимо удалить или закомментировать.
hostname
,LETSENCRYPT_HOST
иVIRTUAL_HOST
. Указываем домен почтового сервера.LETSENCRYPT_EMAIL
. Указываем почту для получения сертификата.Блок
networks
. Если используется веб-сервер, нужно раскомментировать этот блок и заменитьcaddy_net
на название сети веб-сервера.
Сохраняем файл, нажав CTRL+S
, и выходим, нажав CTRL+X
.
Запускаем почтовый сервер:
docker compose up -d
Начнётся процесс скачивания образа:
После того как сервис запустится:
Настройка poste
Откроем в браузере почтовый домен и увидим страницу установки:
Указываем почту администратора и пароль.
Почту нужно указать в том же домене, что и почтовый сервер!
После сохранения попадаем в админку:
Получение сертификата
Первым делом необходимо получить сертификат для домена. Переходим в раздел System settings → TLS certificate и нажимаем кнопку «Issue free Let’s Encrypt certificate» или загружаем собственные файлы сертификата:
Если выбираем бесплатный вариант, после нажатия появится страница:
На ней ставим галочку в поле «Enabled» и сохраняем изменения. Ждём, пока появится лог запроса сертификата:
Если в конце лога написано
LEScript.INFO: Done !!§§!
значит, всё прошло успешно. Когда вернёмся на предыдущую страницу, увидим:
Настройка DNS
Генерация DKIM-ключа
Прежде чем переходить к настройке DNS, необходимо сгенерировать DKIM-ключ.
Переходим в Virtual domains → ваш домен. На открывшейся странице нажимаем кнопку «Create a new key»:
Моя запись выглядит так:
s20250603135._domainkey.codeonanapkin.ru. IN TXT "k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6/MTXE1xZ5mQO2LiOKITc79nzkW8FDn8ac1KUSPBlx/pUdw5PZQpf2r4xTRhlGXwGxrZfUW2DqNsSXEmSeP0Qk48+Cx8XPJ40Rr5R2d9TFBsgfvjhS8tRSt6hDthqXTwP1LwE5vyQax3Eync1CkgRniSunwJX7Q9w3eHRhabvve1+TVrluOcklJMqos1FIQE3o6l91T7b2Yxv4GmIeKT7KMYqhw3E8tVnI5UadQHAIMe+2yxp3bGnwiMpVIG1l+mT2efvF2nUEeEBje7P75PZlTPnXuT30yBaneoMw/8RiHl3G6onzdpvA8G+DfICYNYWVicOZeE51ytRPzJiAj4dwIDAQAB"
Отсюда нам нужны два значения:
Хост для записи:
s20250603135._domainkey.codeonanapkin.ru
Сама запись (без кавычек):
k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6/MTXE1xZ5mQO2LiOKITc79nzkW8FDn8ac1KUSPBlx/pUdw5PZQpf2r4xTRhlGXwGxrZfUW2DqNsSXEmSeP0Qk48+Cx8XPJ40Rr5R2d9TFBsgfvjhS8tRSt6hDthqXTwP1LwE5vyQax3Eync1CkgRniSunwJX7Q9w3eHRhabvve1+TVrluOcklJMqos1FIQE3o6l91T7b2Yxv4GmIeKT7KMYqhw3E8tVnI5UadQHAIMe+2yxp3bGnwiMpVIG1l+mT2efvF2nUEeEBje7P75PZlTPnXuT30yBaneoMw/8RiHl3G6onzdpvA8G+DfICYNYWVicOZeE51ytRPzJiAj4dwIDAQAB
Создание записей
Заходим в панель управления DNS-записями вашего домена. На примерах ниже используются скриншоты из TimeWeb, но суть процесса одинакова для любых других панелей.
Необходимо создать или отредактировать пять записей:
SPF-запись
Это TXT-запись, которая указывает, какие сервера имеют право отправлять письма от имени вашего домена. Если у вас уже есть SPF, нужно просто отредактировать её, добавив директиву mx
.
Пример значения:
v=spf1 mx ~all
Такая запись означает, что разрешены отправки с тех же серверов, куда приходят письма (mx
), и все остальные будут помечены как «soft-fail» (~all).
DKIM-запись
DKIM (DomainKeys Identified Mail) позволяет подписывать исходящие письма и проверять их подлинность на стороне получателя. Ранее мы сгенерировали пару ключей: публичный и приватный. Приватный ключ хранится на почтовом сервере, а публичный нужно вставить в DNS.
В панели добавляем TXT-запись, где:
Имя (хост) — это селектор, полученный в админке poste.io (например,
s20250603135._
domainkey.codeonanapkin.ru
).Значение — всё содержимое после
“
и до”
, начинающееся сk=rsa; p=…
.
Пример:
Хост: s20250603135._domainkey.codeonanapkin.ru
Значение: k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6/MTXE1xZ5mQO2LiOKITc79nzkW8FDn8ac1KUSPBlx/pUdw5PZQpf2r4xTRhlGXwGxrZfUW2DqNsSXEmSeP0Qk48+Cx8XPJ40Rr5R2d9TFBsgfvjhS8tRSt6hDthqXTwP1LwE5vyQax3Eync1CkgRniSunwJX7Q9w3eHRhabvve1+TVrluOcklJMqos1FIQE3o6l91T7b2Yxv4GmIeKT7KMYqhw3E8tVnI5UadQHAIMe+2yxp3bGnwiMpVIG1l+mT2efvF2nUEeEBje7P75PZlTPnXuT30yBaneoMw/8RiHl3G6onzdpvA8G+DfICYNYWVicOZeE51ytRPzJiAj4dwIDAQAB
DMARC-запись
DMARC (Domain-based Message Authentication, Reporting & Conformance) устанавливает политику обработки писем, которые не проходят SPF или DKIM-проверку, и задаёт адрес для отчётов. Добавляем TXT-запись с хостом _dmarc
и значением:
v=DMARC1; p=none; rua=mailto:dmarc-reports@your-domain.com
Здесь p=none
означает, что политика проверки будет только «мониторинговой»: письма, не прошедшие SPF/DKIM, не будут отклоняться, но вы получите отчёт на указанный адрес. Замените dmarc-reports@your-domain.com
на реальный почтовый ящик для получения сводок.
autoconfig (CNAME)
Эта запись помогает почтовым клиентам (например, Thunderbird, Outlook) автоматически находить настройки сервера (IMAP/SMTP). Создаём CNAME-запись:
Хост:
autoconfig
.Значение (указываем ваш почтовый домен): например,
mail.codeonanapkin.ru
.
При запросе autoconfig.<ваш_домен> почтовый клиент получит адрес сервера для входящей и исходящей почты.
MX-запись
Основная запись, указывающая, куда отправлять входящую почту. Для основного домена (или поддомена) указываем:
Хост: оставляем пустым или ставим
@
(зависит от панели).Приоритет: 10 (или любое другое значение; чем меньше цифра, тем выше приоритет).
Значение: ваш почтовый домен (например,
mail.codeonanapkin.ru
).
Таким образом все письма, адресованные domain.ru, будут доставляться на сервер mail.codeonanapkin.ru
.
После добавления всех записей необходимо дождаться их распространения (обычно 1–2 часа, но иногда до 24 часов).
На этом основная настройка DNS завершена.
Тестирование
После того как DNS-записи «распушились», проверяем их корректность онлайн-инструментами и отправляем тестовые письма.
SPF Checker
Переходим на:
https://poste.io/spf
Вводим ваш почтовый домен и смотрим результат. Если всё настроено верно, инструмент подтвердит, что в SPF-записи включён mx
, и она валидна.
DKIM Checker
Переходим на:
https://poste.io/dkim
Вводим основной домен (например, codeonanapkin.ru
) и селектор (например, s20250603135
). Инструмент проверит, что публичный ключ доступен в DNS и соответствует подписи.
DMARC Checker
Переходим на:
https://poste.io/dmarc
Указываем основной домен. Проверяем, что DMARC-запись найдена, валидна и политика установлена в none
.
Если какой-то из чекеров выдаёт ошибку, возвращаемся в панель DNS, вносим корректировки и снова ждём распространения записей.
Отправка почты
Чтобы убедиться, что почтовый сервер работает правильно и письма не попадают в спам, используем сервис Mail-Tester:
Открываем веб-почту по адресу
https://<ваш_почтовый_домен>/webmail/
или нажимаем WebMail в правом верхнем углу админки poste.io.
Вводим логин и пароль администратора и заходим в почтовый ящик.
Нажимаем «Написать сообщение», вводим адрес, предоставленный Mail-Tester, и произвольный текст письма:
Отправляем письмо.
Переходим на сайт Mail-Tester, видим результат проверки (рейтинг, какие записи пройдены, а какие требуют доработки).
Если оценка близка к 10/10 и письма не попадают в спам, значит все записи работают корректно.
Дополнительно можно отправить письмо на личный почтовый ящик, чтобы убедиться, что оно доходит и не попадает в папку «Спам»:
Заключение
Poste.io оказался отличным компромиссом между «перегруженной коровой» (Mailcow) и «недокрученным DMS» (Docker Mailserver). Админ-панель и встроенная веб-почта упрощают управление, а простая настройка DNS и интеграция с Let’s Encrypt делают работу ещё удобнее.
Да, у платной версии есть дополнительные возможности (расширенные логи, более тонкие настройки), но для большинства задач бесплатной функциональности вполне достаточно. Можно было собрать сервер «по кускам» из разных компонентов, но это лишь усложнило бы поддержку и настройку.
Буду рад, если статья окажется полезна для вас и вы положительно её оцените. Подписывайтесь на наш Telegram‑канал «Код на салфетке», у нас много интересного как для новичков, так и профессионалов!