8.6 KiB
8.6 KiB
MVP v3.0 进展记录(milestone log)
本文档用于记录 v3.0 按 specs/mvp/v3.0/v3.0_dev_plan.md 实施过程中的里程碑完成情况。
约定:每完成一个里程碑,追加一条记录,包含日期、完成内容、涉及文件、验证方式/结果、待办/风险。
M1:Path 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 id(如Qwen/...)处理。
- 拒绝跨用户路径(例如
bob提交/private/users/alice/datasets/...)。 - 拒绝本地模型路径不在
models/(例如指向jobs/)。
- 涉及文件:
src/mvp/py/argus/service/app.pysrc/mvp/py/tests/test_users.py
- 验证方式与结果:
- 本地单测:
.venv/bin/python -m pytest -q - 结果:全部通过(
54 passed),覆盖率阈值保持>= 90%。
- 本地单测:
- 待办/风险:
model_id=/private/...的“本地模型路径语义”需要在用户文档/WebUI 中明确提示(避免误用)。- 后续 M2/M3 需要把该路径策略同步到 UI 表单/提示文本(避免用户填错路径)。
M2:SFTPGo 集成(方案 A:用户联动创建 + password)(已完成)
- 日期:2025-12-30
- 范围:SFTPGo(Data Management)最小集成 + 用户自助信息
/api/v2/me+ 用户目录结构落盘。 - 完成内容:
- 新增
data配置段:data.user_root:用户数据根目录(默认/private/users)data.sftpgo:SFTPGo 可选联动(enabled/host/sftp_port/admin_api_base/admin_user/admin_password_env)data.retention:jobs 过期策略配置(3 天移入 trash,7 天 purge;janitor 在 M4 实现)
- 新增
SFTPGoAdminClient(urllib实现,不使用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.pysrc/mvp/py/argus/service/sftpgo.pysrc/mvp/py/argus/service/app.pysrc/mvp/py/tests/test_sftpgo.pysrc/mvp/py/tests/test_users.pysrc/mvp/py/tests/test_app.pysrc/mvp/py/tests/test_service_config.pysrc/mvp/configs/dev.yamlspecs/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可写。
M3:WebUI(最小可用,多页面 + 侧边栏)(已完成)
- 日期:2025-12-30
- 范围:API server 托管最小 WebUI(同源,不引入 Node 构建),用于登录/提交/查看任务与日志、查看 data 信息。
- 完成内容:
- 新增 UI 路由(HTML+少量 JS):
/ui(重定向到 tasks)/ui/login:token 粘贴并写入浏览器 localStorage(key=mvp_token)/ui/tasks:任务队列列表(调用/api/v2/queue)/ui/tasks/new:提交 TaskSpec YAML(POST/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 注入)。
- 新增 UI 路由(HTML+少量 JS):
- 涉及文件:
src/mvp/py/argus/service/ui.pysrc/mvp/py/argus/service/app.pysrc/mvp/py/tests/test_ui.py
- 验证方式与结果:
- 本地单测:
.venv/bin/python -m pytest -q - 结果:全部通过(
65 passed),覆盖率90.53%(阈值>= 90%)。
- 本地单测:
- 待办/风险:
- WebUI 当前为“骨架+API 驱动”,不做复杂交互与大文件下载;上传/下载仍以 SFTP 为主(按设计)。
- Starlette TestClient 的
allow_redirects有弃用告警(不影响功能,可在后续清理)。
M4:Jobs Retention janitor(3 天移入 trash,7 天后 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.pysrc/mvp/py/argus/service/db.pysrc/mvp/py/argus/service/app.pysrc/mvp/py/tests/test_janitor.py
- 验证方式与结果:
- 本地单测:
.venv/bin/python -m pytest -q - 结果:全部通过(
75 passed),覆盖率90.72%(阈值>= 90%)。
- 本地单测:
- 待办/风险:
- M4 只做“逻辑 + 单测”,实际
/private/users/...的权限与在argus@h1的行为验证放到 M5(端到端)。
- M4 只做“逻辑 + 单测”,实际
M5:端到端(h1)— SFTPGo compose + v3.0 E2E 脚本(已完成:交付脚本/配置)
- 日期:2025-12-30
- 范围:补齐 h1 端到端所需的 compose/service、配置与一键脚本(实际运行/验收由你在
argus@h1执行)。 - 完成内容:
- SFTPGo 集成到
docker compose:- 新增
argus-sftpgoservice(SFTP 2022;Admin API/UI 8080→host 8081,避免与 MVP API 8080 冲突) - 同挂载
../../shared:/private,并持久化元数据到../../shared/common/sftpgo
- 新增
- SFTPGoAdminClient 实装(对齐 upstream OpenAPI):
GET /api/v2/token(BasicAuth)获取 admin tokenPOST /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 runner(HP-1)
- API 启动脚本增强:
scripts/60_start_api.sh支持透传SFTPGO_ADMIN_PASSWORD到 head 容器内的 API 进程。
- SFTPGo 集成到
- 涉及文件:
src/mvp/docker-compose.yamlsrc/mvp/configs/dev_v30.yamlsrc/mvp/scripts/run_all_v30_api.shsrc/mvp/scripts/run_e2e_v30_cases.shsrc/mvp/scripts/60_start_api.shsrc/mvp/py/argus/service/sftpgo.pysrc/mvp/py/tests/test_sftpgo.pysrc/mvp/README.mdspecs/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)。
- 需要你在