#!/bin/bash # ============================================================================== # HomAroma / CMS Project - Post-Receive Hook for sql@192.168.1.26 # ============================================================================== # 1. PATH & ENVIRONMENT export PATH="/home/sql/.bun/bin:/usr/local/bin:/usr/bin:/bin:$PATH" set -e # 2. TARGET PATHS # Static Frontend Deployments (Nginx document root) TARGET_SPA="/var/www/html/cms/spa" TARGET_ADMIN="/var/www/html/cms/admin" # Backend & Next.js Website Working Directories TARGET_BACKEND="/home/sql/code/cms-api" TARGET_WEBSITE="/home/sql/code/cms-website" # 3. REPOSITORY CONFIG REPO="/home/sql/git/cms.git" BRANCH="master" TEMP_DIR="/tmp/cms_build_$(date +%s)" # 4. BINARY PATHS BUN="/home/sql/.bun/bin/bun" NODE="/usr/bin/node" PM2="/usr/bin/pm2" # 5. PM2 PROCESS NAMES PM2_NAME_BACKEND="cms-backend" PM2_NAME_WEBSITE="cms-website" # 6. SERVICE PORTS (Ensure no collision with 3001, 4000, 4545, 5000, 5432, 6333, 8000) BACKEND_PORT=3005 SSR_PORT=3002 # 7. BUILD ENVIRONMENT VARIABLES export VITE_API_URL="http://192.168.1.26:${BACKEND_PORT}/api" export NEXT_PUBLIC_API_URL="http://192.168.1.26:${BACKEND_PORT}/api" # ------------------------------------------------------------------------------ # START DEPLOYMENT # ------------------------------------------------------------------------------ echo "------- 🚀 Starting Full Deployment: sql@192.168.1.26 -------" # A. Prepare Temp Source from Checkout echo "Cloning branch $BRANCH to temporary directory: $TEMP_DIR" mkdir -p "$TEMP_DIR" git --work-tree="$TEMP_DIR" --git-dir="$REPO" checkout -f "$BRANCH" cd "$TEMP_DIR" echo "Installing monorepo dependencies with Bun..." $BUN install # B. Build & Deploy SPA if [ -d "apps/spa" ]; then echo ">>> Building SPA..." cd apps/spa $BUN run build echo "Deploying SPA to $TARGET_SPA..." mkdir -p "$TARGET_SPA" rm -rf "$TARGET_SPA"/* cp -rv dist/* "$TARGET_SPA"/ cd ../.. fi # C. Build & Deploy Admin Panel if [ -d "apps/admin" ]; then echo ">>> Building Admin Panel..." cd apps/admin $BUN run build echo "Deploying Admin Panel to $TARGET_ADMIN..." mkdir -p "$TARGET_ADMIN" rm -rf "$TARGET_ADMIN"/* cp -rv dist/* "$TARGET_ADMIN"/ cd ../.. fi # D. Deploy & Manage Backend if [ -d "apps/backend" ]; then echo ">>> Updating Backend at $TARGET_BACKEND..." mkdir -p "$TARGET_BACKEND/apps" mkdir -p "$TARGET_BACKEND/packages" rsync -av --delete \ --exclude='.env' \ --exclude='public/' \ --exclude='node_modules/' \ apps/backend/ "$TARGET_BACKEND/apps/backend/" rsync -av packages/ "$TARGET_BACKEND/packages/" cp package.json bun.lock ecosystem.config.js "$TARGET_BACKEND/" 2>/dev/null || cp package.json bun.lock "$TARGET_BACKEND/" cd "$TARGET_BACKEND" $BUN install mkdir -p "$TARGET_BACKEND/apps/backend/public" cd "$TARGET_BACKEND/apps/backend" echo ">>> Generating Prisma Client & Pushing DB..." $BUN x prisma generate $BUN x prisma db push --accept-data-loss || echo "Prisma db push skipped or failed" echo ">>> Managing PM2 for Backend..." if $PM2 describe "$PM2_NAME_BACKEND" > /dev/null 2>&1; then $PM2 restart "$PM2_NAME_BACKEND" --update-env else $PM2 start "$BUN" --name "$PM2_NAME_BACKEND" --cwd "$TARGET_BACKEND/apps/backend" -- run src/index.ts fi fi # E. Deploy & Manage Website (Next.js SSR) if [ -d "$TEMP_DIR/apps/website" ]; then echo ">>> Building Website (Next.js SSR)..." cd "$TEMP_DIR/apps/website" $BUN run build echo ">>> Updating Website at $TARGET_WEBSITE..." mkdir -p "$TARGET_WEBSITE" rsync -av --delete \ --exclude='.env' \ --exclude='node_modules/' \ "$TEMP_DIR/apps/website/.next/standalone/" "$TARGET_WEBSITE/" 2>/dev/null || echo "Standalone directory sync" if [ -d "$TEMP_DIR/apps/website/.next/static" ]; then mkdir -p "$TARGET_WEBSITE/.next/static" cp -rv "$TEMP_DIR/apps/website/.next/static/"* "$TARGET_WEBSITE/.next/static/" fi if [ -d "$TEMP_DIR/apps/website/public" ]; then cp -rv "$TEMP_DIR/apps/website/public" "$TARGET_WEBSITE/" fi echo ">>> Managing PM2 for Website..." cd "$TARGET_WEBSITE" PORT=$SSR_PORT if $PM2 describe "$PM2_NAME_WEBSITE" > /dev/null 2>&1; then $PM2 restart "$PM2_NAME_WEBSITE" --update-env else PORT=$SSR_PORT $PM2 start "$NODE" --name "$PM2_NAME_WEBSITE" -- server.js fi fi # F. Cleanup & Save PM2 rm -rf "$TEMP_DIR" $PM2 save echo "===== ✅ Deployment Completed Successfully! =====" $PM2 list