Skip to content

proxy.ts URL 拼接在 useServerProxy 模式下错误 #6909

@shikaiwei1

Description

@shikaiwei1

例行检查

  • 我已确认目前没有类似 issue
  • 我已完整查看过项目 README,以及项目文档
  • 我使用了自己的 key,并确认我的 key 是可正常使用的
  • 我理解并愿意跟进此 issue,协助测试和提供反馈
  • 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 issue 可能被无视或直接关闭

你的版本

  • 公有云版本
  • 私有部署版本, 具体版本号: v4.14.16

问题描述, 日志截图,配置文件等

Skill 详情页的"skill 配置"中,内嵌 iframe 显示的是 FastGPT 页面自身,而非 sandbox 编辑器内容。

SHOW_SKILL=true 且使用 K8s 部署(OpenSandbox Server 通过 Ingress 暴露)的场景下,getSandboxProxyTarget 的 URL 拼接逻辑存在问题:

proxy.ts URL 拼接在 useServerProxy 模式下错误

AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认值)时,OpenSandbox 服务端返回的 endpoint 格式为:

server-host/sandboxes/{id}/proxy/8080

@fastgpt-sdk/sandbox-adaptergetEndpoint() 将整个字符串赋给 host 字段(因为 lastIndexOf(":") 找不到冒号)。

proxy.ts 固定拼接 ${protocol}://${host}:${targetPort},产生错误 URL:

https://server-host/sandboxes/{id}/proxy/8080:8080
                                                     ↑ 端口追加在路径末尾

根因proxy.ts 假设 host 是纯主机名然后拼接 :port,但 useServerProxy=true 模式下 endpoint 是带路径的 URL,host 字段包含完整路径。adapter 返回的 url 字段(如 https://server-host/sandboxes/{id}/proxy/8080)是正确的,但 proxy.ts 没有使用它。

此问题在 K8s 部署中尤为突出:当 OpenSandbox Server 通过 Ingress 暴露时(BASEURL=https://domain.com,无显式端口),endpoint 字符串不含冒号,adapter 的 host:port 解析逻辑完全失效。

复现步骤

  1. 使用 K8s 部署 OpenSandbox Server,通过 Ingress 暴露(HTTPS,无显式端口)
  2. 设置 AGENT_SANDBOX_OPENSANDBOX_BASEURL=https://your-domain.com
  3. 设置 AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认)
  4. 打开 Skill 详情页,点击"skill 配置"
  5. SSE 流正确返回 sandbox endpoint(phase: ready)
  6. iframe 加载 /proxy/{sandboxId}/{port}/,但显示 FastGPT 页面而非 sandbox 内容

预期结果

iframe 应通过 server.ts 的代理逻辑转发到 sandbox 容器,显示 sandbox 编辑器内容。

修复建议

  1. Dockerfile:在 builder 阶段用 esbuild 编译 server.ts,覆盖 standalone 默认 server:
RUN cd projects/app && ./node_modules/.bin/esbuild server.ts \
    --bundle --platform=node --format=cjs \
    --outfile=server-proxy.js --external:next

COPY --from=builder /app/projects/app/server-proxy.js /app/projects/app/server-proxy.js
  1. proxy.ts:使用 endpoint.url 替代 host:port 拼接:
// 当前(错误):
const { host, protocol } = sandbox.metadata!.endpoint!;
return `${protocol}://${host}:${targetPort}`;

// 建议修复:
const endpoint = sandbox.metadata!.endpoint!;
return endpoint.url || `${endpoint.protocol}://${endpoint.host}:${targetPort}`;
  1. proxyUtils.tsProxySession 缓存完整 target URL 而非拆分存储 host + protocol

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions