8.2.25 Poste.io — Развертывание почтового сервера

The Host Banner Poste.io

Poste.io упрощает развёртывание полноценного почтового сервера: SMTP/IMAP/POP3, веб-админка, веб-почта, антиспам/антивирус. Сложности, которые решаем в этой статье: корректная сеть и порты, выпуск TLS-сертификата, настройка DNS-записей (MX, SPF, DKIM, DMARC), обратная зона (rDNS/PTR) и базовая диагностика. Мы опираемся на актуальные рекомендации проекта: host-сеть Docker, список открываемых портов, требования к rDNS и DNS, а также параметры окружения Poste.io.

Подготовка сервера

Требования

Переменные окружения

В статье используем плейсхолдеры (замените на свои значения):

  • 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/Composer
docker --version
docker-composer version

docker --version

Создание каталога данных

Первым делом создадим каталог для данных и предоставим права к нему:

Создание каталога данных
sudo mkdir -p DATA_DIR
sudo chown -R $USER:$USER DATA_DIR

Создание каталога данных

Обратите внимание: все почтовые данные, логи и конфигурации живут в /data внутри контейнера. Мы примонтируем туда DATA_DIR для удобных бэкапов.

Подготовка docker-compose.yml

Создадим файл Compose с рекомендуемой host-сетью (корректные исходные IP, простой фаервол, готовность к IPv6):

docker-compose.yml
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

docker compose

docker compose ps

Открытие портов в фаерволе

Разрешим почтовые и веб-порты.

UFW -- разрешаем нужные порты
sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
sudo ufw reload
sudo ufw status numbered

UFW

iptables -- разрешаем нужные порты
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>. В мастере создайте администратора, домен и первый почтовый ящик.

Web ui

После этого Вы попадёте в административную панель:

Administrator creating

Настройка дополнительных функций

Настройка 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

docker-compose.yml
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

Проверка работы и тестирование

Просмотр логов контейнера

Проверим, что сервис стартовал без критичных ошибок:

Логи Poste.io
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

Ссылки на официальную документацию и ресурсы