[Bug] v2.2.17 uploads fail with bundled RustFS because pre-upload HeadObject returns 403

这是 LobeChat v2.2.17 上传流程回归导致的报错:服务端在生成预签名 URL 前,会对一个尚不存在的新路径发起 HeadObject 存在性检查,而随 Docker Compose 捆绑的 RustFS 对该请求返回 403,导致上传在浏览器拿到预签名 URL 之前就失败。优先确认 L

快速结论:这是 LobeChat v2.2.17 上传流程回归导致的报错:服务端在生成预签名 URL 前,会对一个尚不存在的新路径发起 HeadObject 存在性检查,而随 Docker Compose 捆绑的 RustFS 对该请求返回 403,导致上传在浏览器拿到预签名 URL 之前就失败。优先确认 LobeChat 版本并升级到 v2.2.18 或更高版本。

适用环境:LobeChat v2.2.17 或更新版本;Web 桌面浏览器(Chrome);自托管 Docker 部署,使用官方 Docker Compose 配置及捆绑的 RustFS 服务;S3 配置为 S3_BUCKET=lobe、S3_REGION=us-east-1、S3_ENABLE_PATH_STYLE=1、S3_SET_ACL=0。Issue 未提供 Python、CUDA、显卡等信息。

最快修复方案:将 LobeChat 升级到 v2.2.18。评论中多位用户反馈升级后不再出现该上传问题,Issue 也以“已在 v2.2.18 解决”关闭。

注意事项:该问题定位为 LobeChat v2.2.17 引入的回归,并非浏览器 CORS 或 PUT 上传失败;不建议把 RustFS 返回的所有 403 都当作“文件不存在”处理。升级时无需改动 RustFS、其数据、凭据、bucket 或 S3 配置。

问题场景

用户在自托管 Docker 环境部署 LobeChat v2.2.17 或更新版本,存储后端使用官方 Docker Compose 捆绑的 RustFS。登录 LobeChat 后尝试上传任意小文件或图片时,上传在开始阶段即失败,LobeChat 容器日志在 upload.createS3PreSignedUrl 路径报错。降级 LobeChat 到 v2.2.16(不改动 RustFS、数据、凭据、bucket 或 S3 配置)后,同样的上传可以成功。

报错原文

Error in tRPC handler (lambda) on path: upload.createS3PreSignedUrl
Error [TRPCError]: UnknownError
[cause]: Unknown: UnknownError
'$fault': 'client'
'$metadata': {
  httpStatusCode: 403,
  requestId: '...',
  attempts: 1
}

原因分析

根据 Issue 回归定位,v2.2.17 由 commit a20880a1252803230b065e4ad77d29e2a710d570 / PR #19119 引入的“上传预留”流程,会在签发预签名 URL 之前调用 params.storage.getFileMetadata(params.pathname)。该调用针对一个新生成、尚不存在的路径执行 HeadObject,预期返回 404;但捆绑的 RustFS 对该请求返回 403,错误被重新抛出并最终变成 UnknownError,导致上传中止、预签名 URL 未能生成。

由于失败发生在浏览器收到预签名 URL 之前,这不是浏览器 CORS 或 PUT 上传的问题。Issue 作者指出,不能简单地把所有 403 都当作“not found”处理,那样并不安全。

环境排查

  • 确认 LobeChat 版本:v2.2.17 存在该回归;v2.2.16 上传正常;v2.2.18 已修复。
  • 确认部署方式:自托管 Docker,使用官方 Docker Compose 及捆绑的 RustFS 服务。
  • 确认 S3 配置:S3_BUCKET=lobe、S3_INTERNAL_ENDPOINT=http://rustfs:9000、S3_REGION=us-east-1、S3_ENABLE_PATH_STYLE=1、S3_SET_ACL=0。
  • 确认 S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY 使用 RustFS root 凭据,且凭据、bucket 均正确(用户已用 SHA-256 比对 secret 一致)。
  • 确认 RustFS 容器与镜像 ID 一致且健康,lobe bucket 存在。
  • Issue 未提供 Python、CUDA、PyTorch、显卡等信息,无需针对这些项排查。

解决步骤

  1. 确认当前 LobeChat 版本是否为 v2.2.17 或更新版本中受影响的范围。
  2. 将 LobeChat 镜像升级到 v2.2.18 或更高版本,保持 RustFS 容器、其数据、凭据、bucket 与 S3 配置不变。
  3. 重启 LobeChat 容器,登录后重新尝试上传此前失败的小文件或图片。
  4. 若仍需临时恢复可用,可将 LobeChat 降级到 v2.2.16(Issue 作者与评论用户均验证此版本上传正常),等待升级到修复版本。

验证方法

升级到 v2.2.18 后,登录 LobeChat 上传任意小文件或图片;若不再出现 upload.createS3PreSignedUrl 的 UnknownError 与 httpStatusCode 403,且文件上传成功,则视为问题已解决。Issue 评论确认升级到 v2.2.18 后不再出现该上传问题。

参考来源

lobehub/lobe-chat #19661

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26330

发表回复

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