diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..eb83a07 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# آرتیفکت‌های release نباید تبدیل خط‌پایان بخورند (باینری Prisma + اسکریپت لینوکسی) +apps/api/release/** -text +apps/api/docker-entrypoint.sh text eol=lf +apps/api/release/docker-entrypoint.sh text eol=lf +apps/api/release/node_modules/@prisma/engines/** binary diff --git a/.gitignore b/.gitignore index 103c799..08686a8 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ coverage/ Thumbs.db # حجم اضافه در release — فقط باینری لینوکس لازم است -apps/api/release/node_modules/.cache/ -apps/api/release/node_modules/**/query_engine-windows.dll.node +apps/api/release/node_modules/**/.cache/ apps/api/release/node_modules/**/*.dll.node +apps/api/release/node_modules/**/*-windows.exe +apps/api/release/node_modules/**/*windows* diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index 24d9383..d33af13 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -10,6 +10,9 @@ ENV PORT=3000 COPY apps/api/release/ ./ +# گیت روی ویندوز بیت اجرا را حفظ نمی‌کند +RUN chmod +x /app/docker-entrypoint.sh /app/node_modules/@prisma/engines/schema-engine-* || true + EXPOSE 3000 CMD ["sh", "/app/docker-entrypoint.sh"] diff --git a/apps/api/docker-entrypoint.sh b/apps/api/docker-entrypoint.sh index ba89634..53b33ce 100644 --- a/apps/api/docker-entrypoint.sh +++ b/apps/api/docker-entrypoint.sh @@ -6,24 +6,40 @@ 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 + 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 + echo "[api] FATAL: prisma CLI missing — commit apps/api/release/node_modules" >&2 exit 1 fi -SCHEMA_ENGINE=$(ls node_modules/@prisma/engines/schema-engine*debian* 2>/dev/null | head -n 1 || true) -if [ -z "$SCHEMA_ENGINE" ]; then - echo "[api] FATAL: schema-engine لینوکس در release نیست." >&2 - echo "[api] لوکال دوباره بسازید: pnpm run build:api:release" >&2 - ls -la node_modules/@prisma/engines/ 2>&1 || true +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 @@ -59,16 +75,16 @@ socket.on('connect', () => { }); socket.on('error', (err) => { clearTimeout(timer); - console.error(`[api] FATAL: TCP error ${host}:${port} → ${err.message}`); + console.error(`[api] FATAL: TCP error ${host}:${port} → ${err.message}`); process.exit(1); }); NODE -# جلوگیری از تلاش برای دانلود آنلاین روی سرور -export PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING=1 - -echo "[api] running prisma migrate deploy..." -node node_modules/prisma/build/index.js migrate deploy --schema=./prisma/schema.prisma +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}" diff --git a/apps/api/release/docker-entrypoint.sh b/apps/api/release/docker-entrypoint.sh old mode 100644 new mode 100755 index ba89634..53b33ce --- a/apps/api/release/docker-entrypoint.sh +++ b/apps/api/release/docker-entrypoint.sh @@ -6,24 +6,40 @@ 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 + 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 + echo "[api] FATAL: prisma CLI missing — commit apps/api/release/node_modules" >&2 exit 1 fi -SCHEMA_ENGINE=$(ls node_modules/@prisma/engines/schema-engine*debian* 2>/dev/null | head -n 1 || true) -if [ -z "$SCHEMA_ENGINE" ]; then - echo "[api] FATAL: schema-engine لینوکس در release نیست." >&2 - echo "[api] لوکال دوباره بسازید: pnpm run build:api:release" >&2 - ls -la node_modules/@prisma/engines/ 2>&1 || true +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 @@ -59,16 +75,16 @@ socket.on('connect', () => { }); socket.on('error', (err) => { clearTimeout(timer); - console.error(`[api] FATAL: TCP error ${host}:${port} → ${err.message}`); + console.error(`[api] FATAL: TCP error ${host}:${port} → ${err.message}`); process.exit(1); }); NODE -# جلوگیری از تلاش برای دانلود آنلاین روی سرور -export PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING=1 - -echo "[api] running prisma migrate deploy..." -node node_modules/prisma/build/index.js migrate deploy --schema=./prisma/schema.prisma +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}" diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine deleted file mode 100644 index d46657b..0000000 Binary files a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine and /dev/null differ diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.gz.sha256 b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.gz.sha256 deleted file mode 100644 index 37663e8..0000000 --- a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -b72732897f7fb1d24ea9d26cb254b78b10d4257eaeb27f04d9fb82d20addc5d5 \ No newline at end of file diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.sha256 b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.sha256 deleted file mode 100644 index 80aa2fc..0000000 --- a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/libquery-engine.sha256 +++ /dev/null @@ -1 +0,0 @@ -7d58cada77c5833e57d2ab4ad61ea2948247b2caa8575066b2fe3bc7e4ea4e5a \ No newline at end of file diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine deleted file mode 100644 index 5e1e20d..0000000 Binary files a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine and /dev/null differ diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.gz.sha256 b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.gz.sha256 deleted file mode 100644 index 32aaa56..0000000 --- a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -cfdcce35f151ea8e57772f07fd909b6118389119b76e51ab1105ef86f955048b \ No newline at end of file diff --git a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.sha256 b/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.sha256 deleted file mode 100644 index 66dd092..0000000 --- a/apps/api/release/node_modules/@prisma/engines/node_modules/.cache/prisma/master/605197351a3c8bdd595af2d2a9bc3025bca48ea2/windows/schema-engine.sha256 +++ /dev/null @@ -1 +0,0 @@ -a7d949e16cc5937aa77d67888c8993118ef16c764e536e9ed7c17cfe61bb65ad \ No newline at end of file diff --git a/apps/api/release/node_modules/@prisma/engines/query_engine-windows.dll.node b/apps/api/release/node_modules/@prisma/engines/query_engine-windows.dll.node deleted file mode 100644 index d46657b..0000000 Binary files a/apps/api/release/node_modules/@prisma/engines/query_engine-windows.dll.node and /dev/null differ diff --git a/apps/api/release/node_modules/@prisma/engines/schema-engine-debian-openssl-3.0.x b/apps/api/release/node_modules/@prisma/engines/schema-engine-debian-openssl-3.0.x old mode 100644 new mode 100755 diff --git a/apps/api/release/node_modules/@prisma/engines/schema-engine-windows.exe b/apps/api/release/node_modules/@prisma/engines/schema-engine-windows.exe deleted file mode 100644 index 5e1e20d..0000000 Binary files a/apps/api/release/node_modules/@prisma/engines/schema-engine-windows.exe and /dev/null differ