Fix some for build
This commit is contained in:
+5
-17
@@ -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"]
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Generated
+112
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user