语言:简体中文 | 繁體中文 | English | 日本語
QuotaDeck 是一个自托管网页面板,用来查看 OpenAI Codex CLI TUI 中显示的两个额度:
5h limitWeekly limit
它通过运行 codex app-server --listen stdio:// 并调用 JSON-RPC 方法 account/rateLimits/read 读取同一份额度数据。
适合:
- 有多个 Codex / ChatGPT 登录账号,需要集中查看额度
- 想部署到自己的 VPS
- 想用 Docker 管理服务,避免污染宿主机环境
- 想让每个用户自己注册、自己上传自己的 Codex 登录文件
不适合:
- 查看 OpenAI API 账单或 API token 用量
- 查看 Claude Pro 额度
- 在不信任的服务器上保存 Codex 登录状态
QuotaDeck 会处理敏感的 Codex 登录文件,请先理解这些规则:
- 本站账号保存在本地数据目录里。
- 密码使用
scrypt哈希保存,不保存明文密码。 - 上传的 Codex
auth.json会被校验,然后使用APP_SECRET派生出的密钥通过 AES-256-GCM 加密保存。 - 刷新额度时,服务器才会把某个账号的凭据临时解密到
/tmp下的临时CODEX_HOME,调用 Codex CLI 后立即删除临时目录。 - 浏览器接口不会返回 access token、refresh token、id token。
- 每个导入账号都绑定 QuotaDeck 用户,用户只能看到自己的导入账号。
- 没有管理员角色,只有一种用户。
- 注册是否开放由
ALLOW_REGISTRATION控制。
重要限制:
- 只要你把
auth.json上传到服务器,就必须信任这台服务器及其管理员。 APP_SECRET必须长期保持不变。换掉它之后,旧的加密凭据无法解密。- 不再信任某台服务器时,请重新登录 Codex 或轮换 ChatGPT/Codex 登录状态,让旧凭据失效。
推荐使用 Docker。
cp .env.example .env编辑 .env:
DOMAIN=quota.example.com
APP_SECRET=replace-with-a-long-random-secret
ALLOW_REGISTRATION=1生成强 APP_SECRET 的例子:
openssl rand -base64 48启动:
docker compose up -d --build打开:
https://quota.example.com如果只是本地试用,也可以直接运行 Node:
APP_SECRET='dev-secret-change-me' \
ALLOW_REGISTRATION=1 \
npm start本地地址:
http://127.0.0.1:8787准备条件:
- 一台已安装 Docker 和 Docker Compose 的 VPS
- 一个已经 A 到 VPS IP 的域名
- VPS 的 80 和 443 端口开放
部署步骤:
git clone https://github.com/rmqg/quota-deck.git /srv/quota-deck
cd /srv/quota-deck
cp .env.example .env
nano .env
docker compose up -d --build.env 示例:
DOMAIN=quota.example.com
APP_SECRET=use-a-long-random-secret-here
ALLOW_REGISTRATION=1DOMAIN 必须是你的真实域名。Caddy 会使用这个域名自动申请 HTTPS 证书。
创建自己的账号后,建议关闭公开注册:
cd /srv/quota-deck
sed -i 's/^ALLOW_REGISTRATION=.*/ALLOW_REGISTRATION=0/' .env
docker compose up -d在已经登录 Codex CLI 的电脑上找:
${CODEX_HOME:-$HOME/.codex}/auth.json常见路径:
- Linux/macOS 默认路径:
~/.codex/auth.json - 如果你设置了
CODEX_HOME,就在$CODEX_HOME/auth.json
可以用命令确认:
ls -l "${CODEX_HOME:-$HOME/.codex}/auth.json"导入步骤:
- 打开 QuotaDeck。
- 注册或登录 QuotaDeck 本地账号。
- 在“账号名称”里填一个容易识别的名字,比如
OpenAI Business。 - 选择本机的
auth.json。 - 点击“导入”。
- 导入后点击刷新。
不要把 auth.json 发到公开聊天、Issue、论坛,或上传到不信任的服务器。
顶部按钮:
- “刷新”:刷新当前用户的所有账号。
- “退出”:退出 QuotaDeck 本地账号。
账号卡片按钮:
↻:只刷新这个账号。×:删除这个账号配置。删除前会二次确认,不会影响 Codex / ChatGPT 本身。
状态数字:
- “账号”:当前导入的账号数量。
- “正常”:最近一次刷新成功的账号数量。
- “更新”:最近一次刷新返回的时间。
额度条:
5 小时额度:Codex CLI TUI 里的5h limit。每周额度:Codex CLI TUI 里的Weekly limit。- 当额度显示为
100%剩余时,页面不显示 Codex 返回的滚动窗口重置时间;低于100%时会显示重置时间。 - 只有
5 小时额度会把 Codex 返回的小于等于1%已用按原生 TUI 的观感显示为100%剩余;每周额度按 Codex 返回值显示。
更新:
cd /srv/quota-deck
git pull
docker compose up -d --build备份:
cd /srv/quota-deck
tar -czf quota-deck-backup-$(date +%Y%m%d-%H%M%S).tar.gz .env data恢复:
cd /srv/quota-deck
tar -xzf quota-deck-backup-YYYYMMDD-HHMMSS.tar.gz
docker compose up -d注意:如果 .env 里的 APP_SECRET 丢了,即使还有 data/accounts.json,也无法解密旧的 Codex 凭据。
通常说明上传的 Codex 登录状态失效了。
处理办法:
- 在本机重新登录 Codex CLI。
- 重新上传新的
auth.json。 - 删除旧账号配置。
检查:
- 域名 A 记录是否指向 VPS IP
- VPS 的 80 和 443 端口是否开放
- 是否有宿主机 nginx/apache 占用了 80/443
.env里的DOMAIN是否写错
查看 Caddy 日志:
docker compose logs -f quota-deck-proxy这是预期行为。旧凭据是用旧 APP_SECRET 加密的。
处理办法:
- 恢复旧
APP_SECRET;或 - 删除旧账号,重新上传
auth.json。
建议不要缓存 /api/*。额度数据和登录状态都是动态内容,缓存 API 响应会导致页面显示旧数据。
语法检查:
node --check server.js
node --check public/app.js开发模式:
APP_SECRET='dev-secret-change-me' ALLOW_REGISTRATION=1 npm run devDocker 构建:
docker compose up -d --build本项目使用 GPL-3.0-or-later。完整许可证见 LICENSE。
QuotaDeck 是非官方项目,不代表 OpenAI 或 Anthropic。它依赖 Codex CLI 当前可用的本地登录状态和 RPC 行为;如果 Codex CLI 或 ChatGPT 后端接口变化,项目可能需要更新。