letsencrypt更新后mail-receiver日志错误

继续讨论 Let’s Encrypt 根证书变更后的自托管邮件接收器更新

在将 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 设置方面遇到了一些问题(这些设置在最近的更新前运行完美),需要进行调试,但如果没有日志则难以进行。

您尝试过这些步骤吗

1 个赞

我确实看到了相同的错误警告,但 Postfix 在之后仍正常运行并接收邮件。

有时日志似乎不会立即刷新,因此您可能需要等待一段时间才能看到输出。但这与警告无关。

那么它实际上会为您崩溃吗?

同样,使用默认设置。但我不得不暂时禁用额外的 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

随后是一行日志条目,并以 <HEAD> 结尾,该标签又重复了六次:

<HEAD>
Single line of log entries without line breaks..............................................................................................................................................................................................
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>

我之前只查看了输出的末尾,那里似乎总是只有 <HEAD>,没有任何其他条目。

./launcher logs mail-receiver 对日志的渲染肯定存在问题。

我想我已经解决了这个问题,Dockerfile 中缺少一行 maillog_file。临时修复方案:在 mail-receiver.yml 中添加了

  POSTCONF_maillog_file: '/dev/stdout'

并重新构建,但这应该在 Docker 镜像中进行修复

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

1 个赞

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

感谢 @md-misko - 我已合并 PR 并更新了 Dockerhub 上的 discourse/mail-reciever:release 标签。

我确定您已经知晓,但万一其他人看到此主题,您可以通过运行以下命令来更新您的邮件接收器版本:

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

您有什么方法可以测试当前运行的映像是否是最新版本吗?

有点绕……但我想这应该可以:

# 首先,确保你本地有最新的基础镜像
docker pull discourse/mail-receiver:release

# 获取基础镜像的顶层
BASE_IMAGE_HASH=$(docker history discourse/mail-receiver:release -q | head -n 1)

# 获取**正在运行**版本的镜像层
RUNNING_IMAGE_HASH=$(docker container inspect mail-receiver -f "{{.Image}}")
RUNNING_IMAGE_LAYERS=$(docker history $RUNNING_IMAGE_HASH -q)

# 检查运行镜像的层是否包含当前的基础镜像:
[[ "$RUNNING_IMAGE_LAYERS" == *"$BASE_IMAGE_HASH"* ]] && echo "Up to date"

如果你的镜像是最新的,它将打印“Up to date”。否则,最后一行将不打印任何内容,并以非零状态退出。

2 个赞

太棒了。这看起来是一个通用的解决方案,我以前只找到过一次性的解决方案。我需要花点时间才能弄清楚。我不知道要查找 RUNNING_IMAGE_LAYERS

我在一个已升级的实例和一个未升级的实例上进行了测试,它似乎表现符合预期。

非常感谢!

3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.