Aller au contenu

Health Check Global

Le workflow Health Check Global surveille la santé des conteneurs Docker toutes les 5 minutes. Il détecte les conteneurs en état unhealthy ou arrêtés inopinément et notifie les admins via Telegram.

MéthodeOutilStatus
Docker ps filtréSSH + CLIActuel (production)
Prometheus cAdvisorcontainer_health_statusNon fonctionnel (Docker 29+)
HTTP endpointsCurl vers /healthzSpécifié, non implémenté
ServiceStackCritical
CaddysecurityOui
CrowdSecsecurityOui
N8Nn8nOui
N8N-Postgresn8nOui
Redisn8nOui
N8N Workersn8nNon
OdooodooOui
Odoo-PostgresodooOui
QdrantaiNon
Claude-OllamaaiNon
PrometheusmonitoringNon
GrafanamonitoringNon

ProblèmeSans health checkAvec health check
Container crashDécouvert par un utilisateurAlerte en 5 minutes
Service unhealthyPas de visibilitéDétection automatique
Downtime prolongéPas de notificationIntervention rapide
MéthodeAvantageInconvénient
SSH + docker psFonctionne toujoursPas d’historique Prometheus
cAdvisor metricsHistorique, graphesBug Docker 29+

No

Yes

Schedule · 5 min

SSH Docker Health · docker ps --filter

Parse Results

count > 0 ?

Skip

Prepare Notification

Notification Hub

Telegram

Un sub-workflow Docker Health Check with Retry (jDN2QV3nEMGacrCvgEBBV) wrap ce check avec une politique de retry (2 tentatives espacées de 30s) avant de notifier, ce qui filtre les faux positifs sur les containers en cours de redémarrage.

Fenêtre de terminal
docker ps -a \
--filter "health=unhealthy" \
--filter "status=exited" \
--format json

Cette commande retourne :

  • Les conteneurs avec healthcheck échoué (health=unhealthy)
  • Les conteneurs arrêtés inopinément (status=exited)

Node SSH Docker Health :

Type: SSH
Host: localhost
Command: docker ps -a --filter "health=unhealthy" --filter "status=exited" --format json

Parse Results (Code) :

const output = $json.stdout;
if (!output || output.trim() === '') {
return [{ json: { count: 0, containers: [] } }];
}
const containers = output.trim().split('\n')
.filter(line => line)
.map(line => JSON.parse(line))
.map(c => ({
name: c.Names,
status: c.State,
health: c.Status
}));
return [{
json: {
count: containers.length,
containers: containers
}
}];
{
"source": "health_check",
"type": "health_issue",
"severity": "critical",
"title": "2 container(s) en problème",
"message": "Containers détectés:\n- n8n-worker-1 (unhealthy)\n- redis (exited)",
"container": "n8n-worker-1",
"containers": ["n8n-worker-1", "redis"],
"timestamp": "2026-01-20T10:00:00.000Z"
}
🚨 HEALTH CHECK ALERT
2 container(s) en problème
Containers détectés:
❌ n8n-worker-1 (unhealthy)
❌ redis (exited)
Stack affecté: n8n-stack
[🔄 Restart] [📋 Logs] [🔇 Mute 1h]
Fenêtre de terminal
# Voir les conteneurs unhealthy
docker ps -a --filter "health=unhealthy"
# Voir les conteneurs arrêtés
docker ps -a --filter "status=exited"
# Health d'un conteneur spécifique
docker inspect --format='{{.State.Health.Status}}' n8n
# Logs des health checks Docker
docker inspect --format='{{range .State.Health.Log}}{{.Output}}{{end}}' n8n

LimiteImpactMitigation
Pas d’HTTP checksDétecte état Docker, pas applicatifPrévu en évolution
Pas de rapport quotidienPas de vue historiqueDashboard Grafana
5min intervalleLatence détection max 5minAcceptable pour usage perso

Si besoin de HTTP checks :

  • Ajouter des checks curl vers /healthz de chaque service
  • Différencier Docker healthy vs HTTP répondant
  • Alertes plus précises

Si besoin de rapport quotidien :

  • Agréger les incidents sur 24h
  • Calculer uptime par service
  • Envoyer digest à 8h

Si cAdvisor redevient fonctionnel :

  • Migrer vers métriques Prometheus
  • Supprimer le check SSH
  • Historique et graphes natifs
ProblèmeVérification
Faux positifsConteneurs sans healthcheck retournent “none”
SSH timeoutCredential SSH valide ? Port 22 accessible ?
Pas de notificationWorkflow actif ? Notification Hub ok ?
Trop d’alertesAjuster les filtres dans docker ps