From ad43042849f5d297dc17086984bbbd13d7a4bf3f Mon Sep 17 00:00:00 2001 From: perco Date: Mon, 7 Sep 2026 21:48:00 +0200 Subject: [PATCH] feat: surveillance automatique des containers Docker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vérifie toutes les 15 min (via CronHub) l'état de tous les containers et alerte sur Discord (salon homelab) si un container plante ou boucle en redémarrage. Exclut automatiquement les arrêts volontaires (exit code 0) pour ne pas spammer sur les containers intentionnellement coupés (ex: iptv-viewer, camwatch). --- docker-health-check.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 docker-health-check.sh diff --git a/docker-health-check.sh b/docker-health-check.sh new file mode 100755 index 0000000..2aec1fa --- /dev/null +++ b/docker-health-check.sh @@ -0,0 +1,42 @@ +#!/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=() + +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 containers Docker** (${#problems[@]})\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)"