cpu limit 我没辙了 本地部署吧
Cloudflare Workers + D1 的 API 网关与管理台一体化项目。
- 后端编排:
apps/worker(主 Worker,负责鉴权、路由、重试编排) - 后端执行:
apps/attempt-worker(调用执行器 Worker,负责单次上游调用) - 前端:
apps/ui(Vite 管理控制台) - 部署:Worker 静态资源模式,
apps/ui/dist与 Worker 一起发布
- 统一管理多上游 AI 渠道(OpenAI / Anthropic / Gemini 等)
- 基于 Token 的访问控制、配额与用量统计
- 提供 OpenAI 兼容代理入口(
/v1/*、/v1beta/*) - 提供管理台用于渠道、模型、令牌、日志和系统设置维护
- 支持按日定时探测禁用渠道(每个渠道随机选模型),测试通过后自动恢复
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
说明:
- 创建
CLOUDFLARE_API_TOKEN时,建议使用 Account Token,资源范围限制到目标账号(CLOUDFLARE_ACCOUNT_ID对应账号)。 - 建议最小权限(Edit):
Workers Scripts、D1。 - 可选权限:
Workers Routes(仅需要管理路由时)、Workers Tail(仅需要日志 tail 调试时)、Workers Observability(仅需要通过 Observability 能力查询/分析日志与追踪时)。
工作流:.github/workflows/deploy.yml(Deploy SPA CF Workers[Worker一体化部署])
触发方式:
push到main/master且命中apps/ui/**、apps/worker/**或apps/attempt-worker/**workflow_dispatch手动触发repository_dispatch(deploy-spa-button)
需要配置的 Secrets:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
可选变量:
SPA_DEPLOY:自动部署开关(true/false)
node scripts/deploy.mjs init
node scripts/deploy.mjs update等价脚本:
bun run deploy
bun run deploy:init
bun run deploy:update说明:
bun run deploy:交互式本地部署入口(引导选择 init/update 与参数)init:全量初始化流程(包含本地迁移)update:按参数执行构建与本地迁移判断- 该脚本用于本地复刻流程,不会执行远程
wrangler deploy
- Runtime: Cloudflare Workers
- API Framework: Hono
- Database: Cloudflare D1(SQLite)
- Stateful: Durable Objects
- WASM: Rust + wasm-bindgen(
apps/worker/wasm) - Frontend: Vite + TypeScript
- Monorepo: Bun workspaces
.
├─ apps/
│ ├─ worker/ # Worker API、路由、D1 迁移、wrangler 配置
│ │ ├─ src/
│ │ ├─ migrations/
│ │ ├─ wasm/
│ │ └─ wrangler.toml
│ ├─ attempt-worker/ # 调用执行器(单次上游调用)
│ └─ ui/ # 管理台(Vite)
├─ scripts/
│ ├─ dev.mjs # 本地并行启动 worker + attempt-worker + ui
│ └─ deploy.mjs # 本地部署流程脚本(构建 + 本地迁移)
├─ package.json
└─ README.md
- Bun
1.3.9(见根package.json的packageManager) - Node.js(运行
scripts/*.mjs) - Cloudflare Wrangler(通过
bunx wrangler调用)
bun install统一启动命令:
bun run dev
bun run dev -- [可选参数]说明:
bun run dev:交互式启动入口(开始/状态/停止 + 参数选择)bun run dev -- ...:命令行参数直连模式(适合脚本和自启动)
可选参数:
--no-attempt-worker:不启动调用执行器(attempt-worker)--no-ui:不启动 UI dev server--remote-d1:连接云端 D1/KV,但主 worker 与 attempt-worker 仍在本地执行--remote-worker:主 worker / attempt-worker 都切到远端预览执行(隐含--remote-d1)--no-hot-cache:仅禁用KV_HOT热缓存(不影响其他内存级缓存)--build-ui:启动前先构建 UI(bun run build:ui)--skip-ui-build:跳过 UI 预构建(用于覆盖--build-ui默认行为)--bg:后台启动--log-mode file|none:后台日志策略(默认file,写入.dev/dev-runner.log;none表示不写后台日志)--status:查看后台运行状态--stop:停止后台运行实例
常用示例:
- 默认启动(主 Worker + 本地 attempt-worker + UI):
bun run dev - 主 Worker + UI(不启调用执行器):
bun run dev -- --no-attempt-worker - 仅主 Worker:
bun run dev -- --no-attempt-worker --no-ui - 默认启动 + 云端 D1/KV:
bun run dev -- --remote-d1 - 仅主 Worker + 云端 D1/KV + 禁用热缓存:
bun run dev -- --no-attempt-worker --no-ui --remote-d1 --no-hot-cache - 后台启动(仅主 Worker + 云端 D1/KV + 禁用热缓存):
bun run dev -- --no-attempt-worker --no-ui --remote-d1 --no-hot-cache --bg - 后台启动且不写日志:
bun run dev -- --no-attempt-worker --no-ui --remote-d1 --bg --log-mode none - 远端预览执行:
bun run dev -- --remote-worker - 查看后台状态:
bun run dev -- --status - 停止后台实例:
bun run dev -- --stop
自启动脚本(Windows / Linux):
- 交互式配置:
bun run autostart - 开启自启动:
bun run autostart -- enable [dev 参数,空格分隔] - 关闭自启动:
bun run autostart -- disable - 查看状态:
bun run autostart -- status - 示例:
bun run autostart -- enable --no-attempt-worker --remote-d1 --no-ui --log-mode none - Windows:使用计划任务,不再写入 Startup
.cmd - Windows:为避免
bun.exe作为控制台程序拉起窗口,计划任务会先通过隐藏的 PowerShell 启动器再执行bun run dev -- --bg - Linux:使用
systemd --user,会生成~/.config/systemd/user/api-worker-dev-autostart.service - Linux:要求当前发行版启用了 user session 的 systemd;脚本会把仓库绝对路径写入
WorkingDirectory - Linux:默认属于 user service,通常在用户登录后启动;若需要开机后未登录也自动启动,请额外执行
sudo loginctl enable-linger $USER - Linux:service 会直接托管
scripts/dev.mjs的守护进程分支 bun run autostart -- status会同时显示“是否已启用”“当前是否正在运行”以及 Linux 旧版--bg配置提示- 登录后真正拉起 Worker / Wrangler / UI 的后台守护链路同样继续沿用
scripts/dev.mjs的日志与运行时配置策略
快捷命令(仅主 Worker + 禁用热缓存):
- 默认先构建 UI 后启动:
bun run dev:worker - 可选跳过 UI 构建:
bun run dev:worker -- --skip-ui-build - 同样支持叠加参数(例如云端 D1 + 后台):
bun run dev:worker -- --remote-d1 --bg
仅主 Worker时是否受 UI 影响:
- 如果
apps/ui/dist已存在(或之前构建过),Worker 的静态资源绑定可继续使用该构建产物 - 即使不启动 UI dev server,后端 API
/api/*、/v1*不受影响 - 若你需要实时改前端,仍建议单独启动 UI:
bun --filter api-worker-ui dev -- --port 4173
或分别启动:
bun --cwd apps/attempt-worker run dev
bun --cwd apps/worker run dev
bun --filter api-worker-ui dev -- --port 4173默认端口:
- Worker:
8787(wrangler dev 默认) - Attempt Worker:
8788 - UI:
4173
支持环境变量覆盖(bun run dev 生效):
DEV_WORKER_PORT:主 Worker 端口(默认8787)DEV_ATTEMPT_WORKER_PORT:调用执行器端口(默认8788)DEV_UI_PORT:UI 端口(默认4173)
bun run --filter api-worker db:migrate在项目根目录 .env 或当前 shell 环境中提供以下 Cloudflare 资源 ID:
CLOUDFLARE_D1_DATABASE_ID(D1 UUID)CLOUDFLARE_KV_HOT_ID(KV namespace id,32 位十六进制)
可先复制模板:
cp .env.example .env然后按顺序执行:
bun run prepare:remote-config
bun run db:migrate:remote
bun run dev -- --remote-d1
bun run autostart -- status说明:
prepare:remote-config会在本地生成apps/worker/.wrangler.remote.toml与apps/attempt-worker/.wrangler.remote.toml--remote-d1会使用本地执行 + remote bindings,不再默认切到wrangler dev --remote- 默认情况下主 worker 会优先走本地
attempt-worker(http://127.0.0.1:<DEV_ATTEMPT_WORKER_PORT>) - 只有显式传入
--remote-worker时,主 worker / attempt-worker 才会改走远端预览执行 --no-hot-cache会额外生成 no-hot 配置并移除KV_HOT绑定,仅影响热缓存路径- 通过根目录
bun run dev/bun run autostart触发的运行时配置会统一写入.dev/generated/wrangler/ - 直接执行
prepare:remote-config/prepare:no-hot-cache-config时,默认仍写入各应用目录;如需统一输出,可追加--output-root .dev/generated/wrangler - 这些临时文件已加入
.gitignore,不会入库 - 如需单独启动服务,可用
bun --cwd apps/worker run dev:remote与bun --cwd apps/attempt-worker run dev:remote - 想切回本地数据库时,继续使用
bun run dev+bun run --filter api-worker db:migrate
bun run test
bun run typecheck
bun run lint
bun run format
bun run check
bun run prepare:remote-config
bun run db:migrate:remote
bun run dev -- --remote-d1说明:
- 当前仓库保留 Playwright E2E 验证入口;本地 unit/service 测试文件已移除,因此
bun run test会在空测试集场景下正常通过。
- 统一执行规范:
AGENTS.md - Agent 本地环境变量文件:
.env.agent(本地创建,不入库) - Agent 环境变量参考模板:
.env.agent.example
约定:
- 任务完成后必须执行格式化与检测。
- 前端改动必须使用自动化工具回归关键交互。
- 后端改动必须通过直接请求验证接口行为。
关键配置位于 apps/worker/wrangler.toml:
- D1:
DB - KV(热点只读数据):
KV_HOT - Static Assets:
ASSETS(目录../ui/dist) - Durable Objects:
CHECKIN_SCHEDULER - Service Binding:
ATTEMPT_WORKER(绑定到attempt-worker) - CORS 默认值:
*(如需限制来源,可配置可选绑定CORS_ORIGIN)
注意:
- 仓库中的
database_id/KV namespace id使用占位值,避免提交个人账号资源 ID。 - GitHub Actions 部署流程会自动“检查/创建资源并回填真实 ID”后再部署,因此不影响他人一键初始化。
apps/ui/vite.config.ts 默认将以下路径代理到 VITE_API_TARGET(默认 http://localhost:8787):
/api/v1
apps/ui/src/core/constants.ts 支持 VITE_API_BASE,用于覆盖前端请求基址(默认同源)。
GET /health
-
认证
-
POST /api/auth/login -
POST /api/auth/logout -
渠道(兼容接口)
-
GET /api/channels -
POST /api/channels -
PATCH /api/channels/:id -
DELETE /api/channels/:id -
POST /api/channels/:id/test -
站点(管理台主用)
-
GET /api/sites -
POST /api/sites -
PATCH /api/sites/:id -
DELETE /api/sites/:id -
POST /api/sites/checkin-all -
POST /api/sites/:id/checkin -
模型
-
GET /api/models -
令牌
-
GET /api/tokens -
POST /api/tokens -
PATCH /api/tokens/:id -
GET /api/tokens/:id/reveal -
DELETE /api/tokens/:id -
用量与看板
-
GET /api/usage -
GET /api/dashboard -
系统设置
-
GET /api/settings -
PUT /api/settings -
POST /api/settings/cache/refresh
-
渠道
-
GET /api/channel -
GET /api/channel/search -
GET /api/channel/:id -
POST /api/channel -
PUT /api/channel -
DELETE /api/channel/:id -
GET /api/channel/test/:id -
POST /api/channel/test -
GET /api/channel/fetch_models/:id -
POST /api/channel/fetch_models -
GET /api/channel/models -
GET /api/channel/models_enabled -
PUT /api/channel/tag -
POST /api/channel/tag/enabled -
POST /api/channel/tag/disabled -
分组与用户
-
GET /api/group -
GET /api/user/models
ALL /v1/*ALL /v1beta/*
鉴权与细节请以 apps/worker/src/middleware/* 与对应 route 实现为准。
在提交前建议至少执行:
bun run typecheck
bun run check
bun run test补充:
- 当前
bun run test主要用于保证测试入口可执行;仓库仅保留 Playwright E2E 测试文件,不再保留本地 unit/service 测试文件。
若本地接口异常,优先检查:
- Worker 是否运行(
bun run dev或bun --cwd apps/worker run dev) - UI 代理目标是否正确(
VITE_API_TARGET) - D1 本地迁移是否完成(
db:migrate)
- 文档以代码为准;若行为变更,请同步更新本 README。
- API 全量定义请参考
apps/worker/src/routes。