#!/bin/bash # ============================================================================== # PKH Project - Integrated Deployment Script (post-receive hook) # ============================================================================== # 1. TARGET PATHS (Nginx & PM2) TARGET_SPA="/home/ti/projects/MyNginxMain/nginx/html/pkh/spa" TARGET_ADMIN="/home/ti/projects/MyNginxMain/nginx/html/pkh/admin" TARGET_BACKEND="/home/ti/projects/pkh-api" TARGET_WEBSITE="/home/ti/projects/pkh-website" # <-- Next.js SSR App # 2. REPOSITORY CONFIG REPO="/home/ti/git/pkh.git" BRANCH="master" TEMP_DIR="/tmp/pkh_build_$(date +%s)" # 3. BINARY PATHS & PM2 BUN="/home/ti/.bun/bin/bun" PM2="/home/ti/.nvm/versions/node/v22.17.1/bin/pm2" PM2_NAME_BACKEND="pkh-backend" PM2_NAME_WEBSITE="pkh-website" # <-- PM2 process name สำหรับ SSR export PATH="$PATH:/home/ti/.bun/bin:/home/ti/.nvm/versions/node/v22.17.1/bin" # 4. BUILD ENVIRONMENT export VITE_API_URL="https://api.pkh.kitizone.com/api" export NEXT_PUBLIC_API_URL="https://api.pkh.kitizone.com/api" # <-- สำหรับ SSR (Client-side fetch) # Port ของ services (Nginx จะ proxy_pass มาที่นี่) BACKEND_PORT=3052 SSR_PORT=3003 # ------------------------------------------------------------------------------ # START DEPLOYMENT # ------------------------------------------------------------------------------ set -e echo "------- 🚀 Starting Full Deployment: PKH Platform -------" # 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..." $BUN install # B. Build & Deploy SPA (Frontend) 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 ../.. # C. Build & Deploy ADMIN PANEL 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 ../.. # D. Deploy & Manage BACKEND (API) echo ">>> Updating Backend at $TARGET_BACKEND..." mkdir -p $TARGET_BACKEND mkdir -p $TARGET_BACKEND/apps mkdir -p $TARGET_BACKEND/packages # Sync Backend Source inside a monorepo-like layout so workspace deps resolve rsync -av --delete \ --exclude='.env' \ --exclude='public/' \ --exclude='node_modules/' \ apps/backend/ $TARGET_BACKEND/apps/backend/ # Sync Shared Packages rsync -av packages/ $TARGET_BACKEND/packages/ cp package.json bun.lock ecosystem.config.js $TARGET_BACKEND/ # Rewrite ecosystem.config.js on the fly for pkh sed -i 's/homaroma/pkh/g' $TARGET_BACKEND/ecosystem.config.js sed -i 's/PORT: 3002/PORT: 3003/g' $TARGET_BACKEND/ecosystem.config.js cd $TARGET_BACKEND echo "Installing backend dependencies..." $BUN install # สร้าง public/ folder สำหรับ static files (upload images) mkdir -p $TARGET_BACKEND/apps/backend/public cd $TARGET_BACKEND/apps/backend # Generate Prisma Client (สำคัญมาก! ต้องรันทุกครั้งหลัง install) echo ">>> Generating Prisma Client..." $BUN x prisma generate # E. Database Migration (Safe Method) if [ ! -f "$TARGET_BACKEND/.env" ]; then echo "❌ Error: .env file is missing at $TARGET_BACKEND/.env. Deployment aborted." exit 1 fi # Copy .env to apps/backend so Prisma and the app can find it cp "$TARGET_BACKEND/.env" "$TARGET_BACKEND/apps/backend/.env" echo ">>> Running Prisma Migrate Deploy..." $BUN x prisma migrate deploy # F. PM2 Management - BACKEND echo ">>> Managing PM2 Process: $PM2_NAME_BACKEND..." $PM2 startOrReload $TARGET_BACKEND/ecosystem.config.js --only $PM2_NAME_BACKEND --env production --update-env echo "✅ PM2 process '$PM2_NAME_BACKEND' is running. Waiting 10s for it to fully start..." sleep 10 # G. Build & Deploy WEBSITE (Next.js SSR) echo ">>> Building Next.js SSR App inside monorepo temp dir..." cd $TEMP_DIR/apps/website $BUN run build # build จาก monorepo (workspace:* resolve ได้) # H. Prepare Next.js SSR echo ">>> Preparing Next.js SSR App..." rsync -av --delete \ $TEMP_DIR/apps/website/.next/standalone/ $TARGET_WEBSITE/ rsync -av \ $TEMP_DIR/apps/website/public/ $TARGET_WEBSITE/apps/website/public/ rsync -av \ $TEMP_DIR/apps/website/.next/static/ $TARGET_WEBSITE/apps/website/.next/static/ cp $TEMP_DIR/ecosystem.config.js $TARGET_WEBSITE/ # Rewrite ecosystem.config.js on the fly for pkh sed -i 's/homaroma/pkh/g' $TARGET_WEBSITE/ecosystem.config.js sed -i 's/PORT: 3002/PORT: 3003/g' $TARGET_WEBSITE/ecosystem.config.js # I. Fix Permissions echo ">>> Fixing Permissions..." chown -R ti:ti $TARGET_BACKEND $TARGET_WEBSITE # J. PM2 Management - SSR Next.js cd $TARGET_WEBSITE echo ">>> Creating symlink for .next..." ln -sf apps/website/.next .next echo ">>> Managing PM2 Process: $PM2_NAME_WEBSITE..." $PM2 startOrReload $TARGET_WEBSITE/ecosystem.config.js --only $PM2_NAME_WEBSITE --env production --update-env echo "✅ PM2 process '$PM2_NAME_WEBSITE' is running." # K. Cleanup echo "Cleaning up build artifacts..." rm -rf $TEMP_DIR echo "------- ✅ ALL DEPLOYMENTS COMPLETED SUCCESSFULLY -------" echo "" echo "📋 Service Summary:" echo " 🌐 Website (SSR) → https://pkh.kitizone.com (PM2: $PM2_NAME_WEBSITE, Port: $SSR_PORT)" echo " 📱 SPA → https://spa.pkh.kitizone.com" echo " 🔧 Admin Panel → https://admin.pkh.kitizone.com" echo " 🔌 API Backend → https://api.pkh.kitizone.com (PM2: $PM2_NAME_BACKEND, Port: $BACKEND_PORT)"