#!/bin/bash # ForensicPathways Deployment Script # Usage: sudo ./deploy.sh set -e WEBROOT="/var/www/forensic-pathways" LOG_DIR="$WEBROOT/logs" DATA_DIR="$WEBROOT/data" UPLOADS_DIR="$WEBROOT/public/uploads" # Get original user who called sudo ORIGINAL_USER="${SUDO_USER:-$USER}" ORIGINAL_HOME=$(eval echo "~$ORIGINAL_USER") echo "🚀 ForensicPathways Deployment Starting..." echo "📅 $(date '+%Y-%m-%d %H:%M:%S')" echo "👤 Original user: $ORIGINAL_USER" echo "📁 Working directory: $(pwd)" echo "" # Check if running as root if [ "$EUID" -ne 0 ]; then echo "❌ Error: This script must be run as root (use sudo)" exit 1 fi # Verify we're in the right directory if [ ! -f "package.json" ] || [ ! -f "astro.config.mjs" ]; then echo "❌ Error: Must run from ForensicPathways project root" echo "🔍 Current directory: $(pwd)" echo "🔍 Files found: $(ls -la)" exit 1 fi # Function to find and use npm find_and_use_npm() { echo "🔍 Searching for npm installation..." # Try system npm first if command -v npm &> /dev/null; then echo "✅ Found system npm: $(which npm)" echo "📦 Installing dependencies..." sudo -u "$ORIGINAL_USER" npm install echo "📦 Building application..." sudo -u "$ORIGINAL_USER" npm run build return 0 fi # Try nvm-installed npm echo "🔍 Checking for nvm installation..." if sudo -u "$ORIGINAL_USER" bash -c " export NVM_DIR='$ORIGINAL_HOME/.nvm' [ -s '\$NVM_DIR/nvm.sh' ] && source '\$NVM_DIR/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' command -v npm &> /dev/null "; then echo "✅ Found nvm-managed npm" echo "📦 Installing dependencies with nvm..." sudo -u "$ORIGINAL_USER" bash -c " export NVM_DIR='$ORIGINAL_HOME/.nvm' [ -s '\$NVM_DIR/nvm.sh' ] && source '\$NVM_DIR/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' npm install " echo "📦 Building application with nvm..." sudo -u "$ORIGINAL_USER" bash -c " export NVM_DIR='$ORIGINAL_HOME/.nvm' [ -s '\$NVM_DIR/nvm.sh' ] && source '\$NVM_DIR/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' npm run build " return 0 fi echo "❌ npm not found in system or user environment" echo "" echo "💡 Please install Node.js and npm first:" echo " # Option 1: System package manager" echo " sudo apt update && sudo apt install nodejs npm" echo "" echo " # Option 2: NodeSource repository (recommended)" echo " curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -" echo " sudo apt-get install -y nodejs" echo "" echo " # Option 3: nvm (as user $ORIGINAL_USER)" echo " curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash" echo " source ~/.bashrc" echo " nvm install 20" echo "" return 1 } # Check for existing build or build if needed if [ ! -d "dist" ] || [ ! "$(ls -A dist 2>/dev/null)" ]; then echo "📦 No dist/ directory found, building..." if ! find_and_use_npm; then exit 1 fi else echo "📦 Found existing dist/ directory" read -p "🤔 Rebuild application? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then if ! find_and_use_npm; then echo "" echo "💡 Using existing dist/ due to build failure" fi else echo "📦 Using existing build" fi fi # Verify build succeeded if [ ! -d "dist" ] || [ ! "$(ls -A dist 2>/dev/null)" ]; then echo "❌ Error: Build failed or dist/ is empty" echo "🔍 Dist contents: $(ls -la dist/ 2>/dev/null || echo 'dist/ not found')" exit 1 fi echo "✅ Build completed successfully" # Create target directories echo "📁 Setting up target directories..." mkdir -p "$WEBROOT" mkdir -p "$LOG_DIR" mkdir -p "$DATA_DIR" mkdir -p "$UPLOADS_DIR" mkdir -p "$WEBROOT/src/data" # Copy application files echo "📋 Copying application files..." cp -r dist/. "$WEBROOT/" echo "✅ Application files copied ($(du -sh dist | cut -f1))" # Copy package.json for runtime dependencies echo "📦 Setting up runtime dependencies..." cp package.json "$WEBROOT/" echo "✅ package.json copied" # Install production dependencies in webroot echo "📦 Installing runtime dependencies..." cd "$WEBROOT" if command -v npm &> /dev/null; then npm install --production echo "✅ Runtime dependencies installed" else sudo -u "$ORIGINAL_USER" bash -c " cd '$WEBROOT' export NVM_DIR='$ORIGINAL_HOME/.nvm' [ -s '\$NVM_DIR/nvm.sh' ] && source '\$NVM_DIR/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' npm install --production " echo "✅ Runtime dependencies installed via nvm" fi # Return to source directory cd - > /dev/null # Copy essential data files echo "🗂️ Setting up data files..." if [ -f "src/data/tools.yaml" ]; then cp src/data/tools.yaml "$WEBROOT/src/data/" TOOL_COUNT=$(grep -c "^ - name:" "src/data/tools.yaml" || echo "unknown") echo "✅ tools.yaml copied ($TOOL_COUNT tools)" else echo "❌ Error: src/data/tools.yaml not found" exit 1 fi # Copy knowledgebase content if it exists if [ -d "src/content/knowledgebase" ]; then mkdir -p "$WEBROOT/src/content" cp -r src/content/knowledgebase "$WEBROOT/src/content/" KB_COUNT=$(find src/content/knowledgebase -name "*.md" 2>/dev/null | wc -l) echo "✅ Knowledgebase content copied ($KB_COUNT articles)" fi # Setup environment configuration echo "🔧 Setting up environment configuration..." cp .env.example "$WEBROOT/.env" echo "✅ Created .env from .env.example template" echo "⚠️ IMPORTANT: Edit $WEBROOT/.env with your configuration" # Create log files echo "📝 Creating log files..." touch "$LOG_DIR/access.log" touch "$LOG_DIR/error.log" touch "$LOG_DIR/ai-pipeline.log" # Set permissions echo "🔐 Setting permissions..." chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" chmod 600 "$WEBROOT/.env" chmod 755 "$DATA_DIR" chmod 755 "$UPLOADS_DIR" chmod 755 "$LOG_DIR" chmod 644 "$LOG_DIR"/*.log # Make server executable if it exists if [ -f "$WEBROOT/server/entry.mjs" ]; then chmod 755 "$WEBROOT/server/entry.mjs" echo "✅ Server entry point permissions set" fi echo "✅ Permissions configured" # Final validation echo "" echo "🔍 Post-deployment validation..." VALIDATION_ERRORS=0 if [ -f "$WEBROOT/.env" ]; then echo "✅ Environment configuration exists" else echo "❌ Environment configuration missing" ((VALIDATION_ERRORS++)) fi if [ -f "$WEBROOT/src/data/tools.yaml" ]; then echo "✅ Tools database exists" else echo "❌ Tools database missing" ((VALIDATION_ERRORS++)) fi if [ -f "$WEBROOT/index.html" ] || [ -d "$WEBROOT/server" ]; then echo "✅ Application files deployed" else echo "❌ Application files missing" ((VALIDATION_ERRORS++)) fi echo "" if [ $VALIDATION_ERRORS -eq 0 ]; then echo "═══════════════════════════════════════════════════════════════" echo "✅ Deployment Successful!" echo "═══════════════════════════════════════════════════════════════" echo "" echo "📋 Next Steps:" echo " 1. 🔧 Configure $WEBROOT/.env:" echo " - Set PUBLIC_BASE_URL to your domain" echo " - Configure AI services (AI_ANALYZER_ENDPOINT, etc.)" echo " - Set AUTH_SECRET to a secure random value" echo "" echo " 2. 🔄 Restart services:" echo " sudo systemctl restart forensic-pathways" echo " sudo systemctl reload nginx" echo "" echo " 3. 🔍 Monitor:" echo " sudo systemctl status forensic-pathways" echo " sudo tail -f $LOG_DIR/error.log" echo "" echo "🌐 Application deployed to: $WEBROOT" else echo "❌ Deployment completed with $VALIDATION_ERRORS errors" echo "📋 Please check the issues above before proceeding" fi echo "" echo "🎉 Deploy script completed at $(date '+%Y-%m-%d %H:%M:%S')"