Files
homaroma/serverinfo/192.168.1.26/post-receive.template
T
2026-10-17 13:34:07 +07:00

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