Всем привет, сегодня я на примере одной организации опишу вам процесс разворачивания с нуля почтового сервера 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
Настройка почтового сервера и демонстрация административного интерфейса
Открываем браузер и переходим по адресу:
https://10.0.5.15/admin
Дефолтная учетная запись с логином 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 записей можно повторно обновить сведения:
!!! Материал готовится !!!
Для создания почтового ящика переходим на вкладку «Почтовые ящики» и жмем кнопку «Добавить почтовый аккаунт».
Теперь можно переходить в приложение Webmail — верхнее меню Приложение → Webmail
— это веб интерфейс почтового ящика. Но прежде, чем отправить первое
письмо, добавим еще одну ДНС-запись, чтобы наши письма не попадали в
спам.
Сертификаты Let's Encrypt
В mailcow присутствует контейнер acme-mailcow,
который в автоматическом режиме попытается получить, а также обновить
SSL сертификат от Lets Encrypt для всех добавленных доменов, при этом
mailcow должен быть доступен на 80-м порту.
Если вам необходимо принудительно продлить сертификат, необходимо выполнить следующее:
- Подключиться к серверу по ssh
- Перейти в каталог нашего почтового сервера:
cd /opt/mailcow-dockerized
- Создадим файл с именем force_renew:
touch data/assets/ssl/force_renew
- Перезапускаем контейнер acme-mailcow:
docker compose restart acme-mailcow
Создание почтовых ящиков
В меню выбираем E-Mail -- Конфигурация:
В открывшемся окне переходим на вкладку Почтовые ящики и нажимаем Добавить почтовый аккаунт:
Указываем
имя пользователя, пароль, если вы не назначили квоту почтовому ящику,
то она по умолчанию будет та что указана при добавлении домена, нажимаем
Добавить:
Демонстрация пользовательского интерфейса
Пользовательская рабочая панель доступна по адресу: https://mail.tuning-admina.ru/sogo
Авторизовываемся
в системе и нас встречает вполне интуитивно понятный пользовательский
интерфейс c календарем и адресной книгой, в которую автоматически
заносятся почтовые ящики домена с поиском по именам сотрудников.
Адресная книга
По просьбам трудящихся, демонстрирую, что есть в плане адресных книг.
У каждого пользователя есть личная адресная книга:
Которую можно импортировать и экспортировать, а также предоставлять в общий доступ другим пользователям:
Предоставление в общий доступ своей адресной книги:
А также есть глобальная адресная книга, в которую попадают все пользователи домена:
По поводу синхронизации контактов и календаря между SOGO и Outlook напишу чуть позже.
Тестирование работоспособности
Существует
множество онлайн сервисов для проверки работоспособности вашего
почтового сервера, а также присутствие всех нужных записей в DNS, один
из таких ресурсов я вам продемонстрирую:
https://mail-tester.com
Заходим
на сайт и видим предложение отправить письмо на сгенерированный
специально для вас почтовый обработчик, копируем адрес и с вашего
почтового ящика отправляем письмо:
После того как отправили письмо, возвращаемся на страницу ресурса и нажимаем Затем проверьте оценку и если вы все верно настроили, то у вас получиться тот же результат, что и у меня:
Если у вас отличаются показатели от моих, открываем E-Mail --> Конфигурация:
В
разделе домены, напротив вашего есть значок @DNS, нажимаем на него, это
диагностика и предписание вам для настройки своих DNS:
Зелеными
галочками помечен статус ваших правильных настроек, индекс 1 в статусе
напоминает вам, что эта настройка очень важна для правильной работы
почты, а индекс 2 это необязательное условие, а скорее рекомендация.
Открываем
дополнительную вкладку в браузере и идем в панель администрирования DNS
записями вашего Хостинг провайдера и сверяем записи там:
!!! ВАЖНО !!!
Кстати, если планируете отсылать письма по gmail'ам не лишним будет добавить свой домен на специальную страницу:
https://postmaster.google.com
Указываем ваше доменное имя и нажимаем далее:
Нас просят создать 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 лучших
почтовых серверов. Функционал поражает своими возможностями и при этом
ничего лишнего, это вам не многофункциональный комбайн.