bug: REDIS_AUTH is sent as a password when empty or unset (non-cluster client)

该报错通常出现在自托管 Langfuse 连接未启用密码的 Redis/Valkey(单节点模式)时,启动日志中会打印 AUTH 相关告警。优先排查 REDIS_AUTH 是否为空或未设置,以及是否使用了会注入空字符串的 docker-compose 环境变量写法。

快速结论:该报错通常出现在自托管 Langfuse 连接未启用密码的 Redis/Valkey(单节点模式)时,启动日志中会打印 AUTH 相关告警。优先排查 REDIS_AUTH 是否为空或未设置,以及是否使用了会注入空字符串的 docker-compose 环境变量写法。

适用环境:自托管 Langfuse,已在 3.225.7 复现,v4.30.0 中同样存在该代码;使用 ioredis 5.10.1,在 Redis 7 与 Valkey(均未配置 requirepass)上验证。集群/哨兵模式关闭(单节点默认)。

最快修复方案:Issue 中未提供已验证的一步修复;报告者建议的修复方式是让单节点客户端与集群、哨兵客户端保持一致(过滤掉空值/未定义值)。该 PR(#17094)已收窄到 REDIS_AUTH 一行改动,但正文未确认合并结果,可优先尝试升级到包含该修复的版本。

注意事项:该问题影响是日志噪音加每条连接一次多余往返(一次 AUTH 命令),连接不会中断,也不影响业务请求;报告者已更正“连接会在重试后恢复”的说法——实际没有重试,因为连接从未断开。

问题场景

自托管部署 Langfuse,后端连接一个不要求认证的 Redis/Valkey 服务(未设置 requirepass),同时 REDIS_AUTH 为空或未设置,且未启用集群或哨兵模式(即单节点默认模式)。此时 web 和 worker 在启动阶段会记录认证错误告警。其中空值很容易无意触发:类似 docker-compose.yml 中使用 REDIS_AUTH: ${REDIS_AUTH} 的写法,在变量未填写时会注入一个空字符串。

报错原文

[WARN] This Redis server's `default` user does not require a password, but a password was supplied
warn Redis connection error: ERR AUTH <password> called without any password configured
     for the default user. Are you sure your configuration is correct?

服务端 MONITOR 可确认命令确实被发送:

"auth" "(redacted)"

原因分析

packages/shared/src/server/redis/redis.ts 中三个客户端的密码处理方式不一致:

password: env.REDIS_AUTH || undefined,   // cluster
password: env.REDIS_AUTH || undefined,   // sentinel
password: String(env.REDIS_AUTH),        // single node

集群与哨兵客户端会过滤 falsy 值,而单节点客户端直接经过 String()。由于 REDIS_AUTH 被声明为 z.string().nullish(),未设置的值会变成字面字符串 "undefined",空值会变成 "",两者都会被当作密码发送 AUTH。报告者认为这更像是代码漂移而非有意设计:单节点这行可追溯到 #3052(2024 年 8 月),而集群(#7162,2025 年 6 月)和哨兵(#9851,2025 年 11 月)是后来加入的,都做了 falsy 过滤。是否属于有意差异,Issue 中没有进一步证据。

环境排查

  • 确认 Langfuse 版本:已在 3.225.7 复现,v4.30.0 中代码同样存在。
  • 确认 Redis/Valkey 是否配置了 requirepass(本次场景为未配置)。
  • 确认 REDIS_AUTH 是未设置还是被注入为空字符串。
  • 确认是否启用了集群或哨兵模式:本问题仅出现在单节点默认模式。
  • 确认 ioredis 版本(仓库锁定 5.10.1)。
  • 确认 enableReadyCheck 取 true 或 false 时行为一致(报告者验证结果相同)。

解决步骤

  1. 在启动前检查并避免 REDIS_AUTH 以空字符串形式传入,尤其是 docker-compose.ymlREDIS_AUTH: ${REDIS_AUTH} 这类写法;变量未填写时会注入 ""
  2. 若使用的是包含修复的版本,优先升级;报告者建议将单节点客户端与集群、哨兵客户端对齐,统一过滤 falsy 值(即 env.REDIS_AUTH || undefined 形式)。
  3. 若暂时无法升级,可将该告警视为日志噪音:连接不会掉线,仅多一次不必要的 AUTH 往返,不必按 Redis 连接故障处理。

验证方法

重新启动 web 与 worker,观察启动日志中是否仍出现 “does not require a password, but a password was supplied” 与 ERR AUTH ... 告警;也可在 Redis/Valkey 服务端用 MONITOR 观察是否仍有 "auth" "(redacted)" 命令发出。若告警消失且 MONITOR 中不再出现该 AUTH 命令,即可确认修复生效。

参考来源

langfuse/langfuse #17093

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24247

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注