+58
−18
+3
−0
+4
−4
Loading
Deux changements que les mêmes fichiers portent, et qu'il aurait fallu
séparer si les diffs ne s'entrelaçaient pas dans compose.yaml et dans
l'installateur : les variables d'environnement passent à l'anglais, et le
serveur média cesse d'être une fatalité sur cinq ports fixes.
── Les noms ───────────────────────────────────────────────────────────────
Un fichier de configuration est lu par des gens qui n'ont pas écrit le
logiciel, souvent dans l'urgence, et parfois sans parler la langue de celui
qui l'a nommé. CLAMAV_HOTE, SECRET_SESSION ou APNS_EQUIPE_ID demandaient de
traduire avant de comprendre.
KASTELL_URL_PUBLIQUE → KASTELL_PUBLIC_URL, KASTELL_PROXY_DE_CONFIANCE →
KASTELL_TRUSTED_PROXY, KASTELL_RELAIS_POUSSEE → KASTELL_PUSH_RELAY,
KASTELL_RELAIS_CLE → KASTELL_RELAY_KEY, CLAMAV_HOTE → CLAMAV_HOST,
LIVEKIT_URL_INTERNE → LIVEKIT_INTERNAL_URL, LIVEKIT_CLE → LIVEKIT_KEY,
S3_ACCES → S3_ACCESS, SECRET_SESSION → SESSION_SECRET. Côté relais : HOTE,
RELAIS_CLES, DEBIT_PAR_MINUTE, et les familles APNS_ et FCM_.
239 occurrences, 31 fichiers, documentation comprise.
Ce qui ne casse pas, et pourquoi c'est le cœur du commit
Une instance en service ne se met pas à jour en même temps que son fichier.
Refuser de démarrer sur un .env ancien transformerait un renommage en
panne, et ce n'est pas le jour d'une crise qu'on veut le découvrir.
La composition lit « ${NOUVEAU:-${ANCIEN:-}} ». C'est le filet qui compte :
l'interpolation a lieu avant que le conteneur existe, et sans lui un .env
ancien ne donnerait pas une erreur mais des valeurs vides.
Les deux schémas recopient l'ancien nom vers le nouveau quand celui-ci
manque, et le disent. Jamais l'inverse. Ce filet sert les exécutions hors
conteneur — « pnpm verif », « pnpm amorcer-root ».
preparer-env.mjs renomme sur place au lieu de compléter. Le plus dangereux
à omettre : une clé renommée passait pour absente, l'outil ajoutait la
valeur d'exemple à côté de la vraie, et comme la composition préfère le
nouveau nom, l'exemple l'emportait — une URL publique remplacée par
« localhost » sans que personne l'ait demandé, un secret de session neuf
qui déconnecte tout le monde. Constaté sur une instance de développement
avant d'être corrigé.
── Le serveur média ───────────────────────────────────────────────────────
Une machine qui porte déjà un LiveKit ne pouvait pas accueillir Kastell : les
cinq groupes de ports étaient écrits en dur, et « address already in use »
arrivait sans que rien ne l'ait annoncé. L'installateur propose maintenant
trois voies — le serveur livré sur ses ports habituels, le même sur d'autres
ports, ou le LiveKit que l'exploitant a déjà.
Les ports deviennent des variables, publiées à l'identique hôte et
conteneur : le TURN et les candidats RTC annoncent aux navigateurs le port
que LiveKit croit occuper, et une translation les rendrait faux. Déplacer
les ports demande donc aussi un fichier de configuration qui les répète,
que l'installateur écrit — docker/livekit.local.yaml, hors git, avec
use_external_ip et le domaine TURN déduits de l'adresse publique.
La mutualisation lève tout sauf « livekit ». Le piège qu'elle cache est
l'enregistreur : il ne reçoit pas ses tâches par HTTP mais s'inscrit sur le
Redis du serveur média. Le laisser sur celui de Kastell donnerait une visio
qui marche et un enregistrement qui échoue sur « no egress workers
available » — au moment précis où l'on enregistre. LIVEKIT_REDIS existe
pour ça, et l'installateur pose la question plutôt que de la supposer.
L'egress perd sa dépendance à « livekit » : Compose l'aurait satisfaite en
démarrant le service, ressuscitant le conflit de ports qu'on fuyait.
Contrôlé
tsc passe. La pile se lève et répond sur un .env resté entièrement aux
anciens noms, puis sur le même une fois migré, valeurs conservées au
caractère près et sans doublon. Les trois voies du serveur média ont été
jouées sur une copie isolée : conflit détecté puis contourné, jeu de ports
libres proposé et écrit des deux côtés, mutualisation avec secret laissé
vide et services réduits.
Co-Authored-By:
Claude Opus 5 <noreply@anthropic.com>