Перед арендой виртуалки удостоверьтесь, что хостер разрешает исходящие соединения по 25 и 495 порту. Есть хостеры у которых невозможно развернуть SMTP-сервер. У остальных стандартной практикой является разблокировка порта по запросу в техподдержку!
Эта инструкция написана и проверена для Ubuntu 24.04
Создаем сервер не менее 2С х 4G х 20G SSD (mailcow будет потреблять 75% этого объема по памяти и диску).
Смотрим что занимает 25 порт:
ss -tulnp | grep :25
Если вывод не пустой то запоминаем PID процесса.
Смотрим что за процесс (подставляем запомненный PID):
ps -p PID -o pid,ppid,user,stat,cmd
Смотрим список сервисов и пытаемся понять, что нужно отключить на основе вывода предыдущей команды:
systemctl list-units --type=service --state=running
Если вы видите что типа:
exim4.service # в этом случае название сервиса exim4
postfix@-.service # в этом случае название сервиса postfix
Отключаем (например postfix, вы подставляете то, что вы определили как занимающее 25 порт):
systemctl disable postfix
Проверяете:
systemctl is-enabled postfix
Проверяем повторно 25 порт:
ss -tulnp | grep :25
Вывод должен быть пустым!
Адресуем на сервер smtp.YOUR_HOST
домен.
Устанавливаем ufw
и разрешаем 22
, 80
и 443
порты:
apt install ufw
ufw default deny incoming && ufw default allow outgoing && ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp
Устанавливаем docker
и docker-compose
Предварительно смотрим номер релиза и заменяем 2.29.2
на номер последнего релиза:
apt update && apt -y install software-properties-common git nano htop && apt update && apt -y install ca-certificates curl gnupg lsb-release && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt-get update && apt-get -y install docker-ce docker-ce-cli containerd.io && curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose && apt install docker-compose-plugin
Устанавливаем в opt
:
cd /opt && git clone https://github.com/mailcow/mailcow-dockerized && cd mailcow-dockerized
Генерируем конфиг:
./generate_config.sh
Указываем домен без протокола, вводим timezone
в формате Europe/London
и выбираем stable
вариант (цифра 1).
Скачиваем контейнеры:
docker compose pull
Запускаем:
docker compose up -d
Ждем пока все создалось и запустилось и останавиваем:
docker compose down
ipv6
:Эта инструкция предполагает, что будем эксплуатировать по стандартному
ipv4
nano /opt/mailcow-dockerized/docker-compose.yml
Ищем: Ctrl
+ W
— enable_ipv6
— enter
Изменяем на false
и комментируем строку сети ipv6
:
networks:
mailcow-network:
[...]
enable_ipv6: false # <<< set to false
ipam:
driver: default
config:
- subnet: ${IPV4_NETWORK:-172.22.1}.0/24
# - subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} # <<< comment out with #
[...]
Создаем дополнительный файл настроек (тк это yml
то пробелы супер-важны! их нельзя просто так добавлять или удалять):
nano /opt/mailcow-dockerized/docker-compose.override.yml
services:
ipv6nat-mailcow:
image: bash:latest
restart: "no"
entrypoint: ["echo", "ipv6nat disabled in compose.override.yml"]
Отключаем IPv6
в unbound-mailcow
:
nano /opt/mailcow-dockerized/data/conf/unbound/unbound.conf
Ищем: Ctrl
+ W
— do-ip6
— enter
Ставим no
:
server:
[...]
do-ip6: no # here put no
[...]
Отключаем IPv6
в postfix-mailcow
:
nano /opt/mailcow-dockerized/data/conf/postfix/extra.cf
Добавляем строки:
smtp_address_preference = ipv4
inet_protocols = ipv4
Корректируем конфиг Nginx
, Dovecot
и php-fpm
:
sed -i '/::/d' /opt/mailcow-dockerized/data/conf/nginx/listen_* && sed -i '/::/d' /opt/mailcow-dockerized/data/conf/nginx/templates/listen* && sed -i '/::/d' /opt/mailcow-dockerized/data/conf/nginx/dynmaps.conf && sed -i 's/,\[::\]//g' /opt/mailcow-dockerized/data/conf/dovecot/dovecot.conf && sed -i 's/\[::\]://g' /opt/mailcow-dockerized/data/conf/phpfpm/php-fpm.d/pools.conf
Стартуем (по прежнему должны находится в папке cd /opt/mailcow-dockerized
):
docker compose up -d
Смотрим лог получения SSL-сертификата:
docker compose logs --tail=200 -f acme-mailcow
Должны увидеть какие-то сообщение о получении сертификата нужно подождать пару минут!
Оригинальная инструкция по сертификату
Создаем в папке /opt/mailcow-dockerized
скрипт clear_docker_logs.sh
:
nano /opt/mailcow-dockerized/clear_docker_logs.sh
#!/bin/bash
containers=(
mailcowdockerized-olefy-mailcow-1
mailcowdockerized-solr-mailcow-1
mailcowdockerized-sogo-mailcow-1
mailcowdockerized-memcached-mailcow-1
mailcowdockerized-redis-mailcow-1
mailcowdockerized-unbound-mailcow-1
mailcowdockerized-watchdog-mailcow-1
mailcowdockerized-dockerapi-mailcow-1
mailcowdockerized-php-fpm-mailcow-1
mailcowdockerized-clamd-mailcow-1
mailcowdockerized-mysql-mailcow-1
mailcowdockerized-dovecot-mailcow-1
mailcowdockerized-postfix-mailcow-1
mailcowdockerized-nginx-mailcow-1
mailcowdockerized-acme-mailcow-1
mailcowdockerized-netfilter-mailcow-1
mailcowdockerized-rspamd-mailcow-1
mailcowdockerized-ofelia-mailcow-1
mailcowdockerized-ipv6nat-mailcow-1
)
for container in "${containers[@]}"; do
sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" '"$container"')'
done
Делаем исполняемым:
chmod +x /opt/mailcow-dockerized/clear_docker_logs.sh
Ставим на cron
:
crontab -e
0 3 * * 0 /opt/mailcow-dockerized/clear_docker_logs.sh
Идем в админ-панель по указанному при конфигурации домену: https://HOST
Стандартный логин admin
, пароль moohoo
.
Меняем пароль админа в system
— configuration
Для добавления нового почтового домена, переходим в в раздел Configuration
— Mail Setup
и нажимаем на зеленую кнопку + Add Domain
.
— домен = YOUR_EMAIL_DOMAIN
— псевдонимов = 0
— почтовых ящиков = 1
— селектор = tcdkim
— Add domain and restart SOGo
Настраиваем DNS:
Напротив домена нажимаем DNS и видим таблицу настроек. Ожидаемые значения и значения, полученные сканером.
Настраиваем на вашем DNS-сервере по рекомендациям.
PTR
-запись важна для почтовых серверов. Через нее владелец ip-пула как-бы подтверждает, что знает про ваш домен. Иногда ее изменение доступно через настройки виртуального сервера (например у https://vultr.com), но иногда нужно писать в поддержку хостера (https://netangels.ru).
Значение SPF
(замените YOUR_SMTP_IP
на ip
вашего сервера):
v=spf1 ip4:YOUR_SMTP_IP ~all
Значение DMARC
записи:
v=DMARC1; p=reject;
Добавляем ящик на соседней вкладке:
— no-reply
(стандарт) или totum-noreply
(здесь рекомендуется вместо totum
использовать ваше осмысленное название)
— выбираем созданный ранее домен
— создаем пароль
— отключаем POP
, IMAP
и Sieve
— Сохраняем
Идем в раздел Email
— Configeration
— Filters
Коментируем #
все строки в Global prefilter
и добавляем в конец:
require ["reject"];
# Reject all incoming messages
reject "This SMTP-server does not accept incoming messages!";
Нажимаем Validate
и потом Save changes
.
Таким образом сервер не будет засоряться входящими спам-сообщениями.
Conf.php
в TotumВ totum
параметры smtp
надо заполнить в таблице settings
в поле custom_smtp_setings_for_schema
:
{
"host": "ssl://smtp.gmail.com",
"port": 465,
"login": "totum@totum.online",
"password": "password_here"
}
По умолчанию письма отправляются от адреса no-reply@HOST
, но если вы создали другой ящик, или почтовый домен не совпадает с доменом установки Totum
то надо указать полный адрес ящика в таблице settings
в поле default_email
.
Если вы хотите задать для всех сехм на сервере жесткий smtp
то:
Заполняем в Conf.php
параметры SMTP для всех схем:
nano /home/totum/totum-mit/Conf.php
Переключаем Conf.php
на использование SMTP
, закоментировав WithPhpMailerTrait
и разкомментировав WithPhpMailerSmtpTrait
— это отключает custom_smtp_setings_for_schema
в таблице settings
.
Разкомментируйте параметры SMTP и заполните вашими данными:
protected $SmtpData = [
'host' => 'ssl://smtp.ttmapp.ru',
'port' => 465,
'login' => 'no-reply@alliance.ttmapp.ru',
'pass' => 'CFbhNe3exyi2hdUfDq',
];
Используйте https://www.mail-tester.com/ для проверки письма на доставляемость.
Также рекомендуем включить PRO List-unsubscribe
Если необходимо увеличить/уменьшить максимальный размер письма (по умолчанию 100 Mb в main.cf
):
nano /opt/mailcow-dockerized/data/conf/postfix/extra.cf
Добавляем параметр:
message_size_limit = LIMIT_IN_BYTES
Потом необходимо рестартовать postfix
:
cd /opt/mailcow-dockerized && docker-compose restart postfix-mailcow