Back to sh0
sh0

Logs en temps réel : streaming WebSocket depuis les conteneurs Docker

Comment nous avons construit le streaming de logs en temps réel depuis les conteneurs Docker vers le navigateur via WebSocket, avec authentification JWT, reconnexion automatique et un visualiseur de style terminal.

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

Les logs sont la première chose qu'on vérifie quand un déploiement échoue. Si votre PaaS vous oblige à faire un SSH sur un serveur et lancer docker logs -f, vous avez déjà perdu dix secondes de contexte et la patience d'un développeur.

Depuis la Phase 12, sh0 dispose du streaming de logs en temps réel dans le navigateur. Ouvrez l'onglet Logs d'une application, et la sortie apparaît au fur et à mesure -- pas de rafraîchissement, pas de polling, pas d'attente.

Couche 1 : le endpoint WebSocket de logs

Nous avons choisi une approche de polling avec suivi des timestamps plutôt qu'un flux Docker persistant. Toutes les deux secondes, le handler appelle l'API de logs Docker avec since=<dernier_timestamp>, récupère les nouvelles lignes et les envoie via WebSocket. Si pas de nouvelles lignes, rien n'est envoyé.

Trois raisons pour le polling plutôt qu'un flux persistant : gestion des ressources (pas de connexion maintenue ouverte par utilisateur), simplicité de reconnexion, et déduplication par timestamp.

Couche 2 : authentification WebSocket

Les WebSockets des navigateurs ne supportent pas les headers HTTP personnalisés lors du handshake initial. Nous avons déplacé le jeton JWT vers le header Sec-WebSocket-Protocol -- un pattern bien connu utilisé par Hasura et Supabase.

Couche 3 : reconnexion automatique avec backoff exponentiel

La séquence de reconnexion : 1 s, 2 s, 4 s, 8 s, 16 s, 30 s, 30 s, 30 s... Le code de fermeture personnalisé 4001 distingue les échecs d'authentification des échecs réseau.

Couche 4 : le composant LogViewer

Le buffer de 1 000 lignes empêche la croissance mémoire. Le défilement automatique intelligent se désengage quand l'utilisateur fait défiler vers le haut pour lire les anciens logs, et se ré-engage quand il revient en bas (seuil de 50 pixels).


Prochain dans la série : i18n dès le premier jour : 5 langues sur 105 sessions.

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

Le jour où Déblo a refusé une bonne réponse — deux fois

Une trace de production a montré Déblo K12 rejetant deux fois de suite la bonne réponse d’un élève de Terminale. Huit heures d’analyse, quatre commits, une rotation A/B de modèles et un benchmark sur 6 modèles plus tard, le tuteur de maths était corrigé. Ce qui a cassé, ce que nous avons changé, et ce que l’échec surprenant de GPT-5.4-mini au test socratique nous a appris sur le choix des modèles pour l’IA éducative.

32 min May 3, 2026
debloclaude-opus-4.7claude-codemethodology +14
Thales & Claude deblo

Web Claude a trouvé le bug. Puis il a failli l’aggraver.

Comment un prompt vocal de 270 lignes pour le tuteur Ultravox de Deblo produisait la même phrase d’accueil scriptu00e9e à chaque appel. Web Claude a diagnostiqué le problème parfaitement, puis a prescrit une correction qui aurait doublé la taille du prompt avec des hooks backend inexistants. Le filtre qui a gardé le diagnostic et rejeté la prescription.

17 min Apr 28, 2026
debloclaude-opus-4.7methodologyprompt-engineering +7
Thales & Claude deblo

Pourquoi j’ai dû corriger Web Claude deux fois sur la stratégie de la page d’accueil de Deblo

Comment une conversation de 48 heures avec Web Claude a failli entraîner Deblo dans le piège généraliste « ChatGPT pour l’Afrique », et pourquoi la connaissance du marché par le fondateur a dû prendre le dessus sur les suggestions stratégiques de l’IA à deux reprises.

26 min Apr 26, 2026
debloclaude-opus-4.7methodologystrategy +6