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 Step Zero ne suffisait pas : comment valider un constructeur sans valider le runtime a fait tomber toutes les sessions vocales de Déblo l’heure où nous avons livré le streaming caméra temps réel

La phase 14 a livré Déblo Eyes — streaming caméra temps réel via LiveKit vers Gemini Live native audio. Le premier deploy a fait tomber toutes les sessions vocales en production en quatre-vingt-dix secondes parce que notre Step 0 avait validé le constructeur sans exercer le runtime. Le build log de comment Déblo a eu des yeux, ce qu’un pré-vol incomplet a coûté, et quels points de polish ont été livrés ou reportés.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

Le tiret cadratin qui a tué la production : comment un slogan marketing dans un header HTTP a fait tomber le chat de Déblo pendant 24 heures

Deux jours avant la soumission App Store, tout le produit chat de Déblo s’est cassé silencieusement. Pas de spinner, pas de toast, aucune erreur dans l’UI — juste un silence radio. L’incident de 24 heures se résumait à un seul « é » dans la valeur d’un header HTTP qui levait une UnicodeEncodeError avant qu’aucune requête vers OpenRouter ne quitte le backend. Post-mortem d’une fausse hypothèse, d’une trace Sentry, et d’un fix de six lignes qui a débloqué le lancement.

30 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Six heures, d’une page blanche à la review Apple — Comment nous avons soumis Déblo à l’App Store, en direct

Marche à marche en direct de la soumission de Déblo à l’App Store iOS en six heures : ce que les validateurs d’Apple ont rejeté (un superscript Unicode), ce que nous avons corrigé (un Promotional Text gaspillé sur des marques tierces), et les rouages de l’ASO iOS que presque tout le monde rate.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16