全合一 Docker 镜像 — Sub2API + PostgreSQL + Redis 运行在单个容器中。
GitHub: github.com/Wei-Shaw/sub2api
Docker Hub: host1syan/sub2api
Sub2API 是一个 AI API 网关平台,用于分管理和分发 AI 产品订阅的 API 配额。用户通过平台生成的 API Key 访问上游 AI 服务,平台负责身份验证、计费、负载均衡和请求转发。
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
打开浏览器访问 http://localhost:8080。管理员密码会自动生成,查看方式:
docker logs sub2api | grep -i "admin password"
mkdir sub2api && cd sub2api
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
sub2api:
image: host1syan/sub2api:latest
container_name: sub2api
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- sub2api_data:/app/data
healthcheck:
test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
volumes:
sub2api_data:
EOF
docker compose up -d
| 变量名 | 默认值 | 说明 |
|---|---|---|
SERVER_PORT | 8080 | Web 界面端口 |
ADMIN_EMAIL | [email protected] | 管理员登录邮箱 |
ADMIN_PASSWORD | (自动生成) | 管理员密码。设置一次即可固定,不设置则自动生成 |
DATABASE_PASSWORD | (自动生成) | PostgreSQL 密码。保存到 /app/data/all-in-one-secrets.env |
DATABASE_DBNAME | sub2api | PostgreSQL 数据库名 |
DATABASE_USER | sub2api | PostgreSQL 用户名 |
DATABASE_PORT | 5432 | PostgreSQL 端口 |
REDIS_PORT | 6379 | Redis 端口 |
REDIS_PASSWORD | (空) | Redis 密码(可选) |
JWT_SECRET | (自动生成) | JWT 签名密钥。建议设置固定值 |
TOTP_ENCRYPTION_KEY | (自动生成) | TOTP 加密密钥。建议设置固定值 |
TZ | Asia/Shanghai | 容器时区 |
RUN_MODE | standard | standard = 完整 SaaS 功能;simple = 内部使用 |
SERVER_MODE | release | release 或 debug |
AUTO_SETUP | true | 首次运行时自动初始化数据库和管理员 |
所有数据存储在 /app/data 下。务必挂载此卷。
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
首次启动时,系统会在以下路径自动生成密钥文件:
/app/data/all-in-one-secrets.env
该文件包含自动生成的 DATABASE_PASSWORD、JWT_SECRET 和 TOTP_ENCRYPTION_KEY。迁移时请备份此文件。
"全合一"镜像将三个服务打包在一个容器中:
| 服务 | 说明 |
|---|---|
| Sub2API | Go 后端 + 内嵌 Vue 前端 |
| PostgreSQL 18 | 数据库。首次启动时自动初始化 |
| Redis | 缓存/消息队列。首次启动时自动启动 |
首次启动时,入口脚本会执行:
AUTO_SETUP=true 启动 Sub2API后续启动时跳过初始化,直接使用现有数据。
docker pull host1syan/sub2api:latest
# 停止并删除旧容器(数据卷保留)
docker rm -f sub2api
# 使用新镜像重新启动
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
所有数据在 /app/data 目录下:
# 备份
docker run --rm -v sub2api_data:/data -v $(pwd):/backup alpine \
tar czf /backup/sub2api-backup.tar.gz -C /data .
# 恢复
docker run --rm -v sub2api_data:/data -v $(pwd):/backup alpine \
tar xzf /backup/sub2api-backup.tar.gz -C /data
# 删除容器和数据,然后重新启动
docker rm -f sub2api
docker volume rm sub2api_data
docker run -d --name sub2api -p 8080:8080 -v sub2api_data:/app/data host1syan/sub2api:latest
docker logs sub2api | grep -i "admin password"
docker exec -it sub2api sh -c "su-exec sub2api pg_isready -p 5432"
docker exec -it sub2api sh -c "redis-cli -p 6379 ping"
| 平台 | 账号类型 |
|---|---|
| OpenAI | API Key、OAuth(ChatGPT)、Codex Session |
| Anthropic | API Key、OAuth(Claude)、Setup Token |
| Google Gemini | API Key、OAuth(Code Assist) |
| 组件 | 技术 |
|---|---|
| 后端 | Go 1.25+、Gin、Ent ORM |
| 前端 | Vue 3.4+、Vite 5+、TailwindCSS |
| 数据库 | PostgreSQL 18(Alpine) |
| 缓存 | Redis(Alpine) |
| 基础镜像 | Alpine 3.21 |
使用本项目的风险由用户自行承担。使用前请审阅上游 AI 服务提供商的用户协议。作者不对因使用本项目而导致的账号封禁、服务中断、数据丢失或其他任何直接或间接损害承担责任。
All-in-One Docker Image — Sub2API + PostgreSQL + Redis in a single container.
GitHub: github.com/Wei-Shaw/sub2api
Docker Hub: host1syan/sub2api
Sub2API is an AI API gateway platform designed to distribute and manage API quotas from AI product subscriptions. Users access upstream AI services through platform-generated API Keys, while the platform handles authentication, billing, load balancing, and request forwarding.
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
Open http://localhost:8080 in your browser. The admin password will be auto-generated. Check the container logs:
docker logs sub2api | grep -i "admin password"
mkdir sub2api && cd sub2api
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
sub2api:
image: host1syan/sub2api:latest
container_name: sub2api
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- sub2api_data:/app/data
healthcheck:
test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
volumes:
sub2api_data:
EOF
docker compose up -d
| Variable | Default | Description |
|---|---|---|
SERVER_PORT | 8080 | Web UI port |
ADMIN_EMAIL | [email protected] | Admin login email |
ADMIN_PASSWORD | (auto-generated) | Admin password. Set once to fix, omitted to auto-generate |
DATABASE_PASSWORD | (auto-generated) | PostgreSQL password. Saved to /app/data/all-in-one-secrets.env |
DATABASE_DBNAME | sub2api | PostgreSQL database name |
DATABASE_USER | sub2api | PostgreSQL username |
DATABASE_PORT | 5432 | PostgreSQL port |
REDIS_PORT | 6379 | Redis port |
REDIS_PASSWORD | (empty) | Redis password (optional) |
JWT_SECRET | (auto-generated) | JWT signing secret. Fixed value recommended |
TOTP_ENCRYPTION_KEY | (auto-generated) | TOTP encryption key. Fixed value recommended |
TZ | Asia/Shanghai | Container timezone |
RUN_MODE | standard | standard = full SaaS; simple = internal use |
SERVER_MODE | release | release or debug |
AUTO_SETUP | true | Auto-initialize database and admin on first run |
All data is stored under /app/data. Always mount this volume.
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
When you first start the container, a secrets file is auto-generated at:
/app/data/all-in-one-secrets.env
This file contains the auto-generated DATABASE_PASSWORD, JWT_SECRET, and TOTP_ENCRYPTION_KEY. Back up this file when migrating.
This "all-in-one" image bundles three services into one container:
| Service | Description |
|---|---|
| Sub2API | Go backend + embedded Vue frontend |
| PostgreSQL 18 | Database. Initialized automatically on first boot |
| Redis | Cache/queue. Started automatically on first boot |
On first start, the entrypoint script will:
AUTO_SETUP=trueOn subsequent starts, it skips initialization and uses existing data.
docker pull host1syan/sub2api:latest
# Stop and remove old container (data volume is kept)
docker rm -f sub2api
# Start with the new image
docker run -d \
--name sub2api \
-p 8080:8080 \
-v sub2api_data:/app/data \
host1syan/sub2api:latest
All data lives in /app/data:
# Backup
docker run --rm -v sub2api_data:/data -v $(pwd):/backup alpine \
tar czf /backup/sub2api-backup.tar.gz -C /data .
# Restore
docker run --rm -v sub2api_data:/data -v $(pwd):/backup alpine \
tar xzf /backup/sub2api-backup.tar.gz -C /data
# Delete the container and its data, then restart fresh
docker rm -f sub2api
docker volume rm sub2api_data
docker run -d --name sub2api -p 8080:8080 -v sub2api_data:/app/data host1syan/sub2api:latest
docker logs sub2api | grep -i "admin password"
docker exec -it sub2api sh -c "su-exec sub2api pg_isready -p 5432"
docker exec -it sub2api sh -c "redis-cli -p 6379 ping"
| Platform | Account Type |
|---|---|
| OpenAI | API Key, OAuth (ChatGPT), Codex Session |
| Anthropic | API Key, OAuth (Claude), Setup Token |
| Google Gemini | API Key, OAuth (Code Assist) |
| Component | Technology |
|---|---|
| Backend | Go 1.25+, Gin, Ent ORM |
| Frontend | Vue 3.4+, Vite 5+, TailwindCSS |
| Database | PostgreSQL 18 (Alpine) |
| Cache | Redis (Alpine) |
| Base Image | Alpine 3.21 |
Use this project at your own risk. Please review the terms of service of upstream AI providers before use. All risks are borne solely by the user.
Content type
Image
Digest
sha256:109da78d2…
Size
138.3 MB
Last updated
3 months ago
docker pull host1syan/sub2api