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 дискового простору.
Змінні оточення
У статті використовуємо плейсхолдери (замініть на власні значення):
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
# Додатково, при нестачі оперативної пам’яті (не рекомендовано в продакшні):
# - 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 |
Посилання на офіційну документацію та ресурси
Офіційна документація