214 lines
6.0 KiB
Markdown
214 lines
6.0 KiB
Markdown
# openai_node
|
||
|
||
本地 **Ollama / OpenAI 兼容** 大模型中转网关:统一鉴权、多节点按模型调度、Web 管理面板与流量统计。
|
||
|
||
代码仓库:[https://git.bz121.com/dekun/openai_node.git](https://git.bz121.com/dekun/openai_node.git)
|
||
|
||
---
|
||
|
||
## 功能概览
|
||
|
||
| 模块 | 说明 |
|
||
|------|------|
|
||
| **OpenAI 兼容 API** | `POST /v1/chat/completions`,Bearer `sk-...` 鉴权,支持流式响应 |
|
||
| **多节点调度** | 按请求体中的 `model` 转发到不同机器/端口(`nodes.json`) |
|
||
| **Web 控制台** | 首页模型分布卡片、流量统计、系统设置、用户中心 |
|
||
| **访问统计** | 记录客户端 IP、Token 用量、按节点汇总(SQLite) |
|
||
| **健康检查** | 定时探测各节点 `/v1/models`,首页显示中文状态 |
|
||
|
||
---
|
||
|
||
## 架构示意
|
||
|
||
```
|
||
客户端 / Cursor / 脚本
|
||
│
|
||
▼
|
||
宝塔 Nginx(443/80)──反代──► VPS :8150(本网关)
|
||
│ │
|
||
│ ├─ 鉴权 / 统计 / Web
|
||
│ │
|
||
│ ┌────────────┼────────────┐
|
||
│ ▼ ▼ ▼
|
||
│ 127.0.0.1:3313 :3314 :3315 …(frp 映射)
|
||
│ │ │ │
|
||
│ PC-A Ollama PC-B Ollama PC-C Ollama
|
||
```
|
||
|
||
- **对外只暴露一个域名**,反代到网关 **8150**。
|
||
- 各家用/办公室电脑通过 **frp** 等内网穿透,把模型端口映射到 VPS 本机 `127.0.0.1:3313` 等。
|
||
- 网关在 **系统设置** 中维护「端口 ↔ 模型」关系,无需为每台机器单独配公网域名。
|
||
|
||
---
|
||
|
||
## 环境要求
|
||
|
||
- Python **3.10+**
|
||
- 上游服务:**Ollama**(或其它 OpenAI 兼容 HTTP API)
|
||
- 生产建议:**PM2** 守护进程;**宝塔** 或 Nginx 做 HTTPS 反代
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 1. 克隆仓库
|
||
|
||
```bash
|
||
git clone https://git.bz121.com/dekun/openai_node.git
|
||
cd openai_node
|
||
```
|
||
|
||
### 2. 安装依赖
|
||
|
||
```bash
|
||
python3 -m venv venv
|
||
source venv/bin/activate # Windows: .\venv\Scripts\Activate.ps1
|
||
pip install -r requirements.txt -U
|
||
```
|
||
|
||
### 3. 配置文件
|
||
|
||
```bash
|
||
cp gateway.json.example gateway.json
|
||
cp nodes.json.example nodes.json
|
||
```
|
||
|
||
编辑 **`gateway.json`**:
|
||
|
||
```json
|
||
{
|
||
"username": "admin",
|
||
"password": "你的强密码",
|
||
"api_key": ""
|
||
}
|
||
```
|
||
|
||
`api_key` 留空时,首次启动会自动生成 `sk-...` 并写回文件。
|
||
|
||
编辑 **`nodes.json`**(示例为 3 台节点,主机默认 `127.0.0.1`,端口 `3313–3315`):
|
||
|
||
- `models[].id` 必须与调用 API 时 JSON 里的 **`model` 字段完全一致**(Ollama 模型名)。
|
||
- `models[].label` 为 Web 卡片上的显示名。
|
||
|
||
### 4. 启动
|
||
|
||
```bash
|
||
export JWT_SECRET="请改为长随机字符串"
|
||
python -m uvicorn main:app --host 0.0.0.0 --port 8150
|
||
```
|
||
|
||
浏览器打开 `http://127.0.0.1:8150`:
|
||
|
||
| 路径 | 说明 |
|
||
|------|------|
|
||
| `/` | 首页:模型分布卡片 + 使用说明 |
|
||
| `/login` | 管理员登录 |
|
||
| `/settings` | 系统设置(节点/端口/模型,需登录) |
|
||
| `/stats` | 流量统计、IP 列表、Token 账单 |
|
||
| `/user` | 查看 / 复制 API Key |
|
||
|
||
---
|
||
|
||
## 调用示例
|
||
|
||
将 `https://你的域名` 换为实际地址(或 `http://IP:8150` 调试):
|
||
|
||
```bash
|
||
curl https://你的域名/v1/chat/completions \
|
||
-H "Authorization: Bearer sk-xxxx" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"model": "your-model-id-1",
|
||
"messages": [{"role": "user", "content": "你好"}],
|
||
"stream": true
|
||
}'
|
||
```
|
||
|
||
在 Cursor、OpenAI SDK 等客户端中:
|
||
|
||
- **Base URL**:`https://你的域名/v1`
|
||
- **API Key**:`gateway.json` 中的 `api_key` 或用户中心页面复制
|
||
|
||
---
|
||
|
||
## 配置说明
|
||
|
||
### gateway.json
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `username` | Web 登录用户名 |
|
||
| `password` | Web 登录密码(明文存储,请限制文件权限) |
|
||
| `api_key` | OpenAI 兼容 API Key,可自动生成 |
|
||
|
||
### nodes.json
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `id` | 节点唯一 ID(系统自动生成亦可) |
|
||
| `name` | 显示名称 |
|
||
| `host` | 上游主机,frp 场景填 **`127.0.0.1`** |
|
||
| `port` | 上游端口,如 **3313–3318** |
|
||
| `enabled` | 是否启用 |
|
||
| `max_concurrent` | 单节点最大并发请求数(建议 1) |
|
||
| `models` | `{ "id": "模型ID", "label": "显示名" }` 列表 |
|
||
|
||
也可在 Web **系统设置** 中增删改,保存后写入 `nodes.json`。
|
||
|
||
### 环境变量
|
||
|
||
| 变量 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `JWT_SECRET` | (弱默认值) | **生产必改**,Web 登录 JWT 签名 |
|
||
| `GATEWAY_PORT` | `8150` | 监听端口 |
|
||
| `GATEWAY_CONFIG` | `gateway.json` | 账号配置路径 |
|
||
| `NODES_CONFIG` | `nodes.json` | 节点配置路径 |
|
||
| `STATS_DB` | `gateway_stats.db` | 统计数据库路径 |
|
||
| `UPSTREAM_URL` | `http://127.0.0.1:10434` | **未配置 nodes 时** 的单机上流回退地址 |
|
||
| `APP_ROOT` | 空 | 反代子路径前缀,如 `/wg` |
|
||
|
||
---
|
||
|
||
## 节点状态(中文)
|
||
|
||
| 状态 | 含义 |
|
||
|------|------|
|
||
| 空闲 | 在线且可接受新请求 |
|
||
| 忙碌 | 已达 `max_concurrent` |
|
||
| 离线 | 健康检查未通过 |
|
||
| 未启用 | 节点在设置中关闭 |
|
||
| 异常 | 连接失败并带有错误信息 |
|
||
|
||
---
|
||
|
||
## 项目文件
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `main.py` | 网关主程序(API + Web 单文件) |
|
||
| `gateway.json.example` | 账号配置示例 |
|
||
| `nodes.json.example` | 多节点配置示例 |
|
||
| `requirements.txt` | Python 依赖 |
|
||
| `ecosystem.config.cjs` | PM2 配置 |
|
||
| `DEPLOY.md` | **生产部署文档**(宝塔 + frp + PM2) |
|
||
|
||
---
|
||
|
||
## 安全提示
|
||
|
||
- 勿将 `gateway.json`、`nodes.json`、`gateway_stats.db` 提交到公开仓库。
|
||
- 生产环境务必修改 **`JWT_SECRET`**,并为 `gateway.json` 设置严格文件权限(如 `chmod 600`)。
|
||
- 统计与设置接口需 Web 登录;API 调用使用 `sk-` Key,请勿混用。
|
||
|
||
---
|
||
|
||
## 生产部署
|
||
|
||
详见 **[DEPLOY.md](./DEPLOY.md)**(VPS、宝塔反代 8150、frp 多机、PM2)。
|
||
|
||
---
|
||
|
||
## 许可证
|
||
|
||
私有仓库,按团队内部约定使用。
|