Hansen's ink

Back

核心配置要点与规避事项#

  1. 标准输出重定向 (Syslog 限制): 容器环境通常缺失 syslog 进程。Postfix 与 Dovecot 的日志必须显式重定向至 /dev/stdout/dev/stderr,以确保日志可通过 docker logs 捕获。
  2. SSL 强制依赖检查: Dovecot 2.3+ 版本即使在 ssl = no 模式下,若配置文件中存在未注释的 ssl_cert 路径,仍会因检查证书文件失败而产生 Fatal 错误。
  3. LMTP 端口非特权化: 为避免 Linux 容器对 1024 以下端口(特权端口)的权限限制或网络策略拦截,建议将内部 LMTP 投递端口由默认的 24 迁移至高位端口(如 2424)。
  4. 静态虚拟用户数据库 (Userdb Static): 在使用 passwd-file 作为认证源时,userdb 应配置为 static 驱动。需显式指定 uidgidmail 路径格式,防止 Dovecot 自动探测机制在非标准环境下失效。

部署流程#

环境说明:

  • 宿主机: Gentoo Linux
  • 基础镜像: Rocky Linux 9
  • 数据根目录: /opt/mail_stack
  • 示例域名: localhost.com

1. 宿主机环境初始化#

配置数据持久化目录并统一 UID/GID 映射,确保容器内外文件系统访问权限一致。

2. 提取基础配置文件#

通过临时容器获取各组件的默认配置文件。

docker run --rm -v /opt/mail_stack/postfix_conf:/export rockylinux:9 \
  bash -c "dnf install -y postfix && cp -r /etc/postfix/* /export/"
docker run --rm -v /opt/mail_stack/dovecot_conf:/export rockylinux:9 \
  bash -c "dnf install -y dovecot && cp -r /etc/dovecot/* /export/"
zsh

3. Dovecot 配置优化#

编辑 /opt/mail_stack/dovecot_conf/ 目录下的配置文件。

  • 协议声明: dovecot.conf 头部添加 protocols = imap lmtp
  • 日志输出: conf.d/10-logging.conf 设置为标准流输出。
  • 禁用 SSL:conf.d/10-ssl.conf 中设置 ssl = no 并注释所有 ssl_certssl_key 行。
  • LMTP 监听配置: 修改 conf.d/10-master.conf
    service lmtp {
      inet_listener lmtp {
        address = 0.0.0.0
        port = 2424
      }
    }
    text
  • 认证策略: 重写 conf.d/10-auth.conf
    disable_plaintext_auth = no
    auth_mechanisms = plain login
    passdb {
      driver = passwd-file
      args = scheme=PLAIN username_format=%u /etc/dovecot/users/passwd
    }
    userdb {
      driver = static
      args = uid=5000 gid=5000 home=/var/vmail/%d/%n mail=maildir:/var/vmail/%d/%n
    }
    text

4. Postfix 路由配置#

/opt/mail_stack/postfix_conf/main.cf 中追加或修改以下参数:

myhostname = mail.localhost.com
mydomain = localhost.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
virtual_mailbox_domains = localhost.com
virtual_transport = lmtp:inet:dovecot:2424
local_recipient_maps =
text

5. 容器构建与编排#

Dockerfile.postfix:

FROM rockylinux:9
RUN dnf install -y postfix && dnf clean all
RUN postconf -e "maillog_file = /dev/stdout"
CMD ["postfix", "start-fg"]
dockerfile

Dockerfile.dovecot:

FROM rockylinux:9
RUN dnf install -y dovecot && dnf clean all
CMD ["dovecot", "-F"]
dockerfile

docker-compose.yml:

6. 服务验证#

执行 docker-compose up -d --build 启动服务。

SMTP 投递测试: 使用 telnetnc 连接宿主机 25 端口,通过 DATA 指令提交邮件。

文件系统验证: 检查 /opt/mail_stack/vmail/localhost.com/guoy/new/ 目录。若生成对应的邮件文件,则说明 Postfix (SMTP) 经由 LMTP 成功向 Dovecot 交付邮件。

基于 Docker 的 MailServer 部署指南 (Gentoo Linux)
https://astro-pure.js.org/blog/mailserver
Author Hansen W.
Published at April 16, 2026
Comment seems to stuck. Try to refresh?✨