Files
upage-git/docker-entrypoint.sh
2025-09-24 17:02:44 +08:00

132 lines
3.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"