fix(deploy): 全新部署链路健壮性(0004 幂等 + 迁移前置 + 空库守卫)
AIOps CI / Backend (test, vet, build) (push) Canceled after 0s
AIOps CI / Agent (test, vet, build) (push) Canceled after 0s
AIOps CI / Frontend (typecheck, lint, build) (push) Canceled after 0s
AIOps CI / API integration (SQLite + redka) (push) Canceled after 0s

- 0004_metric_aggregate_unique 改为幂等:新库基线已由模型 uniqueIndex 建出
  uniq_metric_agg,再次 CREATE 会以 1061 重复键名中断 migrate up,
  导致 0005_agent_settings 建不出来(全新部署实测复现)
- 新增 database.IndexExists:跨 SQLite/MySQL/PostgreSQL 判断索引是否存在
- 新增 database.EnsureSchemaInitialized:服务启动遇到空库时明确失败并给出
  执行 aiops migrate up 的指引,避免「服务起来了但页面全是空数据」
- run.sh docker up/upgrade/update 先跑一次 aiops migrate up 再启动服务

// Logan.Li
This commit is contained in:
Logan.Li committed 2026-09-14 09:02:42 +00:00
1 parent 7a96381dc7
commit f3a4fb569f
5 files changed
+57

No files matched your search

+12
View File
@@ -84,6 +84,18 @@ func (n indexNamedNaming) UniqueName(table, column string) string {
return n.NamingStrategy.IndexName(table, column)
}
// EnsureSchemaInitialized 校验库结构是否已初始化(即已执行过 `aiops migrate up`)。
// 服务启动不做结构迁移,但遇到空库必须明确失败,避免「服务已起来、页面全是空数据」的静默故障。 // Logan.Li
func EnsureSchemaInitialized(db *gorm.DB) error {
if db == nil {
return fmt.Errorf("数据库连接为空")
}
if !db.Migrator().HasTable("iam_users") {
return fmt.Errorf("未检测到业务表,数据库尚未初始化")
}
return nil
}
// BootstrapSchema 为空数据库创建初始基线结构。
// 该函数只能由显式的 `aiops migrate up` 调用,服务启动路径禁止调用。 // Logan.Li
func BootstrapSchema(db *gorm.DB) error {