Як налаштувати mailcow на VPS для Gmail
Перевірте порт 25 перед встановленням mailcow. Дізнайтеся, як уникнути помилки Gmail 550 5.7.25 PTR та налаштувати DNS для успішної доставки листів.
Що ви створюєте
Повноцінний поштовий сервер на власному обладнанні: SMTP для відправки та отримання листів, IMAP для синхронізації між телефоном і ноутбуком, вебклієнт та спам-фільтр, який оцінює кожен повідомлення в обох напрямках. Пакет mailcow-dockerized об'єднує Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis та ACME client в один стек Docker Compose, тому встановлення програмного забезпечення не є складною частиною. Ви запустите систему за пів години.
Складність полягає в налаштуванні оточення. Електронна пошта — це єдиний сервіс, де інтернет ставиться до нового сервера з недовірою. Різниця між "все працює" та "Gmail беззвучно видаляє всі листи" залежить від чотирьох DNS-записів та одного параметра репутації IP, який ви можете не контролювати повністю. Перед орендою сервера прочитайте вимоги нижче. Якщо після ознайомлення ви вирішите, що робота з репутацією не варта зусиль, це нормальне рішення — наш огляд того, що варто хостити самостійно у 2026 році. У розділі "only if you mean it" наведені саме такі причини.
Вимоги — це і є суть проєкту
Невиконання будь-якої з цих умов призведе до того, що листи не будуть доставлені. Нижче наведено перелік у порядку зростання частоти виникнення проблем:
Порт 25 (outbound) має бути відкритим. Ваш сервер передає дані на Gmail та Microsoft через TCP порт 25. Багато VPS та хмарних провайдерів блокують вихідний порт 25 за замовчуванням для боротьби зі спамом. Це блокування відбувається без повідомлень про помилки — система працює стабільно, але листи залишаються в черзі назавжди. Перевірте це перед встановленням. Якщо порт заблоковано, єдиний спосіб — створити запит у службу підтримки про відкриття порту; деякі провайдери роблять це для старих акаунтів, інші — ніколи.
Чиста IP-адреса з гарною репутацією. IP-адреси VPS часто повторно використовуються. Вони можуть бути вже у списках блокування (blocklists) через спам попереднього власника. Перевірте свою адресу через такі сервіси, як 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.
Доменне ім'я, а не просто IP-адреса. Виберіть hostname, наприклад mail.example.com. Це ім'я стане вашим MAILCOW_HOSTNAME, суб'єктом TLS-сертифіката, ціллю для PTR та SMTP banner. Використовуйте його однаково всюди.
Step 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!Якщо порт заблоковано, команда очікує 5 секунд і завершується помилкою:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressЦей timeout свідчить про блокування. Це мережевий фільтр на стороні провайдера, а не ваш firewall, тому локальні налаштування не допоможуть. Створіть тікет: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." Не встановлюйте mailcow, доки не отримаєте статус "succeeded". Майте на увазі, що вхідний порт 25 (коли інші сервери звертаються до вас) — це окремий шлях, і він зазвичай відкритий. Провайдери обмежують саме вихідний трафік.
Step 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, коли підтвердите відповідність налаштувань. Два записи навмисно залишаються відсутніми: DKIM, який mailcow згенерує для вас на Step 6, та PTR, який потрібно налаштувати зараз у панелі керування провайдера.
Встановіть PTR (reverse DNS) для 10.0.0.10 на mail.example.com — точне значення MAILCOW_HOSTNAME. Це єдиний запис, про який найчастіше забувають, через що великі провайдери відхиляють пошту. Якщо у вашій панелі немає поля rDNS, створіть запит у службу підтримки.
Step 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, який встановлює обидва компоненти з офіційного apt-репозиторію Docker.
Step 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. Повнотекстовий пошук — це другий споживач пам'яті згідно з документацією mailcow. Його вимкнення позбавить вас лише можливості пошуку за текстом листа у веб-пошті.
Залиште HTTP_PORT=80 та HTTPS_PORT=443 без змін, якщо ці порти вже не зайняті іншими службами на хості. Вбудованому ACME-клієнту mailcow потрібен доступний з інтернету порт 80 для отримання сертифіката. Саме тому не рекомендується використовувати окрему установку nginx-plus-Certbot на тому самому пристрої. mailcow самостійно видає та оновлює власні TLS-сертифікати, а інша служба, що займає порти 80/443, порушить цей процес.
Step 5 — Запуск стека та вхід у систему
sudo docker compose pull
sudo docker compose up -d
sudo docker compose psЗавантаження включає приблизно двадцять образів; зачекайте кілька хвилин. Коли docker compose ps відобразить усі контейнери running (або healthy), відкрийте https://mail.example.com у браузері. Стандартні дані для входу адміністратора: username admin, password moohoo. Негайно змініть цей пароль в інтерфейсі адміністрування у розділі Access → Administrators. Якщо браузер видає попередження NET::ERR_CERT_AUTHORITY_INVALID, це означає, що сертифікат ACME ще не видано — перевірте причини помилки ACME нижче, перш ніж вважати систему несправною; використання самопідписаного сертифіката є нормальним протягом перших 1–2 хвилин.
Step 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-хостинг сам розділив його на частини.
Step 7 — Перевірка доставляємості та отримання 10/10
Перейдіть на mail-tester.com, скопіюйте випадкову адресу, яку він покаже, і надішліть на неї повідомлення зі свого нового поштового ящика — увійдіть у SOGo webmail за адресою 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-адресою призведе до блокування вашого домену в перший же день.
Step 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 із вашими обліковими даними.
Step 9 — Резервне копіювання важливих даних
mailcow постачається зі скриптом резервного копіювання, який створює знімки (snapshots) усіх томів з persisted-даними. Запускайте його на зовнішній диск або змонтований віддалений ресурс:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall копіює шість об'єктів, втрата будь-якого з яких призведе до втрати даних: vmail (безпосередньо поштові скриньки), crypt (ключі для дешифрування vmail — без них дані неможливо прочитати), mysql (база MariaDB, що містить домени, користувачів, аліаси та налаштування), redis (стан черги та кешу), rspamd (навчені правила спаму/ham) та postfix (поштова черга). Скрипт виконується всередині допоміжного контейнера та створює стиснуті архіви, тому резервні копії залишаються цілісними навіть під час роботи стека. Налаштуйте автоматизацію за допомогою nightly cron job і додайте --delete-days 14 для видалення старих наборів. Для відновлення використовуйте той самий скрипт із прапором restore, який виводить список знімків і дозволяє вибрати потрібні дані. Резервна копія, яку ви ні разу не перевіряли на відновлення, є лише надією, а не бекапом — виконайте тестове відновлення на чистому VPS.
Step 10 — Оновлення за розкладом
mailcow оновлюється за допомогою власного скрипта. Скрипт завантажує новий код, виконує міграцію mailcow.conf, попередньо завантажує образи та перезапускає контейнери у такому порядку:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itСпочатку зробіть резервну копію (Step 9), оскільки міграцію схеми важко скасувати. Оновлення виходять часто і містять виправлення безпеки для служб, доступних з інтернету. Не залишайте поштовий сервер без оновлень протягом кількох місяців. Якщо після оновлення контейнер переходить у стан unhealthy, sudo docker compose logs --tail=50 <service>-mailcow вказує на демон, який не зміг запуститися.
Примітка щодо посилення захисту
mailcow використовує власний сервіс netfilter (netfilter-mailcow), який блокує IP-адреси, що здійснюють перебір портів пошти та webmail. Таким чином, поштова частина захищена відразу після встановлення. Це не захищає SSH на самому хості, який залишається відкритим для brute-force атак. Використовуйте цей метод разом із Fail2ban для моніторингу SSH auth log та вхід лише за ключами. Захищайте панель керування mailcow складним паролем і, в ідеалі, тримайте її поза межами публічного інтернету або за VPN.
Режими відмови та відповідні рядки
Повідомлення в черзі, які не надсилаються. Виконайте sudo docker compose exec postfix-mailcow postqueue -p або перевірте чергу пошти в admin UI; записи мають статус 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" та перевірте результати перевірки автентифікації. dkim=fail або dkim=none означає, що ваш dkim._domainkey TXT відсутній, некоректний або ще не поширився — переопублікуйте дані точно так, як вказано на сторінці ARC/DKIM, і зачекайте завершення TTL. spf=fail означає, що записи SPF/MX не охоплюють вашу IP-адресу. Узгодженість є критичною; навіть одна помилка перевірки призведе до потрапляння в спам.
Відмова великих провайдерів під час з'єднання. Повідомлення про помилку або логи Postfix містять відмову Gmail через PTR:
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. Встановіть 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 резолвиться на цей сервер, відкрийте порти 80 та 443 у фаєрволі хоста і переконайтеся, що ці порти не зайняті іншими процесами. Після усунення причини перезапустіть клієнт за допомогою sudo docker compose restart acme-mailcow, замість того щоб чекати годину до наступної спроби.
FAQ
Чи варто дійсно самостійно хостити пошту?
Якщо вам потрібна власність на дані, необмежена кількість аліасів та повний контроль — так. mailcow надає професійний стек за ціною VPS. Проте забезпечення доставки листів — це постійна робота: репутація IP, відповідність DNS та моніторинг чорних списків тривають вічно. Для критично важливих бізнес-адрес, де навіть один день у спам-папці клієнта коштує вам грошей, прагматичнішим рішенням буде керований провайдер. Самостійний хостинг підходить лише тоді, коли контроль для вас важливіший за зручність і ви готові займатися обслуговуванням.
Як перевірити, чи заблокований вихідний порт 25?
Запустіть nc -vz -w 5 gmail-smtp-in.l.google.com 25 на сервері. Повідомлення "succeeded!" означає, що порт відкритий; timed out після паузи означає, що провайдер його блокує. Це найпоширеніша причина, чому самостійно хостований сервер може отримувати пошту, але не може її надсилати. Єдиний спосіб вирішення — запит до провайдера на відкриття порту; локальні налаштування не допоможуть.
Чому мої листи все одно потрапляють у спам Gmail?
Майже завжди це пов'язано з порушенням ланцюга автентифікації. Використовуйте функцію "Show original" у Gmail і перевірте наявність spf=pass, dkim=pass та dmarc=pass. Помилка dkim=fail вказує на відсутній або некоректний dkim._domainkey TXT record; також негативно впливають невідповідність 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 оперативної пам'яті?
Ні, це буде незручно. generate_config.sh пропонує вимкнути ClamAV, якщо доступно менше 2.5 GiB, але навіть у цьому випадку Rspamd, ClamAV, Dovecot та MariaDB конкуруватимуть за пам'ять. Це призведе до використання swap та помилок OOM kills при будь-якому реальному навантаженні. Для стабільної інсталяції для одного користувача мінімальною вимогою є 6 GiB RAM плюс 1 GiB swap. Переходьте на 8 GiB, як тільки сервісом почнуть користуватися більше двох осіб.