Почтовая система - docker
Инструкция по использования готового docker контейнера.
Буду показывать на примере docker-compose адаптированного под docker-swarm при необходимости нет никаких проблем переписать на обычный docker-compose или CLI.
Для хранения почты понадобится создать пользователя, дирикторию и права на дирикторию
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual Mail User" vmail
sudo mkdir -p /mnt/EMAIL
sudo chmod -R 770 /mnt/EMAIL
sudo chown -R vmail:mail /mnt/EMAIL
Для работы сервиса потребуются порты:
25 - стандартный порт для приема почты от внешних серверов
143 - порт для получения почты по клиентом
587 - порт для отправки почты клиентом, вместо незащищенного 25.
Для первого запуска контейнера потребуется описать docker-compose:
version: '3.9'
services:
email-docker:
image: h963z57/email-docker:latest
environment:
- TZ= # Часовой пояс
- EMAIL_DB_DRIVER=pgsql # Тип базы данных может быть также mysql
- EMAIL_DB_USER=MYUSER # Пользователь от БД
- EMAIL_DB_PASSWORD=MYPASS # Пароль от БД
- EMAIL_DB_HOST=db-1.example.com # Адрес серевера базы данных
- EMAIL_DB_NAME=MY_DB_NAME # Название базы данных
- EMAIL_HOSTNAME=mail.example.com # Адресс с которого расслается почта
- EMAIL_HELO_HOSTNAME=example.com # Имя сервера рассылки
- EMAIL_NETWORKS=127.0.0.0/8 # По-умолчанию, если сделать на весь интернет тогда почтовый сервис начнет пересылать спам.
- EMAIL_DOMAINS=example.com example2.com # Список доменов, для которых будет работать сервис
# Нужно если планируется использование RELAY сервисов, например AWS SES. Если не планируется нужно оставить закоментированным.
# - EMAIL_RELAY_HOST=email-smtp.eu-central-1.amazonaws.com
# - EMAIL_RELAY_PORT=587
# - EMAIL_RELAY_ACCESS_KEY=ACCESS_KEY
# - EMAIL_RELAY_SMTP_SECRET_KEY=SMTP_SECRET_KEY
# Нужно указать дирикторию для хранения почты, предварительно нужно дать необходимые права.
# К сожалению, использовать S3 не видится возможным в силу некоторых осоенностей.
volumes:
- type: bind
source: /mnt/EMAIL
target: /var/vmail
# Секреты обязательно должны быть в указанных дирикториях
secrets:
- source: fullchain.pem # SSL сертификат
target: /mnt/SSL/fullchain.pem
- source: privkey.pem # Приватный ключ SSL сертификата
target: /mnt/SSL/privkey.pem
# - example.com # Приватный ключ DKIM, если его нет, то система его сгенерирует автоматически, об этом читайте ниже
# Если бд в этом же проекте можно выставить зависимость, но и без нее будет всё работать.
# depends_on:
# - db
# Для работы необходимо чтобы сервис мог видеть реальные IP входящих соединений, иначе почта не будет доходить.
networks:
- host
# При необходимости секреты можно заменить на volumes
secrets:
fullchain.pem:
external: true
privkey.pem:
external: true
example.com:
external: true
networks:
host:
external: true
Данный код нужно запускать в режме interactive так как при отсутсвующем DKIM система его сгенерирует. После генерации, ключ нужно скопировать и пробросить в секретом или /run/secrets/example.com
Если все сделано верно, можно проверить журнал событий docker logs <ID> -f
если ошибок нет в при обращении к сервису, например, используя thunderbird
, тогда всё в порядке.