213 lines
5.8 KiB
Bash
213 lines
5.8 KiB
Bash
#!/bin/bash
|
|
|
|
# Unison Service Startup Script
|
|
# This script handles the startup of the Unison service with proper error handling and logging
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Logging function
|
|
log() {
|
|
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
|
|
}
|
|
|
|
# Configuration
|
|
SERVICE_NAME="Unison"
|
|
SERVICE_PORT=${PORT:-8010}
|
|
SERVICE_HOST=${HOST:-0.0.0.0}
|
|
NODE_ENV=${NODE_ENV:-development}
|
|
LOG_LEVEL=${LOG_LEVEL:-info}
|
|
|
|
# External service URLs (set by docker-compose.yml)
|
|
TECH_STACK_SELECTOR_URL=${TECH_STACK_SELECTOR_URL:-http://pipeline_tech_stack_selector:8002}
|
|
TEMPLATE_MANAGER_URL=${TEMPLATE_MANAGER_URL:-http://pipeline_template_manager:8009}
|
|
TEMPLATE_MANAGER_AI_URL=${TEMPLATE_MANAGER_AI_URL:-http://pipeline_template_manager:8013}
|
|
|
|
# Health check URLs (set by docker-compose.yml)
|
|
TECH_STACK_SELECTOR_HEALTH_URL=${TECH_STACK_SELECTOR_HEALTH_URL:-http://pipeline_tech_stack_selector:8002/health}
|
|
TEMPLATE_MANAGER_HEALTH_URL=${TEMPLATE_MANAGER_HEALTH_URL:-http://pipeline_template_manager:8009/health}
|
|
|
|
# Timeouts
|
|
REQUEST_TIMEOUT=${REQUEST_TIMEOUT:-30000}
|
|
HEALTH_CHECK_TIMEOUT=${HEALTH_CHECK_TIMEOUT:-5000}
|
|
|
|
# Create logs directory
|
|
mkdir -p logs
|
|
|
|
# Load environment variables from config.env if it exists
|
|
if [ -f "config.env" ]; then
|
|
echo "Loading environment variables from config.env..."
|
|
export $(cat config.env | grep -v '^#' | xargs)
|
|
fi
|
|
|
|
# Function to check if a service is healthy
|
|
check_service_health() {
|
|
local service_name=$1
|
|
local health_url=$2
|
|
local timeout=${3:-5000}
|
|
|
|
log "Checking health of $service_name at $health_url..."
|
|
|
|
if curl -f -s --max-time $((timeout / 1000)) "$health_url" > /dev/null 2>&1; then
|
|
log_success "$service_name is healthy"
|
|
return 0
|
|
else
|
|
log_warning "$service_name is not responding"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to wait for external services
|
|
wait_for_services() {
|
|
log "Waiting for external services to be available..."
|
|
|
|
local max_attempts=30
|
|
local attempt=1
|
|
|
|
while [ $attempt -le $max_attempts ]; do
|
|
log "Attempt $attempt/$max_attempts: Checking external services..."
|
|
|
|
local tech_stack_healthy=false
|
|
local template_manager_healthy=false
|
|
|
|
if check_service_health "Tech Stack Selector" "$TECH_STACK_SELECTOR_HEALTH_URL" "$HEALTH_CHECK_TIMEOUT"; then
|
|
tech_stack_healthy=true
|
|
fi
|
|
|
|
if check_service_health "Template Manager" "$TEMPLATE_MANAGER_HEALTH_URL" "$HEALTH_CHECK_TIMEOUT"; then
|
|
template_manager_healthy=true
|
|
fi
|
|
|
|
if [ "$tech_stack_healthy" = true ] && [ "$template_manager_healthy" = true ]; then
|
|
log_success "All external services are healthy"
|
|
return 0
|
|
fi
|
|
|
|
log_warning "Some services are not ready yet. Waiting 10 seconds..."
|
|
sleep 10
|
|
attempt=$((attempt + 1))
|
|
done
|
|
|
|
log_error "Timeout waiting for external services after $max_attempts attempts"
|
|
log_warning "Starting service anyway - it will handle service unavailability gracefully"
|
|
return 1
|
|
}
|
|
|
|
# Function to validate environment
|
|
validate_environment() {
|
|
log "Validating environment configuration..."
|
|
|
|
# Check Node.js version
|
|
if ! command -v node &> /dev/null; then
|
|
log_error "Node.js is not installed"
|
|
exit 1
|
|
fi
|
|
|
|
local node_version=$(node --version)
|
|
log_success "Node.js version: $node_version"
|
|
|
|
# Check if package.json exists
|
|
if [ ! -f "package.json" ]; then
|
|
log_error "package.json not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if node_modules exists
|
|
if [ ! -d "node_modules" ]; then
|
|
log_warning "node_modules not found. Installing dependencies..."
|
|
npm install
|
|
fi
|
|
|
|
# Check if source directory exists
|
|
if [ ! -d "src" ]; then
|
|
log_error "Source directory 'src' not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if main app file exists
|
|
if [ ! -f "src/app.js" ]; then
|
|
log_error "Main application file 'src/app.js' not found"
|
|
exit 1
|
|
fi
|
|
|
|
log_success "Environment validation passed"
|
|
}
|
|
|
|
# Function to start the service
|
|
start_service() {
|
|
log "Starting $SERVICE_NAME service..."
|
|
|
|
# Set environment variables
|
|
export NODE_ENV
|
|
export PORT=$SERVICE_PORT
|
|
export HOST=$SERVICE_HOST
|
|
export LOG_LEVEL
|
|
export TECH_STACK_SELECTOR_URL
|
|
export TEMPLATE_MANAGER_URL
|
|
export TEMPLATE_MANAGER_AI_URL
|
|
export TECH_STACK_SELECTOR_HEALTH_URL
|
|
export TEMPLATE_MANAGER_HEALTH_URL
|
|
export REQUEST_TIMEOUT
|
|
export HEALTH_CHECK_TIMEOUT
|
|
|
|
# Log configuration
|
|
log "Configuration:"
|
|
log " Service: $SERVICE_NAME"
|
|
log " Port: $SERVICE_PORT"
|
|
log " Host: $SERVICE_HOST"
|
|
log " Environment: $NODE_ENV"
|
|
log " Log Level: $LOG_LEVEL"
|
|
log " Tech Stack Selector: $TECH_STACK_SELECTOR_URL"
|
|
log " Template Manager: $TEMPLATE_MANAGER_URL"
|
|
log " Template Manager AI: $TEMPLATE_MANAGER_AI_URL"
|
|
|
|
# Start the service
|
|
log "Starting Node.js application..."
|
|
exec node src/app.js
|
|
}
|
|
|
|
# Function to handle graceful shutdown
|
|
cleanup() {
|
|
log "Received shutdown signal. Cleaning up..."
|
|
log_success "$SERVICE_NAME service stopped gracefully"
|
|
exit 0
|
|
}
|
|
|
|
# Set up signal handlers
|
|
trap cleanup SIGTERM SIGINT
|
|
|
|
# Main execution
|
|
main() {
|
|
log "Starting $SERVICE_NAME service initialization..."
|
|
|
|
# Validate environment
|
|
validate_environment
|
|
|
|
# Wait for external services (non-blocking)
|
|
wait_for_services || true
|
|
|
|
# Start the service
|
|
start_service
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|