Ce tutoriel explique comment configurer Fail2ban pour sécuriser Nginx Proxy Manager (NPM) dans un environnement Docker. L'objectif est de bloquer les tentatives d'accès non autorisés, notamment les attaques par force brute sur l'authentification Basic Auth, sans modifier l'image Docker de NPM ni ajouter de conteneur supplémentaire.
La méthode préconisée repose sur l'analyse des logs d'accès de NPM, qui enregistrent les échecs d'authentification HTTP 401. Fail2ban, exécuté sur l'hôte Docker, surveille ces logs pour identifier les adresses IP suspectes et les bannir temporairement des ports 80 et 443. L'approche vise à rester simple (KISS) en utilisant les journaux natifs de NPM et en s'appuyant sur la configuration existante de Fail2ban sur l'hôte.
La procédure implique de localiser le fichier journal d'accès pertinent pour le Proxy Host ciblé, de créer un filtre Fail2ban spécifique pour reconnaître les échecs d'authentification 401 et d'inclure l'adresse IP du client (
Nuxt offre deux approches principales pour optimiser la performance des composants : Lazy et ClientOnly. L'utilisation de <LazyMonComposant /> permet le "code-splitting" automatique, isolant le composant dans un fichier séparé. Cela allège le bundle JavaScript initial, accélérant le téléchargement et l'analyse par le navigateur, et le code n'est chargé que lorsque le composant est nécessaire.
L'encadrement d'un composant par <ClientOnly> désactive son rendu côté serveur (SSR). Bien que son code reste inclus dans le bundle JavaScript, cette méthode réduit la charge du serveur et prévient les erreurs d'hydratation si le composant utilise des API spécifiques au navigateur. Cependant, le contenu n'est pas présent dans le HTML initial, ce qui peut entraîner des décalages visuels et impacter le référencement naturel.
La combinaison de Lazy et ClientOnly offre un gain de performance optimal en différant à la fois le SSR et le chargement du JavaScript. Cette approche est idéale pour les composants complexes et interactifs non essentiels au SEO, permettant au serveur de répondre rapidement et à la page de s'afficher sans délai avec un minimum de code, le composant se chargeant ensuite en arrière-plan sur le client.
L'écriture de qualité ne réside pas dans l'originalité, mais dans la capacité à exprimer des vérités évidentes de manière claire et perspicace. Chercher constamment la nouveauté peut mener à des sujets insignifiants, car les idées importantes ont généralement déjà été explorées par des esprits brillants à travers les générations. La difficulté réside dans l'articulation de ces évidences, souvent enfouies sous la familiarité.
Se concentrer sur ce qui est manifestement vrai oblige à examiner la réalité en profondeur et à affiner sa propre compréhension. C'est en explorant ces fondations personnelles que l'on peut aider autrui à examiner les leurs. L'exemple du succès de l'auteur avec son article sur la gestion de projets illustre comment une définition fondamentale, si évidente qu'elle était difficile à cerner, a permis de structurer des conseils pratiques.
La recherche de l'originalité peut s'avérer contre-productive, menant à des tentatives forcées et répétitives. Au contraire, s'attacher à exprimer des évidences puise dans l'expérience personnelle, offrant une richesse et une authenticité qui sonnent véritablement original aux yeux du lecteur.
Graft est un outil open-source conçu pour améliorer les performances des agents de codage tels que Claude Code, Cursor, Codex et Gemini. Il vise à les rendre plus rapides, moins coûteux et à améliorer leur compréhension contextuelle de votre base de code, permettant ainsi des économies significatives en temps et en coût, tout en améliorant parfois la précision des résultats.
L'outil fonctionne en créant un graphe de votre base de code. Ce graphe permet aux agents d'accéder à des informations contextuelles pertinentes, réduisant ainsi le besoin de traiter l'intégralité du code à chaque requête. Graft s'intègre en douceur, notamment avec Claude Code, en ajoutant automatiquement des hooks et en gérant la génération du graphe en arrière-plan, rendant ainsi l'amélioration transparente pour l'utilisateur.
Une fonctionnalité notable de Graft est son application GitHub qui analyse automatiquement les pull requests, offrant des revues de code plus efficaces. Il supporte également une variété de langages de programmation et offre des outils en ligne de commande pour la recherche, la cartographie et la visualisation du graphe de code.
Pi est un "agent harness" minimal conçu pour s'adapter aux flux de travail de l'utilisateur plutôt que l'inverse. Il permet la personnalisation via des extensions, des compétences, des modèles de prompts et des thèmes, qui peuvent être packagés et partagés via npm ou git. Pi se distingue par sa flexibilité et sa légèreté, offrant quatre modes d'utilisation : interactif, impression/JSON, RPC et SDK, tout en évitant des fonctionnalités complexes comme les sous-agents ou le mode plan par défaut.
La recherche dans des colonnes chiffrées sans les déchiffrer est rendue possible grâce à un "blind index". Contrairement à un chiffrement classique non déterministe qui génère un nouveau texte chiffré pour chaque même donnée, le blind index utilise une fonction cryptographique déterministe et secrète (comme HMAC-SHA256) sur la donnée normalisée. Ce mécanisme permet de créer un index sur cette valeur générée, autorisant ainsi les requêtes d'égalité.
L'implémentation dans Symfony/Doctrine consiste à ajouter une colonne supplémentaire à la base de données pour stocker ce blind index, aux côtés du champ chiffré. Lors d'une recherche, le système interroge d'abord la colonne du blind index. Comme la fonction de hachage est déterministe, la même valeur en clair produira toujours le même index. Cependant, en raison de la troncature délibérée de cet index, des collisions sont possibles.
Pour pallier ces collisions et garantir l'exactitude, une étape de vérification est indispensable après avoir récupéré les candidats via le blind index. Le système déchiffre alors le contenu réel de la colonne chiffrée pour les enregistrements correspondants et le compare à la valeur recherchée. Cette approche permet de maintenir la confidentialité tout en autorisant des requêtes efficaces sur les données sensibles.
Le bundle symfony-precognition permet de valider une requête HTTP sans exécuter le code du contrôleur, offrant ainsi une validation de formulaire en temps réel. L'idée principale est de conserver les règles de validation côté serveur, au lieu de les dupliquer côté client, évitant ainsi les incohérences entre les deux implémentations.
Pour ce faire, une requête normale est enrichie d'un en-tête Precognition: true. Le serveur analyse et valide les arguments du contrôleur, mais s'arrête avant l'exécution du code principal. Aucune modification n'est effectuée sur les données ou le système, le client reçoit uniquement un retour sur la validité potentielle de la requête.
Il est possible de limiter les validations retournées à des champs spécifiques grâce à l'en-tête Precognition-Validate-Only, utile pour ne signaler des erreurs que lorsque l'utilisateur a terminé de saisir un champ particulier.
La distinction entre les "sub-agents" et le "Master Control Panel" (MCP) est cruciale pour l'architecture des systèmes d'IA. Historiquement, la confusion a conduit à mélanger la fonction de raisonnement ("qui pense") et celle d'exécution ("qui agit"), entraînant des problèmes de gouvernance, de traçabilité et de permissions.
Un sub-agent est conçu pour un rôle cognitif spécialisé, recevant un prompt, un périmètre et des règles pour produire une sortie structurée et utile. Il se concentre sur la pensée critique et la formulation. À l'inverse, un serveur MCP est une infrastructure dont le rôle est d'exécuter des actions de manière contrôlée, en exposant des capacités et des données avec des contrats clairs et une traçabilité.
Cette séparation est particulièrement pertinente lors de la gestion d'incidents. Dans un modèle bien conçu, un orchestrateur délègue des tâches à des sub-agents spécialisés (diagnostic, mitigation), qui formulent des hypothèses et proposent des actions. L'exécution réelle de ces actions est ensuite gérée par les serveurs MCP appropriés, laissant une trace écrite et permettant de comprendre précisément qui a décidé quoi et pourquoi.
MicroLighter est une bibliothèque de coloration syntaxique légère et sans dépendances, conçue pour être rapide et facile à intégrer. Elle ne génère pas de <span> superflus dans le code, ce qui contribue à sa performance. Les grammaires, au format TextMate utilisé par VS Code, peuvent être chargées de manière asynchrone pour optimiser le temps de chargement.
L'installation de MicroLighter se fait simplement via npm. Il suffit d'importer la fonction highlightAll et un thème CSS, puis d'ajouter la classe language-* aux blocs de code. Une option existe pour un chargement automatique immédiat, ainsi qu'un bundle pour utiliser des éléments personnalisés offrant des fonctionnalités comme la copie ou la numérotation des lignes.
MicroLighter prend en charge plusieurs langages de programmation, tels que JavaScript, CSS, HTML, Ruby, Python, SQL et C++. La librairie est pensée pour une utilisation efficace et moderne du code dans les projets web.
Les agents autonomes, malgré leur intégration à diverses sources d'information, peuvent rencontrer des problèmes de pertinence en utilisant des données obsolètes ou en étant submergés par un trop-plein de contexte. La recherche classique, qu'elle soit basée sur des mots-clés (BM25) ou sémantique (vectorielle), ne suffit pas toujours à distinguer les informations véritablement utiles des autres, car elle se concentre sur la ressemblance plutôt que sur la connexion entre les données.
Pour pallier ces limitations, l'article propose de distinguer clairement la "connaissance" (données stables et périssables) du "contexte" (informations temporaires pour une tâche spécifique). Une approche plus avancée consiste à utiliser une ontologie pour modéliser les liens entre les entités. Cette méthode permet de construire un contexte pertinent en naviguant à travers les relations entre les éléments, plutôt qu'en se basant uniquement sur la similarité des textes.
L'article mentionne l'outil Codebase Memory MCP comme un exemple d'application de cette approche, où les éléments de code et leurs interdépendances sont représentés sous forme de graphes. Cela permet de suivre des chaînes de dépendances pour retrouver des informations contextuelles précises, par exemple en explorant les appelants et les dépendances d'une fonction spécifique.
L'auteur a réussi à redonner vie à sa tablette Lenovo Tab P11 Pro, qui était inutilisable suite à une tentative d'installation de ROM Treble. Après huit mois de silence, le problème initial venait d'une batterie en décharge profonde, empêchant toute communication USB. Une fois la batterie rechargée avec un chargeur mural, la tablette a affiché des messages du bootloader, confirmant que le SoC était fonctionnel mais ne parvenait pas à charger un système valide.
La récupération a impliqué l'utilisation du mode EDL (Emergency Download), un mode de secours pour les appareils Qualcomm. Après plusieurs manipulations, la tablette a enfin été reconnue par l'ordinateur en mode EDL, permettant une communication avec le SoC. Le succès dépendait alors de la trouvaille du bon firmware, du bon loader et du bon outil pour le processus de reflashage.
Le processus a également mis en évidence l'importance du "Secure Boot" activé sur l'appareil, limitant le type de chargeurs et de firmwares acceptés par le système, ce qui complique les opérations de débrickage. L'auteur a ainsi dû naviguer parmi les différents firmwares proposés par Lenovo, en commençant par un package SVC (Service) qui contenait les fichiers nécessaires pour le reflashage.
L'article décrit comment modifier la taille du bloc d'adresses IP alloué à chaque nœud (PodCIDR) dans un cluster Kubernetes utilisant Cilium en mode cluster-pool pour la gestion des adresses IP. L'objectif est d'augmenter la capacité de planification de nouveaux pods sur des nœuds performants qui atteignent rapidement la limite de 254 adresses par défaut (/24).
La procédure implique la modification de la configuration de Cilium pour définir un masque de sous-réseau plus large (par exemple, /22) via les valeurs Helm, puis une réallocation manuelle du PodCIDR pour chaque nœud. Cela se fait en supprimant l'entrée actuelle du CIDR du nœud dans l'objet CiliumNode, ce qui déclenche l'opérateur Cilium pour en attribuer un nouveau selon la nouvelle configuration.
Le processus de rollout s'effectue nœud par nœud, en s'assurant que le cluster reste opérationnel. Il faut drainer le nœud, patcher l'objet CiliumNode pour forcer la réallocation, supprimer le pod Cilium et les pods résiduels utilisant l'ancien bloc d'adresses, puis désactiver le draining du nœud. Un script est fourni pour automatiser cette opération sur chaque nœud.
L'auteur présente sa structure HTML de base actuelle, expliquant les choix derrière chaque élément. L'idée principale est de fournir une base solide et bien pensée pour tout projet web, allant au-delà d'un simple copier-coller de modèles existants. Parmi les détails importants, il met en avant l'importance de la déclaration <!DOCTYPE html>, de l'attribut lang pour l'accessibilité et le SEO, ainsi que la gestion de l'encodage des caractères avec <meta charset="UTF-8">. L'utilisation d'une classe no-js sur la balise <html> est également soulignée pour permettre une gestion conditionnelle du JavaScript.
La balise <meta name="viewport"> est essentielle pour assurer un affichage correct et responsive sur les différents appareils mobiles. L'article détaille également la configuration des métadonnées pour l'optimisation des moteurs de recherche (SEO) et le partage sur les réseaux sociaux, incluant des éléments comme la description, le titre, les images et les URL canoniques. Des optimisations pour les icônes de favoris (favicon) et la gestion de la couleur de thème pour les applications web progressives (PWA) sont aussi mentionnées.
Enfin, l'auteur explique l'intégration de feuilles de style, y compris une version spécifique pour l'impression (media="print"), et l'inclusion de scripts JavaScript. L'utilisation de nomodule pour les polyfills JavaScript destinés aux anciens navigateurs et de type="module" pour les scripts modernes est expliquée, démontrant une approche soignée de la compatibilité et des performances.
Une guitare électrique fonctionne différemment d'une guitare acoustique, car elle ne repose pas sur une caisse de résonance pour amplifier le son. Au lieu de cela, elle utilise des cordes métalliques ferromagnétiques qui interagissent avec des capteurs électromagnétiques, appelés micros. Ces micros, composés d'une bobine de cuivre et d'un aimant permanent, transforment les vibrations des cordes en un signal électrique.
Lorsque la corde ferromagnétique, elle-même magnétisée par le champ de l'aimant du micro, vibre, son champ magnétique oscille. Cette oscillation magnétique est alors convertie en un signal électrique par la bobine du micro. C'est ce signal électrique qui est ensuite envoyé vers un amplificateur et un haut-parleur pour produire le son entendu.
Le corps de la guitare électrique joue un rôle principalement esthétique et n'a pas la fonction acoustique amplificatrice des guitares acoustiques. La variété des formes et des matériaux des corps de guitares électriques contribue à l'esthétique de l'instrument, plutôt qu'à la génération acoustique du son.
Après plusieurs fuites de données touchant des services de l’État en 2026 (DGFiP, France Titres, Éducation nationale), il est recommandé de vérifier si son identité a déjà été utilisée frauduleusement : consulter l’historique de ses connexions FranceConnect, demander la liste des comptes bancaires ouverts à son nom via FICOBA, vérifier auprès de la Banque de France une éventuelle inscription aux fichiers FCC/FICP et rechercher les sociétés dont on apparaîtrait comme dirigeant via MonIdenum ou l’Annuaire des entreprises. En cas d’anomalie, il faut contacter l’organisme concerné et déposer plainte ; en prévention, l’article recommande notamment l’authentification multifacteur, des mots de passe uniques et l’utilisation de documents d’identité filigranés ou de justificatifs à usage unique via France Identité.
L'article de Mike Fisher illustre l'importance cruciale des "load-bearing people" (personnes essentielles) à travers l'exemple d'Azer Koçulu et son package left-pad sur npm. En 2016, la suppression de ces onze lignes de code a paralysé des géants comme Facebook ou Netflix, révélant leur dépendance invisible à un seul développeur. L'épisode souligne comment des systèmes entiers reposent sur des éléments apparemment mineurs, souvent maintenus par une seule personne sans que leur rôle ne soit documenté ou partagé.
L'auteur étend cette métaphore à toutes les organisations, où des rôles clés (finance, ventes, opérations, etc.) reposent sur des individus détenant des connaissances non documentées. Ces "load-bearing people" deviennent des points de défaillance critiques, leur absence pouvant paralyser des processus entiers. Leur importance reste masquée jusqu'à ce qu'un incident survienne, mettant en lumière leur rôle indispensable.
Enfin, Fisher explique pourquoi ces risques persistent : les systèmes de reconnaissance valorisent les interventions d'urgence plutôt que la prévention, encourageant la concentration des savoirs plutôt que leur diffusion. Les organisations, en récompensant les "héros" plutôt que les processus robustes, maintiennent involontairement cette dépendance aux individus, malgré les dangers qu'elle représente.
Face à l’augmentation des bots malveillants exploitant l’IA pour scraper des sites ou chercher des failles, l’auteur propose Nginx botcheck, un outil simple pour les bloquer via Nginx. Contrairement à des solutions comme Fail2ban ou des blocages par pays, cette méthode évite les faux positifs tout en restant légère, sans nécessiter de service externe. Elle s’intègre directement dans la configuration de Nginx via son module Lua, avec une activation aussi simple qu’un include dans le fichier de virtualhost.
L’outil se distingue par sa simplicité de configuration, permettant d’ajouter des règles personnalisées via des maps Nginx pour autoriser ou bloquer certains flux. Contrairement à des alternatives complexes comme Anubis, Nginx botcheck reste accessible et modifiable, tout en offrant une protection efficace contre les bots agressifs. Le code est conçu pour être lisible et adaptable, répondant ainsi aux besoins des administrateurs système.
L'auteur a profité de deux semaines de congé pour moderniser son projet personnel Gifty Weddings, un registre de cadeaux de mariage devenu un constructeur de sites web, tout en apprenant à coder avec des outils d'IA. Il a utilisé principalement Claude Code avec le modèle Opus 5 pour le développement, complété par Pi pour les tâches mineures, tout en conservant un rôle actif dans la revue et l'orientation du code.
Malgré ses réticences initiales envers l'IA, nourries par des expériences décevantes en 2024, l'auteur a constaté des progrès significatifs dans l'efficacité des outils, notamment pour générer du CSS ou corriger des bugs complexes. Son approche itérative, combinant des bases existantes (code Go, schéma SQL) et une supervision humaine constante, a permis d'équilibrer automatisation et qualité, bien que certains compromis aient été nécessaires sur le style ou les tests.
L'expérience a révélé des limites, comme la verbosité des commentaires générés par l'IA ou la nécessité de guider activement le processus pour éviter des résultats médiocres. L'auteur souligne l'importance de l'expérience humaine pour distinguer un travail de qualité d'une production superficielle, tout en reconnaissant le gain de temps et d'inspiration apporté par ces outils.
Ce billet explique comment optimiser l'hébergement d'un grand modèle de langage (LLM) en détaillant le mécanisme du KV Cache, essentiel pour gérer l'attention dans les transformers. L'auteur revient sur le fonctionnement des matrices Query, Key et Value (QKV), qui permettent de calculer les relations entre tokens et d'ajuster leur représentation contextuelle. Le KV Cache stocke les vecteurs Key et Value des tokens actifs, réduisant ainsi la charge computationnelle lors des inférences, mais nécessitant une mémoire GPU significative, comme illustré par les 20,77 GiB utilisés pour 209 456 tokens.
L'article aborde ensuite les solutions techniques comme vLLM et KServe, conçues pour améliorer l'efficacité des LLM en production. Ces outils optimisent la gestion des ressources, notamment via des techniques comme le Grouped Query Attention (utilisé par Mistral), qui réduit la redondance des calculs. L'objectif est de concilier performance et scalabilité, permettant aux entreprises de déployer des modèles toujours plus grands tout en maintenant des temps de réponse acceptables pour un grand nombre d'utilisateurs.
Léa Verou défend l’idée que la plupart des sites web n’ont pas besoin d’un bouton de basculement entre les modes clair et sombre. Selon elle, cette fonctionnalité ajoute une complexité inutile pour les utilisateurs, car le mode système (déterminé par l’OS) suffit généralement. Elle explique que les rares cas où un utilisateur souhaite forcer un mode spécifique sont marginaux et que la solution par défaut est souvent plus adaptée.
Elle revient également sur son précédent article recommandant un bouton à deux états (système vs. mode opposé) plutôt qu’à trois états, tout en précisant que cette solution ne répond pas à la question de l’utilité même du bouton. Son analyse s’appuie sur des principes d’expérience utilisateur (UX) et de charge cognitive, soulignant que la simplicité d’implémentation ne rime pas toujours avec facilité d’utilisation.
Enfin, elle mentionne les réactions suscitées par son premier article, partagé massivement, et les objections de Bramus, qui maintient que le contrôle manuel reste pertinent dans certains scénarios. Verou reconnaît que ses arguments n’ont pas convaincu son interlocuteur, mais réaffirme sa position en faveur d’une approche minimaliste.