我在 Docker 容器内使用基于 DB 的 userdb 和 passdb 运行 dovecots6-覆盖。
一切都运行良好。现在我尝试添加配额警告并遇到登录问题/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
相关 dovecot 配置
我已将日志路径设置为,/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 的S6脚本非常简单:
#!/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
从容器内的 shell 手动运行该脚本,没有任何问题。它会将警告消息发送到用户邮箱。
答案1
如果您执行以下操作,它将起作用:
将执行配额警告脚本的用户更改为根:
service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = root }
即使以 root 身份运行脚本(从安全角度来看这并不理想),它也不起作用。
因此,我将以下选项附加到多夫科特-lda命令行:
/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"
执行此操作时,日志记录将被重定向到 PID=1 进程的 STDOUT 和 STDERR,该进程的输出通常会被 docker 记录。
我不知道为什么 /dev/stdout 和 /dev/stderr 对配额警告脚本不可用,即使它由根...
与此同时,您是否找到了更好的解决方案?
谨致问候,Stefan