故障排查GitHub issue4 分钟阅读排错/错误码

解决FastGPT技能配置页iframe显示非沙箱编辑器的问题

当SHOWSKILL=true且使用K8s部署,OpenSandbox Server通过Ingress暴露时,技能详情页的"skill配置"内嵌iframe显示的是 FastGPT 自身页面,不是沙箱编辑器内容。

现象

SHOW_SKILL=true且使用K8s部署,OpenSandbox Server通过Ingress暴露时,技能详情页的"skill配置"内嵌iframe显示的是 FastGPT 自身页面,不是沙箱编辑器内容。SSE流正确返回sandbox endpoint(phase: ready),但iframe加载/proxy/{sandboxId}/{port}/后显示错误页面。

可能原因

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是纯主机名后拼接端口,但useServerProxy=true模式下endpoint是带路径的URL,host字段包含完整路径,未使用adapter返回的正确url字段。

排查步骤

  1. 确认部署环境为K8s,且OpenSandbox Server通过Ingress暴露,使用HTTPS且无显式端口。
  2. 检查配置项AGENT_SANDBOX_OPENSANDBOX_BASEURL是否设置为实际域名地址。
  3. 确认AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY为默认值true
  4. 打开技能详情页,点击"skill配置",查看SSE日志是否正确返回sandbox endpoint(phase: ready)。
  5. 查看iframe加载的URL,确认是否存在端口追加在路径末尾的错误。

解决与验证

修复方案

  1. 修改proxy.ts:使用endpoint.url替代host:port拼接,不再手动拼接端口。
  2. 调整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

验证步骤

重新部署服务后,打开技能详情页的"skill配置",确认 iframe 加载后显示沙箱编辑器内容,不再显示 FastGPT 自身页面。

来源:FastGPT GitHub issue