Edit: /opt/canhelp/scripts/health-check.sh (2805B)
#!/usr/bin/env bash
# =============================================================================
# health-check.sh — проверка состояния всех сервисов
# Использование: scripts/health-check.sh
# =============================================================================
set -euo pipefail
API_URL="${API_URL:-http://localhost:4000}"
WEB_URL="${WEB_URL:-http://localhost:3000}"
OK=0
FAIL=0
green() { echo -e "\033[32m✓\033[0m $*"; }
red() { echo -e "\033[31m✗\033[0m $*"; FAIL=$((FAIL+1)); }
check_http() {
local name="$1" url="$2"
local code
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$url" 2>/dev/null || echo "000")
if [[ "$code" =~ ^(200|301|302|304)$ ]]; then
green "$name ($url) — HTTP $code"
OK=$((OK+1))
else
red "$name ($url) — HTTP $code"
fi
}
echo "══════════════════════════════════════════"
echo " CanHelp — Health Check $(date '+%H:%M:%S')"
echo "══════════════════════════════════════════"
echo ""
echo "── PM2 ──────────────────────────────────"
if command -v pm2 &>/dev/null; then
pm2 list --no-color 2>/dev/null | grep -E "canhelp|online|stopped|errored" || true
else
red "pm2 не найден"
fi
echo ""
echo "── Docker ───────────────────────────────"
if command -v docker &>/dev/null; then
docker compose -f /opt/canhelp/docker-compose.yml ps 2>/dev/null || red "docker compose недоступен"
else
red "docker не найден"
fi
echo ""
echo "── HTTP endpoints ───────────────────────"
check_http "API health" "$API_URL/api/health"
check_http "Web (Next.js)" "$WEB_URL"
echo ""
echo "── Disk ─────────────────────────────────"
df -h /opt/canhelp 2>/dev/null || df -h /
echo ""
echo "── Memory ───────────────────────────────"
free -h
echo ""
echo "══════════════════════════════════════════"
if [[ $FAIL -eq 0 ]]; then
echo -e " \033[32mВсё в порядке ($OK проверок пройдено)\033[0m"
else
echo -e " \033[31mПРОБЛЕМЫ: $FAIL из $((OK+FAIL)) проверок не пройдено\033[0m"
exit 1
fi
echo "══════════════════════════════════════════"