Справочник по установке, настройке и эксплуатации Mailcow
Mailcow
2
Сообщения
1
Posters
2
Просмотры
-
Справочник по установке, настройке и эксплуатации Mailcow (Пункты 1–100)
Установка и Docker
- Команда
sudo docker compose pullскачивает все необходимые Docker-образы, указанные в файлеdocker-compose.yml, без запуска контейнеров. - Команда
sudo docker compose up -dскачивает образы (если их нет), создает и запускает все контейнеры Mailcow в фоновом режиме. - Команда
sudo docker compose downостанавливает и удаляет все контейнеры и сети Mailcow, но сохраняет тома с данными. - Команда
sudo docker compose down -vполностью удаляет все контейнеры, сети и тома (включая все письма и базу данных). sudo docker compose psпоказывает статус всех контейнеров Mailcow (работает/остановлен).sudo docker compose logs --tail=200 <имя_контейнера>показывает последние 200 строк логов указанного контейнера (например,nginx-mailcow,php-fpm-mailcow).- Конфликт портов — самая частая проблема при запуске Mailcow, когда порт уже занят другим сервисом (nginx, apache).
- Ошибка
address already in useозначает, что порт, который пытается занять контейнер, уже используется другим процессом на хосте. - Для тестового запуска Mailcow можно временно остановить системный Nginx командой
sudo systemctl stop nginx. - Чтобы Nginx не запускался автоматически, используется команда
sudo systemctl disable nginx. - Статус контейнера Healthy означает, что он не просто запущен, но и успешно прошел внутренние проверки работоспособности.
- Статус Started / Running означает, что процесс контейнера запущен, но его функциональность может быть еще не готова (например, база данных инициализируется).
- Конфликт Docker-сетей возникает, когда подсеть, которую пытается создать Mailcow, уже используется другой сетью Docker.
- Ошибка
Pool overlaps with other one on this address spaceрешается изменением подсети в переменнойIPV4_NETWORKв файле.env. - Для смены подсети Mailcow нужно изменить третий октет в
IPV4_NETWORK(например, с172.22.1на172.22.2). - В качестве гарантированно свободной подсети можно использовать диапазон
10.0.0.0/24(установивIPV4_NETWORK=10.0.0). - Файл
.envв директории/opt/mailcow-dockerizedявляется основным конфигурационным файлом Mailcow. MAILCOW_HOSTNAMEв файле.env— это полное доменное имя (FQDN) вашего почтового сервера (например,mail.domain.tld).- Переменная
HTTP_PORTв.envзадает порт на хосте, который будет слушать веб-интерфейс Mailcow по HTTP. - Переменная
HTTPS_PORTв.envзадает порт на хосте для HTTPS-интерфейса Mailcow. - Если
HTTPS_PORTзакомментирован, Mailcow использует стандартный порт 443. SKIP_LETS_ENCRYPT=yв.envотключает встроенный ACME-клиент Mailcow, что необходимо при использовании внешнего прокси и Certbot.HTTP_REDIRECT=yзаставляет Mailcow принудительно перенаправлять все HTTP-запросы на HTTPS.- Переменная
ADDITIONAL_SERVER_NAMESуказывает дополнительные доменные имена, на которые должен отвечать веб-интерфейс Mailcow. TZ=Europe/Moscowзадает часовой пояс для контейнеров Mailcow.DBPASSиDBROOT— автоматически сгенерированные пароли к базе данных MySQL/MariaDB.- При изменении файла
.envнеобходимо перезапустить Mailcow:sudo docker compose down && sudo docker compose up -d.
Обратный прокси (Reverse Proxy)
- При использовании внешнего обратного прокси (например, Nginx) Mailcow должен слушать на нестандартных портах (например, 8080 и 8443).
- Внешний Nginx принимает трафик на стандартных портах 80 и 443 и перенаправляет его на внутренние порты Mailcow.
- Ключевой заголовок для Mailcow при работе за прокси:
proxy_set_header X-Forwarded-Proto https;. - Он сообщает Mailcow, что исходный запрос был по HTTPS, даже если внутри он идет по HTTP.
- Для работы с Certbot в конфиге Nginx обязательно должен быть блок
serverдля порта 80. - Certbot для проверки домена использует временную директорию
location /.well-known/acme-challenge/. - После успешного получения сертификата Certbot автоматически модифицирует конфиг Nginx, добавляя настройки SSL.
- Ошибка "if directive is not allowed here" возникает, когда Certbot добавляет неправильный редирект в конфиг Nginx.
- Правильный редирект HTTP -> HTTPS в Nginx выглядит так:
return 301 https://$host$request_uri;. - Для проксирования HTTPS-трафика внешний Nginx должен иметь свой собственный валидный SSL-сертификат (от Certbot).
- Конфиг внешнего Nginx должен быть разделен на два блока
server: для порта 80 (редирект) и для порта 443 (прокси). - В блоке для порта 443 обязательно должна быть директива
proxy_pass http://127.0.0.1:8087;(или ваш внутренний порт). - При использовании внешнего прокси встроенный HTTPS-порт Mailcow (например, 8443) остается неиспользуемым для внешнего трафика.
Решение проблем с запуском и подключением
- Ошибка "Waiting for SQL..." в логах
php-fpm-mailcowозначает, что контейнер ждет готовности базы данных MySQL. - Это нормально для первого запуска и может длиться несколько минут, пока MySQL инициализируется.
- Логи
mysql-mailcowпоказывают прогресс инициализации базы данных и момент, когда она готова к подключениям (ready for connections). - Ошибка HTTP 502 Bad Gateway от Nginx означает, что Nginx не может связаться с бэкендом (PHP-FPM).
- Самоподписанный сертификат вызывает предупреждение браузера "Недействительный сертификат" или "Ваше соединение не защищено".
- Ошибка "Циклическое перенаправление" в Firefox при доступе по HTTP возникает из-за принудительного редиректа Mailcow на HTTPS.
- Ошибка в Chrome "Этот сайт не может обеспечить безопасное подключение" возникает из-за проблем с SSL/TLS рукопожатием.
- Команда
sudo nginx -tпроверяет синтаксис конфигурационных файлов Nginx и указывает на ошибки. - Ошибка "conflicting server name" в логах Nginx означает, что одно и то же доменное имя объявлено в двух разных конфигурационных файлах.
- Ошибка "protocol options redefined" возникает, когда настройки SSL определены в нескольких блоках
serverдля одного порта. - Ошибка "duplicate extension" в mime.types означает, что одно расширение файла определено дважды и не критична.
- Для диагностики занятости порта используется команда
sudo ss -tuln | grep <порт>. - Для определения процесса, занимающего порт, используется
sudo lsof -i :<порт>. - Устаревший синтаксис
listen ... http2в Nginx рекомендуется заменить на отдельную директивуhttp2 on;. - Если после изменения портов в
.envконтейнер не запускается, нужно проверить, свободны ли эти порты. - При ручном исправлении конфига Nginx после Certbot, все настройки SSL должны быть только в блоке для порта 443.
- Доступ к веб-интерфейсу по
http://домен:8087приведет к редиректу на HTTPS и может вызвать циклическую ошибку. - Доступ по
https://домен:8443работает напрямую к Mailcow, но с предупреждением о самоподписанном сертификате. - Прямой доступ к внутренним портам Mailcow следует использовать только для отладки.
PTR, DNS и репутация
- PTR-запись связывает IP-адрес с доменным именем и критически важна для репутации почтового сервера.
- PTR-запись настраивается у хостинг-провайдера, а не в DNS-зоне домена у регистратора.
- Стандартные PTR от провайдера (например,
95-31-38-30.broadband.corbina.ru) вредят репутации почтового сервера. - Правильный PTR должен указывать на почтовый хостнейм (например,
mail.other5.nbics.net). - Для идеальной работы необходима связка FCrDNS: PTR и A-запись должны указывать друг на друга.
- Отсутствие правильного PTR — одна из главных причин попадания писем в спам.
- Проверить PTR можно командой
dig -x <IP-адрес>или на сайте mxtoolbox.com. - Если провайдер не дает настроить PTR, необходимо использовать внешний SMTP-релей или сменить хостера.
- MX-запись должна указывать на почтовый хост (например,
mail.other5.nbics.net), у которого есть A-запись. - Ошибка
{No A Record}для MX-хоста — критична. Почта не будет доставляться. - SPF-запись (TXT) определяет, какие серверы имеют право отправлять почту от имени домена.
- Проверить SPF можно на mxtoolbox.com или с помощью
dig TXT домен.tld. - Пример правильной SPF-записи:
v=spf1 mx a ip4:ВАШ_IP -all. - DKIM-запись — это цифровая подпись писем. Ключ генерируется в Mailcow и добавляется как TXT-запись.
- DMARC-запись (TXT для
_dmarc.домен.tld) определяет политику обработки писем, не прошедших SPF/DKIM. - Отсутствие DMARC-записи снижает доверие к домену и мешает внедрению BIMI.
- Отчеты mxtoolbox показывают, что ваш IP не находится в черных списках (RBL) — это хороший знак.
- Статус "Ok OK" для всех RBL означает чистую репутацию IP-адреса.
- Домашние IP-адреса (из пулов Билайна, Ростелекома) непригодны для серьезного почтового сервера из-за PTR и блокировок портов.
- IP от специализированных дата-центров (как
dedic-center.ru) имеют лучшую исходную репутацию.
Управление и функциональность
- В Mailcow по умолчанию нет самостоятельной регистрации пользователей.
- Новые почтовые ящики создаются администратором в веб-интерфейсе (Mail Setup → Mailboxes).
- Логин администратора по умолчанию:
admin, пароль:moohoo. - При первом входе необходимо сменить пароль администратора.
- Mailcow можно использовать как SMTP-сервер для внешних приложений (например, Element/Synapse).
- Для этого создается специальный почтовый ящик (например,
noreply@domain.tld), чьи данные указываются в настройках приложения. - При регистрации пользователя в стороннем сервисе, письмо подтверждения отправляется с этого спец-ящика на личную почту пользователя.
- Такие транзакционные письма не считаются спамом при правильной настройке аутентификации домена (SPF, DKIM, DMARC).
Общие вопросы и сравнения
- Установка почтового сервера — сложная задача, требующая знаний Linux, DNS и сетевых технологий.
- Настройка правильных DNS-записей (A, MX, PTR, SPF, DKIM, DMARC) — самый важный и сложный этап.
- Почтовый сервер состоит из нескольких компонентов: MTA (Postfix), MDA/IMAP (Dovecot), антиспам (Rspamd), веб-интерфейс (SOGo).
- YunoHost — это простая платформа для хостинга приложений (включая почту), идеальна для новичков.
- Mailcow — это профессиональное, мощное Docker-решение, сфокусированное только на почте.
- Помимо Mailcow и YunoHost, существуют другие open-source решения: iRedMail, Mail-in-a-Box, Modoboa.
- iRedMail — один из старейших и проверенных почтовых дистрибутивов.
- Mail-in-a-Box нацелен на максимальную простоту и автоматизацию.
- Modoboa — это гибкая панель управления для Postfix и Dovecot.
- Выбор решения зависит от опыта и целей: YunoHost для хобби, Mailcow/iRedMail для бизнеса.
- Для надежной корпоративной почты "из коробки" проще использовать Google Workspace или Microsoft 365.
- Свой сервер требует постоянного мониторинга, обновлений и борьбы со спамом.
- Самостоятельный почтовый сервер дает полный контроль над данными, но требует значительных временных затрат на поддержку.
- Команда
-
Справочник по установке, настройке и эксплуатации Mailcow (Пункты 101–200)
Docker и управление контейнерами
docker compose exec <имя_контейнера> <команда>позволяет выполнить команду внутри работающего контейнера.- Пример:
sudo docker compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}проверяет подключение к базе данных. - Контейнер
nginx-mailcowвыступает в роли обратного прокси внутри стека Mailcow для всех веб-сервисов. - Контейнер
php-fpm-mailcowобрабатывает PHP-логику веб-интерфейса Mailcow. - Контейнер
mysql-mailcow(MariaDB) хранит все настройки, домены, пользователей и пароли. - Контейнер
dovecot-mailcowотвечает за доставку писем в ящики пользователей (IMAP/POP3). - Контейнер
postfix-mailcow— это MTA (Mail Transfer Agent), принимающий и отправляющий почту. - Контейнер
rspamd-mailcow— мощная система фильтрации спама и проверки писем. - Контейнер
clamd-mailcow— антивирус, проверяющий вложения на вредоносный код. - Контейнер
unbound-mailcow— локальный DNS-резолвер для повышения производительности и безопасности. - Контейнер
redis-mailcowиспользуется для кэширования и очередей задач. - Контейнер
sogo-mailcowпредоставляет веб-почту (Roundcube) и CalDAV/CardDAV функционал. - Контейнер
acme-mailcowавтоматически получает и обновляет SSL-сертификаты Let's Encrypt. - Контейнер
watchdog-mailcowотслеживает состояние других контейнеров и перезапускает упавшие. - Контейнер
netfilter-mailcowуправляет правилами файервола внутри Docker-сети.
Проблемы с сетью и портами
- Ошибка
failed to bind host port for 0.0.0.0:443: address already in useозначает, что порт 443 занят. - Для освобождения порта 443 нужно остановить сервис, который его занимает (nginx, apache, другой Docker-контейнер).
- При использовании внешнего прокси порты 80 и 443 на хосте должны принадлежать прокси, а не Mailcow.
- В этом случае в файле
.envнужно указать альтернативные порты для Mailcow, напримерHTTP_PORT=8080иHTTPS_PORT=8443. - Команда
sudo ss -tulpn | grep 443показывает все процессы, использующие порт 443 с их PID. - Если порт занят процессом с PID 1 (systemd), значит служба настроена на системном уровне.
- После изменения портов в
.envможет потребоваться полный перезапуск:docker compose down && docker compose up -d. - Конфликт портов может возникнуть не только с внешними сервисами, но и с другими контейнерами Docker.
- Для просмотра всех Docker-сетей используется команда
docker network ls. - Для детальной информации о сети:
docker network inspect <имя_сети>. - Стандартная сеть Docker
bridgeиспользует подсеть172.17.0.0/16, что может конфликтовать с Mailcow. - Если несколько проектов Docker Compose используют одинаковые подсети, возникает конфликт.
- Решение конфликта сетей — изменить
IPV4_NETWORKв.envна уникальный диапазон.
Настройка внешнего Nginx (Reverse Proxy)
- Внешний Nginx должен быть настроен на проксирование трафика на внутренние порты Mailcow.
- Для HTTP-трафика:
proxy_pass http://127.0.0.1:8080;(еслиHTTP_PORT=8080). - Для HTTPS-трафика:
proxy_pass http://127.0.0.1:8080;также, так как SSL терминируется на внешнем Nginx. - Заголовок
proxy_set_header X-Forwarded-Proto https;критически важен для правильной работы Mailcow за прокси. - Без этого заголовка Mailcow будет думать, что все запросы идут по HTTP, и пытаться редиректить на HTTPS.
- Заголовок
proxy_set_header Host $host;сохраняет оригинальное имя хоста при проксировании. - Заголовок
proxy_set_header X-Real-IP $remote_addr;передает реальный IP-адрес клиента. - Для поддержки WebSocket (нужен SOGo для уведомлений) необходимы настройки:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; - Директива
client_max_body_size 0;отключает ограничение на размер загружаемых файлов (важно для вложений). - В конфиге внешнего Nginx должен быть отдельный блок
serverдля порта 80 с редиректом на HTTPS. - Редирект делается директивой
return 301 https://$host$request_uri;. - Без этого редиректа пользователи, заходящие по HTTP, будут видеть ошибки или страницу Mailcow без стилей.
Certbot и SSL-сертификаты
- Certbot — это клиент Let's Encrypt для автоматического получения и обновления SSL-сертификатов.
- Команда
sudo certbot --nginxавтоматически получает сертификат и настраивает Nginx. - При первом запуске Certbot создает временный файл в
/.well-known/acme-challenge/для проверки домена. - Для этого порт 80 должен быть открыт и доступен из интернета.
- Если Certbot находит существующий сертификат, он предлагает опции: переустановить или обновить.
- Выбор
2: Renew & replace the certificateгарантирует получение свежего сертификата и обновление конфига. - Certbot автоматически добавляет в конфиг Nginx строки
ssl_certificateиssl_certificate_key. - Также добавляются
include /etc/letsencrypt/options-ssl-nginx.conf;иssl_dhparam.... - Ошибка "We were unable to restart web server" означает, что Certbot не смог перезапустить Nginx из-за ошибок в конфиге.
- В этом случае нужно исправить конфиг Nginx вручную и выполнить
sudo certbot install --cert-name <домен>. - Сертификаты Let's Encrypt действительны 90 дней, Certbot автоматически их обновляет через cron/systemd timer.
- После обновления сертификата Nginx перезагружается для применения новых сертификатов.
Диагностика и отладка
sudo docker compose logs -f <контейнер>позволяет следить за логами в реальном времени (аналогtail -f).sudo docker compose logs --tail=50 mysql-mailcowпоказывает последние 50 строк логов MySQL.- Лог-сообщение
mariadbd: ready for connections.означает, что MySQL готов к работе. - Циклическое повторение
Waiting for SQL...в логах PHP-FPM указывает на проблемы с подключением к MySQL. - Ошибка
connect() failed (111: Connection refused)в логах Nginx означает, что бэкенд (PHP-FPM) не отвечает. - Команда
sudo docker compose restart <контейнер>перезапускает конкретный контейнер. sudo docker compose restart nginx-mailcowперезапускает только Nginx, что полезно после изменения конфигов.- Проверка доступности порта изнутри контейнера:
docker exec -it <контейнер> nc -zv 127.0.0.1 <порт>. - Для проверки DNS внутри контейнера:
docker exec -it <контейнер> dig google.com. - Логирование ошибок PHP можно включить в конфигурации PHP-FPM, монтируя файл логов.
- Все контейнеры Mailcow используют один и тот же внутренний часовой пояс из переменной
TZ.
Настройка DNS и почтовые протоколы
- Помимо веб-интерфейса, Mailcow использует стандартные почтовые порты: 25 (SMTP), 465 (SMTPS), 587 (Submission).
- IMAP (для чтения почты) работает на портах 143 (STARTTLS) и 993 (SSL/TLS).
- POP3 (устаревший протокол) работает на портах 110 и 995.
- Sieve (для фильтрации почты) работает на порту 4190.
- Для нормальной работы почты эти порты должны быть открыты в файерволе сервера.
- Проверить доступность порта извне можно на mxtoolbox.com (Diagnostics -> SMTP Test).
- При использовании внешнего прокси, почтовые порты должны быть открыты напрямую на сервере (прокси их не трогает).
SUBMISSION_PORT=587в.envпозволяет изменить стандартный порт для отправки почты клиентами.SMTPS_PORT=465— порт для устаревшего SMTPS (не путать с STARTTLS на порту 587).IMAPS_PORT=993иPOP3S_PORT=995— защищенные версии протоколов доступа к почте.- Для каждого добавленного почтового домена нужно настроить отдельные DNS-записи (MX, SPF, DKIM, DMARC).
- DKIM-ключи генерируются отдельно для каждого домена в панели Mailcow.
- Селектор DKIM по умолчанию в Mailcow —
dkim(запись выглядит какdkim._domainkey.domain.tld). - DMARC-политика
p=quarantineрекомендована для начальной настройки,p=reject— для полной защиты. - Адрес для DMARC-отчетов (
rua=mailto:...) должен существовать и быть доступным.
Безопасность
- Встроенный watchdog (
USE_WATCHDOG=y) автоматически перезапускает упавшие контейнеры. WATCHDOG_NOTIFY_EMAILпозволяет настроить отправку уведомлений о проблемах на email.WATCHDOG_NOTIFY_BANвключает уведомления о забаненных IP-адресах.WATCHDOG_EXTERNAL_CHECKS=nотключает внешние проверки на open relay (по умолчанию выключено).- Переменная
SKIP_CLAMD=nвключает антивирус ClamAV (рекомендуется, но требует ресурсов). SKIP_SOGO=nвключает веб-почту SOGo (рекомендуется оставить включенным).SKIP_FTS=nвключает полнотекстовый поиск в Dovecot (полезно, но нагружает сервер).FTS_HEAP=128ограничивает память для индексации писем (можно увеличить при наличии ресурсов).FTS_PROCS=1ограничивает количество процессов индексации (можно увеличить на мощных серверах).ALLOW_ADMIN_EMAIL_LOGIN=nзапрещает администраторам входить в почтовые ящики пользователей без пароля.ACL_ANYONE=disallowзапрещает создание общих папок для всех аутентифицированных пользователей.ENABLE_SSL_SNI=nотключает поддержку отдельных сертификатов для разных доменов (если не нужно).ENABLE_IPV6=falseотключает IPv6 (если не настроен на сервере).
Почтовые ящики и квоты
MAILDIR_GC_TIME=7200определяет время (в минутах) хранения удаленных ящиков в корзине (здесь 5 дней).MAILDIR_SUB=Maildir— стандартное имя директории для хранения писем в формате Maildir.SOGO_EXPIRE_SESSION=480— время сессии в веб-почте SOGo в минутах (480 = 8 часов).SOGO_URL_ENCRYPTION_KEY— ключ шифрования для URL в SOGo (генерируется автоматически).DOVECOT_MASTER_USERиDOVECOT_MASTER_PASS— мастер-аккаунт для доступа к любым ящикам (использовать осторожно).LOG_LINES=9999— количество сохраняемых строк логов в Redis для каждого сервиса.SPAMHAUS_DQS_KEY— ключ для Spamhaus Data Query Service (если ваш IP в заблокированной ASN).
API и автоматизация
- Mailcow имеет полноценный REST API для управления доменами, ящиками, алиасами и настройками.
- Для использования API нужно создать ключ в разделе
Access→APIи разрешить доступ с нужных IP (API_ALLOW_FROM).