letsencrypt 업데이트 후 메일 수신기 로그 오류 발생

Self-hosted mail-receiver update following Let's Encrypt root certificate change 게시물의 토론을 이어서 진행합니다:

mail-receiver를 최신 버전으로 업데이트한 후 ./launcher logs mail-receiver를 실행하면 다음 오류가 발생합니다.

postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out
<20>Oct  1 06:10:33 postfix/postfix-script[86]: warning: symlink leaves directory: /etc/postfix/./makedefs.outStarting Postfix

그 외의 이벤트(수신된 이메일, 거부된 이메일 등)는 전혀 표시되지 않습니다.

최근 업데이트 이전에는 완벽하게 작동하던 커스텀 postfix 설정 관련 문제를 겪고 있으며, 로그가 없기 때문에 디버깅이 어렵습니다.

이 단계를 시도해 보셨나요?

저도 같은 오류 경고 메시지를 확인했지만, 그 후 Postfix는 정상적으로 실행되며 메일을 수신하고 있습니다.

때로는 로그가 즉시 플러시되지 않을 수 있으므로, 출력이 표시되기까지 잠시 기다려야 할 수 있습니다. 하지만 이는 경고 메시지와는 무관합니다.

혹시 실제로 크래시가 발생하고 있는 건가요?

저도 기본 설정(vanilla settings)으로 동일합니다. 하지만 업그레이드 전에 완벽하게 작동하던 추가 Postfix 규칙을 일시적으로 비활성화해야 했습니다.

  POSTCONF_smtpd_client_restrictions: 'regexp:/etc/postfix/shared/client_access_regex'

(이 규칙은 정규식 규칙을 사용하여 스팸을 거부하는 데 사용되었습니다.) 실제 문제는 이 설정이 활성화되어 있으면 Postfix가 모든 수신 메일을 거부하기 시작하는데, 로그에서 그 이유를 찾을 수 없다는 점입니다!

잠시일 수도 있지만, 몇 시간이 지났는데도 여전히 로그에 아무것도 표시되지 않습니다 (수신된 메일도, 거부된 메일도 표시되지 않으며, 수신 트래픽은 확실히 존재합니다).

말씀하신 대로 출력에 다른 로그 항목이 있지만, 출력 자체는 깨져 있습니다:

./launcher logs mail-receiver 출력은 <HEAD>로 시작합니다:

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
Operating environment:
HOSTNAME=discourse-mail-receiver
LANGUAGE=en_US.UTF-8
MAIL_DOMAIN=...
...
...
Setting smtpd_tls_security_level to 'may'
postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out

그 다음 로그 항목 1줄이 이어지며, <HEAD>가 여섯 번 더 반복되는 것으로 끝납니다:

<HEAD>
줄바꿈 없이 한 줄로 된 로그 항목..............................................................................................................................................................................................
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>

저는 출력의 끝부분만 보고 있었는데, 항상 다른 항목 없이 <HEAD>만 있는 것처럼 보였습니다.

확실히 ./launcher logs mail-receiver를 통한 로그 렌더링에 문제가 있는 것 같습니다.

이 문제를 해결한 것 같습니다. Dockerfile에 maillog_file 라인이 빠져 있습니다. 임시 해결책으로 mail-receiver.yml에 다음을 추가하고 다시 빌드했습니다:

  POSTCONF_maillog_file: '/dev/stdout'

하지만 이 문제는 도커 이미지에서 수정되어야 할 것 같습니다.

RUN >/etc/postfix/main.cf \
+	&& postconf -e maillog_file=/dev/stdout \
	&& postconf -e smtputf8_enable=no \
...

이 줄을 추가한 후 에러가 사라지고 로그가 정상적으로 작동하는 건가요? 그렇다면 해당 변경 사항을 PR로 제출해 주시겠어요?

https://github.com/discourse/mail-receiver/pull/11

https://github.com/discourse/mail-receiver/pull/12

고맙습니다 @md-misko - PR을 병합하고 Docker Hub의 discourse/mail-reciever:release 태그를 업데이트했습니다.

이미 알고 계실 거라 생각하지만, 혹시 이 주제를 접하는 다른 분들을 위해 참고해 주세요. 다음 명령을 실행하여 메일 리시버 버전을 업데이트할 수 있습니다:

docker pull discourse/mail-receiver:release
cd /var/discourse
./launcher rebuild mail-receiver

현재 실행 중인 이미지가 최신 버전으로 실행되고 있는지 테스트하는 방법에 대해 어떤 아이디어가 있으신가요?

조금 복잡하긴 하지만… 이렇게 하면 작동할 것 같습니다:

# First, make sure you've got the latest base image locally
# 먼저, 로컬에 최신 베이스 이미지가 있는지 확인하세요
docker pull discourse/mail-receiver:release

# Get the top layer of the base image
# 베이스 이미지의 최상위 레이어를 가져옵니다
BASE_IMAGE_HASH=$(docker history discourse/mail-receiver:release -q | head -n 1)

# Get the layers of the **running** version
# **실행 중**인 버전의 레이어를 가져옵니다
RUNNING_IMAGE_HASH=$(docker container inspect mail-receiver -f "{{.Image}}")
RUNNING_IMAGE_LAYERS=$(docker history $RUNNING_IMAGE_HASH -q)

# Check if the running image layers include the current base image:
# 실행 중인 이미지 레이어에 현재 베이스 이미지가 포함되어 있는지 확인합니다:
[[ "$RUNNING_IMAGE_LAYERS" == *"$BASE_IMAGE_HASH"* ]] && echo "Up to date"

이 명령은 최신 상태라면 "Up to date"를 출력합니다. 그렇지 않으면 마지막 줄은 아무것도 출력하지 않고, 0이 아닌 상태로 종료됩니다.

오, 정말 훌륭하시네요. 그리고 제가 이전에 일회용 해결책밖에 찾지 못했던 문제들에 대해 일반적인 해결책이 되는 것 같습니다. 제가 이걸 알아내기까지 꽤 시간이 걸렸을 텐데, RUNNING_IMAGE_LAYERS를 찾아봐야 한다는 걸 몰랐습니다.

업그레이드가 된 인스턴스와 안 된 인스턴스에서 테스트해 보았는데, 예상대로 작동하는 것 같습니다.

정말 감사합니다!