132 lines
3.7 KiB
Bash
132 lines
3.7 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
echo "🚀 启动 UPage 应用..."
|
||
|
||
print_db_info() {
|
||
if [ -z "$DATABASE_URL" ]; then
|
||
echo "⚠️ 警告:DATABASE_URL 环境变量未设置!"
|
||
return
|
||
fi
|
||
|
||
DB_USER=$(echo $DATABASE_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p')
|
||
DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p')
|
||
DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p')
|
||
DB_NAME=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p')
|
||
DB_SCHEMA=$(echo $DATABASE_URL | sed -n 's/.*schema=\([^&]*\).*/\1/p')
|
||
|
||
echo "📊 数据库连接信息:"
|
||
echo " - 用户: $DB_USER"
|
||
echo " - 主机: $DB_HOST"
|
||
echo " - 端口: $DB_PORT"
|
||
echo " - 数据库: $DB_NAME"
|
||
echo " - Schema: $DB_SCHEMA"
|
||
}
|
||
|
||
echo "🖥️ 系统环境信息:"
|
||
echo " - NODE_ENV: $NODE_ENV"
|
||
echo " - 当前用户: $(whoami)"
|
||
echo " - 工作目录: $(pwd)"
|
||
|
||
print_db_info
|
||
|
||
echo "⏳ 等待数据库连接..."
|
||
MAX_RETRIES=5
|
||
RETRY_COUNT=0
|
||
|
||
ERROR_LOG=$(mktemp)
|
||
|
||
until pnpm prisma db push --accept-data-loss 2>$ERROR_LOG || pnpm prisma migrate deploy 2>$ERROR_LOG; do
|
||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||
|
||
echo "❌ 数据库连接尝试 $RETRY_COUNT 失败,错误信息:"
|
||
cat $ERROR_LOG
|
||
|
||
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
|
||
echo "❌ 数据库连接失败!已达到最大重试次数。"
|
||
echo "🔍 最后一次错误详情:"
|
||
cat $ERROR_LOG
|
||
echo "🔍 尝试使用 pg_isready 检查数据库连接:"
|
||
if command -v pg_isready >/dev/null 2>&1; then
|
||
pg_isready -h $DB_HOST -p $DB_PORT -U $DB_USER && echo "✅ 数据库可以连接" || echo "❌ 数据库无法连接"
|
||
else
|
||
echo "⚠️ pg_isready 命令不可用,无法进行连接测试"
|
||
fi
|
||
exit 1
|
||
fi
|
||
|
||
echo "⏳ 数据库尚未就绪,等待 5 秒后重试... (${RETRY_COUNT}/${MAX_RETRIES})"
|
||
sleep 5
|
||
done
|
||
|
||
rm -f $ERROR_LOG
|
||
|
||
echo "✅ 数据库连接成功"
|
||
|
||
echo "🔍 检查数据库迁移状态..."
|
||
|
||
MIGRATE_ERROR_LOG=$(mktemp)
|
||
|
||
if pnpm prisma migrate deploy 2>$MIGRATE_ERROR_LOG | grep -q "P3005"; then
|
||
echo "📊 检测到已存在的数据库结构,需要应用baseline..."
|
||
|
||
echo "📑 获取所有迁移..."
|
||
MIGRATION_DIRS=$(find prisma/migrations -maxdepth 1 -type d | grep -v "^prisma/migrations$" | sort)
|
||
|
||
if [ -z "$MIGRATION_DIRS" ]; then
|
||
echo "⚠️ 未找到迁移,跳过baseline处理"
|
||
else
|
||
echo "🔄 找到以下迁移:"
|
||
|
||
for MIGRATION_DIR in $MIGRATION_DIRS; do
|
||
MIGRATION_NAME=$(basename "$MIGRATION_DIR")
|
||
echo " - $MIGRATION_NAME"
|
||
|
||
echo "🔖 将迁移 $MIGRATION_NAME 标记为已应用..."
|
||
RESOLVE_ERROR_LOG=$(mktemp)
|
||
if ! pnpm prisma migrate resolve --applied "$MIGRATION_NAME" 2>$RESOLVE_ERROR_LOG; then
|
||
echo "⚠️ 标记迁移 $MIGRATION_NAME 时出错:"
|
||
cat $RESOLVE_ERROR_LOG
|
||
fi
|
||
rm -f $RESOLVE_ERROR_LOG
|
||
done
|
||
|
||
echo "✅ Baseline应用成功"
|
||
|
||
echo "🔄 检查并应用新的迁移..."
|
||
DEPLOY_ERROR_LOG=$(mktemp)
|
||
if ! pnpm prisma migrate deploy 2>$DEPLOY_ERROR_LOG; then
|
||
echo "⚠️ 应用新迁移时出错:"
|
||
cat $DEPLOY_ERROR_LOG
|
||
fi
|
||
rm -f $DEPLOY_ERROR_LOG
|
||
fi
|
||
else
|
||
if [ -s "$MIGRATE_ERROR_LOG" ]; then
|
||
echo "⚠️ 数据库迁移过程中出现警告或错误:"
|
||
cat $MIGRATE_ERROR_LOG
|
||
else
|
||
echo "🆕 数据库迁移已成功应用"
|
||
fi
|
||
fi
|
||
|
||
rm -f $MIGRATE_ERROR_LOG
|
||
|
||
echo "✅ 数据库迁移完成"
|
||
|
||
echo "🔧 生成 Prisma Client..."
|
||
GENERATE_ERROR_LOG=$(mktemp)
|
||
if ! pnpm prisma generate 2>$GENERATE_ERROR_LOG; then
|
||
echo "⚠️ 生成 Prisma Client 时出错:"
|
||
cat $GENERATE_ERROR_LOG
|
||
else
|
||
echo "✅ Prisma Client 生成完成"
|
||
fi
|
||
rm -f $GENERATE_ERROR_LOG
|
||
|
||
echo "🎉 启动应用服务..."
|
||
|
||
# 执行传入的命令
|
||
echo "🚀 执行命令: $@"
|
||
exec "$@"
|