e8d9b1fd42
Add complete token system with Plex/Tautulli/Overseer integration: - Anchor program for SPL token mint/burn/transfer - Express backend with OAuth, webhooks, Solana integration - Next.js frontend with dashboard, admin panel, wallet management - Docker deployment for 172.20.1.0/24 infrastructure - Production configs with SSL, Nginx, health monitoring Tautulli webhooks auto-mint on watch events. Overseer integration burns for content requests.
229 lines
5.9 KiB
Bash
Executable File
229 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ==========================================
|
|
# CoopCredits Health Check Script
|
|
# Monitors all services in the infrastructure
|
|
# ==========================================
|
|
|
|
set -e
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# Configuration
|
|
PLEX_IP="172.20.1.220"
|
|
OVERSEER_IP="172.20.1.225"
|
|
TAUTULLI_IP="172.20.1.255"
|
|
|
|
PLEX_PORT="32400"
|
|
OVERSEER_PORT="5055"
|
|
TAUTULLI_PORT="8181"
|
|
|
|
# Track overall health
|
|
HEALTHY=0
|
|
UNHEALTHY=0
|
|
|
|
print_header() {
|
|
echo ""
|
|
echo "🏥 CoopCredits Health Check"
|
|
echo "=========================="
|
|
echo "$(date)"
|
|
echo ""
|
|
}
|
|
|
|
check_service() {
|
|
local name=$1
|
|
local url=$2
|
|
local expected_code=${3:-200}
|
|
|
|
echo -n "Checking $name... "
|
|
|
|
if curl -sf -o /dev/null -w "%{http_code}" "$url" 2>/dev/null | grep -q "$expected_code"; then
|
|
echo -e "${GREEN}✅ OK${NC}"
|
|
((HEALTHY++))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ FAIL${NC}"
|
|
((UNHEALTHY++))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_docker_service() {
|
|
local name=$1
|
|
local container=$2
|
|
|
|
echo -n "Checking Docker container: $name... "
|
|
|
|
if docker ps --format "{{.Names}}" | grep -q "^${container}$"; then
|
|
local status=$(docker inspect --format='{{.State.Status}}' "$container" 2>/dev/null)
|
|
if [ "$status" = "running" ]; then
|
|
echo -e "${GREEN}✅ Running${NC}"
|
|
((HEALTHY++))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ Not running (status: $status)${NC}"
|
|
((UNHEALTHY++))
|
|
return 1
|
|
fi
|
|
else
|
|
echo -e "${RED}❌ Not found${NC}"
|
|
((UNHEALTHY++))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_network_connectivity() {
|
|
local name=$1
|
|
local ip=$2
|
|
local port=$3
|
|
|
|
echo -n "Network connectivity to $name ($ip:$port)... "
|
|
|
|
if timeout 5 bash -c "</dev/tcp/$ip/$port" 2>/dev/null; then
|
|
echo -e "${GREEN}✅ Reachable${NC}"
|
|
((HEALTHY++))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ Unreachable${NC}"
|
|
((UNHEALTHY++))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_disk_space() {
|
|
echo ""
|
|
echo "📊 Disk Space"
|
|
echo "-------------"
|
|
|
|
df -h / | awk 'NR==2 {printf "Root: %s used of %s (%s)\n", $3, $2, $5}'
|
|
|
|
local usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
|
if [ "$usage" -gt 90 ]; then
|
|
echo -e "${RED}⚠️ Critical disk usage!${NC}"
|
|
((UNHEALTHY++))
|
|
elif [ "$usage" -gt 80 ]; then
|
|
echo -e "${YELLOW}⚠️ High disk usage${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ Disk usage OK${NC}"
|
|
((HEALTHY++))
|
|
fi
|
|
}
|
|
|
|
check_memory() {
|
|
echo ""
|
|
echo "🧠 Memory Usage"
|
|
echo "--------------"
|
|
|
|
if command -v free >/dev/null 2>&1; then
|
|
free -h | grep "Mem:" | awk '{printf "Used: %s / %s\n", $3, $2}'
|
|
|
|
local usage=$(free | grep "Mem:" | awk '{printf "%.0f", $3/$2 * 100}')
|
|
if [ "$usage" -gt 90 ]; then
|
|
echo -e "${RED}⚠️ Critical memory usage!${NC}"
|
|
((UNHEALTHY++))
|
|
elif [ "$usage" -gt 80 ]; then
|
|
echo -e "${YELLOW}⚠️ High memory usage${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ Memory usage OK${NC}"
|
|
((HEALTHY++))
|
|
fi
|
|
else
|
|
echo "Memory check not available"
|
|
fi
|
|
}
|
|
|
|
check_ssl_certificate() {
|
|
echo ""
|
|
echo "🔒 SSL Certificate"
|
|
echo "------------------"
|
|
|
|
local domain="coop.hobokenchicken.com"
|
|
local expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
|
|
|
|
if [ -n "$expiry" ]; then
|
|
local expiry_epoch=$(date -d "$expiry" +%s 2>/dev/null || date -j -f "%b %d %H:%M:%S %Y %Z" "$expiry" +%s)
|
|
local now_epoch=$(date +%s)
|
|
local days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
|
|
|
|
echo "Certificate expires: $expiry ($days_left days)"
|
|
|
|
if [ "$days_left" -lt 7 ]; then
|
|
echo -e "${RED}⚠️ Certificate expires soon!${NC}"
|
|
((UNHEALTHY++))
|
|
elif [ "$days_left" -lt 30 ]; then
|
|
echo -e "${YELLOW}⚠️ Certificate expires in $days_left days${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ Certificate valid${NC}"
|
|
((HEALTHY++))
|
|
fi
|
|
else
|
|
echo -e "${YELLOW}⚠️ Could not check certificate${NC}"
|
|
fi
|
|
}
|
|
|
|
run_checks() {
|
|
print_header
|
|
|
|
# Docker Services
|
|
echo "🐳 Docker Services"
|
|
echo "------------------"
|
|
check_docker_service "Nginx" "coop-nginx"
|
|
check_docker_service "Frontend" "coop-frontend"
|
|
check_docker_service "Backend" "coop-backend"
|
|
check_docker_service "PostgreSQL" "coop-postgres"
|
|
check_docker_service "Redis" "coop-redis"
|
|
|
|
# Network Connectivity
|
|
echo ""
|
|
echo "🌐 Network Connectivity"
|
|
echo "-----------------------"
|
|
check_network_connectivity "Plex" "$PLEX_IP" "$PLEX_PORT"
|
|
check_network_connectivity "Tautulli" "$TAUTULLI_IP" "$TAUTULLI_PORT"
|
|
check_network_connectivity "Overseer" "$OVERSEER_IP" "$OVERSEER_PORT"
|
|
|
|
# External Services
|
|
echo ""
|
|
echo "🔗 External Services"
|
|
echo "--------------------"
|
|
check_service "CoopCredits Website" "https://coop.hobokenchicken.com/health"
|
|
check_service "Backend API" "https://coop.hobokenchicken.com/api/health"
|
|
|
|
# System Resources
|
|
check_disk_space
|
|
check_memory
|
|
|
|
# SSL
|
|
check_ssl_certificate
|
|
|
|
# Summary
|
|
echo ""
|
|
echo "📋 Summary"
|
|
echo "----------"
|
|
echo -e "${GREEN}✅ $HEALTHY healthy${NC}"
|
|
if [ $UNHEALTHY -gt 0 ]; then
|
|
echo -e "${RED}❌ $UNHEALTHY unhealthy${NC}"
|
|
exit 1
|
|
else
|
|
echo -e "${GREEN}All systems operational!${NC}"
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
# Run in watch mode if requested
|
|
if [ "$1" == "--watch" ]; then
|
|
while true; do
|
|
clear
|
|
run_checks
|
|
echo ""
|
|
echo "Refreshing in 30 seconds... (Ctrl+C to stop)"
|
|
sleep 30
|
|
done
|
|
else
|
|
run_checks
|
|
fi
|