Files
homaroma/post-receive-local
T

155 lines
5.3 KiB
Bash

#!/bin/bash
# ==============================================================================
# HomAroma Project - Integrated Deployment Script (post-receive hook)
# ==============================================================================
# 1. TARGET PATHS (Nginx & PM2)
TARGET_SPA="/home/ti/projects/MyNginxMain/nginx/html/homaroma.shop/spa"
TARGET_ADMIN="/home/ti/projects/MyNginxMain/nginx/html/homaroma.shop/admin"
TARGET_BACKEND="/home/ti/projects/homaroma-api"
TARGET_WEBSITE="/home/ti/projects/homaroma-website" # <-- Next.js SSR App
# 2. REPOSITORY CONFIG
REPO="/home/ti/git/homaroma.git"
BRANCH="master"
TEMP_DIR="/tmp/homaroma_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="homaroma-backend"
PM2_NAME_WEBSITE="homaroma-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.homaroma.shop/api"
export VITE_LIFF_ID="2010318436-npAZzUIV" # <-- สำหรับ LINE LIFF
export NEXT_PUBLIC_API_URL="https://api.homaroma.shop/api" # <-- สำหรับ SSR (Client-side fetch)
export VITE_OMISE_PUBLIC_KEY="pkey_test_67xsxzv86rp19bamkwg"
# Port ของ Next.js SSR (Nginx จะ proxy_pass มาที่นี่)
SSR_PORT=3002
# ------------------------------------------------------------------------------
# START DEPLOYMENT
# ------------------------------------------------------------------------------
set -e
echo "------- 🚀 Starting Full Deployment: HomAroma 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 สำหรับ LINE LIFF)
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/
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
echo "✅ PM2 process '$PM2_NAME_BACKEND' is running."
# 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 ได้)
# E. 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/
# F. Fix Permissions
echo ">>> Fixing Permissions..."
chown -R ti:ti $TARGET_BACKEND $TARGET_WEBSITE
# H. 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
echo "✅ PM2 process '$PM2_NAME_WEBSITE' is running."
# I. Cleanup
echo "Cleaning up build artifacts..."
rm -rf $TEMP_DIR
echo "------- ✅ ALL DEPLOYMENTS COMPLETED SUCCESSFULLY -------"
echo ""
echo "📋 Service Summary:"
echo " 🌐 Website (SSR) → https://homaroma.shop (PM2: $PM2_NAME_WEBSITE, Port: $SSR_PORT)"
echo " 📱 SPA (LIFF) → https://spa.homaroma.shop"
echo " 🔧 Admin Panel → https://admin.homaroma.shop"
echo " 🔌 API Backend → https://api.homaroma.shop (PM2: $PM2_NAME_BACKEND)"