#!/usr/bin/env bash set -euo pipefail # ────────────────────────────────────────────── # Zero-downtime deploy script for sase-v2 # ────────────────────────────────────────────── # Load NVM so node/pnpm are on PATH under non-interactive SSH sessions export NVM_DIR="$HOME/.nvm" # shellcheck disable=SC1091 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" DEPLOY_DIR="$(cd "$(dirname "$0")/.." && pwd)" LOG_PREFIX="[deploy]" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_PREFIX $1" } error_exit() { log "ERROR: $1" exit 1 } cd "$DEPLOY_DIR" || error_exit "Cannot change to project directory: $DEPLOY_DIR" log "Starting zero-downtime deployment..." log "Working directory: $DEPLOY_DIR" # ── Step 1: Sync to origin/main ── # Hard reset (not pull) so stale build artifacts on the deploy server # (e.g. apps/web/tsconfig.tsbuildinfo) don't block updates. The deploy # server is treated as a deployment target, not a development checkout. log "Fetching and resetting to origin/main..." git fetch origin main || error_exit "git fetch failed" git reset --hard origin/main || error_exit "git reset --hard failed" # ── Step 2: Install dependencies ── log "Installing dependencies (frozen lockfile)..." pnpm install --frozen-lockfile || error_exit "pnpm install failed" # ── Step 3: Build all packages and apps ── log "Building all packages..." pnpm build || error_exit "Build failed" # ── Step 3b: Pre-render public pages for SEO ── log "Installing Playwright Chromium (if missing)..." cd apps/web npx playwright install chromium --with-deps 2>/dev/null || log "WARNING: playwright install skipped" log "Pre-rendering public pages..." pnpm prerender || log "WARNING: Pre-render failed (non-fatal, continuing deploy)" cd "$DEPLOY_DIR" # ── Step 4: Database migrations ── log "Running database migrations..." cd apps/api pnpm db:migrate || error_exit "Database migration failed" cd "$DEPLOY_DIR" # ── Step 5: Zero-downtime PM2 reload ── log "Reloading PM2 processes (zero-downtime)..." pm2 reload ecosystem.config.js || error_exit "PM2 reload failed" # ── Step 6: Verify processes are running ── log "Verifying PM2 process status..." pm2 list log "Deployment completed successfully!"