# CDN 前置（Cloudflare）配置即代码

把一个域名在 30 分钟内接到 Cloudflare 之后：WAF + bot 管理 + 速率限制全开、DNS 代理回源、回源鉴权 header 注入。对应 doc/05 §2 与 §5「CDN 账号风险」Runbook。

## 资源清单

| 文件 | 资源 | 作用 |
|---|---|---|
| `versions.tf` | provider | 锁 `cloudflare ~> 4.40`；token 走 `CLOUDFLARE_API_TOKEN` 环境变量 |
| `settings.tf` | `cloudflare_zone_settings_override` | TLS1.3 / SSL strict / HSTS / 高安全级 |
| `dns.tf` | `cloudflare_record` | 代理（橙云）A 记录，隐藏源站 IP |
| `waf.tf` | `cloudflare_ruleset` ×2 + `cloudflare_bot_management` | Managed+OWASP WAF、`/v1/*` 速率限制、Bot 管理 |
| `origin.tf` | `cloudflare_ruleset`（late_transform） | 回源注入 `X-Origin-Auth` |
| `outputs.tf` | — | 代理后的主机名清单 |

## 绝不入库的东西

- **API token**：`export CLOUDFLARE_API_TOKEN=...`（本机由 rbw 取；CI 由 Secret 注入）。
- **回源鉴权值**：`export TF_VAR_origin_auth_value=...`。
- `terraform.tfvars`、`*.tfstate`、`.terraform/`：均 gitignore。

## 30 分钟重放流程（CDN 账号风险应急）

> 目标：旧 CDN 账号被封 / 要求实名时，在新账号 + 新（或同）域名上 30 分钟内重建全部防护并切流量。

```bash
# 0. 准备（离线已存）：新账号 API token、zone_id、account_id、origin_ip、回源鉴权值
export CLOUDFLARE_API_TOKEN=...           # 新账号 token（rbw get）
export TF_VAR_origin_auth_value=...       # 当前回源鉴权值

cd infra/domains/cdn/terraform
cp terraform.tfvars.example terraform.tfvars   # 填 zone_id/account_id/origin_ip/api_hostnames

# 1. 初始化 + 计划 + 应用（首次约 3–8 分钟）
terraform init
terraform plan -out tf.plan
terraform apply tf.plan

# 2. 在新账号把域名 NS 指过去（注册商处改 NS），等待生效
#    用多镜像签名端点更新把新 API 域名/镜像下发给客户端（见 ../../tools）

# 3. 验证回源鉴权（应 200）与直连源站（应 403，见 server/internal/originauth）
```

把每次重放的**实测耗时**记到本目录 `REPLAY-LOG.md`（验收要求 ≤30min）。

## 注意

- `cloudflare_bot_management` 需要账号套餐支持（Pro+/Bot Management），免费账号把 `enable_bot_management=false`，改用面板 Bot Fight Mode。
- WAF managed ruleset 的 `id` 为 Cloudflare 公开稳定 ID（Managed / OWASP）。
- 本目录无法在本仓库 CI 内 `apply`（需真实账号）；提交前至少 `terraform fmt -check && terraform validate`。
