#!/bin/bash set -e echo "===================================" echo "Webshop Scraper Installation Script" echo "===================================" echo "" # Check if running as root if [ "$EUID" -ne 0 ]; then echo "Error: Please run as root (use sudo)" exit 1 fi # Get the actual user who ran sudo ACTUAL_USER=${SUDO_USER:-$USER} ACTUAL_HOME=$(eval echo ~$ACTUAL_USER) # Installation directory INSTALL_DIR="/opt/webshop-scraper" SERVICE_NAME="webshop-scraper" echo "Installation directory: $INSTALL_DIR" echo "Service name: $SERVICE_NAME" echo "" # Check if application is already installed EXISTING_INSTALLATION=false EXISTING_ENV_FILE="$INSTALL_DIR/.env" if [ -f "$EXISTING_ENV_FILE" ]; then EXISTING_INSTALLATION=true echo "Existing installation detected!" echo "Found existing configuration at: $EXISTING_ENV_FILE" echo "" # Load existing configuration source "$EXISTING_ENV_FILE" 2>/dev/null || true # Set defaults from existing config or fallback to hardcoded defaults EXISTING_API_KEY="$API_KEY" EXISTING_HOST="${HOST:-0.0.0.0}" EXISTING_PORT="${PORT:-3000}" EXISTING_MAX_CONCURRENT_JOBS="${MAX_CONCURRENT_JOBS:-3}" echo "Current configuration:" echo " API Key: ${EXISTING_API_KEY:0:8}... (masked)" echo " Host: $EXISTING_HOST" echo " Port: $EXISTING_PORT" echo " Max Concurrent Jobs: $EXISTING_MAX_CONCURRENT_JOBS" echo "" # Ask if user wants to keep existing configuration echo "Do you want to keep the existing configuration? [Y/n]:" read KEEP_CONFIG KEEP_CONFIG=${KEEP_CONFIG:-Y} if [[ "$KEEP_CONFIG" =~ ^[Yy]([Ee][Ss])?$ ]]; then echo "Using existing configuration..." API_KEY="$EXISTING_API_KEY" HOST="$EXISTING_HOST" PORT="$EXISTING_PORT" MAX_CONCURRENT_JOBS="$EXISTING_MAX_CONCURRENT_JOBS" SKIP_CONFIG_PROMPTS=true else echo "Will prompt for new configuration..." SKIP_CONFIG_PROMPTS=false fi echo "" else echo "No existing installation found. Starting fresh installation..." echo "" SKIP_CONFIG_PROMPTS=false fi # Configuration prompts (skip if using existing config) if [ "$SKIP_CONFIG_PROMPTS" != "true" ]; then # Prompt for API key if [ "$EXISTING_INSTALLATION" = "true" ]; then echo "Enter new API key for authentication (current: ${EXISTING_API_KEY:0:8}...):" echo "Press Enter to keep current API key, or enter new one:" read -s NEW_API_KEY if [ -n "$NEW_API_KEY" ]; then API_KEY="$NEW_API_KEY" else API_KEY="$EXISTING_API_KEY" fi else echo "Please enter the API key for authentication:" read -s API_KEY fi echo "" if [ -z "$API_KEY" ]; then echo "Error: API key cannot be empty" exit 1 fi # Prompt for host/IP address echo "Enter the host/IP address to listen on:" echo " - 0.0.0.0 for all interfaces (accessible from anywhere)" echo " - 127.0.0.1 for localhost only (accessible only from this machine)" echo " - or enter a specific IP address" if [ "$EXISTING_INSTALLATION" = "true" ]; then echo "Current: $EXISTING_HOST, Default: $EXISTING_HOST" read HOST HOST=${HOST:-$EXISTING_HOST} else echo "Default: 0.0.0.0" read HOST HOST=${HOST:-0.0.0.0} fi # Prompt for port (optional) if [ "$EXISTING_INSTALLATION" = "true" ]; then echo "Enter the HTTP port (current: $EXISTING_PORT):" read PORT PORT=${PORT:-$EXISTING_PORT} else echo "Enter the HTTP port (default: 3000):" read PORT PORT=${PORT:-3000} fi # Prompt for max concurrent jobs (optional) if [ "$EXISTING_INSTALLATION" = "true" ]; then echo "Enter the maximum number of concurrent jobs (current: $EXISTING_MAX_CONCURRENT_JOBS):" read MAX_CONCURRENT_JOBS MAX_CONCURRENT_JOBS=${MAX_CONCURRENT_JOBS:-$EXISTING_MAX_CONCURRENT_JOBS} else echo "Enter the maximum number of concurrent jobs (default: 3):" read MAX_CONCURRENT_JOBS MAX_CONCURRENT_JOBS=${MAX_CONCURRENT_JOBS:-3} fi fi echo "" echo "Configuration:" echo " Host: $HOST" echo " Port: $PORT" echo " Max Concurrent Jobs: $MAX_CONCURRENT_JOBS" echo "" # Create installation directory echo "Creating installation directory..." mkdir -p "$INSTALL_DIR" # Get the script directory (where install.sh is located) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" # Check if Node.js is installed if ! command -v node &> /dev/null; then echo "Error: Node.js is not installed. Please install Node.js first." exit 1 fi # Check if npm is installed if ! command -v npm &> /dev/null; then echo "Error: npm is not installed. Please install npm first." exit 1 fi # Build application in the source directory first echo "Building application..." cd "$PROJECT_DIR" # Install all dependencies (including dev dependencies for build) echo "Installing build dependencies..." npm install # Build the application echo "Compiling TypeScript and building web assets..." npm run build # Check if build was successful if [ ! -f "$PROJECT_DIR/dist/index.js" ]; then echo "Error: Build failed - dist/index.js not found" exit 1 fi # Copy application files echo "Copying application files..." cp -r package.json "$INSTALL_DIR/" cp -r dist "$INSTALL_DIR/" # Change to installation directory cd "$INSTALL_DIR" # Install only production dependencies echo "Installing production dependencies..." npm install --production # Create environment file echo "Creating environment file..." # Check if source .env file exists SOURCE_ENV_FILE="$PROJECT_DIR/.env" if [ -f "$SOURCE_ENV_FILE" ]; then echo "Found .env file in source directory, using it..." # Copy the entire .env file from source cp "$SOURCE_ENV_FILE" "$INSTALL_DIR/.env" echo ".env file copied from source directory" else # Fallback to creating from prompted values cat > "$INSTALL_DIR/.env" < "/etc/systemd/system/$SERVICE_NAME.service" <