Skip to content

v0.9.0

Choose a tag to compare

@No-Github No-Github released this 14 May 08:39
· 146 commits to master since this release

v0.9.0 Release Notes

新功能

实例生命周期持久化 (Issue #2)

  • 新增 instance_lifecycle SQLite 表,持久化实例状态(启动时间、过期时间、端口、运行路径等)
  • 服务重启后自动检测 Docker 实际运行状态,恢复/清理实例
  • 新增后台 Reaper 线程,按难度自动超时清理过期实例(Easy 1h / Medium 2h / Hard 4h)
  • 新增超时配置接口 GET/POST /api/settings/instance_timeout
  • 前端设置页新增实例超时配置面板
  • 前端 Challenge 卡片新增倒计时显示

Per-Challenge Agent 可见性开关 (PR #1)

  • 管理员可在 Web UI 中单独控制每道题目是否对 Agent 开放
  • 关闭后 Agent 的 list_challenges 不返回该题目,相关 API 调用返回 403

Bug 修复

Docker 网络地址池耗尽防护 (Issue #3)

  • 启动时自动清理孤儿 Docker 网络(docker network prune
  • docker compose up 遇到 "non-overlapping IPv4 address pool" 错误时自动清理并重试

平台请求阻塞修复 (Issue #4)

  • 所有 docker compose 阻塞调用改为 asyncio.to_thread,不再阻塞 FastAPI 事件循环
  • _compose() 新增 5 分钟超时控制,防止无限挂起

TCH API 兼容性修复

  • POST /api/start_challenge 返回格式恢复为 data: ["host:port"],与 TCH API 文档一致
  • 错误响应格式改为顶层 {"code": -1, "message": "...", "data": null},不再被 FastAPI 包装 {"detail": ...}
  • _find_by_code 支持旧 challenge_code 别名查找,解决动态 flag 重新生成 code 后 submit/stop 404 问题
  • get_instance_status / stop_challenge_instance 使用 challenge 对象当前 code 而非传入的旧 code
  • 前端 Challenge 卡片改用稳定的 benchmark_id 作为 DOM ID 和局部刷新标识

其他修复

  • 修复 Python 3.9 兼容性(str | NoneOptional[str]
  • 修复 start_challenge 后使用旧 code 获取时间戳导致 500 的问题

关联 Issues

  • Closes #2 — 题目实例状态未持久化,服务重启后与 Docker 实际运行状态不一致
  • Closes #3 — 题目实例残留 Docker bridge 网络可能耗尽默认地址池
  • Closes #4 — 启动题目时同步等待 docker compose 可能导致平台请求长时间超时