101 lines
3.5 KiB
Bash
101 lines
3.5 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# ============================================================
|
|||
|
|
# 迁移收尾:修 P3015(删残缺 migration 目录)、migrate deploy、启动、健康检查
|
|||
|
|
# 用法:在服务器上
|
|||
|
|
# cd /var/www/wildgrowth-backend/backend && bash deploy/scripts/migration-fix-and-start.sh
|
|||
|
|
# 或(若脚本在 deploy 下):bash deploy/scripts/migration-fix-and-start.sh
|
|||
|
|
# ============================================================
|
|||
|
|
|
|||
|
|
set -e
|
|||
|
|
|
|||
|
|
GIT_ROOT="${GIT_ROOT:-/var/www/wildgrowth-backend}"
|
|||
|
|
APP_ROOT="${APP_ROOT:-/var/www/wildgrowth-backend/backend}"
|
|||
|
|
MIGRATIONS="$APP_ROOT/prisma/migrations"
|
|||
|
|
|
|||
|
|
echo "═══════════════════════════════════════════════════════════"
|
|||
|
|
echo " 迁移收尾:修复 P3015、migrate、启动、健康检查"
|
|||
|
|
echo " APP_ROOT=$APP_ROOT"
|
|||
|
|
echo "═══════════════════════════════════════════════════════════"
|
|||
|
|
|
|||
|
|
if [ ! -d "$APP_ROOT" ]; then
|
|||
|
|
echo "❌ 错误: $APP_ROOT 不存在"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
if [ ! -f "$APP_ROOT/.env" ]; then
|
|||
|
|
echo "❌ 错误: $APP_ROOT/.env 不存在"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
cd "$APP_ROOT"
|
|||
|
|
|
|||
|
|
# 1. 删除缺 migration.sql 的目录(解决 P3015)
|
|||
|
|
echo ""
|
|||
|
|
echo "1️⃣ 检查 migrations,删除残缺目录..."
|
|||
|
|
if [ -d "$MIGRATIONS" ]; then
|
|||
|
|
for d in "$MIGRATIONS"/*/; do
|
|||
|
|
[ -d "$d" ] || continue
|
|||
|
|
name=$(basename "$d")
|
|||
|
|
if [ ! -f "${d}migration.sql" ]; then
|
|||
|
|
echo " 删除残缺目录(无 migration.sql): $name"
|
|||
|
|
rm -rf "$d"
|
|||
|
|
else
|
|||
|
|
echo " OK: $name"
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
else
|
|||
|
|
echo " ⚠️ prisma/migrations 不存在,跳过"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 2. Prisma migrate deploy
|
|||
|
|
echo ""
|
|||
|
|
echo "2️⃣ 执行 prisma migrate deploy..."
|
|||
|
|
npx prisma migrate deploy
|
|||
|
|
echo "✅ 迁移完成"
|
|||
|
|
|
|||
|
|
# 3. 若未 build 则 build(迁移后可能已有 dist,避免重复)
|
|||
|
|
if [ ! -d "dist" ] || [ ! -f "dist/index.js" ]; then
|
|||
|
|
echo ""
|
|||
|
|
echo "3️⃣ 构建..."
|
|||
|
|
npm run build
|
|||
|
|
else
|
|||
|
|
echo ""
|
|||
|
|
echo "3️⃣ dist 已存在,跳过 build"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 4. 启动
|
|||
|
|
echo ""
|
|||
|
|
echo "4️⃣ 启动服务..."
|
|||
|
|
if pm2 describe wildgrowth-api >/dev/null 2>&1; then
|
|||
|
|
pm2 restart wildgrowth-api
|
|||
|
|
echo " pm2 restart wildgrowth-api"
|
|||
|
|
else
|
|||
|
|
# 未在 pm2 中则 start
|
|||
|
|
pm2 start dist/index.js --name wildgrowth-api
|
|||
|
|
echo " pm2 start dist/index.js --name wildgrowth-api"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 5. 健康检查
|
|||
|
|
echo ""
|
|||
|
|
echo "5️⃣ 健康检查..."
|
|||
|
|
sleep 3
|
|||
|
|
if curl -sf http://localhost:3000/health >/dev/null; then
|
|||
|
|
echo "✅ 本机 health 正常"
|
|||
|
|
else
|
|||
|
|
echo "❌ 本机 health 失败: curl http://localhost:3000/health"
|
|||
|
|
pm2 logs wildgrowth-api --lines 30 --nostream
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 6. 记录 .deploy-last(若在 Git 根可拿到 HEAD)
|
|||
|
|
if [ -d "$GIT_ROOT/.git" ]; then
|
|||
|
|
(cd "$GIT_ROOT" && git rev-parse HEAD) > "$APP_ROOT/.deploy-last"
|
|||
|
|
echo " .deploy-last 已更新"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "═══════════════════════════════════════════════════════════"
|
|||
|
|
echo " ✅ 迁移收尾完成,服务已启动"
|
|||
|
|
echo " 请自测: https://api.muststudy.xin/health"
|
|||
|
|
echo " 回滚: bash deploy/deploy-from-github.sh rollback"
|
|||
|
|
echo "═══════════════════════════════════════════════════════════"
|