v1.1.0 — Per-Team Container Isolation
核心特性:Per-Team 容器隔离
本版本实现了多队伍独立容器实例隔离,每个队伍启动赛题时获得独立的容器环境和唯一 Flag,彻底解决了之前多队伍共享同一实例的问题。
新增功能
- Per-Team 容器隔离 — 每个队伍启动赛题时创建独立的容器实例,拥有独立端口、独立 Flag、独立生命周期
- 动态 Flag 隔离 — 每个队伍的实例自动生成唯一 Flag,A 队的 Flag 无法用于 B 队提交
- Per-Team 并发限制 — 每队最多同时运行 N 个实例(默认 3),各队限制独立互不影响
- AD 挑战共享模式 — AD(Attack & Defense)类型赛题保持共享实例,所有队伍访问同一环境
- 管理员视角切换 — Web UI 管理员可切换到任意队伍视角,查看该队伍的实例状态和做题进度
- 管理员视角操作 — 切换视角后,启动/停止等操作也以该队伍身份执行
- 实例状态页显示队伍列 — 管理员状态页展示每个实例归属的队伍
- 每队最大实例数设置 — Web UI 系统设置中可配置每队允许的最大并发实例数
架构改动
- DB Schema:
instance_lifecycle表新增team_id列,UNIQUE 约束从(benchmark_id)变为(benchmark_id, team_id) - 运行时目录结构:
runtime/<benchmark_id>/<team_id>/<instance_code>/ - Challenge 元数据与运行时实例分离:启动时从源目录 copytree,不再预创建 runtime
- 自动迁移:旧 schema 启动时自动检测并重建为新结构
Bug 修复
- 修复
container_name冲突:多队伍启动同一题目时 Docker 容器名冲突,现在自动移除固定容器名 - 修复
_cleanup_stale_record使用非 team-scoped 的 DB 更新,避免误更新其他队伍记录 - 修复管理员 disable challenge 时只停一个队伍实例的问题,现在停止所有队伍的实例
- 修复
_finalize_team_start双重 INSERT 导致 UNIQUE 约束冲突 - 修复
delete_instance使用错误列名 (benchmark_id→id) - 修复
tch_hint未使用 team-scoped 状态检查 - 修复 MCP
submit_flag的静态 flag 回退绕过隔离 - 修复
vnc_proxy模块级 DB 访问导致启动失败(改为 lazy init) - 移除
db.py中delete_instance重复定义
API 兼容性
- TCH API (
/api/challenges,/api/start_challenge,/api/submit等) 接口不变,行为改为 per-team - MCP Server 接口不变,行为改为 per-team
- 现有 Agent Token 认证方式完全兼容
升级说明
- 升级后首次启动会自动迁移 DB schema(DROP + CREATE
instance_lifecycle表) - 旧的运行中实例记录会被清理,需要重新启动赛题
- 无需修改 Agent 端代码,API 接口完全向后兼容
Full Changelog: v1.0.1...v1.1.0