PhysicsCorrection/assets/fix_docker_404.md

5.7 KiB
Raw Permalink Blame History

修复 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]

根本原因

  1. 认证失败:虽然端点已经正确添加了 /v1/ 前缀,但由于认证失败导致返回 404 错误
  2. 缺少必需环境变量
    • 没有 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

问题 3Token 过期

检查

# 运行检查脚本
python assets/check_env.py

修复

# 获取新的 Token
# 1. 登录 Coze 平台
# 2. 进入个人中心
# 3. 生成新的 API Key
# 4. 更新 docker-compose.yml 中的 COZE_API_KEY

总结

关键修复点

  1. 添加 COZE_WORKSPACE_ID 环境变量
  2. 使用运行时环境变量注入密钥(不硬编码)
  3. 确保 API 端点包含 /v1 前缀
  4. 添加健康检查

预期结果

  • LLM 调用成功200 OK
  • 不再出现 401/404 错误
  • 工作流正常运行