| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- #!/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" <<EOF
- API_KEY=$API_KEY
- HOST=$HOST
- PORT=$PORT
- MAX_CONCURRENT_JOBS=$MAX_CONCURRENT_JOBS
- EOF
- echo ".env file created with basic configuration"
- echo ""
- echo "NOTE: For Qdrant and OpenRouter integration, please add these variables to $INSTALL_DIR/.env:"
- echo " QDRANT_ENABLED=true"
- echo " QDRANT_API_URL=http://your-qdrant-server:6333"
- echo " QDRANT_API_KEY=your-qdrant-api-key"
- echo " OPENROUTER_API_KEY=your-openrouter-api-key"
- echo " MCP_ENABLED=true"
- echo " MCP_PORT=3001"
- echo ""
- fi
- # Set permissions
- chmod 600 "$INSTALL_DIR/.env"
- chown -R $ACTUAL_USER:$ACTUAL_USER "$INSTALL_DIR"
- # Create systemd service file
- echo "Creating systemd service..."
- cat > "/etc/systemd/system/$SERVICE_NAME.service" <<EOF
- [Unit]
- Description=Webshop Scraper Service
- After=network.target
- [Service]
- Type=simple
- User=$ACTUAL_USER
- WorkingDirectory=$INSTALL_DIR
- EnvironmentFile=$INSTALL_DIR/.env
- ExecStart=/usr/bin/node $INSTALL_DIR/dist/index.js
- Restart=on-failure
- RestartSec=10
- # Logging
- StandardOutput=journal
- StandardError=journal
- SyslogIdentifier=$SERVICE_NAME
- # Security
- NoNewPrivileges=true
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
- EOF
- # Reload systemd
- echo "Reloading systemd..."
- systemctl daemon-reload
- # Enable service
- echo "Enabling service..."
- systemctl enable "$SERVICE_NAME"
- # Handle service startup based on existing installation
- if [ "$EXISTING_INSTALLATION" = "true" ]; then
- # Check if service is already running
- if systemctl is-active --quiet "$SERVICE_NAME"; then
- echo "Service is currently running. Restarting with new configuration..."
- systemctl restart "$SERVICE_NAME"
- else
- echo "Starting service..."
- systemctl start "$SERVICE_NAME"
- fi
- else
- # Fresh installation - start service
- echo "Starting service..."
- systemctl start "$SERVICE_NAME"
- fi
- # Check status
- echo ""
- echo "==================================="
- if [ "$EXISTING_INSTALLATION" = "true" ]; then
- echo "Update completed successfully!"
- else
- echo "Installation completed successfully!"
- fi
- echo "==================================="
- echo ""
- echo "Service status:"
- systemctl status "$SERVICE_NAME" --no-pager || true
- echo ""
- echo "Useful commands:"
- echo " Start service: sudo systemctl start $SERVICE_NAME"
- echo " Stop service: sudo systemctl stop $SERVICE_NAME"
- echo " Restart service: sudo systemctl restart $SERVICE_NAME"
- echo " View logs: sudo journalctl -u $SERVICE_NAME -f"
- echo " Check status: sudo systemctl status $SERVICE_NAME"
- echo ""
- # Display appropriate URL based on host configuration
- if [ "$HOST" = "0.0.0.0" ]; then
- DISPLAY_HOST="localhost"
- else
- DISPLAY_HOST="$HOST"
- fi
- echo "API is available at: http://$DISPLAY_HOST:$PORT"
- echo "Health check: http://$DISPLAY_HOST:$PORT/health"
- echo ""
|