Skip to content

v1.1.0 — Per-Team Container Isolation

Choose a tag to compare

@No-Github No-Github released this 17 May 14:50
· 89 commits to master since this release

核心特性: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_idid)
  • 修复 tch_hint 未使用 team-scoped 状态检查
  • 修复 MCP submit_flag 的静态 flag 回退绕过隔离
  • 修复 vnc_proxy 模块级 DB 访问导致启动失败(改为 lazy init)
  • 移除 db.pydelete_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