+1
−1
+165
−8
+25
−0
Loading
La dernière marche de l'installation demandait la chaîne Node sur l'hôte —
« pnpm amorcer-root » — à un script qui s'adresse précisément à l'exploitant
qui n'a que Docker. On l'envoyait chercher pnpm pour finir ce qu'on venait de
lui installer sans lui.
Le compte naît du parcours normal
L'installateur appelle /auth/inscription, l'adresse que composerait un
navigateur : mêmes contrôles, même journal, aucune porte de service. Ce
n'est pas un détail de commodité — une inscription qui court-circuiterait la
validation créerait un premier compte différent de tous les autres, et c'est
celui-là qui devient root.
Le mot de passe se saisit sans écho, et voyage par un fichier temporaire en
600 plutôt que par la ligne de commande : « ps » est lisible par tous les
utilisateurs de la machine. Le corps JSON est échappé par une fonction
dédiée — jq n'est pas un prérequis, et un mot de passe porte légitimement
une contre-oblique.
L'amorce voyage dans l'image
esbuild produit désormais dist/racine.js à côté de dist/index.js, et
l'octroi se fait par « docker compose exec app node dist/racine.js ». Plus
rien à installer sur l'hôte. La règle ne bouge pas : l'amorce ne crée pas de
compte, et refuse dès qu'un root existe.
Ce que le script ne promet pas
Que le droit root suive dans la foulée. L'amorce refuse un compte sans
second facteur actif : la console exige une présentation récente (EA-03), et
accorder root à un compte qui ne pourrait jamais y entrer ne servirait
personne. Le script tente l'amorçage, puis relaie SON message plutôt que
d'en inventer un — le jour où la règle changera, il n'aura pas à mentir en
attendant qu'on le corrige.
Deux défauts de portée, trouvés en éprouvant
« pret » n'existe que si curl était là pour interroger la sonde, et
« hote_public » que si un .env neuf a été écrit. Les lire ailleurs faisait
tomber le script sous « set -u », juste après une levée réussie — au moment
précis où tout venait de marcher. Le premier a un défaut, le second se
déduit maintenant du .env, qui est toujours là.
Contrôlé
L'inscription répond 201 sur une instance vierge montée à côté, et l'amorce
y donne le motif attendu. Le mot de passe ne s'affiche pas : la frappe reste
invisible et la valeur arrive intacte. L'échappement JSON tient les
guillemets, les contre-obliques et l'UTF-8. 920 garanties, tsc, image
reconstruite avec racine.js.
Co-Authored-By:
Claude Opus 5 <noreply@anthropic.com>