Nel 2019, è la configurazione predefinita per Postfix su RHEL/CentOS. Postfix si lega solo all’interfaccia di loopback e scarta tutte le richieste SMTP che non provengono da 127.0.0.0/8. Nessuna autenticazione richiesta. Non sono sicuro riguardo a Debian, ma immagino che exim abbia una configurazione predefinita simile.
Alcuni argomenti rilevanti su questi forum da altri utenti che hanno incontrato questo problema:
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Non sembra esserci un argomento su come configurare questo su RHEL/CentOS con le modifiche necessarie sia a Discourse che a Postfix, quindi lo sto documentando qui.
Questo non sembra essere possibile con lo script discourse-setup, ma sono riuscito a farlo funzionare.
Per prima cosa, ho dovuto scoprire l’indirizzo IP dell’host Docker così come lo vede il container Docker. Usare 127.0.0.1 non funziona perché il container Docker vedrebbe 127.0.0.1 come se stesso. Piuttosto, dobbiamo specificare l’indirizzo IP o il nome host dell’host Docker che esegue il server SMTP Postfix, e che sia raggiungibile dal container Docker (quindi non l’indirizzo IP pubblico dell’host Docker se si desidera che il server SMTP non sia accessibile da Internet, ad esempio).
Ho estratto l’indirizzo IP rilevante dell’host Docker (172.17.0.1) dall’interfaccia docker0 eseguendo questo comando sull’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 ~]$
Poi ho modificato il file yaml della mia applicazione Discourse, impostando “DISCOURSE_SMTP_ADDRESS” su 172.17.0.1 come sopra.
[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]$
Nota che ho prima provato a usare il nome host interno del docker host.docker.internal per questo, ma apparentemente questo nome host non è disponibile per gli utenti Linux di Docker
Poiché la configurazione predefinita di Postfix su RHEL/CentOS si lega solo a 127.0.0.1 (il che è buono), dovrai modificare /etc/postfix/main.cf in modo che si leghi anche all’interfaccia docker0 e aggiungere quella sottorete al gruppo mynetworks in modo che il traffico SMTP proveniente dai container Docker venga accettato da 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]$
Dopo queste modifiche, ricostruisci Discourse e dovrebbe ora essere in grado di inviare email attraverso il Postfix dell’host Docker.
/var/discourse/launcher rebuild app
Sebbene questo funzioni, ho alcune domande:
- Esiste un’altra variabile d’ambiente o un nome host che punta già all’host Docker (
172.17.0.1in questo caso)?
Ho notato che c’è una variabile d’ambiente DISCOURSE_HOST_IP “iniettata” da launcher. È possibile impostare questa chiave yaml DISCOURSE_SMTP_ADDRESS allo stesso valore dell’altra chiave yaml con qualcosa di simile a questo?
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- In generale, quanto è durevole l’indirizzo IP
172.17.0.1dell’host Docker? È sempre questo indirizzo IP sui sistemi RHEL/CentOS? Cambierà mai per me?"}