编程 docker-mailserver v15 → v16:四处静默失效与升级顺序

2026-10-27 00:05:00

docker-mailserver v15 → v16:四处静默失效与升级顺序

  • 项目:
  • 文档:
  • 变更记录:

从 v15 升到 v16,真正会导致服务中断或在无提示情况下失效的有四件事:

  1. 自定义 dovecot.cf 如果还是 Dovecot 2.3 语法,将不会被加载,而且不会报错;Dovecot 2.4 会直接使用默认配置启动。
  2. dhparams.pem 被静默忽略,不会给出任何警告;Postfix 的 smtpd_tls_dh1024_param_file 与 Dovecot 的 ssl_server_dh_file 被 unset,587/465、143/993、110/995 不再提供 DHE cipher suite,25 端口不变。
  3. DKIM 私钥命名换了:setup config dkim 现在写 -.private;已有的 dkim_signing.conf 不会被覆盖,新旧路径是否匹配需要逐个域名检查。
  4. Redis → Valkey(edge / v16.0.2 方向):v16.0.x 产生的 Redis 8 RDB format 12 状态无法被 Valkey 加载,Valkey 空启动,Rspamd 的 Bayes 等数据必须重新学习;来自 v15 及更早(Redis 7.2)的状态会自动迁移。

版本分层

版本基础变化主要破坏性变更
v16.0.0Debian 12 → 13,Dovecot 2.3 → 2.4SA_SPAM_SUBJECT → SPAM_SUBJECT;2.3 语法 dovecot.cf 不加载;dhparams.pem 静默失效;SpamAssassin 移除 Pyzor + Razor
v16.0.1—dovecot-solr 重新默认包含(需手动配置);恢复 quota_status_* 响应;修复 LDAP 的 DOVECOT_PASS_ATTRS / DOVECOT_USER_ATTRS / DOVECOT_AUTH_BIND 对 Dovecot 2.4 字段与认证 bind 的配置
Unreleased / edge(v16.0.2 方向)—移除 Xapian,改用 Flatcurve;Redis → Valkey;DKIM 密钥命名与 dkim_signing.conf 模板;LDAP Postfix 配置重构

v15 基线也要先确认:v15.0.0 移除 saslauthd 的 pam/shadow/mysql,只保留 ldap 与 rimap;getmail6 配置移到配置卷 getmail/ 子目录,状态目录改为 /var/lib/getmail(挂 state 卷时为 /var/mail-state/lib-getmail),需手动迁移;setup email delete 删除邮箱数据需显式确认。v15.1.0 起 ENV 支持 __FILE 后缀、DMS_CONFIG_POLL 可调轮询秒数、默认 postfix-sasl jail 被移除。

逐项变更与命令

Dovecot 2.4:旧语法配置无人接手

Dovecot 从 2.3 升到 2.4,使用 2.3 语法的自定义 dovecot.cf 不会加载。这里没有迁移报错,只有默认配置生效,认证、配额、命名空间的行为可能与升级前不同。升级后先看日志再改配置:

docker compose pull
docker compose up -d
docker logs --tail 200 mailserver

配套的 quota 变化:grace 仍是每个邮箱 10%,但 Dovecot 2.4 的 quota_storage_grace 是尺寸而不是百分比,per-user quota 现在显式设置它。LDAP 的 mailStorageDirectory 现在只是文件系统路径(去掉 maildir: 前缀),Dovecot 映射到 mail_path 而不是 mail。

dhparams.pem:文件还在,但已经不起作用

v16 移除了内置 RFC 7919 ffdhe4096 DH 参数与 /tmp/docker-mailserver/dhparams.pem 覆盖。dhparams.pem 被忽略且不给警告;认证端口 587/465、143/993、110/995 不再提供 DHE cipher suites。需要恢复自定义 DH 参数,走 config overrides(postfix-main.cf 等)重新设置 smtpd_tls_dh1024_param_file 和 ssl_server_dh_file,否则 dhparams.pem 留在原处也只是占位。

DKIM:密钥文件名与配置模板一起变了

setup config dkim 的输出从:

---.private.txt

改为:

-.private

默认 dkim_signing.conf 使用 $domain-$selector 路径模板并设 try_fallback = true,多域名共用一个配置。已有 dkim_signing.conf 不会被覆盖,所以升级后旧配置仍指向旧命名,而新密钥按新命名写入磁盘;不匹配时签名不会生效。旧 OpenDKIM 路径 opendkim/keys//.private 对应到 rspamd/dkim/-.private。另外会生成持久化的 dkim_selectors.map 用于自定义 selector。检查生成结果:

docker exec mailserver setup config dkim
find /tmp/docker-mailserver/rspamd/dkim -name '*.private'

Redis → Valkey:唯一会丢学习数据的一项

这条落在 edge(v16.0.2 方向):ENV ENABLE_RSPAMD_REDIS 改名 ENABLE_RSPAMD_VALKEY,服务 rspamd-redis 改名 rspamd-valkey,配置文件为 /etc/valkey/valkey.conf。

状态迁移分两种情况:

  • /var/mail-state/lib-redis 中来自 Redis 7.2 或更早(DMS v15 及更早)的状态,会自动迁移到 lib-valkey。
  • 来自 DMS v16(Redis 8,RDB format 12)的状态无法被 Valkey 加载:原样留在 lib-redis,Valkey 空启动,Rspamd 的 Bayes 等数据必须重新学习。
find /var/mail-state -maxdepth 2 -type d

其它升级后会明显察觉的变动

旧新版本
SA_SPAM_SUBJECTSPAM_SUBJECTv16.0.0
ENABLE_RSPAMD_REDISENABLE_RSPAMD_VALKEYedge
LDAP_QUERY_FILTER_USERPOSTFIX_USERS_QUERY_FILTERedge
LDAP_QUERY_FILTER_GROUPPOSTFIX_GROUPS_QUERY_FILTERedge
LDAP_QUERY_FILTER_ALIASPOSTFIX_ALIASES_QUERY_FILTERedge
LDAP_QUERY_FILTER_DOMAINPOSTFIX_DOMAINS_QUERY_FILTERedge
LDAP_QUERY_FILTER_SENDERSPOSTFIX_SENDERS_QUERY_FILTERedge
  • dovecot-flatcurve 现在会安装;edge 移除 dovecot-fts-xapian,已有 xapian-indexes 不能被 Flatcurve 复用。
  • Postfix 的 Amavis 配置里 disable_dns_lookups 换成 smtp_dns_support_level。
  • Fail2Ban 1.1.0 → 1.1.1;Postfix/Dovecot jail 固定为 file backend(Debian 默认路径改成了 systemd journal)。
  • 日志全部输出到 STDERR(原来只有 warning/error)。
  • OpenDKIM 的 OmitHeaders 末尾有 stray " ",最后一项被解析成名为 DKIM-Signature 的头,导致 DKIM-Signature 实际从未被省略——v16.0.0 已修。
  • 新增 dms-healthcheck 命令,Dockerfile 带默认 HEALTHCHECK;k8s/podman 需自行配置 healthcheck。
  • edge 的 LDAP Postfix 配置改为启动时生成到 /etc/postfix/ldap/{users,groups,aliases,domains,senders}.cf(原 /etc/postfix/ldap-*.cf);配置卷里的 ldap-*.cf 现在是合并而不是替换;新增 ldap-senders.cf。不再有默认查询过滤器与 LDAP_SERVER_HOST 等占位值,没有 query_filter 的 lookup table 等于被禁用。

升级检查清单

  1. 备份配置卷 /tmp/docker-mailserver 与 state 卷 /var/mail-state。
  2. 替换 ENV:至少 SA_SPAM_SUBJECT → SPAM_SUBJECT;跟 edge 还要改 ENABLE_RSPAMD_REDIS 与服务名 rspamd-valkey。
  3. 检查配置卷里的 dovecot.cf 是否还是 2.3 语法;是则按 2.4 改写后再启动。
  4. 确认 dhparams.pem 是否还承担 DHE 需求;需要就写 config override,不需要则接受认证端口不再提供 DHE。
  5. 跑 setup config dkim 后核对 rspamd/dkim/-.private;检查已有 dkim_signing.conf 的路径模板是否指向新命名,多域名看 dkim_selectors.map。
  6. 跟 edge 时先看 /var/mail-state/lib-redis 的来源:v15 及更早会自动迁移到 lib-valkey;v16.0.x 的 RDB format 12 无法加载,准备重学 Bayes。
  7. LDAP 用户检查改名后的 POSTFIX_*_QUERY_FILTER,确认每张 lookup table 都有 query_filter。
  8. 启动后跑 dms-healthcheck,并确认日志走 STDERR;ENABLE_QUOTAS=1 的场景验证转发到外部地址的 alias 与 per-user quota grace。
docker compose pull && docker compose up -d
docker exec mailserver dms-healthcheck
docker exec mailserver setup email list

回滚边界

回滚镜像 tag 只回退程序,配置卷和 state 卷不会跟着回退。

  • Dovecot 2.4 启动后是否已改写索引或元数据,需自行验证;回滚前保留 /var/mail 与 /var/mail-state 的快照。
  • dhparams.pem 在 v16 期间被忽略但文件仍在,回退到 v15 后会重新生效。
  • DKIM 新私钥写在 rspamd/dkim/-.private,旧 OpenDKIM 文件在 opendkim/keys//.private;回退到使用 OpenDKIM 的版本前确认旧文件还在。
  • Valkey 场景下 Redis 8 的状态原样留在 /var/mail-state/lib-redis,未被删除;回退到 v16.0.x 能否直接读回需自行验证。edge 变更尚未发版,生产环境不要直接跟。

推荐文章

程序员茄子在线接单