codenuk_backend_mine/services/unison/start.sh
2025-09-26 17:04:14 +05:30

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 "$@"