8.2.25 Poste.io — Развертывание почтового сервера
Poste.io упрощает развёртывание полноценного почтового сервера: SMTP/IMAP/POP3, веб-админка, веб-почта, антиспам/антивирус. Сложности, которые решаем в этой статье: корректная сеть и порты, выпуск TLS-сертификата, настройка DNS-записей (MX, SPF, DKIM, DMARC), обратная зона (rDNS/PTR) и базовая диагностика. Мы опираемся на актуальные рекомендации проекта: host-сеть Docker, список открываемых портов, требования к rDNS и DNS, а также параметры окружения Poste.io.
Подготовка сервера
Требования
- Заказанная услуга Виртуального или Выделенного сервера.
- root‑доступ или sudo‑пользователь.
- Активное Доменное имя.
- Доступ к управлению DNS-записями Вашего домена.
- Ресурсы: 2 vCPU, 4 GB RAM, 20 GB disk space.
Переменные окружения
В статье используем плейсхолдеры (замените на свои значения):
SERVER_IP
— публичный IP сервераDOMAIN_NAME
— корневой домен (пример:example.com
)MAIL_HOSTNAME
— A-запись почтового узла (пример:mail.example.com
)TIMEZONE
— таймзона системы (пример:Europe/Kyiv
)DATA_DIR
— каталог данных на хосте (пример:/srv/poste/data
)ADMIN_EMAIL
— ваша админ-почта (создадите в админке)
Установка
Подготовьте Docker и Compose
Установите Docker и Compose стандартным способом (если не стоят). Полную инструкцию смотрите в нашей статье: Docker and Docker Compose.
Проверим версии:
docker --version
docker-composer version
Создание каталога данных
Первым делом создадим каталог для данных и предоставим права к нему:
sudo mkdir -p DATA_DIR
sudo chown -R $USER:$USER DATA_DIR
Обратите внимание: все почтовые данные, логи и конфигурации живут в /data внутри контейнера. Мы примонтируем туда DATA_DIR для удобных бэкапов.
Подготовка docker-compose.yml
Создадим файл Compose с рекомендуемой host-сетью (корректные исходные IP, простой фаервол, готовность к IPv6):
version: "3.8"
services:
poste:
image: analogic/poste.io:2
container_name: poste
hostname: MAIL_HOSTNAME
restart: unless-stopped
network_mode: host # рекомендованный режим
environment:
- TZ=TIMEZONE
# При проксировании через внешний Nginx/Traefik можно снять редирект на HTTPS:
# - HTTPS=OFF
# Дополнительно, при нехватке RAM (не рекомендуется в бою):
# - DISABLE_CLAMAV=TRUE
# - DISABLE_RSPAMD=TRUE
# Интеграция при необходимости:
# - ELASTICSEARCH=127.0.0.1:9200
volumes:
- DATA_DIR:/data
Альтернатива без host-сети: вместо network_mode: host
можно использовать ports:
и пробросить 25, 80, 110, 143, 443, 465, 587, 993, 995 и, при необходимости, 4190 (Sieve). Но проект рекомендует host-сеть.
Запуск контейнера
Поднимем сервис и убедимся, что он работает:
docker compose up -d
docker compose ps
Открытие портов в фаерволе
Разрешим почтовые и веб-порты.
sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
sudo ufw reload
sudo ufw status numbered
sudo iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143,443,465,587,993,995,4190 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -j DROP
Первичный вход в админку
Откроем админку/веб-почту в браузере по адресу: https://<MAIL_HOSTNAME>
.
В мастере создайте администратора, домен и первый почтовый ящик.
После этого Вы попадёте в административную панель:
Настройка дополнительных функций
Настройка Sieve-фильтров (порт 4190)
Sieve — это стандартизированный язык серверной фильтрации почты (RFC 5228). Правила выполняются на стороне сервера, ещё до попадания письма в клиент: сортировка по папкам, переадресация, автоответчики, антиспам-метки и т. п. Редактировать правила удобно из Roundcube/Thunderbird через протокол ManageSieve (порт 4190).
Включим управление правилами доставки писем:
ss -lntp | grep :4190 || echo "Откройте порт 4190 (см. UFW/iptables выше)"
Зачем это нужно
Единые серверные правила работают для всех клиентов и устройств одинаково (в отличие от локальных фильтров в почтовом клиенте).
Интеграция с Elasticsearch
Elasticsearch — движок полнотекстового поиска и аналитики. В контексте Poste.io он полезен для агрегации и поиска по почтовым событиям и логам (доставки, отказы, спам-оценки, карантин и т. д.), построения дашбордов и расследования инцидентов (в паре с Kibana/OpenSearch). Функция необязательная, но упрощает мониторинг и аудит почтовой системы.
Добавьте следующую строку в Ваш docker-compose.yml
в раздел environment
environment:
- ELASTICSEARCH=127.0.0.1:9200
Резервное копирование данных
Сохраним критичные данные из примонтированного каталога DATA_DIR
:
docker compose down
tar -C $(dirname DATA_DIR) -czf /root/poste-backup-$(date +%F).tar.gz $(basename DATA_DIR)
docker compose up -d
Проверка работы и тестирование
Просмотр логов контейнера
Проверим, что сервис стартовал без критичных ошибок:
docker logs -f poste
Проверка слушающих портов
Убедимся, что нужные TCP-порты открыты и заняты процессами:
ss -lntp | egrep ':25|:80|:110|:143|:443|:465|:587|:993|:995|:4190'
Быстрый разбор колонок ss -lntp
- LISTEN — сокет ожидает входящие соединения
- Local Address:Port — куда именно «привязан» порт
- 0.0.0.0:PORT — слушает на всех IPv4-интерфейсах
- [::]:PORT или *:PORT — слушает на всех IPv6
- 127.0.0.1:PORT — доступно только локально
- users:(… pid=…) — какой процесс держит порт (имя и PID).
Типичные проблемы
Ошибка / Симптом | Причина | Решение | Диагностика | |
---|---|---|---|---|
Сертификат не выпускается | Порт 80 занят/закрыт | Освободите 80 или проксируйте /.well-known на Poste.io; повторите попытку |
ss -lntp или grep :80\ |
|
Письма попадают в спам | Нет/некорректные SPF/DKIM/DMARC, отсутствует rDNS | Исправьте записи; запросите PTR у провайдера | dig , nslookup , подсказки в админке |
|
Отправка на внешние домены не идёт | Провайдер блокирует порт 25 | Запросите разблокировку / используйте смарт-релея | telnet mx.gmail.com 25 с сервера |
|
Не открывается админка по HTTPS | Конфликт портов 443 | Освободите 443 на хосте или используйте прокси + HTTPS=OFF + HTTP_PORT/HTTPS_PORT |
ss -lntp или grep :443 |
|
IMAP/POP3 не работает | Порты/фаервол | Разрешите порты в UFW/iptables | ufw status , iptables -S |
Ссылки на официальную документацию и ресурсы
Официальная документация