В 2019 году это конфигурация по умолчанию для postfix в RHEL/CentOS. Postfix привязывается только к петлевому интерфейсу и отбрасывает все SMTP-запросы, которые не исходят из 127.0.0.0/8. Аутентификация не требуется. Насчёт Debian я не уверен, но, думаю, exim имеет аналогичную конфигурацию по умолчанию.
Несколько тем на этих форумах от других пользователей, столкнувшихся с этой проблемой:
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Похоже, что темы о том, как настроить это в RHEL/CentOS с необходимыми изменениями как в Discourse, так и в postfix, нет, поэтому я документирую это здесь.
Похоже, что это невозможно сделать с помощью скрипта discourse-setup, но мне удалось заставить это работать.
Сначала мне нужно было определить IP-адрес хоста Docker так, как его видит контейнер Docker. Использование 127.0.0.1 не сработает, потому что контейнер Docker воспримет 127.0.0.1 как себя. Вместо этого нам нужно указать IP-адрес или имя хоста Docker-хоста, на котором запущен SMTP-сервер postfix, и который доступен для контейнера Docker (например, не внешний IP-адрес вашего Docker-хоста, если вы не хотите, чтобы ваш SMTP-сервер был доступен из интернета).
Я извлек соответствующий IP-адрес хоста Docker (172.17.0.1) из интерфейса docker0, выполнив на хосте Docker следующую команду:
[maltfield@osestaging1 ~]$ ip address show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:80:35:65:a1 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:80ff:fe35:65a1/64 scope link
valid_lft forever preferred_lft forever
[maltfield@osestaging1 ~]$
Затем я отредактировал yaml-файл моего приложения Discourse, установив значение “DISCOURSE_SMTP_ADDRESS” в 172.17.0.1 из вышеприведённого.
[maltfield@osestaging1 ~]$ cd /var/discourse/
[maltfield@osestaging1 discourse]$ grep SMTP containers/app.yml
DISCOURSE_SMTP_ADDRESS: 172.17.0.1
DISCOURSE_SMTP_PORT: 25
DISCOURSE_SMTP_AUTHENTICATION: none
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: false
[maltfield@osestaging1 discourse]$
Обратите внимание, что сначала я попытался использовать внутреннее имя хоста Docker host.docker.internal, но, похоже, это имя хоста недоступно для пользователей Docker в Linux.
Поскольку конфигурация postfix по умолчанию в RHEL/CentOS привязывается только к 127.0.0.1 (что хорошо), вам нужно изменить /etc/postfix/main.cf, чтобы он также привязывался к интерфейсу docker0, и добавить эту подсеть в группу mynetworks, чтобы SMTP-трафик, поступающий из контейнеров Docker, принимался postfix.
[maltfield@osestaging1 postfix]$ grep -ir '172.17' /etc/postfix/*
/etc/postfix/main.cf:inet_interfaces = 127.0.0.1, 172.17.0.1
/etc/postfix/main.cf:mynetworks = 127.0.0.0/8, 172.17.0.0/16
[maltfield@osestaging1 postfix]$
После этих изменений пересоберите Discourse, и теперь он должен уметь отправлять электронные письма через postfix вашего Docker-хоста.
/var/discourse/launcher rebuild app
Хотя это работает, у меня есть несколько вопросов:
- Существует ли какая-то другая переменная окружения или имя хоста, которые уже указывают на Docker-хост (
172.17.0.1в данном случае)?
Я заметил, что переменная окружения DISCOURSE_HOST_IP «внедряется» launcher. Возможно ли установить ключ yaml DISCOURSE_SMTP_ADDRESS в то же значение, что и другой ключ yaml, используя что-то вроде этого?
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- В целом, насколько стабилен IP-адрес
172.17.0.1Docker-хоста? Всегда ли это этот IP в системах RHEL/CentOS? Может ли он когда-нибудь измениться?