# GPT2API Node - 部署文档

## 🎉 系统功能

### 核心功能
- ✅ OpenAI Codex 反向代理服务
- ✅ 完整的 Web 管理后台
- ✅ 多账号管理和批量操作
- ✅ 自动 Token 刷新机制
- ✅ 负载均衡（轮询/随机/最少使用）
- ✅ API Key 管理和认证
- ✅ 请求统计和数据分析
- ✅ 实时活动记录

### 管理后台功能

#### 1. 仪表盘
- 系统概览和实时统计
- API Keys 数量
- Token 账号数量
- 今日请求数和成功率
- 最近活动记录（API请求、账号添加等）

#### 2. API Keys 管理
- 创建和管理 API Keys
- 查看使用统计
- 启用/禁用 API Key
- 删除 API Key

#### 3. 账号管理
- **批量导入 Token**（支持 JSON 文件和多文件）
- **批量删除账号**（支持多选）
- 手动添加账号
- 查看账号额度和使用情况
- 刷新账号额度（单个/全部）
- 负载均衡策略配置
- 账号总数实时显示

#### 4. 数据分析
- **请求量趋势图表**（基于真实数据）
- 模型使用分布
- 账号详细统计（带滚动条）
- API 请求日志（带滚动条）
- 支持时间范围筛选（24小时/7天/30天）

#### 5. 系统设置
- 修改管理员密码
- 负载均衡策略设置
- GitHub 项目链接

## 🚀 快速部署

### 1. 环境要求
- Node.js 16+ 
- npm 或 yarn

### 2. 安装步骤

```bash
# 克隆项目
git clone https://github.com/lulistart/gpt2api-node.git
cd gpt2api-node

# 安装依赖
npm install

# 初始化数据库
npm run init-db

# 启动服务
npm start
```

### 3. 访问管理后台

打开浏览器访问：`http://localhost:3000/admin`

默认管理员账户：
- 用户名：`admin`
- 密码：`admin123`

**重要**：首次登录后请立即修改密码！

## 📁 项目结构

```
gpt2api-node/
├── src/
│   ├── config/
│   │   └── database.js          # 数据库配置和初始化
│   ├── middleware/
│   │   └── auth.js              # 认证中间件
│   ├── models/
│   │   └── index.js             # 数据模型（User、ApiKey、Token、ApiLog）
│   ├── routes/
│   │   ├── auth.js              # 认证路由（登录、登出、修改密码）
│   │   ├── apiKeys.js           # API Keys 管理路由
│   │   ├── tokens.js            # Tokens 管理路由（含批量删除）
│   │   ├── stats.js             # 统计路由（含最近活动）
│   │   └── settings.js          # 设置路由
│   ├── scripts/
│   │   └── initDatabase.js      # 数据库初始化脚本
│   ├── index.js                 # 主入口文件
│   ├── tokenManager.js          # Token 管理模块
│   └── proxyHandler.js          # 代理处理模块
├── public/
│   └── admin/
│       ├── login.html           # 登录页面
│       ├── index.html           # 管理后台主页
│       └── js/
│           └── admin.js         # 管理后台脚本
├── database/
│   └── app.db                   # SQLite 数据库
├── models.json                  # 模型配置
├── package.json
├── README.md
└── DEPLOYMENT.md
```

## 🔧 配置说明

### 环境变量

创建 `.env` 文件：

```env
# 服务端口
PORT=3000

# Session 密钥（生产环境必须修改）
SESSION_SECRET=your-random-secret-key-change-in-production

# 负载均衡策略：round-robin（轮询）、random（随机）、least-used（最少使用）
LOAD_BALANCE_STRATEGY=round-robin

# 模型配置文件
MODELS_FILE=./models.json

# 数据库路径
DATABASE_PATH=./database/app.db
```

### 负载均衡策略

支持三种策略：

1. **round-robin（轮询）**：按顺序依次使用每个账号，默认策略
2. **random（随机）**：随机选择一个可用账号
3. **least-used（最少使用）**：选择请求次数最少的账号

可通过环境变量或管理后台配置。

## 📊 数据库结构

### users 表
- 管理员账户信息
- 字段：id, username, password_hash, created_at

### api_keys 表
- API 密钥管理
- 字段：id, name, key, is_active, usage_count, last_used_at, created_at

### tokens 表
- OpenAI Token 账户
- 字段：id, name, email, account_id, access_token, refresh_token, id_token, expired_at, last_refresh_at, is_active, total_requests, success_requests, failed_requests, quota_total, quota_used, quota_remaining, created_at

### api_logs 表
- API 请求日志
- 字段：id, api_key_id, token_id, model, endpoint, status_code, error_message, created_at

## 🔐 安全建议

### 生产环境配置

1. **修改默认密码**
   - 首次登录后立即修改管理员密码
   - 使用强密码（至少8位，包含大小写字母、数字、特殊字符）

2. **设置环境变量**
   ```bash
   SESSION_SECRET=$(openssl rand -base64 32)
   ```

3. **启用 HTTPS**
   - 使用 Nginx 或 Caddy 作为反向代理
   - 配置 SSL 证书
   - 设置 `cookie.secure = true`

4. **防火墙配置**
   - 只开放必要的端口
   - 限制管理后台访问 IP

5. **定期备份**
   - 备份 `database/app.db` 数据库文件
   - 备份环境变量配置

### Nginx 反向代理示例

```nginx
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

## 🎯 使用指南

### 1. 创建 API Key

1. 登录管理后台
2. 进入 **API Keys** 页面
3. 点击 **创建 API Key**
4. 输入名称（可选）
5. 复制生成的 API Key（只显示一次）

### 2. 导入 Token 账号

#### 方式一：批量导入 JSON

1. 准备 JSON 文件：
```json
[
  {
    "access_token": "your_access_token",
    "refresh_token": "your_refresh_token",
    "id_token": "your_id_token",
    "account_id": "account_id",
    "email": "email@example.com",
    "name": "账号名称"
  }
]
```

2. 进入 **账号管理** 页面
3. 点击 **导入 JSON**
4. 选择文件或粘贴 JSON 内容
5. 点击 **预览导入**
6. 确认后点击 **确认导入**

#### 方式二：手动添加

1. 进入 **账号管理** 页面
2. 点击 **手动添加**
3. 填写 Access Token 和 Refresh Token
4. 点击 **添加**

### 3. 批量删除账号

1. 进入 **账号管理** 页面
2. 勾选要删除的账号
3. 点击 **删除选中** 按钮
4. 确认删除

### 4. 使用 API

```bash
curl http://localhost:3000/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.3-codex",
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'
```

## 🐛 故障排除

### 无法访问管理后台

1. 检查服务是否启动：`npm start`
2. 检查端口是否被占用：`netstat -ano | findstr :3000`
3. 检查防火墙设置

### 数据库初始化失败

```bash
# 删除旧数据库
rm database/app.db

# 重新初始化
npm run init-db
```

### Token 刷新失败

1. 检查网络连接
2. 确认 refresh_token 是否有效
3. 重新导入新的 token

### API 请求失败

1. 检查 API Key 是否正确
2. 确保有可用的 Token 账号
3. 查看管理后台的请求日志
4. 检查账号是否被禁用

### 请求趋势图表显示异常

- 图表数据基于 `api_logs` 表的真实请求记录
- 如果没有请求记录，图表会显示为空
- 发送几次 API 请求后刷新页面查看

## 📝 维护建议

1. **定期备份数据库**
   ```bash
   cp database/app.db database/app.db.backup.$(date +%Y%m%d)
   ```

2. **监控日志**
   - 查看终端输出
   - 检查请求日志

3. **更新依赖**
   ```bash
   npm update
   ```

4. **清理旧日志**
   - 定期清理 `api_logs` 表中的旧记录

## 🔄 更新日志

### v2.0.0 (2026-02-17)
- ✅ 添加批量删除账号功能
- ✅ 添加仪表盘最近活动记录
- ✅ 添加 GitHub 项目链接
- ✅ 移除前台页面，根路径重定向到管理后台
- ✅ 修复模型列表（删除不存在的 gpt-5.3-codex-spark）
- ✅ 优化终端日志输出
- ✅ 账号管理页面显示账号总数
- ✅ 账号详细统计和请求日志添加滚动条
- ✅ 修复请求趋势图表，使用真实数据

### v1.0.0
- ✅ 基础管理系统
- ✅ API Keys 管理
- ✅ Tokens 管理
- ✅ 数据统计

## 📞 支持

- GitHub: https://github.com/lulistart/gpt2api-node
- Issues: https://github.com/lulistart/gpt2api-node/issues

## 📄 许可证

MIT License
