157 lines
5.1 KiB
Bash
157 lines
5.1 KiB
Bash
#!/bin/bash
|
|
|
|
# ==============================================================================
|
|
# Kittisak Project - Integrated Deployment Script (post-receive hook)
|
|
# ==============================================================================
|
|
|
|
# 1. TARGET PATHS (Nginx & PM2)
|
|
TARGET_SPA="/home/ti/projects/MyNginxMain/nginx/html/fashion/spa"
|
|
TARGET_ADMIN="/home/ti/projects/MyNginxMain/nginx/html/fashion/admin"
|
|
TARGET_BACKEND="/home/ti/projects/fashion-api"
|
|
TARGET_WEBSITE="/home/ti/projects/fashion-website"
|
|
|
|
# 2. REPOSITORY CONFIG
|
|
REPO="/home/ti/git/fashion.kittisak.com.git"
|
|
BRANCH="master"
|
|
TEMP_DIR="/tmp/fashion_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="fashion-backend"
|
|
PM2_NAME_WEBSITE="fashion-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.fashion.kittisak.com/api"
|
|
export NEXT_PUBLIC_API_URL="https://api.fashion.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=3056
|
|
SSR_PORT=3007
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# START DEPLOYMENT
|
|
# ------------------------------------------------------------------------------
|
|
set -e
|
|
echo "------- Starting Full Deployment: fashion 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/fashion/g' $TARGET_BACKEND/ecosystem.config.js
|
|
sed -i 's/PORT: 3002/PORT: 3007/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/fashion/g' $TARGET_WEBSITE/ecosystem.config.js
|
|
sed -i 's/PORT: 3002/PORT: 3007/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://fashion.kittisak.com (PM2: $PM2_NAME_WEBSITE, Port: $SSR_PORT)"
|
|
echo " SPA -> https://spa.fashion.kittisak.com"
|
|
echo " Admin Panel -> https://admin.fashion.kittisak.com"
|
|
echo " API Backend -> https://api.kittisak.com (PM2: $PM2_NAME_BACKEND, Port: $BACKEND_PORT)"
|