#!/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 ls -la node_modules 2>&1 || true exit 1 fi if [ -z "${DATABASE_URL:-}" ]; then echo "[api] FATAL: DATABASE_URL is empty" >&2 exit 1 fi # پسورد را در لاگ نشان نده — فقط host/port/db 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} — سرویس postgres در شبکه compose در دسترس نیست`); 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 (60s timeout)..." if ! timeout 60 node node_modules/prisma/build/index.js migrate deploy --schema=./prisma/schema.prisma; then echo "[api] FATAL: prisma migrate failed or 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