From 1bee64fc651f95ef5483719daded560badcc92fa Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 20 Jan 2026 11:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20CI/CD=20=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=9A=E5=BC=BA=E5=88=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20docker-compose.prod.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本问题: - 第一次部署时复制的 docker-compose.prod.yml 没有环境变量 - 后续部署跳过复制,导致服务器一直使用旧版本配置 - 容器启动时因缺少 DB_HOST 环境变量立即退出 - 健康检查失败 → 容器 unhealthy 服务器日志证实: - 容器反复重启 - 每次都显示 '错误: DB_HOST 环境变量未设置' - entrypoint-api.sh 第10行检查失败后 exit 1 修复内容: - docker-compose.prod.yml 每次部署强制更新 - configs 目录保留现有配置(避免覆盖运行时调整) - 确保最新的环境变量配置生效 --- .gitea/workflows/deploy.yaml | 13 +++++--- debug-deployment.sh | 62 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 debug-deployment.sh diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 6f7251b..0b936b4 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -72,13 +72,16 @@ jobs: echo "📁 当前目录内容:" ls -la - # 如果配置文件不存在,从当前目录复制 - if [ ! -f ${{ env.DEPLOY_DIR }}/docker-compose.prod.yml ]; then - echo "📋 初始化部署目录..." - cp -v docker-compose.prod.yml ${{ env.DEPLOY_DIR }}/ + # 强制更新 docker-compose.prod.yml(确保使用最新配置) + echo "📋 更新部署配置文件..." + cp -v docker-compose.prod.yml ${{ env.DEPLOY_DIR }}/ + + # configs 目录只在不存在时初始化(避免覆盖运行时配置) + if [ ! -d ${{ env.DEPLOY_DIR }}/configs ] || [ -z "$(ls -A ${{ env.DEPLOY_DIR }}/configs 2>/dev/null)" ]; then + echo "📋 初始化配置目录..." cp -rv configs/* ${{ env.DEPLOY_DIR }}/configs/ else - echo "✅ 配置文件已存在,跳过复制" + echo "✅ 配置目录已存在,保留现有配置" fi cd ${{ env.DEPLOY_DIR }} diff --git a/debug-deployment.sh b/debug-deployment.sh new file mode 100644 index 0000000..273db0d --- /dev/null +++ b/debug-deployment.sh @@ -0,0 +1,62 @@ +#!/bin/bash +set -e + +echo "========================================" +echo "君鸿卡管系统部署诊断脚本" +echo "========================================" +echo "" + +cd /opt/junhong_cmp + +echo "1. 检查镜像信息" +echo "----------------------------------------" +docker images | grep junhong/cmp-fiber-api +echo "" + +echo "2. 检查容器状态" +echo "----------------------------------------" +docker compose -f docker-compose.prod.yml ps +echo "" + +echo "3. 查看 API 容器详细健康状态" +echo "----------------------------------------" +docker inspect junhong-cmp-api --format='{{json .State.Health}}' | jq . +echo "" + +echo "4. 查看 API 容器启动日志(最近 50 行)" +echo "----------------------------------------" +docker compose -f docker-compose.prod.yml logs api --tail=50 +echo "" + +echo "5. 手动测试健康检查(容器内)" +echo "----------------------------------------" +echo "测试 IPv4 (127.0.0.1):" +docker exec junhong-cmp-api wget --no-verbose --tries=1 --spider http://127.0.0.1:3000/health && echo "✅ 成功" || echo "❌ 失败" +echo "" +echo "测试 localhost:" +docker exec junhong-cmp-api wget --no-verbose --tries=1 --spider http://localhost:3000/health && echo "✅ 成功" || echo "❌ 失败" +echo "" + +echo "6. 从宿主机测试健康检查" +echo "----------------------------------------" +curl -s http://localhost:3000/health | jq . +echo "" + +echo "7. 检查端口监听情况(容器内)" +echo "----------------------------------------" +docker exec junhong-cmp-api netstat -tlnp 2>/dev/null || docker exec junhong-cmp-api ss -tlnp +echo "" + +echo "8. 查看环境变量" +echo "----------------------------------------" +docker exec junhong-cmp-api env | grep -E "DB_|CONFIG_ENV" +echo "" + +echo "9. 检查配置文件" +echo "----------------------------------------" +docker exec junhong-cmp-api cat /app/configs/config.yaml | grep -A 3 "server:" +echo "" + +echo "========================================" +echo "诊断完成" +echo "========================================"