README reduit au role du projet et au demarrage rapide. docs/architecture.md (schemas Mermaid), docs/setup.md, docs/usage.md (154 cibles en 13 familles), docs/README.md (index). Documents ranges en conception/, exploitation/, hebergement/, projet/ ; 598 chemins suivis. QUICKSTART.md, SOLUTION.md, architecture-set-ops.md et la carte fondus puis retires. Preuves : P48 lit l'index et conception/mecanismes.md ; les gardes parcourent docs/ sous- dossiers compris (_documents) ; usage.md suit le Makefile dans les deux sens. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
2.9 KiB
Django/Jinja
56 lines
2.9 KiB
Django/Jinja
#jinja2: comment_start_string:'{=#', comment_end_string:'#=}'
|
|
#!/bin/bash
|
|
# GENERE par Set-OPS (role serveur_nginx). Ne pas editer a la main.
|
|
#
|
|
# SONDE « edge » — l'edge ecoute, sa configuration tient, et ce qu'il publie REPOND
|
|
#
|
|
# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
|
|
# Mise en defaut PAR PARAMETRE : `serveur_nginx_sonde_ports` (port qui n'ecoute pas).
|
|
set -uo pipefail
|
|
|
|
PORTS="{{ serveur_nginx_sonde_ports }}"
|
|
|
|
systemctl is-active --quiet nginx || { echo "L'edge (nginx) n'est pas actif."; exit 2; }
|
|
|
|
# LA CONFIGURATION SUR DISQUE, PAS SEULEMENT CELLE EN MEMOIRE. nginx garde la derniere
|
|
# configuration VALIDE et continue de servir ; une configuration cassee ne se voit qu'au
|
|
# prochain redemarrage — c'est-a-dire au pire moment, souvent des mois plus tard.
|
|
nginx -t >/dev/null 2>&1 \
|
|
|| { echo "L'edge sert, mais sa configuration sur disque est INVALIDE : le prochain demarrage echouera."; exit 2; }
|
|
|
|
manquants=()
|
|
for p in ${PORTS}; do
|
|
ss -ltn 2>/dev/null | grep -qE "[:.]${p}[[:space:]]" || manquants+=("${p}")
|
|
done
|
|
if (( ${#manquants[@]} > 0 )); then
|
|
echo "L'edge n'ecoute pas sur : ${manquants[*]} — ce qui est publie derriere est injoignable."
|
|
exit 2
|
|
fi
|
|
|
|
# CE QUI EST PUBLIE REPOND-IL ? (2026-09-28) Ecouter n'est pas servir : un service publie
|
|
# dont l'amont est tombe rend 502, et l'edge reste « valide, a l'ecoute ». On interroge chaque
|
|
# exposition EN LOCAL — son nom et son SNI, vers 127.0.0.1 — : on teste ce que l'EDGE sert,
|
|
# sans dependre de la resolution de qui que ce soit. `-k` : le certificat est l'affaire de la
|
|
# sonde `certificat` ; ici, la question est la reponse. Une redirection (302 vers la
|
|
# connexion) est une reponse saine ; un 5xx ou un silence ne l'est pas.
|
|
{=# LE MEME FILTRE QUE LES VHOSTS (`expositions.conf.j2`) : un hote connu, une adresse, un
|
|
port. Une exposition sans port web (`dns`, `pki`, `sauvegarde` au site) n'a pas de vhost :
|
|
l'attendre ici faisait crier la sonde pour trois noms que l'edge ne publie pas. #=}
|
|
{% set publiees = [] %}
|
|
{% for expo in serveur_nginx_expositions | default([]) %}
|
|
{% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %}
|
|
{% set _ = publiees.append(expo.fqdn) %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
EXPOSITIONS="{{ publiees | unique | sort | join(' ') }}"
|
|
en_defaut=(); servies=0
|
|
for n in ${EXPOSITIONS}; do
|
|
code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 8 --resolve "${n}:443:127.0.0.1" "https://${n}/" 2>/dev/null)
|
|
if [[ "${code}" =~ ^[234][0-9][0-9]$ ]]; then servies=$((servies + 1)); else en_defaut+=("${n}=${code:-000}"); fi
|
|
done
|
|
perf="| expositions=${servies};;;0; en_defaut=${#en_defaut[@]}"
|
|
if (( ${#en_defaut[@]} > 0 )); then
|
|
echo "L'edge ecoute, mais des expositions ne sont PAS servies : ${en_defaut[*]} (000 = silence, 5xx = amont en defaut). ${perf}"
|
|
exit 2
|
|
fi
|
|
echo "Edge : configuration valide, ecoute sur ${PORTS}, ${servies} exposition(s) servie(s). ${perf}"
|