213 lines
4.9 KiB
Bash
213 lines
4.9 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
# Configuration
|
|||
|
|
ENVIRONMENT=${1:-local}
|
|||
|
|
VERBOSE=${2:-false}
|
|||
|
|
|
|||
|
|
# Determine compose file
|
|||
|
|
if [ "$ENVIRONMENT" == "production" ]; then
|
|||
|
|
COMPOSE_FILE="docker-compose.production.yml"
|
|||
|
|
FRONTEND_PORT=80
|
|||
|
|
else
|
|||
|
|
COMPOSE_FILE="docker-compose.yml"
|
|||
|
|
FRONTEND_PORT=3000
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Exit code
|
|||
|
|
EXIT_CODE=0
|
|||
|
|
|
|||
|
|
# Function to print colored messages
|
|||
|
|
print_info() {
|
|||
|
|
echo -e "${BLUE}ℹ️ $1${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print_success() {
|
|||
|
|
echo -e "${GREEN}✅ $1${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print_warning() {
|
|||
|
|
echo -e "${YELLOW}⚠️ $1${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print_error() {
|
|||
|
|
echo -e "${RED}❌ $1${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Function to check container status
|
|||
|
|
check_container_status() {
|
|||
|
|
local service=$1
|
|||
|
|
local status=$(docker-compose -f "$COMPOSE_FILE" ps "$service" 2>/dev/null | tail -n +3 | awk '{print $1, $4, $5, $6, $7}' | grep "$service" || echo "")
|
|||
|
|
|
|||
|
|
if [ -z "$status" ]; then
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if echo "$status" | grep -q "Up\|healthy"; then
|
|||
|
|
return 0
|
|||
|
|
else
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Function to check HTTP endpoint
|
|||
|
|
check_http_endpoint() {
|
|||
|
|
local service=$1
|
|||
|
|
local url=$2
|
|||
|
|
local timeout=${3:-5}
|
|||
|
|
|
|||
|
|
if curl -sf --max-time "$timeout" "$url" >/dev/null 2>&1; then
|
|||
|
|
return 0
|
|||
|
|
else
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Function to check service health
|
|||
|
|
check_service_health() {
|
|||
|
|
local service=$1
|
|||
|
|
local endpoint=$2
|
|||
|
|
local port=${3:-}
|
|||
|
|
|
|||
|
|
print_info "Checking ${service}..."
|
|||
|
|
|
|||
|
|
# Check container status
|
|||
|
|
if ! check_container_status "$service"; then
|
|||
|
|
print_error "${service}: Container is not running or unhealthy"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Check HTTP endpoint if provided
|
|||
|
|
if [ -n "$endpoint" ]; then
|
|||
|
|
if check_http_endpoint "$service" "$endpoint"; then
|
|||
|
|
print_success "${service}: Healthy (HTTP endpoint responding)"
|
|||
|
|
return 0
|
|||
|
|
else
|
|||
|
|
print_warning "${service}: Container running but HTTP endpoint not responding"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# If no endpoint, just check container status
|
|||
|
|
print_success "${service}: Healthy (container running)"
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Function to check database connectivity
|
|||
|
|
check_database() {
|
|||
|
|
local service=$1
|
|||
|
|
local user=$2
|
|||
|
|
local db=$3
|
|||
|
|
|
|||
|
|
print_info "Checking ${service} database connectivity..."
|
|||
|
|
|
|||
|
|
if docker-compose -f "$COMPOSE_FILE" exec -T "$service" psql -U "$user" -d "$db" -c "SELECT 1;" >/dev/null 2>&1; then
|
|||
|
|
print_success "${service}: Database connection successful"
|
|||
|
|
return 0
|
|||
|
|
else
|
|||
|
|
print_error "${service}: Database connection failed"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Function to check Redis connectivity
|
|||
|
|
check_redis() {
|
|||
|
|
local service=$1
|
|||
|
|
|
|||
|
|
print_info "Checking ${service} connectivity..."
|
|||
|
|
|
|||
|
|
if docker-compose -f "$COMPOSE_FILE" exec -T "$service" redis-cli ping >/dev/null 2>&1; then
|
|||
|
|
print_success "${service}: Redis connection successful"
|
|||
|
|
return 0
|
|||
|
|
else
|
|||
|
|
print_error "${service}: Redis connection failed"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Main health check
|
|||
|
|
main() {
|
|||
|
|
print_info "🏥 Checking health of all services for ${ENVIRONMENT} environment..."
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check prerequisites
|
|||
|
|
if [ ! -f "$COMPOSE_FILE" ]; then
|
|||
|
|
print_error "$COMPOSE_FILE not found. Aborting.";
|
|||
|
|
exit 1;
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Check PostgreSQL
|
|||
|
|
if ! check_service_health "postgres" ""; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
else
|
|||
|
|
if [ "$ENVIRONMENT" == "local" ]; then
|
|||
|
|
check_database "postgres" "veza_user" "veza_local" || EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Redis
|
|||
|
|
if ! check_service_health "redis" ""; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
else
|
|||
|
|
check_redis "redis" || EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Backend API
|
|||
|
|
if ! check_service_health "backend-api" "http://localhost:8080/health"; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Chat Server
|
|||
|
|
if ! check_service_health "chat-server" "http://localhost:8081/health"; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Stream Server
|
|||
|
|
if ! check_service_health "stream-server" "http://localhost:8082/health"; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Frontend
|
|||
|
|
if ! check_service_health "frontend" "http://localhost:${FRONTEND_PORT}/health"; then
|
|||
|
|
EXIT_CODE=1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Display summary
|
|||
|
|
if [ $EXIT_CODE -eq 0 ]; then
|
|||
|
|
print_success "🎉 All services are healthy!"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
if [ "$VERBOSE" == "true" ] || [ "$VERBOSE" == "-v" ]; then
|
|||
|
|
print_info "Detailed service status:"
|
|||
|
|
docker-compose -f "$COMPOSE_FILE" ps
|
|||
|
|
fi
|
|||
|
|
else
|
|||
|
|
print_error "❌ Some services are unhealthy!"
|
|||
|
|
echo ""
|
|||
|
|
print_info "Detailed service status:"
|
|||
|
|
docker-compose -f "$COMPOSE_FILE" ps
|
|||
|
|
echo ""
|
|||
|
|
print_warning "Run with verbose flag (-v) for more details"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
exit $EXIT_CODE
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Run main function
|
|||
|
|
main
|
|||
|
|
|