# Docker 部署指南（硬编码 KEY 版本）

## 📋 配置说明

本 Dockerfile 已经将所有 API 配置和密钥硬编码在镜像中：

### 已硬编码的配置

| 配置项 | 值 |
|--------|-----|
| API 端点 | `https://api.coze.cn/v1` ✅（包含 /v1 前缀） |
| COZE_API_KEY | `Bearer eyJhbGci...` ✅ |
| LLM_API_KEY | `Bearer eyJhbGci...` ✅ |
| COZE_WORKSPACE_ID | `7622238752642957347` ✅ |
| LLM_MODEL_NAME | `doubao-seed-2-0-pro-260215` ✅ |

### Workspace ID 来源

从 JWT Token 的 `sub` 字段提取：
```
spiffe://api.coze.cn/workload_identity/id:7622238752642957347
```

## 🚀 快速部署

### 步骤 1：构建镜像

```bash
# 进入项目根目录
cd /workspace/projects

# 构建镜像
docker build -t math-grading:latest .
```

### 步骤 2：运行容器

```bash
# 运行容器（简单方式）
docker run -d \
  --name math-grading \
  -p 8000:8000 \
  --restart unless-stopped \
  math-grading:latest

# 运行容器（完整方式，挂载日志和缓存）
docker run -d \
  --name math-grading \
  -p 8000:8000 \
  -v $(pwd)/logs:/app/work/logs \
  -v $(pwd)/cache:/tmp/homework_cache \
  --restart unless-stopped \
  math-grading:latest
```

### 步骤 3：验证服务

```bash
# 查看容器状态
docker ps | grep math-grading

# 查看日志
docker logs -f math-grading

# 检查健康状态
curl http://localhost:8000/health
```

## 🧪 测试接口

### 测试 LLM 调用

```bash
curl -X POST http://localhost:8000/stream_run \
  -H "Content-Type: application/json" \
  -d '{
    "student_homework": [
      {
        "student_id": 1,
        "student_name": "测试学生",
        "homework_images": [
          "https://dpcclass.oss-cn-beijing.aliyuncs.com/umsupload/2026/03/18/69baa4f5-4826-4901-00e1-c6e66f02947f.jpg?x-oss-process=image/resize,w_1000"
        ]
      }
    ],
    "answer_doc_url": "",
    "comment_max_length": 50,
    "max_concurrent": 1
  }'
```

### 测试多图片批改

```bash
curl -X POST http://localhost:8000/stream_run \
  -H "Content-Type: application/json" \
  -d '{
    "student_homework": [
      {
        "student_id": 1,
        "student_name": "张三",
        "homework_images": [
          "https://dpcclass.oss-cn-beijing.aliyuncs.com/umsupload/2026/03/18/69baa4f5-4826-4901-00e1-c6e66f02947f.jpg?x-oss-process=image/resize,w_1000",
          "https://dpcclass.oss-cn-beijing.aliyuncs.com/umsupload/2026/03/25/69c344ba-4826-4901-00e1-c6ff235a12b2.jpg?x-oss-process=image/resize,w_1000"
        ]
      }
    ],
    "answer_doc_url": "https://dpcclass.oss-cn-beijing.aliyuncs.com/umsupload/2026/03/25/69c353d0-4826-4901-00e1-c7081bcab988.docx",
    "comment_max_length": 50,
    "max_concurrent": 2
  }'
```

## 🔧 常用命令

### 容器管理

```bash
# 停止容器
docker stop math-grading

# 启动容器
docker start math-grading

# 重启容器
docker restart math-grading

# 删除容器
docker rm -f math-grading

# 删除镜像
docker rmi math-grading:latest
```

### 日志查看

```bash
# 查看实时日志
docker logs -f math-grading

# 查看最近 100 行日志
docker logs --tail 100 math-grading

# 查看错误日志
docker logs math-grading 2>&1 | grep ERROR
```

### 进入容器

```bash
# 进入容器 shell
docker exec -it math-grading /bin/bash

# 查看环境变量
docker exec math-grading env | grep COZE

# 运行 Python 脚本
docker exec math-grading python assets/check_env.py
```

## 📊 验证配置成功

### 成功标志

1. **容器启动成功**
   ```bash
   docker ps | grep math-grading
   # 应该显示容器运行中（Up status）
   ```

2. **日志无错误**
   ```bash
   docker logs math-grading | grep ERROR
   # 不应该有认证错误（401）或端点错误（404）
   ```

3. **健康检查通过**
   ```bash
   curl http://localhost:8000/health
   # 应该返回 200 OK
   ```

4. **LLM 调用成功**
   ```bash
   # 运行测试请求，日志应该显示：
   # ✅ HTTP Request: POST https://api.coze.cn/v1/chat/completions "HTTP/1.1 200 OK"
   ```

### 错误排查

#### 错误 1：容器无法启动

```bash
# 查看详细日志
docker logs math-grading

# 检查端口是否被占用
netstat -tuln | grep 8000
```

#### 错误 2：LLM 调用 401 错误

```bash
# 检查环境变量是否正确设置
docker exec math-grading env | grep COZE_API_KEY

# 应该看到：
# COZE_API_KEY=Bearer eyJhbGci...
```

#### 错误 3：LLM 调用 404 错误

```bash
# 检查 API 端点配置
docker exec math-grading env | grep BASE_URL

# 应该看到：
# COZE_INTEGRATION_BASE_URL=https://api.coze.cn/v1
# 注意要有 /v1 前缀
```

## 🔐 安全说明

### ⚠️ 密钥已硬编码

当前 Dockerfile 将 API Key 硬编码在镜像中：
- ✅ 优点：部署简单，无需额外配置
- ❌ 缺点：密钥会暴露在镜像中，存在安全风险

### 安全建议

1. **私有仓库**
   - 使用私有 Docker Registry（如阿里云容器镜像服务）
   - 不要将镜像推送到公共仓库

2. **访问控制**
   - 限制镜像访问权限
   - 使用 RBAC 控制镜像拉取

3. **定期更换密钥**
   - 定期在 Coze 平台更换 API Key
   - 重新构建镜像

4. **生产环境建议**
   - 使用环境变量方式（推荐）
   - 参考 `assets/docker-compose.yml`

## 📝 配置说明

### 环境变量列表

| 变量名 | 说明 | 值 |
|--------|------|-----|
| `COZE_API_KEY` | Coze API 认证密钥 | Bearer eyJhbGci... |
| `LLM_API_KEY` | LLM API 认证密钥 | Bearer eyJhbGci... |
| `COZE_WORKSPACE_ID` | 工作区 ID | 7622238752642957347 |
| `COZE_INTEGRATION_BASE_URL` | API 基础 URL | https://api.coze.cn/v1 |
| `COZE_INTEGRATION_MODEL_BASE_URL` | 模型 API 基础 URL | https://api.coze.cn/v1 |
| `LLM_BASE_URL` | LLM API 基础 URL | https://api.coze.cn/v1 |
| `LLM_MODEL_NAME` | LLM 模型名称 | doubao-seed-2-0-pro-260215 |
| `COZE_INTEGRATION_API_KEY` | 集成 API 密钥 | Bearer eyJhbGci... |

### 端口说明

| 端口 | 说明 |
|------|------|
| 8000 | HTTP 服务端口 |

### 目录说明

| 目录 | 说明 |
|------|------|
| /app | 应用工作目录 |
| /app/work/logs/bypass | 日志目录 |
| /tmp/homework_cache | 缓存目录 |

## 🎯 总结

### 一键部署命令

```bash
# 构建并运行
docker build -t math-grading:latest .
docker run -d --name math-grading -p 8000:8000 --restart unless-stopped math-grading:latest

# 查看日志
docker logs -f math-grading

# 测试接口
curl -X POST http://localhost:8000/stream_run \
  -H "Content-Type: application/json" \
  -d '{"student_homework": [{"student_id": 1, "homework_images": ["https://example.com/image.jpg"]}]}'
```

### 预期结果

- ✅ 容器正常运行
- ✅ 日志显示服务启动成功
- ✅ LLM 调用返回 200 OK
- ✅ 批改功能正常工作

### 关键修复点

1. ✅ API 端点包含 `/v1/` 前缀
2. ✅ COZE_WORKSPACE_ID 已配置
3. ✅ API Key 已硬编码
4. ✅ 健康检查已添加
5. ✅ 日志和缓存目录已创建
