feat: v2.0.0 邮件接收架构改造 —— 移除 Node,Email Worker 直连 Console(docs/11)

- 两阶段接收:POST /internal/email/authorize(accept/reject/temporary_error)+ POST /internal/email/ingest(raw MIME 直传)
- Worker-Console 协议:Authorization: WmailHub-Worker + timestamp/nonce/body-hash/HMAC,nonce 防重放,凭据撤销即时生效
- 数据模型:nodes/node_credentials -> cloudflare_accounts/worker_credentials(迁移 0003),emails/domains 归属 account_id
- 接入流程 Connect Cloudflare Account:OAuth 自动同步域名 + 部署账号级 Email Worker + 签发 Worker 凭据;rotate 自动重部署
- 动态邮箱:创建/删除/禁用下一封邮件立即生效;拒绝码 DOMAIN_*/MAILBOX_*;超时/5xx 不伪装成邮箱不存在
- 删除 node/ 目录、旧 /api/internal/nodes 协议、ingress/enrollment 概念;dev.ts 简化为 console + email worker 双进程
- 前端:账号页 Email Worker/凭据管理,设置窗口移除默认 Ingress,仪表盘/文案同步;版本 2.0.0
- 测试 62 项全过(新增 authorize 决策矩阵 + Worker 两阶段临时错误语义);本机虚拟 E2E 12 场景全通
- docs 00-10 同步改写;README 更新
This commit is contained in:
bigcode
2026-09-30 13:10:26 +08:00
parent 421cfb2f04
commit fec96e49cc
56 changed files with 2584 additions and 1416 deletions
+40 -16
View File
@@ -1,34 +1,44 @@
# 数据模型
# 数据模型(v2,docs/11 §13)
核心实体:CloudflareAccount、Node、Domain、Mailbox、Email、EmailAttachment、Webhook、WebhookDelivery、OAuthConnection。
核心实体:CloudflareAccount、Domain、Mailbox、Email、EmailAttachment、Webhook(三级配置)、WebhookDelivery、OAuthConnection、WorkerCredential。
## nodes
Node 作为邮件链路核心模型已删除(旧 nodes / node_credentials 表由迁移 0003 移除,
账号实体更名为 cloudflare_accounts,凭据更换为 worker_credentials)。
## cloudflare_accounts
```text
id, name, cloudflare_account_id, credential_id, status, version, last_seen_at, created_at, updated_at
id, name, cloudflare_account_id, worker_id, status, provision_steps, created_at, updated_at
```
status:pending_oauth | provisioning | active | error | revoked。
worker_id 同时是 Email Worker 脚本名与 Worker -> Console 的身份 ID。
## domains
```text
id, cloudflare_account_id, node_id, name, status, worker_id, created_at, updated_at
id, cloudflare_account_id, account_id, name, status, worker_id, zone_id,
webhook_url, webhook_headers, webhook_key_enc, setup_error, created_at, updated_at
```
status:pending(未配置 Email Workers)| active | error。
## mailboxes
```text
id, domain_id, address, status, retention_seconds, created_at, updated_at
id, domain_id, address, status, retention_seconds, is_catch_all,
webhook_url, webhook_headers, webhook_key_enc, created_at, updated_at
```
## emails
```text
id, node_id, mailbox_id nullable, message_id, from_address, to_addresses,
id, account_id, mailbox_id nullable, message_id, from_address, to_addresses,
cc_addresses, subject, text_body, html_body, raw_storage_key, size,
received_at, expires_at, created_at
```
Node 可以不知道 mailbox_id。Console 收到邮件后,根据邮件内容和自身配置关联。
Console 收到邮件后根据收件人/内容与自身配置关联 mailbox。
## email_attachments
@@ -36,17 +46,17 @@ Node 可以不知道 mailbox_id。Console 收到邮件后,根据邮件内容
id, email_id, filename, content_type, size, storage_key, content_id
```
## webhooks
## Webhook(三级:邮箱 -> 域名 -> 全局)
域名/邮箱行内配置(webhook_url / webhook_headers / webhook_key_enc),
全局配置存 settings.global_webhook;独立 webhooks 实体已移除。
```text
id, name, endpoint, secret, enabled, created_at, updated_at
webhook_deliveries: id, email_id, target_type(mailbox|domain|global),
url, headers, key_enc, status, attempt_count, next_retry_at, last_error, delivered_at, created_at
```
## webhook_deliveries
```text
id, webhook_id, email_id, status, attempt_count, next_retry_at, last_error, delivered_at, created_at
```
投递行在入队时冻结解析出的配置,重试不受后续配置变更影响。
## oauth_connections
@@ -54,4 +64,18 @@ id, webhook_id, email_id, status, attempt_count, next_retry_at, last_error, deli
id, provider, account_id, encrypted_access_token, refresh_token, expires_at, created_at, updated_at
```
OAuth token 必须加密存储。所有 Email 必须有 expires_at,默认 retention 为 86400 秒。
OAuth token 必须加密存储。所有 Email 必须有 expires_at,默认 retention 为 86400 秒。
## worker_credentials
```text
id, cloudflare_account_id, worker_id, secret_hash, secret_enc, secret_last4,
status(active | revoked), created_at, revoked_at
```
用于 Email Worker 与 Console 内部认证:secret_hash 为摘要,secret_enc 为 AES-GCM 密文
(HMAC 验签需要原文,加密存储防拖库泄露);明文 secret 仅在签发/轮换时返回一次。
## 其它
users、settings、api_credentials(wmh_ Key)、nonces、oauth_states、cf_sim_resources(本地 sim)。