# infra/domains — 域名池 + CDN 前置 + 签名端点分发

配置即代码 + 离线工具 + 契约文档，落实 doc/05（CDN 前置 / 源站隐藏 / 回源鉴权 / 四组域名 + 冷备 / 被封 Runbook）与 doc/06（Ed25519 签名 + 私钥离线 + 公钥内置 + 防回滚）。

> **本目录不含任何私钥 / token / 身份信息。** 私钥离线两地保存，token 由 rbw / CI Secret 注入，身份线索离线台账管理。

## 目录结构

| 路径 | 内容 |
|---|---|
| `domains.md` | 四组域名隔离登记 + 冷备池 + 启用流程（不含身份信息） |
| `cdn/terraform/` | Cloudflare 配置即代码：WAF + bot + 速率限制 + DNS + 回源鉴权；30min 重放 Runbook |
| `tools/endpoint-signer/` | 离线 Ed25519 签名 CLI：端点文档 + 公告文档 |
| `tools/publish-mirrors/` | 多镜像发布 + 一致性校验 + 故障转移取回 |
| `CLIENT-CONTRACT.md` | 客户端联动契约：schema / 验签 / 防回滚 / 合并 / 兜底链 / channel |
| `examples/` | 端点 / 公告 payload 与镜像配置示例 |
| 〔关联〕`../../server/internal/originauth/` | Go 回源鉴权中间件（非 CDN 网段或鉴权头不符一律 403） |

## 数据流

```
端点池 JSON ──(endpoint-signer, 离线)──> endpoints.v1.json (Ed25519 签名)
                                              │
                                  (publish-mirrors) 推 ≥3 镜像 + 校验 hash 一致
                                              │
                        CF Pages / GitHub<独立账号> / 对象存储
                                              │
        客户端按 mirror_urls 故障转移取回 ──> 验签 + 防回滚 + schema ──> 合并进端点池
                                              │
                              (CLIENT-CONTRACT.md 兜底链第 5 层)
```

## 回源鉴权与轮换（doc/05 §2 / doc/06 §6）

- CDN（`cdn/terraform/origin.tf`）在回源请求上注入 `X-Origin-Auth: <随机值>`。
- 源站 `server/internal/originauth` 中间件：**源 IP 不在 CDN 回源网段** 或 **鉴权头不符** → 403。
- **季度轮换（双值过渡）**：
  1. 源站先把新值加为 `Config.Previous`→`Config.Current` 之外的受信值（即同时接受新旧两值）。
  2. CDN 侧 `terraform apply` 把 `origin_auth_value` 切到新值。
  3. 传播完成后源站去掉旧值。
  期间新旧两值都通（验收要求）。

## 部署要求：出站请求走独立出口（写入部署文档）

源站的**出站请求不得暴露源站地址**（doc/05 §2 源站 IP 隐藏）。以下出站必须走**独立出口**（独立 NAT / 出口代理 / 独立弹性 IP），与源站入站 IP 分离：

- **支付 webhook 回调校验**（codes 模块回访发卡店 / 收款通道）。
- **广告回执校验**（`/v1/ads/unlock` 等向广告平台核验回执）。
- 任何源站主动发起的第三方 API 调用。

理由：对端日志或证书透明度 / DNS 历史一旦记录源站出站 IP，等于泄露源站。出口 IP 与入站源站 IP 解耦后，换源站（IaC 重建）不牵连出口，反之亦然。部署时在 04 章网络拓扑落实该独立出口。

## 校验

- Go 工具：`cd tools && go test ./...`
- 回源中间件：`cd ../../server && go test ./internal/originauth/`
- Terraform：`cd cdn/terraform && terraform fmt -check && terraform validate`（需真实账号才能 `apply`）
- 仓库扫描：无私钥、无 token、无身份信息（见各文件头部约束）。
