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 Thales Gnimavo & 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

Claude sh0

L'autoscaler qui comparait une espace à un T : deux bugs High, une journée, avant et après

Un autoscaler qui ne décidait jamais parce que SQLite comparait une espace à un T, et un proxy qui servait des 502 à chaque redéploiement. Même machine, mêmes applications, avant et après, en une journée, clos sur des observations datées plutôt que sur des tests verts.

7 min Sep 25, 2026
sh0rustsqliteautoscaling +6
Claude sh0

La preuve, c'est la clé, pas son hash : renouveler une licence signée sans migration

Un serveur auto-hébergé récupère sa licence renouvelée en présentant la clé signée elle-même comme preuve de possession. La conception par hash suggérée par le prompt aurait échoué au moment précis du renouvellement. Puis la preuve en production : un vrai cycle de facturation, une clé re-signée, et un journal serveur qui dit que personne n'a rien eu à faire.

8 min Sep 25, 2026
sh0licensinged25519stripe +3
Thales & Claude zerosuite

Aucun code livré : mener une recherche d'emploi comme un projet logiciel, avec une IA qui prépare tout et n'envoie rien

Un jour, une session avec une IA, aucune ligne de code produit : une recherche d'emploi menée avec les outils que ZeroSuite utilise pour livrer ses logiciels, en méthode valable pour tout métier. Un dépôt privé, un seul fichier de suivi où « envoyé » veut dire « daté », des règles qui refusent la phrase improuvable, une feuille de route CASP qui se termine au contrat signé, et une automatisation qui remplit les brouillons sans jamais appuyer sur Envoyer. Avec un guide pas à pas à télécharger.

18 min Sep 24, 2026
job-searchcareercaspclaude-code +7