Im Jahr 2019 ist dies die Standardkonfiguration für Postfix auf RHEL/CentOS. Postfix bindet sich nur an die Loopback-Schnittstelle und verwirft alle SMTP-Anfragen, die nicht von 127.0.0.0/8 stammen. Keine Authentifizierung erforderlich. Bei Debian bin ich mir nicht sicher, aber ich vermute, dass exim eine ähnliche Standardkonfiguration hat.
Ein paar relevante Themen in diesen Foren von anderen Benutzern, die auf dieses Problem gestoßen sind:
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Es scheint kein Thema zu geben, das erklärt, wie man dies auf RHEL/CentOS mit den notwendigen Änderungen sowohl an Discourse als auch an Postfix einrichtet, daher dokumentiere ich dies hier.
Dies scheint mit dem discourse-setup-Skript nicht möglich zu sein, aber ich habe es zum Laufen gebracht.
Zuerst musste ich die IP-Adresse des Docker-Hosts herausfinden, wie sie vom Docker-Container gesehen wird. Die Verwendung von 127.0.0.1 funktioniert nicht, weil der Docker-Container 127.0.0.1 als sich selbst interpretiert. Stattdessen müssen wir die IP-Adresse oder den Hostnamen des Docker-Hosts angeben, auf dem der Postfix-SMTP-Server läuft und der vom Docker-Container erreichbar ist (also nicht die öffentlich zugängliche IP-Adresse Ihres Docker-Hosts, wenn Sie möchten, dass Ihr SMTP-Server nicht über das Internet erreichbar ist).
Ich habe die relevante IP-Adresse des Docker-Hosts (172.17.0.1) von der docker0-Schnittstelle extrahiert, indem ich dies auf dem Docker-Host ausgeführt habe:
[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 ~]$
Dann habe ich die YAML-Datei meiner Discourse-App bearbeitet und den Wert von “DISCOURSE_SMTP_ADDRESS” auf 172.17.0.1 gesetzt, wie oben angegeben.
[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]$
Beachten Sie, dass ich zuerst versucht habe, den internen Docker-Hostnamen host.docker.internal dafür zu verwenden, aber dieser Hostname ist anscheinend für Linux-Docker-Benutzer nicht verfügbar.
Da die Standard-Postfix-Konfiguration in RHEL/CentOS nur an 127.0.0.1 bindet (was gut ist), müssen Sie /etc/postfix/main.cf so ändern, dass es auch an die docker0-Schnittstelle bindet, und dieses Subnetz zur Gruppe mynetworks hinzufügen, damit SMTP-Verkehr, der von Docker-Containern kommt, von Postfix akzeptiert wird.
[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]$
Nach diesen Änderungen Discourse neu aufbauen, und es sollte nun in der Lage sein, E-Mails über den Postfix Ihres Docker-Hosts zu versenden.
/var/discourse/launcher rebuild app
Obwohl dies funktioniert, habe ich ein paar Fragen:
- Gibt es eine andere Umgebungsvariable oder einen Hostnamen, der bereits auf den Docker-Host zeigt (
172.17.0.1in diesem Fall)?
Ich habe bemerkt, dass es eine Umgebungsvariable DISCOURSE_HOST_IP gibt, die von launcher „injiziert“ wird. Ist es möglich, diesen YAML-Schlüssel DISCOURSE_SMTP_ADDRESS auf denselben Wert wie den anderen YAML-Schlüssel zu setzen, so ähnlich wie:
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- Wie stabil ist im Allgemeinen die IP-Adresse
172.17.0.1des Docker-Hosts? Ist sie auf RHEL/CentOS-Systemen immer diese IP? Wird sie sich jemals für mich ändern?