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
      # Додатково, при нестачі оперативної пам’яті (не рекомендовано в продакшні):
      # - 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

Посилання на офіційну документацію та ресурси