# 部署问题排查指南 ## 当前状态 **最新修复**: Commit `bf4ef37` - 修复 docker compose 找不到配置文件:显式指定文件名 **修复内容**: - 所有 `docker compose` 命令添加 `-f docker-compose.prod.yml` 参数 - 确保在正确的工作目录执行命令 --- ## 快速验证清单 ### 1. 检查 Gitea Actions 构建状态 访问: https://git.boss160.cn/csxj2026/junhong_cmp_fiber/actions **查看最新运行**: - 运行 ID: 查看最新的 workflow 运行 - 状态: 应该显示 ✅ 成功(绿色) - 时间: 预计 15-20 分钟完成 **关键步骤验证**: ``` ✅ 检出代码 (Checkout code) ✅ 设置镜像标签 (Set image tags) ✅ 登录 Docker Registry (Login to Docker Registry) ✅ 构建 API 镜像 (Build API image) ✅ 构建 Worker 镜像 (Build Worker image) ✅ 推送 API 镜像 (Push API image) ✅ 推送 Worker 镜像 (Push Worker image) ✅ 部署到测试服务器 (Deploy to test server) <-- 本次重点修复 ``` --- ### 2. SSH 登录服务器验证 ```bash # 登录服务器 ssh qycard001@47.111.166.169 -p 52022 # 进入部署目录 cd /opt/junhong_cmp # 检查文件是否存在 ls -la # 预期输出: # docker-compose.prod.yml # configs/config.yaml # logs/ # 查看 docker compose 配置 cat docker-compose.prod.yml # 查看应用配置 cat configs/config.yaml ``` --- ### 3. 检查容器状态 ```bash # 查看所有容器 docker compose -f docker-compose.prod.yml ps # 预期输出: # NAME COMMAND SERVICE STATUS PORTS # junhong_cmp-api-1 "/entrypoint-api.sh" api Up (healthy) 0.0.0.0:3000->3000/tcp # junhong_cmp-worker-1 "/app/cmd/worker" worker Up # 如果状态不是 Up (healthy),查看具体问题 docker compose -f docker-compose.prod.yml logs api docker compose -f docker-compose.prod.yml logs worker ``` --- ### 4. 测试 API 健康检查 ```bash # 在服务器上测试 curl http://localhost:3000/health # 预期响应: # { # "code": 0, # "message": "success", # "data": { # "status": "healthy", # "timestamp": "2026-01-20T11:30:00+08:00" # } # } ``` --- ## 常见问题排查 ### 问题 1: 部署步骤失败 - "no configuration file provided" **现象**: ``` Error: no configuration file provided: not found ``` **原因**: docker compose 没有找到配置文件 **解决**: ✅ 已在 `bf4ef37` 修复 - 所有 `docker compose` 命令添加 `-f docker-compose.prod.yml` **验证**: ```bash # 在部署目录执行 cd /opt/junhong_cmp docker compose -f docker-compose.prod.yml config # 应该能正确输出配置 ``` --- ### 问题 2: 容器启动失败 - 健康检查不通过 **现象**: ``` junhong_cmp-api-1 Up (unhealthy) ``` **排查步骤**: 1. **查看容器日志**: ```bash docker compose -f docker-compose.prod.yml logs api --tail=50 ``` 2. **常见原因**: - 数据库连接失败 - 配置文件路径错误 - 端口冲突 - 数据库迁移失败 3. **进入容器调试**: ```bash docker compose -f docker-compose.prod.yml exec api sh # 在容器内检查 ls -la /app/ ls -la /app/configs/ cat /app/configs/config.yaml wget --spider http://localhost:3000/health ``` 4. **手动测试健康检查**: ```bash docker compose -f docker-compose.prod.yml exec api wget --no-verbose --tries=1 --spider http://localhost:3000/health echo $? # 应该输出 0 ``` --- ### 问题 3: 数据库迁移失败 **现象**: ``` Failed to run migrations: ... ``` **排查步骤**: 1. **检查数据库连接**: ```bash # 在服务器上测试 PostgreSQL 连接 docker compose -f docker-compose.prod.yml exec api sh -c ' apk add postgresql-client && PGPASSWORD="qycardPW@.cxj2026" psql -h cxd.whcxd.cn -p 16159 -U qycard001 -d qycard001 -c "SELECT version();" ' ``` 2. **查看迁移日志**: ```bash docker compose -f docker-compose.prod.yml logs api | grep -i migrate ``` 3. **手动执行迁移**: ```bash docker compose -f docker-compose.prod.yml exec api sh -c ' cd /app && /app/migrate -path /app/migrations -database "postgres://..." up ' ``` --- ### 问题 4: 镜像拉取失败 **现象**: ``` Error response from daemon: pull access denied for registry.boss160.cn/junhong/cmp-fiber-api ``` **排查步骤**: 1. **检查 Registry 登录**: ```bash # 在服务器上手动登录 docker login registry.boss160.cn # 用户名: junhong_admin # 密码: JunHong@2025!Registry ``` 2. **手动拉取镜像**: ```bash docker pull registry.boss160.cn/junhong/cmp-fiber-api:latest docker pull registry.boss160.cn/junhong/cmp-fiber-worker:latest ``` 3. **检查镜像是否存在**: ```bash # 在本地 Mac 检查 docker images | grep registry.boss160.cn ``` --- ### 问题 5: 配置文件未同步 **现象**: 容器内的配置文件与仓库不一致 **排查步骤**: 1. **检查部署目录的配置文件**: ```bash cat /opt/junhong_cmp/configs/config.yaml ``` 2. **对比仓库的配置文件**: ```bash # 在 Runner 工作目录 cat /tmp/actions/*/csxj2026-junhong_cmp_fiber/configs/config.yaml ``` 3. **重新复制配置文件**: ```bash cd /tmp/actions/*/csxj2026-junhong_cmp_fiber sudo cp docker-compose.prod.yml /opt/junhong_cmp/ sudo cp -r configs /opt/junhong_cmp/ ``` --- ### 问题 6: Worker 容器启动失败 **现象**: ``` junhong_cmp-worker-1 Exited (1) ``` **排查步骤**: 1. **查看 Worker 日志**: ```bash docker compose -f docker-compose.prod.yml logs worker --tail=50 ``` 2. **检查 API 健康状态**: Worker 依赖 API 的健康检查,确保 API 先启动成功 ```bash docker compose -f docker-compose.prod.yml ps api # 应该显示 Up (healthy) ``` 3. **重启 Worker**: ```bash docker compose -f docker-compose.prod.yml restart worker ``` --- ## 从零重新部署 如果遇到无法解决的问题,可以完全清理后重新部署: ```bash # 1. 停止并删除所有容器 cd /opt/junhong_cmp docker compose -f docker-compose.prod.yml down -v # 2. 删除旧镜像 docker rmi registry.boss160.cn/junhong/cmp-fiber-api:latest docker rmi registry.boss160.cn/junhong/cmp-fiber-worker:latest # 3. 清理部署目录 sudo rm -rf /opt/junhong_cmp/* # 4. 触发新的构建 # 在本地 Mac 推送代码 cd /Users/break/csxjProject/junhong_cmp_fiber git commit --allow-empty -m "触发重新部署" git push origin main # 5. 等待 CI/CD 完成(15-20分钟) # 访问 https://git.boss160.cn/csxj2026/junhong_cmp_fiber/actions # 6. 验证部署 ssh qycard001@47.111.166.169 -p 52022 cd /opt/junhong_cmp docker compose -f docker-compose.prod.yml ps curl http://localhost:3000/health ``` --- ## 监控和日志 ### 实时查看日志 ```bash # API 日志 docker compose -f docker-compose.prod.yml logs -f api # Worker 日志 docker compose -f docker-compose.prod.yml logs -f worker # 所有服务日志 docker compose -f docker-compose.prod.yml logs -f ``` ### 查看应用日志文件 ```bash # API 日志 tail -f /opt/junhong_cmp/logs/api.log tail -f /opt/junhong_cmp/logs/access.log # Worker 日志 tail -f /opt/junhong_cmp/logs/worker.log ``` ### 检查容器资源使用 ```bash docker stats junhong_cmp-api-1 junhong_cmp-worker-1 ``` --- ## 性能验证 ### API 响应时间测试 ```bash # 安装 hey (HTTP load testing tool) # Mac: brew install hey # Linux: go install github.com/rakyll/hey@latest # 健康检查测试 (100 请求,10 并发) hey -n 100 -c 10 http://47.111.166.169:3000/health # 预期指标: # - P95 < 200ms # - P99 < 500ms # - 成功率 = 100% ``` ### 数据库查询性能 ```bash # 在 PostgreSQL 中启用慢查询日志 # 检查是否有查询 > 50ms ``` --- ## 回滚策略 如果新版本有问题,可以快速回滚到之前的镜像版本: ```bash # 1. 拉取特定版本的镜像 docker pull registry.boss160.cn/junhong/cmp-fiber-api:1d773c4 docker pull registry.boss160.cn/junhong/cmp-fiber-worker:1d773c4 # 2. 修改 docker-compose.prod.yml 中的镜像标签 vim /opt/junhong_cmp/docker-compose.prod.yml # 将 :latest 改为 :1d773c4 # 3. 重新部署 docker compose -f docker-compose.prod.yml up -d # 4. 验证 curl http://localhost:3000/health ``` --- ## 联系和支持 如果遇到无法解决的问题: 1. **检查 Gitea Actions 日志**: https://git.boss160.cn/csxj2026/junhong_cmp_fiber/actions 2. **查看容器日志**: `docker compose -f docker-compose.prod.yml logs` 3. **检查服务器资源**: `df -h`, `free -h`, `docker system df` 4. **记录错误信息**: 完整的错误日志和复现步骤 --- ## 成功部署的标志 当看到以下所有指标时,部署完全成功: ✅ Gitea Actions 显示绿色 ✅ ✅ `docker compose ps` 显示所有容器 `Up (healthy)` ✅ `curl http://localhost:3000/health` 返回 200 + 正确的 JSON ✅ 日志中没有 ERROR 级别消息 ✅ API 响应时间 P95 < 200ms ✅ Worker 正常消费任务队列 --- ## 附录:关键文件位置 ### 服务器 - **Runner 目录**: `/home/qycard001/act_runner` - **部署目录**: `/opt/junhong_cmp` - **Runner 配置**: `/home/qycard001/.runner` - **临时工作目录**: `/home/qycard001/.cache/act/` ### 本地 (Mac) - **仓库目录**: `/Users/break/csxjProject/junhong_cmp_fiber` - **关键文件**: - `.gitea/workflows/deploy.yaml` - `Dockerfile.api` - `Dockerfile.worker` - `docker-compose.prod.yml` - `configs/config.yaml` ### 私有 Registry - **地址**: registry.boss160.cn - **API 镜像**: `registry.boss160.cn/junhong/cmp-fiber-api` - **Worker 镜像**: `registry.boss160.cn/junhong/cmp-fiber-worker` - **基础镜像**: `registry.boss160.cn/base/golang:1.25.6-alpine` --- **最后更新**: 2026-01-20 11:11 **文档版本**: 1.0 **对应 Commit**: bf4ef37