7.1 KiB
cf-temp-email
Cloudflare Temp Email 的自动化部署 CLI。它会编排 Cloudflare REST API、npm 和 wrangler,统一处理以下资源:
- Pages
- Worker
- D1
- Email Routing
- Catch-all 到 Worker
适用场景:
- 从零部署一套 Cloudflare Temp Email
- 用一个
config.toml管多个 Cloudflare 账号 - 从 Cloudflare 现有资源反推配置,再继续接管部署
快速开始
在 cftemail/ 目录下执行:
uv sync
uv run cf-temp-email init-config --config config.toml
uv run cf-temp-email check --config config.toml
uv run cf-temp-email deploy --config config.toml
省略子命令时默认执行 deploy,所以:
uv run cf-temp-email --config config.toml
等价于:
uv run cf-temp-email deploy --config config.toml
命令
可用命令:
init-configcheckdeployresumediscover-config
常用示例:
uv run cf-temp-email check --config config.toml --profile kotei
uv run cf-temp-email deploy --config config.toml --profile kotei
uv run cf-temp-email resume --config config.toml --profile kotei
discover-config
用于从 Cloudflare 现有资源反推配置,并写回 config.toml。
示例:
uv run cf-temp-email discover-config \
--config config.toml \
--profile kotei \
--api-token "$CF_API_TOKEN_KOTEI" \
--zone-name "kotei.us.ci"
当前能自动发现并写入的字段包括:
cloudflare.account_idcloudflare.account_namecloudflare.zone_namemail.domainsmail.verified_destination_addressd1.database_nameworker.script_namepages.project_namepages.custom_domain
说明:
- 只有 Cloudflare 能读到的字段才会写入
ADMIN_PASSWORDS、JWT_SECRET之类的值无法从 Cloudflare 反读- 如果候选资源不唯一,命令会跳过,不会乱猜
多账号配置
支持在一个 config.toml 里定义多个账号或环境,用 profiles.<name> 区分。
示例:
[profiles.account_a.cloudflare]
account_id = "acc-a"
api_token_env = "CF_API_TOKEN_A"
zone_name = "example.com"
[profiles.account_a.mail]
domains = ["mail.example.com", "mail2.example.com"]
[profiles.account_a.pages]
custom_domain = "email.example.com"
[profiles.account_b.cloudflare]
account_id = "acc-b"
api_token_env = "CF_API_TOKEN_B"
zone_name = "kotei.asia"
[profiles.account_b.mail]
domains = ["mail.kotei.asia", "maila.kotei.asia"]
[profiles.account_b.pages]
custom_domain = "email.kotei.asia"
执行时通过 --profile 选择:
uv run cf-temp-email deploy --config config.toml --profile account_a
uv run cf-temp-email deploy --config config.toml --profile account_b
行为说明:
- CLI 覆写会写入对应的
profiles.<name>.* - 每个 profile 使用独立状态文件:
.deploy/profiles/<profile>/state.toml - 默认 clone 模式下,每个 profile 也会使用独立工作目录
域名模型
这套工具把“邮箱域名”和“前端域名”分开管理。
1. 邮箱域名
来自 mail.domains,支持多个域名,也支持二级域名。
例如:
[mail]
domains = ["kotei.us.ci", "mail.kotei.us.ci"]
这表示系统会同时处理:
@kotei.us.ci@mail.kotei.us.ci
2. 前端域名
来自 pages.custom_domain,当前一次部署只管理一个前端域名。
例如:
[pages]
custom_domain = "temp-mail.kotei.us.ci"
3. 约束
mail.domains可以是多个pages.custom_domain当前是单个pages.custom_domain不能和mail.domains中的任意一个重复
原因是:
mail.domains需要承载 Email Routing 的MX/TXTpages.custom_domain需要承载 Pages 的CNAME
同一个主机名不能同时做这两件事。
配置要点
cloudflare
至少需要:
zone_nameapi_token或api_token_env
更推荐使用环境变量:
[cloudflare]
api_token_env = "CF_API_TOKEN_KOTEI"
zone_name = "kotei.us.ci"
mail.verified_destination_address
现在是可选项。
行为如下:
- 有值:部署时会校验该地址是否已在 Cloudflare 侧可用
- 空值:跳过目标地址校验,仍继续配置
MX/TXT和 Catch-all Worker
例如:
[mail]
verified_destination_address = ""
worker.vars.ADMIN_PASSWORDS
这是必填项。部署时会使用第一个值请求:
https://<worker.custom_domain>/admin/*
用于同步:
- 用户注册开关
- 登录配置
- 其他管理员接口设置
例如:
[worker.vars]
ADMIN_PASSWORDS = ["your-strong-password"]
worker.secrets.JWT_SECRET
可以留空。首次部署前如果为空,脚本会自动生成并写回配置文件。
linuxdo
如果不用 Linux.do,保持:
[linuxdo]
linuxdo_oauth = false
只有在 linuxdo_oauth = true 时,才需要填写:
client_idclient_secret
CLI 覆写
支持显式参数覆写:
uv run cf-temp-email deploy \
--config config.toml \
--profile kotei \
--api-token "$CF_API_TOKEN_KOTEI" \
--zone-name "kotei.us.ci" \
--pages-domain "temp-mail.kotei.us.ci" \
--worker-name "cloudflare_temp_email"
也支持通用 --set:
uv run cf-temp-email deploy \
--config config.toml \
--profile kotei \
--set worker.vars.ADMIN_PASSWORDS='["abc.123"]'
说明:
- CLI 覆写会先写回
config.toml - 然后脚本会重新读取配置并执行
部署阶段
部署顺序如下:
- 检查本地工具与 Cloudflare 授权
- 准备源码目录
- 创建或复用 Pages 项目
- 配置 Pages CNAME
- 创建或复用 D1,并执行迁移
- 生成
worker/wrangler.toml并发布 Worker - 同步管理员接口配置
- 配置 Email Routing DNS 与 Catch-all Worker
- 构建并发布 Pages
- 执行验收检查
运行状态会写入:
.deploy/state.toml
如果使用 profile,则写入:
.deploy/profiles/<profile>/state.toml
Cloudflare Token 权限
最小部署权限建议包括:
Cloudflare Pages: EditD1: EditWorkers Scripts: WriteDNS: WriteEmail Routing Rules: Edit
如果你要使用 discover-config,再补这些读取权限:
Zone: ReadDNS: ReadCloudflare Pages: ReadWorkers Scripts: ReadD1: ReadEmail Routing Addresses: ReadEmail Routing Rules: Read
资源范围建议只限定到目标账户和目标 Zone。
常见问题
1. 多个邮箱域名是否需要多个 Pages?
不需要。
通常一个 Pages 前端域名就够了,例如:
[mail]
domains = ["kotei.us.ci", "mail.kotei.us.ci"]
[pages]
custom_domain = "temp-mail.kotei.us.ci"
2. Catch-all 已经指向 Worker,为什么还会提到 destination address?
当前版本中,verified_destination_address 已经是可选项。留空时不会阻塞部署。
3. 旧的 cf_temp_email_deploy.py 还能用吗?
不能。当前统一入口是:
uv run cf-temp-email ...
建议流程
如果你是接管一个现有站点,推荐按这个顺序:
discover-config- 手动补
ADMIN_PASSWORDS - 检查
mail.domains、pages.custom_domain、worker.custom_domain - 运行
check - 再运行
deploy