Skip to content

[Bug] runtime-sandbox-browser: uvicorn ASGI lifespan hangs on first startup #111

Description

@gjbmail

Bug Report: runtime-sandbox-browser 镜像首次启动时 uvicorn ASGI lifespan 卡住
环境信息
镜像: runtime-sandbox-browser:latest
运行平台: macOS (Docker)
agentscope-runtime-sandbox-core: 1.0.2
问题描述
容器首次启动时,uvicorn 在 ASGI lifespan startup 阶段卡住,导致 /healthz 端点永远无法就绪。手动 kill uvicorn 进程并重启后,服务立即恢复正常。

复现步骤
启动容器:

docker run --rm -p 8080:80 -e SECRET_TOKEN=<your_token> runtime-sandbox-browser:latest
等待 supervisord 所有进程进入 RUNNING 状态(约 2.5 秒)

访问健康检查端点:

curl -H "Authorization: Bearer <your_token>" http://localhost:8080/fastapi/healthz
预期结果: 返回 OK (HTTP 200)

实际结果: 返回 502 Bad Gateway(nginx 无法连接到 uvicorn 后端)

根因分析
uvicorn 日志 (/var/log/agentscope_runtime.err.log) 显示卡在:

INFO: Started server process [18]
INFO: Waiting for application startup.
没有后续的 Application startup complete 日志。

进程状态: uvicorn 进程存在(监听 0.0.0.0:8000),但 8000 端口 connection refused。

手动重启 uvicorn 后立即恢复正常:

kill 原始进程

kill $(pgrep -f 'uvicorn app:app')

重启

cd /agentscope_runtime && SECRET_TOKEN= python3 -m uvicorn app:app --host=0.0.0.0 --port 8000
重启后日志正常输出:

INFO: Started server process [459]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
健康检查返回 OK。

模块导入测试通过 — 所有 router(generic, mcp, watcher, workspace)和 app 模块均可正常导入,无阻塞。

疑似原因
首次启动时 @playwright/mcp@0.0.25(通过 npx 启动)的初始化与 uvicorn 的 lifespan startup 存在竞争条件。Playwright MCP 进程在容器首次启动时可能需要进行初始化操作(如 Chromium 浏览器引擎配置),导致 FastAPI 应用的 lifespan 启动被阻塞。第二次启动时由于缓存/状态已就绪,不再阻塞。

影响
通过 SandboxService 自动创建 BrowserSandbox 容器时,SandboxHttpClient.waitUntilHealthy() 在 60 秒内轮询 /healthz 始终失败,最终抛出:
Failed to establish connection to sandbox: Sandbox service did not start within timeout: 60s
导致所有 BrowserSandbox 相关的工具调用(browser_navigate、browser_click 等)全部失败。
容器内部关键信息
nginx 配置: 监听 80 端口,/fastapi 路径 rewrite 后代理到 localhost:8000
uvicorn: 监听 0.0.0.0:8000,由 /agentscope_runtime/scripts/start.sh 启动
MCP 配置 (mcp_server_configs.json): 配置了 @playwright/mcp@0.0.25 --no-sandbox
supervisor 配置: agentscope_runtime 进程设置了 autorestart=true,但首次卡住时并未触发重启
建议修复方向
在 start.sh 中增加 uvicorn 启动后的健康检查和自动重试逻辑
将 Playwright MCP 的初始化从 lifespan startup 中解耦(异步/懒加载)
或在 supervisord 中对 agentscope_runtime 增加 startretries 配置``

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions