Technolibre remonte depuis zero une seconde fois — 14 hotes, 2588 taches ok, 0 failed. Deux defauts trouves en chemin. LE JETON KEYCLOAK VIVAIT 60 SECONDES. Il etait pris dans politique-mdp.yml — le 2e des neuf fichiers du role — et reutilise jusqu'au 8e. Entre les deux, six fichiers de travail dont groupes-ldap.yml et ses reprises espacees de 15 s. Sur une construction NEUVE le temps depasse la minute : 401. Sur un REJEU tout est converge, ca va vite, ca passe. D'ou les deux echecs du matin, chaque fois suivis d'un succes au rejeu, qui donnaient l'illusion d'une course au demarrage de Keycloak. J'avais ecrit alors ne pas avoir de mesure qui le prouve — c'etait juste, et la cause etait l'AGE du jeton. jeton-admin.yml en prend un frais la ou on s'en sert. GRAFANA : UN ECHEC TRANSITOIRE RENDU ILLISIBLE. Premier demarrage, apres 67 s de migrations : « failed to create admin user: no such column: uid », alors que la migration qui ajoute cette colonne etait journalisee comme reussie. Base neuve : tout remigre, service actif, colonne presente. L'incident ne s'est pas reproduit et Chezlepro ne l'a jamais eu — je n'ai donc PAS corrige la cause, faute de l'avoir reproduite. J'ai corrige ce qui la rendait indechiffrable : - Restart=on-failure venait du paquet SANS RestartSec, donc 100 ms : six relances en une seconde, chacune rejouant les migrations sur la meme base SQLite. Un echec unique se presentait comme un desastre. RestartSec=10 ; - la rotation du compte de secours echouait cinq fois sous no_log en annoncant « the output has been hidden », alors que la vraie cause etait ailleurs et lisible : le serveur ne demarrait pas. Une attente explicite sur le port precede desormais la CLI, avec un message qui renvoie a la PREMIERE erreur du journal. Troisieme fois dans la journee que no_log masque la cause au moment ou elle sert : une garde qui protege un secret ne doit pas emporter le diagnostic. Verifie : 7 devis sur Technolibre — MTU, identite, certificats, PostgreSQL, courriel, frontiere CONFORME ; prouver.py 35 OK ; ansible-lint production. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
32 lines
2 KiB
Django/Jinja
32 lines
2 KiB
Django/Jinja
[Service]
|
|
# `Restart=on-failure` vient du paquet, SANS `RestartSec` — donc 100 ms par defaut.
|
|
# Le 2026-08-10, une migration de base a echoue au premier demarrage : systemd a relance
|
|
# six fois en une seconde, chaque relance rejouant les migrations sur la meme base SQLite.
|
|
# Un echec unique s'est ainsi presente comme un desastre, et il a fallu remonter tout le
|
|
# journal pour retrouver la PREMIERE erreur — la seule qui disait quelque chose.
|
|
#
|
|
# Dix secondes laissent le temps de voir, de journaliser, et n'empilent pas les migrations.
|
|
RestartSec=10
|
|
Environment=GF_SERVER_DOMAIN={{ serveur_grafana_hostname }}
|
|
Environment=GF_SERVER_ROOT_URL={{ serveur_grafana_root_url }}
|
|
Environment=GF_SECURITY_ADMIN_PASSWORD={{ serveur_grafana_admin_password }}
|
|
Environment=GF_USERS_ALLOW_SIGN_UP=false
|
|
{% if serveur_grafana_oidc_actif %}
|
|
{# Masque le formulaire local. `grafana-cli admin reset-admin-password`
|
|
reste utilisable sur l'hote : le compte n'est pas supprime, il n'est
|
|
plus offert au reseau. #}
|
|
Environment=GF_AUTH_DISABLE_LOGIN_FORM={{ 'false' if serveur_grafana_connexion_locale | bool else 'true' }}
|
|
Environment=GF_AUTH_GENERIC_OAUTH_ENABLED=true
|
|
Environment=GF_AUTH_GENERIC_OAUTH_NAME={{ serveur_grafana_oidc_nom }}
|
|
Environment=GF_AUTH_GENERIC_OAUTH_CLIENT_ID={{ serveur_grafana_oidc_client_id }}
|
|
Environment=GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET={{ serveur_grafana_oidc_client_secret }}
|
|
Environment="GF_AUTH_GENERIC_OAUTH_SCOPES={{ serveur_grafana_oidc_scopes }}"
|
|
Environment=GF_AUTH_GENERIC_OAUTH_AUTH_URL={{ serveur_grafana_oidc_base }}/auth
|
|
Environment=GF_AUTH_GENERIC_OAUTH_TOKEN_URL={{ serveur_grafana_oidc_base }}/token
|
|
Environment=GF_AUTH_GENERIC_OAUTH_API_URL={{ serveur_grafana_oidc_base }}/userinfo
|
|
Environment=GF_AUTH_GENERIC_OAUTH_LOGIN_ATTRIBUTE_PATH=preferred_username
|
|
{% if serveur_grafana_oidc_role_path %}
|
|
Environment="GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH={{ serveur_grafana_oidc_role_path }}"
|
|
Environment=GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_STRICT=false
|
|
{% endif %}
|
|
{% endif %}
|