Skip to content

webchat2api 偶发首页卡死:/health/version 正常,但 //index.html 超时,重启容器后恢复 #28

@QLHazyCoder

Description

@QLHazyCoder

问题概述

线上遇到一个偶发问题:webchat2api 容器仍然处于运行状态,轻量健康接口也正常,但首页和前端静态页面无法打开,直到重启容器后才恢复。

这看起来不像是 Caddy、证书、域名或容器退出导致的问题,更像是应用本身进入了一种“部分存活但前端静态返回链卡死”的状态。


现象表现

问题发生时:

  • 容器仍在运行
  • GET /health 返回 200 {"status":"ok"}
  • GET /version 返回 200
  • GET / 超时
  • GET /index.html 也超时
  • 容器内 /app/web_dist/index.html 文件实际存在
  • 重启容器后,首页立即恢复正常

重启后验证:

  • /health => 200
  • /version => 200
  • / => 200
  • 首页 HTML 正常返回

为什么判断更像项目层面的问题

排查时已确认:

  • 反向代理 Caddy 配置正常
  • HTTPS 证书正常
  • 容器没有退出
  • 容器没有 OOMKilled
  • 静态文件没有丢失
  • API 轻接口仍然能正常响应

也就是说,不是整站都挂了,而是应用进入了这样一种异常状态:

  • JSON 健康接口还能回
  • 但前端首页和静态文件返回链卡住

这更像是项目内部的应用层问题,而不是纯部署问题。


运行环境

  • 镜像:ghcr.io/zqbxdev/webchat2api:latest
  • GET /version 返回:0.0.11
  • 启动方式:
    • uv run python main.py
    • uvicorn
    • entrypoint 中还会启动 Browser Bridge
  • 反向代理:Caddy
  • 容器端口:83
  • 公网域名:webchat2api.ai-api.20021108.xyz

相关代码位置

首页和静态前端回退逻辑看起来主要在这里:

  • api/app.py
  • api/support.py

当前逻辑大致是:

  • /health 直接返回 JSON
  • /{full_path:path} 使用 resolve_web_asset(...)
  • 找到文件后通过 FileResponse(...) 返回

从现象看,问题更像出在这条静态页面返回链,而不是整体路由不可用。


额外观察

排查过程中还观察到:

  • /_next/_index.txt 可以快速返回 404
  • //index.html 会持续超时
  • 容器内 /app/web_dist/index.html 文件存在且可读
  • 容器资源没有明显异常
    • 没有 OOM
    • CPU/内存也不高
  • 重启后服务立即恢复

这说明问题并不是静态文件缺失,而更像是运行时某种卡死/阻塞状态。


期望行为

如果服务还能正常返回 {"status":"ok"},那么首页静态页面也应该保持可访问。

至少不应该出现这种状态:

  • 健康检查显示正常
  • 但首页和前端页面完全打不开

怀疑方向

目前比较怀疑这些方向之一:

  • FastAPI 静态页面回退路由在某些情况下卡住
  • FileResponse(...) 返回链偶发阻塞
  • 单进程运行下,某些同步任务/线程池占用影响了静态页面响应
  • Browser Bridge 或后台 watcher 对主服务造成副作用
  • 应用进入“部分可用但静态页面不可用”的异常状态

影响

这个问题会导致:

  • 前端页面、后台界面看起来像“站点挂了”
  • 但简单健康检查仍然显示正常
  • 运维层面不容易第一时间发现真实故障

临时解决办法

当前临时处理方式是:

  • 重启 webchat2api 容器

重启后可立即恢复,但这只是临时 workaround,并不能解决根因。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is not workingneeds reproductionNeeds reproduction or verificationperformancePerformance or responsiveness issuepriority: highHigh priority

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions