Ship prebuilt Prisma client so the server never runs prisma generate
prisma generate needs over three minutes on the production host, which made every deploy hang on that build step. The client is now generated on the dev machine into prisma-client.tar.gz (tracked, 8.5MB) and the image just untars it. Dropping the unused linux-musl engine target halves that payload. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
*
|
||||
!deploy-bundle.tar.gz
|
||||
!prisma-client.tar.gz
|
||||
!Dockerfile
|
||||
!docker-compose.yml
|
||||
!docker-entrypoint.sh
|
||||
|
||||
+9
-4
@@ -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
|
||||
|
||||
@@ -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 کن:
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
Binary file not shown.
@@ -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 {
|
||||
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user