8.2.26 Встановлення та налаштування Mailcow на сервері
Mailcow — це self-hosted поштовий серверний пакет, зібраний навколо Docker-контейнерів. Він потрібен тим, хто втомився довіряти листування «великим добрим корпораціям» і хоче тримати листи під власним контролем.
Основні особливості:
- Контейнеризація: усе запускається в Docker, кожен сервіс ізольований (Postfix, Dovecot, Rspamd, ClamAV, MariaDB, Redis тощо).
- Web-інтерфейс: зручна адмінка на PHP/NGINX для керування доменами, поштовими скриньками, аліасами, антиспамом.
- Безпека: вбудовані DKIM, SPF, DMARC, підтримка TLS, автоматичне оновлення сертифікатів через ACME/Let’s Encrypt.
- Антиспам/антивірус: фільтрація листів через Rspamd і ClamAV.
- Гнучкість: підтримка SOGo (вебкалендар, контакти, webmail), API для інтеграції, розширюваність за рахунок налаштування сервісів.
Підготовка сервера
Вимоги
- Віртуальний або виділений сервер.
- Відкриті вхідні TCP-порти: 25, 80, 443, 110, 143, 465, 587, 993, 995, 4190.
- Активне доменне ім’я для
MAILCOW_HOSTNAME
, і коректна зворотна зона PTR на цей домен. - root-доступ або користувач із правами sudo.
Змінні середовища
SERVER_IP
— зовнішня IP-адреса сервера, на якому запускається Mailcow.MAILCOW_HOSTNAME
— повне доменне ім’я, яке буде використовуватися як основний хост поштового сервісу.MAILCOW_TIMEZONE
— часовий пояс сервера (наприклад,Europe/Kyiv
), необхідний для коректного логування і планувальника.ADMIN_EMAIL
— e-mail адміністратора, куди надходитимуть сповіщення та звіти.BACKUP_DIR
— директорія для зберігання резервних копій (рекомендується окремий диск або мережеве сховище).
Встановлення залежностей
Встановіть рекомендовані залежності:
sudo apt update && sudo apt install -y git openssl curl gawk coreutils grep jq
Встановлення Docker і Compose
Повну інструкцію дивіться в нашій статті: Docker and Docker Compose
Необхідні мінімальні версії: Docker >= 24.0.0, Docker Compose >= 2.0. Перевірте:
docker --version
docker compose version
Якщо версії нижчі, оновіть Docker/Compose за інструкцією вище перед продовженням.
Клонування репозиторію Mailcow
Отримайте актуальний код Mailcow з офіційного репозиторію GitHub, щоб розгорнути поштовий стек в останній стабільній версії.
sudo mkdir -p /opt && cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd /opt/mailcow-dockerized
Генерація конфігурації
Для генерації стартової конфігурації виконайте скрипт:
./generate_config.sh
Вкажіть:
- Mail server hostname (FQDN): введіть
MAILCOW_HOSTNAME
(наприклад,mail.example.com
). - Timezone:
MAILCOW_TIMEZONE
(наприклад,Europe/Kyiv
).
Скрипт створить mailcow.conf
, у якому ви за потреби налаштуєте порти та додаткові SAN/серверні імена.
Підказка: у разі потреби внести ручні правки в конфігураційний файл MailCow, виконайте команду:
nano /opt/mailcow-dockerized/mailcow.conf
Відкриття портів у фаєрволі
Дозволимо поштові та вебпорти.
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
Налаштування DNS-записів
Для коректної роботи пошти необхідно буде налаштувати DNS-записи Вашого домену MAILCOW_HOSTNAME
. Детальніше з процесом налаштування можете ознайомитися в нашій інструкції.
Запуск контейнерів
Запустіть контейнери та підтягніть необхідні образи:
docker compose pull
docker compose up -d
Після старту відкрийте https://MAILCOW_HOSTNAME/admin
і увійдіть під логіном admin
, паролем moohoo
. Одразу змініть пароль адміністратора.
Після виконання зазначених дій Ви потрапите в адміністративну панель:
Перевірка портів/доступності
Переконайтеся, що потрібні порти прослуховуються і доступні ззовні (особливо 25, 80, 443, 587, 993, 995, 110, 143, 4190):
ss -tlpn | grep -E -w '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).
Налаштування сервісу
Додавання доменного імені
Створіть домен і вкажіть його як основний для приймання та відправлення пошти. Після додавання система автоматично запропонує згенерувати DKIM-ключ і підкаже необхідні DNS-записи для коректної роботи (MX, SPF, DKIM, DMARC).
Для цього перейдіть E-mail → Конфігурація → Додати домен
Налаштування додаткових функцій
Реверс-проксі (Nginx/Traefik)
- Прив’яжіть вебінтерфейс Mailcow до
127.0.0.1
черезHTTP_BIND/HTTPS_BIND
, а назовні публікуйте через проксі. - Якщо використовуєте домен інтерфейсу, відмінний від
MAILCOW_HOSTNAME
, заповнітьADDITIONAL_SERVER_NAMES
(через кому, без пробілів) і тільки потім перезапустіть стек.
docker compose down && docker compose up -d
SSL і Let’s Encrypt
Типово вбудований ACME-контейнер випустить сертифікат для MAILCOW_HOSTNAME
та імен із ADDITIONAL_SAN
. Для примусового оновлення сертифікатів перезапустіть ACME-контейнер:
docker compose restart acme-mailcow
Підказка: для коректного випуску сертифіката переконайтеся в тому, що 80/TCP порт відкритий.
Резервні копії та відновлення
Mailcow надає скрипт helper-scripts/backup_and_restore.sh
для резервного копіювання/відновлення.
Виконайте зазначену команду, перебуваючи в корені проєкту MailCow(/opt/mailcow-dockerized
).
# Резервна копія всіх компонентів із видаленням бекапів старше 14 днів
sudo ./helper-scripts/backup_and_restore.sh backup all --delete-days 14 --target BACKUP_DIR
# Відновлення з каталогу з бекапами
sudo ./helper-scripts/backup_and_restore.sh restore --target BACKUP_DIR
Плануйте CRON-завдання та перевіряйте журнали виконання бекапу.
Безпека
Керуйте політиками банів у Fail2Ban, для цього перейдіть у System і виберіть розділ Configuration.
У відкритому вікні виберіть Options і відкрийте розділ Fail2Ban parameters.
Оновлення
Для виконання оновлень у директорії проєкту виконайте команду:
./update.sh
Поширені помилки
Помилка / Симптом | Причина | Рішення | Діагностика |
---|---|---|---|
ACME не випускає/не подовжує сертифікат | Порт 80 закритий або некоректні ADDITIONAL_SAN /налаштування проксі |
Відкрийте 80/TCP, скоригуйте SAN/проксі та перезапустіть acme-mailcow |
docker compose logs -f acme-mailcow |
Немає вхідної пошти | 25/TCP закритий ззовні або фільтрується провайдером | Відкрийте 25/TCP; у разі блокування у провайдера використайте відповідний VPS | telnet <SERVER_IP> 25 із зовнішньої мережі |
Конфлікт 80/443 | На хості вже слухає вебсервер | Використайте реверс-проксі, прив’яжіть Mailcow до 127.0.0.1 | ss -tlpn grep -E '80 / 443' |
Некоректні бінди HTTP(S) | Використаний формат IP:PORT для HTTP/HTTPS |
Застосовуйте HTTP_PORT/HTTPS_PORT і HTTP_BIND/HTTPS_BIND окремо |
Перевірка mailcow.conf |
Помилка портів у Compose (:443:443 ) |
Некоректний синтаксис публікації порту | Вкажіть коректне значення порту без порожнього префікса : |
Валідація docker compose config |
Не вдається увійти в панель після оновлення | Змінилися маршрути логіна у 2025-03 | Використовуйте https://<HOST>/admin для адміністратора |
Перевірте примітки до релізу |
Корисні посилання
Офіційна документація