优先入口不是手改配置, 而是:
uv run python main.py init
uv run python main.py doctor --fix
uv run python main.py --mode lite
# 或
uv run python main.py --mode full
.env.example 是完整模板. 本文只整理主线变量.
关键变量:
ZHUCE6_REGISTER_MAIL_PROVIDER=cfmailZHUCE6_REGISTER_PROXYZHUCE6_CFMAIL_API_TOKENZHUCE6_CFMAIL_CF_ACCOUNT_IDZHUCE6_CFMAIL_CF_ZONE_IDZHUCE6_CFMAIL_WORKER_NAMEZHUCE6_CFMAIL_ZONE_NAME关键变量:
ZHUCE6_BACKEND=cpaZHUCE6_CPA_MANAGEMENT_BASE_URLZHUCE6_CPA_MANAGEMENT_KEY关键变量:
ZHUCE6_BACKEND=sub2apiZHUCE6_SUB2API_BASE_URLZHUCE6_SUB2API_API_KEYZHUCE6_SUB2API_ADMIN_EMAIL + ZHUCE6_SUB2API_ADMIN_PASSWORD| 变量 | 作用 | 常见值 |
|---|---|---|
ZHUCE6_HOST |
Dashboard 监听地址 | 127.0.0.1 |
ZHUCE6_PORT |
Dashboard 监听端口 | 8000 |
ZHUCE6_DASHBOARD_ALLOWED_ORIGINS |
允许跨域读取 runtime/summary 的 Origin 列表 | 逗号分隔 URL |
ZHUCE6_CONFIG_DIR |
配置目录 | <project>/config |
ZHUCE6_STATE_DIR |
状态目录 | <project>/state |
ZHUCE6_LOG_DIR |
日志目录 | <project>/logs |
ZHUCE6_POOL_DIR |
本地账号池目录 | <project>/pool |
ZHUCE6_CFMAIL_CONFIG_PATH |
cfmail accounts JSON | <config>/cfmail_accounts.json |
ZHUCE6_CFMAIL_ENV_FILE |
cfmail provision env | <config>/cfmail_provision.env |
| 变量 | 作用 | 说明 |
|---|---|---|
ZHUCE6_BACKEND |
full 模式后端 | cpa 或 sub2api |
ZHUCE6_CLEANUP_ENABLED |
cleanup 开关 | true / false |
ZHUCE6_VALIDATE_ENABLED |
validate 开关 | true / false |
ZHUCE6_ROTATE_ENABLED |
rotate 开关 | true / false |
ZHUCE6_VALIDATE_SCOPE |
validate 范围 | all 或 used |
ZHUCE6_ROTATE_INTERVAL |
rotate 周期秒数 | 按需调整 |
ZHUCE6_ROTATE_PROBE_WORKERS |
rotate 并发 | 正整数 |
ZHUCE6_ROTATE_FRESH_GRACE_SECONDS |
fresh 账号在该窗口内跳过 rotate quota probe | 默认 600 |
ZHUCE6_RESPONSES_SURVIVAL_RECENT_WINDOW_SECONDS |
responses survival 只优先 reseed 该窗口内的 recent 账号 | 默认 1800 |
ZHUCE6_RESPONSES_SURVIVAL_REQUIRE_PROVENANCE |
responses survival 是否优先要求注册 provenance | 默认 true |
ZHUCE6_WARMUP_MIN_AGE_SECONDS |
add_phone 风险号转 warmup passed 的最小存活秒数 | 默认 600 |
ZHUCE6_WARMUP_MIN_SUCCESSFUL_PROBES |
add_phone 风险号转 warmup passed 的最小成功探测数 | 默认 2 |
pool/*.json 是持久化备份, 不是候选池.cpa_sync_status 只保留为排障字段, 不再代表单独的业务阶段.validate, rotate, cleanup 删除账号时会双删 backend + pool.rotate 只删除 401 invalidated, 429 usage_limit_reached 保留.cpa_runtime_reconcile 负责在 backend 与 pool 漂移时做双向补齐.| 变量 | 作用 |
|---|---|
ZHUCE6_CPA_MANAGEMENT_BASE_URL |
CPA Management API 基础地址 |
ZHUCE6_CPA_MANAGEMENT_KEY |
CPA Management API Key |
ZHUCE6_CPA_RUNTIME_RECONCILE_ENABLED |
是否启用 backend 与 pool 双向 reconcile |
ZHUCE6_CPA_RUNTIME_RECONCILE_COOLDOWN_SECONDS |
drift 观测 cooldown |
ZHUCE6_CPA_RUNTIME_RECONCILE_RESTART_ENABLED |
兼容保留字段, API-only 模式下不会本地重启 |
| 变量 | 作用 |
|---|---|
ZHUCE6_SUB2API_BASE_URL |
sub2api Admin API 地址 |
ZHUCE6_SUB2API_API_KEY |
API Key 认证 |
ZHUCE6_SUB2API_ADMIN_EMAIL |
管理员邮箱认证 |
ZHUCE6_SUB2API_ADMIN_PASSWORD |
管理员密码认证 |
对于新配置, init 向导支持两条 cfmail 初始化路径:
Cloudflare API Token + zone_nameCF_AUTH_EMAIL + CF_AUTH_KEY + zone_name + worker_domain向导会尽量自动生成:
account_idzone_idZHUCE6_D1_DATABASE_IDconfig/cfmail_accounts.jsonconfig/cfmail_provision.env如果没有 API Token, 向导不会假设可以替你完成首次 Worker 部署, 而是要求显式填写一个已经可用的 worker_domain.
如果复用的 email_domain 已经失效, 向导会在保存阶段尝试自动轮换到新的可用子域名.
| 变量 | 作用 |
|---|---|
ZHUCE6_CFMAIL_API_TOKEN |
Cloudflare API Token. 从零部署 cfmail Worker 时必需, wrangler 非交互部署也依赖它 |
ZHUCE6_CFMAIL_CF_AUTH_EMAIL |
Cloudflare 认证邮箱 |
ZHUCE6_CFMAIL_CF_AUTH_KEY |
Cloudflare Global API Key |
ZHUCE6_CFMAIL_CF_ACCOUNT_ID |
Cloudflare Account ID |
ZHUCE6_CFMAIL_CF_ZONE_ID |
Cloudflare Zone ID |
ZHUCE6_CFMAIL_WORKER_NAME |
Worker 名称 |
ZHUCE6_CFMAIL_ZONE_NAME |
Zone 名称 |
补充:
scripts/setup_cfmail.py 的完整 Worker 部署链依赖 wrangler.wrangler 要求 Cloudflare API Token.CF_AUTH_EMAIL + CF_AUTH_KEY 时, 正确用法是复用一个已部署的 worker_domain, 而不是期待脚本自动完成首次 Worker 部署.| 变量 | 作用 |
|---|---|
ZHUCE6_CFMAIL_MAIL_LIST_LIMIT |
inbox 拉取列表上限 |
ZHUCE6_CFMAIL_ROTATION_WINDOW |
域名轮换观测窗口 |
ZHUCE6_CFMAIL_ROTATION_BLACKLIST_THRESHOLD |
域名黑名单阈值 |
ZHUCE6_CFMAIL_REGISTRATION_DISALLOWED_THRESHOLD |
registration_disallowed 快速换域阈值 |
ZHUCE6_CFMAIL_ROTATION_COOLDOWN_SECONDS |
域名轮换冷却 |
ZHUCE6_CFMAIL_ADD_PHONE_THRESHOLD |
add-phone gate 阈值 |
ZHUCE6_CFMAIL_WAIT_OTP_THRESHOLD |
wait-otp 阈值 |
CfmailProvisioner.rotate_active_domain() 自动切换到新的 .example.com 子域名.CfMailMailbox 与 register loop 共享同一套 CfmailAccountManager cooldown 视图, 因此 mailbox 侧 cooldown 与 rotation 检测必须保持同一配置文件.ZHUCE6_D1_DATABASE_ID 不再有 repo 内默认 UUID. 新环境必须由 init 自动写入或手工配置; 若为空, d1_cleanup 会直接跳过.| 变量 | 作用 | 常见值 | 约束 |
|---|---|---|---|
ZHUCE6_REGISTER_THREADS |
注册并发线程数 | 12 |
不得大于代理池大小, 否则多余线程永远拿不到代理 |
ZHUCE6_REGISTER_TARGET_COUNT |
注册目标数 | 0 (无限) |
达到后自动停止 |
ZHUCE6_REGISTER_SLEEP_MIN |
注册间隔下限 (秒) | 3 |
- |
ZHUCE6_REGISTER_SLEEP_MAX |
注册间隔上限 (秒) | 10 |
- |
ZHUCE6_REGISTER_MAX_CONSECUTIVE_FAILURES |
连续失败上限 | 3 |
超过后线程暂停 |
| 变量 | 作用 | 默认语义 |
|---|---|---|
ZHUCE6_ADD_PHONE_OAUTH_MAX_ATTEMPTS |
add_phone 后 fresh login fallback 的最大尝试次数 | 2, 范围 1..3 |
ZHUCE6_ADD_PHONE_OAUTH_OTP_TIMEOUT_SECONDS |
add_phone fallback 登录链里的 OTP 等待上限 | 默认 90, 范围 30..180 |
ZHUCE6_POST_CREATE_LOGIN_DELAY_SECONDS |
create_account 后进入 fresh login fallback 前的等待秒数 |
默认 8, 范围 0..600 |
ZHUCE6_PENDING_TOKEN_RETRY_DELAY_SECONDS |
add_phone deferred retry 的基础延迟 | 当前实现会把首轮基础延迟钳到 60s, 避免把 token 恢复推到 5 分钟观测窗口之外 |
运行时要点:
create_account 已直接返回 https://chatgpt.com/api/auth/callback/openai?..., 主流程会先走 callback/openai -> /api/auth/session 直取 token, 跳过 workspace flow 与 fresh login.create_account 命中 add_phone 不等于账号一定废掉.| 变量 | 作用 | 常见值 |
|---|---|---|
ZHUCE6_REGISTER_PROXY |
注册链主代理 | 单个 URL, 启用代理池时留空 |
ZHUCE6_REGISTER_FRESH_PROXY_REGIONS |
fresh 注册优先代理地区 | tw,jp,hk,us |
ZHUCE6_ENABLE_PROXY_POOL |
是否启用代理池 | 1 / 0 |
ZHUCE6_PROXY_POOL_SIZE |
代理池节点数 | 12 |
ZHUCE6_PROXY_POOL_DIRECT_URLS |
直接代理列表 | 分号分隔 |
ZHUCE6_PROXY_POOL_CONFIG |
Clash YAML 路径 | 文件路径 |
ZHUCE6_PROXY_POOL_REGIONS |
优先地区 | tw,jp,hk,us |
重要:
ZHUCE6_REGISTER_THREADS必须 <=ZHUCE6_PROXY_POOL_SIZE. 代理池每个节点同一时间只服务一个线程, 多余线程会因no proxy available in pool持续失败.
补充:
ZHUCE6_REGISTER_FRESH_PROXY_REGIONS 用于 fresh 注册的区域收敛. 当前建议先固定为 tw,jp,hk,us, 不再使用 sg.responses_survival 会优先尝试复用 registration_proxy_key, 命不中时再按 registration_proxy_region 选代理.warmup_requiredwarmup_statewarmup_passed| 变量 | 作用 | 常见值 |
|---|---|---|
ZHUCE6_CFMAIL_ROTATION_WINDOW |
域名轮换观测窗口 | - |
ZHUCE6_CFMAIL_ROTATION_BLACKLIST_THRESHOLD |
域名黑名单阈值 | - |
ZHUCE6_CFMAIL_REGISTRATION_DISALLOWED_THRESHOLD |
registration_disallowed 快速换域阈值 |
2 |
ZHUCE6_CFMAIL_ROTATION_COOLDOWN_SECONDS |
域名轮换冷却 | - |
ZHUCE6_CFMAIL_MAILBOX_REUSED_THRESHOLD |
user_already_exists 域级 stoploss 阈值 |
2 |
ZHUCE6_CFMAIL_ACTIVE_DOMAIN_COUNT |
目标活动域数量 | 3 |
ZHUCE6_CFMAIL_START_INTERVAL_SECONDS |
单域启动节流 | 8 |
ZHUCE6_CFMAIL_MAX_INFLIGHT |
单域最大并发 inflight | 4 |
ZHUCE6_CFMAIL_FRESH_DOMAIN_ATTEMPT_BUDGET |
新域完成尝试预算 | 2 |
ZHUCE6_CFMAIL_ADD_PHONE_WINDOW |
add_phone 域级观测窗口 | 10 |
ZHUCE6_CFMAIL_ADD_PHONE_THRESHOLD |
add_phone 域级 stoploss 阈值 | 3 |
ZHUCE6_CFMAIL_WAIT_OTP_WINDOW |
wait_otp 域级观测窗口 | 6 |
ZHUCE6_CFMAIL_WAIT_OTP_THRESHOLD |
wait_otp 域级 stoploss 阈值 | 2 |
运行时要点:
mailbox_reused, add_phone_gate, wait_otp 都按域计数, 命中阈值后仅摘除该域, 后台异步补位.cleanup_stale_domains 只会清理已退役的 auto*.zone 历史域名, 不会把整个活动域池压回单域.注意: stale cleanup 是 best-effort. 如果 Cloudflare 返回 DNS read-only / code
1043, 实现会跳过该旧记录, 不应因为旧资源删除失败而回滚已经完成的新域名切换.
CfmailProvisioner.rotate_active_domain() 的成功判定以新域名主链为准:
因此排障时, 应优先关注 success / new_domain 与 config/cfmail_accounts.json 中的 active 域名是否变化, 而不是把 cleanup 告警误判为 rotation 失败.
doctor --fix 会自动处理 Python 依赖与 worker npm 依赖.git, node, npx 仍需你自行安装.sslocal.npx wrangler.README.md.env.exampledocs/TROUBLESHOOTING.mdAGENTS.md