File size: 5,350 Bytes
0208fd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
<!-- 适配版本: Grok2API v3.0.7 + HF entrypoint -->

# 部署到 Hugging Face Spaces(个人使用)

本仓库已适配 **Docker Space**:无需挂载 `config.yaml`,用 Space Secrets 即可启动。

> 仅供个人学习研究。请遵守 Grok 使用条款与当地法律;不要把管理员密码、API Key、账号凭据写进公开 README。

## 1. 创建 Space

1. 打开 [Hugging Face Spaces](https://huggingface.co/spaces)
2. **Create new Space**
3. SDK 选 **Docker**
4. 可见性建议 **Private**(个人用)
5. 硬件:**CPU basic** 通常够用(个人低频)

## 2. 推送代码

把本仓库推到该 Space 的 Git 仓库(HF 会按根目录 `Dockerfile` 构建)。

## 3. 配置 Secrets(必须)

在 Space 页面:**Settings → Variables and secrets → New secret**

| Secret 名称 | 是否必须 | 说明 |
| --- | --- | --- |
| `BOOTSTRAP_ADMIN_PASSWORD` | **必须** | 管理端初始密码(强密码) |
| `JWT_SECRET` | 强烈建议 | ≥32 字符随机串;不设则首次自动生成并写入数据目录 |
| `CREDENTIAL_ENCRYPTION_KEY` | 强烈建议 | `openssl rand -base64 32`**一旦写入账号后不要更换** |

可选:

| 名称 | 说明 |
| --- | --- |
| `BOOTSTRAP_ADMIN_USERNAME` | 默认 `admin` |
| `PUBLIC_API_BASE_URL` | 一般不用;HF 会注入 `SPACE_HOST` 并自动拼 `https://...` |
| `SECURE_COOKIES` | HF 默认 `true`;几乎不用改 |
| `DATABASE_DRIVER` | 默认 `sqlite` |
| `POSTGRES_DSN` | 仅当 `DATABASE_DRIVER=postgres` |
| `GROK2API_DATA_DIR` | 数据目录,默认优先 `/data`(HF 持久盘)再 `/app/data` |
| `PORT` | HF 通常注入;未注入时 env 模式会监听 `7860` |

本地生成密钥示例:

```bash
openssl rand -hex 32
openssl rand -base64 32
```

## 4. 启动与登录

1. 等待 Space **Building / Running**
2. 打开 Space 地址(形如 `https://<user>-<space>.hf.space`3. 使用 `admin` + 你设的 `BOOTSTRAP_ADMIN_PASSWORD` 登录
4. 导入上游账号 → 创建客户端密钥 `g2a_...` → 调用 `/v1/*`

健康检查:`https://你的域名/healthz`

## 5. 数据与休眠(个人用必看)

| 点 | 说明 |
| --- | --- |
| 免费 Space 休眠 | 闲置会 sleep,首次访问冷启动较慢;流式长请求可能中断 |
| 无持久盘 | 重启可能丢 SQLite / 媒体 / 自动生成的密钥 |
| 有 Persistent Storage | 把盘挂到 `/data`;本入口会自动把库和媒体写到 `/data` |
| 密钥稳定性 | 请把 `JWT_SECRET``CREDENTIAL_ENCRYPTION_KEY` 固定写在 Secrets 里,避免重建后无法解密旧账号 |

个人建议:

1. Space 设为 **Private**
2. 配齐三个 Secrets(密码 + JWT + 加密密钥)
3. 尽量开通 **Persistent Storage** 挂到 `/data`
4. 不要公开分享管理端密码和 `g2a_` 密钥

## 6. 环境变量一览

| 变量 | 默认 | 作用 |
| --- | --- | --- |
| `BOOTSTRAP_ADMIN_PASSWORD` | (空) | env 模式必需 |
| `BOOTSTRAP_ADMIN_USERNAME` | `admin` | 初始管理员用户名 |
| `JWT_SECRET` / `GROK2API_JWT_SECRET` | 自动生成 | JWT 签名密钥 |
| `CREDENTIAL_ENCRYPTION_KEY` / `GROK2API_CREDENTIAL_ENCRYPTION_KEY` | 自动生成 | 凭据 AES 密钥(Base64 32 字节) |
| `PORT` | HF 注入 / 否则 7860 | 监听端口 |
| `GROK2API_LISTEN` | (空) | 覆盖监听,如 `0.0.0.0:7860` |
| `PUBLIC_API_BASE_URL` | `https://$SPACE_HOST` | 文档里的公开 API 地址 |
| `DATABASE_DRIVER` | `sqlite` | `sqlite``postgres` |
| `SQLITE_PATH` | `$data/backend.db` | SQLite 路径 |
| `MEDIA_PATH` | `$data/media` | 媒体目录 |
| `GROK2API_DATA_DIR` | `/data``/app/data` | 数据根目录 |
| `SECURE_COOKIES` | HF 下 `true` | 管理端 Cookie Secure |
| `SWAGGER_ENABLED` | `false` | 是否开 Swagger |
| `GROK2API_CONFIG_SOURCE` | `/run/grok2api/config.yaml` | 若存在该文件则优先用挂载配置(Compose 兼容) |

兼容原有 Docker Compose:继续挂载 `config.yaml``/run/grok2api/config.yaml` 即可,行为与以前一致。

## 7. 调用示例

```bash
export GROK2API_API_KEY="g2a_xxx_xxx"
export BASE="https://你的用户名-空间名.hf.space"

curl "$BASE/v1/chat/completions" \
  -H "Authorization: Bearer $GROK2API_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-chat-auto",
    "messages": [{"role":"user","content":"你好"}],
    "stream": false
  }'
```

## 8. 常见问题

**构建失败 / Go 1.26**  
HF 构建机需能拉取 `golang:1.26-alpine``node:22-alpine`。若镜像源慢,可稍后重试。

**一直无法打开管理端**  
看 Space Logs:是否缺少 `BOOTSTRAP_ADMIN_PASSWORD`;是否仍卡在 Building。

**登录后 Cookie 异常**  
确认走 HTTPS(HF 默认是),不要手动把 `SECURE_COOKIES=false`**账号导入后重启全部失效**  
多半是加密密钥变了或数据目录被清空。固定 Secrets,并使用持久盘 `/data`**上游请求失败 / 风控**  
HF 出口 IP 可能不稳定。个人用可在管理端「设置 → 出口代理」配置你自己的 HTTP/SOCKS 代理(HF 上无法跑 WARP 的 `NET_ADMIN` 方案)。

## 9. 与本地 Compose 的关系

| 方式 | 配置 | 端口 |
| --- | --- | --- |
| Docker Compose | 挂载 `config.yaml` | `8000` |
| Hugging Face | Secrets / 环境变量 | `7860``$PORT` |

同一套镜像两种模式都支持。