File upload fails on local Docker + RustFS (CORS error)

用户在 Windows 11 + WSL2 + Docker 环境下,使用 setup.sh + Docker Compose 部署 LobeHub( lobehub/lobehub:latest ),堆栈包含 lobe-postgres 、 lobe-redis 、 lobe-rustfs 、 l

File upload fails on local Docker + RustFS (CORS error)

File upload fails on local Docker + RustFS (CORS error)

快速结论:在本地 Docker 自部署 LobeHub 并搭配 RustFS 作为 S3 存储时,文件上传失败并报 CORS 错误。优先排查 S3_PUBLIC_DOMAIN 环境变量是否缺失,以及 RustFS 控制台中是否启用了 Bucket CORS。

问题场景

用户在 Windows 11 + WSL2 + Docker 环境下,使用 setup.sh + Docker Compose 部署 LobeHub(lobehub/lobehub:latest),堆栈包含 lobe-postgreslobe-redislobe-rustfslobe-searxng。用户已手动修复 rustfs-initID → Id 策略配置 bug,rustfs-init 退出码为 0。通过浏览器访问 http://localhost:3210 上传文件时,UI 提示上传失败,并报类似 CORS 配置错误的法语消息:“Échec du téléversement du fichier. Veuillez vérifier votre connexion réseau et la configuration CORS du service de stockage.”。

报错原文

Échec du téléversement du fichier.
Veuillez vérifier votre connexion réseau et la configuration CORS du service de stockage.

(核心含意:文件上传失败,请检查网络连接和存储服务的 CORS 配置。)

原因分析

该报错的最可能原因是 S3_PUBLIC_DOMAIN 环境变量缺失,以及 RustFS 中未开启 Bucket CORS

  • S3_ENDPOINT 用于服务端 S3 API 调用,但浏览器端需要访问文件时,LobeHub 依赖 S3_PUBLIC_DOMAIN 生成公网可访问的 URL。如果未配置,浏览器会试图通过内部的 S3_ENDPOINT(例如 http://localhost:9000)访问文件,而该地址未设置 CORS 响应头,导致浏览器拦截。
  • RustFS 管理控制台(http://localhost:9001)中,Bucket 的 CORS 策略默认处于关闭状态,需手动启用。

环境排查

  • Docker Compose 堆栈是否均已 Up (healthy)
  • .env 文件中是否存在 S3_PUBLIC_DOMAIN 变量。
  • S3_ENDPOINT 是否只包含协议、主机和端口(例如 http://localhost:9000),无额外路径或桶名。
  • RustFS 管理控制台(http://localhost:9001)中,对应的 bucket(例如 lobe)的 CORS 设置是否已启用。
  • S3_SET_ACL 是否已设为 1 以允许公开读取。

解决步骤

  1. 添加 S3_PUBLIC_DOMAIN 环境变量:在 .env 文件中添加一行:
    S3_PUBLIC_DOMAIN=http://localhost:9000
  2. 添加 S3_SET_ACL=1:在 .env 文件中添加:
    S3_SET_ACL=1

    对于自托管 S3 兼容存储,该参数使上传的文件具有公开读取权限。

  3. 在 RustFS 管理控制台中启用 Bucket CORS
    • 访问 http://localhost:9001,使用 admin / passw 登录。
    • 进入 Browser → 选择 lobe bucket → 点击 Settings。
    • 找到 “Bucket CORS” 选项并启用,使用默认允许所有来源(*)的配置。
  4. 验证 .env 中 S3 完整配置(示例):
    S3_ENDPOINT=http://localhost:9000
    S3_PUBLIC_DOMAIN=http://localhost:9000
    S3_BUCKET=lobe
    S3_REGION=us-east-1
    S3_ACCESS_KEY=admin
    S3_SECRET_KEY=0df6852e
    S3_ENABLE_PATH_STYLE=1
    S3_SET_ACL=1
  5. 重启堆栈:运行以下命令让配置生效:
    docker compose down && docker compose up -d

验证方法

重启堆栈后,通过浏览器访问 http://localhost:3210 并尝试上传文件。如果不再出现 CORS 错误消息,说明问题已解决。也可在浏览器开发者工具(F12)的 Network 或 Console 面板中检查是否有 CORS 相关警告消失。

参考来源

lobehub/lobe-chat #15584(含讨论和同类 Issue 链接:#14665、#4230、#8636、#14655)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 8866

发表回复

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