Files
server/root/monitoring/host-health.sh
2025-12-23 10:16:38 +00:00

94 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# ==== KONFIG ====
PUSH_URL="http://127.0.0.1:3001/api/push/O2EhJUkH4n"
LOG_FILE="/var/log/host-health.log"
CURL="/usr/bin/curl"
SYSTEMCTL="/bin/systemctl"
DATESTAMP="$(date -Is)"
# Warn- und Kritisch-Schwellen
CPU_WARN=5.0 # Load > 5 Warnung
CPU_CRIT=10.0 # Load > 10 kritisch
RAM_WARN=85 # >85% RAM Warnung
RAM_CRIT=95 # >95% RAM kritisch
DISK_WARN=80 # >80% Disk Warnung
DISK_CRIT=95 # >95% Disk kritisch
# ==== MESSWERTE ====
CPU_LOAD="$(awk '{print $1}' /proc/loadavg)"
RAM_PCT="$(free | awk '/Mem:/ {printf "%.0f", ($3/$2)*100}')"
DISK_PCT="$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}')"
# Ping zur Default-Gateway oder extern (hier Google DNS)
PING_MS="$(ping -c1 -W1 8.8.8.8 | awk -F'time=' '/time=/{print $2}' | cut -d' ' -f1 || echo "NaN")"
# Dienste-Status
svc_ok () { $SYSTEMCTL is-active --quiet "$1" && echo OK || echo FAIL; }
NGINX_STATUS="$(svc_ok nginx)"
DOCKER_STATUS="$(svc_ok docker)"
WG_STATUS="$(svc_ok wg-quick@wg0)"
PVEVM_STATUS="$(svc_ok proxmox-vm)"
# ==== STATUS LOGIK ====
STATUS="up"
MSG=""
# CPU Check
if (( $(echo "$CPU_LOAD > $CPU_CRIT" | bc -l) )); then
STATUS="down"; MSG+="CPU:CRIT(${CPU_LOAD}) "
elif (( $(echo "$CPU_LOAD > $CPU_WARN" | bc -l) )); then
MSG+="CPU:WARN(${CPU_LOAD}) "
else
MSG+="CPU:${CPU_LOAD} "
fi
# RAM Check
if [ "$RAM_PCT" -ge "$RAM_CRIT" ]; then
STATUS="down"; MSG+="RAM:CRIT(${RAM_PCT}%) "
elif [ "$RAM_PCT" -ge "$RAM_WARN" ]; then
MSG+="RAM:WARN(${RAM_PCT}%) "
else
MSG+="RAM:${RAM_PCT}% "
fi
# Disk Check
if [ "$DISK_PCT" -ge "$DISK_CRIT" ]; then
STATUS="down"; MSG+="DISK:CRIT(${DISK_PCT}%) "
elif [ "$DISK_PCT" -ge "$DISK_WARN" ]; then
MSG+="DISK:WARN(${DISK_PCT}%) "
else
MSG+="DISK:${DISK_PCT}% "
fi
# Dienste Check
for svc in NGINX:$NGINX_STATUS DOCKER:$DOCKER_STATUS WG:$WG_STATUS PVEVM:$PVEVM_STATUS; do
name="${svc%%:*}"; val="${svc##*:}"
if [ "$val" != "OK" ]; then
STATUS="down"; MSG+="$name:FAIL "
else
MSG+="$name:OK "
fi
done
# Ping (nur Info)
MSG+="PING:${PING_MS}ms"
# ==== PUSH ====
HTTP_CODE="$($CURL -sS -o /tmp/kuma_push.out -w "%{http_code}" \
--get \
--data-urlencode "status=${STATUS}" \
--data-urlencode "msg=${MSG}" \
--data-urlencode "ping=${PING_MS}" \
"${PUSH_URL}")" || true
# Logging
echo "${DATESTAMP} status=${STATUS} msg='${MSG}' http=${HTTP_CODE}" >> "$LOG_FILE"
if [[ "$HTTP_CODE" != "200" ]]; then
echo "${DATESTAMP} ERROR: Kuma Push HTTP ${HTTP_CODE}" >> "$LOG_FILE"
exit 1
fi