En 2019, esta es la configuración predeterminada para Postfix en RHEL/CentOS. Postfix se vincula únicamente a la interfaz de bucle local y descarta todas las solicitudes SMTP que no se originan en 127.0.0.0/8. No se requiere autenticación. No estoy seguro sobre Debian, pero imagino que exim tiene una configuración predeterminada similar.
Algunos temas relevantes en estos foros de otros usuarios que se enfrentaron a este problema:
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Parece que no hay ningún tema sobre cómo configurar esto en RHEL/CentOS con los cambios necesarios tanto en Discourse como en Postfix, por lo que lo estoy documentando aquí.
Esto no parece ser posible con el script discourse-setup, pero logré que funcionara.
Primero, tuve que averiguar la dirección IP del host de Docker tal como la ve el contenedor de Docker. Usar 127.0.0.1 no funcionará porque el contenedor de Docker verá 127.0.0.1 como sí mismo. Más bien, necesitamos especificar la dirección IP o el nombre de host del host de Docker que está ejecutando el servidor SMTP de Postfix, y que sea accesible desde el contenedor de Docker (por lo tanto, no la dirección IP pública de tu host de Docker si quieres que tu servidor SMTP no sea accesible desde Internet, por ejemplo).
Extraí la dirección IP relevante del host de Docker (172.17.0.1) de la interfaz docker0 ejecutando lo siguiente en el host de 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 ~]$
Luego edité el archivo yaml de mi aplicación de Discourse, estableciendo “DISCOURSE_SMTP_ADDRESS” en 172.17.0.1 del ejemplo anterior.
[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]$
Tenga en cuenta que primero intenté usar el nombre de host interno de Docker host.docker.internal para esto, pero aparentemente este nombre de host no está disponible para los usuarios de Docker en Linux
Dado que la configuración predeterminada de Postfix en RHEL/CentOS se vincula únicamente a 127.0.0.1 (lo cual es bueno), necesitará cambiar /etc/postfix/main.cf para que también se vincule a la interfaz docker0 y agregar esa subred al grupo mynetworks para que el tráfico SMTP que provenga de los contenedores de Docker sea aceptado por 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]$
Después de esos cambios, reconstruya Discourse y ahora debería poder enviar correos electrónicos a través del Postfix de su host de Docker.
/var/discourse/launcher rebuild app
Aunque esto funciona, tengo algunas preguntas:
- ¿Existe alguna otra variable de entorno o nombre de host que ya apunte al host de Docker (
172.17.0.1en este caso)?
Noté que hay una variable de entorno DISCOURSE_HOST_IP “inyectada” por launcher. ¿Es posible establecer esta clave yaml DISCOURSE_SMTP_ADDRESS con el mismo valor que la otra clave yaml con algo como esto?
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- En general, ¿qué tan duradera es la IP
172.17.0.1del host de Docker? ¿Es siempre esta IP en los sistemas RHEL/CentOS? ¿Cambiará alguna vez para mí?