opium
@opium
Просто люблю качественно работать

Как решаете проблему отсутствия локального smtp сервера в docker?

Есть куча разного софта который шлет емайлы через локальный смтп без авторизации, к примеру почти все пхп скрипты через функцию mail
Локального смтп в докере по дефолту нет, так как противоречит парадигме один процесс один контейнер. Очевидных решения на мой взгляд 2
1)Поставить в контейнер с приложением смтп сервер и запускать его там в фореграунде перед самим приложение.
Из проблем что за смтп серверов никто не следит упал он или нет, то надо еще и какой нибудь супервизорд ставить.
Два процесса на контейнер, определенный геморрой в автоматизации деплоя.
2)Для php поставить какой нибудь ssmtp, который подменит бинарник sendmail прописанный в php.ini и будет слать письма через внешний сервис(свой или там гмайл, или мандрил).
Из минусов в целом потеря почты если внешний сервис не работает или проблемы с сетью до него.
Можно так же в самом приложении настроить отправку через внешний сервис если есть такой опции в нем, но опять таки потеря почты очень критична.

Наверно идеальное решение было бы запуск смтп сервера в отдельном контейнере и проброс 25 порта на локалхост контейнера с приложением.
Но как то нагуглить такое решение для докер композа сходу совсем не удалось.
  • Вопрос задан
  • 7010 просмотров
Пригласить эксперта
Ответы на вопрос 1
Tyranron
@Tyranron
Ну, вообщем, Вы всё сами правильно ответили.

Я использую указанный Вами 2й вариант. В Dockerfile добавляется слой с ssmtp и всё. В качестве ENTRYPOINT небольшой sh-скрипт, который конфигурирует sssmtp при старте контейнера в зависимости от переменных окружения. Все письма пересылаются на внешний центральный Postfix, который уже крутит всю бодягу с DKIM подписями и прочими email-прибамбасами.

Если Вы посадите этот Postfix внешний на ту же машину, где у Вас крутится и приложение, то вероятность потери такая же, как и в "традиционном" случае без Докера (ведь у Вас на машине Postfix или Exim все равно крутятся).

Также, как вариант, если есть возможность, можно предусмотреть retries для отправки email в самом коде приложения, если это настолько критично.

По поводу примерного docker-compose.yml:
version: '3'

services:
  fpm:
    container_name: fpm
    image: my/app
    depends_on:
      - mailserver
    expose:
      - "9000"     # php-fpm
    environment:
      - SMTP_SERVER=mailserver:587
      - SMTP_USER=testing@moderation.test
      - SMTP_PASSWORD=qweqweqwe
  nginx:
    container_name: nginx
    image: nginx:stable-alpine
    depends_on:
      - fpm
    ports:
      - "80:80"    # http
    volumes:
      - .dev/nginx.vhost.conf:/etc/nginx/conf.d/default.conf:ro
  mailserver:
    container_name: mailserver
    image: tvial/docker-mailserver:v2
    hostname: mail
    domainname: mydomain.test
    ports:
      - "25:25"    # smtp
      - "143:143"  # imap
      - "587:587"  # smtp-auth
      - "993:993"  # imap-secure
    volumes:
      - .dev/mail/accounts.cf:/tmp/docker-mailserver/postfix-accounts.cf:ro
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы