diff --git a/docs/design/zone-design.md b/docs/design/zone-design.md index f5ad2f13..3d2cf144 100644 --- a/docs/design/zone-design.md +++ b/docs/design/zone-design.md @@ -47,7 +47,7 @@ erDiagram 保存 `zone_id`、明确 `domain`、可空的 `proxy_route_id`、可空的 `cert_id`、备注及时间戳。`domain` 全局唯一;所有关系字段建立索引但不建立物理外键。`proxy_route_id` 允许为空,以承接已准备证书但尚未配置反代的历史域名。 -`of_proxy_routes` 逐步移除 `domain`、`domains`、`cert_id`、`cert_ids` 与 `domain_cert_ids` 等冗余列。路由名称 `site_name` 成为稳定的人类可读标识,编译器从关联的 Zone 域名读取 server name 与证书。 +`of_proxy_routes` 逐步移除 `domain`、`domains`、`cert_id`、`cert_ids` 与 `domain_cert_ids` 等域名/证书冗余列。路由不得再指定任何 TLS 证书;路由名称 `site_name` 成为稳定的人类可读标识,编译器从关联的 Zone 域名读取 `server_name` 与其 `cert_id`。这使每个明确域名的证书只有一个来源。 ## 业务与 API @@ -61,7 +61,7 @@ erDiagram * `POST /api/v1/d/zones/:id/domains/:domainID/delete` * `GET /api/v1/d/zones/:id/overview` -反代路由的创建、更新请求改用 `zone_domain_ids`。服务端在事务中验证域名归属、全局唯一性和证书 SAN 覆盖;失败通过 `response.Abort*` 统一返回。删除已绑定路由的 Zone 域名必须先解除或删除该路由;删除仍有域名的 Zone 必须拒绝。 +反代路由的创建、更新请求改用 `zone_domain_ids`,不再提交 `domains`、`cert_id`、`cert_ids` 或 `domain_cert_ids`。服务端在事务中验证域名归属、全局唯一性和证书 SAN 覆盖;失败通过 `response.Abort*` 统一返回。删除已绑定路由的 Zone 域名必须先解除或删除该路由;删除仍有域名的 Zone 必须拒绝。 WAF、Pages、上游与发布版本仍属于 `proxy_routes`。Zone 概览只聚合展示其域名关联的路由状态,不复制或重新定义这些配置。 @@ -84,7 +84,7 @@ WAF、Pages、上游与发布版本仍属于 `proxy_routes`。Zone 概览只聚 本次改造分两个发布阶段,以免 SQL 用错误的“末两段域名”规则处理多级公共后缀。 1. 使用 PostgreSQL 与 SQLite 同版本 Goose DDL 创建新表、索引;保留旧表和路由冗余列。 -2. 通过可显式执行、可重复运行的 Go 数据迁移使用 `publicsuffix.EffectiveTLDPlusOne`:从既有路由域名及 `managed_domains` 创建 Zone 和 Zone 域名,按旧 `domain_cert_ids` 的位置迁移证书;旧记录仅在没有路由时生成未绑定 Zone 域名。迁移报告必须列出无法解析或存在冲突的记录并中止,不静默丢弃。 +2. 通过可显式执行、可重复运行的 Go 数据迁移使用 `publicsuffix.EffectiveTLDPlusOne`:从既有路由域名及 `managed_domains` 创建 Zone 和 Zone 域名,按旧 `domain_cert_ids` 的位置迁移证书到 `zone_domains.cert_id`;旧记录仅在没有路由时生成未绑定 Zone 域名。迁移报告必须列出无法解析或存在冲突的记录并中止,不静默丢弃。 3. 新代码切换到 Zone 模型、完成配置编译与 UI 验证后,再在独立 Goose 迁移中删除 `of_managed_domains` 和旧冗余列。 ## 验证 diff --git a/docs/superpowers/specs/2026-07-12-zone-domain-design.md b/docs/superpowers/specs/2026-07-12-zone-domain-design.md index d1b9cd00..7a339b68 100644 --- a/docs/superpowers/specs/2026-07-12-zone-domain-design.md +++ b/docs/superpowers/specs/2026-07-12-zone-domain-design.md @@ -4,7 +4,8 @@ * `/websites` 展示可注册根域 Zone;详情 URL 使用 `/websites/:zoneId`。 * `managed_domains` 将被彻底替换为 `of_zones` 与 `of_zone_domains`。 -* Zone 域名是 `of_proxy_routes` 域名的规范化来源;一个域名至多连接一条路由,一条路由可含多个 Zone 的域名。 +* Zone 域名是 `of_proxy_routes` 域名与证书的规范化来源;一个域名至多连接一条路由,一条路由可含多个 Zone 的域名。 +* `of_proxy_routes` 移除 `cert_id`、`cert_ids` 与 `domain_cert_ids`,不再指定证书;配置编译只从关联 Zone 域名的 `cert_id` 查询证书。 * Zone 域名只允许明确 FQDN;允许把含 `*.example.com` SAN 的 TLS 证书绑定到明确域名,但不允许通配符域名记录。 * 路由仍拥有上游、缓存、限流、WAF 与 Pages;Zone 只提供聚合管理和展示。 * 迁移先建新表、用 Public Suffix List 回填和验证,再在后续独立发布中移除旧表及冗余列。