Установка mailcow на VPS для работы с Gmail
Проверьте порт 25 перед установкой mailcow. Настройте DNS, чтобы избежать ошибки Gmail 550 5.7.25 PTR. Узнайте, как гарантировать доставку писем.
Что вы создаете
Полноценный почтовый сервер на вашем собственном оборудовании: SMTP для отправки и получения писем, IMAP для синхронизации данных между телефоном и ноутбуком, веб-клиент и спам-фильтр, который проверяет каждое сообщение в обоих направлениях. Пакет mailcow-dockerized объединяет Postfix, Dovecot, Rspamd, веб-клиент SOGo, MariaDB, Redis и ACME-клиент в один стек Docker Compose. Благодаря этому установка программного обеспечения не является сложной задачей. Вы запустите систему за полчаса.
Сложность заключается во всем, что окружает сервер. Электронная почта — это единственный сервис, в котором интернет активно не доверяет новому серверу. Разница между состоянием «все работает» и состоянием «Gmail молча удаляет все письма» заключается в четырех DNS-записях и одной настройке репутации IP, которую вы не всегда можете контролировать. Перед арендой сервера ознакомьтесь с требованиями ниже. Если после прочтения вы решите, что работа с репутацией не стоит затраченных усилий, это обоснованное решение. В нашем материале что на самом деле стоит хостить самостоятельно в 2026 году в разделе «только если вы настроены серьезно» указаны именно эти причины.
Предварительные требования являются основой проекта
Несоблюдение любого из этих условий приведет к тому, что письма не будут доставлены. Ниже приведен список в порядке частоты возникновения проблем:
Исходящий порт 25 должен быть открыт. Ваш сервер отправляет почту на Gmail и Microsoft через TCP порт 25. Многие VPS и облачные провайдеры блокируют исходящий порт 25 по умолчанию для борьбы со спамом. Эта блокировка происходит незаметно: при загрузке ошибок нет, система работает корректно, но письма бесконечно остаются в очереди. Проверьте доступность порта перед установкой. Если порт заблокирован, единственное решение — обращение в службу поддержки с просьбой открыть его; некоторые провайдеры делают это для старых аккаунтов, другие — никогда.
Чистый IP-адрес с хорошей репутацией. IP-адреса VPS часто используются повторно. Они могут быть уже в черных списках из-за спама предыдущего владельца. Проверьте свой адрес через такие сервисы, как Spamhaus lookup или mxtoolbox, прежде чем приступать к работе. Если IP в черном списке, вы не сможете исправить это программными методами.
Управление DNS и корректная PTR-запись. Вам необходимо добавить записи в зону вашего домена. Также требуется обратная DNS-запись (PTR), которая связывает IP-адрес сервера с вашим почтовым именем хоста. PTR почти никогда не настраивается в панели управления DNS; эта запись управляется владельцем IP-адреса, поэтому ее нужно настраивать в панели управления вашего VPS-провайдера или через запрос в службу поддержки.
Минимальные требования: 6 GiB RAM и 2 vCPU. Для частной установки mailcow требуется минимум 6 GiB RAM и 1 GiB swap. Рекомендуется 8 GiB, когда количество пользователей становится значительным. При объеме памяти менее 2.5 GiB generate_config.sh предлагает отключить антивирус ClamAV, чтобы ядро системы не завершало процессы контейнеров. Для начала выделите 20 GB SSD.
DNS-имя, а не просто IP-адрес. Выберите имя хоста, например mail.example.com. Это имя станет вашим MAILCOW_HOSTNAME, субъектом сертификата TLS, целью для PTR и баннером SMTP. Используйте одно и то же имя везде.
Шаг 1 — Проверьте доступность исходящего порта 25
Выполните это в первую очередь. Если проверка не пройдена, остальные действия не имеют смысла. С нового VPS попробуйте установить SMTP-соединение с реальным почтовым сервером:
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25Успешный результат возвращается мгновенно:
Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!При заблокированном порте соединение длится пять секунд, после чего происходит ошибка:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressЭтот тайм-аут указывает на блокировку. Это сетевой фильтр на стороне провайдера, а не ваш firewall, поэтому локальные настройки не помогут. Откройте тикет: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." Не устанавливайте mailcow, пока не получите статус "succeeded". Учтите, что входящий порт 25 (доступ к вам извне) — это отдельный путь, и он обычно открыт. Провайдеры ограничивают именно исходящий трафик.
Шаг 2 — Настройте DNS-записи
Изменения DNS требуют времени на распространение. Опубликуйте все возможные записи перед установкой. Предположим, что ваш домен — example.com, почтовый хостинг — mail.example.com, а IP-адрес — 10.0.0.10. Создайте в вашей зоне:
mail.example.com. A 10.0.0.10
mail.example.com. AAAA 2001:db8::10 ; only if you have IPv6
example.com. MX 10 mail.example.com.
example.com. TXT "v=spf1 mx -all"
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.com"Запись SPF означает: «отправлять почту для этого домена может только мой MX, остальные запросы отклонять». Начните настройку DMARC с режима p=none, чтобы вы могли просматривать отчеты, не теряя собственные письма. Переключитесь на p=quarantine, а затем на p=reject, когда подтвердите корректность соответствия (alignment). Две записи намеренно оставлены отсутствующими: DKIM, которую mailcow сгенерирует для вас на Шаге 6, и PTR, которую необходимо настроить сейчас в панели управления вашего провайдера.
Установите PTR (обратный DNS) для 10.0.0.10 на mail.example.com — точное значение MAILCOW_HOSTNAME. Это единственная запись, о которой многие забывают, и из-за этого крупные провайдеры отклоняют почту. Если в вашей панели нет поля rDNS, создайте обращение в службу поддержки.
Шаг 3 — Установка Docker
Для работы mailcow требуется Docker Engine с плагином Compose v2. Рекомендуется использовать официальный скрипт Docker вместо пакета docker.io из репозитория Ubuntu, так как в нем отсутствует плагин Compose:
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose versionВ выводе должна появиться строка Docker Compose version v2.x. Если команда docker compose version выводит docker: 'compose' is not a docker command, это означает, что Docker Engine установлен, но плагин Compose отсутствует. Установите плагин из репозитория Docker: повторно запустите вышеуказанный скрипт или воспользуйтесь нашим руководством по основам Docker Compose, которое настраивает оба компонента из официального репозитория Docker.
Шаг 4 — Клонирование mailcow и создание конфигурации
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shСначала проверьте, что umask выводит 0022. mailcow не сможет собраться при некорректной маске файлов; в чистой оболочке root на Ubuntu 24.04 значение уже установлено как 0022. Затем скрипт запросит единственный важный параметр: полное доменное имя (FQDN). Введите mail.example.com — это значение должно точно совпадать с вашими записями A и PTR. Скрипт создаст mailcow.conf — единственный файл окружения, который использует весь стек. Откройте его, если вам нужно изменить веб-порты (HTTP_PORT, HTTPS_PORT) или отключить ClamAV на сервере с малым объемом памяти:
MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n # set to y to drop the virus scanner on a <2.5 GiB boxSKIP_FTS=y — еще один параметр для серверов с малым объемом RAM. Полнотекстовый поиск потребляет много памяти; его отключение ограничит только поиск по тексту письма в webmail.
Не изменяйте HTTP_PORT=80 и HTTPS_PORT=443, если эти порты не заняты другими службами на хосте. Встроенному ACME-клиенту mailcow необходим доступ к порту 80 из интернета для получения сертификата. По этой причине не следует использовать отдельную настройку nginx-plus-Certbot на этом же сервере; mailcow выпускает и обновляет TLS самостоятельно, а работа другого сервиса на портах 80/443 нарушит этот процесс.
Шаг 5 — Запуск стека и вход в систему
sudo docker compose pull
sudo docker compose up -d
sudo docker compose psКоманда pull загружает около двух десятков образов; подождите несколько минут. Когда docker compose ps отобразит все контейнеры running (или healthy), откройте https://mail.example.com в браузере. Данные для входа по умолчанию: имя пользователя admin, пароль moohoo. Немедленно смените пароль в интерфейсе администратора в разделе Access → Administrators. Если браузер выдает предупреждение NET::ERR_CERT_AUTHORITY_INVALID, это означает, что сертификат ACME еще не выпущен. Прежде чем считать систему неисправной, ознакомьтесь с разделом «Ошибки ACME» ниже; наличие самоподписанного временного сертификата в течение первых одной-двух минут является нормальным.
Шаг 6 — Добавление домена, почтового ящика и публикация DKIM
В интерфейсе администратора откройте страницу Mail Setup (Configuration → Mail Setup). На вкладке Domains нажмите Add domain и введите example.com. Затем в разделе Mailboxes нажмите Add mailbox, чтобы создать you@example.com с паролем. Этот почтовый ящик будет готов к работе и доступен по протоколу IMAP.
Теперь настроим DKIM. Перейдите в Configuration → ARC/DKIM keys. При добавлении домена mailcow мог сгенерировать ключ автоматически. Если этого не произошло, создайте его вручную: выберите домен, оставьте селектор dkim, выберите размер 2048-bit и нажмите Add. Скопируйте полученное длинное значение TXT и опубликуйте его следующим образом:
dkim._domainkey.example.com. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"На странице Domains в mailcow есть кнопка DNS. Она выводит список всех необходимых записей и помечает их: зеленая галочка означает, что запись опубликована, красный крестик — что нет. Используйте этот список для проверки. Все строки должны стать зелеными перед началом тестирования доставки почты. Если после публикации строка DKIM остается красной, вероятно, ключ был некорректно разделен на части TXT. Ключ размером 2048-bit превышает лимит в 255 символов для одной строки TXT. Вставляйте его как одно логическое значение, чтобы DNS-хостинг сам разделил его на части.
Шаг 7 — Проверка доставляемости и достижение результата 10/10
Перейдите на сайт mail-tester.com, скопируйте отображаемый случайный адрес и отправьте на него сообщение со своего нового почтового ящика. Для этого войдите в webmail SOGo по адресу https://mail.example.com/SOGo и отправьте письмо оттуда. Затем нажмите "Then check your score".
Ваша цель — 10/10. Основные причины снижения рейтинга:
- SPF not aligned — запись
MX/SPF отсутствует или отправляемый IP-адрес не указан в ней. Проверьте SPF TXT-запись. - DKIM signature does not verify — запись
dkim._domainkeyTXT отсутствует, находится в процессе распространения или содержит ошибки. Это самая частая причина. - No PTR / PTR mismatch — обратная DNS-запись не разрешается в
mail.example.com. Исправьте это в панели провайдера. - Listed on a blocklist — плохая репутация вашего IP-адреса в прошлом. Запросите удаление из черного списка или запросите чистый IP.
Не отправляйте реальные письма пользователям Gmail или Outlook, пока не получите результат 10/10. Низкий рейтинг в сочетании с новым IP-адресом приведет к блокировке вашего домена в первый же день.
Шаг 8 — Подключение почтового клиента
Настройте Thunderbird, Apple Mail или мобильное приложение на использование следующих параметров. Для всех клиентов хост сервера — mail.example.com:
- IMAP: порт 993, SSL/TLS (или 143 с STARTTLS)
- SMTP submission: порт 465, SSL/TLS (или 587 с STARTTLS)
- Username: полный адрес,
you@example.com - Password: пароль от почтового ящика, который вы установили
Не используйте порт 25 для отправки почты клиентом. Этот порт предназначен только для передачи почты между серверами. mailcow не поддерживает аутентификацию через этот порт, поэтому в подключении клиенту будет отказано. Если клиент возвращает ошибку Relay access denied, значит, он пытается отправить письмо через порт 25 или без аутентификации. Используйте порт 465 или 587 с учетными данными вашего почтового ящика.
Шаг 9 — Резервное копирование критически важных данных
mailcow поставляется со скриптом резервного копирования, который создает снимки всех томов с состоянием (stateful volumes). Запустите его на внешний диск или примонтированный удаленный ресурс:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall сохраняет шесть компонентов, потеря любого из которых приведет к потере данных: vmail (сами почтовые ящики), crypt (ключи для расшифровки vmail — без них данные бесполезны), mysql (база MariaDB с доменами, пользователями, псевдонимами и настройками), redis (состояние очередей и кэша), rspamd (обученные правила спама/ham) и postfix (почтовая очередь). Скрипт запускается внутри вспомогательного контейнера и записывает сжатые архивы, поэтому резервные копии остаются согласованными даже при работающем стеке. Настройте автоматический запуск через cron каждую ночь и добавьте --delete-days 14 для удаления старых наборов данных. Для восстановления используйте тот же скрипт с флагом restore; он выводит список снимков и позволяет выбрать нужные данные. Резервная копия, которую вы никогда не тестировали на восстановление, является лишь надеждой, а не бэкапом — выполните пробный запуск на чистом VPS.
Шаг 10 — Обновление по расписанию
Обновление mailcow выполняется через собственный скрипт. Скрипт загружает новый код, выполняет миграцию mailcow.conf, предварительно загружает образы и перезапускает контейнеры в следующем порядке:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itСначала выполните резервное копирование (Шаг 9), так как миграцию схемы базы данных сложно отменить. Обновления выходят часто и содержат исправления безопасности для сервисов, доступных из интернета. Не допускайте отсутствия обновлений на почтовом сервере в течение нескольких месяцев. Если после обновления контейнер переходит в состояние unhealthy, sudo docker compose logs --tail=50 <service>-mailcow указывает имя не запустившегося демона.
Примечание по защите системы
mailcow использует собственный сервис netfilter (netfilter-mailcow), который блокирует IP-адреса, совершающие перебор портов почты и webmail. Таким образом, почтовый сервис защищен по умолчанию. Это не защищает SSH на самом хосте, который остается открытым для атак методом brute-force. Рекомендуется использовать данную сборку совместно с Fail2ban для мониторинга логов SSH auth и настроить вход только по ключам. Используйте сложный пароль для интерфейса администрирования mailcow и, в идеале, ограничьте к нему доступ из публичного интернета или настройте доступ через VPN.
Режимы сбоев и соответствующие строки
Очереди почты и отсутствие доставки. Выполните команду sudo docker compose exec postfix-mailcow postqueue -p или проверьте очередь почты в интерфейсе администратора; записи переходят в статус deferred с ошибкой:
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)Это означает, что ваш провайдер блокирует исходящий порт 25 (Шаг 1). Настройки конфигурации не помогут — создайте заявку в техподдержку. Проблема не в DNS и не в TLS; признаком является наличие слова timed out при обращении к удаленному MX на порт 25.
Gmail помечает все письма как спам или возвращает их. Откройте сообщение в Gmail, выберите «Show original» и изучите результаты проверки подлинности (auth results). dkim=fail или dkim=none означают, что ваш dkim._domainkey TXT отсутствует, поврежден или еще не распространился — опубликуйте в точности то, что указано на странице ARC/DKIM, и дождитесь истечения TTL. spf=fail означает, что записи SPF/MX не включают ваш IP. Соответствие (alignment) имеет решающее значение; достаточно одной ошибки проверки, чтобы письмо попало в спам.
Отказ крупных провайдеров при установке соединения. В уведомлениях о недоставке (bounces) или логах Postfix содержится ошибка PTR от Gmail:
550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.Код 550 5.7.25 означает отсутствие или несоответствие обратной DNS-записи (reverse DNS). Установите PTR для вашего IP как mail.example.com у провайдера (Шаг 2). Прямая (A) и обратная (PTR) записи должны совпадать; обе должны указывать на одно и то же имя хоста, которое mailcow использует при общении с другими серверами.
Браузер постоянно показывает предупреждение о сертификате. Контейнеру acme-mailcow не удалось получить настоящий сертификат. Проверьте его лог:
sudo docker compose logs acme-mailcow | tail -n 40Строка вида Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. или ошибка проверки (challenge failure) означает, что порт 80 недоступен из интернета или A-запись не указывает на этот сервер. Убедитесь, что mail.example.com разрешается в IP этого сервера, откройте порты 80 и 443 в межсетевом экране хоста и убедитесь, что эти порты не заняты другими процессами. После устранения причины перезапустите клиент с помощью sudo docker compose restart acme-mailcow, чтобы не ждать завершения часового периода ожидания (back-off).
FAQ
Стоит ли самостоятельно хостить почту?
Да, если вам необходимы владение данными, неограниченное количество псевдонимов и полный контроль. mailcow предоставляет профессиональный стек по цене VPS. Однако обеспечение доставляемости требует постоянного внимания: репутация IP, соответствие DNS и мониторинг черных списков — это непрерывные процессы. Если вам нужен критически важный бизнес-адрес, где попадание в спам даже на один день наносит ущерб, прагматичнее выбрать управляемого провайдера. Выбирайте self-hosting, если контроль для вас важнее удобства и вы готовы заниматься обслуживанием.
Как проверить, заблокирован ли исходящий порт 25?
Выполните nc -vz -w 5 gmail-smtp-in.l.google.com 25 на сервере. Сообщение "succeeded!" означает, что порт открыт; timed out после паузы означает, что провайдер блокирует порт. Это самая частая причина, по которой self-hosted сервер может принимать почту, но не может ее отправлять. Единственный способ решения — запрос на открытие порта у провайдера; локальные настройки здесь не помогут.
Почему письма все равно попадают в спам Gmail?
Почти всегда это связано с нарушением цепочки аутентификации. Используйте функцию "Show original" в Gmail и проверьте наличие spf=pass, dkim=pass и dmarc=pass. Ошибка dkim=fail указывает на отсутствие или некорректность TXT-записи dkim._domainkey. Также проблема может быть в несоответствии PTR или в новом IP без истории отправки. Сначала добейтесь оценки 10/10 на mail-tester.com, затем постепенно прогревайте IP, увеличивая объем с нескольких сообщений в день, вместо массовой рассылки в первый же день.
Что именно нужно архивировать?
Выполните backup_and_restore.sh backup all и храните весь набор данных вне сервера. Сюда входят vmail (почтовые ящики), crypt (ключи для расшифровки), база данных MariaDB (домены, пользователи, псевдонимы, настройки), Redis, данные обучения Rspamd и очередь Postfix. Объем crypt часто упускают из виду — без него бэкап vmail будет представлять собой нечитаемый шифротекст. Минимум один раз протестируйте восстановление на чистой системе.
Можно ли запустить mailcow на VPS с 2 GB RAM?
Нет, это будет работать нестабильно. generate_config.sh предлагает отключить ClamAV, если объем памяти составляет менее 2.5 GiB, но даже в этом случае Rspamd, ClamAV, Dovecot и MariaDB будут конкурировать за ресурсы. При любой реальной нагрузке возникнет использование swap и ошибки OOM kills. Для стабильной установки для одного пользователя требуется минимум 6 GiB RAM и 1 GiB swap. Переходите на 8 GiB, как только количество пользователей станет больше пары человек.