如何仅为单个用户在两个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返回的目标用户了。
三、额外的配置验证点
- 打开
auth_debug = yes后,检查日志里非目标用户的userdb返回是否包含noreplicate字段——如果没看到,说明Lua代码的字符串拼接有问题,仔细排查语法。 - 确认目标服务器的
remote:user@other.server格式正确,两台服务器之间的dsync认证配置没问题(比如SSH密钥或者密码认证正常)。 - 如果你用的是较新版本的Dovecot,也可以尝试在主配置里通过条件判断给目标用户设置
mail_replica,但你的Lua动态返回方式其实更灵活,适合单用户同步的场景。
调整完这些细节后,应该就能实现仅同步单个用户的需求了。
备注:内容来源于stack exchange,提问作者sampi
相关产品推荐
相关产品推荐

