From 56afc032d2cb4fd3b32c4502b6c7fb06fbe747f8 Mon Sep 17 00:00:00 2001 From: adonis Date: Wed, 5 Aug 2026 21:17:44 +0330 Subject: [PATCH] Add host-build deploy path for slow Docker npm installs Install and build on the server host with npmmirror, then package a slim image without network during docker build. Co-authored-by: Cursor --- .dockerignore | 2 -- Dockerfile.prebuilt | 20 ++++++++++++++++++ deploy-host-build.sh | 31 ++++++++++++++++++++++++++++ docker-compose.prebuilt.yml | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 Dockerfile.prebuilt create mode 100644 deploy-host-build.sh create mode 100644 docker-compose.prebuilt.yml diff --git a/.dockerignore b/.dockerignore index b445473..26b13f7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,3 @@ -node_modules -dist coverage .git .gitignore diff --git a/Dockerfile.prebuilt b/Dockerfile.prebuilt new file mode 100644 index 0000000..9ad2c6d --- /dev/null +++ b/Dockerfile.prebuilt @@ -0,0 +1,20 @@ +# ایمیج سبک: فرض می‌کند روی خود سرور قبلاً npm ci + build زده‌ای +# هیچ دانلودی داخل Docker انجام نمی‌شود (مناسب سرور ایران) + +FROM node:22-alpine +WORKDIR /app + +ENV NODE_ENV=production + +COPY package.json package-lock.json ./ +COPY node_modules ./node_modules +COPY dist ./dist +COPY prisma ./prisma +COPY prisma.config.ts ./ +COPY docker-entrypoint.sh ./ + +RUN chmod +x docker-entrypoint.sh + +EXPOSE 3000 + +ENTRYPOINT ["./docker-entrypoint.sh"] diff --git a/deploy-host-build.sh b/deploy-host-build.sh new file mode 100644 index 0000000..d72e71b --- /dev/null +++ b/deploy-host-build.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")" + +MIRROR="${NPM_REGISTRY:-https://registry.npmmirror.com}" +MIRROR="${MIRROR%/}" + +echo "==> npm registry: $MIRROR" +npm config set registry "$MIRROR" +sed -i \ + -e "s|https://registry.npmjs.org|${MIRROR}|g" \ + -e "s|https://mirror.iranserver.com/npm|${MIRROR}|g" \ + package-lock.json + +echo "==> npm ci (روی خود سرور، خارج از Docker)..." +npm ci --no-audit --no-fund + +echo "==> prisma generate + build..." +npx prisma generate +npm run build + +# prisma CLI برای migrate داخل کانتینر لازم است +npm install prisma ts-node typescript --no-save --no-audit --no-fund --registry="$MIRROR" + +echo "==> Docker up (بدون دانلود npm داخل بیلد)..." +export RUN_SEED="${RUN_SEED:-true}" +docker compose -f docker-compose.prebuilt.yml up -d --build + +echo "" +echo "OK. health: curl http://127.0.0.1:3000/api/health" +echo "logs: docker compose -f docker-compose.prebuilt.yml logs -f api" diff --git a/docker-compose.prebuilt.yml b/docker-compose.prebuilt.yml new file mode 100644 index 0000000..4e69fb0 --- /dev/null +++ b/docker-compose.prebuilt.yml @@ -0,0 +1,41 @@ +services: + postgres: + image: postgres:16-alpine + container_name: fabric_trade_db + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER:-fabric} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fabric123} + POSTGRES_DB: ${POSTGRES_DB:-fabric_trade} + ports: + - '${POSTGRES_PORT:-5432}:5432' + volumes: + - fabric_pg_data:/var/lib/postgresql/data + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB'] + interval: 5s + timeout: 5s + retries: 10 + + api: + build: + context: . + dockerfile: Dockerfile.prebuilt + container_name: fabric_trade_api + restart: unless-stopped + depends_on: + postgres: + condition: service_healthy + environment: + DATABASE_URL: postgresql://${POSTGRES_USER:-fabric}:${POSTGRES_PASSWORD:-fabric123}@postgres:5432/${POSTGRES_DB:-fabric_trade}?schema=public + JWT_SECRET: ${JWT_SECRET:-fabric-trade-dev-secret-change-me} + JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d} + PORT: 3000 + MOCK_OTP_CODE: ${MOCK_OTP_CODE:-123456} + OTP_TTL_MINUTES: ${OTP_TTL_MINUTES:-5} + RUN_SEED: ${RUN_SEED:-false} + ports: + - '127.0.0.1:${API_PORT:-3000}:3000' + +volumes: + fabric_pg_data: