#!/bin/bash # ============================================ # Sistema de ATLAS - Health Check # ============================================ # Verifica el estado de todos los servicios # # Uso: ./health-check.sh [--verbose] [--json] # ============================================ set -o pipefail # --------------------------------------------- # Colores # --------------------------------------------- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Variables INSTALL_DIR="${INSTALL_DIR:-/opt/atlas}" VERBOSE=false JSON_OUTPUT=false EXIT_CODE=0 # Cargar variables de entorno if [[ -f "$INSTALL_DIR/.env" ]]; then export $(grep -v '^#' "$INSTALL_DIR/.env" | xargs) fi # --------------------------------------------- # Funciones # --------------------------------------------- parse_args() { while [[ $# -gt 0 ]]; do case $1 in --verbose|-v) VERBOSE=true; shift ;; --json|-j) JSON_OUTPUT=true; shift ;; --help|-h) echo "Uso: $0 [--verbose] [--json]" exit 0 ;; *) shift ;; esac done } check_service() { local service="$1" local name="$2" if systemctl is-active --quiet "$service" 2>/dev/null; then echo "ok" else echo "fail" fi } check_port() { local port="$1" if nc -z localhost "$port" 2>/dev/null; then echo "ok" else echo "fail" fi } check_url() { local url="$1" local timeout="${2:-5}" if curl -sf --max-time "$timeout" "$url" > /dev/null 2>&1; then echo "ok" else echo "fail" fi } check_db() { local host="${POSTGRES_HOST:-localhost}" local port="${POSTGRES_PORT:-5432}" local db="${POSTGRES_DB:-atlas}" local user="${POSTGRES_USER:-atlas}" if PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "$host" -p "$port" -U "$user" -d "$db" -c "SELECT 1" > /dev/null 2>&1; then echo "ok" else echo "fail" fi } check_redis() { local password="${REDIS_PASSWORD:-}" if [[ -n "$password" ]]; then if redis-cli -a "$password" ping 2>/dev/null | grep -q "PONG"; then echo "ok" else echo "fail" fi else if redis-cli ping 2>/dev/null | grep -q "PONG"; then echo "ok" else echo "fail" fi fi } print_status() { local name="$1" local status="$2" local details="$3" if [[ "$JSON_OUTPUT" == "true" ]]; then return fi if [[ "$status" == "ok" ]]; then echo -e " ${GREEN}[OK]${NC} $name" else echo -e " ${RED}[FAIL]${NC} $name" EXIT_CODE=1 fi if [[ "$VERBOSE" == "true" ]] && [[ -n "$details" ]]; then echo -e " $details" fi } # --------------------------------------------- # Main # --------------------------------------------- main() { parse_args "$@" # Resultados para JSON declare -A results if [[ "$JSON_OUTPUT" != "true" ]]; then echo "" echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} HEALTH CHECK - Sistema de ATLAS${NC}" echo -e "${BLUE}========================================${NC}" echo "" echo -e "${BLUE}Servicios Systemd:${NC}" fi # Servicios systemd results[atlas_api]=$(check_service "atlas-api" "API Backend") print_status "atlas-api" "${results[atlas_api]}" results[atlas_web]=$(check_service "atlas-web" "Frontend Web") print_status "atlas-web" "${results[atlas_web]}" results[postgresql]=$(check_service "postgresql" "PostgreSQL") print_status "postgresql" "${results[postgresql]}" results[redis]=$(check_service "redis-server" "Redis") print_status "redis" "${results[redis]}" results[traccar]=$(check_service "traccar" "Traccar GPS") print_status "traccar" "${results[traccar]}" results[mediamtx]=$(check_service "mediamtx" "MediaMTX") print_status "mediamtx" "${results[mediamtx]}" results[mosquitto]=$(check_service "mosquitto" "Mosquitto MQTT") print_status "mosquitto" "${results[mosquitto]}" if [[ "$JSON_OUTPUT" != "true" ]]; then echo "" echo -e "${BLUE}Conectividad:${NC}" fi # Puertos results[port_api]=$(check_port "${API_PORT:-8000}") print_status "API (puerto ${API_PORT:-8000})" "${results[port_api]}" results[port_frontend]=$(check_port "${FRONTEND_PORT:-3000}") print_status "Frontend (puerto ${FRONTEND_PORT:-3000})" "${results[port_frontend]}" results[port_traccar]=$(check_port "${TRACCAR_PORT:-5055}") print_status "Traccar (puerto ${TRACCAR_PORT:-5055})" "${results[port_traccar]}" results[port_rtsp]=$(check_port 8554) print_status "MediaMTX RTSP (puerto 8554)" "${results[port_rtsp]}" if [[ "$JSON_OUTPUT" != "true" ]]; then echo "" echo -e "${BLUE}Base de Datos:${NC}" fi # Base de datos results[db_connection]=$(check_db) print_status "PostgreSQL conexion" "${results[db_connection]}" results[redis_connection]=$(check_redis) print_status "Redis conexion" "${results[redis_connection]}" if [[ "$JSON_OUTPUT" != "true" ]]; then echo "" echo -e "${BLUE}APIs:${NC}" fi # APIs results[api_health]=$(check_url "http://localhost:${API_PORT:-8000}/health") print_status "API /health" "${results[api_health]}" results[mediamtx_api]=$(check_url "http://localhost:9997/v3/paths/list") print_status "MediaMTX API" "${results[mediamtx_api]}" # JSON output if [[ "$JSON_OUTPUT" == "true" ]]; then echo "{" echo " \"timestamp\": \"$(date -Iseconds)\"," echo " \"status\": \"$([ $EXIT_CODE -eq 0 ] && echo 'healthy' || echo 'unhealthy')\"," echo " \"checks\": {" first=true for key in "${!results[@]}"; do if [[ "$first" != "true" ]]; then echo "," fi first=false printf " \"%s\": \"%s\"" "$key" "${results[$key]}" done echo "" echo " }" echo "}" else echo "" if [[ $EXIT_CODE -eq 0 ]]; then echo -e "${GREEN}Estado general: SALUDABLE${NC}" else echo -e "${RED}Estado general: PROBLEMAS DETECTADOS${NC}" fi echo "" fi exit $EXIT_CODE } main "$@"