975 March 25, 2024, 12:33 p.m.

Почтовая система - 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, тогда всё в порядке.

Источники

Репозиторий email-docker