规划(08-08-production-deployment-execution): 校准唯一生产环境身份门禁
这个提交包含在:
@@ -5,6 +5,7 @@
|
||||
- [x] 已向用户呈现本 task 的最终规划摘要,并取得对该摘要的最新明确批准。
|
||||
- [x] 已解决候选发布是否可进入上游的外部授权;未获授权不得使用 unpublished override。
|
||||
- [x] 任务从 `planning` 切换到 `in_progress` 前,确认本清单、PRD、design 与 Open Questions 已收敛。
|
||||
- [ ] **规划修订复核:**确认唯一公网环境拓扑、精确身份匹配和数据库名只读引导的修订摘要,并重新批准后再改 tooling/连接生产。
|
||||
|
||||
## 1. 候选与本地证据
|
||||
|
||||
@@ -15,12 +16,22 @@
|
||||
- [x] `node deploy/trialrun/validate-env-contract.js`
|
||||
- [x] 相关部署 shell `bash -n`
|
||||
- [x] `node --check deploy/trialrun/production-preflight.mjs`
|
||||
- [x] 聚焦 `deployment-safety-contract.test.js`(既有提交证据为 13/13,本轮未重复触发生产动作)
|
||||
- [x] 聚焦 `deployment-safety-contract.test.js`(既有提交证据为 13/13,本轮未重复触发生产动作)
|
||||
|
||||
## 1.1 拓扑校准与 tooling 修订(生产前)
|
||||
|
||||
- [ ] **刻意次序调整:**本轮 target gate 不再是第一条生产命令;历史身份恢复、refresh exact probe、systemd contract/公网 origin 核对、远端 `POSTGRES_DB` 只读引导四步探测排在其之前。四步全程只读、逐步 fail-closed,任一失败均不得进入 target gate 或 Prisma status。
|
||||
- [ ] 从 `34181e3` 只读恢复历史 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME`,仅保存在当前进程;不把值写入 task、日志或对话。
|
||||
- [ ] 无回显探测 `DEPLOY_REFRESH_SERVER`,要求 exact forced-command `probe` 唯一 PASS;多个候选或零候选均 PAUSED。
|
||||
- [ ] 修改 production preflight:取消对合法 `trialrun` 命名的单独拒绝,增加部署目标、远端目录、Compose project、systemd contract、公网 origin 的精确身份对账;保留回环/零地址/local regression/staging/shadow/placeholder 防线。
|
||||
- [ ] 增加只读数据库身份 bootstrap:身份组匹配后读取远端 `.env` 的 `POSTGRES_DB`,只在内存中传给 target gate,禁止回显/落盘;读取失败或身份组不一致时不得进入 Prisma status。
|
||||
- [ ] 增加 synthetic fixture:合法 `hyb-oa-trialrun` 身份通过;错误目录/project/host/db、回环、staging、占位符和多 refresh 候选 fail-closed;断言 bootstrap 不泄露值且顺序早于 status。
|
||||
- [ ] 重新运行部署安全测试、shell/Node syntax、task/governance/sensitive/diff 门禁,提交并推送新的候选后重新通过 provenance。
|
||||
|
||||
## 2. 生产 preflight(全部只读)
|
||||
|
||||
- [ ] 从受控渠道取得 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS`、`DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`;仅存在于进程环境或受控 secret store。——**PAUSED:本次执行环境中均未注入;未猜测或回显值。**
|
||||
- [ ] 先运行 `check-existing-deployment.sh`,记录 13 项真实 PASS/FAIL 数字;任何 FAIL 停止。——**PAUSED:生产输入缺失,未连接生产。**
|
||||
- [ ] 在同一进程内加载现行 OPS7 origin、历史身份恢复结果、exact refresh identity、只读 DB bootstrap 结果和 `EXPECTED_PENDING_MIGRATIONS`;不把任何值写入仓库或对话。
|
||||
- [ ] 先运行 `check-existing-deployment.sh`,记录 13 项真实 PASS/FAIL 数字;任何 FAIL 停止。
|
||||
- [ ] 运行 `deploy-existing.sh` 内置的 source/target/preflight,或按同一 wrapper 的只读阶段执行;人工阅读 target gate 原始输出和 Prisma status marker 原文。
|
||||
- [ ] 核对 candidate migration manifest、`_prisma_migrations` applied/异常/pending 集合和批准 allowlist;未知 pending、failed、rolled-back、unfinished、diverged 或目标身份不确定均 `PAUSED`。
|
||||
- [ ] 同一只读窗口查询 `terminated` 行数,记录 `rollbackWindow=OPEN|CLOSED`、实际 count 和读取时间;确认这是部署前快照。
|
||||
@@ -78,3 +89,9 @@
|
||||
- 仓库外的三份验收 env 文件仍存在且为受控用户、`0600` 权限;它们只包含 live smoke、SMTP 或一次性账号键,不包含生产部署身份/数据库输入,未被本 task 读取或 source。
|
||||
- Git 历史没有 `deploy/trialrun/.env`、`deploy.env` 或上述验收 env 文件的删除记录;`.gitignore` 从始终将 `.env` 排除在版本库之外。
|
||||
- shell 历史没有五个部署变量的字面赋值记录。结论:部署输入不是被本 task 删除,而是按运维合同设计为每次执行时临时注入。
|
||||
|
||||
## Planning Revision Evidence (2026-08-08)
|
||||
|
||||
- 历史提交 `34181e3` 的旧 `deploy.sh` 确有默认试运行身份;该身份的目录/project 命名与公网 origin 属于同一唯一运行环境,不能因 `trialrun` 字样单独拒绝。
|
||||
- 现行 gate 尚未对 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME` 与独立预期身份做精确对账;本节修订只允许先改部署/QA tooling,不改业务代码或生产数据。
|
||||
- 修订后的第一条远端动作仍是只读身份 bootstrap;数据库名读取排在 exact identity 匹配之后,任何 bootstrap 或 target gate FAIL 都不得继续。
|
||||
|
||||
在新工单中引用
屏蔽一个用户