diff --git a/CODEX_OVERDRAFT_DEPLOYMENT_CN.md b/CODEX_OVERDRAFT_DEPLOYMENT_CN.md new file mode 100644 index 000000000..1417c3e16 --- /dev/null +++ b/CODEX_OVERDRAFT_DEPLOYMENT_CN.md @@ -0,0 +1,511 @@ +# sub2api-overdraft 部署与运维指南 + +本文档面向希望部署本项目、验证 Codex 5h / 7d 额度透支状态,以及后续安全升级的使用者。 + +本项目是 [Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api) 的非官方衍生版本,公开项目名为 **sub2api-overdraft**。内部二进制名、Docker 服务名、数据目录和 Go module 仍保留 `sub2api`,这是为了兼容原项目并降低同步上游更新时的冲突。 + +## 重要说明 + +- 本功能仅表示:当 Codex 5h 或 7d 页面额度达到 100% 后,通过真实请求确认上游是否仍允许继续调用。 +- `passed` 只代表探测时上游仍返回有效响应,不承诺之后始终可用,也不会绕过认证失效、账号禁用、网络故障或其他风控限制。 +- 探测请求和透支期请求都可能产生真实上游用量和费用。 +- 此行为可能不符合上游服务条款。部署者必须自行确认合规性,并承担账号限制、服务中断等风险。 +- 官方 Sub2API 安装脚本和 `weishaw/sub2api:latest` 镜像不包含本 Fork 的透支功能。 + +## 功能范围 + +开启 `gateway.codex_quota_overdraft_enabled` 后,本项目会: + +- 对符合条件的 OpenAI OAuth 普通账号和 Agent Identity 账号启用透支调度,Shadow 子账号除外。 +- 支持 `/v1/responses`、转换为 Responses 的 `/v1/chat/completions` 和 `/v1/messages`,以及 Responses WebSocket v2。 +- 在适用请求的最后一条用户消息后注入一对无操作工具调用,用于保持与参考实现一致的请求形态。 +- 当 5h 或 7d 额度首次达到 100%,或收到带明确额度证据的 429 时,最多执行 5 次真实探测。 +- 分别维护 5h、7d 透支周期,并在管理页面显示状态、请求数、Token、账号金额和预计恢复时间。 +- 将探测状态保存在现有 `accounts.extra` JSONB 字段中,不新增数据库表,不需要手动执行数据库迁移(migration)。 + +以下端点不启用透支:`/responses/compact`、图片生成、Embedding、Count Tokens 和 Live。 + +## 前置条件 + +- Linux amd64 或 arm64 服务器 +- Git +- Docker 20.10 或更高版本 +- Docker Compose v2,命令为 `docker compose` +- 建议至少 2 核 CPU、4 GB 内存和 20 GB 可用磁盘 +- 可以访问 GitHub、Docker Hub、Go module 和 npm/pnpm 依赖源 + +首次源码构建时间取决于服务器性能和网络状况。PostgreSQL 与 Redis 已包含在 Compose 中,不需要提前单独安装。 + +## 全新部署 + +### 1. 克隆项目 + +```bash +sudo mkdir -p /opt +cd /opt +sudo git clone https://github.com/DeanZFC/sub2api-overdraft.git +sudo chown -R "$(id -u):$(id -g)" /opt/sub2api-overdraft +cd /opt/sub2api-overdraft/deploy +``` + +仓库默认分支是 `codex-overdraft`。确认当前分支: + +```bash +git branch --show-current +``` + +预期输出: + +```text +codex-overdraft +``` + +### 2. 创建环境配置 + +```bash +cp .env.example .env +chmod 600 .env +``` + +至少设置以下值,不要把真实密钥提交到 Git: + +```bash +POSTGRES_PASSWORD=替换为随机密码 +JWT_SECRET=替换为随机密钥 +TOTP_ENCRYPTION_KEY=替换为随机密钥 +ADMIN_EMAIL=你的管理员邮箱 +ADMIN_PASSWORD=替换为强密码 +SERVER_PORT=8080 +``` + +可分别使用以下命令生成随机值: + +```bash +openssl rand -hex 32 +``` + +透支开关在公开部署覆盖文件中默认开启。也可以在 `.env` 中显式配置: + +```bash +GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED=true +``` + +### 3. 创建数据目录 + +```bash +mkdir -p data postgres_data redis_data +``` + +这些目录和 `.env` 已被 Git 忽略,不会在正常的 `git add .` 中上传。 + +### 4. 从源码构建并启动 + +后续所有 Compose 命令都应同时带上这两个文件: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build +``` + +`docker-compose.local.yml` 提供应用、PostgreSQL、Redis、网络和数据卷;`docker-compose.overdraft.yml` 把应用镜像切换为本仓库源码构建,并默认开启透支功能。 + +查看容器状态: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + ps +``` + +三个容器应处于 `Up` 或 `healthy` 状态: + +```text +sub2api +sub2api-postgres +sub2api-redis +``` + +查看启动日志: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + logs -f sub2api +``` + +默认访问地址为 `http://服务器IP:8080`。 + +## 配置文件位置与优先级 + +源码仓库中的 `deploy/config.example.yaml` 只是完整配置模板,不是容器实际读取的运行配置。 + +Compose 本地目录部署的实际配置通常位于: + +```text +/opt/sub2api-overdraft/deploy/data/config.yaml +``` + +它在容器内对应: + +```text +/app/data/config.yaml +``` + +如果手动通过 YAML 开启,请确保层级正确: + +```yaml +gateway: + codex_quota_overdraft_enabled: true +``` + +环境变量 `GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED` 的优先级高于 YAML。本项目提供的 Compose 覆盖文件默认将它设为 `true`,因此全新部署不需要手动编辑 `data/config.yaml`。 + +检查容器实际收到的环境变量: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + exec sub2api sh -lc 'printf "%s\n" "$GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED"' +``` + +预期输出为 `true`。 + +## 从现有 Sub2API 部署迁移 + +迁移前先备份 `.env`、运行配置和数据库。不要删除 `data`、`postgres_data`、`redis_data`。 + +如果服务器上的 `/opt/sub2api` 已经是 Git 仓库,并且包含手工修改,先检查: + +```bash +cd /opt/sub2api +git status --short +git branch --show-current +git remote -v +``` + +有未提交代码时先保存: + +```bash +git stash push -u -m "server changes before codex-overdraft switch" +``` + +然后连接本 Fork 并切换到公开分支: + +```bash +git remote set-url origin https://github.com/DeanZFC/sub2api-overdraft.git +git fetch origin +git switch codex-overdraft 2>/dev/null || \ + git switch -c codex-overdraft --track origin/codex-overdraft +git pull --ff-only origin codex-overdraft +``` + +如果 Git 报 `detected dubious ownership`,确认目录确实是本项目后再执行: + +```bash +git config --global --add safe.directory /opt/sub2api +``` + +已有的服务器专用 Compose 文件可以保留,但推荐改用仓库内公开的覆盖文件: + +```bash +cd /opt/sub2api/deploy +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build --force-recreate sub2api +``` + +切换分支后不要直接执行 `git stash pop`。先用 `git stash show --stat` 检查旧 stash;本分支已经包含透支代码,直接恢复旧代码可能造成重复修改和冲突。 + +## 判断功能是否生效 + +### 第一层:确认运行的是源码构建镜像 + +```bash +docker inspect sub2api --format '{{.Config.Image}}' +``` + +预期输出: + +```text +sub2api-overdraft:local +``` + +如果输出 `weishaw/sub2api:latest`,说明当前仍在运行官方镜像,本功能不会生效。 + +### 第二层:确认开关已开启 + +```bash +docker exec sub2api sh -lc 'printf "%s\n" "$GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED"' +``` + +预期输出 `true`。修改 `.env` 后必须重建或重新创建应用容器: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --force-recreate sub2api +``` + +### 第三层:查看真实探测日志 + +只有账号 5h/7d 额度达到 100%,或者收到带明确额度信息的上游 429,才会启动探测。额度未耗尽时没有相关日志是正常现象。 + +```bash +docker logs --since 30m sub2api 2>&1 | \ + grep -E 'codex_quota_overdraft_(probe|state|pause)' +``` + +关键日志: + +| 日志 | 含义 | +| --- | --- | +| `codex_quota_overdraft_probe_passed` | 至少一次真实探测成功,透支成立,账号继续参与调度 | +| `codex_quota_overdraft_probe_failed` | 5 次都明确返回额度限制,账号暂停至额度恢复时间 | +| `codex_quota_overdraft_probe_inconclusive` | 网络、超时、5xx 等导致无法确认,约 1 分钟后可重试 | +| `codex_quota_overdraft_probe_claim_failed` | 无法在 PostgreSQL 中原子领取探测任务,需要排查数据库或版本 | +| `codex_quota_overdraft_state_persist_failed` | 状态无法写入 `accounts.extra`,页面可能不显示最新结果 | + +真正“透支成功”的最直接证据是: + +```text +codex_quota_overdraft_probe_passed +``` + +其中会包含 `account_id`、`attempts`、`model` 和 `quota_window`。 + +### 第四层:查看数据库持久化状态 + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + exec -T postgres sh -lc \ + 'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -x -c " + SELECT id, name, extra->'\''codex_quota_overdraft_probe'\'' AS overdraft_probe + FROM accounts + WHERE platform = '\''openai'\'' AND type = '\''oauth'\'' + ORDER BY id; + "' +``` + +重点看 JSON 中的 `status`: + +| 状态 | 页面显示 | 含义 | +| --- | --- | --- | +| `pending` | 透支探测中 | 最多 5 次真实探测正在执行 | +| `passed` | 透支中 | 上游仍可调用,账号继续调度并开始统计透支用量 | +| `failed` | 已确认限额 | 5 次均明确受额度限制,暂停到恢复时间 | +| `inconclusive` | 探测无法确认 | 暂时无法判断,查看 `reason_code` 和 `retry_at` | +| `recovered` | 额度已恢复 | 原额度周期结束,相关暂停已清理 | + +页面显示 `透支中`,数据库为 `passed`,并且后续业务请求返回成功,三者同时满足即可确认功能完整生效。 + +## 探测逻辑 + +每个额度周期最多探测 5 次,每次最长 20 秒。模型按以下顺序循环: + +```text +首选模型 -> gpt-5.5 -> gpt-5.4-mini -> 首选模型 -> gpt-5.5 +``` + +- 任意一次返回有效 `response.completed` 或 `response.output_item.done`,立即记为 `passed`。 +- 只有 5 次都明确返回 `quota_limited`,才记为 `failed`。 +- 网络错误、超时、5xx、普通瞬时 429、无效响应等记为 `inconclusive`,不会因此误停账号。 +- 401/403 继续由原有认证失效逻辑处理。 +- 账号禁用、过载、代理故障、模型冷却等非额度限制不会被本功能绕过。 + +多实例部署通过 PostgreSQL 原子领取(atomic claim)保证同一账号、同一额度周期只有一个实例发起探测。 + +## 反向代理 + +Nginx 需要把请求转发到宿主机的 `8080` 端口。使用 Codex CLI 时,建议在 Nginx `http` 块启用: + +```nginx +underscores_in_headers on; +``` + +流式响应位置至少应包含: + +```nginx +proxy_http_version 1.1; +proxy_buffering off; +proxy_cache off; +proxy_read_timeout 3600s; +proxy_send_timeout 3600s; +``` + +出现 `duplicate upstream "sub2api_backend"` 时,表示多个 Nginx 配置文件定义了同名 `upstream`。使用以下命令找出重复项,然后只保留一个定义: + +```bash +grep -Rns 'upstream sub2api_backend' /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/sites-enabled +``` + +修改后先验证再重载: + +```bash +sudo nginx -t +sudo systemctl reload nginx +``` + +## 日常升级本 Fork + +运行数据均位于被 Git 忽略的目录中,正常 `git pull` 不会覆盖: + +```text +deploy/.env +deploy/data/ +deploy/postgres_data/ +deploy/redis_data/ +``` + +升级步骤: + +```bash +cd /opt/sub2api-overdraft +git status --short +git switch codex-overdraft +git pull --ff-only origin codex-overdraft + +cd deploy +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build +``` + +如果服务器目录是 `/opt/sub2api`,只需替换第一条路径。升级完成后重新执行“判断功能是否生效”中的镜像、环境变量和日志检查。 + +## 合并 Sub2API 官方更新 + +本仓库保留两个分支角色: + +- `main`:尽量跟随官方 `Wei-Shaw/sub2api`,作为上游基线。 +- `codex-overdraft`:本项目默认分支,包含透支功能和公开文档。 + +维护者可这样合并官方更新: + +```bash +git remote get-url upstream >/dev/null 2>&1 || \ + git remote add upstream https://github.com/Wei-Shaw/sub2api.git +git fetch upstream +git switch codex-overdraft +git merge upstream/main +``` + +解决冲突后执行项目测试,提交并推送: + +```bash +cd backend +go test -tags=unit ./internal/repository ./internal/handler ./internal/service \ + -run 'CodexQuotaOverdraft|AccountSchedulingThreshold|SchedulerSnapshot|SchedulableAccountQueryScopesCodex' \ + -count=1 +go test ./internal/repository ./internal/handler ./internal/service ./cmd/server \ + -run '^$' -count=1 + +cd ../frontend +pnpm install --frozen-lockfile +pnpm run typecheck +pnpm exec vitest run \ + src/components/account/__tests__/UsageProgressBar.spec.ts \ + src/components/account/__tests__/AccountUsageCell.spec.ts + +cd .. +git diff --check +git push origin codex-overdraft +``` + +更详细的实现文件和升级核对清单见 [CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md](CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md)。 + +## 关闭与回滚 + +如遇上游兼容问题,在 `deploy/.env` 设置: + +```bash +GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED=false +``` + +然后重新创建应用容器: + +```bash +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --force-recreate sub2api +``` + +关闭后会恢复官方调度与请求行为。数据库中已有的历史探测 JSON 可以保留,不影响关闭状态。 + +## 备份 + +数据库建议使用 `pg_dump` 做一致性备份: + +```bash +cd /opt/sub2api-overdraft/deploy +mkdir -p backups +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + exec -T postgres sh -lc \ + 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' \ + > "backups/sub2api-$(date +%Y%m%d-%H%M%S).dump" +``` + +另外单独备份 `deploy/.env` 和 `deploy/data/config.yaml`。不要把备份、数据库目录、API Key 或 OAuth 凭证上传到公开仓库。 + +## 常见故障 + +### 没有任何透支日志 + +先确认镜像和开关。若账号 5h/7d 尚未达到 100%,没有探测日志属于正常情况。使用管理页面的主动刷新获取最新额度后,再发送一次符合范围的文本请求。 + +### 页面仍显示“限流中” + +本功能只绕过 5h/7d 额度阈值产生的预暂停。以下情况仍会正常限流或暂停:账号禁用、401/403、5 次探测均确认额度耗尽、代理/网络错误、模型级冷却、并发限制或其他上游 429。先按 `account_id` 检查应用日志和数据库中的 `reason_code`。 + +### `pq: could not determine data type of parameter $1` + +这是旧版原子领取(atomic claim)SQL 的 PostgreSQL 参数类型问题。当前代码已使用: + +```sql +jsonb_build_object($1::text, $2::jsonb) +``` + +拉取最新 `codex-overdraft` 分支并使用 `--build --force-recreate` 重建应用容器。 + +### API 返回 503 `no available accounts` + +这表示账号调度阶段没有可用账号,不是 Nginx 连接故障。检查账号是否属于 API Key 对应分组、是否启用、是否认证有效、是否被其他原因暂停,以及探测状态是否为 `failed`。 + +### 容器无法绑定 8080 + +查找占用者: + +```bash +sudo ss -ltnp 'sport = :8080' +``` + +如果是旧的 systemd 版 `sub2api`,先确认后停止并禁用: + +```bash +sudo systemctl disable --now sub2api +``` + +也可以在 `.env` 将 `SERVER_PORT` 改为其他未占用端口。 + +### PostgreSQL 或 Redis 主机名无法解析 + +应用、PostgreSQL 和 Redis 必须加入同一个 Compose 网络。始终使用两个 Compose 文件一起启动完整服务,不要只用 `docker run` 单独启动应用容器。 + +## 开源与归属 + +- 上游项目:[Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api) +- 透支逻辑参考:[Mxucc/cpa-account-config-manager](https://github.com/Mxucc/cpa-account-config-manager) +- 本项目遵循仓库中的 [GNU LGPL-3.0](LICENSE) 许可证。 +- 本项目不是 Sub2API 官方发行版,也不受 OpenAI 或其他上游服务商认可或支持。 diff --git a/CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md b/CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md index 3821cead8..5a2efaef7 100644 --- a/CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md +++ b/CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md @@ -1,4 +1,7 @@ -# Codex 5h / 7d 额度透支定制记录 +# sub2api-overdraft 5h / 7d 额度透支定制记录 + +本文件是维护者实现与升级记录。面向部署者的完整安装、验证、升级和故障排查说明见 +[CODEX_OVERDRAFT_DEPLOYMENT_CN.md](CODEX_OVERDRAFT_DEPLOYMENT_CN.md)。 ## 基本信息 @@ -52,7 +55,7 @@ gateway: 状态值包括 `pending`、`passed`、`failed`、`inconclusive`、`recovered`。账号用量页面显示探测状态、尝试次数、额度周期、透支期成功请求数、Token、账号金额及预计恢复时间。 -不需要新增数据库表或执行 schema migration;周期状态保存在现有 `accounts.extra` JSONB 字段,透支统计读取现有 `usage_logs`。 +不需要新增数据库表或执行数据库结构迁移(schema migration);周期状态保存在现有 `accounts.extra` JSONB 字段,透支统计读取现有 `usage_logs`。 `/responses/compact`、生图请求、Embedding、Count Tokens、Live 等端点不启用额度透支。 diff --git a/Dockerfile b/Dockerfile index b2dfd7034..9f50fe85a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -108,9 +108,10 @@ FROM ${POSTGRES_IMAGE} AS pg-client FROM ${ALPINE_IMAGE} # Labels -LABEL maintainer="Wei-Shaw " -LABEL description="Sub2API - AI API Gateway Platform" -LABEL org.opencontainers.image.source="https://github.com/Wei-Shaw/sub2api" +LABEL maintainer="DeanZFC " +LABEL description="sub2api-overdraft - Sub2API fork with Codex quota overdraft support" +LABEL org.opencontainers.image.source="https://github.com/DeanZFC/sub2api-overdraft" +LABEL org.opencontainers.image.licenses="LGPL-3.0-or-later" # Install runtime dependencies RUN apk add --no-cache \ diff --git a/README.md b/README.md index f4ad2fa6b..4e0f4be6e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@
-Sub2API Logo +sub2api-overdraft Logo -# Sub2API +# sub2api-overdraft [![Go](https://img.shields.io/badge/Go-1.26.5-00ADD8.svg)](https://golang.org/) [![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/) @@ -10,14 +10,43 @@ [![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/) -Wei-Shaw%2Fsub2api | Trendshift - -**AI API Gateway Platform for Subscription Quota Distribution** +**AI API gateway with Codex 5h / 7d quota overdraft probing, tracking, and recovery** English | [中文](README_CN.md) | [日本語](README_JA.md)
+> [!IMPORTANT] +> This is an unofficial fork of [Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api), not an official Sub2API release. The upstream install script and `weishaw/sub2api:latest` image do not contain the overdraft feature. Build this fork from source as documented below. + +## Fork Features + +- Runs up to five real probes after the reported Codex 5h or 7d quota reaches 100%. +- Keeps an account schedulable after a successful probe and tracks overdraft requests, tokens, cost, and recovery for both windows independently. +- Exposes `pending`, `passed`, `failed`, `inconclusive`, and `recovered` states in the admin UI and PostgreSQL. +- Uses an atomic PostgreSQL claim for multi-instance deployments and requires no schema migration. +- Supports an immediate configuration rollback to the upstream scheduling behavior. + +See the **[Chinese deployment and operations guide](CODEX_OVERDRAFT_DEPLOYMENT_CN.md)** for source builds, migration, verification, upgrades, rollback, Nginx, and troubleshooting. Maintainers should also read [CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md](CODEX_QUOTA_OVERDRAFT_CUSTOMIZATION.md). + +Quick start: + +```bash +git clone https://github.com/DeanZFC/sub2api-overdraft.git +cd sub2api-overdraft/deploy +cp .env.example .env +# Set POSTGRES_PASSWORD, JWT_SECRET, and TOTP_ENCRYPTION_KEY in .env +mkdir -p data postgres_data redis_data +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build +``` + +This fork remains licensed under [GNU LGPL-3.0](LICENSE) and preserves upstream attribution. The overdraft behavior may conflict with upstream provider terms and may incur real usage or account restrictions. Operators are responsible for compliance and risk. + +The remaining feature, deployment, sponsor, and license text is inherited from the upstream Sub2API documentation. Upstream sponsorship does not imply sponsorship or endorsement of this fork. + ## ⚠️ Important Notice Please read the following carefully before using this project: diff --git a/README_CN.md b/README_CN.md index 2d2a57a9f..ad52e4472 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,8 +1,8 @@
-Sub2API Logo +sub2api-overdraft Logo -# Sub2API +# sub2api-overdraft [![Go](https://img.shields.io/badge/Go-1.26.5-00ADD8.svg)](https://golang.org/) [![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/) @@ -10,14 +10,73 @@ [![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/) -Wei-Shaw%2Fsub2api | Trendshift - -**AI API 网关平台 - 订阅配额分发管理** +**带 Codex 5h / 7d 额度透支探测、统计与恢复的 AI API 网关** [English](README.md) | 中文 | [日本語](README_JA.md)
+> [!IMPORTANT] +> 这是基于 [Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api) 的非官方 Fork,不是 Sub2API 官方发行版。官方安装脚本和 `weishaw/sub2api:latest` 镜像不包含本项目的透支功能,请按本仓库的源码构建文档部署。 + +## 本 Fork 增加的功能 + +- Codex 5h / 7d 额度达到 100% 后,最多执行 5 次真实请求探测,判断账号是否仍可继续调用。 +- 探测成功后继续参与账号调度,并分别统计 5h / 7d 透支期请求数、Token 和金额。 +- 管理页面显示“透支探测中”“透支中”“已确认限额”“探测无法确认”和“额度已恢复”。 +- 网络、超时、5xx 和普通瞬时 429 不会被误判为额度耗尽;401/403、账号禁用和其他风控仍使用原有策略。 +- 多实例通过 PostgreSQL 原子领取(atomic claim)去重;状态保存在现有 `accounts.extra`,无需新增数据表。 +- 可通过一个配置开关立即关闭,恢复上游 Sub2API 的调度和请求行为。 + +## 快速部署 + +完整步骤、现有服务器迁移、Nginx、验证、升级和故障排查请阅读: + +**[sub2api-overdraft 部署与运维指南](CODEX_OVERDRAFT_DEPLOYMENT_CN.md)** + +最短部署流程: + +```bash +git clone https://github.com/DeanZFC/sub2api-overdraft.git +cd sub2api-overdraft/deploy +cp .env.example .env +chmod 600 .env +# 编辑 .env,至少设置 POSTGRES_PASSWORD、JWT_SECRET 和 TOTP_ENCRYPTION_KEY +mkdir -p data postgres_data redis_data +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build +``` + +源码中的 `deploy/config.example.yaml` 只是模板。运行配置通常位于 `deploy/data/config.yaml`。透支开关为: + +```yaml +gateway: + codex_quota_overdraft_enabled: true +``` + +公开的 `docker-compose.overdraft.yml` 已通过环境变量默认开启该功能。 + +## 如何确认透支成功 + +账号额度达到 100% 后检查日志: + +```bash +docker logs --since 30m sub2api 2>&1 | \ + grep -E 'codex_quota_overdraft_(probe|state|pause)' +``` + +出现 `codex_quota_overdraft_probe_passed`,页面显示“透支中”,并且后续真实业务请求成功,即可确认透支功能完整生效。额度未达到 100% 时没有探测日志是正常现象。 + +## 来源、许可证与风险 + +- 上游项目:[Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api) +- 透支逻辑参考:[Mxucc/cpa-account-config-manager](https://github.com/Mxucc/cpa-account-config-manager) +- 许可证:[GNU LGPL-3.0](LICENSE),保留上游版权和许可证声明。 +- 本功能不保证上游一定允许超额调用,探测和后续请求可能产生真实用量,也可能触发账号限制。请自行核对上游服务条款并承担使用风险。 + +下面的功能、部署和赞助信息继承自上游 Sub2API 文档。上游赞助关系不代表这些组织赞助或认可本 Fork;需要透支功能时,请以上方本 Fork 部署指南为准。 ## ⚠️ 重要提醒 diff --git a/README_JA.md b/README_JA.md index 09aa77ee4..03c1c30a5 100644 --- a/README_JA.md +++ b/README_JA.md @@ -1,8 +1,8 @@
-Sub2API Logo +sub2api-overdraft Logo -# Sub2API +# sub2api-overdraft [![Go](https://img.shields.io/badge/Go-1.26.5-00ADD8.svg)](https://golang.org/) [![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/) @@ -10,14 +10,38 @@ [![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/) -Wei-Shaw%2Fsub2api | Trendshift - -**サブスクリプションクォータ配分のための AI API ゲートウェイプラットフォーム** +**Codex 5h / 7d クォータのオーバードラフト検証・集計・回復機能を追加した AI API ゲートウェイ** [English](README.md) | [中文](README_CN.md) | 日本語
+> [!IMPORTANT] +> これは [Wei-Shaw/sub2api](https://github.com/Wei-Shaw/sub2api) の非公式 Fork であり、Sub2API の公式リリースではありません。公式インストールスクリプトと `weishaw/sub2api:latest` イメージには、本 Fork のオーバードラフト機能は含まれていません。 + +## Fork の追加機能 + +- Codex の 5h または 7d クォータが 100% に達した後、最大 5 回の実リクエストで利用可否を検証します。 +- 検証成功後もアカウントをスケジュール対象に保ち、リクエスト数、Token、コスト、回復時刻を表示します。 +- `pending`、`passed`、`failed`、`inconclusive`、`recovered` の状態を管理画面と PostgreSQL に保存します。 +- PostgreSQL の atomic claim により複数インスタンスで重複検証を防ぎ、追加の schema migration は不要です。 + +ソースビルド、既存環境からの移行、検証、更新、ロールバック、Nginx、トラブルシューティングについては、**[中国語のデプロイ・運用ガイド](CODEX_OVERDRAFT_DEPLOYMENT_CN.md)** を参照してください。 + +```bash +git clone https://github.com/DeanZFC/sub2api-overdraft.git +cd sub2api-overdraft/deploy +cp .env.example .env +# .env に POSTGRES_PASSWORD、JWT_SECRET、TOTP_ENCRYPTION_KEY を設定 +mkdir -p data postgres_data redis_data +docker compose \ + -f docker-compose.local.yml \ + -f docker-compose.overdraft.yml \ + up -d --build +``` + +本 Fork は [GNU LGPL-3.0](LICENSE) を継承し、上流の著作権表示を保持します。以下の機能、デプロイ、スポンサー情報は上流 Sub2API の文書を継承したものであり、上流のスポンサーが本 Fork を支援または承認していることを意味しません。 + ## ⚠️ 重要なお知らせ 本プロジェクトをご利用になる前に、以下の内容を必ずよくお読みください: diff --git a/deploy/.env.example b/deploy/.env.example index 6beca8830..da4b71fc9 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -280,6 +280,9 @@ RATE_LIMIT_OVERLOAD_COOLDOWN_MINUTES=10 # # 默认:false GATEWAY_FORCE_CODEX_CLI=false +# sub2api-overdraft: Codex 5h/7d 额度达到 100% 后启用真实探测和透支调度。 +# 设为 false 可立即恢复上游 Sub2API 的调度和请求行为。 +GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED=true # OpenAI /responses/compact 上游模型(默认 gpt-5.4)。 # 当 compact 端点暂未支持更新模型时,可通过这里降级规避失败。 GATEWAY_OPENAI_COMPACT_MODEL=gpt-5.4 diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index 8d61d38ad..cd71e4a3d 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -4,7 +4,7 @@ # Copy this file to /etc/sub2api/config.yaml and modify as needed # 复制此文件到 /etc/sub2api/config.yaml 并根据需要修改 # -# Documentation / 文档: https://github.com/Wei-Shaw/sub2api +# Documentation / 文档: https://github.com/DeanZFC/sub2api-overdraft # ============================================================================= # Server Configuration diff --git a/deploy/docker-compose.overdraft.yml b/deploy/docker-compose.overdraft.yml new file mode 100644 index 000000000..3d81a0d37 --- /dev/null +++ b/deploy/docker-compose.overdraft.yml @@ -0,0 +1,15 @@ +# sub2api-overdraft source-build overlay. +# Use together with docker-compose.local.yml from this directory: +# docker compose -f docker-compose.local.yml -f docker-compose.overdraft.yml up -d --build + +services: + sub2api: + image: sub2api-overdraft:local + build: + context: .. + dockerfile: Dockerfile + args: + VERSION: ${BUILD_VERSION:-codex-overdraft} + COMMIT: ${BUILD_COMMIT:-local} + environment: + - GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED=${GATEWAY_CODEX_QUOTA_OVERDRAFT_ENABLED:-true} diff --git a/frontend/index.html b/frontend/index.html index 245db6296..e6b3b8061 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - Sub2API - AI API Gateway + sub2api-overdraft - AI API Gateway