Files
omniai-server/README.md
2026-06-02 13:14:10 +08:00

245 lines
6.4 KiB
Markdown

# OmniAI Key Management Server
API Key 池管理服务,支持多 Key 轮询、并发控制、自动排队。
## 部署到阿里云
### 1. 服务器准备
```bash
# 安装 Node.js 18+
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# 安装 PM2 (进程管理)
sudo npm install -g pm2
```
### 2. 上传代码
```bash
# 将 server/ 目录上传到服务器
scp -r server/ root@your-server:/opt/omniai-server/
```
### 3. 配置
```bash
cd /opt/omniai-server
cp .env.example .env
nano .env # 修改 JWT_SECRET、DEFAULT_ADMIN_PASSWORD 等配置
```
### 4. 安装 & 初始化
```bash
npm install
npm run init-db
```
### 5. 添加 Key
```bash
# 添加 Seedance Key (每个并发上限 10)
npm run add-key -- seedance sk-your-key-1 "Seedance 1号" 10
npm run add-key -- seedance sk-your-key-2 "Seedance 2号" 10
npm run add-key -- seedance sk-your-key-3 "Seedance 3号" 10
# 添加其他服务的 Key
npm run add-key -- grok sk-grok-key "Grok" 10
npm run add-key -- dashscope sk-dash-key "DashScope" 10
# 查看所有 Key
npm run list-keys
```
### 6. 添加用户
```bash
npm run add-user -- alice password123 user 30
npm run add-user -- bob password456 user 30
```
### 6.1 防控账号开通与封控
建议给外部/临时用户只开企业子账号,不下发任何本地 API Key,只让客户端通过 Key Server 登录、拉取远程配置和上报用量。
```bash
# 1) 用企业管理员账号注册员工账号,或由系统管理员调用接口创建企业用户。
# 2) 紧急封控:系统管理员禁用任意账号
curl -X PUT http://server:3600/api/admin/users/123 \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'
# 3) 企业管理员禁用本企业子账号
curl -X PUT http://server:3600/api/admin/sub-accounts/123 \
-H "Authorization: Bearer $ENTERPRISE_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'
```
禁用后,`/api/auth/me`、Key 租用、用量上报、云项目同步等受保护接口会拒绝该账号现有 Token。打受控包时可设置 `OMNIAI_DISABLE_PROJECT_EXPORT=1`,在主进程直接禁用项目导出 IPC;也可以在远程配置里下发 `securityPolicy.projectExportDisabled=true`,客户端同步配置后同样会锁定项目导出。
### 7. 启动服务
```bash
# 开发模式
npm run dev
# 生产模式 (PM2)
pm2 start src/index.js --name omniai-server
pm2 save
pm2 startup # 开机自启
```
### 8. 防火墙
```bash
# 阿里云安全组放开端口 3600 (或你配置的端口)
# 或使用 Nginx 反向代理到 80/443
```
## API 接口
### 认证
```bash
# 登录
curl -X POST http://server:3600/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"password123"}'
# → { "token": "eyJ...", "user": { "id": 1, "username": "alice" } }
```
### Key 获取/释放
```bash
# 获取一个 Key
curl -X POST http://server:3600/api/keys/acquire \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider":"seedance"}'
# → { "leaseToken": "uuid", "apiKey": "sk-xxx", "provider": "seedance" }
# 用完归还
curl -X POST http://server:3600/api/keys/release \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"leaseToken":"uuid"}'
# 查看状态
curl http://server:3600/api/keys/status?provider=seedance \
-H "Authorization: Bearer $TOKEN"
```
### 管理接口 (需 admin)
```bash
# 查看所有 Key
curl http://server:3600/api/admin/keys -H "Authorization: Bearer $ADMIN_TOKEN"
# 添加 Key
curl -X POST http://server:3600/api/admin/keys \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider":"seedance","api_key":"sk-new","label":"新Key","max_concurrency":10}'
# 禁用 Key
curl -X PUT http://server:3600/api/admin/keys/1 \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'
# 查看用量日志
curl http://server:3600/api/admin/usage?limit=50 -H "Authorization: Bearer $ADMIN_TOKEN"
```
## 导入配置
将客户端的 settings 模板导入为服务端配置(所有 API key + 模型设置):
```bash
npm run import-config -- ../resources/templates/settings-default-basic.txt default
```
这样 20 个客户端不需要手动配置任何 key,启动时自动从服务端拉取。
更新配置后,所有客户端下次启动会自动同步最新配置。
### 配置管理 API
```bash
# 获取当前配置
curl http://server:3600/api/config/profile?name=default \
-H "Authorization: Bearer $TOKEN"
# 更新配置 (需 admin)
curl -X PUT http://server:3600/api/config/profile \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"default","config":{"provider":"gemini","apiKey":"sk-xxx",...}}'
# 列出所有配置
curl http://server:3600/api/config/profiles \
-H "Authorization: Bearer $TOKEN"
```
## 客户端对接
Electron 客户端设置页只需填写:
- **服务器地址**: `http://your-server:3600`
- **用户名/密码**: 登录获取 Token
客户端启动时自动从服务端同步全部配置(API key、模型、端点等)。
生成视频时:
1. `POST /api/keys/acquire` → 申请并发额度
2. 直连 AI API 生成视频(用服务端下发的 key)
3. `POST /api/keys/release` → 释放额度
Key 集中管理在服务端,客户端不需要手动配置。
## 2026-04 Seedance 并发配置补充
当前客户端已经按两个独立 provider 申请槽位:
- `seedance-2.0`
- `seedance-2.0-fast`
为了保证 `Seedance 2.0``Seedance 2.0 Fast` 各自独立 `10` 并发,请按下面方式部署:
```bash
# 1. 初始化数据库
npm install
npm run init-db
# 2. 初始化两个独立池
npm run init-pools
# 3. 查看池状态
npm run list-keys
```
建议部署要求:
- `seedance-2.0` 总容量固定为 `10`
- `seedance-2.0-fast` 总容量固定为 `10`
- 两个 provider 不能混用,也不能共用同一池
- 当某个 provider 达到上限时,客户端会显示“排队中”
获取槽位示例:
```bash
curl -X POST http://server:3600/api/keys/acquire \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider":"seedance-2.0"}'
curl -X POST http://server:3600/api/keys/acquire \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider":"seedance-2.0-fast"}'
```