8.2.26 Установка и настройка Mailcow на сервере

The Host Banner

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 для интеграции, расширяемость за счет настройки сервисов.

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

Требования

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

  • 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

sudo_apt

Установка Docker и Compose

Полную инструкцию смотрите в нашей статье: Docker and Docker Compose

Требуемые минимальные версии: Docker >= 24.0.0, Docker Compose >= 2.0. Проверьте:

docker --version
docker compose version

docker_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

mkdir

Генерация конфигурации

Для генерации стартовой конфигурации выполните скрипт:

./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

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

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

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

Настройка DNS записей

Для коректной работы почты необходимо будет настроить dns-записи Вашего домена MAILCOW_HOSTNAME. Детальнее с процессом настройки можете ознакомиться в нашей инструкции.

Запуск контейнеров

Запустите контейнеры и подтяните необходимые образы:

docker compose pull
docker compose up -d

После старта откройте https://MAILCOW_HOSTNAME/admin и войдите под логином admin, паролем moohoo. Сразу смените пароль администратора.

web ui

После выполнения указанных действий Вы попадёте в административную панель:

admin panel welcome

Проверка портов/доступности

Убедитесь, что нужные порты слушаются и доступны извне (особенно 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 → Конфигурация → Добавить домен

adding domain

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

Реверс-прокси (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.

failtoBan

В открывшемся окне выберите Options и откройте разел Fail2Ban parameters.

failtoBan

Обновления

Для проведения обновлений в директории проекта выполните команду:

./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 для администратора Проверьте примечания к релизу

Полезные ссылки