#!/bin/bash # ForensicPathways Deployment Script # Usage: sudo ./deploy.sh set -e WEBROOT="/var/www/forensic-pathways" BACKUP_DIR="/var/backups/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 "" # Check if running as root if [ "$EUID" -ne 0 ]; then echo "โŒ Error: This script must be run as root (use sudo)" exit 1 fi # Function to run commands as original user run_as_user() { if [ "$ORIGINAL_USER" != "root" ]; then sudo -u "$ORIGINAL_USER" -i bash -c "cd '$PWD' && $1" else bash -c "$1" fi } # Function to check for npm/node in user environment check_node_env() { echo "๐Ÿ” Checking Node.js environment..." # First, try to source nvm and check if [ "$ORIGINAL_USER" != "root" ]; then echo "๐Ÿ” Checking user environment for nvm..." # Try to source nvm and check npm/node if sudo -u "$ORIGINAL_USER" -i bash -c " # Source nvm if it exists [ -s '$ORIGINAL_HOME/.nvm/nvm.sh' ] && source '$ORIGINAL_HOME/.nvm/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' [ -s '$ORIGINAL_HOME/.profile' ] && source '$ORIGINAL_HOME/.profile' # Check if npm and node are available command -v npm &> /dev/null && command -v node &> /dev/null "; then # Get versions using the same approach NPM_VERSION=$(sudo -u "$ORIGINAL_USER" -i bash -c " [ -s '$ORIGINAL_HOME/.nvm/nvm.sh' ] && source '$ORIGINAL_HOME/.nvm/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' npm --version 2>/dev/null || echo 'unknown' ") NODE_VERSION=$(sudo -u "$ORIGINAL_USER" -i bash -c " [ -s '$ORIGINAL_HOME/.nvm/nvm.sh' ] && source '$ORIGINAL_HOME/.nvm/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' node --version 2>/dev/null || echo 'unknown' ") echo "โœ… npm found: $NPM_VERSION" echo "โœ… Node.js found: $NODE_VERSION" return 0 fi fi # Fallback: Check specific nvm paths directly echo "๐Ÿ” Checking nvm installation paths..." NVM_DIRS=$(find "$ORIGINAL_HOME/.nvm/versions/node" -name "bin" -type d 2>/dev/null | head -5) for nvm_bin in $NVM_DIRS; do if [ -x "$nvm_bin/npm" ] && [ -x "$nvm_bin/node" ]; then echo "โœ… Found Node.js in: $nvm_bin" NPM_VERSION=$("$nvm_bin/npm" --version 2>/dev/null || echo "unknown") NODE_VERSION=$("$nvm_bin/node" --version 2>/dev/null || echo "unknown") echo "โœ… npm found: $NPM_VERSION" echo "โœ… Node.js found: $NODE_VERSION" # Set PATH for the rest of the script export PATH="$nvm_bin:$PATH" return 0 fi done # Check system-wide installation echo "๐Ÿ” Checking system-wide installation..." if command -v npm &> /dev/null && command -v node &> /dev/null; then NPM_VERSION=$(npm --version) NODE_VERSION=$(node --version) echo "โœ… npm found (system): $NPM_VERSION" echo "โœ… Node.js found (system): $NODE_VERSION" return 0 fi echo "โŒ Error: npm/node not found in any location" echo "" echo "๐Ÿ” Checked locations:" echo " - User environment with nvm sourcing" echo " - $ORIGINAL_HOME/.nvm/versions/node/*/bin" echo " - System PATH: /usr/local/bin, /usr/bin" echo "" echo "๐Ÿ’ก Solutions:" echo " 1. Build first: npm run build (as $ORIGINAL_USER)" echo " 2. Then run: sudo ./deploy.sh" echo " 3. Or install Node.js system-wide: curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && sudo apt-get install -y nodejs" echo "" return 1 } # Enhanced build function build_application() { echo "๐Ÿ“ฆ Building application as user $ORIGINAL_USER..." # Use nvm-aware build command if sudo -u "$ORIGINAL_USER" -i bash -c " cd '$PWD' # Source nvm if available [ -s '$ORIGINAL_HOME/.nvm/nvm.sh' ] && source '$ORIGINAL_HOME/.nvm/nvm.sh' [ -s '$ORIGINAL_HOME/.bashrc' ] && source '$ORIGINAL_HOME/.bashrc' # Run build npm run build "; then echo "โœ… Build completed successfully" return 0 else echo "โŒ Error: Build failed" echo "๐Ÿ’ก Try running manually: npm run build" return 1 fi } # Check Node.js environment if ! check_node_env; then exit 1 fi # Check if dist directory exists or can be built if [ ! -d "dist" ]; then if ! build_application; 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 ! build_application; then exit 1 fi else echo "๐Ÿ“ฆ Using existing build" fi fi # Create backup if existing deployment exists if [ -d "$WEBROOT" ]; then BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_PATH="$BACKUP_DIR/$BACKUP_TIMESTAMP" echo "๐Ÿ’พ Creating backup at $BACKUP_PATH..." mkdir -p "$BACKUP_DIR" cp -r "$WEBROOT" "$BACKUP_PATH" echo "โœ… Backup created successfully" # Preserve existing .env if it exists if [ -f "$WEBROOT/.env" ]; then cp "$WEBROOT/.env" "/tmp/forensic-pathways.env.backup" echo "๐Ÿ’พ Preserved existing .env configuration" fi # Clean old backups (keep last 5) cd "$BACKUP_DIR" ls -1t | tail -n +6 | xargs -r rm -rf echo "๐Ÿงน Cleaned old backups (keeping last 5)" fi # Create webroot and subdirectories echo "๐Ÿ“ Setting up directory structure..." mkdir -p "$WEBROOT" mkdir -p "$LOG_DIR" mkdir -p "$DATA_DIR" mkdir -p "$UPLOADS_DIR" mkdir -p "$WEBROOT/src/data" mkdir -p "$WEBROOT/public" mkdir -p "$WEBROOT/server" echo "โœ… Directory structure created" # Copy built application echo "๐Ÿ“‹ Copying application files..." if [ -d "dist" ]; then cp -r dist/* "$WEBROOT/" echo "โœ… Application files copied" else echo "โŒ Error: dist/ directory not found" exit 1 fi # Copy essential data files echo "๐Ÿ—‚๏ธ Setting up data files..." if [ -f "src/data/tools.yaml" ]; then cp src/data/tools.yaml "$WEBROOT/src/data/" echo "โœ… tools.yaml copied" else echo "โŒ Error: src/data/tools.yaml not found" exit 1 fi # Copy any existing knowledgebase content if [ -d "src/content/knowledgebase" ]; then mkdir -p "$WEBROOT/src/content" cp -r src/content/knowledgebase "$WEBROOT/src/content/" echo "โœ… Knowledgebase content copied" fi # Handle environment configuration if [ -f "/tmp/forensic-pathways.env.backup" ]; then echo "๐Ÿ”ง Restoring existing .env configuration..." cp "/tmp/forensic-pathways.env.backup" "$WEBROOT/.env" rm "/tmp/forensic-pathways.env.backup" echo "โœ… Existing configuration restored" else echo "๐Ÿ”ง Setting up new environment configuration..." cp .env.example "$WEBROOT/.env" echo "โš ๏ธ IMPORTANT: Edit $WEBROOT/.env with your configuration" fi # Create additional required files and directories echo "๐Ÿ“ Creating additional files..." # Create embeddings data directory mkdir -p "$DATA_DIR/embeddings" # Create logs directory with proper structure mkdir -p "$LOG_DIR/access" mkdir -p "$LOG_DIR/error" mkdir -p "$LOG_DIR/ai" # Create placeholder log files touch "$LOG_DIR/access.log" touch "$LOG_DIR/error.log" touch "$LOG_DIR/ai-pipeline.log" echo "โœ… Additional files and directories created" # Set proper permissions echo "๐Ÿ” Setting permissions..." chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" chmod 600 "$WEBROOT/.env" # Specific permissions for data directories chmod 755 "$DATA_DIR" chmod 755 "$UPLOADS_DIR" chmod 755 "$LOG_DIR" chmod 644 "$LOG_DIR"/*.log # Make server entry point executable if [ -f "$WEBROOT/server/entry.mjs" ]; then chmod 755 "$WEBROOT/server/entry.mjs" echo "โœ… Server entry point permissions set" fi echo "โœ… Permissions configured successfully" # Display deployment summary echo "" echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "โœ… ForensicPathways Deployment Complete!" echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" echo "๐Ÿ“Š Deployment Summary:" echo " ๐ŸŽฏ Target: $WEBROOT" echo " ๐Ÿ’พ Backup: $BACKUP_DIR" echo " ๐Ÿ“ Logs: $LOG_DIR" echo " ๐Ÿ“ค Uploads: $UPLOADS_DIR" echo " ๐Ÿ—ƒ๏ธ Data: $DATA_DIR" echo "" echo "๐Ÿ“‹ Required Next Steps:" echo " 1. ๐Ÿ”ง Edit $WEBROOT/.env with your configuration" echo " - Set PUBLIC_BASE_URL to your domain" echo " - Configure AI_ANALYZER_* settings" echo " - Set AUTH_SECRET to a secure value" echo "" echo " 2. ๐Ÿ”„ Restart services:" echo " sudo systemctl restart forensic-pathways" echo " sudo systemctl reload nginx" echo "" echo " 3. ๐Ÿ” Check status:" echo " sudo systemctl status forensic-pathways" echo " sudo tail -f $LOG_DIR/error.log" echo "" echo "๐ŸŒ Once configured, access at: http://your-domain.com" echo "" # Final validation echo "๐Ÿ” Post-deployment validation..." if [ -f "$WEBROOT/.env" ]; then echo "โœ… Environment configuration exists" else echo "โŒ Environment configuration missing" fi if [ -f "$WEBROOT/src/data/tools.yaml" ]; then echo "โœ… Tools database exists" else echo "โŒ Tools database missing" fi if [ -d "$WEBROOT/server" ]; then echo "โœ… Server directory exists" else echo "โŒ Server directory missing" fi echo "" echo "๐ŸŽ‰ Deployment script completed at $(date '+%Y-%m-%d %H:%M:%S')"#!/bin/bash # ForensicPathways Deployment Script # Usage: sudo ./deploy.sh set -e WEBROOT="/var/www/forensic-pathways" BACKUP_DIR="/var/backups/forensic-pathways" LOG_DIR="$WEBROOT/logs" DATA_DIR="$WEBROOT/data" UPLOADS_DIR="$WEBROOT/public/uploads" echo "๐Ÿš€ ForensicPathways Deployment Starting..." echo "๐Ÿ“… $(date '+%Y-%m-%d %H:%M:%S')" 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 # Check prerequisites echo "๐Ÿ” Checking prerequisites..." if ! command -v npm &> /dev/null; then echo "โŒ Error: npm is not installed" exit 1 fi echo "โœ… npm found: $(npm --version)" if ! command -v node &> /dev/null; then echo "โŒ Error: Node.js is not installed" exit 1 fi echo "โœ… Node.js found: $(node --version)" # Check if dist directory exists or can be built if [ ! -d "dist" ]; then echo "๐Ÿ“ฆ Building application..." npm run build echo "โœ… Build completed successfully" else echo "๐Ÿ“ฆ Found existing dist/ directory" read -p "๐Ÿค” Rebuild application? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "๐Ÿ“ฆ Rebuilding application..." npm run build echo "โœ… Rebuild completed successfully" else echo "๐Ÿ“ฆ Using existing build" fi fi # Create backup if existing deployment exists if [ -d "$WEBROOT" ]; then BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_PATH="$BACKUP_DIR/$BACKUP_TIMESTAMP" echo "๐Ÿ’พ Creating backup at $BACKUP_PATH..." mkdir -p "$BACKUP_DIR" cp -r "$WEBROOT" "$BACKUP_PATH" echo "โœ… Backup created successfully" # Preserve existing .env if it exists if [ -f "$WEBROOT/.env" ]; then cp "$WEBROOT/.env" "/tmp/forensic-pathways.env.backup" echo "๐Ÿ’พ Preserved existing .env configuration" fi # Clean old backups (keep last 5) cd "$BACKUP_DIR" ls -1t | tail -n +6 | xargs -r rm -rf echo "๐Ÿงน Cleaned old backups (keeping last 5)" fi # Create webroot and subdirectories echo "๐Ÿ“ Setting up directory structure..." mkdir -p "$WEBROOT" mkdir -p "$LOG_DIR" mkdir -p "$DATA_DIR" mkdir -p "$UPLOADS_DIR" mkdir -p "$WEBROOT/src/data" mkdir -p "$WEBROOT/public" mkdir -p "$WEBROOT/server" echo "โœ… Directory structure created" # Copy built application echo "๐Ÿ“‹ Copying application files..." if [ -d "dist" ]; then cp -r dist/* "$WEBROOT/" echo "โœ… Application files copied" else echo "โŒ Error: dist/ directory not found" exit 1 fi # Copy essential data files echo "๐Ÿ—‚๏ธ Setting up data files..." if [ -f "src/data/tools.yaml" ]; then cp src/data/tools.yaml "$WEBROOT/src/data/" echo "โœ… tools.yaml copied" else echo "โŒ Error: src/data/tools.yaml not found" exit 1 fi # Copy any existing knowledgebase content if [ -d "src/content/knowledgebase" ]; then mkdir -p "$WEBROOT/src/content" cp -r src/content/knowledgebase "$WEBROOT/src/content/" echo "โœ… Knowledgebase content copied" fi # Handle environment configuration if [ -f "/tmp/forensic-pathways.env.backup" ]; then echo "๐Ÿ”ง Restoring existing .env configuration..." cp "/tmp/forensic-pathways.env.backup" "$WEBROOT/.env" rm "/tmp/forensic-pathways.env.backup" echo "โœ… Existing configuration restored" else echo "๐Ÿ”ง Setting up new environment configuration..." cp .env.example "$WEBROOT/.env" echo "โš ๏ธ IMPORTANT: Edit $WEBROOT/.env with your configuration" fi # Create additional required files and directories echo "๐Ÿ“ Creating additional files..." # Create embeddings data directory mkdir -p "$DATA_DIR/embeddings" # Create logs directory with proper structure mkdir -p "$LOG_DIR/access" mkdir -p "$LOG_DIR/error" mkdir -p "$LOG_DIR/ai" # Create placeholder log files touch "$LOG_DIR/access.log" touch "$LOG_DIR/error.log" touch "$LOG_DIR/ai-pipeline.log" echo "โœ… Additional files and directories created" # Set proper permissions echo "๐Ÿ” Setting permissions..." chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" chmod 600 "$WEBROOT/.env" # Specific permissions for data directories chmod 755 "$DATA_DIR" chmod 755 "$UPLOADS_DIR" chmod 755 "$LOG_DIR" chmod 644 "$LOG_DIR"/*.log # Make server entry point executable if [ -f "$WEBROOT/server/entry.mjs" ]; then chmod 755 "$WEBROOT/server/entry.mjs" echo "โœ… Server entry point permissions set" fi echo "โœ… Permissions configured successfully" # Display deployment summary echo "" echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "โœ… ForensicPathways Deployment Complete!" echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" echo "๐Ÿ“Š Deployment Summary:" echo " ๐ŸŽฏ Target: $WEBROOT" echo " ๐Ÿ’พ Backup: $BACKUP_DIR" echo " ๐Ÿ“ Logs: $LOG_DIR" echo " ๐Ÿ“ค Uploads: $UPLOADS_DIR" echo " ๐Ÿ—ƒ๏ธ Data: $DATA_DIR" echo "" echo "๐Ÿ“‹ Required Next Steps:" echo " 1. ๐Ÿ”ง Edit $WEBROOT/.env with your configuration" echo " - Set PUBLIC_BASE_URL to your domain" echo " - Configure AI_ANALYZER_* settings" echo " - Set AUTH_SECRET to a secure value" echo "" echo " 2. ๐Ÿ”„ Restart services:" echo " sudo systemctl restart forensic-pathways" echo " sudo systemctl reload nginx" echo "" echo " 3. ๐Ÿ” Check status:" echo " sudo systemctl status forensic-pathways" echo " sudo tail -f $LOG_DIR/error.log" echo "" echo "๐ŸŒ Once configured, access at: http://your-domain.com" echo "" # Final validation echo "๐Ÿ” Post-deployment validation..." if [ -f "$WEBROOT/.env" ]; then echo "โœ… Environment configuration exists" else echo "โŒ Environment configuration missing" fi if [ -f "$WEBROOT/src/data/tools.yaml" ]; then echo "โœ… Tools database exists" else echo "โŒ Tools database missing" fi if [ -d "$WEBROOT/server" ]; then echo "โœ… Server directory exists" else echo "โŒ Server directory missing" fi echo "" echo "๐ŸŽ‰ Deployment script completed at $(date '+%Y-%m-%d %H:%M:%S')"