fix: wait for services during deployment

This commit is contained in:
hectorzhao
2026-08-10 21:00:18 +08:00
parent 55aa054005
commit 0eb27e4ac0
4 changed files with 26 additions and 3 deletions
+2
View File
@@ -87,6 +87,8 @@ git reset --hard origin/main
bash tools/deploy/production-deploy.sh bash tools/deploy/production-deploy.sh
``` ```
部署脚本重启 Gateway、API 和 Nginx 后,会分别对 Gateway、API 健康接口执行最多 60 秒的逐秒就绪检查。Nest 初始化、活动通道恢复或生产数据量增加可能使 API 启动超过固定数秒;发布流程不得用单次固定延时把正常慢启动误判为失败。超过 60 秒仍不健康时才终止发布,并结合 systemd journal 和发布前数据库、源码、环境备份判断回滚方式。
## 账号和密钥 ## 账号和密钥
- 生产管理员账号写入 `/root/cmpp-platform-admin.txt` - 生产管理员账号写入 `/root/cmpp-platform-admin.txt`
+1
View File
@@ -4550,6 +4550,7 @@ npm run verify:phase8
| TC-SIGNATURE-RETIREMENT-026 | 点击消息“抑制”,分别选择临时截止日期和永久抑制并填写原因 | 只出现平台自研弹窗;临时模式要求未来截止日期,永久模式不显示日期,两种模式原因必填,保存调用真实抑制接口且刷新当前筛选页 | | TC-SIGNATURE-RETIREMENT-026 | 点击消息“抑制”,分别选择临时截止日期和永久抑制并填写原因 | 只出现平台自研弹窗;临时模式要求未来截止日期,永久模式不显示日期,两种模式原因必填,保存调用真实抑制接口且刷新当前筛选页 |
| TC-SIGNATURE-RETIREMENT-027 | 在抑制管理点击“取消抑制”,填写或不填写原因 | 只出现平台自研弹窗;未填原因不能确认,填写后调用真实取消接口并刷新消息及抑制列表,不出现浏览器`prompt/confirm` | | TC-SIGNATURE-RETIREMENT-027 | 在抑制管理点击“取消抑制”,填写或不填写原因 | 只出现平台自研弹窗;未填原因不能确认,填写后调用真实取消接口并刷新消息及抑制列表,不出现浏览器`prompt/confirm` |
| TC-REPORT-RECORD-LAYOUT-001 | 在报备记录页面查看长备注和短备注 | 备注列桌面宽度不小于320px,使用统一长文本换行样式;宽表允许内部横向滚动,备注不被其他固定列挤成窄竖列,详情仍展示全文 | | TC-REPORT-RECORD-LAYOUT-001 | 在报备记录页面查看长备注和短备注 | 备注列桌面宽度不小于320px,使用统一长文本换行样式;宽表允许内部横向滚动,备注不被其他固定列挤成窄竖列,详情仍展示全文 |
| TC-DEPLOY-HEALTH-001 | 发布重启后模拟API初始化超过3秒但在60秒内恢复,并分别模拟API或Gateway持续60秒不可用 | 前者由部署脚本逐秒重试并正常完成,不触发误回滚;后者在60秒后明确失败并保留发布前数据库、源码和环境恢复资产,不把端口尚未就绪当作构建或migration失败 |
### 2026-08-10 本地执行状态 ### 2026-08-10 本地执行状态
+7
View File
@@ -3435,3 +3435,10 @@ git diff --check
- 报备记录“备注”列统一使用长文本列规范,桌面端设置为320px并允许表格内部横向滚动;`docs/ui-design-guidelines.md`新增全局约束:长文本列最小240px、建议280–360px并使用`.ui-table__long-text`。浏览器读取“备注”表头计算宽度及最小宽度均为320px。 - 报备记录“备注”列统一使用长文本列规范,桌面端设置为320px并允许表格内部横向滚动;`docs/ui-design-guidelines.md`新增全局约束:长文本列最小240px、建议280–360px并使用`.ui-table__long-text`。浏览器读取“备注”表头计算宽度及最小宽度均为320px。
- 清退专项9/9、API全量35个suite/448项通过;API与前端TypeScript、API正式构建、Vite 8.1.5生产构建通过(2538 modules,仅既有约2.06MB单chunk提示),`git diff --check`通过且仅输出既有LF/CRLF提示。真实查询回放脚本重复执行新增0条,证明QA消息生成幂等;未发送短信、Webhook,未保存抑制,未修改生产或预生产数据。 - 清退专项9/9、API全量35个suite/448项通过;API与前端TypeScript、API正式构建、Vite 8.1.5生产构建通过(2538 modules,仅既有约2.06MB单chunk提示),`git diff --check`通过且仅输出既有LF/CRLF提示。真实查询回放脚本重复执行新增0条,证明QA消息生成幂等;未发送短信、Webhook,未保存抑制,未修改生产或预生产数据。
- 本轮代码、测试和文档继续保持未提交、未推送、未部署;受保护的`api/tsconfig.build.tsbuildinfo``tsconfig.tsbuildinfo``outputs/`和空文件`=`不删除、不提交、不归因于本需求。 - 本轮代码、测试和文档继续保持未提交、未推送、未部署;受保护的`api/tsconfig.build.tsbuildinfo``tsconfig.tsbuildinfo``outputs/`和空文件`=`不删除、不提交、不归因于本需求。
## 2026-08-10 发布健康检查慢启动兼容(发布中)
- 签名清退功能提交`55aa054005d07eef04891ce6ee0700ae629aee3f`已推送后,首次预生产发布成功完成备份、依赖门禁、Prisma generate、84条migration应用和前后端/Gateway构建;服务重启后的API单次健康检查在固定3秒窗口内尚未监听3000端口,发布包装器按设计恢复上一运行目录。恢复后API、Gateway、Nginx、PostgreSQL、Redis和MinIO均为activeAPI health为200API journal没有启动异常,确认属于健康检查与正常慢启动竞态,不是代码构建或migration失败。
- 权威`tools/deploy/production-deploy.sh`将API和Gateway检查改为最多60秒逐秒重试。为什么:Nest初始化和活动通道恢复耗时随生产数据量波动,固定等待会把正常慢启动误判为发布失败;超过60秒仍不可用才应终止并进入日志诊断和恢复流程。
- 首次发布前恢复资产完整保留在`/opt/cmpp-platform-backups/releases/20260810-205625-before-55aa0540`;PostgreSQL、运行源码和环境文件均已通过格式、非空和SHA-256检查。`20260810143000_add_signature_retirement_alerts`已成功且仅应用一次,数据库当前84条已完成migration;重新发布依赖Prisma幂等状态,不重复伪造或手工标记migration。
- 同步更新部署手册和`TC-DEPLOY-HEALTH-001`。本步骤没有发送、补发或重投短信,没有创建外部Webhook,没有修改通道账号、密码、启停状态、企业余额或客户连接。
+16 -3
View File
@@ -89,9 +89,22 @@ systemctl restart cmpp-api
systemctl restart nginx systemctl restart nginx
echo "[deploy] Health checks" echo "[deploy] Health checks"
sleep 3 wait_for_http() {
curl -fsS "http://127.0.0.1:${API_PORT:-3000}/api/health" >/dev/null local name="$1"
curl -fsS "http://127.0.0.1:8090/health" >/dev/null local url="$2"
local attempt
# Nest初始化和活动通道恢复会随生产数据量波动;固定等待会把正常的慢启动误判为发布失败。
for attempt in $(seq 1 60); do
if curl -fsS "$url" >/dev/null 2>&1; then
return 0
fi
sleep 1
done
echo "$name did not become healthy within 60 seconds: $url" >&2
return 1
}
wait_for_http "API" "http://127.0.0.1:${API_PORT:-3000}/api/health"
wait_for_http "Gateway" "http://127.0.0.1:8090/health"
redis-cli -h "${REDIS_HOST:-127.0.0.1}" -p "${REDIS_PORT:-6379}" ping >/dev/null redis-cli -h "${REDIS_HOST:-127.0.0.1}" -p "${REDIS_PORT:-6379}" ping >/dev/null
pg_isready -d "${DATABASE_URL%%\?*}" >/dev/null pg_isready -d "${DATABASE_URL%%\?*}" >/dev/null