Files

129 lines
4.2 KiB
Bash

#!/bin/bash
# ==============================================================================
# Foxxio Project (foxxio.ddcsprocket.com)
# Deployment Script (post-receive hook) on sql@192.168.1.26
# Role: Application Runner (PM2 / Bun / Node) - No local Nginx
# ==============================================================================
set -e
export PATH="/home/sql/.bun/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
# 1. PATH CONFIG
GIT_DIR="/home/sql/git/foxxio.git"
WORK_DIR="/home/sql/code/foxxio"
TARGET_ADMIN="/var/www/html/foxxio_admin"
BRANCH="master"
TEMP_DIR="/tmp/foxxio_build_$(date +%s)"
# 2. RUNTIMES & EXECUTABLES
BUN="/home/sql/.bun/bin/bun"
NODE="/usr/bin/node"
PM2="/usr/bin/pm2"
# 3. PM2 PROCESS NAMES
PM2_NAME_BACKEND="foxxio-backend"
PM2_NAME_WEBSITE="foxxio-website"
# 4. ASSIGNED PORTS
BACKEND_PORT=3006
SSR_PORT=3003
# 5. ENVIRONMENT VARIABLES
export BACKEND_PORT="$BACKEND_PORT"
export SSR_PORT="$SSR_PORT"
export VITE_API_URL="https://api.foxxio.ddcsprocket.com/api"
export NEXT_PUBLIC_API_URL="https://api.foxxio.ddcsprocket.com/api"
echo "========================================================"
echo "🚀 [Foxxio] Starting Deployment on 192.168.1.26..."
echo "========================================================"
# A. Checkout code to Work Directory
mkdir -p "$WORK_DIR"
echo ">>> Checking out branch $BRANCH to $WORK_DIR..."
git --work-tree="$WORK_DIR" --git-dir="$GIT_DIR" checkout -f "$BRANCH"
cd "$WORK_DIR"
# B. Install dependencies
if [ -f "package.json" ]; then
echo ">>> Installing dependencies with Bun..."
$BUN install
fi
# C. Setup Backend (if apps/backend exists)
if [ -d "apps/backend" ]; then
echo ">>> Setting up Backend..."
cd "$WORK_DIR/apps/backend"
if [ -f "prisma/schema.prisma" ]; then
echo ">>> Generating Prisma Client..."
$BUN x prisma generate
echo ">>> Auto-updating Database Schema..."
if [ -d "prisma/migrations" ]; then
echo ">>> Running Prisma migrate deploy..."
$BUN x prisma migrate deploy || echo "⚠️ migrate deploy had notices, falling back to db push..."
fi
echo ">>> Syncing schema with db push..."
$BUN x prisma db push --accept-data-loss
fi
echo ">>> Restarting PM2 process: $PM2_NAME_BACKEND..."
if $PM2 describe "$PM2_NAME_BACKEND" > /dev/null 2>&1; then
PORT=$BACKEND_PORT $PM2 restart "$PM2_NAME_BACKEND" --update-env
else
echo ">>> Starting $PM2_NAME_BACKEND for the first time on port $BACKEND_PORT..."
PORT=$BACKEND_PORT $PM2 start "$BUN" --name "$PM2_NAME_BACKEND" --cwd "$WORK_DIR/apps/backend" -- run src/index.ts
fi
cd "$WORK_DIR"
fi
# D. Build & Deploy Admin Panel (React Vite SPA)
if [ -d "apps/admin" ]; then
echo ">>> Building Admin Panel (React Vite SPA)..."
cd "$WORK_DIR/apps/admin"
export VITE_API_URL="https://api.foxxio.ddcsprocket.com/api"
export VITE_FRONTEND_URL="https://foxxio.ddcsprocket.com"
$BUN run build
if [ -d "$TARGET_ADMIN" ]; then
echo "Deploying Admin Panel to $TARGET_ADMIN..."
rsync -av --delete dist/ "$TARGET_ADMIN"/
else
echo "⚠️ Target directory $TARGET_ADMIN not found. Please create it once with:"
echo " sudo mkdir -p $TARGET_ADMIN && sudo chown -R sql:sql $TARGET_ADMIN"
fi
cd "$WORK_DIR"
fi
# E. Setup Website SSR (if apps/website exists)
if [ -d "apps/website" ]; then
echo ">>> Building Next.js Website..."
cd "$WORK_DIR/apps/website"
NODE_ENV=production $BUN run build
echo ">>> Restarting PM2 process: $PM2_NAME_WEBSITE..."
if $PM2 describe "$PM2_NAME_WEBSITE" > /dev/null 2>&1; then
PORT=$SSR_PORT $PM2 restart "$PM2_NAME_WEBSITE" --update-env
else
echo ">>> Starting $PM2_NAME_WEBSITE for the first time on port $SSR_PORT..."
# Check standalone server or standard next start
if [ -f ".next/standalone/server.js" ]; then
PORT=$SSR_PORT $PM2 start "$NODE" --name "$PM2_NAME_WEBSITE" --cwd "$WORK_DIR/apps/website/.next/standalone" -- server.js
else
PORT=$SSR_PORT $PM2 start "$BUN" --name "$PM2_NAME_WEBSITE" --cwd "$WORK_DIR/apps/website" -- run start
fi
fi
cd "$WORK_DIR"
fi
# F. Save PM2 state
$PM2 save
echo "========================================================"
echo "✅ [Foxxio] Deployment Finished Successfully!"
echo "========================================================"
$PM2 status