快速结论:当在 Docker 中使用空的 SECRET_KEY(默认留空)启动 Dify 的 collaboration profile 时,api_websocket 容器缺少共享存储卷挂载,导致各容器自动生成的密钥不一致,JWT 签名验证失败。优先检查 docker-compose.yaml 中 api_websocket 是否遗漏了 ./volumes/app/storage:/app/api/storage 的 volume 挂载。
适用环境:Dify 1.16.0(main 分支 4da4fa72),自托管 Docker 部署,使用空 SECRET_KEY。
最快修复方案:在 docker-compose.yaml 的 api_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 中,api 和 worker 服务均挂载了共享存储卷 ./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.yaml中api_websocket服务是否存在volumes配置。 - 通过
docker exec分别查看docker-api-1和docker-api_websocket-1内的/app/api/storage/.dify_secret_key内容是否一致。 - 确认
SECRET_KEY在.env中为空或未设置。
解决步骤
- 打开 Dify 项目根目录下的
docker/docker-compose.yaml(或生成的docker-compose.yml,视实际文件而定)。 - 找到名为
api_websocket的服务定义(通常与api、worker并列)。 - 在
api_websocket的volumes部分(若无则新增)添加:volumes: - ./volumes/app/storage:/app/api/storage - 保存文件,然后重新部署:
docker compose --profile collaboration down && docker compose --profile collaboration up -d。
验证方法
修复后,再次执行 docker exec docker-api_websocket-1 cat /app/api/storage/.dify_secret_key 和 docker exec docker-api-1 cat /app/api/storage/.dify_secret_key,确认两个容器的密钥内容一致。然后观察 WebSocket 服务日志,确认不再出现 InvalidSignatureError 或 401 Unauthorized 错误。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


