150 lines
4.4 KiB
Bash
150 lines
4.4 KiB
Bash
#!/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
|