diff --git a/apps/metapi/1.3.0/.env.sample b/apps/metapi/1.3.0/.env.sample new file mode 100644 index 000000000..5a3d56f0a --- /dev/null +++ b/apps/metapi/1.3.0/.env.sample @@ -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" diff --git a/apps/metapi/1.3.0/data.yml b/apps/metapi/1.3.0/data.yml new file mode 100644 index 000000000..bc64247e0 --- /dev/null +++ b/apps/metapi/1.3.0/data.yml @@ -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 diff --git a/apps/metapi/1.3.0/data/.gitkeep b/apps/metapi/1.3.0/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/metapi/1.3.0/docker-compose.yml b/apps/metapi/1.3.0/docker-compose.yml new file mode 100644 index 000000000..8c7e89b58 --- /dev/null +++ b/apps/metapi/1.3.0/docker-compose.yml @@ -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" diff --git a/apps/metapi/1.3.0/scripts/init.sh b/apps/metapi/1.3.0/scripts/init.sh new file mode 100755 index 000000000..9d715d682 --- /dev/null +++ b/apps/metapi/1.3.0/scripts/init.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +mkdir -p "${APP_DATA_DIR:-./data}" diff --git a/apps/metapi/1.3.0/scripts/uninstall.sh b/apps/metapi/1.3.0/scripts/uninstall.sh new file mode 100755 index 000000000..ab8a8d674 --- /dev/null +++ b/apps/metapi/1.3.0/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down --volumes diff --git a/apps/metapi/1.3.0/scripts/upgrade.sh b/apps/metapi/1.3.0/scripts/upgrade.sh new file mode 100755 index 000000000..eb7cd4346 --- /dev/null +++ b/apps/metapi/1.3.0/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +# Reserved for future migrations. +exit 0 diff --git a/apps/metapi/README.md b/apps/metapi/README.md new file mode 100644 index 000000000..1ab6a3b3b --- /dev/null +++ b/apps/metapi/README.md @@ -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 的本地应用包,已按商店应用结构整理,重点保留安装表单、数据挂载和运行参数的面板化配置体验。 diff --git a/apps/metapi/data.yml b/apps/metapi/data.yml new file mode 100644 index 000000000..9b04ad943 --- /dev/null +++ b/apps/metapi/data.yml @@ -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 diff --git a/apps/metapi/latest/.env.sample b/apps/metapi/latest/.env.sample new file mode 100644 index 000000000..5a3d56f0a --- /dev/null +++ b/apps/metapi/latest/.env.sample @@ -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" diff --git a/apps/metapi/latest/data.yml b/apps/metapi/latest/data.yml new file mode 100644 index 000000000..bc64247e0 --- /dev/null +++ b/apps/metapi/latest/data.yml @@ -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 diff --git a/apps/metapi/latest/data/.gitkeep b/apps/metapi/latest/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/metapi/latest/docker-compose.yml b/apps/metapi/latest/docker-compose.yml new file mode 100644 index 000000000..8c7e89b58 --- /dev/null +++ b/apps/metapi/latest/docker-compose.yml @@ -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" diff --git a/apps/metapi/latest/scripts/init.sh b/apps/metapi/latest/scripts/init.sh new file mode 100755 index 000000000..9d715d682 --- /dev/null +++ b/apps/metapi/latest/scripts/init.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +mkdir -p "${APP_DATA_DIR:-./data}" diff --git a/apps/metapi/latest/scripts/uninstall.sh b/apps/metapi/latest/scripts/uninstall.sh new file mode 100755 index 000000000..ab8a8d674 --- /dev/null +++ b/apps/metapi/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down --volumes diff --git a/apps/metapi/latest/scripts/upgrade.sh b/apps/metapi/latest/scripts/upgrade.sh new file mode 100755 index 000000000..eb7cd4346 --- /dev/null +++ b/apps/metapi/latest/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +# Reserved for future migrations. +exit 0 diff --git a/apps/metapi/logo.png b/apps/metapi/logo.png new file mode 100755 index 000000000..3685399ed Binary files /dev/null and b/apps/metapi/logo.png differ diff --git a/apps/sub2api/0.1.112/.env.sample b/apps/sub2api/0.1.112/.env.sample new file mode 100644 index 000000000..88ba30f7b --- /dev/null +++ b/apps/sub2api/0.1.112/.env.sample @@ -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" diff --git a/apps/sub2api/0.1.112/data.yml b/apps/sub2api/0.1.112/data.yml new file mode 100644 index 000000000..e3dfe8d8f --- /dev/null +++ b/apps/sub2api/0.1.112/data.yml @@ -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 diff --git a/apps/sub2api/0.1.112/data/.gitkeep b/apps/sub2api/0.1.112/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/sub2api/0.1.112/docker-compose.yml b/apps/sub2api/0.1.112/docker-compose.yml new file mode 100644 index 000000000..7034e131c --- /dev/null +++ b/apps/sub2api/0.1.112/docker-compose.yml @@ -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 diff --git a/apps/sub2api/0.1.112/scripts/init.sh b/apps/sub2api/0.1.112/scripts/init.sh new file mode 100755 index 000000000..51bfe1764 --- /dev/null +++ b/apps/sub2api/0.1.112/scripts/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 当前适配使用 1Panel 数据库 / Redis 依赖注入。 +# 这里只初始化应用自身的数据目录。 +mkdir -p "${APP_DATA_DIR_1:-./data}" diff --git a/apps/sub2api/0.1.112/scripts/uninstall.sh b/apps/sub2api/0.1.112/scripts/uninstall.sh new file mode 100755 index 000000000..20a0bf525 --- /dev/null +++ b/apps/sub2api/0.1.112/scripts/uninstall.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 当前适配只卸载 Sub2API 容器本身。 +# 数据库与 Redis 为 1Panel 依赖应用,不在此处删除。 +docker-compose down --volumes diff --git a/apps/sub2api/0.1.112/scripts/upgrade.sh b/apps/sub2api/0.1.112/scripts/upgrade.sh new file mode 100755 index 000000000..622a93268 --- /dev/null +++ b/apps/sub2api/0.1.112/scripts/upgrade.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 升级时确保应用自身的数据目录存在。 +# 数据库与 Redis 数据由 1Panel 依赖应用管理。 +mkdir -p "${APP_DATA_DIR_1:-./data}" diff --git a/apps/sub2api/README.md b/apps/sub2api/README.md new file mode 100644 index 000000000..968378846 --- /dev/null +++ b/apps/sub2api/README.md @@ -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` 和上游文档继续扩展 diff --git a/apps/sub2api/data.yml b/apps/sub2api/data.yml new file mode 100644 index 000000000..c9f9c018b --- /dev/null +++ b/apps/sub2api/data.yml @@ -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 diff --git a/apps/sub2api/latest/.env.sample b/apps/sub2api/latest/.env.sample new file mode 100644 index 000000000..88ba30f7b --- /dev/null +++ b/apps/sub2api/latest/.env.sample @@ -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" diff --git a/apps/sub2api/latest/data.yml b/apps/sub2api/latest/data.yml new file mode 100644 index 000000000..e3dfe8d8f --- /dev/null +++ b/apps/sub2api/latest/data.yml @@ -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 diff --git a/apps/sub2api/latest/data/.gitkeep b/apps/sub2api/latest/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/sub2api/latest/docker-compose.yml b/apps/sub2api/latest/docker-compose.yml new file mode 100644 index 000000000..98df5405d --- /dev/null +++ b/apps/sub2api/latest/docker-compose.yml @@ -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 diff --git a/apps/sub2api/latest/scripts/init.sh b/apps/sub2api/latest/scripts/init.sh new file mode 100755 index 000000000..51bfe1764 --- /dev/null +++ b/apps/sub2api/latest/scripts/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 当前适配使用 1Panel 数据库 / Redis 依赖注入。 +# 这里只初始化应用自身的数据目录。 +mkdir -p "${APP_DATA_DIR_1:-./data}" diff --git a/apps/sub2api/latest/scripts/uninstall.sh b/apps/sub2api/latest/scripts/uninstall.sh new file mode 100755 index 000000000..20a0bf525 --- /dev/null +++ b/apps/sub2api/latest/scripts/uninstall.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 当前适配只卸载 Sub2API 容器本身。 +# 数据库与 Redis 为 1Panel 依赖应用,不在此处删除。 +docker-compose down --volumes diff --git a/apps/sub2api/latest/scripts/upgrade.sh b/apps/sub2api/latest/scripts/upgrade.sh new file mode 100755 index 000000000..622a93268 --- /dev/null +++ b/apps/sub2api/latest/scripts/upgrade.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +# 升级时确保应用自身的数据目录存在。 +# 数据库与 Redis 数据由 1Panel 依赖应用管理。 +mkdir -p "${APP_DATA_DIR_1:-./data}" diff --git a/apps/sub2api/logo.png b/apps/sub2api/logo.png new file mode 100644 index 000000000..7a5481d9a Binary files /dev/null and b/apps/sub2api/logo.png differ