From d781a030a1a5095ca232f74b5ada36b2977d3dcf Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Sat, 27 Jun 2026 19:29:29 +0800 Subject: [PATCH] feat: add new-api and gpt-load --- apps/gpt-load/README.md | 58 +++++++++++++++ apps/gpt-load/data.yml | 30 ++++++++ apps/gpt-load/latest/.env.sample | 6 ++ apps/gpt-load/latest/data.yml | 85 ++++++++++++++++++++++ apps/gpt-load/latest/data/.gitkeep | 0 apps/gpt-load/latest/docker-compose.yml | 23 ++++++ apps/gpt-load/latest/scripts/.gitkeep | 0 apps/gpt-load/latest/scripts/init.sh | 4 + apps/gpt-load/latest/scripts/uninstall.sh | 2 + apps/gpt-load/latest/scripts/upgrade.sh | 3 + apps/gpt-load/logo.png | Bin 0 -> 6092 bytes apps/gpt-load/source-evidence.json | 5 ++ apps/new-api/README.md | 55 ++++++++++++++ apps/new-api/data.yml | 30 ++++++++ apps/new-api/latest/.env.sample | 4 + apps/new-api/latest/data.yml | 51 +++++++++++++ apps/new-api/latest/data/.gitkeep | 0 apps/new-api/latest/docker-compose.yml | 19 +++++ apps/new-api/latest/scripts/.gitkeep | 0 apps/new-api/latest/scripts/init.sh | 4 + apps/new-api/latest/scripts/uninstall.sh | 2 + apps/new-api/latest/scripts/upgrade.sh | 3 + apps/new-api/logo.png | Bin 0 -> 3214 bytes apps/new-api/source-evidence.json | 5 ++ 24 files changed, 389 insertions(+) create mode 100644 apps/gpt-load/README.md create mode 100644 apps/gpt-load/data.yml create mode 100644 apps/gpt-load/latest/.env.sample create mode 100644 apps/gpt-load/latest/data.yml create mode 100644 apps/gpt-load/latest/data/.gitkeep create mode 100644 apps/gpt-load/latest/docker-compose.yml create mode 100644 apps/gpt-load/latest/scripts/.gitkeep create mode 100755 apps/gpt-load/latest/scripts/init.sh create mode 100755 apps/gpt-load/latest/scripts/uninstall.sh create mode 100755 apps/gpt-load/latest/scripts/upgrade.sh create mode 100644 apps/gpt-load/logo.png create mode 100644 apps/gpt-load/source-evidence.json create mode 100644 apps/new-api/README.md create mode 100644 apps/new-api/data.yml create mode 100644 apps/new-api/latest/.env.sample create mode 100644 apps/new-api/latest/data.yml create mode 100644 apps/new-api/latest/data/.gitkeep create mode 100644 apps/new-api/latest/docker-compose.yml create mode 100644 apps/new-api/latest/scripts/.gitkeep create mode 100755 apps/new-api/latest/scripts/init.sh create mode 100755 apps/new-api/latest/scripts/uninstall.sh create mode 100755 apps/new-api/latest/scripts/upgrade.sh create mode 100644 apps/new-api/logo.png create mode 100644 apps/new-api/source-evidence.json diff --git a/apps/gpt-load/README.md b/apps/gpt-load/README.md new file mode 100644 index 000000000..448af4ac7 --- /dev/null +++ b/apps/gpt-load/README.md @@ -0,0 +1,58 @@ +# GPT-Load + +## 产品介绍 +GPT-Load 是多渠道 AI API 透明代理服务,面向需要统一管理多个上游模型服务、密钥池、负载均衡和调用监控的场景。 + +## 主要功能 +- 提供 OpenAI、Gemini、Claude 等 API 的透明代理入口 +- 支持密钥池管理、自动轮询、失败恢复和负载均衡 +- 管理端和代理端分离鉴权,并支持 SQLite 单容器轻量部署 + +## 访问说明 +安装后通过 `http://<服务器 IP>:15077` 访问管理界面,实际端口以安装表单中的 `PANEL_APP_PORT_HTTP` 为准;API 代理地址为 `http://<服务器 IP>:<端口>/proxy`。 + +## Introduction +GPT-Load is a multi-channel AI API transparent proxy for managing upstream providers, key pools, load balancing and request monitoring. + +## Features +- Transparent proxy entry for OpenAI, Gemini, Claude and similar APIs +- Key pool management, rotation, failure recovery and load balancing +- Separate authentication for management and proxy access, with SQLite single-container deployment by default + +## 部署说明 +- 本应用使用官方 GitHub Container Registry 镜像 `ghcr.io/tbphp/gpt-load` 部署。 +- 默认采用官方文档中的 SQLite 单容器形态,只挂载 `/app/data` 数据目录。 +- 应用分类:AI。 +- 支持架构:amd64、arm64。 +- 可选版本:`latest`。 + +## 端口 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| PANEL_APP_PORT_HTTP | GPT-Load Web 管理端与 API 代理端口 | 15077 | 是 | + +## 数据持久化 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| APP_DATA_DIR | GPT-Load 数据目录,挂载到容器 `/app/data` | ./data | 是 | + +升级、迁移、变更加密密钥或切换外部数据库前,请先在 1Panel 中备份 `APP_DATA_DIR`。 + +## 参数说明 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| AUTH_KEY | 管理端登录密钥,安装时随机生成 | 随机生成 | 是 | +| ENCRYPTION_KEY | API Key 静态加密密钥,安装后请保持稳定 | 随机生成 | 是 | +| TZ | 容器时区 | Asia/Shanghai | 是 | + +## 使用说明 +- 请妥善保存 `AUTH_KEY`,它用于登录管理界面。 +- `ENCRYPTION_KEY` 用于加密存储 API Key;已有数据后请勿随意修改,否则可能需要按官方迁移流程处理加密数据。 +- 本应用是 AI API 代理服务,使用前请确认你已合法取得上游 API Key、账号、模型服务和接口权限。 +- 如对公网开放访问,请同步配置防火墙、安全组、反向代理、HTTPS 和访问控制。 +- 如需 MySQL、PostgreSQL、Redis 或集群部署,请参考官方文档后再调整配置。 + +## 参考资料 +- 项目仓库: +- Docker 快速开始: +- Compose 部署说明: diff --git a/apps/gpt-load/data.yml b/apps/gpt-load/data.yml new file mode 100644 index 000000000..240bf14fb --- /dev/null +++ b/apps/gpt-load/data.yml @@ -0,0 +1,30 @@ +name: GPT-Load +tags: + - AI +title: 多渠道 AI API 透明代理与密钥轮询服务 +description: 多渠道 AI API 透明代理与密钥轮询服务 +additionalProperties: + key: gpt-load + name: GPT-Load + tags: + - AI + shortDescZh: 多渠道 AI API 透明代理与密钥轮询服务 + shortDescEn: Multi-channel AI API proxy with intelligent key rotation + description: + en: "A multi-channel AI API transparent proxy with key pool management, load balancing, health monitoring and separate management/proxy authentication." + zh: "多渠道 AI API 透明代理,支持密钥池管理、负载均衡、健康监控,以及管理端和代理端分离鉴权。" + zh-Hant: "多渠道 AI API 透明代理,支援金鑰池管理、負載均衡、健康監控,以及管理端和代理端分離鑑權。" + ja: "キープール管理、負荷分散、ヘルス監視、管理/API プロキシ認証分離に対応した AI API 透明プロキシです。" + ko: "키 풀 관리, 부하 분산, 상태 모니터링, 관리/프록시 인증 분리를 지원하는 다중 채널 AI API 투명 프록시입니다." + ru: "Прозрачный прокси для нескольких AI API с пулом ключей, балансировкой, мониторингом и раздельной аутентификацией управления и прокси." + ms: "Proksi telus AI API berbilang saluran dengan pengurusan kumpulan kunci, pengimbangan beban, pemantauan kesihatan dan pengesahan pengurusan/proksi berasingan." + pt-br: "Proxy transparente multi-canal para APIs de IA com pool de chaves, balanceamento, monitoramento e autenticação separada para gestão e proxy." + type: tool + crossVersionUpdate: true + limit: 0 + website: https://www.gpt-load.com + github: https://github.com/tbphp/gpt-load + document: https://www.gpt-load.com/docs?lang=en + architectures: + - amd64 + - arm64 diff --git a/apps/gpt-load/latest/.env.sample b/apps/gpt-load/latest/.env.sample new file mode 100644 index 000000000..1b5edfeb0 --- /dev/null +++ b/apps/gpt-load/latest/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME=gpt-load +PANEL_APP_PORT_HTTP=15077 +TZ=Asia/Shanghai +APP_DATA_DIR=./data +AUTH_KEY=change-me-before-install +ENCRYPTION_KEY=change-me-before-install diff --git a/apps/gpt-load/latest/data.yml b/apps/gpt-load/latest/data.yml new file mode 100644 index 000000000..305e0747d --- /dev/null +++ b/apps/gpt-load/latest/data.yml @@ -0,0 +1,85 @@ +additionalProperties: + formFields: + - default: 15077 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-Hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - edit: true + envKey: AUTH_KEY + labelEn: Admin Key + labelZh: 管理密钥 + label: + en: Admin Key + zh: 管理密钥 + zh-Hant: 管理金鑰 + ja: 管理キー + ko: 관리자 키 + ru: Ключ администратора + ms: Kunci pentadbir + pt-br: Chave de administrador + random: true + required: true + rule: paramComplexity + type: password + - edit: true + envKey: ENCRYPTION_KEY + labelEn: Data Encryption Key + labelZh: 数据加密密钥 + label: + en: Data Encryption Key + zh: 数据加密密钥 + zh-Hant: 資料加密金鑰 + ja: データ暗号化キー + ko: 데이터 암호화 키 + ru: Ключ шифрования данных + ms: Kunci penyulitan data + pt-br: Chave de criptografia dos dados + random: true + required: true + rule: paramComplexity + type: password + - default: Asia/Shanghai + edit: true + envKey: TZ + labelEn: Timezone + labelZh: 时区 + label: + en: Timezone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: ./data + edit: true + envKey: APP_DATA_DIR + labelEn: Data Directory + labelZh: 数据目录 + label: + en: Data Directory + zh: 数据目录 + zh-Hant: 資料目錄 + ja: データディレクトリ + ko: 데이터 디렉터리 + ru: Каталог данных + ms: Direktori data + pt-br: Diretório de dados + required: true + type: text diff --git a/apps/gpt-load/latest/data/.gitkeep b/apps/gpt-load/latest/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/gpt-load/latest/docker-compose.yml b/apps/gpt-load/latest/docker-compose.yml new file mode 100644 index 000000000..d81e23de9 --- /dev/null +++ b/apps/gpt-load/latest/docker-compose.yml @@ -0,0 +1,23 @@ +services: + gpt-load: + image: "ghcr.io/tbphp/gpt-load:latest" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3001" + environment: + - TZ=${TZ} + - HOST=0.0.0.0 + - PORT=3001 + - AUTH_KEY=${AUTH_KEY} + - ENCRYPTION_KEY=${ENCRYPTION_KEY} + volumes: + - "${APP_DATA_DIR}:/app/data" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/gpt-load/latest/scripts/.gitkeep b/apps/gpt-load/latest/scripts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/gpt-load/latest/scripts/init.sh b/apps/gpt-load/latest/scripts/init.sh new file mode 100755 index 000000000..22f0c8ad8 --- /dev/null +++ b/apps/gpt-load/latest/scripts/init.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +DATA_DIR="${APP_DATA_DIR:-./data}" +mkdir -p "$DATA_DIR" diff --git a/apps/gpt-load/latest/scripts/uninstall.sh b/apps/gpt-load/latest/scripts/uninstall.sh new file mode 100755 index 000000000..ab8a8d674 --- /dev/null +++ b/apps/gpt-load/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down --volumes diff --git a/apps/gpt-load/latest/scripts/upgrade.sh b/apps/gpt-load/latest/scripts/upgrade.sh new file mode 100755 index 000000000..9879df4c3 --- /dev/null +++ b/apps/gpt-load/latest/scripts/upgrade.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +exit 0 diff --git a/apps/gpt-load/logo.png b/apps/gpt-load/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5c5f68982a1d8b01ae786d8792823d5ebba8b6 GIT binary patch literal 6092 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 SR#$%j0000:15076` 访问,实际端口以安装表单中的 `PANEL_APP_PORT_HTTP` 为准。 + +## Introduction +New API is a next-generation LLM gateway and AI asset management system for authorized model provider, channel, token, user, usage and billing management. + +## Features +- Gateway and relay support for OpenAI, Claude, Gemini and other API formats +- Channel management, model routing, usage statistics, quotas and user permissions +- SQLite-based single-container deployment by default, with external database options documented upstream + +## 部署说明 +- 本应用使用官方 Docker 镜像 `calciumion/new-api` 部署。 +- 默认采用官方文档中的 SQLite 单容器形态,只挂载 `/data` 数据目录。 +- 应用分类:AI。 +- 支持架构:amd64、arm64。 +- 可选版本:`latest`。 + +## 端口 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| PANEL_APP_PORT_HTTP | New API Web 与 API 访问端口 | 15076 | 是 | + +## 数据持久化 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| APP_DATA_DIR | New API 数据目录,挂载到容器 `/data` | ./data | 是 | + +升级、迁移、切换数据库或启用外部依赖前,请先在 1Panel 中备份 `APP_DATA_DIR`。 + +## 参数说明 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| TZ | 容器时区 | Asia/Shanghai | 是 | + +## 使用说明 +- 本应用是 AI API 网关,使用前请确认你已合法取得上游 API Key、账号、模型服务和接口权限。 +- 如对公网开放访问,请同步配置防火墙、安全组、反向代理、HTTPS 和访问控制。 +- 面向公众提供生成式 AI 服务或 API 转售服务时,请自行完成所在司法辖区要求的备案、许可、内容安全、实名、日志留存、税务和上游授权等合规义务。 +- 如果需要 MySQL、PostgreSQL、Redis 或多节点部署,请参考官方部署文档后再调整配置。 + +## 参考资料 +- 项目仓库: +- Docker 使用说明: +- 部署文档: diff --git a/apps/new-api/data.yml b/apps/new-api/data.yml new file mode 100644 index 000000000..633354a5c --- /dev/null +++ b/apps/new-api/data.yml @@ -0,0 +1,30 @@ +name: New API +tags: + - AI +title: 下一代 LLM 网关与 AI 资产管理系统 +description: 下一代 LLM 网关与 AI 资产管理系统 +additionalProperties: + key: new-api + name: New API + tags: + - AI + shortDescZh: 下一代 LLM 网关与 AI 资产管理系统 + shortDescEn: Next-generation LLM gateway and AI asset management system + description: + en: "Next-generation LLM gateway and AI asset management system for managing authorized model providers, users, tokens, routing, usage and billing." + zh: "下一代 LLM 网关与 AI 资产管理系统,用于管理已授权的模型服务商、用户、令牌、路由、用量统计和计费。" + zh-Hant: "下一代 LLM 閘道與 AI 資產管理系統,用於管理已授權的模型服務商、使用者、權杖、路由、用量統計和計費。" + ja: "認可済みモデルプロバイダー、ユーザー、トークン、ルーティング、利用量、課金を管理する次世代 LLM ゲートウェイです。" + ko: "승인된 모델 제공자, 사용자, 토큰, 라우팅, 사용량 및 과금을 관리하는 차세대 LLM 게이트웨이입니다." + ru: "LLM-шлюз нового поколения для управления авторизованными провайдерами моделей, пользователями, токенами, маршрутизацией, учетом и биллингом." + ms: "Gerbang LLM generasi baharu untuk mengurus penyedia model yang dibenarkan, pengguna, token, penghalaan, penggunaan dan pengebilan." + pt-br: "Gateway LLM de nova geração para gerenciar provedores de modelos autorizados, usuários, tokens, roteamento, uso e cobrança." + type: tool + crossVersionUpdate: true + limit: 0 + website: https://www.newapi.ai + github: https://github.com/QuantumNous/new-api + document: https://docs.newapi.pro/en/docs/installation + architectures: + - amd64 + - arm64 diff --git a/apps/new-api/latest/.env.sample b/apps/new-api/latest/.env.sample new file mode 100644 index 000000000..9521efd45 --- /dev/null +++ b/apps/new-api/latest/.env.sample @@ -0,0 +1,4 @@ +CONTAINER_NAME=new-api +PANEL_APP_PORT_HTTP=15076 +TZ=Asia/Shanghai +APP_DATA_DIR=./data diff --git a/apps/new-api/latest/data.yml b/apps/new-api/latest/data.yml new file mode 100644 index 000000000..0e354d2a7 --- /dev/null +++ b/apps/new-api/latest/data.yml @@ -0,0 +1,51 @@ +additionalProperties: + formFields: + - default: 15076 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-Hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - default: Asia/Shanghai + edit: true + envKey: TZ + labelEn: Timezone + labelZh: 时区 + label: + en: Timezone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: ./data + edit: true + envKey: APP_DATA_DIR + labelEn: Data Directory + labelZh: 数据目录 + label: + en: Data Directory + zh: 数据目录 + zh-Hant: 資料目錄 + ja: データディレクトリ + ko: 데이터 디렉터리 + ru: Каталог данных + ms: Direktori data + pt-br: Diretório de dados + required: true + type: text diff --git a/apps/new-api/latest/data/.gitkeep b/apps/new-api/latest/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/new-api/latest/docker-compose.yml b/apps/new-api/latest/docker-compose.yml new file mode 100644 index 000000000..b9639fa8c --- /dev/null +++ b/apps/new-api/latest/docker-compose.yml @@ -0,0 +1,19 @@ +services: + new-api: + image: "calciumion/new-api:latest" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3000" + environment: + - TZ=${TZ} + volumes: + - "${APP_DATA_DIR}:/data" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/new-api/latest/scripts/.gitkeep b/apps/new-api/latest/scripts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/new-api/latest/scripts/init.sh b/apps/new-api/latest/scripts/init.sh new file mode 100755 index 000000000..22f0c8ad8 --- /dev/null +++ b/apps/new-api/latest/scripts/init.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +DATA_DIR="${APP_DATA_DIR:-./data}" +mkdir -p "$DATA_DIR" diff --git a/apps/new-api/latest/scripts/uninstall.sh b/apps/new-api/latest/scripts/uninstall.sh new file mode 100755 index 000000000..ab8a8d674 --- /dev/null +++ b/apps/new-api/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down --volumes diff --git a/apps/new-api/latest/scripts/upgrade.sh b/apps/new-api/latest/scripts/upgrade.sh new file mode 100755 index 000000000..9879df4c3 --- /dev/null +++ b/apps/new-api/latest/scripts/upgrade.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +exit 0 diff --git a/apps/new-api/logo.png b/apps/new-api/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d061be440075076451922431d5475bdf94ef34 GIT binary patch literal 3214 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 literal 0 HcmV?d00001 diff --git a/apps/new-api/source-evidence.json b/apps/new-api/source-evidence.json new file mode 100644 index 000000000..d8501c800 --- /dev/null +++ b/apps/new-api/source-evidence.json @@ -0,0 +1,5 @@ +{ + "repository": "https://github.com/QuantumNous/new-api", + "dockerDocs": "https://github.com/QuantumNous/new-api#using-docker-commands", + "composeFile": "https://github.com/QuantumNous/new-api/blob/main/docker-compose.yml" +}