Merge pull request #3706 from okxlin/openclaw/feat-metapi-sub2api-20260414

feat: add metapi and sub2api to localApps
This commit is contained in:
okxlin
2026-04-14 23:34:08 +08:00
committed by GitHub
34 changed files with 1376 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
APP_DATA_DIR="./data"
AUTH_TOKEN=""
BALANCE_REFRESH_CRON="0 * * * *"
CHECKIN_CRON="0 8 * * *"
CONTAINER_NAME="metapi"
PANEL_APP_PORT_HTTP=4000
PROXY_TOKEN=""
TZ="Asia/Shanghai"
+118
View File
@@ -0,0 +1,118 @@
additionalProperties:
formFields:
- default: 4000
envKey: PANEL_APP_PORT_HTTP
edit: true
labelEn: Port
labelZh: 端口
label:
en: Port
zh: 端口
zh-Hant: 埠
ja: ポート
ko: 포트
ru: Порт
ms: Port
pt-br: Porta
required: true
rule: paramPort
type: number
- default: ./data
envKey: APP_DATA_DIR
edit: true
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
rule: paramCommon
type: text
- default: ""
envKey: AUTH_TOKEN
edit: true
labelEn: Admin token
labelZh: 管理员令牌
label:
en: Admin token
zh: 管理员令牌
zh-Hant: 管理員令牌
ja: 管理者トークン
ko: 관리자 토큰
ru: Администраторский токен
ms: Token pentadbir
pt-br: Token de administrador
required: true
type: password
- default: ""
envKey: PROXY_TOKEN
edit: true
labelEn: Proxy token
labelZh: 代理令牌
label:
en: Proxy token
zh: 代理令牌
zh-Hant: 代理令牌
ja: プロキシトークン
ko: 프록시 토큰
ru: Прокси‑токен
ms: Token proksi
pt-br: Token de proxy
required: true
type: password
- default: "0 8 * * *"
envKey: CHECKIN_CRON
edit: true
labelEn: Check-in cron
labelZh: 签到 Cron
label:
en: Check-in cron
zh: 签到 Cron
zh-Hant: 簽到 Cron
ja: チェックイン Cron
ko: 체크인 Cron
ru: Cron для签到
ms: Cron daftar masuk
pt-br: Cron de check-in
required: false
rule: paramCommon
type: text
- default: "0 * * * *"
envKey: BALANCE_REFRESH_CRON
edit: true
labelEn: Balance refresh cron
labelZh: 余额刷新 Cron
label:
en: Balance refresh cron
zh: 余额刷新 Cron
zh-Hant: 餘額刷新 Cron
ja: 残高更新 Cron
ko: 잔액 새로고침 Cron
ru: Cron обновления баланса
ms: Cron segar semula baki
pt-br: Cron de atualização de saldo
required: false
rule: paramCommon
type: text
- default: Asia/Shanghai
envKey: TZ
edit: true
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon waktu
pt-br: Fuso horário
required: true
type: text
View File
+18
View File
@@ -0,0 +1,18 @@
services:
metapi:
image: "1467078763/metapi:latest"
ports:
- "${PANEL_APP_PORT_HTTP}:4000"
environment:
- "AUTH_TOKEN=${AUTH_TOKEN:?AUTH_TOKEN is required}"
- "PROXY_TOKEN=${PROXY_TOKEN:?PROXY_TOKEN is required}"
- "CHECKIN_CRON=${CHECKIN_CRON:-0 8 * * *}"
- "BALANCE_REFRESH_CRON=${BALANCE_REFRESH_CRON:-0 * * * *}"
- "PORT=4000"
- "DATA_DIR=/app/data"
- "TZ=${TZ}"
volumes:
- "${APP_DATA_DIR}:/app/data"
restart: unless-stopped
labels:
createdBy: "Apps"
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
set -euo pipefail
mkdir -p "${APP_DATA_DIR:-./data}"
+2
View File
@@ -0,0 +1,2 @@
#!/bin/bash
docker-compose down --volumes
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
# Reserved for future migrations.
exit 0
+57
View File
@@ -0,0 +1,57 @@
# Metapi
Metapi 是一个面向多 AI 中转站聚合场景的统一网关,适合在 1Panel 中部署为集中入口,用于统一转发、令牌管理与定时任务调度。
## 应用简介
该应用将多个 AI 中转服务的访问能力收敛到一个统一网关内,方便在单一入口下完成鉴权、代理调用与日常维护。当前 1Panel 适配版本提供开箱即用的本地应用结构,部署后可直接通过 Web 端口对外提供服务。
## 功能亮点
- 聚合多个 AI 中转站,统一对外暴露访问入口
- 支持管理员令牌与代理令牌配置,方便分权管理
- 支持签到任务与余额刷新任务的 Cron 调度
- 支持数据目录持久化,便于保留运行数据与后续迁移
- 配置项集中在安装表单中维护,适合面板化运维
## 安装说明
安装时建议至少确认以下参数:
- 访问端口
- 数据目录
- `AUTH_TOKEN` 管理员令牌
- `PROXY_TOKEN` 代理令牌
- `CHECKIN_CRON` 自动签到计划
- `BALANCE_REFRESH_CRON` 余额刷新计划
- 时区配置
其中两类令牌都属于关键安全参数,建议直接使用高强度随机值。
## 默认配置
- 访问端口:`4000`
- 容器内部端口:`4000`
- 默认数据目录:`./data`
- 容器内数据目录:`/app/data`
- 默认签到 Cron:`0 8 * * *`
- 默认余额刷新 Cron:`0 * * * *`
- 默认时区:`Asia/Shanghai`
## 使用建议
- 首次安装时优先更换为高强度 `AUTH_TOKEN` 与 `PROXY_TOKEN`
- 若服务器已有统一反向代理,可将 Metapi 作为内部网关服务接入
- Cron 任务建议按实际中转站频率与额度策略调整,避免过于激进
- 数据目录建议放到稳定存储位置,便于备份与故障恢复
## 安装后检查
1. 打开 `http://<服务器IP>:<访问端口>` 确认服务已启动。
2. 检查令牌配置是否生效。
3. 检查数据目录是否已正确挂载。
4. 观察签到与余额刷新任务是否按预期执行。
## 适配说明
当前目录为可直接导入 1Panel 的本地应用包,已按商店应用结构整理,重点保留安装表单、数据挂载和运行参数的面板化配置体验。
+30
View File
@@ -0,0 +1,30 @@
name: Metapi
tags:
- AI
title: 聚合多个 AI 中转站的统一网关
description: 聚合多个 AI 中转站的统一网关
additionalProperties:
key: metapi
name: Metapi
tags:
- AI
shortDescZh: 聚合多个 AI 中转站的统一网关
shortDescEn: Unified gateway aggregating multiple AI relay services
description:
en: Unified gateway aggregating multiple AI relay services
zh: 聚合多个 AI 中转站的统一网关
zh-Hant: 聚合多個 AI 中轉站的統一網關
ja: 複数のAI中継サービスを統合する統一ゲートウェイ
ko: 여러 AI 중계 서비스를 통합하는 통합 게이트웨이
ru: Единый шлюз, объединяющий несколько AI‑ретрансляторов
ms: Gerbang bersatu yang menggabungkan pelbagai relay AI
pt-br: Gateway unificado que agrega múltiplos relay de IA
type: tool
crossVersionUpdate: true
limit: 0
recommend: 0
website: https://metapi.cita777.me
github: https://github.com/cita-777/metapi
document: https://metapi.cita777.me
architectures:
- amd64
+8
View File
@@ -0,0 +1,8 @@
APP_DATA_DIR="./data"
AUTH_TOKEN=""
BALANCE_REFRESH_CRON="0 * * * *"
CHECKIN_CRON="0 8 * * *"
CONTAINER_NAME="metapi"
PANEL_APP_PORT_HTTP=4000
PROXY_TOKEN=""
TZ="Asia/Shanghai"
+118
View File
@@ -0,0 +1,118 @@
additionalProperties:
formFields:
- default: 4000
envKey: PANEL_APP_PORT_HTTP
edit: true
labelEn: Port
labelZh: 端口
label:
en: Port
zh: 端口
zh-Hant: 埠
ja: ポート
ko: 포트
ru: Порт
ms: Port
pt-br: Porta
required: true
rule: paramPort
type: number
- default: ./data
envKey: APP_DATA_DIR
edit: true
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
rule: paramCommon
type: text
- default: ""
envKey: AUTH_TOKEN
edit: true
labelEn: Admin token
labelZh: 管理员令牌
label:
en: Admin token
zh: 管理员令牌
zh-Hant: 管理員令牌
ja: 管理者トークン
ko: 관리자 토큰
ru: Администраторский токен
ms: Token pentadbir
pt-br: Token de administrador
required: true
type: password
- default: ""
envKey: PROXY_TOKEN
edit: true
labelEn: Proxy token
labelZh: 代理令牌
label:
en: Proxy token
zh: 代理令牌
zh-Hant: 代理令牌
ja: プロキシトークン
ko: 프록시 토큰
ru: Прокси‑токен
ms: Token proksi
pt-br: Token de proxy
required: true
type: password
- default: "0 8 * * *"
envKey: CHECKIN_CRON
edit: true
labelEn: Check-in cron
labelZh: 签到 Cron
label:
en: Check-in cron
zh: 签到 Cron
zh-Hant: 簽到 Cron
ja: チェックイン Cron
ko: 체크인 Cron
ru: Cron для签到
ms: Cron daftar masuk
pt-br: Cron de check-in
required: false
rule: paramCommon
type: text
- default: "0 * * * *"
envKey: BALANCE_REFRESH_CRON
edit: true
labelEn: Balance refresh cron
labelZh: 余额刷新 Cron
label:
en: Balance refresh cron
zh: 余额刷新 Cron
zh-Hant: 餘額刷新 Cron
ja: 残高更新 Cron
ko: 잔액 새로고침 Cron
ru: Cron обновления баланса
ms: Cron segar semula baki
pt-br: Cron de atualização de saldo
required: false
rule: paramCommon
type: text
- default: Asia/Shanghai
envKey: TZ
edit: true
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon waktu
pt-br: Fuso horário
required: true
type: text
View File
+18
View File
@@ -0,0 +1,18 @@
services:
metapi:
image: "1467078763/metapi:latest"
ports:
- "${PANEL_APP_PORT_HTTP}:4000"
environment:
- "AUTH_TOKEN=${AUTH_TOKEN:?AUTH_TOKEN is required}"
- "PROXY_TOKEN=${PROXY_TOKEN:?PROXY_TOKEN is required}"
- "CHECKIN_CRON=${CHECKIN_CRON:-0 8 * * *}"
- "BALANCE_REFRESH_CRON=${BALANCE_REFRESH_CRON:-0 * * * *}"
- "PORT=4000"
- "DATA_DIR=/app/data"
- "TZ=${TZ}"
volumes:
- "${APP_DATA_DIR}:/app/data"
restart: unless-stopped
labels:
createdBy: "Apps"
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
set -euo pipefail
mkdir -p "${APP_DATA_DIR:-./data}"
+2
View File
@@ -0,0 +1,2 @@
#!/bin/bash
docker-compose down --volumes
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
# Reserved for future migrations.
exit 0
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

+21
View File
@@ -0,0 +1,21 @@
CONTAINER_NAME="sub2api"
PANEL_APP_PORT_HTTP="8080"
TZ="Asia/Shanghai"
SERVER_MODE="release"
RUN_MODE="standard"
PANEL_DB_TYPE="postgresql"
PANEL_DB_HOST=""
PANEL_DB_NAME="sub2api"
PANEL_DB_USER="sub2api"
PANEL_DB_PORT="5432"
PANEL_DB_USER_PASSWORD=""
REDIS_HOST=""
REDIS_PORT="6379"
PANEL_REDIS_ROOT_PASSWORD=""
REDIS_DB="0"
ADMIN_EMAIL="admin@sub2api.local"
ADMIN_PASSWORD=""
JWT_SECRET=""
TOTP_ENCRYPTION_KEY=""
UPDATE_PROXY_URL=""
APP_DATA_DIR_1="./data"
+350
View File
@@ -0,0 +1,350 @@
additionalProperties:
formFields:
- child:
default: ""
envKey: PANEL_DB_HOST
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Service
zh: 数据库服务
zh-hant: 資料庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Служба базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: service
default: postgresql
envKey: PANEL_DB_TYPE
labelEn: Database
labelZh: 数据库服务
label:
en: Database
zh: 数据库服务
zh-hant: 資料庫服務
ja: データベース
ko: 데이터베이스
ru: База данных
ms: Pangkalan Data
pt-br: Banco de dados
required: true
type: apps
values:
- label: PostgreSQL
value: postgresql
- default: sub2api
edit: true
envKey: PANEL_DB_NAME
labelEn: Database Name
labelZh: 数据库名
label:
en: Database Name
zh: 数据库名
zh-hant: 資料庫名稱
ja: データベース名
ko: 데이터베이스 이름
ru: Имя базы данных
ms: Nama pangkalan data
pt-br: Nome do banco de dados
random: true
required: true
rule: paramCommon
type: text
- default: sub2api
edit: true
envKey: PANEL_DB_USER
labelEn: Database User
labelZh: 数据库用户
label:
en: Database User
zh: 数据库用户
zh-hant: 資料庫使用者
ja: データベースユーザー
ko: 데이터베이스 사용자
ru: Пользователь базы данных
ms: Nama pengguna pangkalan data
pt-br: Usuário do banco de dados
random: true
required: true
rule: paramCommon
type: text
- default: 5432
edit: true
envKey: PANEL_DB_PORT
labelEn: Database Port
labelZh: 数据库端口
label:
en: Database Port
zh: 数据库端口
zh-hant: 資料庫連接埠
ja: データベースポート
ko: 데이터베이스 포트
ru: Порт базы данных
ms: Port pangkalan data
pt-br: Porta do banco de dados
required: true
rule: paramPort
type: number
- default: ""
edit: true
envKey: PANEL_DB_USER_PASSWORD
labelEn: Database Password
labelZh: 数据库用户密码
label:
en: Database Password
zh: 数据库用户密码
zh-hant: 資料庫使用者密碼
ja: データベースパスワード
ko: 데이터베이스 비밀번호
ru: Пароль базы данных
ms: Kata laluan pangkalan data
pt-br: Senha do banco de dados
random: true
required: true
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: REDIS_HOST
key: redis
labelEn: Redis Service
labelZh: Redis服务
label:
en: Redis Service
zh: Redis服务
zh-hant: Redis 服務
ja: Redis サービス
ko: Redis 서비스
ru: Служба Redis
ms: Perkhidmatan Redis
pt-br: Serviço Redis
required: true
type: service
- default: 6379
edit: true
envKey: REDIS_PORT
labelEn: Redis Service Port
labelZh: Redis服务端口
label:
en: Redis Service Port
zh: Redis服务端口
zh-hant: Redis 服務連接埠
ja: Redis サービスポート
ko: Redis 서비스 포트
ru: Порт службы Redis
ms: Port Perkhidmatan Redis
pt-br: Porta do serviço Redis
required: true
rule: paramPort
type: number
- default: ""
edit: true
envKey: PANEL_REDIS_ROOT_PASSWORD
labelEn: Redis Password
labelZh: Redis 密码
label:
en: Redis Password
zh: Redis 密码
zh-hant: Redis 密碼
ja: Redis パスワード
ko: Redis 비밀번호
ru: Пароль Redis
ms: Kata laluan Redis
pt-br: Senha do Redis
random: true
required: true
type: password
- default: 0
edit: true
envKey: REDIS_DB
labelEn: Redis Database
labelZh: Redis 数据库
label:
en: Redis Database
zh: Redis 数据库
zh-hant: Redis 資料庫
ja: Redis データベース
ko: Redis 데이터베이스
ru: База данных Redis
ms: Pangkalan Data Redis
pt-br: Banco de dados Redis
required: true
type: number
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web Port
labelZh: Web 访问端口
label:
en: Web Port
zh: Web 访问端口
zh-hant: Web 訪問埠
ja: Webポート
ko: 웹 포트
ru: Веб-порт
ms: Port Web
pt-br: Porta Web
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 masa
pt-br: Fuso horário
required: true
type: text
- default: release
edit: true
envKey: SERVER_MODE
labelEn: Server Mode
labelZh: 服务模式
label:
en: Server Mode
zh: 服务模式
zh-hant: 服務模式
ja: サーバーモード
ko: 서버 모드
ru: Режим сервера
ms: Mod pelayan
pt-br: Modo do servidor
required: true
type: select
values:
- label: release
value: release
- label: debug
value: debug
- default: standard
edit: true
envKey: RUN_MODE
labelEn: Run Mode
labelZh: 运行模式
label:
en: Run Mode
zh: 运行模式
zh-hant: 運行模式
ja: 実行モード
ko: 실행 모드
ru: Режим работы
ms: Mod jalanan
pt-br: Modo de execução
required: true
type: select
values:
- label: standard
value: standard
- label: simple
value: simple
- default: admin@sub2api.local
edit: true
envKey: ADMIN_EMAIL
labelEn: Admin Email
labelZh: 管理员邮箱
label:
en: Admin Email
zh: 管理员邮箱
zh-hant: 管理員郵箱
ja: 管理者メール
ko: 관리자 이메일
ru: Email администратора
ms: E-mel pentadbir
pt-br: E-mail do administrador
required: true
type: text
- default: ""
edit: true
envKey: ADMIN_PASSWORD
labelEn: Admin Password
labelZh: 管理员密码
label:
en: Admin Password
zh: 管理员密码
zh-hant: 管理員密碼
ja: 管理者パスワード
ko: 관리자 비밀번호
ru: Пароль администратора
ms: Kata laluan pentadbir
pt-br: Senha do administrador
random: true
required: false
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: JWT_SECRET
labelEn: JWT Secret
labelZh: JWT 密钥
label:
en: JWT Secret
zh: JWT 密钥
zh-hant: JWT 金鑰
ja: JWT シークレット
ko: JWT 시크릿
ru: JWT-секрет
ms: Rahsia JWT
pt-br: Segredo JWT
random: true
required: true
type: password
- default: ""
edit: true
envKey: TOTP_ENCRYPTION_KEY
labelEn: TOTP Encryption Key
labelZh: TOTP 加密密钥
label:
en: TOTP Encryption Key
zh: TOTP 加密密钥
zh-hant: TOTP 加密金鑰
ja: TOTP 暗号化キー
ko: TOTP 암호화 키
ru: Ключ шифрования TOTP
ms: Kunci penyulitan TOTP
pt-br: Chave de criptografia TOTP
random: true
required: true
type: password
- default: ""
edit: true
envKey: UPDATE_PROXY_URL
labelEn: Update Proxy URL
labelZh: 更新代理地址
label:
en: Update Proxy URL
zh: 更新代理地址
zh-hant: 更新代理地址
ja: 更新プロキシ URL
ko: 업데이트 프록시 URL
ru: URL прокси для обновлений
ms: URL proksi kemas kini
pt-br: URL do proxy de atualização
required: false
rule: paramExtUrl
type: text
- default: ./data
edit: true
envKey: APP_DATA_DIR_1
labelEn: App Data Directory
labelZh: 应用数据目录
label:
en: App Data Directory
zh: 应用数据目录
zh-hant: 應用資料目錄
ja: アプリデータディレクトリ
ko: 앱 데이터 디렉터리
ru: Каталог данных приложения
ms: Direktori data aplikasi
pt-br: Diretório de dados da aplicação
required: true
type: text
View File
+46
View File
@@ -0,0 +1,46 @@
services:
sub2api:
image: "ghcr.io/wei-shaw/sub2api:0.1.112"
container_name: ${CONTAINER_NAME}
restart: always
networks:
- 1panel-network
environment:
- AUTO_SETUP=true
- SERVER_HOST=0.0.0.0
- SERVER_PORT=8080
- SERVER_MODE=${SERVER_MODE}
- RUN_MODE=${RUN_MODE}
- DATABASE_HOST=${PANEL_DB_HOST}
- DATABASE_PORT=${PANEL_DB_PORT}
- DATABASE_USER=${PANEL_DB_USER}
- DATABASE_PASSWORD=${PANEL_DB_USER_PASSWORD}
- DATABASE_DBNAME=${PANEL_DB_NAME}
- DATABASE_SSLMODE=disable
- REDIS_HOST=${REDIS_HOST}
- REDIS_PORT=${REDIS_PORT}
- REDIS_PASSWORD=${PANEL_REDIS_ROOT_PASSWORD}
- REDIS_DB=${REDIS_DB}
- ADMIN_EMAIL=${ADMIN_EMAIL}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRE_HOUR=24
- TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY}
- TZ=${TZ}
- UPDATE_PROXY_URL=${UPDATE_PROXY_URL:-}
ports:
- "${PANEL_APP_PORT_HTTP}:8080"
volumes:
- "${APP_DATA_DIR_1}:/app/data"
labels:
createdBy: "Apps"
healthcheck:
test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
1panel-network:
external: true
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 当前适配使用 1Panel 数据库 / Redis 依赖注入。
# 这里只初始化应用自身的数据目录。
mkdir -p "${APP_DATA_DIR_1:-./data}"
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 当前适配只卸载 Sub2API 容器本身。
# 数据库与 Redis 为 1Panel 依赖应用,不在此处删除。
docker-compose down --volumes
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 升级时确保应用自身的数据目录存在。
# 数据库与 Redis 数据由 1Panel 依赖应用管理。
mkdir -p "${APP_DATA_DIR_1:-./data}"
+81
View File
@@ -0,0 +1,81 @@
# Sub2API
Sub2API 是一个面向订阅转换与统一接口访问场景的轻量服务,适合在 1Panel 中作为独立应用部署,为客户端或上游系统提供稳定的订阅处理入口。
## 应用简介
该应用提供 Web 访问入口,并支持自动初始化、管理员账户设置、日志级别控制、JWT/TOTP 安全配置,以及基于 PostgreSQL 与 Redis 的持久化与缓存能力。当前 1Panel 适配版本采用“应用本体 + 商店依赖”的方式交付,便于直接复用面板内已有的数据库与缓存服务。
## 功能亮点
- 支持订阅转换与 API 化访问,方便统一接入与后续集成
- 支持 PostgreSQL + Redis 组合依赖,适合长期运行
- 支持管理员邮箱、管理员密码、JWT 密钥、TOTP 加密密钥等初始化参数
- 支持日志级别与安全 URL 白名单开关,便于按环境调整
- 支持数据目录挂载,方便备份、迁移与持久化管理
## 持久化目录
适配默认使用相对目录持久化应用数据:
- `./data` → `/app/data`
其中 `/app/data` 会保存应用运行数据、自动生成的 `config.yaml`、日志以及部分缓存内容。上游入口脚本会在启动时确保该目录可写。数据库和 Redis 的数据由对应的 1Panel 依赖应用自行管理。
## 安装说明
安装时需要在 1Panel 表单中补齐以下关键信息:
- PostgreSQL 服务实例
- Redis 服务实例
- 管理员邮箱
- 访问端口
- 数据目录
- 安全参数:`JWT_SECRET`、`TOTP_ENCRYPTION_KEY`、`ADMIN_PASSWORD`
其中数据库与缓存服务由 1Panel 商店依赖注入:
- PostgreSQL:用于应用数据持久化
- Redis:用于缓存与运行时状态
若面板中已经安装对应服务,直接在安装表单中选择实例与 Service 即可。
## 默认配置
- 访问端口:`8080`
- 容器内部端口:`8080`
- 默认数据目录:`./data`
- 容器内数据目录:`/app/data`
- 默认时区:`Asia/Shanghai`
- 默认日志级别:`info`
## 使用建议
- 首次安装时补全管理员邮箱,建议同时设置管理员密码
- 生产环境建议显式配置 `JWT_SECRET` 与 `TOTP_ENCRYPTION_KEY`
- 若启用 URL 安全白名单,请提前确认业务访问范围
- 如需代理更新源,可按需填写 `UPDATE_PROXY_URL`
## 安装后检查
1. 打开 `http://<服务器IP>:<访问端口>` 确认页面可访问。
2. 检查数据库与 Redis 连接是否正常。
3. 确认数据目录已正确挂载并具备写入权限。
4. 若使用初始化管理员账户,确认可正常登录后台。
## 反向代理说明
如果你在 Nginx 后面反代 Sub2API,并且需要兼容 Codex CLI 等依赖下划线请求头的客户端,请在 Nginx 的 `http` 块中开启:
```nginx
underscores_in_headers on;
```
这是上游 README 明确提到的要求,否则某些带下划线的头部可能会被 Nginx 丢弃,影响会话粘性与部分 CLI 场景。
## 备注
- 本适配默认启用 `AUTO_SETUP=true`
- 默认时区为 `Asia/Shanghai`
- 生命周期脚本只会初始化应用自身的 `./data` 目录,不会创建数据库或 Redis 的本地目录,因为这两者由 1Panel 依赖应用托管
- 如需更细的运行参数,可参考 `latest/.env.sample` 和上游文档继续扩展
+30
View File
@@ -0,0 +1,30 @@
name: Sub2API
tags:
- AI
title: 提供 OpenAI 兼容接口的 AI 网关服务
description: 提供 OpenAI 兼容接口的 AI 网关服务
additionalProperties:
key: sub2api
name: Sub2API
tags:
- AI
shortDescZh: 提供 OpenAI 兼容接口的 AI 网关服务
shortDescEn: AI gateway service with OpenAI-compatible APIs
description:
en: AI gateway service with OpenAI-compatible APIs
zh: 提供 OpenAI 兼容接口的 AI 网关服务
zh-Hant: 提供 OpenAI 相容介面的 AI 閘道服務
ja: OpenAI 互換 API を提供する AI ゲートウェイサービス
ko: OpenAI 호환 API를 제공하는 AI 게이트웨이 서비스
ru: AI-шлюз с API, совместимыми с OpenAI
ms: Perkhidmatan gerbang AI dengan API serasi OpenAI
pt-br: Serviço de gateway de IA com APIs compatíveis com OpenAI
type: tool
crossVersionUpdate: true
limit: 0
recommend: 0
website: https://github.com/Wei-Shaw/sub2api
github: https://github.com/Wei-Shaw/sub2api
document: https://github.com/Wei-Shaw/sub2api
architectures:
- amd64
+21
View File
@@ -0,0 +1,21 @@
CONTAINER_NAME="sub2api"
PANEL_APP_PORT_HTTP="8080"
TZ="Asia/Shanghai"
SERVER_MODE="release"
RUN_MODE="standard"
PANEL_DB_TYPE="postgresql"
PANEL_DB_HOST=""
PANEL_DB_NAME="sub2api"
PANEL_DB_USER="sub2api"
PANEL_DB_PORT="5432"
PANEL_DB_USER_PASSWORD=""
REDIS_HOST=""
REDIS_PORT="6379"
PANEL_REDIS_ROOT_PASSWORD=""
REDIS_DB="0"
ADMIN_EMAIL="admin@sub2api.local"
ADMIN_PASSWORD=""
JWT_SECRET=""
TOTP_ENCRYPTION_KEY=""
UPDATE_PROXY_URL=""
APP_DATA_DIR_1="./data"
+350
View File
@@ -0,0 +1,350 @@
additionalProperties:
formFields:
- child:
default: ""
envKey: PANEL_DB_HOST
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Service
zh: 数据库服务
zh-hant: 資料庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Служба базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: service
default: postgresql
envKey: PANEL_DB_TYPE
labelEn: Database
labelZh: 数据库服务
label:
en: Database
zh: 数据库服务
zh-hant: 資料庫服務
ja: データベース
ko: 데이터베이스
ru: База данных
ms: Pangkalan Data
pt-br: Banco de dados
required: true
type: apps
values:
- label: PostgreSQL
value: postgresql
- default: sub2api
edit: true
envKey: PANEL_DB_NAME
labelEn: Database Name
labelZh: 数据库名
label:
en: Database Name
zh: 数据库名
zh-hant: 資料庫名稱
ja: データベース名
ko: 데이터베이스 이름
ru: Имя базы данных
ms: Nama pangkalan data
pt-br: Nome do banco de dados
random: true
required: true
rule: paramCommon
type: text
- default: sub2api
edit: true
envKey: PANEL_DB_USER
labelEn: Database User
labelZh: 数据库用户
label:
en: Database User
zh: 数据库用户
zh-hant: 資料庫使用者
ja: データベースユーザー
ko: 데이터베이스 사용자
ru: Пользователь базы данных
ms: Nama pengguna pangkalan data
pt-br: Usuário do banco de dados
random: true
required: true
rule: paramCommon
type: text
- default: 5432
edit: true
envKey: PANEL_DB_PORT
labelEn: Database Port
labelZh: 数据库端口
label:
en: Database Port
zh: 数据库端口
zh-hant: 資料庫連接埠
ja: データベースポート
ko: 데이터베이스 포트
ru: Порт базы данных
ms: Port pangkalan data
pt-br: Porta do banco de dados
required: true
rule: paramPort
type: number
- default: ""
edit: true
envKey: PANEL_DB_USER_PASSWORD
labelEn: Database Password
labelZh: 数据库用户密码
label:
en: Database Password
zh: 数据库用户密码
zh-hant: 資料庫使用者密碼
ja: データベースパスワード
ko: 데이터베이스 비밀번호
ru: Пароль базы данных
ms: Kata laluan pangkalan data
pt-br: Senha do banco de dados
random: true
required: true
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: REDIS_HOST
key: redis
labelEn: Redis Service
labelZh: Redis服务
label:
en: Redis Service
zh: Redis服务
zh-hant: Redis 服務
ja: Redis サービス
ko: Redis 서비스
ru: Служба Redis
ms: Perkhidmatan Redis
pt-br: Serviço Redis
required: true
type: service
- default: 6379
edit: true
envKey: REDIS_PORT
labelEn: Redis Service Port
labelZh: Redis服务端口
label:
en: Redis Service Port
zh: Redis服务端口
zh-hant: Redis 服務連接埠
ja: Redis サービスポート
ko: Redis 서비스 포트
ru: Порт службы Redis
ms: Port Perkhidmatan Redis
pt-br: Porta do serviço Redis
required: true
rule: paramPort
type: number
- default: ""
edit: true
envKey: PANEL_REDIS_ROOT_PASSWORD
labelEn: Redis Password
labelZh: Redis 密码
label:
en: Redis Password
zh: Redis 密码
zh-hant: Redis 密碼
ja: Redis パスワード
ko: Redis 비밀번호
ru: Пароль Redis
ms: Kata laluan Redis
pt-br: Senha do Redis
random: true
required: true
type: password
- default: 0
edit: true
envKey: REDIS_DB
labelEn: Redis Database
labelZh: Redis 数据库
label:
en: Redis Database
zh: Redis 数据库
zh-hant: Redis 資料庫
ja: Redis データベース
ko: Redis 데이터베이스
ru: База данных Redis
ms: Pangkalan Data Redis
pt-br: Banco de dados Redis
required: true
type: number
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web Port
labelZh: Web 访问端口
label:
en: Web Port
zh: Web 访问端口
zh-hant: Web 訪問埠
ja: Webポート
ko: 웹 포트
ru: Веб-порт
ms: Port Web
pt-br: Porta Web
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 masa
pt-br: Fuso horário
required: true
type: text
- default: release
edit: true
envKey: SERVER_MODE
labelEn: Server Mode
labelZh: 服务模式
label:
en: Server Mode
zh: 服务模式
zh-hant: 服務模式
ja: サーバーモード
ko: 서버 모드
ru: Режим сервера
ms: Mod pelayan
pt-br: Modo do servidor
required: true
type: select
values:
- label: release
value: release
- label: debug
value: debug
- default: standard
edit: true
envKey: RUN_MODE
labelEn: Run Mode
labelZh: 运行模式
label:
en: Run Mode
zh: 运行模式
zh-hant: 運行模式
ja: 実行モード
ko: 실행 모드
ru: Режим работы
ms: Mod jalanan
pt-br: Modo de execução
required: true
type: select
values:
- label: standard
value: standard
- label: simple
value: simple
- default: admin@sub2api.local
edit: true
envKey: ADMIN_EMAIL
labelEn: Admin Email
labelZh: 管理员邮箱
label:
en: Admin Email
zh: 管理员邮箱
zh-hant: 管理員郵箱
ja: 管理者メール
ko: 관리자 이메일
ru: Email администратора
ms: E-mel pentadbir
pt-br: E-mail do administrador
required: true
type: text
- default: ""
edit: true
envKey: ADMIN_PASSWORD
labelEn: Admin Password
labelZh: 管理员密码
label:
en: Admin Password
zh: 管理员密码
zh-hant: 管理員密碼
ja: 管理者パスワード
ko: 관리자 비밀번호
ru: Пароль администратора
ms: Kata laluan pentadbir
pt-br: Senha do administrador
random: true
required: false
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: JWT_SECRET
labelEn: JWT Secret
labelZh: JWT 密钥
label:
en: JWT Secret
zh: JWT 密钥
zh-hant: JWT 金鑰
ja: JWT シークレット
ko: JWT 시크릿
ru: JWT-секрет
ms: Rahsia JWT
pt-br: Segredo JWT
random: true
required: true
type: password
- default: ""
edit: true
envKey: TOTP_ENCRYPTION_KEY
labelEn: TOTP Encryption Key
labelZh: TOTP 加密密钥
label:
en: TOTP Encryption Key
zh: TOTP 加密密钥
zh-hant: TOTP 加密金鑰
ja: TOTP 暗号化キー
ko: TOTP 암호화 키
ru: Ключ шифрования TOTP
ms: Kunci penyulitan TOTP
pt-br: Chave de criptografia TOTP
random: true
required: true
type: password
- default: ""
edit: true
envKey: UPDATE_PROXY_URL
labelEn: Update Proxy URL
labelZh: 更新代理地址
label:
en: Update Proxy URL
zh: 更新代理地址
zh-hant: 更新代理地址
ja: 更新プロキシ URL
ko: 업데이트 프록시 URL
ru: URL прокси для обновлений
ms: URL proksi kemas kini
pt-br: URL do proxy de atualização
required: false
rule: paramExtUrl
type: text
- default: ./data
edit: true
envKey: APP_DATA_DIR_1
labelEn: App Data Directory
labelZh: 应用数据目录
label:
en: App Data Directory
zh: 应用数据目录
zh-hant: 應用資料目錄
ja: アプリデータディレクトリ
ko: 앱 데이터 디렉터리
ru: Каталог данных приложения
ms: Direktori data aplikasi
pt-br: Diretório de dados da aplicação
required: true
type: text
View File
+46
View File
@@ -0,0 +1,46 @@
services:
sub2api:
image: "weishaw/sub2api:latest"
container_name: ${CONTAINER_NAME}
restart: always
networks:
- 1panel-network
environment:
- AUTO_SETUP=true
- SERVER_HOST=0.0.0.0
- SERVER_PORT=8080
- SERVER_MODE=${SERVER_MODE}
- RUN_MODE=${RUN_MODE}
- DATABASE_HOST=${PANEL_DB_HOST}
- DATABASE_PORT=${PANEL_DB_PORT}
- DATABASE_USER=${PANEL_DB_USER}
- DATABASE_PASSWORD=${PANEL_DB_USER_PASSWORD}
- DATABASE_DBNAME=${PANEL_DB_NAME}
- DATABASE_SSLMODE=disable
- REDIS_HOST=${REDIS_HOST}
- REDIS_PORT=${REDIS_PORT}
- REDIS_PASSWORD=${PANEL_REDIS_ROOT_PASSWORD}
- REDIS_DB=${REDIS_DB}
- ADMIN_EMAIL=${ADMIN_EMAIL}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRE_HOUR=24
- TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY}
- TZ=${TZ}
- UPDATE_PROXY_URL=${UPDATE_PROXY_URL:-}
ports:
- "${PANEL_APP_PORT_HTTP}:8080"
volumes:
- "${APP_DATA_DIR_1}:/app/data"
labels:
createdBy: "Apps"
healthcheck:
test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
1panel-network:
external: true
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 当前适配使用 1Panel 数据库 / Redis 依赖注入。
# 这里只初始化应用自身的数据目录。
mkdir -p "${APP_DATA_DIR_1:-./data}"
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 当前适配只卸载 Sub2API 容器本身。
# 数据库与 Redis 为 1Panel 依赖应用,不在此处删除。
docker-compose down --volumes
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
set -euo pipefail
# 升级时确保应用自身的数据目录存在。
# 数据库与 Redis 数据由 1Panel 依赖应用管理。
mkdir -p "${APP_DATA_DIR_1:-./data}"
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB