#!/bin/bash # =========================================== # Health Check Script for Social Media Automation # Run every 5 minutes via cron: # */5 * * * * /path/to/healthcheck.sh # =========================================== # Configuration APP_URL="${APP_URL:-http://localhost:8000}" TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" ALERT_FILE="/tmp/social_automation_alert_sent" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } send_telegram() { if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then message="$1" curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d "chat_id=${TELEGRAM_CHAT_ID}" \ -d "text=${message}" \ -d "parse_mode=HTML" > /dev/null 2>&1 fi } check_service() { local name=$1 local container=$2 if docker ps --format '{{.Names}}' | grep -q "^${container}$"; then echo -e "${GREEN}✓${NC} $name" return 0 else echo -e "${RED}✗${NC} $name" return 1 fi } log "Running health checks..." ERRORS=0 STATUS="" # =========================================== # 1. CHECK DOCKER CONTAINERS # =========================================== echo "" echo "Container Status:" check_service "App (FastAPI)" "social-automation-app" || ((ERRORS++)) check_service "Worker (Celery)" "social-automation-worker" || ((ERRORS++)) check_service "Beat (Scheduler)" "social-automation-beat" || ((ERRORS++)) check_service "Database (PostgreSQL)" "social-automation-db" || ((ERRORS++)) check_service "Redis" "social-automation-redis" || ((ERRORS++)) check_service "Nginx" "social-automation-nginx" || ((ERRORS++)) # =========================================== # 2. CHECK API HEALTH # =========================================== echo "" echo "API Status:" HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$APP_URL/api/health" 2>/dev/null || echo "000") if [ "$HTTP_CODE" = "200" ]; then echo -e "${GREEN}✓${NC} API responding (HTTP $HTTP_CODE)" else echo -e "${RED}✗${NC} API not responding (HTTP $HTTP_CODE)" ((ERRORS++)) fi # =========================================== # 3. CHECK DATABASE CONNECTION # =========================================== echo "" echo "Database Status:" if docker exec social-automation-db pg_isready -U social_user -d social_automation > /dev/null 2>&1; then echo -e "${GREEN}✓${NC} PostgreSQL accepting connections" else echo -e "${RED}✗${NC} PostgreSQL not accepting connections" ((ERRORS++)) fi # =========================================== # 4. CHECK REDIS # =========================================== echo "" echo "Redis Status:" if docker exec social-automation-redis redis-cli ping 2>/dev/null | grep -q "PONG"; then echo -e "${GREEN}✓${NC} Redis responding" else echo -e "${RED}✗${NC} Redis not responding" ((ERRORS++)) fi # =========================================== # 5. CHECK DISK SPACE # =========================================== echo "" echo "System Resources:" DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%') if [ "$DISK_USAGE" -lt 90 ]; then echo -e "${GREEN}✓${NC} Disk usage: ${DISK_USAGE}%" else echo -e "${RED}✗${NC} Disk usage: ${DISK_USAGE}% (CRITICAL)" ((ERRORS++)) fi # Memory MEM_USAGE=$(free | awk 'NR==2 {printf "%.0f", $3/$2*100}') if [ "$MEM_USAGE" -lt 90 ]; then echo -e "${GREEN}✓${NC} Memory usage: ${MEM_USAGE}%" else echo -e "${YELLOW}!${NC} Memory usage: ${MEM_USAGE}% (HIGH)" fi # =========================================== # 6. SUMMARY & ALERTS # =========================================== echo "" echo "─────────────────────────────────────────" if [ $ERRORS -eq 0 ]; then echo -e "${GREEN}All systems operational${NC}" # Clear alert file if exists (system recovered) if [ -f "$ALERT_FILE" ]; then rm "$ALERT_FILE" send_telegram "✅ Social Media Automation - RECOVERED%0A%0AAll systems are back to normal." fi else echo -e "${RED}$ERRORS error(s) detected${NC}" # Send alert only if not already sent if [ ! -f "$ALERT_FILE" ]; then touch "$ALERT_FILE" send_telegram "🚨 Social Media Automation - ALERT%0A%0A$ERRORS service(s) are down!%0ACheck server immediately." fi fi echo "─────────────────────────────────────────" exit $ERRORS