Em 2019, essa é a configuração padrão do Postfix no RHEL/CentOS. O Postfix se vincula apenas à interface de loopback e rejeita todas as solicitações SMTP que não se originam de 127.0.0.0/8. Nenhuma autenticação é necessária. Não tenho certeza sobre o Debian, mas imagino que o exim tenha uma configuração padrão semelhante.
Alguns tópicos relevantes nestes fóruns de outros usuários que enfrentaram esse problema:
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Parece não haver um tópico sobre como configurar isso no RHEL/CentOS com as alterações necessárias tanto no Discourse quanto no Postfix, então estou documentando isso aqui.
Isso não parece ser possível com o script discourse-setup, mas consegui fazer funcionar.
Primeiro, precisei descobrir o endereço IP do host Docker conforme visto pelo contêiner Docker. Usar 127.0.0.1 não funcionará porque o contêiner Docker verá 127.0.0.1 como ele mesmo. Em vez disso, precisamos especificar o endereço IP ou o nome de host do host Docker que está executando o servidor SMTP do Postfix, e que seja acessível pelo contêiner Docker (portanto, não o endereço IP público do seu host Docker, caso deseje que seu servidor SMTP não seja acessível pela Internet, por exemplo).
Extraí o endereço IP relevante do host Docker (172.17.0.1) da interface docker0 executando o seguinte no host 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 ~]$
Em seguida, editei o arquivo YAML do meu aplicativo Discourse, definindo “DISCOURSE_SMTP_ADDRESS” para 172.17.0.1 conforme acima.
[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]$
Observe que primeiro tentei usar o nome de host interno do Docker host.docker.internal para isso, mas aparentemente esse nome de host não está disponível para usuários do Docker no Linux.
Como a configuração padrão do Postfix no RHEL/CentOS se vincula apenas a 127.0.0.1 (o que é bom), você precisará alterar /etc/postfix/main.cf para que ele também se vincule à interface docker0 e adicionar essa sub-rede ao grupo mynetworks, de modo que o tráfego SMTP vindo dos contêineres Docker seja aceito pelo 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]$
Após essas alterações, reconstrua o Discourse e ele deverá agora ser capaz de enviar e-mails através do Postfix do seu host Docker.
/var/discourse/launcher rebuild app
Embora isso funcione, tenho algumas perguntas:
- Existe alguma outra variável de ambiente ou nome de host que já aponte para o host Docker (
172.17.0.1neste caso)?
Notei que há uma variável de ambiente DISCOURSE_HOST_IP “injetada” pelo launcher. É possível definir a chave YAML DISCOURSE_SMTP_ADDRESS com o mesmo valor que a outra chave YAML, algo assim?
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- Em geral, quão durável é o IP
172.17.0.1do host Docker? É sempre esse IP em sistemas RHEL/CentOS? Ele algum dia mudará para mim?