#!/bin/bash # ForensicPathways Deployment Script – *ownership-aware* # 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 "" ############################################################################### # 0. Safety checks ############################################################################### if [ "$EUID" -ne 0 ]; then echo "❌ Error: This script must be run as root (use sudo)"; exit 1 fi 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 ############################################################################### # 1. Helper – build with whichever npm is available for the original user ############################################################################### find_and_use_npm() { echo "πŸ” Searching for npm installation..." # A) system-wide npm 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 # B) nvm-managed 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 npm run build " return 0 fi # C) nothing found cat <<'EOF' ❌ npm not found in system or user environment πŸ’‘ Please install Node.js and npm first: # Option 1 (apt): sudo apt update && sudo apt install nodejs npm # Option 2 (NodeSource – recommended): curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # Option 3 (nvm – as user): curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc && nvm install 20 EOF return 1 } ############################################################################### # 2. Build (if needed) – runs as ORIGINAL_USER so $PATH is intact ############################################################################### if [ ! -d "dist" ] || [ ! "$(ls -A dist 2>/dev/null)" ]; then echo "πŸ“¦ No dist/ directory found, building…" find_and_use_npm || exit 1 else echo "πŸ“¦ Found existing dist/ directory" read -rp "πŸ€” Rebuild application? (y/N): " REPLY; echo if [[ $REPLY =~ ^[Yy]$ ]]; then find_and_use_npm || { echo "πŸ’‘ Using existing dist/ due to build failure"; } else echo "πŸ“¦ Using existing build" fi fi if [ ! -d "dist" ] || [ ! "$(ls -A dist 2>/dev/null)" ]; then echo "❌ Error: Build failed or dist/ is empty"; exit 1 fi echo "βœ… Build completed successfully" ############################################################################### # 3. Prepare target directories ############################################################################### echo "πŸ“ Setting up target directories..." mkdir -p "$WEBROOT" "$LOG_DIR" "$DATA_DIR" "$UPLOADS_DIR" "$WEBROOT/src/data" ############################################################################### # 4. Deploy build files ############################################################################### echo "πŸ“‹ Copying application files…" cp -r dist/. "$WEBROOT/" echo "βœ… Application files copied ($(du -sh dist | cut -f1))" cp package.json "$WEBROOT/" echo "βœ… package.json copied" ############################################################################### # 5. **Runtime dependencies** – temporarily chown to ORIGINAL_USER ############################################################################### echo "πŸ“¦ Installing runtime dependencies…" # Temporary hand-off chown -R "$ORIGINAL_USER":"$ORIGINAL_USER" "$WEBROOT" sudo -u "$ORIGINAL_USER" bash -c ' set -e cd "'"$WEBROOT"'" if command -v npm &>/dev/null; then npm install --production else 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 fi ' echo "βœ… Runtime dependencies installed" ############################################################################### # 6. Additional data & content ############################################################################### 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 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 ############################################################################### # 7. 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" ############################################################################### # 8. Logs ############################################################################### echo "πŸ“ Creating log files…" touch "$LOG_DIR/access.log" "$LOG_DIR/error.log" "$LOG_DIR/ai-pipeline.log" ############################################################################### # 9. FINAL permissions – hand back to www-data ############################################################################### echo "πŸ” Setting final permissions…" chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" chmod 600 "$WEBROOT/.env" chmod 755 "$DATA_DIR" "$UPLOADS_DIR" "$LOG_DIR" chmod 644 "$LOG_DIR"/*.log if [ -f "$WEBROOT/server/entry.mjs" ]; then chmod 755 "$WEBROOT/server/entry.mjs" echo "βœ… Server entry point permissions set" fi echo "βœ… Permissions configured" ############################################################################### # 10. Post-deployment validation ############################################################################### echo "" echo "πŸ” Post-deployment validation…" VALIDATION_ERRORS=0 [ -f "$WEBROOT/.env" ] && echo "βœ… Environment configuration exists" || { echo "❌ Environment configuration missing"; ((VALIDATION_ERRORS++)); } [ -f "$WEBROOT/src/data/tools.yaml" ] && echo "βœ… Tools database exists" || { echo "❌ Tools database missing"; ((VALIDATION_ERRORS++)); } { [ -f "$WEBROOT/index.html" ] || [ -d "$WEBROOT/server" ]; } && \ echo "βœ… Application files deployed" || { echo "❌ Application files missing"; ((VALIDATION_ERRORS++)); } echo "" if [ $VALIDATION_ERRORS -eq 0 ]; then cat <