From 0e62ab60179f25858cdd2a5dbe86d0927f5f98ac Mon Sep 17 00:00:00 2001 From: mahmood Date: Thu, 10 Sep 2026 23:40:22 +0330 Subject: [PATCH] Fix some for build --- .dockerignore | 10 ++- .gitignore | 15 ++-- apps/api/Dockerfile | 22 ++--- apps/api/prisma/schema.prisma | 6 +- apps/api/release/package-lock.json | 112 ++++++++++++++++++++++++++ apps/api/release/prisma/schema.prisma | 6 +- apps/api/scripts/bundle-release.cjs | 45 +++++++---- 7 files changed, 169 insertions(+), 47 deletions(-) create mode 100644 apps/api/release/package-lock.json diff --git a/.dockerignore b/.dockerignore index bf2e8b1..dc2f059 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,3 @@ -node_modules -**/node_modules .git .idea .vscode @@ -16,9 +14,17 @@ coverage uploads docs iranSans + +# سورس و وابستگی‌های توسعه — فقط release/dist برای ایمیج لازم است +node_modules +apps/api/node_modules apps/api/src apps/api/dist apps/api/test +apps/admin/node_modules apps/admin/src +apps/client/node_modules apps/client/src packages + +# مهم: apps/api/release/node_modules نباید ignore شود (کپی‌only) diff --git a/.gitignore b/.gitignore index de8699d..84dfc51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,12 @@ +# وابستگی‌های توسعه node_modules/ -# بیلد میانی Nest — فقط release/ روی گیت می‌رود +apps/api/node_modules/ +apps/admin/node_modules/ +apps/client/node_modules/ +packages/*/node_modules/ + +# بیلد میانی apps/api/dist/ -apps/api/release/node_modules/ packages/shared-types/dist/ build/ .env @@ -12,7 +17,5 @@ coverage/ .DS_Store Thumbs.db -# فرانت و API release برای Dokploy (کپی‌only) باید commit شوند: -# apps/admin/dist/** -# apps/client/dist/** -# apps/api/release/** (بدون node_modules) +# آرتیفکت Dokploy (شامل release/node_modules) باید روی گیت باشد +# — apps/api/release/ و dist فرانت‌ها ignore نمی‌شوند diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index e7713d6..83a4200 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -1,26 +1,14 @@ -FROM docker.arvancloud.ir/node:20-alpine AS production +FROM docker.arvancloud.ir/node:20-bookworm -# تصویر نهایی: release را لوکال بسازید: -# pnpm --filter @lucky-wheel/api build:release -# سپس فقط کپی می‌شود (بدون nest build داخل ایمیج). +# فقط کپی — هیچ install/build/apk/apt داخل ایمیج نیست. +# لوکال: pnpm run build:api:release WORKDIR /app ENV NODE_ENV=production -# CDN رسمی Alpine روی خیلی از سرورهای ایران TLS می‌خورد → میرور آروان -RUN sed -i 's|dl-cdn.alpinelinux.org|mirror.arvancloud.ir|g' /etc/apk/repositories \ - && apk add --no-cache openssl libc6-compat - -COPY apps/api/release/package.json ./ -COPY apps/api/release/prisma ./prisma -COPY apps/api/release/app.js ./ - -RUN npm install --omit=dev \ - && npx prisma generate - -RUN mkdir -p uploads +COPY apps/api/release/ ./ EXPOSE 3000 -CMD ["sh", "-c", "npx prisma migrate deploy && node app.js"] +CMD ["sh", "-c", "./node_modules/.bin/prisma migrate deploy && node app.js"] diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 6844108..7d38377 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { - provider = "prisma-client-js" - // native = ماشین بیلد لوکال؛ linux-musl = Alpine داخل Docker/Dokploy - binaryTargets = ["native", "linux-musl-openssl-3.0.x"] + provider = "prisma-client-js" + // native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker + binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { diff --git a/apps/api/release/package-lock.json b/apps/api/release/package-lock.json new file mode 100644 index 0000000..a6f2ecb --- /dev/null +++ b/apps/api/release/package-lock.json @@ -0,0 +1,112 @@ +{ + "name": "lucky-wheel-api-release", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lucky-wheel-api-release", + "version": "1.0.0", + "dependencies": { + "@prisma/client": "5.22.0", + "prisma": "5.22.0" + } + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Fclient/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Fdebug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Fengines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Fengines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Ffetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/@prisma%2Fget-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://mirror2.chabokan.net/npm/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://mirror2.chabokan.net/npm/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + } + } +} diff --git a/apps/api/release/prisma/schema.prisma b/apps/api/release/prisma/schema.prisma index 6844108..7d38377 100644 --- a/apps/api/release/prisma/schema.prisma +++ b/apps/api/release/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { - provider = "prisma-client-js" - // native = ماشین بیلد لوکال؛ linux-musl = Alpine داخل Docker/Dokploy - binaryTargets = ["native", "linux-musl-openssl-3.0.x"] + provider = "prisma-client-js" + // native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker + binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { diff --git a/apps/api/scripts/bundle-release.cjs b/apps/api/scripts/bundle-release.cjs index 890db83..e64ef84 100644 --- a/apps/api/scripts/bundle-release.cjs +++ b/apps/api/scripts/bundle-release.cjs @@ -1,12 +1,14 @@ /** - * باندل تک‌فایل برای Docker (release/app.js) بعد از nest build. - * تنظیمات alias در ../esbuild.release.config.cjs + * باندل تک‌فایل + نصب Prisma لوکال داخل release/ + * خروجی کامل برای Docker کپی‌only: app.js + prisma + node_modules */ const esbuild = require('esbuild'); -const { existsSync, mkdirSync, cpSync, writeFileSync } = require('fs'); +const { existsSync, mkdirSync, cpSync, writeFileSync, rmSync } = require('fs'); const path = require('path'); +const { execSync } = require('child_process'); const root = path.join(__dirname, '..'); +const releaseDir = path.join(root, 'release'); const config = require(path.join(root, 'esbuild.release.config.cjs')); async function main() { @@ -16,21 +18,22 @@ async function main() { process.exit(1); } - const outfile = path.join(root, config.outfile); - mkdirSync(path.dirname(outfile), { recursive: true }); + mkdirSync(releaseDir, { recursive: true }); + const outfile = path.join(root, config.outfile); await esbuild.build({ ...config, entryPoints: [entry], outfile, }); + console.log('نوشت:', outfile); - // Prisma schema + migrations برای generate/migrate داخل کانتینر - const prismaSrc = path.join(root, 'prisma'); - const prismaDest = path.join(root, 'release', 'prisma'); - cpSync(prismaSrc, prismaDest, { recursive: true }); + const prismaDest = path.join(releaseDir, 'prisma'); + if (existsSync(prismaDest)) { + rmSync(prismaDest, { recursive: true, force: true }); + } + cpSync(path.join(root, 'prisma'), prismaDest, { recursive: true }); - // فقط native runtimeهای خارجی باندل (Prisma) const releasePkg = { name: 'lucky-wheel-api-release', private: true, @@ -40,13 +43,23 @@ async function main() { prisma: '5.22.0', }, }; - writeFileSync( - path.join(root, 'release', 'package.json'), - `${JSON.stringify(releasePkg, null, 2)}\n`, - ); + writeFileSync(path.join(releaseDir, 'package.json'), `${JSON.stringify(releasePkg, null, 2)}\n`); - console.log('نوشت:', outfile); - console.log('نوشت: release/prisma + release/package.json'); + // نصب و generate کاملاً لوکال — ایمیج Docker دیگر npm/apk نمی‌زند + console.log('در حال npm install داخل release (لوکال)...'); + execSync('npm install --omit=dev', { + cwd: releaseDir, + stdio: 'inherit', + env: { ...process.env, PRISMA_SKIP_POSTINSTALL_GENERATE: '1' }, + }); + + console.log('در حال prisma generate (باینری لینوکس برای Docker)...'); + execSync('npx prisma generate --schema=./prisma/schema.prisma', { + cwd: releaseDir, + stdio: 'inherit', + }); + + console.log('آماده‌ی کپی‌only:', releaseDir); } main().catch((err) => {