Improve frontend installation script for robust installation process
- Add non-interactive installation mode with command-line options - Implement robust error handling and recovery mechanisms - Fix pnpm installation with fallback methods and PATH configuration - Add CORS headers to allow communication with backend - Improve Docker build and compose process with verification steps - Add colored log output for better readability - Add dependency installation retry mechanism for better reliability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
8366a9295e
commit
2ab4c4c3e2
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user