You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅为单个用户在两个Dovecot实例间配置dsync同步?

如何仅为单个用户在两个Dovecot实例间配置dsync同步?

看起来你已经找对了核心思路,但有两个关键细节需要调整,咱们一步步来解决你的问题:

一、解决其他用户触发dsync同步错误的问题

你遇到的「User has no mail_replica in userdb」错误,核心原因要么是非目标用户的noreplicate属性没被正确识别,要么是doveadm sync的调用方式导致它尝试遍历所有用户。

1. 修正noreplicate的格式

Dovecot的布尔型属性通常只需要指定属性名即可,不需要赋值。你当前Lua代码里写的noreplicate=yes可能不符合预期,改成不带值的形式试试:

else
  return dovecot.auth.USERDB_RESULT_OK, fields .. " noreplicate"
end

同时检查字符串拼接的空格——确保noreplicate和前面的字段之间有空格,避免语法错误导致属性不生效。

2. 精准指定同步用户

如果之前用的是doveadm sync *触发同步,它会尝试遍历所有用户,哪怕你加了noreplicate,某些场景下还是会触发检查。更稳妥的方式是直接指定目标用户:

doveadm sync -u someuser

这样就只会处理你需要同步的用户,彻底避免其他用户的错误日志。

二、解决doveadm user '*'显示所有系统用户的问题

你的Lua代码里auth_userdb_iterate()只返回了someuser,但命令还是显示所有用户,这是因为第二个passwd userdb默认会遍历所有系统用户,Dovecot会合并多个userdb的用户列表。

给passwd userdb添加iterate=no参数,让它不参与用户迭代:

userdb {
  driver = passwd
  skip = found
  iterate = no
}

修改后再运行doveadm user '*',就只会显示Lua userdb返回的目标用户了。

三、额外的配置验证点

  1. 打开auth_debug = yes后,检查日志里非目标用户的userdb返回是否包含noreplicate字段——如果没看到,说明Lua代码的字符串拼接有问题,仔细排查语法。
  2. 确认目标服务器的remote:user@other.server格式正确,两台服务器之间的dsync认证配置没问题(比如SSH密钥或者密码认证正常)。
  3. 如果你用的是较新版本的Dovecot,也可以尝试在主配置里通过条件判断给目标用户设置mail_replica,但你的Lua动态返回方式其实更灵活,适合单用户同步的场景。

调整完这些细节后,应该就能实现仅同步单个用户的需求了。

备注:内容来源于stack exchange,提问作者sampi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:17:59