#!/usr/bin/env bash # # ARGUS health check — reports the status of every component. # # cd ~/argus && ./healthcheck.sh # set -euo pipefail INSTALL_DIR="${ARGUS_INSTALL_DIR:-$HOME/argus}" bold() { printf '\033[1m%s\033[0m\n' "$1"; } ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } bad() { printf ' \033[31m✗\033[0m %s\n' "$1"; } fail() { printf ' \033[31m✗\033[0m %s\n' "$1" >&2; exit 1; } [ -f "$INSTALL_DIR/docker-compose.yml" ] || fail "No ARGUS installation found at $INSTALL_DIR (set ARGUS_INSTALL_DIR if you installed elsewhere)." cd "$INSTALL_DIR" bold "ARGUS Health Check" echo EXIT_CODE=0 bold "Containers" for svc in db valkey docker-socket-proxy api ui nginx; do STATE="$(docker compose ps --format json "$svc" 2>/dev/null | grep -oP '"State"\s*:\s*"\K[^"]+' || echo "")" HEALTH="$(docker compose ps --format json "$svc" 2>/dev/null | grep -oP '"Health"\s*:\s*"\K[^"]+' || echo "")" if [ "$STATE" = "running" ] && { [ -z "$HEALTH" ] || [ "$HEALTH" = "healthy" ]; }; then ok "$svc — running${HEALTH:+ ($HEALTH)}" elif [ -z "$STATE" ]; then bad "$svc — not found" EXIT_CODE=1 else bad "$svc — $STATE${HEALTH:+ ($HEALTH)}" EXIT_CODE=1 fi done echo bold "API" API_HOST_PORT="$(grep -oP '^API_HOST_PORT=\K.*' .env 2>/dev/null || true)" API_HOST_PORT="${API_HOST_PORT:-9080}" HEALTH_JSON="$(curl -fsS "http://127.0.0.1:${API_HOST_PORT}/health" 2>/dev/null || true)" if [ -n "$HEALTH_JSON" ]; then VERSION="$(printf '%s' "$HEALTH_JSON" | grep -oP '"version"\s*:\s*"\K[^"]+' || echo "?")" DB_STATUS="$(printf '%s' "$HEALTH_JSON" | grep -oP '"database"\s*:\s*"\K[^"]+' || echo "?")" CACHE_STATUS="$(printf '%s' "$HEALTH_JSON" | grep -oP '"cache"\s*:\s*"\K[^"]+' || echo "?")" ok "API reachable — version ${VERSION}, database: ${DB_STATUS}, cache: ${CACHE_STATUS}" else bad "API not reachable on http://127.0.0.1:${API_HOST_PORT}/health" EXIT_CODE=1 fi echo UI_PORT="$(grep -oP '^UI_PORT=\K.*' .env 2>/dev/null || true)" UI_PORT="${UI_PORT:-81}" bold "Admin panel" if curl -fsSk -o /dev/null "https://127.0.0.1:${UI_PORT}" 2>/dev/null; then ok "Reachable at https://localhost:${UI_PORT}" else bad "Not reachable at https://localhost:${UI_PORT}" EXIT_CODE=1 fi echo if [ "$EXIT_CODE" = 0 ]; then bold "All checks passed." else bold "One or more checks failed — see above. 'docker compose logs ' for details." fi exit "$EXIT_CODE"