Если вы читаете этот материал, скорее всего вы уже знаете что поднять свой почтовик это страдание и внезапно нетривиальная задача. Цель статьи - без лишней лирики дать пошаговый мануал тем, кто хочет настроить свой собственный мейлер и не платить деньги mailgun и подобным SMTP-relay сервисам.
Стек
VPS OS: Ubuntu 22.04 server
// 1Gb RAM
// 1vCPU
Soft: docker
, certbot
Также на этом этапе предполагается что у вас уже куплен домен, и он добавлен в панель управления CloudFlare. Настраивать DNS мы будем там, если вы не хотите использовать CF по аналогии все делается и в других панелях регистратора.
Установка нужного софта
По стандарту, обновляем сервер:
apt update && apt upgrade -y
Ставим docker из репозиториев самого докера (пока все из под root):
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
apt update
apt install ca-certificates curl
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
Ниже одна команда, копируем целиком и вставляем в терминал
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Ставим наконец докер
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ставим certbot
apt install certbot
Теперь, чтобы выпустить сертификат, нам нужно добавить А-запись в CloudFlare. Идем в панель управления домена в раздел DNS и добавляем запись типа А следующим образом: в Name пишем mail
, в ipv4 address пишем IP вашего VPS, и обязательно отключаем проксирование.

Теперь возвращаемся в терминал и выпускаем SSL-сертификаты:
certbot certonly --standalone -d mail.yourdomain.com
Certbot обычно сам создает cron-запись для ежедневного обновления сертификатов, и этого нам делать не нужно. Но ввиду того что у нас postfix живет в докере, он не в курсе что ему нужно перезапускаться для загрузки новых сертификатов. Поэтому мы должны подцепить перезапуск контейнера к хуку certbot-а.
Для этого мы создаем файл:
nano /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh
И в него помещаем:
#!/bin/bash
docker restart postfix
Теперь после перевыпуска сертификатов докер рестартнет наш контейнер, и новые сертификаты подгрузятся в postfix.
Создаем пользователя
Создаем пользователя для наших почтовых непотребств, чтобы не запускать все из под root.
useradd -m emailuser -G docker -s /bin/bash
Задаем этому пользователю пароль
passwd emailuser
Переключаемся на свежесозданного пользователя
su emailuser
Настраиваем docker-compose.yml
Создаем файл docker-compose.yml
nano docker-compose.yml
И вставляем туда, не забыв подставить свой домен везде вместо yourdomain.com и задать пароль для авторизации:
services:
postfix:
image: boky/postfix
container_name: postfix
restart: unless-stopped
ports:
- "587:587"
volumes:
- ./dkim:/etc/opendkim/keys
- /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem:/etc/opendkim/keys/mail.crt:ro
- /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem:/etc/opendkim/keys/mail.key:ro
environment:
HOSTNAME: mail.yourdomain.com
DOMAIN: yourdomain.com
DKIM_SELECTOR: mail
DKIM_DOMAINS: yourdomain.com
DKIM_KEY_LENGTH: 2048
ENABLE_DKIM: 1
ENABLE_TLS: 1
TLS_KEY: /etc/opendkim/keys/mail.key
TLS_CERT: /etc/opendkim/keys/mail.crt
SMTP_USER: noreply@yourdomain.com|password
RELAY_NETWORKS: 127.0.0.1/32
FORCE_HELO: 1
LOG_TO_STDOUT: 1
ALLOWED_SENDER_DOMAINS: proxy.expert
DKIM_AUTOGENERATE: "true"
В результате запуска этого контейнера командой docker compose up -d
мы получим следующее:
Докер подтянет образ
boky/postfix
в котором помимо postfix есть также и opendkim, необходимый для подписи писем и непопадания их в папку "спам".Будут созданы DKIM-ключи при первом запуске и мы сможем смотреть их в папке /home/emailuser/dkim на нашем VPS
Сервер будет доступен на порту 587 нашего VPS
Появится возможность отправлять письма только из localhost ИЛИ тем, кто знает логин и пароль из директивы SMTP_USER
После первого запуска и генерации ключей директиву DKIM_AUTOGENERATE можно удалить или закомментировать.
Дальнейшая настройка DNS-записей
Теперь мы продолжаем настройку DNS, поскольку имеем все необходимое для этого. Идем в папку dkim и находим файл, который заканчивается на .txt
В нем будет нечто такого вида:
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; s=email; "
"p=МНОГО_СИМВОЛОВ"
"ЕЩЕ_МНОГО_СИМВОЛОВ" ) ; ----- DKIM key mail for yourdomain.com
Открываем текстовый редактор и делаем следующую конструкцию там:
v=DKIM1; h=sha256; k=rsa; s=email; p=МНОГО_СИМВОЛОВЕЩЕ_МНОГО_СИМВОЛОВ
То есть мы без ковычек и скобок копируем параметры из файла, и две части ключа мы соединяем вместе в одну длинную строку. Далее мы идем в DNS-записи на CloudFlare и создаем запись типа TXT, в поле "Name" пишем:
mail._domainkey
В поле Content вставляем получившуюся у нас в текстовом редакторе конструкцию, и сохраняем.
Таким образом мы настроили сверку DKIM-подписи, которая подтвердит подлинность наших email-соощений, гарантируя что они происходят с нашего домена и нашего сервера, т.к. адрес отправителя email легко подделывается.
Далее мы создаем еще одну TXT запись, в Name указываем наш домен вида mydomain.com, в Content прописываем:
"v=spf1 a mx ip4: -all"
Этой записью мы указываем, что единственный IP адрес который имеет право отправлять письма с нашего домена - это адрес нашего VPS.
Настройка rDNS и открытие порта 25 у хостера
Это еще не всё. Теперь нам предстоит пообщаться с хостинг-провайдером, который продал нам VPS. Потому что по умолчанию почти на всех хостерах запрещены исходящие сообщения на порт 25, и нам нужно попросить их открыть. Для этого обычно нужно написать тикет в техподдержку.
А также нам нужно включить reverse dns (rDNS) для адреса mail.mydomain.com. У разных провайдеров это делается по-разному, где-то есть такой пункт в настройках VPS, где-то нужно писать тикет в поддержку.
Тесты
После того как все это будет проделано, можно приступить к тестам. Есть сервисы, которые позволяют вам увидеть скоринг вашего письма:
https://www.mail-tester.com/
https://www.appmaildev.com/en/dkim
Они дадут вам одноразовый адрес, куда вам нужно отправить письмо с вашего свежесозданного почтового сервера.
Чтобы отправить письмо, мы на VPS выполняем команду для входа в консоль контейнера:
docker exec -it postfix bash
И там выполняем:
echo -e "Subject: DKIM Test\n\nThis is a test message" | sendmail -f noreply@mydomain.com recipient@example.com
подставив вместо mydomain.com наш домен, вместо recipient@example.com адрес который вам выдал сервис.
Если вы видите что у вас все ОК с DKIM и прочими параметрами, можно попробовать отправить таким же способом письмо себе на gmail и ощутить приятную годрость, видя как оно попало во "входящие".