docker-mailserver v15 → v16:四处静默失效与升级顺序
- 项目:
- 文档:
- 变更记录:
从 v15 升到 v16,真正会导致服务中断或在无提示情况下失效的有四件事:
- 自定义
dovecot.cf如果还是 Dovecot 2.3 语法,将不会被加载,而且不会报错;Dovecot 2.4 会直接使用默认配置启动。 dhparams.pem被静默忽略,不会给出任何警告;Postfix 的smtpd_tls_dh1024_param_file与 Dovecot 的ssl_server_dh_file被 unset,587/465、143/993、110/995 不再提供 DHE cipher suite,25 端口不变。- DKIM 私钥命名换了:
setup config dkim现在写-.private;已有的dkim_signing.conf不会被覆盖,新旧路径是否匹配需要逐个域名检查。 - Redis → Valkey(edge / v16.0.2 方向):v16.0.x 产生的 Redis 8 RDB format 12 状态无法被 Valkey 加载,Valkey 空启动,Rspamd 的 Bayes 等数据必须重新学习;来自 v15 及更早(Redis 7.2)的状态会自动迁移。
版本分层
| 版本 | 基础变化 | 主要破坏性变更 |
|---|---|---|
| v16.0.0 | Debian 12 → 13,Dovecot 2.3 → 2.4 | SA_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_SUBJECT | SPAM_SUBJECT | v16.0.0 |
ENABLE_RSPAMD_REDIS | ENABLE_RSPAMD_VALKEY | edge |
LDAP_QUERY_FILTER_USER | POSTFIX_USERS_QUERY_FILTER | edge |
LDAP_QUERY_FILTER_GROUP | POSTFIX_GROUPS_QUERY_FILTER | edge |
LDAP_QUERY_FILTER_ALIAS | POSTFIX_ALIASES_QUERY_FILTER | edge |
LDAP_QUERY_FILTER_DOMAIN | POSTFIX_DOMAINS_QUERY_FILTER | edge |
LDAP_QUERY_FILTER_SENDERS | POSTFIX_SENDERS_QUERY_FILTER | edge |
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 等于被禁用。
升级检查清单
- 备份配置卷
/tmp/docker-mailserver与 state 卷/var/mail-state。 - 替换 ENV:至少
SA_SPAM_SUBJECT→SPAM_SUBJECT;跟 edge 还要改ENABLE_RSPAMD_REDIS与服务名rspamd-valkey。 - 检查配置卷里的
dovecot.cf是否还是 2.3 语法;是则按 2.4 改写后再启动。 - 确认
dhparams.pem是否还承担 DHE 需求;需要就写 config override,不需要则接受认证端口不再提供 DHE。 - 跑
setup config dkim后核对rspamd/dkim/-.private;检查已有dkim_signing.conf的路径模板是否指向新命名,多域名看dkim_selectors.map。 - 跟 edge 时先看
/var/mail-state/lib-redis的来源:v15 及更早会自动迁移到lib-valkey;v16.0.x 的 RDB format 12 无法加载,准备重学 Bayes。 - LDAP 用户检查改名后的
POSTFIX_*_QUERY_FILTER,确认每张 lookup table 都有query_filter。 - 启动后跑
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 变更尚未发版,生产环境不要直接跟。