diff --git a/ops/README.md b/ops/README.md index eda26aa..f0ef587 100644 --- a/ops/README.md +++ b/ops/README.md @@ -1,6 +1,6 @@ # Supervision des applications -Le script `healthcheck-apps.sh` est exécuté par le timer systemd toutes les cinq minutes et trois minutes après chaque démarrage serveur. Il vérifie les conteneurs Docker Compose, leur healthcheck, leur politique de redémarrage et les routes HTTPS Traefik déclarées. En cas d’anomalie, il produit un rapport et une entrée de journal, **sans redémarrer de conteneur**. Les redémarrages automatiques restent assurés par les politiques Docker `restart` et par `manus-apps.service` au démarrage du serveur. +Le script `healthcheck-apps.sh` est exécuté par le timer systemd toutes les cinq minutes et trois minutes après chaque démarrage serveur. Il vérifie les conteneurs Docker Compose, leur healthcheck, leur politique de redémarrage et les routes HTTPS Traefik déclarées. Une tâche ponctuelle terminée avec succès est reconnue comme telle. Toute réponse HTTP inférieure à 500 confirme la joignabilité d’une route, y compris une API sans page racine ou un tableau protégé. En cas d’anomalie, il produit un rapport et une entrée de journal, **sans redémarrer de conteneur**. Les redémarrages automatiques restent assurés par les politiques Docker `restart` et par `manus-apps.service` au démarrage du serveur. Le dernier rapport est écrit dans `/var/lib/manus-apps-health/latest.txt`. Les anomalies sont aussi consignées dans le journal système avec le tag `manus-apps-health`. diff --git a/ops/healthcheck-apps.sh b/ops/healthcheck-apps.sh index df23c87..6e9cfbc 100644 --- a/ops/healthcheck-apps.sh +++ b/ops/healthcheck-apps.sh @@ -30,7 +30,9 @@ mark_failure() { } is_healthy_http_status() { - [[ "$1" =~ ^2[0-9][0-9]$ || "$1" =~ ^3[0-9][0-9]$ ]] + # Toute réponse HTTP (< 500) confirme que Traefik et le service restent joignables. + # Les 401/404 sont légitimes pour les tableaux protégés ou API sans page racine. + [[ "$1" =~ ^[1-4][0-9][0-9]$ ]] } check_http_route() { @@ -60,7 +62,7 @@ check_http_route() { } check_containers() { - local container_id name project workdir config_files status health restart_policy + local container_id name project workdir config_files status health restart_policy exit_code mapfile -t container_ids < <(docker ps -aq --filter label=com.docker.compose.project) if [[ "${#container_ids[@]}" -eq 0 ]]; then @@ -76,8 +78,13 @@ check_containers() { status="$(docker inspect -f '{{.State.Status}}' "$container_id")" health="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$container_id")" restart_policy="$(docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' "$container_id")" + exit_code="$(docker inspect -f '{{.State.ExitCode}}' "$container_id")" if [[ "$status" != "running" ]]; then + if [[ "$status" == "exited" && "$exit_code" == "0" ]]; then + log_line "INFO" "${project}/${name}: tâche ponctuelle terminée" + continue + fi mark_failure "${project}/${name}: état Docker ${status}" continue fi