strat-gameplay-webapp/start-services.sh
Cal Corum b68e3ceacf CLAUDE: Improve service scripts and fix WebSocket plugin conflict
Service Scripts:
- start-services.sh: Add pre-flight checks, health monitoring, --dev/--prod modes,
  port options, dependency checks, and version logging
- stop-services.sh: Add port 3000 cleanup, verification, --quiet/--force flags
- status-services.sh: New script for monitoring service status with --watch mode

WebSocket:
- Remove conflicting socket.client.ts plugin that was interfering with
  useWebSocket.ts composable (used JWT auth vs cookie auth)
- Add debugging logs to useWebSocket.ts to diagnose intermittent connection issues

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 15:23:41 -06:00

369 lines
11 KiB
Bash
Executable File

#!/bin/bash
# Start both backend and frontend services for SBA gameplay testing
# Enhanced with pre-flight checks, health monitoring, and version logging
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$SCRIPT_DIR/logs"
# Default configuration
BACKEND_PORT=8000
FRONTEND_PORT=3000
BACKEND_HOST="0.0.0.0"
FRONTEND_HOST="0.0.0.0"
HEALTH_CHECK_HOST="localhost" # For curl health checks
# Environment mode (affects .env file used)
ENV_MODE="dev" # dev, prod, or custom
# Parse arguments
FORCE_START=false
FRONTEND_TYPE="sba" # Default to SBA frontend
while [[ $# -gt 0 ]]; do
case $1 in
--force|-f)
FORCE_START=true
shift
;;
--frontend)
FRONTEND_TYPE="$2"
shift 2
;;
--pd)
FRONTEND_TYPE="pd"
shift
;;
--dev)
ENV_MODE="dev"
shift
;;
--prod)
ENV_MODE="prod"
shift
;;
--backend-port)
BACKEND_PORT="$2"
shift 2
;;
--frontend-port)
FRONTEND_PORT="$2"
shift 2
;;
--help|-h)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --force, -f Force start (stop existing services first)"
echo " --frontend TYPE Start specific frontend (sba or pd)"
echo " --pd Shortcut for --frontend pd"
echo " --dev Development mode - use localhost URLs (default)"
echo " --prod Production mode - use .env production URLs"
echo " --backend-port N Override backend port (default: 8000)"
echo " --frontend-port N Override frontend port (default: 3000)"
echo " --help, -h Show this help message"
echo ""
echo "Environment Modes:"
echo " --dev Sets NUXT_PUBLIC_API_URL=http://localhost:8000"
echo " Sets NUXT_PUBLIC_WS_URL=http://localhost:8000"
echo ""
echo " --prod Uses URLs from frontend-{sba,pd}/.env file"
echo " (e.g., https://gameplay-demo.manticorum.com)"
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
# Validate frontend type
if [[ "$FRONTEND_TYPE" != "sba" && "$FRONTEND_TYPE" != "pd" ]]; then
echo "❌ Invalid frontend type: $FRONTEND_TYPE (must be 'sba' or 'pd')"
exit 1
fi
FRONTEND_DIR="$SCRIPT_DIR/frontend-$FRONTEND_TYPE"
# Create logs directory if it doesn't exist
mkdir -p "$LOG_DIR"
echo "========================================"
echo "🚀 Starting SBA Gameplay Services"
echo "========================================"
echo ""
# ============================================
# PRE-FLIGHT CHECKS
# ============================================
echo "🔍 Pre-flight checks..."
# Check dependencies
check_dependency() {
if ! command -v "$1" &> /dev/null; then
echo "❌ Required tool not found: $1"
echo " Please install $1 before running this script."
exit 1
fi
}
check_dependency "uv"
check_dependency "npm"
check_dependency "curl"
echo " ✓ Dependencies available (uv, npm, curl)"
# Check if frontend directory exists
if [ ! -d "$FRONTEND_DIR" ]; then
echo "❌ Frontend directory not found: $FRONTEND_DIR"
exit 1
fi
echo " ✓ Frontend directory exists: frontend-$FRONTEND_TYPE"
# Check if already running
ALREADY_RUNNING=false
if [ -f "$LOG_DIR/backend.pid" ]; then
EXISTING_PID=$(cat "$LOG_DIR/backend.pid")
if ps -p "$EXISTING_PID" > /dev/null 2>&1; then
ALREADY_RUNNING=true
echo " ⚠️ Backend already running (PID: $EXISTING_PID)"
fi
fi
if [ -f "$LOG_DIR/frontend.pid" ]; then
EXISTING_PID=$(cat "$LOG_DIR/frontend.pid")
if ps -p "$EXISTING_PID" > /dev/null 2>&1; then
ALREADY_RUNNING=true
echo " ⚠️ Frontend already running (PID: $EXISTING_PID)"
fi
fi
if [ "$ALREADY_RUNNING" = true ]; then
if [ "$FORCE_START" = true ]; then
echo " → Force flag set, stopping existing services..."
"$SCRIPT_DIR/stop-services.sh"
echo ""
else
echo ""
echo "❌ Services already running. Use --force to restart or run ./stop-services.sh first."
exit 1
fi
fi
# Check port availability
check_port() {
local port=$1
local name=$2
if lsof -ti :"$port" > /dev/null 2>&1; then
echo " ⚠️ Port $port is in use ($name)"
if [ "$FORCE_START" = true ]; then
echo " → Force flag set, killing processes on port $port..."
lsof -ti :"$port" | xargs kill -9 2>/dev/null || true
sleep 1
else
echo ""
echo "❌ Port $port is in use. Use --force to kill existing processes."
exit 1
fi
fi
}
check_port $BACKEND_PORT "backend"
check_port $FRONTEND_PORT "frontend"
echo " ✓ Ports $BACKEND_PORT and $FRONTEND_PORT available"
echo ""
# ============================================
# VERSION LOGGING (helps debug deployment issues)
# ============================================
echo "📌 Version Info:"
GIT_COMMIT=$(git -C "$SCRIPT_DIR" rev-parse --short HEAD 2>/dev/null || echo "unknown")
GIT_BRANCH=$(git -C "$SCRIPT_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
GIT_DIRTY=$(git -C "$SCRIPT_DIR" diff --quiet 2>/dev/null && echo "" || echo " (dirty)")
TIMESTAMP=$(date -Iseconds)
echo " Branch: $GIT_BRANCH"
echo " Commit: $GIT_COMMIT$GIT_DIRTY"
echo " Started: $TIMESTAMP"
# Log to file for debugging
cat > "$LOG_DIR/startup.log" << EOF
========================================
Service Startup Log
========================================
Timestamp: $TIMESTAMP
Git Branch: $GIT_BRANCH
Git Commit: $GIT_COMMIT$GIT_DIRTY
Environment: $ENV_MODE
Frontend: $FRONTEND_TYPE
Backend Port: $BACKEND_PORT
Frontend Port: $FRONTEND_PORT
========================================
EOF
echo ""
# ============================================
# START BACKEND
# ============================================
echo "📡 Starting Backend (FastAPI + Socket.io)..."
cd "$SCRIPT_DIR/backend"
uv run python -m app.main > "$LOG_DIR/backend.log" 2>&1 &
BACKEND_PID=$!
echo "$BACKEND_PID" > "$LOG_DIR/backend.pid"
echo " PID: $BACKEND_PID"
echo " Log: $LOG_DIR/backend.log"
# Health check with timeout
echo " Waiting for backend to be ready..."
HEALTH_TIMEOUT=30
HEALTH_COUNT=0
BACKEND_READY=false
while [ $HEALTH_COUNT -lt $HEALTH_TIMEOUT ]; do
# Check if process is still running
if ! ps -p $BACKEND_PID > /dev/null 2>&1; then
echo ""
echo "❌ Backend process died during startup!"
echo " Check logs: tail -50 $LOG_DIR/backend.log"
tail -20 "$LOG_DIR/backend.log" 2>/dev/null || true
exit 1
fi
# Check health endpoint
if curl -s http://$HEALTH_CHECK_HOST:$BACKEND_PORT/health > /dev/null 2>&1; then
BACKEND_READY=true
break
fi
# Also accept root endpoint as fallback
if curl -s http://$HEALTH_CHECK_HOST:$BACKEND_PORT/ > /dev/null 2>&1; then
BACKEND_READY=true
break
fi
sleep 1
HEALTH_COUNT=$((HEALTH_COUNT + 1))
printf "."
done
echo ""
if [ "$BACKEND_READY" = true ]; then
echo " ✓ Backend ready (${HEALTH_COUNT}s)"
echo " URL: http://localhost:$BACKEND_PORT"
else
echo " ⚠️ Backend health check timed out after ${HEALTH_TIMEOUT}s"
echo " Backend may still be starting. Check logs if issues occur."
fi
echo ""
# ============================================
# START FRONTEND
# ============================================
echo "🎨 Starting Frontend (Nuxt 3 - $FRONTEND_TYPE)..."
cd "$FRONTEND_DIR"
# Set environment variables based on mode
if [ "$ENV_MODE" = "dev" ]; then
echo " Mode: Development (localhost)"
export NUXT_PUBLIC_API_URL="http://localhost:$BACKEND_PORT"
export NUXT_PUBLIC_WS_URL="http://localhost:$BACKEND_PORT"
export NUXT_PUBLIC_DISCORD_REDIRECT_URI="http://localhost:$FRONTEND_PORT/auth/callback"
elif [ "$ENV_MODE" = "prod" ]; then
echo " Mode: Production (using .env file)"
# Load .env file if it exists (Nuxt will use these)
if [ -f ".env" ]; then
# Show what URLs will be used
API_URL=$(grep "^NUXT_PUBLIC_API_URL=" .env 2>/dev/null | cut -d= -f2 || echo "not set")
echo " API URL: $API_URL"
else
echo " ⚠️ No .env file found - using Nuxt defaults"
fi
fi
npm run dev > "$LOG_DIR/frontend.log" 2>&1 &
FRONTEND_PID=$!
echo "$FRONTEND_PID" > "$LOG_DIR/frontend.pid"
echo " PID: $FRONTEND_PID"
echo " Log: $LOG_DIR/frontend.log"
# Wait for frontend to be ready
echo " Waiting for frontend to be ready..."
FRONTEND_TIMEOUT=60
FRONTEND_COUNT=0
FRONTEND_READY=false
while [ $FRONTEND_COUNT -lt $FRONTEND_TIMEOUT ]; do
# Check if process is still running
if ! ps -p $FRONTEND_PID > /dev/null 2>&1; then
echo ""
echo "❌ Frontend process died during startup!"
echo " Check logs: tail -50 $LOG_DIR/frontend.log"
tail -20 "$LOG_DIR/frontend.log" 2>/dev/null || true
exit 1
fi
# Check if frontend is responding
if curl -s http://$HEALTH_CHECK_HOST:$FRONTEND_PORT > /dev/null 2>&1; then
FRONTEND_READY=true
break
fi
sleep 1
FRONTEND_COUNT=$((FRONTEND_COUNT + 1))
printf "."
done
echo ""
if [ "$FRONTEND_READY" = true ]; then
echo " ✓ Frontend ready (${FRONTEND_COUNT}s)"
echo " URL: http://localhost:$FRONTEND_PORT"
else
echo " ⚠️ Frontend health check timed out after ${FRONTEND_TIMEOUT}s"
echo " Frontend may still be compiling. Check logs if issues occur."
fi
echo ""
# ============================================
# SUMMARY
# ============================================
echo "========================================"
echo "✅ Services Started Successfully!"
echo "========================================"
echo ""
echo "📊 Service Status:"
echo " Backend: http://localhost:$BACKEND_PORT (PID: $BACKEND_PID)"
echo " Frontend: http://localhost:$FRONTEND_PORT (PID: $FRONTEND_PID)"
echo ""
# Show API URL based on mode
if [ "$ENV_MODE" = "dev" ]; then
echo "🔗 API Configuration (dev mode):"
echo " API URL: http://localhost:$BACKEND_PORT"
echo " WS URL: http://localhost:$BACKEND_PORT"
elif [ "$ENV_MODE" = "prod" ]; then
echo "🔗 API Configuration (prod mode):"
if [ -f "$FRONTEND_DIR/.env" ]; then
grep "^NUXT_PUBLIC_API_URL=" "$FRONTEND_DIR/.env" 2>/dev/null | sed 's/^/ /' || true
grep "^NUXT_PUBLIC_WS_URL=" "$FRONTEND_DIR/.env" 2>/dev/null | sed 's/^/ /' || true
fi
fi
echo ""
echo "📋 Quick Commands:"
echo " View logs: tail -f $LOG_DIR/backend.log"
echo " tail -f $LOG_DIR/frontend.log"
echo " Check status: ./status-services.sh"
echo " Stop: ./stop-services.sh"
echo " Restart: ./stop-services.sh && ./start-services.sh"
echo ""
echo "📌 Running: $GIT_BRANCH @ $GIT_COMMIT$GIT_DIRTY ($ENV_MODE mode)"
echo ""