Files
Lucky_Wheel/apps/api/docker-entrypoint.sh
T

92 lines
3.7 KiB
Bash

#!/bin/sh
set -eu
echo "[api] starting entrypoint at $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "[api] node=$(node -v) cwd=$(pwd)"
echo "[api] release check: app.js=$(test -f app.js && echo yes || echo NO) prisma=$(test -f node_modules/prisma/build/index.js && echo yes || echo NO)"
if [ ! -f app.js ]; then
echo "[api] FATAL: app.js missing — release copy failed" >&2
exit 1
fi
if [ ! -f node_modules/prisma/build/index.js ]; then
echo "[api] FATAL: prisma CLI missing — commit apps/api/release/node_modules" >&2
exit 1
fi
ENGINES_DIR=/app/node_modules/@prisma/engines
SCHEMA_ENGINE=$(ls "$ENGINES_DIR"/schema-engine*debian* 2>/dev/null | head -n 1 || true)
QUERY_ENGINE=$(ls "$ENGINES_DIR"/libquery_engine*debian*.so.node 2>/dev/null | head -n 1 || true)
if [ -z "$SCHEMA_ENGINE" ] || [ -z "$QUERY_ENGINE" ]; then
echo "[api] FATAL: Prisma engines لینوکس در release نیست. لوکال بسازید: pnpm run build:api:release" >&2
ls -la "$ENGINES_DIR" 2>&1 || true
exit 1
fi
# گیت روی ویندوز بیت اجرا را نگه نمی‌دارد؛ بدون این، spawn شکست می‌خورد و Prisma
# سراغ دانلود آنلاین می‌رود و روی سرور تایم‌اوت می‌شود.
chmod +x "$SCHEMA_ENGINE" 2>/dev/null || true
# مسیرها را صریح می‌دهیم تا Prisma هیچ‌وقت تلاش به دانلود نکند
export PRISMA_SCHEMA_ENGINE_BINARY="$SCHEMA_ENGINE"
export PRISMA_MIGRATION_ENGINE_BINARY="$SCHEMA_ENGINE"
export PRISMA_QUERY_ENGINE_LIBRARY="$QUERY_ENGINE"
export PRISMA_CLI_QUERY_ENGINE_TYPE=library
export PRISMA_CLIENT_ENGINE_TYPE=library
export CHECKPOINT_DISABLE=1
echo "[api] schema-engine=$SCHEMA_ENGINE"
echo "[api] query-engine=$QUERY_ENGINE"
echo "[api] schema-engine version: $("$SCHEMA_ENGINE" --version 2>&1 | head -n 1 || echo 'EXEC FAILED')"
if [ -z "${DATABASE_URL:-}" ]; then
echo "[api] FATAL: DATABASE_URL is empty" >&2
exit 1
fi
echo "[api] DATABASE_URL (redacted)=$(node -e "try{const u=new URL(process.env.DATABASE_URL);u.password='***';console.log(u.toString())}catch(e){console.log('INVALID:'+e.message)}")"
echo "[api] REDIS_HOST=${REDIS_HOST:-unset} REDIS_PORT=${REDIS_PORT:-unset}"
echo "[api] probing postgres TCP (10s timeout)..."
node <<'NODE'
const net = require('net');
let u;
try {
u = new URL(process.env.DATABASE_URL);
} catch (e) {
console.error('[api] FATAL: invalid DATABASE_URL', e.message);
process.exit(1);
}
const host = u.hostname;
const port = Number(u.port || 5432);
const socket = net.connect({ host, port });
const timer = setTimeout(() => {
console.error(`[api] FATAL: TCP timeout to ${host}:${port}`);
socket.destroy();
process.exit(1);
}, 10000);
socket.on('connect', () => {
clearTimeout(timer);
console.log(`[api] TCP OK ${host}:${port}`);
socket.end();
process.exit(0);
});
socket.on('error', (err) => {
clearTimeout(timer);
console.error(`[api] FATAL: TCP error ${host}:${port} → ${err.message}`);
process.exit(1);
});
NODE
echo "[api] running prisma migrate deploy (120s timeout)..."
if ! timeout 120 node node_modules/prisma/build/index.js migrate deploy --schema=./prisma/schema.prisma; then
echo "[api] FATAL: prisma migrate failed/timed out — لاگ بالا را ببینید" >&2
exit 1
fi
echo "[api] migrate done"
echo "[api] launching app.js on 0.0.0.0:${PORT:-3000}"
exec node app.js