
Всем привет, сегодня я на примере одной организации опишу вам процесс разворачивания с нуля почтового сервера MailCow и мною будут выполнены следующие задачи:
- Предварительная настройка операционной системы Ubuntu 26.04LTS
- Добавление локальных и провайдерских DNS записей
- Проброс портов на маршрутизаторе компании
- Установку и настройку почтового сервера MailCow
- Миграция почты с Mail.ru
Mailcow – это готовый почтовый сервер, собран на основе docker контейнеров, что позволяет быстро и без проблем с настройкой развернуть свое решение в организации. Он очень удобный в администрировании, с красивым современным веб-интерфейсом. В основе решения используется Postfix, Dovecot и множество других компонентов, а в качестве почтового web клиента используется SOGo.
Содержание статьи
- Возможности решения
- Системные требования
- Задачи компании
- План мероприятий
- Настройка DNS у провайдера
- Настройка локальных DNS
- Проброс портов на маршрутизаторе
- Подготовка сервера
- Установка Docker
- Установка mailcow
- Настройка почтового сервера и демонстрация административного интерфейса
- Добавление домена
- Добавление дополнительных DNS записей
- Сертификаты Let’s Encrypt
- Создание почтовых ящиков
- Демонстрация пользовательского интерфейса
- Адресная книга
- Тестирование работоспособности
- Миграция почты с Mail.ru
- Миграция с сервера на сервер
- Резервное копирование и восстановление
- Обновление системы
- Заключение
Возможности решения
- Добавление и администрирование почтовых доменов
- Создание и редактирование почтовых ящиков
- Управление ключами DKIM
- Управление через API
- Fail2ban
- Управление квотами почтовых ящиков и писем
- Управление очередями писем
- Управление карантином
- Конфигурация и статистика Rspamd
- Почтовый роутинг
- Настройка системных оповещений
- Логирование всех выполняемых сервисов
- Настройка Алиасов
и многое другое
Системные требования
Минимальные системные требования:
Процессор: 1 ядро от 1ГГц
Оперативная память: от 3ГБ
Накопитель: от 20ГБ
Параметры виртуальной машины:

Потребление ресурсов в режиме простоя:


Задачи компании
Для компании со штатом сотрудников 160+ человек и почтовой базой 4ТБ+, потребовался собственный надежный почтовый сервер с низкими системными требованиями и следующими возможностями:
- Наличие web интерфейса для управления администраторам
- Наличие удобного web интерфейса для пользователей
- Работа на 4 ядрах и 8гб оперативной памяти
- Наличие антивируса и антиспама
- Перенос почты с Mail.ru
План мероприятий
- Всех пользователей извещаем о том, чтобы они создали пароли для внешний приложений в аккаунте на mail.ru и прислали вам
- Отправляем письмо интернет провайдеру с просьбой прописать PTR запись у себя в DNS
- Настраиваем DNS у хостинг провайдера и в локальной сети
- Делаем проброс портов на маршрутизаторе
- Поднимаем виртуальную машину с Ubuntu 26.04LTS на гипервизоре Proxmox 9.2.3
- Подготавливаем сервер и устанавливаем docker
- Запускаем и настраиваем решение
- Тестируем работоспособность, в том числе делаем проверки онлайн ресурсами
- Создаем почтовые ящики пользователей
- Выполняем миграцию почты с Mail.ru
Настройка DNS у провайдера
Прежде всего пишем письмо интернет провайдеру, в котором попросите прописать PTR запись у себя в DNS.
Проверить можно командой:
nslookup -type=PTR ip_адрес — или — dig -x ip_адрес
Если у вас нет домена, нужно приобрести советую nethouse.ru — работаю с ним не один год, всё DNS записи очень быстро обновляются.
Итак создаём записи:
- Запись типа А, где Имя это домен 3-го уровня, который ссылается на ip адрес вашего маршрутизатора или почтового сервера
- Запись типа MX, где Имя это ваш домен 2-го уровня как правило, который ссылается на запись типа А
Пример:

Настройка локальных DNS
На локальных DNS серверах рекомендую создать зону:
tuning-admina.ru
В которой вы сможете прописывать записи ресурсов для локальных пользователей:
- Запись типа А —> mail —> IP_Address
- Запись типа MX —> mail.tuning-admina.ru —> 10

Проброс портов на маршрутизаторе
В качестве маршрутизатора в компании используется Mikrotik и все необходимые для работы почтовика настройки через Winbox я буду вам демонстрировать.
Рекомендую под почтовик использовать дополнительный — отдельный, белый ip адрес выданный вашим интернет провайдером.

Какие порты стоит пробрасывать для безопасной работы MailCow:
- 25 (TCP) — SMTP. Нужен, чтобы другие серверы могли присылать вам почту.
- 465 (TCP) — SMTPS. Защищённое SMTP-соединение (с шифрованием).
- 587 (TCP) — Submission. Для отправки почты клиентами (из почтовых программ) с обязательной авторизацией.
- 993 (TCP) — IMAPS. Защищённый IMAP — чтобы клиенты могли читать и управлять папками в почте с шифрованием.
- 995 (TCP) — POP3S. Защищённый POP3 (с шифрованием).
- 443 (TCP) — HTTPS. Для доступа к веб-интерфейсу Mailcow (админка, веб-почта SOGo).
- 4190 (TCP) — ManageSieve. Нужен для работы фильтров Sieve (управление правилами фильтрации почты).
Какие порты не стоит пробрасывать из соображений безопасности:
- 110 (POP3) и 143 (IMAP). Это незашифрованные протоколы. Если открыть их наружу, вся почта будет передаваться в открытом виде — это серьёзная уязвимость.
Рекомендации по безопасности:
- Используйте reverse-proxy. Не пробрасывайте порты веб-интерфейса (80/443) напрямую в контейнер Mailcow. Поставьте перед ним Nginx, Traefik или другой обратный прокси. Он будет принимать трафик, проверять его и только потом передавать в Mailcow. Я использую Nginx Proxy Manager
- Ограничьте доступ. Если возможно, разрешите входящие соединения на эти порты только с определённых IP-адресов (например, с IP вашего офиса или домашнего роутера).
- Настройте Firewall на хосте. Даже с пробросом полезно иметь локальный фаервол (например, UFW), который по умолчанию блокирует весь входящий трафик, а разрешает только нужные порты.
- Усильте защиту внутри. В настройках самого Mailcow включите двухфакторную аутентификацию (2FA) для административных аккаунтов, используйте сложные пароли.
- Проверьте провайдера. Многие хостинг-провайдеры по умолчанию блокируют исходящий трафик на порт 25. Перед настройкой убедитесь, что ваш провайдер это разрешает.
Итак приступим:
На маршрутизаторе нужно создать правило типа DNAT для проброса запросов до вашего почтового сервера:
В разделе IP —> Firewall на вкладке NAT добавляем правило для проброса трафика до нашего почтовика из вне, нажимаем +:

На вкладке General выбираем тип dstnat для запросов приходящих на конкретный адрес на интерфейсе WAN, который смотрит в сторону провайдера, выбираем тип трафика TCP и пробрасываемые порты:

На вкладке Action выбираем dst-nat и указываем локальный ip адрес нашего почтового сервера:

В разделе IP —> Firewall на вкладке NAT добавляем правило для проброса вэб трафика до Nginx Proxy Manager(в моем случае) из вне, нажимаем +:

На вкладке General выбираем тип dstnat для запросов приходящих на конкретный адрес на интерфейсе WAN, который смотрит в сторону провайдера, выбираем тип трафика TCP и пробрасываемые порты:

На вкладке Action выбираем dst-nat и указываем локальный ip адрес нашего Nginx Proxy Manager:

Настраиваем Маскарадинг почтового трафика от отдельного внешнего ip адреса:
В разделе IP —> Firewall на вкладке NAT добавляем правило для маскарада почтового трафика, нажимаем +:

На вкладке General выбираем тип srcnat, указываем локальный IP адрес почтового сервера, исходящий интерфейс WAN смотрящий в сторону интернет провайдера:

На вкладке Action выбираем src-nat и указываем внешний ip адрес смотрящий в сторону провайдера:

Подготовка сервера
Все действия в системе я произвожу под root:
sudo -s
Настраиваем сеть:
Удаляем дефолтные конфиги:
rm /etc/netplan/*.*
Создаем конфигурационный файл:
nano /etc/netplan/config.yaml
network:
ethernets:
ens18:
addresses:
— 10.0.5.15/20
dhcp6: false
match:
macaddresses: 00:00:00:00:00:00
nameservers:
addresses:
— 10.0.5.11
— 10.0.5.12
search: []
routes:
— to: default
via: 10.0.0.254
set-name: ens18
version: 2
Сохраняем файл, выходим из редактора:
CTRL+O, CTRL+X
Применяем настройки:
netplan apply
Обновляем систему:
apt update -y && apt upgrade -y
Устанавливаем имя нашему серверу:
hostnamectl set-hostname mail.tuning-admina.ru
Устанавливаем временную зону:
timedatectl set-timezone Europe/Moscow
Устанавливаем дополнительные пакеты:
apt install mc net-tools git -y
Устанавливаем пакет для синхронизации времени:
apt install chrony -y
Проверяем статус службы:
systemctl status chrony
Перезагружаем систему:
reboot
Установка Docker
Добавим GPG key от репозитория Docker:
Устанавливаем права на директорию:
install -m 0755 -d /etc/apt/keyrings
Скачиваем ключ репозитория:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
Меняем права на файл ключа репозитория:
chmod a+r /etc/apt/keyrings/docker.asc
Добавим репозиторий Docker:
echo \
«deb [arch=$(dpkg —print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo «$VERSION_CODENAME») stable» | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновим сведения о пакетах в репозиториях:
apt update -y
Устанавливаем Docker:
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Проверяем статус службы Docker:
systemctl status docker

Установка MailCow
Переходим в каталог:
cd /opt
Клонируем с GitHub каталог с движком mailcow:
git clone https://github.com/mailcow/mailcow-dockerized
Переходим в каталог с проектом:
cd mailcow-dockerized
Запускаем конфигурационный скрипт:
./generate_config.sh
Отвечаем на вопросы конфигуратора:
- Указываем FQDN: mail.tuning-admina.ru
- Выбираем Time Zona: Europe/Moscow
- Нам предлагается выбрать ветку обновлений программного обеспечения(Available Branches), сейчас доступны три ветки:
Master Branch — Стабильный релиз для продакшена Nightly Branch — Нестабильные сборки для тестирования новых функций. Cюда попадают ежедневные коммиты, когда разработчики завершают какие-то изменения. Эту ветку стоит брать, только если вы активно участвуете в тестировании и готовы к возможным багам в продакшене. Официально её не рекомендуют для рабочих окружений.
Legacy Branch — Эта ветка поддерживается, но её статус — устаревшая (deprecated). Её цель — получать только критические обновления безопасности. Выбираем Master Branch, нажимаем 1 и Enter
Скачиваем все связанные с Mailcow контейнеры:
docker compose pull

Запускаем контейнеры:
docker compose up -d

Проверяем статус контейнеров:
docker compose ps -a
Настройка почтового сервера и демонстрация административного интерфейса
Открываем браузер и переходим по адресу:
Дефолтная учетная запись с логином admin и паролем moohoo как в предыдущих релизах не подходит и необходимо в консоли сервера выполнить скрипт сброса пароля:
./helper-scripts/mailcow-reset-admin.sh
Checking MySQL service… OK
Are you sure you want to reset the mailcow administrator account? [y/N] y
Working, please wait…
Reset credentials:
—
Username: admin
Password: fy-ZeuNLsOAuTFNb
TFA: none
Копируем пароль и переходим к авторизации через вэб интерфейс:

Первым делом после авторизации нам необходимо сменить пароль администратора, выбираем Система → Конфигурация и напротив пользователя admin нажимаем Изменить:

Использование admin в качестве главной учетной записи — это не правильно с точки зрения безопасности, поэтому меняем имя пользователя и пароль и нажимаем Сохранить изменения:

Для удобства работы, чтобы глаза не уставали быстро я устанавливаю темный интерфейс, активируя тумблер слева:

Добавление домена
Переходим в раздел E-mail —> Конфигурация:

На вкладке Домены нажимаем Добавить домен:

Указываем домен, количество ящиков, а также ваши квоты и нажимаем Добавить домен и перезапустить SOGO:

В моем случае количество почтовых ящиков 200штук, квота по умолчанию я выставил 10ГБ, а максимальную 50ГБ, при этом квота на весь домен установил в 6ТБ
Домен мы добавили:

Добавление дополнительных DNS записей
Переходим в пункте меню E-Mail —> Конфигурация:

В строке с нашим доменом находим и нажимаем на кнопку DNS:

Система подготовит и выдаст нам информацию о тех настройках, которые мы уже выполнили и в случае успеха поставит зеленую галочку,

PTR запись не обязательная, но не будет лишней и у своего интернет провайдера можно попросить прописать:

TLSA (Transport Layer Security Authentication) — это необязательный тип DNS-записи, который позволяет связать сертификат сервера TLS или открытый ключ с доменным именем, где эта запись находится. Она используется в рамках протокола DNS-Based Authentication of Named Entities (DANE) для повышения безопасности TLS-соединений.

Autodiscover (автообнаружение) — это механизм, который позволяет почтовым клиентам автоматически получать настройки для подключения к почтовому серверу.

У DNS провайдера прописываю записи:



Следующие DNS записи считаю важными, для всевозможных проверок и беспроблемным хождением почты между нашим доменом и ведущими почтовыми хостингами:

- SPF-запись (TXT): «Список доверенных лиц». Говорит, каким серверам разрешено отправлять почту от вашего имени.
- DKIM-запись (TXT): «Восковая печать». Добавляет к письмам цифровую подпись, подтверждающую подлинность и то, что их не вскрывали по пути.
- DMARC-запись (TXT): «Инструкция для охранника». Говорит другим серверам, что делать с письмами, которые пришли якобы от вас, но без «пропуска» (SPF) или «печати» (DKIM).
У DNS провайдера прописываю записи:



После создания DNS записей можно повторно обновить сведения:

Сертификаты Let’s Encrypt
В mailcow присутствует контейнер acme-mailcow, который в автоматическом режиме попытается получить, а также обновить SSL сертификат от Lets Encrypt для всех добавленных доменов, при этом mailcow должен быть доступен на 80-м порту.
Ручная проверка и принудительный выпуск
Если вы хотите убедиться, что сертификаты уже есть, или принудительно запросить их, то необходимо:
Перейдем в директорию Mailcow:
cd /opt/mailcow-dockerized
Перезапускаем контейнер acme-mailcow:
docker compose restart acme-mailcow
Смотрим логи контейнера acme:
docker compose logs -f acme-mailcow

Как видим сертификат применился и можно продолжать дальше:

!!! Материал готовится !!!
Создание почтовых ящиков
В меню выбираем E-Mail — Конфигурация:
В открывшемся окне переходим на вкладку Почтовые ящики и нажимаем Добавить почтовый аккаунт:
Указываем имя пользователя, пароль, если вы не назначили квоту почтовому ящику, то она по умолчанию будет та что указана при добавлении домена, нажимаем Добавить:
Демонстрация пользовательского интерфейса
Пользовательская рабочая панель доступна по адресу: https://mail.tuning-admina.ru/sogo
Авторизовываемся в системе и нас встречает вполне интуитивно понятный пользовательский интерфейс c календарем и адресной книгой, в которую автоматически заносятся почтовые ящики домена с поиском по именам сотрудников.
Адресная книга
По просьбам трудящихся, демонстрирую, что есть в плане адресных книг.
У каждого пользователя есть личная адресная книга:
Которую можно импортировать и экспортировать, а также предоставлять в общий доступ другим пользователям:
Предоставление в общий доступ своей адресной книги:
А также есть глобальная адресная книга, в которую попадают все пользователи домена:
По поводу синхронизации контактов и календаря между SOGO и Outlook напишу чуть позже.
Тестирование работоспособности
Существует множество онлайн сервисов для проверки работоспособности вашего почтового сервера, а также присутствие всех нужных записей в DNS, один из таких ресурсов я вам продемонстрирую:
Заходим на сайт и видим предложение отправить письмо на сгенерированный специально для вас почтовый обработчик, копируем адрес и с вашего почтового ящика отправляем письмо:
После того как отправили письмо, возвращаемся на страницу ресурса и нажимаем Затем проверьте оценку и если вы все верно настроили, то у вас получиться тот же результат, что и у меня:
Если у вас отличаются показатели от моих, открываем E-Mail —> Конфигурация:
В разделе домены, напротив вашего есть значок @DNS, нажимаем на него, это диагностика и предписание вам для настройки своих DNS:
Зелеными галочками помечен статус ваших правильных настроек, индекс 1 в статусе напоминает вам, что эта настройка очень важна для правильной работы почты, а индекс 2 это необязательное условие, а скорее рекомендация.
Открываем дополнительную вкладку в браузере и идем в панель администрирования DNS записями вашего Хостинг провайдера и сверяем записи там:
!!! ВАЖНО !!!
Кстати, если планируете отсылать письма по gmail’ам не лишним будет добавить свой домен на специальную страницу:
Указываем ваше доменное имя и нажимаем далее:
Нас просят создать TXT запись в DNS нашего хостинг провайдера, копируем значение:
Должно получиться так:
Возвращаемся на страницу Google и нажимаем подтвердить:
Нажимаем Готово, теперь у нас недолжно быть проблем при хождении писем между доменами.
Миграция почты с Mail.ru
В этом блоке статьи мы с вами рассмотрим 1 из 2 вариантов миграции почты:
- С помощью встроенного в решение контейнера imapsync и настройка процесса синхронизации в WEB панели администрирования
- Синхронизация с помощью Outlook
С помощью встроенного в решение контейнера imapsync и настройка процесса синхронизации в WEB панели администрирования
На панели управления выбираем E-Mail —> Конфигурация:
Нам нужна вкладка Задания синхронизации, нажимаем Создание нового задания синхронизации:
Запустится окно создания и конфигурирования правила синхронизации, где в самом верху указан почтовый ящик на нашем сервере куда мы будем перетаскивать почту, следом идут параметры подключения к ящику на mail.ru, но только пароль используется для внешний приложений, интервал установим 1 минуту и поставим галочку имитировать синхронизацию, для запуска после создания правила, после чего нажимаем Добавить:
Синхронизация прошла успешно:
*** Важно ***
При выполнении синхронизации переносятся только штатные папки
Миграция с сервера на сервер
Процесс миграции со старого сервера на новый достаточно простой процесс и выглядит следующим образом:
- Подготавливаем новый сервер, устанавливаем Docker и MailCow, после чего останавливаем Docker:
systemctl stop docker
- Разработчиками решения подготовлен скрипт для бэкапа и восстановления решения и находится он в папке /opt/mailcow-dockerized/helper-scripts, запускаем его:
/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh
- На старом сервере переходим в каталог /opt/mailcow-dockerized и останавливаем контейнеры вместе с Docker:
cd /opt/mailcow-dockerized
docker compose down
systemctl stop docker
- На старом сервере запускаем процесс синхронизации содержимого каталога между серверами:
rsync -aHhP —numeric-ids —delete /opt/mailcow-dockerized/ root@mail2.tuning-admina.ru:/opt/mailcow-dockerized
rsync -aHhP —numeric-ids —delete /var/lib/docker/volumes/ root@mail2.tuning-admina.ru:/var/lib/docker/volumes
- Запускаем Docker на новом сервере:
systemctl start docker
- Переходим в каталог /opt/mailcow-dockerized
cd /opt/mailcow-dockerized
- Подтягиваем Docker образы mailcow:
docker compose pull
Запускаем контейнеры mailcow:
docker compose up -d
При необходимости меняем настройки DNS.
Резервное копирование и восстановление
Любой сервер в продакшене и не только без бэкапов — это отсроченный апокалипсис и так как почта, была, есть и будет одним из главных средств коммуникации сотрудников, то резервное копирование должно быть максимально эффективным.
В кластере Proxmox мне нравиться настраивать бэкапы штатными средствами и обычно я выставляю хранение последних 3-х копий.
В Mailcow разработчики предусмотрели механизм бэкапа с помощью встроенного скрипта, который находится в папке helper-scripts.
Переходим в эту директорию: cd /opt/mailcow-dockerized/helper-scripts/ Запустить полный бэкап можно с помощью команды:
./backup_and_restore.sh backup all
где backup — это название производимой процедуры, a параметр all говорит о том, что мы бэкапим все, также можно указать конкретные компоненты:
- vmail — данные почтовых ящиков (письма, папки);
- crypt — ключи шифрования;
- redis — база Redis;
- rspamd — данные фильтра спама (настройки и «обученные» данные);
- postfix — очередь почты и настройки Postfix;
- mysql — база данных MySQL (скрипт использует mariabackup для согласованного горячего бэкапа)
- —delete-days N — параметр для удаления бэкапов старше N дней
Архивы сохраняются в /var/lib/mailcow/backups
Настроим автоматическое резервное копирование с помощью планировщика заданий Cron:
crontab -e Добавим строку для ежедневного бэкапа в час ночи:
0 1 * * * cd /opt/mailcow-dockerized && ./helper-scripts/backup_and_restore.sh backup all —delete-days 3 >> /var/log/mailcow-backup.log 2>&1
где:
- 0 1 * * * — каждый день в 01:00.
- cd /opt/mailcow-dockerized — переходим в рабочую директорию Mailcow
- backup all —delete-days 3 — делаем полный бэкап и удаляем бэкапы старше 3-х дней.
- >> /var/log/mailcow-backup.log 2>&1 — логирование stdout и stderr в файл (удобно для мониторинга).
Сохраняем файл и выходим из редактора, при этом Cron автоматически подхватит изменения:
CTRL+O, CTRL+X
Проверка и мониторинг
- Проверить, что cron запустился, можно по логам:
journalctl -u cron -f — для наблюдения в реальном времени
- Посмотреть, что записалось в лог:
tail -n 50 /var/log/mailcow-backup.log
- Убедимся, что бэкапы создаются:
ls -la /var/lib/mailcow/backups
Для восстановления используется тот же скрипт, но с параметром restore:
./helper-scripts/backup_and_restore.sh restore
Скрипт предложит указать путь к папке с бэкапами, а также покажет доступные точки восстановления. Выберите нужную и вам предложат выбрать компоненты для восстановления. Можно выбрать всё (0) или отдельные части.
Обновление системы
Для обновления Mailcow используется скрипт update.sh
Переходим в директорию Mailcow: cd /opt/mailcow-dockerized/ Запускаем скрипт обновления: ./update.sh
Система выполнит обновление по ранее выбранной нами ветке Master, система спросит у нас, что перед обновлением необходимо остановить контейнеры, соглашаемся, нажимаем y и Enter:

Процедура занимает в среднем от 3 до 5 минут

Вот собственно и все
Заключение
Безусловно это одно из лучших готовых решений в качестве почтового сервера для малого и среднего бизнеса. Решение попадает в мой список ТОП-5 лучших почтовых серверов. Функционал поражает своими возможностями и при этом ничего лишнего, это вам не многофункциональный комбайн.