# 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"}' ```