修复 CI/CD 部署逻辑:强制更新 docker-compose.prod.yml
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m0s

根本问题:
- 第一次部署时复制的 docker-compose.prod.yml 没有环境变量
- 后续部署跳过复制,导致服务器一直使用旧版本配置
- 容器启动时因缺少 DB_HOST 环境变量立即退出
- 健康检查失败 → 容器 unhealthy

服务器日志证实:
- 容器反复重启
- 每次都显示 '错误: DB_HOST 环境变量未设置'
- entrypoint-api.sh 第10行检查失败后 exit 1

修复内容:
- docker-compose.prod.yml 每次部署强制更新
- configs 目录保留现有配置(避免覆盖运行时调整)
- 确保最新的环境变量配置生效
This commit is contained in:
2026-01-20 11:57:25 +08:00
parent a80dc1e69d
commit 1bee64fc65
2 changed files with 70 additions and 5 deletions

View File

@@ -72,13 +72,16 @@ jobs:
echo "📁 当前目录内容:" echo "📁 当前目录内容:"
ls -la ls -la
# 如果配置文件不存在,从当前目录复制 # 强制更新 docker-compose.prod.yml确保使用最新配置
if [ ! -f ${{ env.DEPLOY_DIR }}/docker-compose.prod.yml ]; then echo "📋 更新部署配置文件..."
echo "📋 初始化部署目录..." cp -v docker-compose.prod.yml ${{ env.DEPLOY_DIR }}/
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/ cp -rv configs/* ${{ env.DEPLOY_DIR }}/configs/
else else
echo "✅ 配置文件已存在,跳过复制" echo "✅ 配置目录已存在,保留现有配置"
fi fi
cd ${{ env.DEPLOY_DIR }} cd ${{ env.DEPLOY_DIR }}

62
debug-deployment.sh Normal file
View File

@@ -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 "========================================"