diff --git a/packages/reservation-platform/install-frontend.sh b/packages/reservation-platform/install-frontend.sh index 244e58d..8eb3e6e 100755 --- a/packages/reservation-platform/install-frontend.sh +++ b/packages/reservation-platform/install-frontend.sh @@ -3,14 +3,37 @@ # MYP Frontend Installation Script for Debian # This script installs and configures the MYP frontend reservation platform -set -e # Exit immediately if a command exits with non-zero status +# We'll handle errors ourselves rather than exiting immediately +# set -e SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" LOG_FILE="$SCRIPT_DIR/frontend-install.log" -# Function for logging with timestamps +# Function for logging with timestamps and colors log() { local timestamp=$(date +"%Y-%m-%d %H:%M:%S") - echo -e "[$timestamp] $1" | tee -a "$LOG_FILE" + local message="[$timestamp] $1" + echo -e "$message" | tee -a "$LOG_FILE" +} + +# Function for logging errors with timestamps and colors +log_error() { + local timestamp=$(date +"%Y-%m-%d %H:%M:%S") + local message="[$timestamp] ERROR: $1" + echo -e "\033[0;31m$message\033[0m" | tee -a "$LOG_FILE" +} + +# Function for logging warnings with timestamps and colors +log_warning() { + local timestamp=$(date +"%Y-%m-%d %H:%M:%S") + local message="[$timestamp] WARNING: $1" + echo -e "\033[0;33m$message\033[0m" | tee -a "$LOG_FILE" +} + +# Function for logging success with timestamps and colors +log_success() { + local timestamp=$(date +"%Y-%m-%d %H:%M:%S") + local message="[$timestamp] SUCCESS: $1" + echo -e "\033[0;32m$message\033[0m" | tee -a "$LOG_FILE" } # Function to check if a command exists @@ -21,6 +44,25 @@ command_exists() { # Clear log file > "$LOG_FILE" +# Add script usage info +usage() { + echo "Usage: $0 [OPTIONS]" + echo "" + echo "OPTIONS:" + echo " --auto-production Non-interactive installation in production mode" + echo " --auto-development Non-interactive installation in development mode" + echo " --help Show this help message" + echo "" + echo "Example:" + echo " $0 --auto-production" + exit 1 +} + +# Check for help flag +if [ "$1" == "--help" ]; then + usage +fi + log "===== Starting MYP Frontend Installation =====" log "Installation directory: $SCRIPT_DIR" @@ -91,13 +133,23 @@ fi # Install pnpm if ! command_exists pnpm; then log "Installing pnpm package manager..." - curl -fsSL https://get.pnpm.io/install.sh | sh - >> "$LOG_FILE" 2>&1 - source ~/.bashrc + # Install pnpm globally to avoid home directory permission issues + npm install -g pnpm >> "$LOG_FILE" 2>&1 + # Fallback method in case npm method fails + if ! command_exists pnpm; then + log "Trying alternative pnpm installation method..." + curl -fsSL https://get.pnpm.io/install.sh | bash - >> "$LOG_FILE" 2>&1 + export PATH="$HOME/.local/share/pnpm:$PATH" + fi log "pnpm $(pnpm --version) installed" else log "pnpm $(pnpm --version) already installed" fi +# Add pnpm to PATH for this script session +export PATH="$HOME/.local/share/pnpm:$PATH" +export PNPM_HOME="$HOME/.local/share/pnpm" + # Enable and start Docker log "Ensuring Docker is running..." systemctl enable docker >> "$LOG_FILE" 2>&1 @@ -139,6 +191,11 @@ if [ ! -f "$SCRIPT_DIR/docker/caddy/Caddyfile" ]; then X-Content-Type-Options "nosniff" # Clickjacking protection X-Frame-Options "SAMEORIGIN" + # Allow backend API access (CORS) + Access-Control-Allow-Origin "http://192.168.0.105:5000" + Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" + Access-Control-Allow-Headers "Origin, Content-Type, Accept, Authorization" + Access-Control-Allow-Credentials "true" } # Log access @@ -197,8 +254,19 @@ fi log "Setting up database directory..." mkdir -p /srv/MYP-DB -# Check if we need to run in development or production mode -read -p "Do you want to set up the frontend in production mode? (y/n): " production_mode +# Determine if we should run in non-interactive mode +if [ -n "$1" ] && [ "$1" == "--auto-production" ]; then + log "Running in automatic production mode (non-interactive)..." + production_mode="y" +elif [ -n "$1" ] && [ "$1" == "--auto-development" ]; then + log "Running in automatic development mode (non-interactive)..." + production_mode="n" +else + # Interactive mode + log "Running in interactive mode..." + # Check if we need to run in development or production mode + read -p "Do you want to set up the frontend in production mode? (y/n): " production_mode +fi if [ "$production_mode" = "y" ] || [ "$production_mode" = "Y" ]; then # Production mode - using Docker @@ -256,24 +324,120 @@ EOF log "docker-compose.yml created with backend network configuration" fi - # Build Docker image + # Build Docker image with error handling log "Building Docker image (this may take a while)..." - cd "$SCRIPT_DIR/docker" - if [ -f "build.sh" ]; then - bash build.sh >> "$LOG_FILE" 2>&1 - log "Docker image built successfully" - else - log "Building Docker image manually..." - cd "$SCRIPT_DIR" - docker build -t myp-rp:latest . >> "$LOG_FILE" 2>&1 - log "Docker image built" + # Check available disk space before starting build + available_space=$(df -m / | awk 'NR==2 {print $4}') + if [ "$available_space" -lt 2000 ]; then + log "WARNING: Low disk space (${available_space}MB). Docker build may fail." + log "Consider freeing up at least 2GB of space before continuing." + read -p "Continue anyway? (y/n): " continue_build + if [ "$continue_build" != "y" ] && [ "$continue_build" != "Y" ]; then + log "Docker build aborted due to low disk space." + exit 1 + fi fi - # Start the application + # Test Docker is working properly + if ! docker info >> "$LOG_FILE" 2>&1; then + log "ERROR: Docker is not running or the current user doesn't have permission to use Docker." + log "Try running 'sudo systemctl restart docker' or add your user to the docker group with:" + log "'sudo usermod -aG docker $USER' and then log out and back in." + exit 1 + fi + + # Try to use existing build script if available + if [ -f "$SCRIPT_DIR/docker/build.sh" ]; then + log "Using existing build script..." + cd "$SCRIPT_DIR/docker" + if bash build.sh >> "$LOG_FILE" 2>&1; then + log "Docker image built successfully using build.sh" + else + log "ERROR: Docker build failed using build.sh script" + log "Attempting direct build as fallback..." + cd "$SCRIPT_DIR" + if docker build -t myp-rp:latest . >> "$LOG_FILE" 2>&1; then + log "Docker image built successfully using direct method" + else + log "ERROR: Docker build failed. Check the log at $LOG_FILE for details." + exit 1 + fi + fi + else + # Direct build method + log "Building Docker image manually..." + cd "$SCRIPT_DIR" + if docker build -t myp-rp:latest . >> "$LOG_FILE" 2>&1; then + log "Docker image built successfully" + else + log "ERROR: Docker build failed. Check the log at $LOG_FILE for details." + exit 1 + fi + fi + + # Verify the image was created + if docker image inspect myp-rp:latest >> /dev/null 2>&1; then + log "Verified: Docker image myp-rp:latest exists" + else + log "ERROR: Docker image myp-rp:latest does not exist after build" + exit 1 + fi + + # Start the application with error handling log "Starting the application using Docker Compose..." cd "$SCRIPT_DIR/docker" - docker-compose -f compose.yml up -d + + # Ensure we have the compose file + if [ ! -f "compose.yml" ]; then + log "ERROR: compose.yml not found in $(pwd)" + log "Looking for compose file in alternative locations..." + find "$SCRIPT_DIR" -name "compose.yml" -o -name "docker-compose.yml" 2>/dev/null | while read compose_file; do + log "Found compose file at: $compose_file" + done + exit 1 + fi + + # Test docker-compose to make sure it's working + if ! docker-compose version >> "$LOG_FILE" 2>&1; then + log "WARNING: docker-compose command failed. Trying with docker compose (with space)..." + if ! docker compose version >> "$LOG_FILE" 2>&1; then + log "ERROR: Both docker-compose and docker compose commands failed." + log "Please check Docker and Docker Compose installation." + exit 1 + else + # Use docker compose instead + log "Using docker compose (with space) command..." + if docker compose -f compose.yml up -d >> "$LOG_FILE" 2>&1; then + log "Application started successfully with docker compose!" + else + log "ERROR: Failed to start application with docker compose." + log "Check logs with: docker compose -f compose.yml logs" + exit 1 + fi + fi + else + # Use docker-compose + if docker-compose -f compose.yml up -d >> "$LOG_FILE" 2>&1; then + log "Application started successfully with docker-compose!" + else + log "ERROR: Failed to start application with docker-compose." + log "Check logs with: docker-compose -f compose.yml logs" + exit 1 + fi + fi + + # Verify containers are running + log "Verifying containers are running..." + sleep 5 # Give containers a moment to start + + running_containers=$(docker ps --format '{{.Names}}' | grep -c "myp\|frontend\|caddy" || echo "0") + if [ "$running_containers" -gt 0 ]; then + log "Detected $running_containers running containers related to MYP." + else + log "WARNING: No running containers detected for MYP frontend." + log "Check container status with: docker ps -a" + fi log "Frontend installed and running in production mode!" log "The application should be accessible at http://localhost" @@ -286,12 +450,51 @@ else # Install dependencies log "Installing project dependencies with pnpm..." cd "$SCRIPT_DIR" - # Source pnpm if needed - source ~/.bashrc - export PATH="$HOME/.local/share/pnpm:$PATH" - pnpm install >> "$LOG_FILE" 2>&1 - log "Dependencies installed" + # Make sure we're in the right directory and pnpm is available + log "Current directory: $(pwd)" + log "Checking pnpm path: $(which pnpm 2>/dev/null || echo 'pnpm not found in PATH')" + + # Install dependencies with retry mechanism + max_attempts=3 + attempt=1 + success=false + + while [ $attempt -le $max_attempts ] && [ "$success" = "false" ]; do + log "Attempt $attempt of $max_attempts to install dependencies..." + + if command_exists pnpm; then + if pnpm install >> "$LOG_FILE" 2>&1; then + log "Dependencies installed successfully!" + success=true + else + log "WARNING: pnpm install failed on attempt $attempt" + fi + else + log "ERROR: pnpm not found in PATH. Trying to fix..." + export PATH="$PATH:$HOME/.local/share/pnpm:$HOME/.pnpm:$(npm global bin)" + if ! command_exists pnpm; then + log "Attempting to reinstall pnpm..." + npm install -g pnpm >> "$LOG_FILE" 2>&1 + fi + fi + + attempt=$((attempt+1)) + + # If we've failed but have more attempts to go, wait a bit before trying again + if [ "$success" = "false" ] && [ $attempt -le $max_attempts ]; then + log "Waiting 5 seconds before retry..." + sleep 5 + fi + done + + if [ "$success" = "false" ]; then + log "ERROR: Failed to install dependencies after $max_attempts attempts." + log "Please check the log file at $LOG_FILE for details." + log "You may need to run 'pnpm install' manually in $SCRIPT_DIR" + else + log "Dependencies successfully installed." + fi # Create .env.local file for development if [ ! -f "$SCRIPT_DIR/.env.local" ]; then