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 thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15