2019年現在、RHEL/CentOSにおけるPostfixのデフォルト設定では、Postfixはループバックインターフェースのみにバインドし、127.0.0.0/8 以外のSMTPリクエストをすべて破棄します。認証は不要です。Debianについては確信はありませんが、exim も同様のデフォルト設定になっていると想像します。
この問題に直面した他のユーザーによる、フォーラム上の関連トピックがいくつかあります。
- How to set SMTP config to use localhost?
- https://meta.discourse.org/t/smtp-without-user-or-password/88879
Discourse と Postfixの両方に対して必要な変更を加えて、RHEL/CentOS上でこれを設定する方法に関するトピックは見当たらないため、ここにドキュメント化します。
これは discourse-setup スクリプトでは不可能のようですが、私はこれを動作させることができました。
まず、Dockerコンテナから見たDockerホストのIPアドレスを特定する必要がありました。127.0.0.1 を使用しても機能しません。なぜなら、Dockerコンテナにとって 127.0.0.1 は自分自身として認識されるからです。むしろ、Postfix SMTPサーバーを実行しているDockerホストのIPアドレスまたはホスト名を指定する必要があります。また、そのアドレスはDockerコンテナからアクセス可能でなければなりません(例えば、SMTPサーバーをインターネットからアクセス不可にしたい場合、Dockerホストのインターネット向けIPアドレスは使用できません)。
Dockerホスト上で以下のコマンドを実行することで、docker0 インターフェースからDockerホストの関連IPアドレス(172.17.0.1)を抽出しました。
[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 ~]$
次に、Discourseアプリのyamlファイルを編集し、上記の 172.17.0.1 を「DISCOURSE_SMTP_ADDRESS」に設定しました。
[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 を使用しようとしましたが、どうやらこのホスト名はLinuxのDockerユーザーには利用できないようです。
RHEL/CentOSのデフォルトのPostfix設定は127.0.0.1のみにバインドしているため(これは良いことですが)、/etc/postfix/main.cf を変更して docker0 インターフェースにもバインドし、mynetworks グループにそのサブネットを追加する必要があります。これにより、DockerコンテナからのSMTPトラフィックが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を再ビルドすれば、DockerホストのPostfixを介してメールを送信できるようになるはずです。
/var/discourse/launcher rebuild app
これは動作しますが、いくつかの疑問があります。
- Dockerホスト(この場合は
172.17.0.1)を指す別の環境変数やホスト名は存在しないでしょうか?
launcher によって「注入」される DISCOURSE_HOST_IP という環境変数があることに気づきました。この DISCOURSE_SMTP_ADDRESS yamlキーを、他のyamlキーと同じ値に設定することは可能でしょうか?例えば以下のようにです。
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- 一般的に、Dockerホストの
172.17.0.1というIPアドレスはどの程度安定していますか?RHEL/CentOSシステムでは常にこのIPでしょうか?いつか変わることはあるでしょうか?