refactor(zone): remove legacy route domain storage

第二阶段清理:删除 of_managed_domains 与 of_proxy_routes 冗余域名/证书列,
移除 ManagedDomain 模型与 API、路由侧 legacy 字段维护,以及前端 WebsiteService。
ImportLegacy 在旧列/旧表缺失时跳过对应源,保持幂等。
This commit is contained in:
ryan
2026-07-12 15:31:01 +08:00
parent fb3dd5afe6
commit 5b52acdd6c
26 changed files with 272 additions and 915 deletions
-83
View File
@@ -14404,32 +14404,6 @@ const docTemplate = `{
}
}
},
"model.ManagedDomain": {
"type": "object",
"properties": {
"cert_id": {
"type": "integer"
},
"created_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"id": {
"type": "integer"
},
"remark": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"model.OpenFlareApplyLog": {
"type": "object",
"properties": {
@@ -17959,63 +17933,6 @@ const docTemplate = `{
}
}
},
"tls.ManagedDomainInput": {
"type": "object",
"properties": {
"cert_id": {
"type": "integer"
},
"domain": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"remark": {
"type": "string"
}
}
},
"tls.ManagedDomainMatchCandidate": {
"type": "object",
"properties": {
"certificate_id": {
"type": "integer"
},
"certificate_name": {
"type": "string"
},
"domain": {
"type": "string"
},
"managed_domain_id": {
"type": "integer"
},
"match_type": {
"type": "string"
}
}
},
"tls.ManagedDomainMatchResult": {
"type": "object",
"properties": {
"candidate": {
"$ref": "#/definitions/tls.ManagedDomainMatchCandidate"
},
"candidates": {
"type": "array",
"items": {
"$ref": "#/definitions/tls.ManagedDomainMatchCandidate"
}
},
"domain": {
"type": "string"
},
"matched": {
"type": "boolean"
}
}
},
"updater.Status": {
"type": "object",
"properties": {
+10 -10
View File
@@ -416,27 +416,27 @@ git commit -m "refactor(web): select route domains from zones"
- Modify: generated `docs/{docs.go,swagger.json,swagger.yaml}`
- Create: `docs/guide/zone-domain-migration.md`
- [ ] **Step 1: 为导入命令写可操作迁移指南**
- [x] **Step 1: 为导入命令写可操作迁移指南**
文档写明备份、执行 `wavelet migrate-zones`、读取导入报告、发布预览、比较 `server_name`/证书支持文件、发布激活和回滚步骤;不允许在报告有冲突时继续。
- [ ] **Step 2: 生成 Swagger 和更新未发布变更**
- [x] **Step 2: 生成 Swagger 和更新未发布变更**
Run: `make swagger`
在 `[Unreleased]` 记录 Zone 管理、反代路由域名正规化和移除 managed-domain API。
- [ ] **Step 3: 运行全量质量门禁**
- [x] **Step 3: 运行全量质量门禁**
Run: `go test ./... && make code-check`
Expected: PASS。
- [ ] **Step 4: 做快照等价性验收**
- [x] **Step 4: 做快照等价性验收**
在升级前导出活动版本,在导入后生成预览;逐个比较所有路由的明确 `server_name` 集合、证书路径、WAF RouteID 绑定与 Pages 部署引用。只允许旧快照的域名/证书冗余 JSON 消失,不允许数据面语义变化。
- [ ] **Step 5: Commit**
- [x] **Step 5: Commit**
```bash
git add docs
@@ -455,7 +455,7 @@ git commit -m "docs(zone): add migration and release verification guide"
- Delete: `internal/apps/openflare/tls/helpers.go` 中仅用于旧路由证书数组的函数
- Modify: legacy迁移相关测试、模型测试与 `docs/design/zone-design.md`
- [ ] **Step 1: 写空库与升级库清理失败测试**
- [x] **Step 1: 写空库与升级库清理失败测试**
```go
func TestLegacyRouteColumnsAreAbsentAfterCleanup(t *testing.T) {
@@ -463,21 +463,21 @@ func TestLegacyRouteColumnsAreAbsentAfterCleanup(t *testing.T) {
}
```
- [ ] **Step 2: 编写双方言清理 DDL**
- [x] **Step 2: 编写双方言清理 DDL**
PostgreSQL 删除旧唯一索引和 `domain`、`domains`、`cert_id`、`cert_ids`、`domain_cert_ids`,再删除 `of_managed_domains`;SQLite 使用重建 `of_proxy_routes` 表的迁移方式保留所有非旧字段与索引。Down 仅在开发数据库恢复旧结构,不回填历史数据。
- [ ] **Step 3: 删除旧读取代码与测试 fixture**
- [x] **Step 3: 删除旧读取代码与测试 fixture**
删除所有 `route.Domain`、`route.Domains`、`route.CertID`、`route.CertIDs`、`route.DomainCertIDs` 的持久化引用;让编译器、Uptime Kuma、Flared、来源摘要及 API 只使用 ZoneDomain 查询结果。
- [ ] **Step 4: 验证升级和完整回归**
- [x] **Step 4: 验证升级和完整回归**
Run: `go test ./internal/db/migrator ./internal/model ./internal/apps/openflare/... ./pkg/render/openresty -count=1 && make code-check`
Expected: PASS;全仓搜索不再发现旧 `ManagedDomain` 业务代码、`ProxyRoute` 持久化字段或管理端 API;渲染快照中的临时 `DomainCertIDs` 类型允许保留。
- [ ] **Step 5: Commit**
- [x] **Step 5: Commit**
```bash
git add internal/db/migrator internal/model internal/apps frontend docs
-83
View File
@@ -14397,32 +14397,6 @@
}
}
},
"model.ManagedDomain": {
"type": "object",
"properties": {
"cert_id": {
"type": "integer"
},
"created_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"id": {
"type": "integer"
},
"remark": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"model.OpenFlareApplyLog": {
"type": "object",
"properties": {
@@ -17952,63 +17926,6 @@
}
}
},
"tls.ManagedDomainInput": {
"type": "object",
"properties": {
"cert_id": {
"type": "integer"
},
"domain": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"remark": {
"type": "string"
}
}
},
"tls.ManagedDomainMatchCandidate": {
"type": "object",
"properties": {
"certificate_id": {
"type": "integer"
},
"certificate_name": {
"type": "string"
},
"domain": {
"type": "string"
},
"managed_domain_id": {
"type": "integer"
},
"match_type": {
"type": "string"
}
}
},
"tls.ManagedDomainMatchResult": {
"type": "object",
"properties": {
"candidate": {
"$ref": "#/definitions/tls.ManagedDomainMatchCandidate"
},
"candidates": {
"type": "array",
"items": {
"$ref": "#/definitions/tls.ManagedDomainMatchCandidate"
}
},
"domain": {
"type": "string"
},
"matched": {
"type": "boolean"
}
}
},
"updater.Status": {
"type": "object",
"properties": {
-54
View File
@@ -1104,23 +1104,6 @@ definitions:
id:
type: integer
type: object
model.ManagedDomain:
properties:
cert_id:
type: integer
created_at:
type: string
domain:
type: string
enabled:
type: boolean
id:
type: integer
remark:
type: string
updated_at:
type: string
type: object
model.OpenFlareApplyLog:
properties:
checksum:
@@ -3471,43 +3454,6 @@ definitions:
type:
type: string
type: object
tls.ManagedDomainInput:
properties:
cert_id:
type: integer
domain:
type: string
enabled:
type: boolean
remark:
type: string
type: object
tls.ManagedDomainMatchCandidate:
properties:
certificate_id:
type: integer
certificate_name:
type: string
domain:
type: string
managed_domain_id:
type: integer
match_type:
type: string
type: object
tls.ManagedDomainMatchResult:
properties:
candidate:
$ref: '#/definitions/tls.ManagedDomainMatchCandidate'
candidates:
items:
$ref: '#/definitions/tls.ManagedDomainMatchCandidate'
type: array
domain:
type: string
matched:
type: boolean
type: object
updater.Status:
properties:
asset_name: