在自建郵件系統的環境中,Dovecot 通常會產生大量的 IMAP、POP3 與授權相關 Log。
若 Log 直接寫入檔案,沒有任何輪替機制(log rotation),磁碟空間會在短時間內被迅速吃光。
本文將示範如何在 Docker 版本的 Dovecot 中,正確設定 logrotate,讓 Log 能夠自動每日或超量輪替、壓縮、保留,並在輪替後讓 Dovecot 重新開啟 Log 檔案。
🔧 1. Dovecot 容器啟動方式(範例)
以下為實際使用的 Dovecot Docker run 指令:
docker run -dit --name maildovecot \
--restart=always \
--network mail-network \
--publish 110:110/tcp \
--publish 995:995/tcp \
--publish 143:143/tcp \
--publish 993:993/tcp \
--publish 24:24/tcp \
--publish 4190:4190/tcp \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v $PWD/config:/etc/dovecot \
-v $PWD/log:/var/log \
-v /opt/docker/mailsys/dovecot/alpine-3.22.1/usermail:/var/vmail \
-v /opt/docker/wwwapp/data/etc-letsencrypt:/etc/letsencrypt \
dovecot-alpine:4.0
重點是:
-v $PWD/log:/var/log
Dovecot 的 log 實際被寫到 主機(host)上的目錄,因此 logrotate 應該設定在主機端。
🔧 2. 建立 logrotate 設定檔
在主機上建立:
/etc/logrotate.d/dovecot
內容如下(已修正中文註解造成的解析錯誤):
/opt/docker/mailsys/dovecot/alpine-3.22.1/ver-4.0/log/dovecot/dovecot-info.log \
/opt/docker/mailsys/dovecot/alpine-3.22.1/ver-4.0/log/dovecot/dovecot.log \
/opt/docker/mailsys/dovecot/alpine-3.22.1/ver-4.0/log/dovecot/sa-learn.log {
# 每天檢查一次
daily
# 超過 50MB 強制輪替
size 50M
# 保留 14 份舊檔
rotate 14
# 壓縮輪替檔案
compress
# 延後壓縮上一輪
delaycompress
# 若檔案不存在則略過
missingok
# 若檔案為空則不輪替
notifempty
# 複製+truncate(不需要重啟服務)
copytruncate
sharedscripts
postrotate
# 請 Dovecot 重新開啟 log(在容器內執行)
docker exec maildovecot doveadm log reopen 2>/dev/null || true
endscript
}
若你在檢查 logrotate 時看到 “unknown unit” 表示「指令與中文註解不能放在同一行」,修正後即可正常運作。
🔧 3. 測試 logrotate
logrotate -d /etc/logrotate.conf # Dry-run 測試
logrotate /etc/logrotate.conf # 真正執行一次
成功後,你會看到:
dovecot.log
dovecot.log.1.gz
dovecot-info.log
dovecot-info.log.1.gz
sa-learn.log.1.gz
...
表示 logrotate 已經成功接管 Dovecot 的 log。
✔ 建議:不要長期開啟 mail_debug
Dovecot 若開啟:
mail_debug = yes
log 量會爆炸性增加,建議:
- 正常運作時 關閉
- 排錯時再暫時開啟
🎉 結論
透過上述方法,你可以讓 Docker 中的 Dovecot:
- 日誌每日輪替
- 超過 50MB 即輪替
- 自動壓縮舊檔
- 保留 14 份歷史記錄
- 不必重啟容器
- 安全且不會爆磁碟
這是在自架 mail server 中最重要但最容易忽略的一環。