# 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`。