#!/bin/bash # ============================================================================== # Kittisak Project - Integrated Deployment Script (post-receive hook) # ============================================================================== # 1. TARGET PATHS (Nginx & PM2) TARGET_SPA="/home/ti/projects/MyNginxMain/nginx/html/moto/spa" TARGET_ADMIN="/home/ti/projects/MyNginxMain/nginx/html/moto/admin" TARGET_BACKEND="/home/ti/projects/moto-api" TARGET_WEBSITE="/home/ti/projects/moto-website" # 2. REPOSITORY CONFIG REPO="/home/ti/git/moto.kittisak.com.git" BRANCH="master" TEMP_DIR="/tmp/moto_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="moto-backend" PM2_NAME_WEBSITE="moto-website" 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.moto.kittisak.com/api" export NEXT_PUBLIC_API_URL="https://api.moto.kittisak.com/api" # Customer-specific values. Fill these in on the server if enabled. export VITE_LIFF_ID="${VITE_LIFF_ID:-}" export VITE_OMISE_PUBLIC_KEY="${VITE_OMISE_PUBLIC_KEY:-}" # Service ports. Nginx proxies to these ports. BACKEND_PORT=3058 SSR_PORT=3009 # ------------------------------------------------------------------------------ # START DEPLOYMENT # ------------------------------------------------------------------------------ set -e echo "------- Starting Full Deployment: moto 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 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 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/ sed -i 's/homaroma/moto/g' $TARGET_BACKEND/ecosystem.config.js sed -i 's/PORT: 3002/PORT: 3009/g' $TARGET_BACKEND/ecosystem.config.js cd $TARGET_BACKEND echo "Installing backend dependencies..." $BUN install mkdir -p $TARGET_BACKEND/apps/backend/public cd $TARGET_BACKEND/apps/backend echo ">>> Generating Prisma Client..." $BUN x prisma generate if [ ! -f "$TARGET_BACKEND/.env" ]; then echo "Error: .env file is missing at $TARGET_BACKEND/.env. Deployment aborted." exit 1 fi cp "$TARGET_BACKEND/.env" "$TARGET_BACKEND/apps/backend/.env" echo ">>> Running Prisma Migrate Deploy..." $BUN x prisma migrate deploy # E. 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 # F. Build & Deploy WEBSITE (Next.js SSR) echo ">>> Building Next.js SSR App inside monorepo temp dir..." cd $TEMP_DIR/apps/website $BUN run build # G. 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/ sed -i 's/homaroma/moto/g' $TARGET_WEBSITE/ecosystem.config.js sed -i 's/PORT: 3002/PORT: 3009/g' $TARGET_WEBSITE/ecosystem.config.js # H. Fix Permissions echo ">>> Fixing Permissions..." chown -R ti:ti $TARGET_BACKEND $TARGET_WEBSITE # I. 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." # J. Cleanup echo "Cleaning up build artifacts..." rm -rf $TEMP_DIR echo "------- ALL DEPLOYMENTS COMPLETED SUCCESSFULLY -------" echo "" echo "Service Summary:" echo " Website (SSR) -> https://moto.kittisak.com (PM2: $PM2_NAME_WEBSITE, Port: $SSR_PORT)" echo " SPA -> https://spa.moto.kittisak.com" echo " Admin Panel -> https://admin.moto.kittisak.com" echo " API Backend -> https://api.kittisak.com (PM2: $PM2_NAME_BACKEND, Port: $BACKEND_PORT)"