5.7 KiB
5.7 KiB
修复 Docker 环境 404 错误
问题诊断
日志分析
从 assets/physics-correction.log 中发现以下关键错误:
❌ HTTP Request: POST https://api.coze.cn/v1/chat/completions "HTTP/1.1 404 Not Found"
❌ HTTP Request: POST https://api.coze.cn/v1/loop/traces/ingest "HTTP/1.1 401 Unauthorized"
日志明确提示:
remote service error, authentication is invalid
[http_code=401 error_code=4100]
根本原因
- 认证失败:虽然端点已经正确添加了
/v1/前缀,但由于认证失败导致返回 404 错误 - 缺少必需环境变量:
- ❌ 没有
COZE_WORKSPACE_ID - ❌ 密钥被硬编码在 Dockerfile 中(不安全且配置混乱)
- ❌ 没有
修复步骤
步骤 1:使用修复后的 Dockerfile
将 assets/Dockerfile.fixed 替换原来的 Dockerfile:
# 备份原文件
mv Dockerfile Dockerfile.backup
# 使用修复后的文件
mv Dockerfile.fixed Dockerfile
关键修改:
- ✅ 移除硬编码的 API_KEY 和密钥
- ✅ 添加
COZE_INTEGRATION_CHAT_BASE_URL端点 - ✅ 保留 API 端点配置(
/v1前缀已正确) - ✅ 添加健康检查
步骤 2:创建 docker-compose.yml
使用提供的 assets/docker-compose.yml 文件,确保包含以下环境变量:
environment:
# ✅ 从 JWT token 提取的值
- COZE_API_KEY=Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImRmZmU2NmYxLTg0MDMtNDc5Ni05ZmRhLTViMmJjZWExM2ViOCJ9...
# ✅ 从 token 的 sub 字段提取:spiffe://api.coze.cn/workload_identity/id:7622238752642957347
- COZE_WORKSPACE_ID=7622238752642957347
步骤 3:验证环境变量
在重新构建之前,运行检查脚本:
# 在宿主机上(确保环境变量已设置)
python assets/check_env.py
应该看到类似输出:
✅ COZE_API_KEY: Bearer eyJhbGciOiJSUzI1...
✅ COZE_WORKSPACE_ID: 7622238752642957347
✅ COZE_INTEGRATION_BASE_URL: https://api.coze.cn/v1
✅ LLM_MODEL_NAME: doubao-seed-2-0-pro-260215
✅ Token 未过期
✅ API 端点包含 /v1 前缀
✅ 从 Token 提取的 Workspace ID: 7622238752642957347
步骤 4:重新构建并启动
# 停止旧容器
docker-compose down
# 重新构建镜像
docker-compose build --no-cache
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f
步骤 5:测试 LLM 调用
# 发送测试请求
curl -X POST http://localhost:8000/stream_run \
-H "Content-Type: application/json" \
-d '{
"student_homework": [
{
"student_id": 1,
"student_name": "测试学生",
"homework_images": ["https://example.com/image.jpg"]
}
],
"answer_doc_url": "",
"comment_max_length": 50,
"max_concurrent": 1
}'
验证修复成功的标志
日志应该显示:
✅ HTTP Request: POST https://api.coze.cn/v1/chat/completions "HTTP/1.1 200 OK"
✅ Workflow doc_extract started
✅ Node 'doc_extract_node' started
✅ LLM 调用成功
不应该再出现:
❌ 404 Not Found
❌ 401 Unauthorized
❌ authentication is invalid
环境变量说明
必需的环境变量
| 变量名 | 说明 | 示例值 |
|---|---|---|
COZE_API_KEY |
Coze API 认证密钥 | Bearer eyJhbGci... |
COZE_WORKSPACE_ID |
工作区 ID | 7622238752642957347 |
可选的环境变量(已在 Dockerfile 中设置)
| 变量名 | 说明 | 默认值 |
|---|---|---|
COZE_INTEGRATION_BASE_URL |
API 基础 URL | https://api.coze.cn/v1 |
COZE_INTEGRATION_MODEL_BASE_URL |
模型 API 基础 URL | https://api.coze.cn/v1 |
LLM_MODEL_NAME |
LLM 模型名称 | doubao-seed-2-0-pro-260215 |
提取 Workspace ID 的方法
从 JWT Token 的 sub 字段提取:
# Token 示例
token = "Bearer eyJhbGci..."
# 解码 JWT payload
import json, base64
payload = json.loads(base64.b64decode(token.split('.')[1]))
# sub 字段:spiffe://api.coze.cn/workload_identity/id:7622238752642957347
sub = payload['sub']
workspace_id = sub.split('workload_identity/id:')[-1]
print(workspace_id) # 7622238752642957347
安全建议
✅ 推荐:使用环境变量文件
创建 .env 文件(不要提交到 Git):
# .env
COZE_API_KEY=Bearer eyJhbGci...
COZE_WORKSPACE_ID=7622238752642957347
修改 docker-compose.yml:
env_file:
- .env
添加到 .gitignore:
.env
❌ 避免:硬编码密钥
不要在 Dockerfile 中硬编码密钥:
# ❌ 错误示例
ENV COZE_API_KEY="Bearer eyJhbGci..."
故障排查
问题 1:仍然出现 401 错误
检查:
# 检查环境变量是否正确注入
docker exec -it math-grading-app env | grep COZE
# 应该看到 COZE_API_KEY 和 COZE_WORKSPACE_ID
修复:
# 重新启动容器
docker-compose down
docker-compose up -d
问题 2:仍然出现 404 错误
检查:
# 检查端点配置
docker exec -it math-grading-app env | grep BASE_URL
# 应该包含 /v1
# COZE_INTEGRATION_BASE_URL=https://api.coze.cn/v1
修复:
# 重新构建镜像(确保使用最新的 Dockerfile)
docker-compose build --no-cache
docker-compose up -d
问题 3:Token 过期
检查:
# 运行检查脚本
python assets/check_env.py
修复:
# 获取新的 Token
# 1. 登录 Coze 平台
# 2. 进入个人中心
# 3. 生成新的 API Key
# 4. 更新 docker-compose.yml 中的 COZE_API_KEY
总结
关键修复点:
- ✅ 添加
COZE_WORKSPACE_ID环境变量 - ✅ 使用运行时环境变量注入密钥(不硬编码)
- ✅ 确保 API 端点包含
/v1前缀 - ✅ 添加健康检查
预期结果:
- ✅ LLM 调用成功(200 OK)
- ✅ 不再出现 401/404 错误
- ✅ 工作流正常运行