File size: 5,671 Bytes
f1f1838
2dca287
3990f1f
 
f1f1838
3990f1f
f1f1838
 
 
2dca287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
---
title: sub2api API Gateway
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
pinned: false
---

# sub2api API Gateway

这是一个中文化、可公开部署的 sub2api 中转站模板,用于 Hugging Face Spaces + Supabase Postgres。应用本体来自 `weishaw/sub2api:latest`,本仓库只保存启动脚本和部署说明;数据库使用 Supabase Postgres 持久化。

公开给大家用时,推荐方式是:

- Hugging Face Space 设置为 `Public`,让大家都能打开网页。
- 管理员密码、Admin API Key、上游渠道 Key 全部只放在后台或 HF Secrets,绝不公开。
- 给普通用户发放 sub2api 的用户 API Key,并按用户/分组设置倍率、额度和可用模型。
- 用户用自己的普通 API Key 调用 `/v1` 接口,不使用管理员 Key。

默认情况下,如果没有配置 Supabase 数据库,Space 会使用容器内临时 PostgreSQL 先启动,方便你马上打开后台测试。临时库会在 Space 重启、迁移或休眠恢复时丢数据;正式给大家长期使用时,请配置 Supabase。

## 文件

- `Dockerfile`: HF Space Docker 入口。
- `start-space.sh`: 从 HF Secrets 准备运行环境,启动 Redis/Postgres,并交给应用自动初始化。
- `.env.example`: 需要配置到 HF Space Secrets 的变量清单。
- `scripts/check-supabase.mjs`: 部署前测试 Supabase Postgres 连接。
- `PUBLIC_USAGE.md`: 发给普通用户看的中文使用说明。
- `ADMIN_SETUP.md`: 管理员上线、发 key、控额度的中文操作清单。

## 必填 Secrets

在 Hugging Face Space 的 `Settings -> Variables and secrets` 中添加:

- `ADMIN_PASSWORD`
- `JWT_SECRET`
- `TOTP_ENCRYPTION_KEY`

如果要持久保存用户、账号、密钥和用量记录,再添加 Supabase Postgres:

- `DATABASE_HOST`
- `DATABASE_USER`
- `DATABASE_PASSWORD`

推荐同时添加:

- `DATABASE_PORT=5432`
- `DATABASE_DBNAME=postgres`
- `DATABASE_SSLMODE=require`
- `ADMIN_EMAIL=2691539771@qq.com`

`JWT_SECRET` 建议至少 32 位随机字符。`TOTP_ENCRYPTION_KEY` 需要使用十六进制随机字符串,推荐用 `scripts/generate-secrets.ps1` 生成。

## 部署到 Hugging Face Space

如果本机还没有 Hugging Face CLI,先安装:

```powershell
python -m pip install -U huggingface_hub
hf auth login
```

登录并确认工具可用:

```powershell
hf auth whoami
git --version
```

创建 Docker Space。想让大家都可以用,创建时 Visibility 选择 `Public````powershell
hf repo create <space-name> --type space --space_sdk docker
git clone https://huggingface.co/spaces/<owner>/<space-name>
Copy-Item Dockerfile,start-space.sh,.gitignore,.gitattributes,.env.example,README.md,PUBLIC_USAGE.md,ADMIN_SETUP.md,package.json <space-repo>\
Copy-Item -Recurse scripts <space-repo>\
Set-Location <space-repo>
git add .
git commit -m "Deploy sub2api on HF Space"
git push
```

如果本机没有 `hf` CLI,也可以用本仓库自带脚本。先在 Hugging Face 创建一个 `Write` 权限 token,然后在 PowerShell 执行:

```powershell
$env:HF_TOKEN = "hf_xxx"
.\scripts\deploy-hf-space.ps1 -Owner liuyiyang1439 -SpaceName sub2api
```

脚本会创建公开 Docker Space,并把当前仓库文件推送到:

```text
https://huggingface.co/spaces/liuyiyang1439/sub2api
```

配置 Secrets 后重启 Space。健康状态应满足:

- 容器监听 `0.0.0.0:7860`
- `/health` 返回成功
- 日志没有缺少 Secrets 或数据库连接错误

本模板会在启动时写入一组适合 Hugging Face 小机器的运行参数:降低连接池和 WebSocket 池规模、减少失败账号切换等待、把 usage 记录队列溢出策略设为同步回写。这样后台用量更不容易漏记,免费 CPU 上的卡顿也会少一些。需要覆盖时,可在 Space Secrets 中设置 `.env.example` 里的可选性能变量。

查看日志:

```powershell
hf spaces logs <owner>/<space> -n 300
```

## 生成随机密钥

在 PowerShell 中执行:

```powershell
.\scripts\generate-secrets.ps1
```

把输出的 `JWT_SECRET``TOTP_ENCRYPTION_KEY` 添加到 HF Space Secrets。`ADMIN_PASSWORD` 请单独设置为你自己保存好的强密码。

## 测试 Supabase 连接

本地创建 `.env`,填入 `.env.example` 中的数据库变量后执行:

```powershell
npm install pg dotenv
node scripts/check-supabase.mjs
```

脚本只会测试连接并打印数据库名和时间,不会写入数据。

## Admin API 验证

在 sub2api 管理后台生成全局 Admin API Key 后,可用只读接口验证:

```powershell
$headers = @{ "x-api-key" = "<admin-api-key>"; "accept" = "application/json" }
Invoke-RestMethod `
  -Uri "https://<owner>-<space>.hf.space/api/v1/admin/dashboard/stats" `
  -Headers $headers `
  -Method GET
```

全局 Admin API Key 只用于管理接口,不要发给客户当模型调用 key 使用。客户调用模型时使用 sub2api API Key 管理里创建的普通用户 key。

## 给普通用户的调用地址

部署成功后,普通用户的 Base URL 一般是:

```text
https://<owner>-<space>.hf.space/v1
```

其中 `<owner>` 是你的 Hugging Face 用户名或组织名,`<space>` 是 Space 名称。你当前页面显示的 Owner 是 `liuyiyang1439`,Space 名叫 `sub2api` 时,公开网页就是:

```text
https://liuyiyang1439-sub2api.hf.space
```

普通用户调用接口时使用:

```text
https://liuyiyang1439-sub2api.hf.space/v1
```

注意:`.hf.space` 是 Hugging Face 固定后缀,不能改成别的。

普通用户需要使用你发放的用户 API Key:

```http
Authorization: Bearer <user-api-key>
```

可以直接把 `PUBLIC_USAGE.md` 发给用户。