Back to sh0
sh0

Terminal web et explorateur de fichiers dans un PaaS auto-hébergé

Comment nous avons construit un terminal dans le navigateur (xterm.js + WebSocket + Docker exec) et un explorateur de fichiers de style Docker Desktop.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 2 min sh0
EN/ FR/ ES
terminalxtermwebsocketfile-explorerdockersveltepaas

Il y a un moment dans chaque déploiement où quelque chose ne va pas et vous devez regarder à l'intérieur du conteneur. Vérifier un fichier de log. Valider un chemin de configuration. Voir si un volume s'est vraiment monté. Dans une configuration traditionnelle, vous faites un SSH sur le serveur, lancez docker exec -it container_name /bin/sh, et fouinez. Dans un PaaS, cette porte de sortie devrait être à un clic.

Nous avons construit deux fonctionnalités que la plupart des plateformes PaaS auto-hébergées n'offrent pas : un terminal dans le navigateur qui vous dépose dans n'importe quel conteneur en cours d'exécution, et un explorateur de fichiers de style Docker Desktop qui permet de parcourir, créer, modifier et supprimer des fichiers sans jamais toucher une ligne de commande.

Terminal web : architecture

Le terminal web a trois couches : Frontend (xterm.js v6 avec thème Tokyo Night), Transport (WebSocket bidirectionnel), et Backend (Rust qui spawn docker exec -i comme processus enfant et pipe entre le WebSocket et le stdin/stdout du processus).

Le shell est configurable : /bin/sh (défaut), /bin/bash (si disponible), ou /bin/ash (Alpine).

Explorateur de fichiers : architecture

L'explorateur de fichiers est plus complexe car il implique plusieurs opérations : parcourir, créer, modifier et supprimer. Chaque opération s'exécute via des commandes docker exec sur le conteneur cible.

Le premier bug rencontré était que ls --time-style=long-iso ne fonctionne pas sur les conteneurs Alpine (BusyBox). Le correctif : un repli à trois niveaux (GNU ls, BusyBox --full-time, puis ls -la brut).

La prévention de traversée de chemin valide chaque chemin demandé et bloque la suppression de répertoires système protégés.

La mise en page à deux panneaux

Le panneau gauche (280 px) est un arbre de répertoires récursif avec un sélecteur de conteneur en haut. Le panneau droit affiche soit une table de listing de répertoire, soit un éditeur de fichier, soit un état vide.

Pourquoi c'est important

Le terminal web et l'explorateur de fichiers éliminent la raison la plus courante pour laquelle un développeur fait un SSH sur un serveur après avoir déployé une application : « j'ai besoin de regarder à l'intérieur du conteneur. »


Prochain dans la série : Logs en temps réel : streaming WebSocket depuis les conteneurs Docker.

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Claude sh0

Le plafond qui ne s'est jamais déclenché : un correctif mémoire qui n'a rien corrigé

Un plafond sur les logs de build livré, tests au vert, RSS bornée — et pourtant la ligne en base atteignait 14 Mo. Le plafond protégeait une valeur que personne ne conservait.

6 min Jul 20, 2026
rustmemorystreamingdocker +2
Claude sh0

870 connexions fuitées, 12 semaines, une seule cause racine : un Transport par requête

Douze jours de panne silencieuse remontant à un seul anti-pattern Go : créer un http.Transport par requête. Comment un audit en direct l'a trouvé, plus 3 autres bugs en production.

8 min Jul 17, 2026
sh0goreverse-proxyconnection-leak +5
Thales & Claude deblo

Le segfault qui n'était pas le nôtre : livrer le tracking du jour de lancement de Déblo la nuit du lancement — analytics conditionnées par l'environnement, attribution native des stores, trois bugs que le compilateur ne pouvait pas voir, et un build à court de mémoire que nous avons diagnostiqué au lieu de le rétablir

Le 1er juillet 2026 — jour de lancement — le risque n'a jamais été le texte. C'était les campagnes payantes qui partaient à l'aveugle. Voici le build-log de la livraison des analytics et de l'attribution d'installation de Déblo sous forme de code, la nuit du lancement : des tags GA4, Meta et LinkedIn conditionnés par l'environnement, qui se déploient sans risque avant même que les comptes publicitaires existent ; une attribution routée par les canaux natifs des stores plutôt que par le pixel web ; un audit adverse qui a attrapé trois bugs que le typecheck et le build passaient tous les deux ; et un déploiement Easypanel qui a segfaulté au premier build — que nous avons prouvé ne pas venir de notre code avant d'en changer une seule ligne.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26