Faire un état des lieux rapide

Quand un problème est signalé (portail inaccessible, sessions qui échouent, alertes multiples), cette page permet de dresser en quelques minutes un état des lieux de la plateforme et d’identifier le composant en cause. Suivez ensuite la fiche correspondante de Diagnostic en cas d’alerte.

Script d’état des lieux

Le script suivant résume l’état d’un cluster : nœuds, services incomplets, mises à jour en échec, tâches uniques en erreur, conteneurs unhealthy, ressources du nœud, Vault et ports en écoute. Lancez-le en root sur un manager de chaque cluster concerné. Chaque ligne en défaut commence par [KO].

#!/bin/bash
# reemo_etat_des_lieux [PREFIXE]  (PREFIXE = INSTANCE_NAME suivi de _, par defaut reemo_)
P="${1:-reemo_}"
ko=0
say() { echo "  $*"; case "$*" in "[KO]"*) ko=$((ko + 1));; esac; }

echo "== $(hostname) - $(date '+%F %T')"

echo "== Noeuds Swarm"
if nodes=$(docker node ls --format '{{.Hostname}} {{.Status}} {{.Availability}} {{.ManagerStatus}}' 2>&1); then
  while read -r h s a m; do
    if [ "$s" = "Ready" ] && [ "$a" = "Active" ] && [ "$m" != "Unreachable" ]; then
      say "[OK] $h $s $a $m"
    else
      say "[KO] $h $s $a $m"
    fi
  done <<< "$nodes"
else
  say "[KO] docker node ls : $nodes (lancez le script sur un manager)"
fi

echo "== Services"
while read -r n r _; do
  [[ "$n" == "$P"* || "$n" == "traefik" ]] || continue
  [[ "$n" =~ _mysqlbackup$ ]] && continue
  c=$(docker service inspect "$n" --format '{{.Spec.TaskTemplate.RestartPolicy.Condition}}')
  if [ "$c" = "none" ]; then
    st=$(docker service ps "$n" --format '{{.CurrentState}}' | head -1)
    case "$st" in Complete*|Running*) ;; *) say "[KO] $n tache unique : $st";; esac
    continue
  fi
  [ "${r%%/*}" != "${r#*/}" ] && say "[KO] $n replicas $r"
  u=$(docker service inspect "$n" --format '{{if .UpdateStatus}}{{.UpdateStatus.State}}{{end}}')
  case "$u" in paused|rollback_*) say "[KO] $n mise a jour : $u";; esac
done < <(docker service ls --format '{{.Name}} {{.Replicas}}')

echo "== Conteneurs unhealthy (noeud local)"
while read -r line; do [ -n "$line" ] && say "[KO] $line"; done \
  < <(docker ps --filter health=unhealthy --format '{{.Names}} {{.Status}}')

echo "== Ressources (noeud local)"
while read -r fs size used avail pct mnt; do
  if [ "${pct%\%}" -ge 90 ]; then say "[KO] disque $mnt $pct"; else say "[OK] disque $mnt $pct"; fi
done < <(df -hP / /var/lib/docker /opt 2>/dev/null | awk 'NR > 1' | sort -u -k6)
free -m | awk '/^Mem:/ {printf "  [info] memoire disponible : %d Mo / %d Mo\n", $7, $2}'
oom=$(dmesg -T 2>/dev/null | grep -ci 'killed process')
[ "${oom:-0}" -gt 0 ] && say "[KO] $oom processus tues par le noyau (OOM), voir dmesg -T"

echo "== Vault (replicas locales)"
for c in $(docker ps --format '{{.ID}}:{{.Names}}' | grep -E ":${P}vault[0-9]+\."); do
  docker exec "${c%%:*}" bao status >/dev/null 2>&1
  case $? in
    0) say "[OK] ${c#*:} deverrouille";;
    2) say "[KO] ${c#*:} SEALED";;
    *) say "[KO] ${c#*:} erreur bao status";;
  esac
done

echo "== Ports en ecoute (noeud local)"
ss -lntuH 2>/dev/null | awk '{print $1" "$5}' \
  | grep -E ':(80|443|8443|8444|8445|8446|58200)$' | sort -u | sed 's/^/  [info] /'

echo "== Resultat : $ko point(s) en defaut"
[ "$ko" -eq 0 ]

Parcours selon le type d’installation

  1. Depuis le serveur de supervision, interrogez le healthcheck du portail et affichez uniquement les composants en défaut :

    curl -s https://portail.example.com/api/healthcheck \
      | jq '.. | objects | select(.status? and .status != "OK")'
    

    Aucune sortie : tous les composants répondent. Sinon, le composant en défaut est indiqué (api, db, provision-api, ws-relays, signal…).

  2. Sur un manager infra_manager, lancez reemo_etat_des_lieux.

  3. Si un nœud est en défaut, lancez aussi le script sur ce nœud (disque, conteneurs unhealthy et Vault sont contrôlés localement).

  4. Contrôlez les points d’entrée depuis l’extérieur :

    for p in 443 8443; do nc -vz -w 3 portail.example.com $p; done
    
  5. Si des sessions Reemo Containers ou WebSocket échouent, lancez aussi le script sur les clusters provisionN_manager et relayws_manager.

Lire le résultat

Constat

Fiche à suivre

Nœud [KO] (Down, Unreachable)

Alerte : nœud Swarm KO

Service [KO] replicas x/y

Alerte : service Swarm incomplet (réplicas x/y)

[KO] mise a jour : paused / rollback_...

Alerte : mise à jour en échec (paused / rollback)

[KO] ... tache unique : Failed (_db, _logapidb)

Alerte : service Swarm incomplet (réplicas x/y)

Conteneur unhealthy

Alerte : service Swarm incomplet (réplicas x/y), puis la fiche du service concerné

Disque [KO] ou processus tués (OOM)

Alerte : disque plein

Vault SEALED

Alerte : Vault sealed

Port attendu absent de la liste en écoute

Alerte : traefik KO (ports 80/443/84xx) ou Alerte : TURN KO (58200)

Healthcheck : api ou db en défaut

Alerte : API (architecture séparée), Alerte : base de données MariaDB ou Alerte : NDB Cluster

Healthcheck : ws-relays / provision-relay-api en défaut

Alerte : relayws / provisionnement (nginx mTLS) KO

Healthcheck : signal en défaut

Alerte : signal KO

Tout est [OK] mais le portail ne répond pas depuis l’extérieur

Alerte : certificat HTTPS proche de l’expiration ou invalide et Alerte : healthcheck portail / portail d’administration KO (certificat, filtrage IP, DNS)