mirror of
https://github.com/oiov/vmail.git
synced 2026-06-05 21:03:00 +08:00
- Introduced `openApiEnabled` configuration in the app settings. - Implemented middleware to restrict access to API routes when OpenAPI is disabled. - Updated API key creation logic to check OpenAPI status before proceeding. - Added user feedback for disabled API access in the frontend. - Created tests for OpenAPI functionality and response handling. - Updated environment configuration to include `ENABLE_OPENAPI` variable.
4.7 KiB
4.7 KiB
1. 目标与部署产物
本文档用于让 AI 助手直接读取并执行部署Github项目:https://github.com/oiov/vmail 。目标是将 vmail 部署到 Cloudflare Workers + D1,并启用以下能力:
- 站点统计增长率(today vs yesterday)
- Turnstile 可选(未配置密钥时自动 bypass)
- 站点密码访问控制(
PASSWORD可选) - API Key 每分钟限速(环境变量可配置,默认
100)
部署后关键接口合同:
GET /config返回:turnstileEnabled、sitePasswordEnabled、apiRateLimitPerMinute、openApiEnabledGET /api/stats返回:totals、today、yesterdayPOST /auth/unlock、GET /auth/status、POST /auth/logout
2. 前置条件与账号准备
在开始前确认:
- 已安装 Node.js 18+ 与 pnpm
- 已安装 Wrangler CLI(
npx wrangler --version可运行) - 已登录 Cloudflare(
npx wrangler login) - 已在 Cloudflare 创建 D1 数据库并拿到:
D1_DATABASE_NAMED1_DATABASE_ID
- 准备好站点域名配置
EMAIL_DOMAIN(支持逗号分隔多域名)
推荐在仓库根目录执行全部命令。
3. 必填与可选环境变量
需要在部署环境中提供以下变量(与 wrangler.toml 对齐):
EMAIL_DOMAIN(必填)COOKIES_SECRET(必填,建议高强度随机字符串)TURNSTILE_KEY(可选)TURNSTILE_SECRET(可选)PASSWORD(可选;为空时站点默认公开)API_RATE_LIMIT_PER_MINUTE(可选;非法值或缺省回退到100)ENABLE_OPENAPI(可选;默认开启,设置为false时禁用 API Key 创建与/api/v1/*)
行为说明:
- 当
TURNSTILE_KEY和TURNSTILE_SECRET任一缺失时,前后端都进入“无需人机验证”模式。 - 当
PASSWORD为空时,前端不会出现站点解锁门禁;有值时需要先解锁站点。 API_RATE_LIMIT_PER_MINUTE作用于 v1 API Key 中间件,按“每个 API Key、每分钟固定窗口”限流。- 当
ENABLE_OPENAPI=false时,/api/api-keys与/api/v1/*会统一返回403 OPENAPI_DISABLED,/api-docs页面仅展示提示。
4. 数据库迁移与基础初始化
项目 D1 迁移目录为:worker/drizzle。
建议顺序:
- 确保
wrangler.toml的 D1 绑定配置正确。 - 执行迁移到远端 D1(根据你的 Cloudflare 环境选择对应命令)。
- 确认新增表存在:
daily_statsapi_rate_limits
api_rate_limits 采用复合主键:
api_key_idwindow_start_epoch_sec
该设计用于支持原子 UPSERT 计数,避免并发下限流计数漂移。
5. 构建与部署步骤
按以下顺序执行:
- 安装依赖:
pnpm install - 本地构建:
pnpm build - 部署 Worker(按你的环境执行 wrangler deploy)
- 如有自定义域名或路由,完成 Cloudflare 路由绑定
构建成功标准:
frontend构建完成worker打包无阻断错误- 允许存在体积告警(chunk size warning)但不应有构建失败
6. 部署后验收清单(可直接给 AI 执行)
最小验收用例:
- 配置合同:
- 请求
GET /config - 断言返回字段包含:
turnstileEnabledsitePasswordEnabledapiRateLimitPerMinuteopenApiEnabled
- 请求
- 统计合同:
- 请求
GET /api/stats - 断言返回结构含
totals/today/yesterday
- 请求
- 站点密码:
PASSWORD为空时:页面可直接访问PASSWORD有值时:- 未解锁访问页面受限
POST /auth/unlock成功后可访问GET /auth/status返回unlocked: true
- Turnstile 可选:
- 未配置密钥时,创建邮箱地址流程可直接通过
- 配置密钥后,需有效 token
- API 限速:
- 使用同一 API Key 连续请求 v1 API
- 超过阈值返回
429 - 响应头包含:
X-RateLimit-Limit、X-RateLimit-Remaining、Retry-After - 若
ENABLE_OPENAPI=false:/api/api-keys与/api/v1/*返回403
- 前端展示:
- 首页 SiteStats 卡片显示增长率(today vs yesterday)
/api-docs在openApiEnabled=false时展示禁用提示
7. 常见问题与回滚策略
常见问题:
- 迁移失败:优先检查 D1 绑定、数据库 ID、迁移目录是否正确。
- 站点一直锁定:检查
PASSWORD是否设置、浏览器是否保存了解锁 cookie。 - 限速不生效:确认请求走的是 v1 API,并携带 API Key。
- Turnstile 状态异常:确认前后端读取的是同一组环境变量。
回滚策略:
- 先回滚 Worker 版本(代码回滚)。
- 若需要回滚数据结构,按 D1 迁移策略执行逆向迁移或恢复备份。
- 回滚后重复执行“部署后验收清单”中的 1~3 项,确保服务可用。