diff --git a/.dockerignore b/.dockerignore index f8e725a..fbde41c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,6 +2,7 @@ * !deploy-bundle.tar.gz +!prisma-client.tar.gz !Dockerfile !docker-compose.yml !docker-entrypoint.sh diff --git a/Dockerfile b/Dockerfile index a9a8a13..2254e20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,15 +9,20 @@ COPY deploy-bundle.tar.gz /tmp/deploy-bundle.tar.gz RUN tar -xzf /tmp/deploy-bundle.tar.gz -C /app \ && rm /tmp/deploy-bundle.tar.gz +# هیچ دستور prisma یا npm روی سرور اجرا نمی‌شود؛ همه چیز از قبل ساخته آمده است ENV CHECKPOINT_DISABLE=1 +ENV DO_NOT_TRACK=1 ENV PRISMA_HIDE_UPDATE_MESSAGE=1 -# اسکیما و generate قبل از dist بمانند تا لایه‌شان کش شود؛ generate روی سرور کند است COPY package.json package-lock.json prisma.config.ts /app/ COPY prisma /app/prisma -# DATABASE_URL فقط برای بارگذاری prisma.config.ts لازم است، اتصالی برقرار نمی‌شود -RUN DATABASE_URL="postgresql://build:build@localhost:5432/build?schema=public" \ - ./node_modules/.bin/prisma generate + +# کلاینت Prisma روی سیستم دولوپر با scripts/pack-prisma-client.sh ساخته می‌شود +COPY prisma-client.tar.gz /tmp/prisma-client.tar.gz +RUN rm -rf /app/node_modules/.prisma/client \ + && mkdir -p /app/node_modules/.prisma \ + && tar -xzf /tmp/prisma-client.tar.gz -C /app/node_modules/.prisma \ + && rm /tmp/prisma-client.tar.gz # dist آخر باشد تا دیپلوی معمولی فقط همین لایه را دوباره بسازد COPY dist /app/dist diff --git a/README.md b/README.md index a686fda..ac2390b 100644 --- a/README.md +++ b/README.md @@ -27,15 +27,16 @@ npm run start:dev ## دیپلوی: بیلد روی سیستم خودت، اجرا روی سرور -روی سرور هیچ `npm` یا دانلودی لازم نیست. `node_modules` از قبل داخل -`deploy-bundle.tar.gz` (روی گیت) است و `dist` هم روی گیت commit می‌شود. +روی سرور هیچ `npm` و هیچ دستور `prisma` اجرا نمی‌شود. سه چیز از قبل ساخته و روی +گیت هستند: `dist`، `prisma-client.tar.gz` (کلاینت Prisma) و +`deploy-bundle.tar.gz` (`node_modules` پروداکشن). **۱) روی سیستم خودت:** ```bash cd fabric_trade_server -npm run build -git add dist && git commit -m "..." && git push +npm run deploy:build +git add dist prisma-client.tar.gz && git commit -m "..." && git push ``` **۲) روی سرور:** @@ -47,9 +48,12 @@ docker compose up -d --build docker compose logs -f api ``` -`Dockerfile` باندل را باز می‌کند، بعد `dist` و `prisma` و `package.json` را از -گیت روی آن می‌نویسد و `prisma generate` می‌زند؛ پس تغییر schema و مایگریشن -جدید هم فقط با `git pull` می‌رسد. +`Dockerfile` باندل را باز می‌کند، بعد `dist` و `prisma` و کلاینت آماده‌ی Prisma +را روی آن می‌نویسد. `prisma generate` روی هاست پروداکشن چند دقیقه طول می‌کشد، +پس عمداً آنجا اجرا نمی‌شود. + +هر بار که `prisma/schema.prisma` را عوض کردی، `npm run deploy:build` را بزن تا +`prisma-client.tar.gz` هم به‌روز شود؛ وگرنه سرور با کلاینت قدیمی بالا می‌آید. **فقط اگر پکیج npm جدید اضافه شد** باندل را دوباره بساز و push کن: diff --git a/package.json b/package.json index 497d64f..11f7da6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main.js", + "deploy:build": "npm run build && bash scripts/pack-prisma-client.sh", "build:deploy": "bash scripts/build-local-dist.sh", "docker:dist": "docker compose -f docker-compose.dist.yml up -d --build", "test": "jest", diff --git a/prisma-client.tar.gz b/prisma-client.tar.gz new file mode 100644 index 0000000..efc771b Binary files /dev/null and b/prisma-client.tar.gz differ diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8a718c2..7c77dfe 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,6 +1,6 @@ generator client { provider = "prisma-client-js" - binaryTargets = ["native", "debian-openssl-3.0.x", "linux-musl-openssl-3.0.x"] + binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { diff --git a/scripts/pack-prisma-client.sh b/scripts/pack-prisma-client.sh new file mode 100644 index 0000000..1016d7a --- /dev/null +++ b/scripts/pack-prisma-client.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# کلاینت Prisma را روی سیستم دولوپر می‌سازد و بسته‌بندی می‌کند. +# سرور نباید prisma generate بزند؛ روی هاست پروडاکشن دقایق طول می‌کشد. +set -euo pipefail +cd "$(dirname "$0")/.." + +OUT="prisma-client.tar.gz" +SRC="node_modules/.prisma/client" + +if [ ! -d node_modules/prisma ]; then + echo "ERROR: node_modules نیست. اول npm ci بزن." >&2 + exit 1 +fi + +# خروجی قبلی پاک شود تا engineهای بی‌استفاده در بسته نمانند +rm -rf "$SRC" + +DATABASE_URL="${DATABASE_URL:-postgresql://build:build@localhost:5432/build?schema=public}" \ + CHECKPOINT_DISABLE=1 ./node_modules/.bin/prisma generate + +test -f "$SRC/libquery_engine-debian-openssl-3.0.x.so.node" \ + || { echo "ERROR: engine مربوط به debian-openssl-3.0.x ساخته نشد." >&2; exit 1; } + +rm -f "$OUT" +tar -czf "$OUT" -C node_modules/.prisma client +ls -lh "$OUT"