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 配置``
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 配置``