Я запускаю dovecot с базой данных userdb и passdb внутри контейнера докеров, используя s6-оверлей.
Все работает очень хорошо. Теперь попробовал добавить предупреждения о квотах и столкнулись с проблемой при входе в /dev/stdout
.
Всякий раз, когда должно быть отправлено письмо с предупреждением, я вижу, что это сообщение регистрируется:
Oct 28 10:27:01 quota-warning: Error: Can't open log file /dev/stdout: No such device or address
Oct 28 10:27:01 quota-warning: Fatal: master: service(quota-warning): child 460 returned error 75
Я установил путь к журналу /dev/stdout
чтобы позволить S6 записывать журналы для меня. И я добавил сценарий предупреждения о квоте после руководства. Вот соответствующий конфиг:
log_path = /dev/stdout
first_valid_uid = 100
mail_uid = vmail
mail_gid = dovecot
mail_privileged_group = dovecot
mail_home = /var/mail/domains/%d/%n
mail_location = maildir:/var/mail/domains/%d/%n**
plugin {
quota = maildir:User quota
quota_exceeded_message = Storage quota for user %u exceeded
quota_rule2 = Trash:storage=+100M
quota_grace = 10%%
quota_status_success = DUNNO
quota_status_nouser = DUNNO
quota_status_overquota = "552 5.2.2 Mailbox is full"
quota_warning = storage=85%% quota-warning 85 %u %d
}
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail
group = dovecot
unix_listener quota-warning {
user = dovecot
mode = 0666
}
}
#!/bin/sh
PERCENT=$1
USER=$2
DOMAIN=$3
cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: no-reply@$DOMAIN
Subject: Qutoa warning
Your mailbox quota is at $PERCENT%.
EOF
S6 run
Скрипт для запуска dovecot очень прост:
#!/bin/sh
exec /usr/sbin/dovecot -F -c /etc/dovecot/dovecot.conf
Вывод журнала из /dev/stdout
захватывается через logs/run
сценарий:
#!/bin/sh
exec logutil-service /logs/dovecot
Все работает как только меняю log_path
в статический файл, например /tmp/dovecot.log
. Но я не этого хочу.
Как я вижу, нет /dev/stdout
создан для сценария предупреждения о квоте, и я не знаю, как это исправить.
Для записи: все остальное из dovecot отлично регистрируется через /dev/stdout
.
ОБНОВЛЕНИЕ: я также могу запустить quota-warning.sh
сценарий вручную из оболочки внутри контейнера без проблем. Он отправляет предупреждающее сообщение в почтовый ящик пользователя.
Это работает, если вы сделаете следующее:
Измените пользователя, выполняющего сценарий предупреждения о квоте, на корень:
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = root
}
Однако даже при запуске сценария от имени пользователя root (что не идеально с точки зрения безопасности) он не работает.
Поэтому я добавил следующие параметры к Dovecot-Ida командная строка:
/usr/libexec/dovecot/dovecot-lda -d $USER -o "log_path=/proc/1/fd/2" -o "info_log_path=/proc/1/fd/1" -o "plugin/quota=maildir:User quota:noenforcing"
При этом ведение журнала перенаправляется в STDOUT и STDERR процесса с PID = 1, то есть процесса, выходные данные которого обычно регистрируются докером.
Я не знаю, почему / dev / stdout и / dev / stderr недоступны для сценария предупреждения о квоте, даже если он запускается корень...
Вы тем временем нашли лучшее решение?
С уважением, Стефан