From 81d0571d72e270687d63a755814ddb8f697ad509 Mon Sep 17 00:00:00 2001 From: adonis Date: Wed, 5 Aug 2026 21:27:41 +0330 Subject: [PATCH] Speed up deploy by using portable Node on host disk Avoid slow npm installs over Docker bind mounts; download Node from npmmirror and build on the server filesystem. Co-authored-by: Cursor --- deploy-host-build.sh | 80 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/deploy-host-build.sh b/deploy-host-build.sh index 52c7998..1ed6884 100644 --- a/deploy-host-build.sh +++ b/deploy-host-build.sh @@ -4,56 +4,60 @@ cd "$(dirname "$0")" MIRROR="${NPM_REGISTRY:-https://registry.npmmirror.com}" MIRROR="${MIRROR%/}" - -# میرور ایمیج Docker (ایران) — اگر کار نکرد با NODE_IMAGE عوض کن -NODE_IMAGE="${NODE_IMAGE:-docker.iranserver.com/library/node:22-alpine}" +NODE_VERSION="${NODE_VERSION:-22.14.0}" +NODE_DIR="${PWD}/.tools/node" +NODE_BIN="${NODE_DIR}/bin" echo "==> npm registry: $MIRROR" -echo "==> Node image: $NODE_IMAGE" -echo "==> اگر pull طول کشید صبر کن؛ اولین بار ایمیج دانلود می‌شود" -# آماده‌سازی lockfile برای میرور +# Node پرتابل از میرور (بدون apt و بدون docker pull) +if [ ! -x "${NODE_BIN}/node" ]; then + echo "==> دانلود Node ${NODE_VERSION} از npmmirror..." + mkdir -p .tools + curl -fL --retry 5 --retry-delay 2 \ + "https://npmmirror.com/mirrors/node/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \ + -o /tmp/node.tar.xz + rm -rf "${NODE_DIR}" + mkdir -p .tools + tar -xJf /tmp/node.tar.xz -C .tools + mv ".tools/node-v${NODE_VERSION}-linux-x64" "${NODE_DIR}" + rm -f /tmp/node.tar.xz +fi + +export PATH="${NODE_BIN}:${PATH}" +echo "==> $(node -v) / npm $(npm -v)" + +echo "==> آماده‌سازی package-lock برای میرور..." sed -i \ -e "s|https://registry.npmjs.org|${MIRROR}|g" \ -e "s|https://mirror.iranserver.com/npm|${MIRROR}|g" \ package-lock.json -pull_node() { - if docker image inspect "$NODE_IMAGE" >/dev/null 2>&1; then - echo "==> Node image already present" - return 0 - fi - echo "==> Pulling Node image..." - if docker pull "$NODE_IMAGE"; then - return 0 - fi - echo "==> میرور اول شکست خورد؛ تلاش با Docker Hub..." - NODE_IMAGE="node:22-alpine" - docker pull "$NODE_IMAGE" -} +npm config set registry "$MIRROR" +npm config set fetch-retries 5 +npm config set fetch-retry-mintimeout 20000 +npm config set fetch-retry-maxtimeout 120000 +npm config set progress true +npm config set loglevel info -pull_node +echo "==> npm ci روی دیسک سرور (سریع‌تر از داخل Docker)..." +npm ci --no-audit --no-fund -echo "==> npm ci + build داخل کانتینر موقت..." -docker run --rm \ - -v "$PWD":/app \ - -w /app \ - -e NPM_CONFIG_REGISTRY="$MIRROR" \ - "$NODE_IMAGE" \ - sh -c "set -eux - npm config set registry '$MIRROR' - npm config set fetch-retries 5 - npm config set fetch-retry-mintimeout 20000 - npm config set fetch-retry-maxtimeout 120000 - npm ci --no-audit --no-fund - npx prisma generate - npm run build - npm prune --omit=dev - npm install prisma ts-node typescript --no-save --no-audit --no-fund --registry='$MIRROR' - " +echo "==> prisma generate + build..." +npx prisma generate +npm run build +npm prune --omit=dev +npm install prisma ts-node typescript --no-save --no-audit --no-fund --registry="$MIRROR" -echo "==> ساخت و اجرای API..." +echo "==> Docker فقط برای اجرا (Postgres + API)..." export RUN_SEED="${RUN_SEED:-true}" + +# برای بیلد prebuilt به ایمیج پایه node نیاز است؛ اگر نباشد از هاب می‌گیرد +if ! docker image inspect node:22-alpine >/dev/null 2>&1; then + echo "==> pull node:22-alpine برای ایمیج نهایی..." + docker pull node:22-alpine || true +fi + docker compose -f docker-compose.prebuilt.yml up -d --build echo ""