#!/bin/sh # ============================================================================= # 追光AI APP 容器启动入口 # - 校验 .env # - 跑 prisma migrate deploy(生产环境,安全前向迁移) # - 启动 next start # ============================================================================= set -e cd /app # Seed data volume if empty if [ ! -f /app/data/bot-characters.json ] && [ -d /app/data-seed ]; then echo "[entrypoint] Seeding data volume..." cp -r /app/data-seed/* /app/data/ fi # 1) .env 校验 if [ ! -f /app/.env ]; then echo "[entrypoint-app] FATAL: /app/.env not found. Mount .env file into container." exit 1 fi # 让 .env 对 next start 可见(Next.js 14 在 production 下也会读 .env) set -a . /app/.env set +a # 移除 NODE_TLS_REJECT_UNAUTHORIZED 以消除警告(在 prisma 迁移之前) unset NODE_TLS_REJECT_UNAUTHORIZED # 2) 跑迁移(幂等;不阻塞启动) echo "[entrypoint-app] Running prisma migrate deploy..." npx prisma migrate deploy --schema=prisma/schema.prisma 2>&1 | tail -20 || { echo "[entrypoint-app] WARN: migrate failed, continuing (DB schema may be ahead of migrations)" } # 3) 重新生成 Prisma client # 防止持久卷(zhuiguang-ai_bot-prisma)中的旧 client 与 schema 不一致 # 导致运行时 "Unknown field xxx for select statement" 错误 echo "[entrypoint-app] Regenerating Prisma client..." npx prisma generate --schema=prisma/schema.prisma 2>&1 | tail -5 || { echo "[entrypoint-app] WARN: prisma generate failed, continuing with existing client" } # 4) 启动 Next.js echo "[entrypoint-app] Starting next start on port ${PORT:-8301}..." exec node_modules/.bin/next start --port ${PORT:-8301} --hostname 0.0.0.0