Files
xas-test-library/docs/adr/0004-native-execution.md

36 lines
4.5 KiB
Markdown

# ADR 0004:可信原入口复用原环境,上传脚本保持隔离
日期:2026-10-13;状态:按用户明确授权实施。补充 ADR 0002 的执行边界。
## 目标与决策
现有测试依赖宿主 Python、原模型配置、Docker 和交互菜单,统一放进轻量容器无法保持原行为。网页登记固定原入口,参数只允许方案声明的类型和范围;不改原脚本、原配置或素材。`catalog/native-profiles.json` 是管理员维护的可信方案,上传代码不能使用宿主模式。
网页只负责展示、参数配置、逐次影响确认和记录。宿主 worker 通过私有 0600 Unix socket 校验入口、来源摘要、参数、计划摘要与确认,创建 `adamwen-native-<run_id>.service`。网页没有 Docker socket 或任意命令入口,既有 LAN 访问范围与无账号安排不变。
服务独立于 HTTP 连接和 worker 生命周期。worker 重启后关联同一服务;未确认结束时保留队列占位,不自动补跑。超时/取消等待本次 cgroup 收尾后释放占位。Docker daemon 或 tmux 分离任务需要另行核对;前后资源快照只是变化证据,不能据此自动删容器或声明恢复模型。当前控制台单并发不能阻止维护者在控制台之外同时运行任务。
菜单以有控制终端的 PTY 运行,关闭回显,只接收数字选项/列表、y/n/q、空行。禁止控制键和任意命令,避免菜单通道变成宿主终端。需要其他输入的高级维护操作不在本控制台范围内。
秘密仅在宿主内存读取;标准输出、文件日志及文本归档按已知秘密流式脱敏。输出保留在原处,平台归档新增/变更文件;固定文件名会覆盖历史的容量/成本方案先做本项目私有备份。保留采集/归档上限并显示未归档原因,不把归档当成整个原工作区备份。
## 数据迁移与恢复
SQLite 保持 schema v1,仅增加 JSON 配置和运行快照字段。`deploy/native_profiles.py` 对已有 22 个入口做单事务配置迁移,保留 ID、versions 和 runs;拒绝活动任务或并发配置变化。先备份 SQLite 和旧源码,再执行;逐条 before/after 保存在私有迁移清单。隔离生产库副本已验证迁移、幂等及精确配置恢复,历史记录不改变。
回退必须先停止接单并确认无排队/运行中的 native 服务,再停止 worker,按迁移清单恢复配置以及匹配的旧 worker 源码和网页镜像。若配置有后续修改,恢复工具拒绝覆盖,须人工核对。新运行历史和结果继续保留;应用回退不恢复旧数据库。不可让旧 worker 处理仍活动的新模式任务。
## 验证范围
方案接入、只读预检、参数/权限边界、模拟及真实短进程生命周期已验证。原项目的 GPU、长稳和模型切换业务不在本轮实际运行,页面如实提示。后续只有在用户实际发起并确认相应影响时才执行原项目测试。
## 2026-10-20:原语音镜像与模型身份预检
语音测试的 Python、SDK 和音频库位于原 Docker 镜像,宿主 Python 不具备相同依赖。可信方案新增固定镜像摘要和只读挂载描述,由 `native_container.py` 构造固定客户端命令;上传代码仍不能选择宿主命令或 Docker 参数。容器使用 runc、无 GPU 设备、只读根目录和原源码,独立 `/out` 输出;2 CPU、4 GiB、128 进程,计算库线程为 2,缓存写临时目录,避免按宿主 128 线程初始化而超限。仅通过原接口使用共享模型,并逐次确认影响。
取消/超时先收尾原 systemd 服务,再按本次运行标签核验客户端容器,使用不可变容器 ID 清理。自动删除竞态确认缺失即成功;Docker 状态未知仍保留运行占位。原 label-key 认证表只读取已登记 selftest 身份用于日志脱敏,值不进入命令行、数据库或网页。
当前 DeepSeek/Qwen 目标在预检中增加一次有界 `/v1/models` 请求:仅允许本机地址、拒绝重定向、无重试、3 秒超时、256 KiB 响应上限,不发推理。名称不匹配或认证异常阻止运行。原共享访问日志只检查存在,不把其持续变化纳入启动配置摘要。
后续已审查来源更新用 `deploy/refresh_catalog.py` 单事务写入;保留已有参数、禁用选择、版本和运行历史,新增业务入口与内部文件分开。新增项目已有运行记录或配置发生后续修改时,配置恢复拒绝覆盖,不能用旧数据库替代新历史。