argus-cluster/specs/mvp/v3.0/v3.0_progress.md

8.6 KiB
Raw Blame History

MVP v3.0 进展记录milestone log

本文档用于记录 v3.0 按 specs/mvp/v3.0/v3.0_dev_plan.md 实施过程中的里程碑完成情况。
约定:每完成一个里程碑,追加一条记录,包含日期完成内容涉及文件验证方式/结果待办/风险


M1Path policy + tests已完成

  • 日期2025-12-30
  • 范围:按 v3.0 路径策略升级 API submit 的路径校验(不扩展 TaskSpec YAML 结构)。
  • 完成内容:
    • code_path:仍只允许 /private/common/...v3.0 不执行 user code
    • train_file/val_file:允许 /private/common/datasets/.../private/users/<me>/datasets/...
    • model_id:若以 /private/ 开头则视为本地路径,仅允许:
      • /private/common/models/...
      • /private/users/<me>/models/... 否则仍按 HuggingFace repo idQwen/...)处理。
    • 拒绝跨用户路径(例如 bob 提交 /private/users/alice/datasets/...)。
    • 拒绝本地模型路径不在 models/(例如指向 jobs/)。
  • 涉及文件:
    • src/mvp/py/argus/service/app.py
    • src/mvp/py/tests/test_users.py
  • 验证方式与结果:
    • 本地单测:.venv/bin/python -m pytest -q
    • 结果:全部通过(54 passed),覆盖率阈值保持 >= 90%
  • 待办/风险:
    • model_id=/private/... 的“本地模型路径语义”需要在用户文档/WebUI 中明确提示(避免误用)。
    • 后续 M2/M3 需要把该路径策略同步到 UI 表单/提示文本(避免用户填错路径)。

M2SFTPGo 集成(方案 A用户联动创建 + password已完成

  • 日期2025-12-30
  • 范围SFTPGoData Management最小集成 + 用户自助信息 /api/v2/me + 用户目录结构落盘。
  • 完成内容:
    • 新增 data 配置段:
      • data.user_root:用户数据根目录(默认 /private/users
      • data.sftpgoSFTPGo 可选联动enabled/host/sftp_port/admin_api_base/admin_user/admin_password_env
      • data.retentionjobs 过期策略配置3 天移入 trash7 天 purgejanitor 在 M4 实现)
    • 新增 SFTPGoAdminClienturllib 实现,不使用 requests
      • create_user / disable_user / reset_password(最小集合)
    • API server 增强:
      • POST /api/v2/users:创建 DB user + 同步创建目录结构(datasets/models/code/jobs/trash/jobs
      • data.sftpgo.enabled=true 时,创建用户会联动调用 SFTPGo admin API并返回一次性密码明文仅返回一次服务端不保存
      • POST /api/v2/users/{user_id}:disable禁用用户SFTPGo 禁用 best-effort
      • POST /api/v2/users/{user_id}/sftp:reset_password管理员重置一次性密码SFTPGo enabled 才允许)
      • GET /api/v2/me返回当前用户的目录约定、retention 提示以及可选SFTP 连接信息
    • 同步更新 src/mvp/configs/dev.yaml:补齐 v3.0 相关 data.* 配置(默认关闭 sftpgo
  • 涉及文件:
    • src/mvp/py/argus/service/config.py
    • src/mvp/py/argus/service/sftpgo.py
    • src/mvp/py/argus/service/app.py
    • src/mvp/py/tests/test_sftpgo.py
    • src/mvp/py/tests/test_users.py
    • src/mvp/py/tests/test_app.py
    • src/mvp/py/tests/test_service_config.py
    • src/mvp/configs/dev.yaml
    • specs/mvp/v3.0/v3.0_api.md
  • 验证方式与结果:
    • 本地单测:.venv/bin/python -m pytest -q
    • 结果:全部通过(62 passed),覆盖率 90.11%(阈值 >= 90%)。
  • 待办/风险:
    • M2 仅做了“API 侧联动 + 单测”,未在真实 SFTPGo 容器上端到端验证(按计划在 M5 完成)。
    • 目录创建依赖文件系统权限:生产部署时需确保 API/head 容器对 /private/users 可写。

M3WebUI最小可用多页面 + 侧边栏)(已完成)

  • 日期2025-12-30
  • 范围API server 托管最小 WebUI同源不引入 Node 构建),用于登录/提交/查看任务与日志、查看 data 信息。
  • 完成内容:
    • 新增 UI 路由HTML+少量 JS
      • /ui(重定向到 tasks
      • /ui/logintoken 粘贴并写入浏览器 localStoragekey=mvp_token
      • /ui/tasks:任务队列列表(调用 /api/v2/queue
      • /ui/tasks/new:提交 TaskSpec YAMLPOST /api/v2/tasks
      • /ui/tasks/{task_id}任务详情GET /api/v2/tasks/{task_id},支持 cancel
      • /ui/tasks/{task_id}/logs日志查看GET /api/v2/tasks/{task_id}/logs,可选自动刷新)
      • /ui/data:展示 /api/v2/me 返回的路径/SFTP/retention 信息
    • 统一侧边栏导航Tasks / New Task / Data / Login。
    • UI 不做服务端 session所有 API 调用均由浏览器带 Authorization: Bearer <token>localStorage 注入)。
  • 涉及文件:
    • src/mvp/py/argus/service/ui.py
    • src/mvp/py/argus/service/app.py
    • src/mvp/py/tests/test_ui.py
  • 验证方式与结果:
    • 本地单测:.venv/bin/python -m pytest -q
    • 结果:全部通过(65 passed),覆盖率 90.53%(阈值 >= 90%)。
  • 待办/风险:
    • WebUI 当前为“骨架+API 驱动”,不做复杂交互与大文件下载;上传/下载仍以 SFTP 为主(按设计)。
    • Starlette TestClient 的 allow_redirects 有弃用告警(不影响功能,可在后续清理)。

M4Jobs Retention janitor3 天移入 trash7 天后 purge已完成

  • 日期2025-12-30
  • 范围API server 内置后台线程,对“已结束 attempt”的 job 目录执行保留策略(文件系统直连,不依赖 SFTPGo
  • 完成内容:
    • 新增 JobsJanitor
      • attempts.end_time 为基准计算 TTL从 job 结束开始算)
      • >= 3 天 && < 7 天:把目录从 .../jobs/<ray_submission_id> 移动到 .../trash/jobs/<ray_submission_id>
      • >= 7 天:确保目录进入 trash 后删除(shutil.rmtree
      • 对缺失目录、异常移动/删除为 best-effort不影响服务主流程
    • DB 增强:新增查询 list_ended_attempts_before(),用于 janitor 扫描候选 attempt。
    • API server 启动时启动 janitor 线程(可通过 data.retention.janitor_interval_s 控制;<=0 视为关闭)。
  • 涉及文件:
    • src/mvp/py/argus/service/janitor.py
    • src/mvp/py/argus/service/db.py
    • src/mvp/py/argus/service/app.py
    • src/mvp/py/tests/test_janitor.py
  • 验证方式与结果:
    • 本地单测:.venv/bin/python -m pytest -q
    • 结果:全部通过(75 passed),覆盖率 90.72%(阈值 >= 90%)。
  • 待办/风险:
    • M4 只做“逻辑 + 单测”,实际 /private/users/... 的权限与在 argus@h1 的行为验证放到 M5端到端

M5端到端h1— SFTPGo compose + v3.0 E2E 脚本(已完成:交付脚本/配置)

  • 日期2025-12-30
  • 范围:补齐 h1 端到端所需的 compose/service、配置与一键脚本实际运行/验收由你在 argus@h1 执行)。
  • 完成内容:
    • SFTPGo 集成到 docker compose
      • 新增 argus-sftpgo serviceSFTP 2022Admin API/UI 8080→host 8081避免与 MVP API 8080 冲突)
      • 同挂载 ../../shared:/private,并持久化元数据到 ../../shared/common/sftpgo
    • SFTPGoAdminClient 实装(对齐 upstream OpenAPI
      • GET /api/v2/tokenBasicAuth获取 admin token
      • POST /api/v2/users 创建用户(含 permissions: {"/":["*"]}
      • PUT /api/v2/users/{username} 禁用/重置密码
    • 新增 v3.0 dev 配置:configs/dev_v30.yaml(启用 data.sftpgo 并配置 admin_api_base=http://argus-sftpgo:8080/api/v2
    • 新增 v3.0 一键脚本:
      • scripts/run_all_v30_api.sh:起 Ray+SFTPGo、启动 API、创建用户并提交 PPO/GRPO/SFT引用 user dataset 路径)
      • scripts/run_e2e_v30_cases.sh:最小 E2E runnerHP-1
    • API 启动脚本增强:scripts/60_start_api.sh 支持透传 SFTPGO_ADMIN_PASSWORD 到 head 容器内的 API 进程。
  • 涉及文件:
    • src/mvp/docker-compose.yaml
    • src/mvp/configs/dev_v30.yaml
    • src/mvp/scripts/run_all_v30_api.sh
    • src/mvp/scripts/run_e2e_v30_cases.sh
    • src/mvp/scripts/60_start_api.sh
    • src/mvp/py/argus/service/sftpgo.py
    • src/mvp/py/tests/test_sftpgo.py
    • src/mvp/README.md
    • specs/mvp/v3.0/v3.0_api.md
  • 验证方式与结果:
    • 本地单测:.venv/bin/python -m pytest -q
    • 结果:全部通过(75 passed),覆盖率 90.35%(阈值 >= 90%)。
  • 待办/风险:
    • 需要你在 argus@h1 实跑 scripts/run_all_v30_api.sh 完成真正的 SFTP 上传/下载与 retention 验收(按 v3.0_acceptance.md)。