Files
homelab-scripts/docker-health-check.sh
perco d6cd86c1d2 fix: surveillance étendue aux montages mergerfs + format des messages
Le crash mergerfs du 07/09 (2x en 24h) n'était pas détecté par la
version précédente : un container peut rester "Up" tout en ayant un
montage cassé en dessous (FUSE mort silencieusement). Ajout d'une
vérification directe des points de montage /mnt/serveurPlex et
/mnt/serveurNAS.

Corrigé aussi un bug d'affichage : les \n dans le message Discord
restaient en texte littéral au lieu de vrais retours à la ligne
(bash n'interprète pas \n dans une chaîne "..." classique).
2026-09-07 22:00:29 +02:00

52 lines
2.1 KiB
Bash
Executable File

#!/bin/bash
# Vérifie l'état de tous les containers Docker et alerte sur Discord (salon homelab)
# si un container censé tourner (restart policy unless-stopped/always) est arrêté
# de façon anormale (code de sortie non-nul) ou en boucle de redémarrage.
set -uo pipefail
WEBHOOK_URL="https://discord.com/api/webhooks/1466011674371821599/KPvSSS53ot4cjICfDjJcn8s0So-oQaxBui4vpciyIz4e_yL3Fm6-7GQqeTaT3G6TLQmc"
problems=()
# Vérification des points de montage critiques (mergerfs) : un container peut
# rester "Up" tout en ayant un montage cassé en dessous (FUSE mort), donc la
# vérification de l'état des containers seule ne suffit pas.
for mount_point in /mnt/serveurPlex /mnt/serveurNAS; do
if ! timeout 5 stat "$mount_point" > /dev/null 2>&1; then
problems+=("🔴 **$mount_point** inaccessible (montage cassé, transport endpoint not connected ?)")
fi
done
while IFS='|' read -r name state status; do
if [ "$state" = "restarting" ]; then
problems+=("🔴 **$name** en boucle de redémarrage ($status)")
continue
fi
if [ "$state" = "exited" ] || [ "$state" = "dead" ]; then
exit_code=$(docker inspect --format '{{.State.ExitCode}}' "$name" 2>/dev/null)
restart_policy=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$name" 2>/dev/null)
if [ "$exit_code" != "0" ] && { [ "$restart_policy" = "unless-stopped" ] || [ "$restart_policy" = "always" ]; }; then
problems+=("🔴 **$name** arrêté anormalement (code $exit_code, $status)")
fi
fi
done < <(docker ps -a --format '{{.Names}}|{{.State}}|{{.Status}}')
if [ ${#problems[@]} -eq 0 ]; then
echo "OK - tous les containers vont bien"
exit 0
fi
message=$'⚠️ **Alerte homelab** ('"${#problems[@]}"$' problème(s))\n'
for p in "${problems[@]}"; do
message+="$p"$'\n'
done
json_payload=$(python3 -c "import json,sys; print(json.dumps({'content': sys.argv[1]}))" "$message")
curl -s -X POST "$WEBHOOK_URL" -H "Content-Type: application/json" -d "$json_payload" > /dev/null
echo "Alerte envoyée : ${#problems[@]} problème(s)"