概述
桌面端云回退受WORLDMONITOR_API_KEY 门控。没有有效密钥时,桌面应用以仅本地模式(sidecar)运行。注册表单通过 Convex DB 收集邮箱,用于未来的密钥分发。
架构
必需的环境变量
Vercel
| 变量 | 描述 | 示例 |
|---|---|---|
WORLDMONITOR_VALID_KEYS | 逗号分隔的有效 API 密钥列表 | wm_abc123def456,wm_xyz789 |
CONVEX_URL | Convex 部署 URL(来自 npx convex deploy) | https://xyz-123.convex.cloud |
生成 API 密钥
密钥必须至少 16 个字符(客户端验证)。推荐格式:WORLDMONITOR_VALID_KEYS(逗号分隔,无空格)。
Convex 设置
首次部署
验证 Convex 部署
Schema
registrations 表存储:
| 字段 | 类型 | 描述 |
|---|---|---|
email | string | 原始邮箱(用于显示) |
normalizedEmail | string | 小写邮箱(用于去重) |
registeredAt | number | Unix 时间戳 |
source | string? | 注册来源 |
appVersion | string? | 桌面应用版本 |
normalizedEmail 建立索引以检测重复。
安全模型
客户端(桌面应用)
installRuntimeFetchPatch()在允许云回退之前检查WORLDMONITOR_API_KEY- 密钥必须存在且有效(最少 16 个字符)
secretsReadypromise 确保在首次 fetch 之前加载密钥(2 秒超时)- 故障关闭:密钥检查中的任何错误都会阻止云回退
服务端(Vercel edge)
api/_api-key.js在 sebuf 路由上验证X-WorldMonitor-Key头- 源感知:桌面端来源(
tauri.localhost、tauri://、asset://)需要密钥 - Web 来源(
worldmonitor.app)无需密钥即可通过 - 非桌面端来源带密钥头:密钥仍会验证
- 无效密钥返回
401 { error: "Invalid API key" }
CORS
X-WorldMonitor-Key 在 server/cors.ts 和 api/_cors.js 中均被允许。
本地 Vercel 环境导出
请勿将 Vercel 环境导出保留在仓库根目录。.env.vercel-backup
和 .env.vercel-export 被 Git 忽略,但它们仍然是明文
生产密钥导出,本地工具、编辑器代理、备份软件或
依赖安装脚本都可能读取它们。
当任一文件存在时 pre-push 钩子会失败。仅在需要时拉取环境值,
从短期本地环境文件中操作,并在使用后删除该文件。密钥轮换
和从开发机器中删除属于运维任务;通过所属供应商仪表盘轮换
暴露的密钥,优先处理 LLM、支付、认证、Redis 和 Convex
凭据。
验证清单
部署后:- 在 Vercel 中设置
WORLDMONITOR_VALID_KEYS - 在 Vercel 中设置
CONVEX_URL - 运行
npx convex deploy推送 schema - 无密钥的桌面端:云回退被阻止(控制台显示
cloud fallback blocked) - 带无效密钥的桌面端:sebuf 请求返回
401 - 带有效密钥的桌面端:云回退正常工作
- Web 访问:无需密钥,正常工作
- 注册表单:提交邮箱,检查 Convex 仪表盘
- 重复邮箱:显示 “already registered”
- 现有设置标签页(LLM、API Keys、Debug)保持不变
文件参考
| 文件 | 角色 |
|---|---|
src/services/runtime.ts | 客户端密钥门控 + 头附加 |
src/services/runtime-config.ts | WORLDMONITOR_API_KEY 类型、验证、secretsReady |
api/_api-key.js | 服务端密钥验证(源感知) |
api/[domain]/v1/[rpc].ts | Sebuf 网关 — 调用 validateApiKey |
api/register-interest.js | 注册端点 → Convex |
server/cors.ts / api/_cors.js | 带 X-WorldMonitor-Key 的 CORS 头 |
src/components/WorldMonitorTab.ts | 密钥 + 注册的设置 UI |
convex/schema.ts | Convex DB schema |
convex/registerInterest.ts | Convex mutation |
