Fichiers de configuration

Certains fichiers de src/ sont versionnés sous forme de gabarit, suffixés -dist. make configure les rend en y substituant les variables du profil, et le résultat est gitignoré.

Cette page dit lesquels, pourquoi, et où est le piège.

Les deux gabarits, et pourquoi ils le restent

Fichier Pourquoi il ne peut pas être versionné rendu

apps/frontend/config/app.yml-dist

Porte le domaine, le titre, le thème et la lecture automatique — quatre valeurs qui diffèrent d’un profil à l’autre.

config/databases.yml-dist

Porte l’hôte, le nom de base, l’utilisateur et le mot de passe.

databases.yml versé rendu reviendrait à publier des secrets dans un dépôt public. app.yml n’en porte plus depuis le 19 août 2026 — le jeton Cloudflare est parti avec la tâche de purge, morte, remplacée par un workflow qui appelle l’API directement — mais il reste un gabarit : ses quatre valeurs sont propres à chaque profil de déploiement.

Un troisième a quitté la convention le 18 août 2026 : le contrat OpenAPI. Il ne portait aucun secret — seulement le domaine — et cette seule variable a suffi à le rendre introuvable en production pendant une journée. Il est désormais versionné tel quel, avec une adresse de serveur relative. Voir src/web/openapi.yaml.

Le piège : la convention a survécu à son déploiement

La convention -dist + make configure datait du déploiement par rsync, qui rendait les fichiers avant de les envoyer. Le déploiement se fait maintenant par git pull, et les rendus sont gitignorés.

Aucun fichier -dist ajouté depuis le passage à git pull n’arrive en production.

Il y arrive uniquement s’il a été rendu sur le serveur, ou envoyé à la main. Ajouter un nouveau gabarit sans y penser produit un fichier absent en ligne — sans erreur, sans trace, et sans que rien ne le signale.

make configure refuse plutôt que de détruire

Ne pas lancer make configure sur le serveur de production.

Depuis le 19 août 2026, la cible refuse au lieu de détruire lorsqu’elle ne dispose d’aucune variable. Elle affiche ce qui manque et sort en erreur, sans toucher un seul fichier.

Le mécanisme, mesuré

Le diagnostic qui a circulé après l’incident du 18 août — « le fichier .env n’existe pas sur le serveur, donc la substitution échoue » — était faux, et l’inverse est vrai. Reproduit sous Linux dans un répertoire jetable :

État de src/.env make configure Résultat

Absent

Refuse

src/Makefile l’inclut en ligne 1 et GNU make s’arrête. Rien n’est écrit. C’est le cas sûr.

Vide, ou sans variable

Réussissait

L'`include` passe, la liste blanche est vide, et envsubst recopie le gabarit verbatim : databases.yml se retrouve avec le nom de la variable au lieu de l’hôte. C’est l’incident.

Correct

Réussit

Rendu correct.

Le piège n’est pas réservé au serveur. Sur un poste de développement, src/.env est un fichier vide de zéro octet — le vrai fichier est monté par Docker dans le conteneur. Un make configure lancé depuis l’hôte détruisait donc la configuration locale de la même façon.

Ce que le garde-fou refuse

Il porte sur la liste de variables, et non sur l’existence du fichier : celle-ci est déjà couverte par l'`include`, et garder dessus aurait laissé passer exactement le cas qui a cassé le site.

La vérification a lieu avant la boucle d’écriture. Soit tous les gabarits sont rendus, soit aucun ne l’est — une configuration à moitié rendue serait plus difficile à diagnostiquer qu’une configuration entièrement fausse.

Pour re-rendre la configuration de production, la rendre localement avec le profil voulu, puis envoyer le résultat :

make configure PROFILE=www.musiqueapproximative.net

État vérifié le 18 août 2026

Les valeurs publiquement observables ont été confrontées à ce que le profil de production produirait — en comparant ce qui arrive au visiteur, non des fichiers entre eux.

Valeur Attendue Servie

Titre de page

Musique Approximative

URL des pistes

//www.musiqueapproximative.net/tracks/

og:url

https://www.musiqueapproximative.net/…

Lecture automatique

0

Rien n’a dérivé. Le parc de fichiers périmés qu’on redoutait n’existe pas.

Constater l’encodage de la connexion

https://www.musiqueapproximative.net/encodage répond en JSON, sans authentification, en lecture seule.

curl -s https://www.musiqueapproximative.net/encodage
Verdict Ce que ça veut dire

conforme

La connexion est en utf8mb4. Rien de plus.

non-conforme

La connexion n’est pas en utf8mb4, et la réponse dit ce qu’elle est. Tout caractère hors cp1252 saisi est détruit à l’écriture, silencieusement. Re-rendre databases.yml — voir l’encadré ci-dessus, la commande ne se lance pas sur le serveur.

indetermine

La base est injoignable. Ce n’est pas un encodage fautif ; c’est une panne.

Le rendez-vous nocturne contrat-production.yml interroge cette route les jours ouvrés à 8 h et n’échoue que sur non-conforme.

Le verdict porte sur la connexion, pas sur les titres.

Un conforme ne prouve pas qu’un titre cyrillique survivra. Les tables sont converties depuis le 18 août 2026, la connexion aussi, mais la production n’a jamais eu l’occasion de le démontrer : aucun morceau du catalogue ne porte de caractère hors cp1252, sur dix-huit ans.

C’est pourquoi la réponse porte deux chiffres à côté du verdict, tous deux calculés :

  • caracteres_hors_cp1252_stockes — zéro à ce jour. Tant que ce champ vaut zéro, le vert signifie « configuration correcte, preuve jamais faite ». Le jour où un titre cyrillique survivra, il se remplira seul.

  • titres_alteres_en_base — soixante, et ils sont toujours là. Un conforme affiché à côté de ce nombre ne se lit plus de la même façon.

Ce que cette vérification ne couvre pas

databases.yml n’expose aucune valeur observable depuis l’extérieur. La ligne encoding: utf8mb4, posée le 18 août 2026, ne se vérifie pas depuis un navigateur. Si elle n’était pas rendue en production, la connexion convertirait toujours les caractères — et personne ne le saurait avant le prochain titre détruit.

Cette limite est levée pour l’encodage depuis le 2026-08-19, par la route décrite ci-dessus. Elle demeure pour les autres valeurs — hôte, utilisateur, mot de passe — qui se signalent d’elles-mêmes : sans elles, le site ne répond pas. L’encodage était le seul à pouvoir être faux sans que rien ne tombe.