forensic-pathways/deploy.sh
overcuriousity fd721ce930 script
2025-08-07 10:10:59 +02:00

264 lines
8.3 KiB
Bash
Executable File

#!/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')"