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¶
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…).Sur un manager
infra_manager, lancezreemo_etat_des_lieux.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).
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
Si des sessions Reemo Containers ou WebSocket échouent, lancez aussi le script sur les clusters
provisionN_manageretrelayws_manager.
Depuis le serveur de supervision, interrogez le healthcheck du portail : il indique si le problème vient du portail ou de l’API.
curl -s https://portail.example.com/api/healthcheck \ | jq '.. | objects | select(.status? and .status != "OK")'
Pas de réponse du tout : commencez par
portal_manager. Composantapioudben défaut : commencez parapi_manager.Sur un manager
portal_manager: lancezreemo_etat_des_lieux, puis testez le flux vers l’API :nc -vz -w 3 <API_IP> 443 curl -sk -o /dev/null https://<API_IP>/ # attendu : erreur "certificate required"
Sur un manager
api_manager: lancezreemo_etat_des_lieux(services API, base de données, Vault).Sur
turn_manager(si les sessions WebRTC échouent) : lancezreemo_etat_des_lieux, puis testez le port TURN depuis l’extérieur :nc -vz -w 3 <TURN1_IP> 58200
Sur
relayws_manager/provisionN_manager(si les sessions WebSocket ou Reemo Containers échouent) : lancezreemo_etat_des_lieux, puissystemctl status nginx.
Lire le résultat¶
Constat |
Fiche à suivre |
|---|---|
Nœud |
|
Service |
|
|
|
|
|
Conteneur unhealthy |
Alerte : service Swarm incomplet (réplicas x/y), puis la fiche du service concerné |
Disque |
|
Vault |
|
Port attendu absent de la liste en écoute |
Alerte : traefik KO (ports 80/443/84xx) ou Alerte : TURN KO (58200) |
Healthcheck : |
Alerte : API (architecture séparée), Alerte : base de données MariaDB ou Alerte : NDB Cluster |
Healthcheck : |
|
Healthcheck : |
|
Tout est |
Alerte : certificat HTTPS proche de l’expiration ou invalide et Alerte : healthcheck portail / portail d’administration KO (certificat, filtrage IP, DNS) |