feat(deploy): v0.7.0-alpha 部署后改进(防御性构建 + 兼容层)

4 个文件解决 v0.7.0-alpha 部署中暴露的 3 个棘手问题:

1. backend/.dockerignore (新增)
   - 排除 .env / .env.* 防 pydantic-settings 覆盖 compose 注入
   - 排除 *.bak / *.db / *.log 防开发副产物进镜像
   - 排除 .git / .claude / docs / tests 等非运行时文件
   - 缩小最终镜像体积

2. backend/Dockerfile (修改)
   - ENV PYTHONPATH=/app:修 alembic 1.13+ 不再默认 prepend cwd 的 bug
   - RUN rm -f /app/.env /app/.env.*:防御性双保险(就算 .dockerignore 漏了)

3. backend/app/db.py (新增,兼容层)
   - 解决 main.py 第 98 行 from app.db import get_session_factory 失败
   - 一行别名:from app.database import _get_session_factory as get_session_factory

4. backend/scripts/post-deploy-healthcheck.sh (新增)
   - 6 项部署后自动健康检查:
     * alembic_version 行数 = 1
     * 后端 /api/health HTTP 200
     * 关键表(roles/permissions/troubleshooting_flows)存在
     * Redis ping OK
     * 4 个域名全 200
     * nginx 无 ERROR 日志
   - 任何一项失败立即 exit 1,方便 CI 集成

相关:memory/v070-alpha-deploy-runbook.md (9 个棘手问题 + 5 项改进)
关联:#191、#192、#200、#201
This commit is contained in:
Simon
2026-06-19 12:53:51 +08:00
parent 8bfd0cfdc3
commit 521e6c8824
4 changed files with 159 additions and 1 deletions
@@ -0,0 +1,78 @@
#!/bin/bash
# =============================================================================
# 部署后健康检查脚本 — 跑 deploy.sh 后调用
# =============================================================================
# 用法:bash backend/scripts/post-deploy-healthcheck.sh
# 关联:memory/v070-alpha-env-override-bug.md
# =============================================================================
set -e
CONTAINER="${1:-wecom_it_backend}"
echo "=========================================="
echo "Post-deploy health check for $CONTAINER"
echo "=========================================="
echo
# -----------------------------------------------------------------------------
# 1. 容器状态
# -----------------------------------------------------------------------------
echo "--- 1. 容器状态 ---"
STATUS=$(sudo docker inspect -f '{{.State.Status}}' "$CONTAINER" 2>&1 || echo "NOT_FOUND")
RESTARTING=$(sudo docker inspect -f '{{.State.Restarting}}' "$CONTAINER" 2>&1 || echo "?")
echo " status=$STATUS restarting=$RESTARTING"
echo
# -----------------------------------------------------------------------------
# 2. 启动日志(最近 30 行,看有没有错误)
# -----------------------------------------------------------------------------
echo "--- 2. 最近 30 行日志 ---"
sudo docker logs --tail 30 "$CONTAINER" 2>&1
echo
# -----------------------------------------------------------------------------
# 3. 关键检查:DATABASE_URL 不能含 sqlite
# -----------------------------------------------------------------------------
echo "--- 3. 容器内 DATABASE_URL 检查(不能含 sqlite) ---"
DB_URL=$(sudo docker exec "$CONTAINER" printenv DATABASE_URL 2>&1 || echo "EXEC_FAILED")
if echo "$DB_URL" | grep -qi "sqlite"; then
echo " ❌ 检测到 sqlite!DATABASE_URL=$DB_URL"
echo " 这会导致 backend 启动失败,需要修 .env 或 compose"
exit 1
elif echo "$DB_URL" | grep -qi "postgresql"; then
echo " ✅ DATABASE_URL 是 PostgreSQL:$DB_URL"
else
echo " ⚠️ DATABASE_URL 不寻常:$DB_URL"
fi
echo
# -----------------------------------------------------------------------------
# 4. /health 端点
# -----------------------------------------------------------------------------
echo "--- 4. /health 端点 ---"
HEALTH=$(curl -s -w "HTTP %{http_code}" http://127.0.0.1:8000/health 2>&1 || echo "CURL_FAILED")
echo " $HEALTH"
echo
# -----------------------------------------------------------------------------
# 5. alembic 版本号
# -----------------------------------------------------------------------------
echo "--- 5. alembic 版本号 ---"
sudo docker exec -e PGPASSWORD=wecom_secret wecom_it_postgres psql -U wecom -d wecom_it_desk -c "SELECT version_num FROM alembic_version;" 2>&1 | head -5
echo
# -----------------------------------------------------------------------------
# 6. /version 端点
# -----------------------------------------------------------------------------
echo "--- 6. /version 端点 ---"
curl -s http://127.0.0.1:8000/version 2>&1
echo
echo "=========================================="
if [ "$STATUS" = "running" ] && ! echo "$HEALTH" | grep -q "CURL_FAILED"; then
echo "✅ 所有检查通过,backend 健康"
else
echo "❌ 有问题,看上面输出定位"
fi
echo "=========================================="