Почтовый сервер mailcow через docker за 30 минут
Недавно наткнулся на довольно интересный комбаин из postfix-sogo-gui-панели для управления почтовыми сервисом. Называется он mailcow. В этой статье решил кратко описать как это все работает. Итак, приступим. Представим что нам надо настроить почтовый домен em.linux2be.com
Требования:
- OS linux
Пакеты
- docker-ce
- docker-compose
Доступные порты:
SMTP_PORT=25
SMTPS_PORT=465
SUBMISSION_PORT=587
IMAP_PORT=143
IMAPS_PORT=993
POP_PORT=110
POPS_PORT=995
SIEVE_PORT=4190
DOVEADM_PORT=127.0.0.1:19991
HTTP=80
HTTPS=443
Эти порты можно поменять ниже в mailcow.conf, если они у вас уже заняты, например другими докер контейнерами.
Приступаем к установке
Клонируем репозиторий
git clone https://github.com/mailcow/mailcow-dockerized.git
cd mailcow-dockerized
Запускаем генератор конфига.
./generate_config.sh
Вводим
Мы сгенерировали конфиг на основе которого будет собираться наша связка из докер-контейнеров
Посмотреть его можно в файле
nano mailcow.conf
Теперь приступим к сборке
docker-compose pull
Запускаем
docker-compose up -d
Часть персистентных данных хранится в докерах volumes
docker volume ls | grep mail
Есле сервер на виртулке, и есть впс сервер, можно все спроксировать на него через nginx. Конфиг nginx тут.
Кладем его в /etc/nginx/conf.d/http_em.linux2be.com.conf
upstream backend-em.linux2be.com {
server 10.47.0.15:80;
}
server {
listen 80;
server_name
em.linux2be.com
www.em.linux2be.com
;
location ^~ /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://em.linux2be.com$request_uri;
}
}
server {
listen 443 http2 ssl;
server_name
em.linux2be.com
;
include /etc/nginx/ssl.d/linux2be.com/ssl.linux2be.com.conf;
#return 200;
location / {
proxy_pass http://backend-em.linux2be.com/; # change this
proxy_connect_timeout 100;
proxy_send_timeout 100;
proxy_read_timeout 100;
send_timeout 100;
}
}
Это для http.
Для почтовых сервисов делаем такой конфиг.
Добавляем эту часть конфига вниз файла /etc/nginx/nginx.conf
stream {
log_format json_combined escape=json
'{'
'"nginx.time":"$time_local",'
'"nginx.host":"",'
'"nginx.http_host":"",'
'"nginx.remote_addr":"$remote_addr",'
'"nginx.http_x_forwarded_for":"",'
'"nginx.request_method":"$protocol",'
'"nginx.request":"",'
'"nginx.status":"$status",'
'"nginx.upstream_status":"",'
'"nginx.body_bytes_sent":"$bytes_sent, $bytes_received",'
'"nginx.http_referer":"",'
'"nginx.request_time":"$session_time",'
'"nginx.upstream_response_time":"$upstream_connect_time",'
'"nginx.upstream_http_x_cache":"",'
'"nginx.uri":"",'
'"nginx.upstream_addr":"$upstream_addr",'
'"nginx.upstream_response_length":"$upstream_bytes_sent, $upstream_bytes_received",'
'"nginx.server_name":"",'
'"nginx.upstream_cache_status":"",'
'"nginx.user_agent":"",'
'"nginx.request_uri":"",'
'"nginx.request_body":""'
'}';
error_log /dev/stdout;
access_log /dev/stdout json_combined;
#access_log /var/log/nginx/stream.log json_combined;
include /etc/nginx/stream.d/*.conf;
}
Создаем каталог каталог /etc/nginx/stream.d
И создаем конфиг /etc/nginx/stream.d/mail_proxy.conf
Содержимое
server {
listen 25 reuseport;
proxy_pass 10.47.0.15:25;
}
server {
listen 587 reuseport;
proxy_pass 10.47.0.15:587;
}
server {
listen 465 reuseport;
proxy_pass 10.47.0.15:465;
}
server {
listen 110 reuseport;
proxy_pass 10.47.0.15:110;
}
server {
listen 143 reuseport;
proxy_pass 10.47.0.15:143;
}
server {
listen 993 reuseport;
proxy_pass 10.47.0.15:993;
}
server {
listen 995 reuseport;
proxy_pass 10.47.0.15:995;
}
Заходим по адресу https://em.linux2be.com
<a href="https://itc-life.ru/wp-content/uploads/2017/10/Выделение_070.png"><img class="alignnone size-large wp-image-3924" src="https://itc-life.ru/wp-content/uploads/2017/10/Выделение_070-1024×561.png" alt="" width="1024" height="561" /></a>
Данные для входа
Логин – admin
Пароль – moohoo
Меняем его после входа
ЗАмена серфиката postfix на свой
Чтобы не ругалось на сертификат – меняем его в конфиге postfix data/conf/postfix/main.cf на свой.
smtpd_tls_cert_file = /ssl.d/linux2be.com/certificate.crt
smtpd_tls_key_file = /ssl.d/linux2be.com/private.key
Далее добавляем почтовые домены
Создаем почтовые ящики
Далее добавлем dkim. Выбираем длину ключа 2048
Добавляем сгенерированный ящик в relay host – не обязательно
Добавляем пароль для rspamd – не обязательно
Заходим в сгерерированнй почтовые ящики через
Теперь остается настроить нашу почту чтобы она не попадала в спам. Настройка dns записей. Почтовый домен будет em.linux2be.com
Добавляем записи A
em.linux2be.com server_ip
mx.linux2be.com server_ip
Где сервере ip – ip вашего сервера или прокси
Dkim текстовые записи c именем селектора – dkim
dkim._domainkey.em.linux2be.com
v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg34KCAQEAqgkUMOXb7pIYVXxs3TMUgL/MyVubJB2Br6iJIIegR+9d+ucssa4y0pUs4LfzdqkoU8YjlX+V19osdk3EsjZYGYHddnzUkNwzVXOkyZx71rMiLvQhLpp3bFLHWiHixDR5ggN/07zz4OWRV6XApl51Ae2mNmu3S5R0NMePVe7lN6DRIuEDtDTSbVKg/avFM3YWQQe5/YH8dJLXf4UoOhKjhsLPsuiptexH7qkfSEMOGGo5hCyHMbeRoySksi829ZOE9YAlgbv/EyNpAHzTNM2kdlRugurc7W5pd9CG7E5G0bgY7grI37Apd/8eOpEYHSVCwXjattL6Bo3lYqGRrUYWpDzQIDAQAB
Dmarc текстовые записи
_dmarc.em.linux2be.com "v=DMARC1;p=reject;rua=mailto:webmaster@em.linux2be.com;ruf=mailto:webmaster@em.linux2be.com;"
Adsp текстовые записи(deprecated in 2013)
_adsp.em.linux2be.co dkim=all
Настраиваем запись mx для почтового домена em.linux2be.com
Добавим A запись (если нет)
mx.linux2be.com IP_ADDRESS
Добавим mx запись (если нет)
em.linux2be.com IN MX 10 mx.linux2be.com
Добавим spf записи
Есть мастер генерации spf записей – можете воспользоваться им.
https://www.spfwizard.net/
Создаем spf запись
em.linux2be.com "v=spf1 mx a a:mx.linux2be.com"
Проверяем записи
Проверка spf
https://www.dmarcanalyzer.com/spf/checker/
Проверка mx записи
host -tMX em.linux2be.com
Должно вернуть
em.linux2be.com mail is handled by 10 mx.linux2be.com.
Проверка _dmarc записи
dig TXT _dmarc.linux2be.com
или
https://www.dmarcanalyzer.com/dmarc/dmarc-record-check/
Проверка DKIM
https://www.dmarcanalyzer.com/dkim/dkim-check/
Регистрируем свой сервер в почтовом сервисе google
Регистрируем по ссылке тут https://postmaster.google.com/
Добавляем txt запись предоставленную google и нажимаем далее.
em "запись google"
Еще один докер.
https://github.com/tomav/docker-mailserver
Чекаем сервер здесь
https://mxtoolbox.com
Спасибо! Очень помогла статья твоя.
Настрока прошла как по маслу. Спасибо за труды.
Пожалуйста
Спасибо! но подскажите:
– откуда IP адрес 10.47.0.15 (сервера или докера)?
– Где создаем каталог каталог stream.d ?
Дополнил мануал, чтобы было понятнее. И вот небольшие пояснения.
– 10.47.0.15 – это ip виртуалки, на котором мы создаем(запускаем наш почтовый сервер), если у вас виртуалка с внешним ip v4/v6 адресом, то эти шаги делать не надо;
– stream.d – этот каталог я создаю в папке /etc/nginx
Так же есть более новый вариант статьи тут https://itc-life.ru/mailcow-dockerized-server-on-hetzner-robot-with-multiply-ipv4-and-ipv6/
Кто-нибудь в курсе как заставить Outlook 2013 взаимодействовать с MailCow? В инете нарыл только что нужно поменять /opt/ mailcow-dockerized/data/web/inc/vars.inc.php
‘userEASforOutlook’ => ‘no’ на ‘userEASforOutlook’ => ‘yes’
Но что-то это не помогло.
А что значит взаимодействовать ?
sogo пишет о недействительном сертификате, как исправить?
надо пробросить свои сертификаты в конетейнер
Не принимает письма. Отправка работает, получение – нет. Установлен на отдельном сервере с белым IP