2026-05-06 09:39:33 +08:00
|
|
|
|
# 共享预生产入口交接清单
|
|
|
|
|
|
|
|
|
|
|
|
> 状态:待共享预生产环境提供方回填
|
|
|
|
|
|
> 最近更新:2026-05-06
|
|
|
|
|
|
> 适用项目:`projects/ai-customer-service`
|
|
|
|
|
|
> 目标:确保“真实共享预生产 Gate B 复跑”和“真实共享预生产/灰度环境 Gate C 回滚演练”具备可执行入口,而不是停留在口头说明
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 这份清单解决什么问题
|
|
|
|
|
|
|
|
|
|
|
|
当前项目已经具备:
|
|
|
|
|
|
|
|
|
|
|
|
1. 代码级门禁通过
|
|
|
|
|
|
2. 本地/容器化 Gate B 通过
|
|
|
|
|
|
3. 本地/容器化 Gate C 回滚演练通过
|
|
|
|
|
|
|
|
|
|
|
|
当前仍然缺失的是:
|
|
|
|
|
|
|
|
|
|
|
|
1. **真实共享预生产环境 Gate B 复跑入口**
|
|
|
|
|
|
2. **真实共享预生产/灰度环境 Gate C 回滚演练入口**
|
|
|
|
|
|
|
|
|
|
|
|
这里的“入口”不是一个 URL,也不是一句“环境已经有了”,而是:
|
|
|
|
|
|
|
|
|
|
|
|
> **从当前执行机器出发,能真实操作共享预生产环境的运维通道。**
|
|
|
|
|
|
|
|
|
|
|
|
必须能够支持:
|
|
|
|
|
|
|
|
|
|
|
|
1. 启动/重启服务
|
|
|
|
|
|
2. 查看日志
|
|
|
|
|
|
3. 访问 health probe
|
|
|
|
|
|
4. 访问真实 PostgreSQL
|
|
|
|
|
|
5. 获取真实环境变量来源
|
|
|
|
|
|
6. 在该环境执行 Gate B 验证
|
|
|
|
|
|
7. 在该环境执行 Gate C 回滚演练
|
|
|
|
|
|
8. 留下可复核证据
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 合格入口类型
|
|
|
|
|
|
|
|
|
|
|
|
满足以下任一类型即可:
|
|
|
|
|
|
|
|
|
|
|
|
### 2.1 SSH 主机入口
|
|
|
|
|
|
|
|
|
|
|
|
提供:
|
|
|
|
|
|
|
|
|
|
|
|
- 主机地址
|
|
|
|
|
|
- 用户名
|
|
|
|
|
|
- 登录方式
|
|
|
|
|
|
- 项目目录
|
|
|
|
|
|
- 启动/重启命令
|
|
|
|
|
|
- 日志路径
|
|
|
|
|
|
- 服务访问地址
|
|
|
|
|
|
|
|
|
|
|
|
适用场景:
|
|
|
|
|
|
|
|
|
|
|
|
- systemd 服务
|
|
|
|
|
|
- 直接运行二进制
|
|
|
|
|
|
- Docker / Podman 单机部署
|
|
|
|
|
|
|
|
|
|
|
|
### 2.2 Kubernetes 入口
|
|
|
|
|
|
|
|
|
|
|
|
提供:
|
|
|
|
|
|
|
|
|
|
|
|
- `kubectl` 可用
|
|
|
|
|
|
- `kubeconfig` 或 context
|
|
|
|
|
|
- namespace
|
|
|
|
|
|
- deployment / service 名称
|
|
|
|
|
|
- 查看日志权限
|
|
|
|
|
|
- rollout / undo 权限
|
|
|
|
|
|
|
|
|
|
|
|
适用场景:
|
|
|
|
|
|
|
|
|
|
|
|
- Kubernetes Deployment
|
|
|
|
|
|
- StatefulSet
|
|
|
|
|
|
- 多副本灰度切换
|
|
|
|
|
|
|
|
|
|
|
|
### 2.3 CI/CD 或发布平台入口
|
|
|
|
|
|
|
|
|
|
|
|
提供:
|
|
|
|
|
|
|
|
|
|
|
|
- 预生产部署流水线入口
|
|
|
|
|
|
- 环境变量/Secret 查看或确认方式
|
|
|
|
|
|
- 服务日志查看入口
|
|
|
|
|
|
- 重启/回滚入口
|
|
|
|
|
|
- 部署版本与提交号映射
|
|
|
|
|
|
|
|
|
|
|
|
适用场景:
|
|
|
|
|
|
|
|
|
|
|
|
- GitOps
|
|
|
|
|
|
- 平台托管部署
|
|
|
|
|
|
- 云上控制台发布
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 不算合格入口的情况
|
|
|
|
|
|
|
|
|
|
|
|
以下情况都不够:
|
|
|
|
|
|
|
|
|
|
|
|
1. 只有共享预生产 URL
|
|
|
|
|
|
2. 只有数据库只读账号
|
|
|
|
|
|
3. 只有监控只读面板
|
|
|
|
|
|
4. 只有截图、文档或口头说明
|
|
|
|
|
|
5. 只能“看状态”,不能“重启/回滚/留痕”
|
|
|
|
|
|
|
|
|
|
|
|
原因很直接:
|
|
|
|
|
|
|
|
|
|
|
|
> Gate B / Gate C 都要求可操作性,不只是可观察性。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 4. 入口必须满足的规范要求
|
|
|
|
|
|
|
|
|
|
|
|
### 4.1 部署对象明确
|
|
|
|
|
|
|
|
|
|
|
|
必须明确服务部署对象:
|
|
|
|
|
|
|
|
|
|
|
|
- systemd service 名称
|
|
|
|
|
|
- Docker / Podman 容器名称
|
|
|
|
|
|
- Kubernetes deployment / rollout 对象
|
|
|
|
|
|
|
|
|
|
|
|
不能只说“服务在那台机器上”,必须能回答:
|
|
|
|
|
|
|
|
|
|
|
|
1. 由谁启动
|
|
|
|
|
|
2. 怎么重启
|
|
|
|
|
|
3. 怎么回滚
|
|
|
|
|
|
4. 日志在哪
|
|
|
|
|
|
|
|
|
|
|
|
### 4.2 环境变量来源明确
|
|
|
|
|
|
|
|
|
|
|
|
必须明确共享预生产如何注入这些变量:
|
|
|
|
|
|
|
|
|
|
|
|
- `AI_CS_RUNTIME_ENV`
|
|
|
|
|
|
- `AI_CS_ADDR`
|
|
|
|
|
|
- `AI_CS_POSTGRES_ENABLED`
|
|
|
|
|
|
- `AI_CS_POSTGRES_DSN`
|
|
|
|
|
|
- `AI_CS_POSTGRES_MIGRATION_DIR`
|
|
|
|
|
|
- `AI_CS_WEBHOOK_SECRET`
|
|
|
|
|
|
- `AI_CS_WEBHOOK_TIMESTAMP_HEADER`
|
|
|
|
|
|
- `AI_CS_WEBHOOK_SIGNATURE_HEADER`
|
|
|
|
|
|
- `AI_CS_WEBHOOK_MAX_SKEW_SECONDS`
|
|
|
|
|
|
|
|
|
|
|
|
基线文档:
|
|
|
|
|
|
|
2026-05-11 12:19:15 +08:00
|
|
|
|
- [CONFIG_CONTRACT_BASELINE.md](/home/long/project/ai-customer-service/docs/CONFIG_CONTRACT_BASELINE.md)
|
2026-05-06 09:39:33 +08:00
|
|
|
|
|
|
|
|
|
|
必须至少能回答:
|
|
|
|
|
|
|
|
|
|
|
|
1. 变量值从哪里来
|
|
|
|
|
|
2. 谁负责维护
|
|
|
|
|
|
3. 如何在不泄露明文 secret 的前提下确认其已正确注入
|
|
|
|
|
|
|
|
|
|
|
|
### 4.3 数据库必须是共享预生产真实库
|
|
|
|
|
|
|
|
|
|
|
|
不能使用:
|
|
|
|
|
|
|
|
|
|
|
|
- 本地测试库
|
|
|
|
|
|
- 临时容器库
|
|
|
|
|
|
- 开发库
|
|
|
|
|
|
|
|
|
|
|
|
必须使用共享预生产 PostgreSQL,才能证明:
|
|
|
|
|
|
|
|
|
|
|
|
1. migration 基线真实可用
|
|
|
|
|
|
2. ticket 入库真实可用
|
|
|
|
|
|
3. audit 入库真实可用
|
|
|
|
|
|
4. dedup 入库真实可用
|
|
|
|
|
|
|
|
|
|
|
|
### 4.4 必须具备最小操作权限
|
|
|
|
|
|
|
|
|
|
|
|
入口必须允许执行以下动作:
|
|
|
|
|
|
|
|
|
|
|
|
1. 启动或重启当前版本
|
|
|
|
|
|
2. 查看最近日志
|
|
|
|
|
|
3. 访问 `/actuator/health/live`
|
|
|
|
|
|
4. 访问 `/actuator/health/ready`
|
|
|
|
|
|
5. 读取当前部署版本/镜像/tag/commit
|
|
|
|
|
|
6. 执行回滚动作
|
|
|
|
|
|
7. 验证回滚后主链恢复
|
|
|
|
|
|
|
|
|
|
|
|
### 4.5 必须可留痕
|
|
|
|
|
|
|
|
|
|
|
|
至少保留以下证据:
|
|
|
|
|
|
|
|
|
|
|
|
1. `summary.txt`
|
|
|
|
|
|
2. 服务日志路径
|
|
|
|
|
|
3. 部署版本 / 提交号
|
|
|
|
|
|
4. 健康检查结果
|
|
|
|
|
|
5. Gate B / Gate C 执行命令
|
|
|
|
|
|
6. 回滚前后版本信息
|
|
|
|
|
|
7. 必要时数据库验证摘要
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 5. Gate B 所需最小入口要求
|
|
|
|
|
|
|
|
|
|
|
|
如果当前只想完成“真实共享预生产 Gate B 复跑”,入口最少要具备:
|
|
|
|
|
|
|
|
|
|
|
|
1. 共享预生产服务启动权限
|
|
|
|
|
|
2. 共享预生产 PostgreSQL 可连
|
|
|
|
|
|
3. 真实 `AI_CS_*` 环境变量可确认
|
|
|
|
|
|
4. 服务地址可访问
|
|
|
|
|
|
5. 日志可读
|
|
|
|
|
|
|
|
|
|
|
|
执行入口:
|
|
|
|
|
|
|
2026-05-11 12:19:15 +08:00
|
|
|
|
- [scripts/verify_preprod_gate_b.sh](/home/long/project/ai-customer-service/scripts/verify_preprod_gate_b.sh)
|
2026-05-06 09:39:33 +08:00
|
|
|
|
|
|
|
|
|
|
对应证据模板:
|
|
|
|
|
|
|
2026-05-11 12:19:15 +08:00
|
|
|
|
- [PREPROD_VERIFICATION_RECORD.md](/home/long/project/ai-customer-service/docs/PREPROD_VERIFICATION_RECORD.md)
|
2026-05-06 09:39:33 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 6. Gate C 所需额外入口要求
|
|
|
|
|
|
|
|
|
|
|
|
如果要完成“真实共享预生产/灰度环境 Gate C 回滚演练”,除 Gate B 外还必须额外明确:
|
|
|
|
|
|
|
|
|
|
|
|
1. **坏发布怎么制造**
|
|
|
|
|
|
- 错误配置
|
|
|
|
|
|
- 错误 DSN
|
|
|
|
|
|
- 错误 Secret
|
|
|
|
|
|
- 错误镜像/tag
|
|
|
|
|
|
2. **回滚对象是谁**
|
|
|
|
|
|
- systemd service
|
|
|
|
|
|
- container
|
|
|
|
|
|
- deployment
|
|
|
|
|
|
3. **标准回滚动作是什么**
|
|
|
|
|
|
- `systemctl restart ...`
|
|
|
|
|
|
- `docker/podman restart ...`
|
|
|
|
|
|
- `kubectl rollout undo ...`
|
|
|
|
|
|
4. **恢复完成如何判定**
|
|
|
|
|
|
- `live` / `ready` 恢复
|
|
|
|
|
|
- signed webhook 重新返回 `200`
|
|
|
|
|
|
- ticket / audit / dedup 重新恢复写入
|
|
|
|
|
|
|
|
|
|
|
|
执行入口:
|
|
|
|
|
|
|
2026-05-11 12:19:15 +08:00
|
|
|
|
- [scripts/verify_gate_c_rollback.sh](/home/long/project/ai-customer-service/scripts/verify_gate_c_rollback.sh)
|
2026-05-06 09:39:33 +08:00
|
|
|
|
|
|
|
|
|
|
对应证据模板:
|
|
|
|
|
|
|
2026-05-11 12:19:15 +08:00
|
|
|
|
- [ROLLBACK_DRILL_RECORD.md](/home/long/project/ai-customer-service/docs/ROLLBACK_DRILL_RECORD.md)
|
2026-05-06 09:39:33 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 7. 共享预生产入口交接模板
|
|
|
|
|
|
|
|
|
|
|
|
请环境提供方至少按下面模板回填:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
共享预生产入口类型:
|
|
|
|
|
|
- SSH / Kubernetes / CI-CD
|
|
|
|
|
|
|
|
|
|
|
|
如果是 SSH:
|
|
|
|
|
|
- 主机地址:
|
|
|
|
|
|
- 用户名:
|
|
|
|
|
|
- 登录方式:
|
|
|
|
|
|
- 项目目录:
|
|
|
|
|
|
- 服务启动命令:
|
|
|
|
|
|
- 服务重启命令:
|
|
|
|
|
|
- 服务停止命令:
|
|
|
|
|
|
- 日志路径:
|
|
|
|
|
|
- 服务访问地址:
|
|
|
|
|
|
- 环境变量来源文件或注入方式:
|
|
|
|
|
|
|
|
|
|
|
|
如果是 Kubernetes:
|
|
|
|
|
|
- kubeconfig/context:
|
|
|
|
|
|
- namespace:
|
|
|
|
|
|
- deployment 名称:
|
|
|
|
|
|
- service 名称:
|
|
|
|
|
|
- ingress / 访问地址:
|
|
|
|
|
|
- 查看日志命令:
|
|
|
|
|
|
- 重启命令:
|
|
|
|
|
|
- 回滚命令:
|
|
|
|
|
|
- Secret / ConfigMap 名称:
|
|
|
|
|
|
|
|
|
|
|
|
如果是 CI/CD:
|
|
|
|
|
|
- 平台名称:
|
|
|
|
|
|
- 流水线入口:
|
|
|
|
|
|
- 发布目标环境名称:
|
|
|
|
|
|
- 当前部署版本查看方式:
|
|
|
|
|
|
- 日志查看入口:
|
|
|
|
|
|
- 回滚入口:
|
|
|
|
|
|
|
|
|
|
|
|
数据库:
|
|
|
|
|
|
- 是否为共享预生产 PostgreSQL:
|
|
|
|
|
|
- DSN 获取方式:
|
|
|
|
|
|
- migration 目录所在位置:
|
|
|
|
|
|
|
|
|
|
|
|
Gate B 执行责任人:
|
|
|
|
|
|
- 负责人:
|
|
|
|
|
|
- 计划时间:
|
|
|
|
|
|
|
|
|
|
|
|
Gate C 回滚演练责任人:
|
|
|
|
|
|
- 负责人:
|
|
|
|
|
|
- 计划时间:
|
|
|
|
|
|
|
|
|
|
|
|
证据归档位置:
|
|
|
|
|
|
- summary.txt:
|
|
|
|
|
|
- service.log:
|
|
|
|
|
|
- 版本信息:
|
|
|
|
|
|
- 回滚记录:
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 8. 当前项目的真实阻断
|
|
|
|
|
|
|
|
|
|
|
|
截至 2026-05-06,当前执行机器上已确认:
|
|
|
|
|
|
|
|
|
|
|
|
1. **没有 `kubectl`**
|
|
|
|
|
|
2. **没有 `~/.kube/config`**
|
|
|
|
|
|
3. **没有共享预生产专用 `AI_CS_*` 环境**
|
|
|
|
|
|
4. **仓库内没有共享预生产部署清单**
|
|
|
|
|
|
|
|
|
|
|
|
因此当前阻断不是:
|
|
|
|
|
|
|
|
|
|
|
|
- Gate B/Gate C 脚本缺失
|
|
|
|
|
|
- 本地演练能力缺失
|
|
|
|
|
|
- 门禁文档缺失
|
|
|
|
|
|
|
|
|
|
|
|
而是:
|
|
|
|
|
|
|
|
|
|
|
|
> **真实共享预生产环境运维入口未交接。**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 9. 当前结论
|
|
|
|
|
|
|
|
|
|
|
|
当前可以准确表达为:
|
|
|
|
|
|
|
|
|
|
|
|
1. **代码级门禁:通过**
|
|
|
|
|
|
2. **本地/容器化 Gate B:通过**
|
|
|
|
|
|
3. **本地/容器化 Gate C 回滚演练:通过**
|
|
|
|
|
|
4. **真实共享预生产 Gate B:待共享预生产入口交接后执行**
|
|
|
|
|
|
5. **真实共享预生产/灰度环境 Gate C:待共享预生产入口交接后执行**
|
|
|
|
|
|
|
|
|
|
|
|
> 没有入口,不应宣称“真实共享预生产已验证”;有入口后,才可以继续执行真实 Gate B / Gate C。
|