api_websocket has no storage volume mount, so the documented empty SECRET_KEY generates divergent keys and websocket auth fails

当在 Docker 中使用空的 SECRET_KEY (默认留空)启动 Dify 的 collaboration profile 时, api_websocket 容器缺少共享存储卷挂载,导致各容器自动生成的密钥不一致,JWT 签名验证失败。优先检查 docker-compose.yaml 中 ap

快速结论:当在 Docker 中使用空的 SECRET_KEY(默认留空)启动 Dify 的 collaboration profile 时,api_websocket 容器缺少共享存储卷挂载,导致各容器自动生成的密钥不一致,JWT 签名验证失败。优先检查 docker-compose.yamlapi_websocket 是否遗漏了 ./volumes/app/storage:/app/api/storage 的 volume 挂载。

适用环境:Dify 1.16.0(main 分支 4da4fa72),自托管 Docker 部署,使用空 SECRET_KEY

最快修复方案:docker-compose.yamlapi_websocket 服务下添加共享存储卷挂载:

volumes:
  - ./volumes/app/storage:/app/api/storage

此方案已在 Issue 中验证有效。

注意事项:该修复仅针对 volume 缺失问题;若已手动设置 SECRET_KEY 则无需此修改,但官方文档中留空自动生成的机制在修复前确实被破坏。

问题场景

用户使用 Docker 部署 Dify 1.16.0,按 .env.example 说明将 SECRET_KEY 留空,并通过 docker compose --profile collaboration up -d 启动协作模式。当在 Web UI 中打开任意 chatflow 工作流编辑器时,WebSocket 服务日志出现 JWT 签名验证失败,导致 WebSocket 连接被拒。

报错原文

api_websocket has no storage volume mount, so the documented empty SECRET_KEY generates divergent keys and websocket auth fails
jwt.exceptions.InvalidSignatureError: Signature verification failed
  File "/app/api/controllers/console/socketio/workflow.py", line 40, in socket_connect
werkzeug.exceptions.Unauthorized: 401 Unauthorized: Invalid token signature.

原因分析

docker-compose.yaml 中,apiworker 服务均挂载了共享存储卷 ./volumes/app/storage:/app/api/storage,但 api_websocket 服务完全没有 volumes 定义。当 SECRET_KEY 为空时,每个容器会在自己的 /app/api/storage 目录下自动生成并写入一个 .dify_secret_key。由于 api_websocket 使用容器本地存储而非共享卷,生成的密钥与其他服务不同,导致 JWT 签名验证时 api 发起的 token 无法被 api_websocket 验证通过。

环境排查

  • 确认 Dify 版本是否为 1.16.0 或基于 main 分支 4da4fa72。
  • 检查 docker-compose.yamlapi_websocket 服务是否存在 volumes 配置。
  • 通过 docker exec 分别查看 docker-api-1docker-api_websocket-1 内的 /app/api/storage/.dify_secret_key 内容是否一致。
  • 确认 SECRET_KEY.env 中为空或未设置。

解决步骤

  1. 打开 Dify 项目根目录下的 docker/docker-compose.yaml(或生成的 docker-compose.yml,视实际文件而定)。
  2. 找到名为 api_websocket 的服务定义(通常与 apiworker 并列)。
  3. api_websocketvolumes 部分(若无则新增)添加:
    volumes:
      - ./volumes/app/storage:/app/api/storage
  4. 保存文件,然后重新部署:docker compose --profile collaboration down && docker compose --profile collaboration up -d

验证方法

修复后,再次执行 docker exec docker-api_websocket-1 cat /app/api/storage/.dify_secret_keydocker exec docker-api-1 cat /app/api/storage/.dify_secret_key,确认两个容器的密钥内容一致。然后观察 WebSocket 服务日志,确认不再出现 InvalidSignatureError401 Unauthorized 错误。

参考来源

langgenius/dify #39422

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15914

发表回复

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