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
RHEL/Cent OS에서 Discourse 및 postfix 모두에 필요한 변경 사항을 적용하여 설정하는 방법에 대한 주제는 없어 보입니다. 그래서 여기에서 이를 문서화합니다.
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을 사용하려고 했지만, apparently 이 호스트명은 linux docker 사용자에게 사용 가능하지 않은 것으로 보입니다.
RHEL/Cent OS의 기본 postfix 설정은 127.0.0.1에만 바인딩하므로(이것은 좋은 점입니다), docker 컨테이너에서 오는 SMTP 트래픽이 postfix에 의해 수락되도록 /etc/postfix/main.cf를 수정하여 docker0 인터페이스에도 바인딩하고 해당 서브넷을 mynetworks 그룹에 추가해야 합니다.
[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 키를 다른 키의 값과 동일하게 설정할 수 있을까요? 예를 들어 다음과 같이?
DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
- 일반적으로 docker 호스트의
172.17.0.1IP는 얼마나 안정적입니까? RHEL/Cent OS 시스템에서 항상 이 IP일까요? 나중에 변경될 수 있을까요?