基于 Next.js App Router + Drizzle + Postgres 的数据看板,用于自动拉取上游 CLIProxyAPI 使用数据,持久化到数据库,并进行数据可视化。
/api/sync拉取上游用量数据并去重入库(支持 GET/POST,有鉴权)/api/sync默认不预先更新auth_file_mappings;仅当本次同步检测到auth_index未命中时,才触发一次补救更新- 当
auth_index仍未命中时,查询会用usage.source(API Key)回退匹配提供商映射;无法匹配时显示“未知渠道” - 前端表单可配置模型单价,亦支持从 models.dev 自动拉取价格信息( #17 @ZIC143 )
- 前端图表:日粒度折线图、小时粒度柱状图、模型费用列表等,支持时间范围、模型、Key、凭证筛选
- 访问密码保护
-
Fork 本仓库,创建 Vercel 项目并关联
-
在 Vercel 环境变量中填写:
| 环境变量 | 说明 | 备注 | |---|---|---| | CLIPROXY_SECRET_KEY | 登录 CLIProxyAPI 后台管理界面的密钥 | 无 | | CLIPROXY_API_BASE_URL | 自部署的 CLIProxyAPI 根地址 | 如 `https://your-domain.com/` | | USAGE_API_BASE_URL | usage 数据源接口 | 可选;不填时沿用 `CLIPROXY_API_BASE_URL`,接 adapter 时可单独指向 | | CLIPROXY_SECRET_KEYS | 多项目密钥列表(逗号分隔) | 与 `CLIPROXY_API_BASE_URLS` 按顺序一一对应;配置后优先于单值变量 | | CLIPROXY_API_BASE_URLS | 多项目根地址列表(逗号分隔) | 与 `CLIPROXY_SECRET_KEYS` 按顺序一一对应;配置后优先于单值变量 | | DATABASE_URL | 数据库连接串(仅支持 Postgres) | 可直接使用 Neon | | DATABASE_DRIVER | `pg` 或 `neon` | 可选;默认自动检测 | | DATABASE_CA | DB 服务端 CA 证书 | 可选;PEM 原始内容或 Base64 编码均可 | | PASSWORD | 访问密码,同时用于调用 `/api/sync` | 可选;留空默认使用 `CLIPROXY_SECRET_KEY` | | CRON_SECRET | 使用 Vercel Cron 时需填写 | 任意字符串均可;建议长度 ≥ 16 |
多项目模式说明:
CLIPROXY_API_BASE_URLS与CLIPROXY_SECRET_KEYS使用逗号分隔并按顺序配对。- 项目 ID 由每个项目根地址哈希生成,地址顺序变更不会影响同一地址的项目 ID。
- 当前前端项目列表支持任意数量项目;显示规则为“主项目、项目 2、项目 3 ...”。
- 即使某些旧项目已从环境变量中移除,只要数据库里仍有这些项目的历史数据,前端项目列表仍会保留它们的入口用于查看历史统计。
- 不传
project查询参数时,各统计接口默认返回全部项目汇总。/api/management-url固定返回主项目地址(列表中的第一个项目)。
-
部署后,可通过以下方式自动同步上游使用数据:
- 默认启用 Vercel Cron( Pro 可设每小时,Hobby 每天同步一次,请见 [vercel.json](https://github.com/sxjeru/CLIProxyAPI-Monitor/blob/main/vercel.json) ) - Cloudflare Worker / 其他定时器定期请求同步:可见 [cf-worker-sync.js](https://github.com/sxjeru/CLIProxyAPI-Monitor/blob/main/cf-worker-sync.js)
![]() |
![]() |
| 环境变量 | 说明 | 默认值 | 备注 |
|---|---|---|---|
DATABASE_POOL_MAX |
连接池最大连接数 | 5 |
最小为 1 |
DATABASE_POOL_IDLE_TIMEOUT_MS |
空闲连接超时时间 (毫秒) | 10000 |
超过此时间未使用的连接将被释放 |
DATABASE_POOL_CONNECTION_TIMEOUT_MS |
获取连接超时时间 (毫秒) | 5000 |
等待连接空闲的最长时间 |
DATABASE_POOL_MAX_USES |
连接最大使用次数 | 7500 |
单个连接在关闭前可执行的最大查询数 |
AUTH_FILES_INSERT_CHUNK_SIZE |
auth_file_mappings 批量插入块大小 |
500 |
大数据量时避免单条 SQL 过长 |
USAGE_INSERT_CHUNK_SIZE |
usage_records 批量插入块大小 |
1000 |
大数据量时避免单条 SQL 过长 |
NEXT_PUBLIC_SYNC_TIMEOUT_MS |
数据同步超时时间 (毫秒) | 120000 |
前后端共享 |
- 安装依赖:
pnpm install - 修改环境变量:
cp .env.example .env - 创建表结构:
pnpm run db:push - 同步数据:GET/POST
/api/sync(可选) - 启动开发:
pnpm dev
由于 CPA 新版已移除 /usage 接口,可将 adapter.js 部署在 CPA 同端,实现从 CPA Redis 队列聚合 usage,还原接口功能,再自动提供给本项目的 /api/sync 拉取。
部署脚本时可以添加反代以正常使用看板的同步功能,同时保持对原管理接口的访问。
your.domain {
reverse_proxy /usage localhost:36871
reverse_proxy /v0/management/usage localhost:36871
reverse_proxy * localhost:8317
}
或者在看板配置 USAGE_API_BASE_URL=http://adapter-host:36871 , adapter-host 一般为 CPA 部署服务器 IP 。
curl -L -o adapter.js https://github.com/sxjeru/CLIProxyAPI-Monitor/raw/refs/heads/main/adapter.js
npm install ioredis
# node adapter.js
# 推荐使用 PM2
npm install -g pm2
pm2 start adapter.js --name cpa-adapter
| 环境变量 | 说明 | 默认值 |
|---|---|---|
CPA_REDIS_HOST |
CPA Redis 主机 | 127.0.0.1 |
CPA_REDIS_PORT |
CPA Redis 端口 | 8317 |
CPA_SECRET_KEY |
CPA Redis 访问密钥,即前述 CLIPROXY_SECRET_KEY |
空 |
CPA_REDIS_KEY |
usage 队列 key | queue |
ADAPTER_PORT |
adapter 监听端口 | 36871 |
POLL_INTERVAL |
从 Redis 拉取间隔(毫秒) | 15000 |
MAX_BUFFER_SIZE |
内存缓冲上限 | 50000 |
BATCH_SIZE |
每次拉取条数 | 500 |
CLEAR_BUFFER_ON_READ |
读取 /usage 后是否清空缓冲 |
false |
USAGE_AUTH_MAX_ATTEMPTS |
usage 鉴权最大连续失败次数 | 10 |
USAGE_AUTH_LOCKOUT_MS |
usage 鉴权失败后的锁定时长(毫秒) | 1800000 |
USAGE_AUTH_CLEANUP_MS |
失败记录清理窗口(毫秒) | 3600000 |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
ENABLE_PERIODIC_SYNC |
是否启用内置定时 sync | false |
DASHBOARD_URL |
Vercel 部署看板地址,如 https://your-domain.com |
空 |
SYNC_TOKEN |
远端看板 /api/sync 的 Bearer token,一般填前述 CRON_SECRET 或 PASSWORD |
空 |
SYNC_INTERVAL |
定时触发 /api/sync 的间隔(毫秒) |
600000 |
SYNC_TIMEOUT_MS |
单次 sync 超时(毫秒) | 300000 |
SYNC_ON_START |
启动后是否立即触发一次 sync | false |
adapter.js定时从 CPA Redis 队列拉取 usage 记录- 聚合后通过本地
/usage或/v0/management/usage暴露给外部 - 若开启
ENABLE_PERIODIC_SYNC=true,adapter 会定时请求远端看板/api/sync - 看板
/api/sync再回拉 adapter 的/usage,并写入数据库

