Ошибки в логах почтового сервера после обновления Let's Encrypt

Продолжение обсуждения из Обновление почтового получателя с собственным хостингом после изменения корневого сертификата 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 (которые до недавнего обновления работали безупречно) и мне нужно отладить их, что затруднительно без логов.

Вы пробовали эти шаги?

Я тоже вижу те же ошибки предупреждения, но 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)
Операционная среда:
HOSTNAME=discourse-mail-receiver
LANGUAGE=en_US.UTF-8
MAIL_DOMAIN=...
...
...
Установка smtpd_tls_security_level в значение 'may'
postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out

затем следует одна строка записей журнала, а в конце <HEAD> повторяется ещё шесть раз:

<HEAD>
Одна строка записей журнала без переносов строк..............................................................................................................................................................................................
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>
<HEAD>

Я смотрел только на конец вывода, и там всегда, казалось, был только <HEAD> без каких-либо других записей.

Очевидно, что проблема в отображении журнала через ./launcher logs mail-receiver.

Думаю, я разобрался: в Dockerfile отсутствует строка maillog_file. Временное решение: добавил

  POSTCONF_maillog_file: '/dev/stdout'

в файл mail-receiver.yml и пересобрал образ, но это, вероятно, следует исправить в самом 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

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

Спасибо @md-misko — я принял PR и обновил тег discourse/mail-receiver:release на Dockerhub.

Уверен, вы уже об этом знаете, но на случай, если кто-то ещё наткнётся на эту тему, вы можете обновить версию получателя почты, выполнив:

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

Есть ли у вас идеи, как проверить, что текущий запущенный образ использует последнюю версию?

Немного запутанно… но, думаю, это должно сработать:

# Сначала убедитесь, что у вас есть последний базовый образ локально
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 "Актуально"

Это выведет «Актуально», если у вас последняя версия. В противном случае последняя строка ничего не выведет и завершится с ненулевым статусом.

О, это блестяще! И, похоже, это универсальное решение, для которого я ранее находил только разовые варианты. Мне бы потребовалось много времени, чтобы самому до этого додуматься. Именно RUNNING_IMAGE_LAYERS я не знал, где искать.

Я протестировал это на экземпляре, который был обновлён, и на том, который не обновлялся, и всё работает как ожидалось.

Огромное вам спасибо!