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