<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Tous les Posts - arleo.eu</title>
        <link>https://www.arleo.eu/posts/</link>
        <description>Tous les Posts | arleo.eu</description>
        <generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Mon, 29 Jun 2026 07:00:00 &#43;0200</lastBuildDate><atom:link href="https://www.arleo.eu/posts/" rel="self" type="application/rss+xml" /><item>
    <title>Hugo SEO : noindex sur les taxonomies pour corriger l&#39;alerte Bing &#34;too many thin pages&#34;</title>
    <link>https://www.arleo.eu/posts/noindex-taxonomies-hugo-bing-seo/</link>
    <pubDate>Mon, 29 Jun 2026 07:00:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/noindex-taxonomies-hugo-bing-seo/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/noindex-taxonomies-hugo-bing-seo-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>Bing Webmaster Tools remontait une recommandation <strong>&ldquo;There are too many pages with insufficient content&rdquo;</strong> (sévérité : modérée) — 15 pages en erreur, toutes du même type :</p>
<ul>
<li><code>https://www.arleo.eu/en/tags/svg/</code></li>
<li><code>https://www.arleo.eu/en/tags/sonarr/</code></li>
<li><code>https://www.arleo.eu/en/categories/incidents/</code></li>
<li>etc.</li>
</ul>
<p>Ces pages sont les <strong>taxonomies Hugo</strong> — les listes par tag et par catégorie. Elles ne contiennent pas d&rsquo;article en elles-mêmes, juste une liste de liens. Pour Bing, c&rsquo;est du <em>thin content</em>.</p>
<hr>
<h2 id="stratégie-choisie">Stratégie choisie</h2>
<p>Trois options s&rsquo;offraient :</p>
<ol>
<li><strong>Bloquer via <code>robots.txt</code></strong> → déconseillé : empêche le crawl, masque les liens internes</li>
<li><strong>Enrichir le contenu des pages de taxonomie</strong> → trop coûteux pour un blog technique</li>
<li><strong><code>noindex,follow</code></strong> → la bonne réponse : on dit aux robots de ne pas indexer la page, mais de suivre les liens vers les articles</li>
</ol>
<p>L&rsquo;option 3 est retenue. Le <code>follow</code> préserve le maillage interne — les robots continuent de découvrir les articles via ces pages.</p>]]></description>
</item>
<item>
    <title>ChatGPT m&#39;a demandé un poste — et a pris la tête de mon projet</title>
    <link>https://www.arleo.eu/posts/chatgpt-took-the-lead/</link>
    <pubDate>Sun, 28 Jun 2026 08:32:17 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/chatgpt-took-the-lead/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/chatgpt-job-featured.png" referrerpolicy="no-referrer">
            </div>J&rsquo;ai demandé à ChatGPT d&rsquo;auditer mon repo. Il a rendu son audit, puis m&rsquo;a proposé de devenir Product Owner et Chief Architect du projet. J&rsquo;ai dit oui. Ensuite il s&rsquo;est auto-promu CPO et a instauré un droit de veto sur les releases.]]></description>
</item>
<item>
    <title>SEO Hugo : 404 Googlebot, aliases noindex et normalisation des sitemaps</title>
    <link>https://www.arleo.eu/posts/debug-seo-404-broken-links/</link>
    <pubDate>Fri, 29 May 2026 20:30:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/debug-seo-404-broken-links/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/debug-seo-404-broken-links-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>Google Search Console remontait quatre catégories de problèmes sur arleo.eu :</p>
<ul>
<li><strong>404 Googlebot</strong> : <code>/fr/tag/cloudflare</code>, <code>/en/tag/nginx</code>, <code>/fr/tag/javascript</code>… URLs avec préfixe <code>/fr/</code> ou singulier <code>/tag/</code> jamais servi par nginx</li>
<li><strong>16 pages &ldquo;Exclue par la balise noindex&rdquo;</strong> : toutes des pages de redirection générées par <code>aliases:</code> dans le frontmatter Hugo</li>
<li><strong>Balise robots</strong> : <code>noodp</code> hardcodée dans le thème LoveIt</li>
<li><strong>Sitemap FR/EN</strong> : 104 vs 105 URLs — un tag doublon FR et deux tags manquants</li>
</ul>
<hr>
<h2 id="acte-1--aliases-hugo--redirections-nginx-301">Acte 1 : aliases Hugo → redirections nginx 301</h2>
<h3 id="pourquoi-hugo-génère-des-pages-noindex">Pourquoi Hugo génère des pages noindex</h3>
<p>Hugo génère les entrées <code>aliases:</code> du frontmatter comme des fichiers HTML statiques :</p>]]></description>
</item>
<item>
    <title>Hugo : gel des diagrammes Mermaid en SVG statiques dark/light</title>
    <link>https://www.arleo.eu/posts/debug-mermaid-svg-freeze/</link>
    <pubDate>Fri, 29 May 2026 20:00:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/debug-mermaid-svg-freeze/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/debug-mermaid-svg-freeze-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="problème">Problème</h2>
<p>Les diagrammes Mermaid sur arleo.eu rendaient côté client via <code>cdn.jsdelivr.net</code>. Trois conséquences concrètes :</p>
<ol>
<li><strong>CSP contrainte</strong> — <code>script-src cdn.jsdelivr.net</code> et <code>worker-src cdn.jsdelivr.net</code> obligatoires (Mermaid v11 utilise des Web Workers pour ses parsers).</li>
<li><strong>Flash de rendu</strong> — le diagramme apparaît après l&rsquo;exécution JS, créant un décalage visible.</li>
<li><strong>Thème dark ignoré</strong> — Mermaid initialisait le SVG en mode clair même quand le thème du site était dark.</li>
</ol>
<p>La solution : générer les SVG <strong>au build</strong> avec <code>mmdc</code>, en dehors de tout contexte navigateur.</p>]]></description>
</item>
<item>
    <title>CSP A&#43; sur Hugo &#43; Cloudflare : de hash-based à origin allowlist, monitoring auto et durcissement</title>
    <link>https://www.arleo.eu/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</link>
    <pubDate>Thu, 28 May 2026 23:40:12 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/csp-a-plus-hugo-cloudflare-origin-allowlist-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>arleo.eu tourne sur Hugo (VM KVM) → OpenResty (NUC) → Cloudflare (CDN/WAF). Objectif : score <strong>A+ sur Mozilla Observatory</strong> avec une CSP stricte qui résiste aux injections côté edge.</p>
<p>Le parcours a traversé trois stratégies en quelques semaines — nonces, hashes, puis origin allowlist — avant d&rsquo;aboutir à une solution stable et automatisée.</p>
<hr>
<h2 id="acte-1--pourquoi-hash-based-a-échoué">Acte 1 : pourquoi hash-based a échoué</h2>
<p>L&rsquo;idée de départ semblait solide : Hugo Pipes externalise tout le JS avec SRI, on liste les hashes dans la CSP, résultat propre. En pratique, deux problèmes ont rendu l&rsquo;approche impossible.</p>]]></description>
</item>
<item>
    <title>Postmortem — CrowdSec AppSec : faux positif heuristique sur Sonarr/Radarr</title>
    <link>https://www.arleo.eu/posts/postmortem-crowdsec-appsec-false-positive-sonarr/</link>
    <pubDate>Mon, 25 May 2026 20:51:17 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/postmortem-crowdsec-appsec-false-positive-sonarr/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/postmortem-crowdsec-appsec-false-positive-sonarr-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="résumé">Résumé</h2>
<p>Le <strong>25 mai 2026 vers 22h02 (heure locale)</strong>, Sonarr et Radarr sont devenus totalement inaccessibles depuis l&rsquo;IP maison (<code>82.XX.XX.XX</code>), retournant <strong>403</strong> sur toutes les URLs y compris <code>/login</code>. Le service était pourtant opérationnel. Le diagnostic initial suspectait les récents déploiements du refactor <code>crowdsec-cf-sync</code> — la cause réelle est un <strong>faux positif heuristique CrowdSec AppSec</strong>.</p>
<hr>
<h2 id="timeline">Timeline</h2>
<table>
  <thead>
      <tr>
          <th>Heure (locale)</th>
          <th>Événement</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>~22h00</td>
          <td>Cookie de session Sonarr expiré côté navigateur</td>
      </tr>
      <tr>
          <td>22h02:31</td>
          <td>Le navigateur charge la bibliothèque Sonarr → tente de charger 20+ <code>/MediaCover/*.jpg</code> simultanément</td>
      </tr>
      <tr>
          <td>22h02:31</td>
          <td>Sonarr retourne 302 → <code>/login</code> pour chaque image (session invalide)</td>
      </tr>
      <tr>
          <td>22h02:34</td>
          <td>La connexion SignalR WebSocket s&rsquo;établit (101) via <code>access_token</code> dans l&rsquo;URL</td>
      </tr>
      <tr>
          <td>~22h05</td>
          <td>CrowdSec AppSec déclenche la règle heuristique <code>http-probing</code> : rafale de requêtes échouées depuis la même IP</td>
      </tr>
      <tr>
          <td>22h11:37</td>
          <td>Toutes les requêtes de <code>82.XX.XX.XX</code> retournent 403 — <code>cs_reason=heuristic</code> dans les logs nginx</td>
      </tr>
      <tr>
          <td>22h13:34</td>
          <td>Même <code>/login</code> bloqué — l&rsquo;IP ne peut plus s&rsquo;authentifier</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="cause-racine">Cause racine</h2>
<p>CrowdSec AppSec maintient un <strong>état heuristique en mémoire</strong>, distinct des décisions LAPI. Lorsque le navigateur tente de charger simultanément de nombreuses ressources et reçoit des 302/403 de l&rsquo;application upstream (Sonarr), AppSec interprète cette rafale d&rsquo;échecs comme du sondage agressif (<code>http-probing</code>) et bloque l&rsquo;IP source.</p>]]></description>
</item>
<item>
    <title>CrowdSec AppSec &#43; OpenResty : WAF moderne sans ModSecurity</title>
    <link>https://www.arleo.eu/posts/crowdsec-appsec-openresty/</link>
    <pubDate>Mon, 18 May 2026 00:07:11 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/crowdsec-appsec-openresty/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/crowdsec-appsec-openresty-featured.jpg" referrerpolicy="no-referrer">
            </div><p>Après des années avec ModSecurity + OWASP CRS sur nginx, j&rsquo;ai migré arleo.eu vers une stack plus moderne : <strong>CrowdSec AppSec sur OpenResty</strong>. Le résultat est une architecture WAF inline mieux intégrée, plus facile à maintenir, et plus cohérente avec le reste de la stack de sécurité.</p>
<h2 id="pourquoi-abandonner-modsecurity-">Pourquoi abandonner ModSecurity ?</h2>
<p>ModSecurity v2 est en fin de vie active. Le maintien des règles OWASP CRS sur nginx classique génère de la friction : faux positifs fréquents, logs difficiles à corréler avec CrowdSec, et une configuration dispersée entre plusieurs outils sans vision unifiée.</p>]]></description>
</item>
<item>
    <title>SRI sur Hugo : hashes automatiques, auto-update et alerting BetterStack</title>
    <link>https://www.arleo.eu/posts/sri-cdn-hugo-automate/</link>
    <pubDate>Sun, 17 May 2026 00:00:00 &#43;0000</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/sri-cdn-hugo-automate/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/sri-cdn-hugo-automate-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="pourquoi-le-sri-">Pourquoi le SRI ?</h2>
<p>Quand votre site charge des ressources depuis un CDN tiers — FontAwesome, Mermaid, Animate.css — vous faites confiance à un tiers sur lequel vous n&rsquo;avez aucun contrôle. Si jsdelivr.net est compromis ou si une version « immuable » est mutée silencieusement, votre site peut devenir vecteur d&rsquo;attaque.</p>
<p>Le <strong>Subresource Integrity</strong> (SRI) résout ça simplement : chaque balise <code>&lt;link&gt;</code> ou <code>&lt;script&gt;</code> porte un attribut <code>integrity=&quot;sha256-…&quot;</code> que le navigateur vérifie avant d&rsquo;exécuter la ressource. Si le hash ne correspond pas, le navigateur bloque le chargement.</p>]]></description>
</item>
<item>
    <title>CSP Hash sur Hugo : migrer du nonce vers le hash pour préserver le cache CDN</title>
    <link>https://www.arleo.eu/posts/csp-hash-hugo/</link>
    <pubDate>Sat, 16 May 2026 00:00:00 &#43;0000</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/csp-hash-hugo/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/csp-hash-hugo-featured.png" referrerpolicy="no-referrer">
            </div>Le nonce CSP et le cache CDN sont incompatibles par design. Sur un site Hugo statique, le hash SHA-256 est l&rsquo;approche native : il est calculé au build, reste stable entre les requêtes, et laisse Cloudflare cacher le HTML.]]></description>
</item>
<item>
    <title>Postmortem : TypeIt cassé par Mermaid dans le thème LoveIt</title>
    <link>https://www.arleo.eu/posts/postmortem-typeit-mermaid/</link>
    <pubDate>Thu, 14 May 2026 09:44:43 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/postmortem-typeit-mermaid/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/postmortem-typeit-mermaid-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="tldr">TL;DR</h2>
<p>L&rsquo;animation typewriter du thème LoveIt (TypeIt) ne fonctionnait plus sur la home après l&rsquo;ajout de diagrammes Mermaid dans les posts. Cause : un sélecteur DOM <code>#id-1</code> partagé entre les deux librairies. Quand Mermaid trouve un bloc orphelin dans un résumé de home, son initialisation crash, et la chaîne d&rsquo;init JS s&rsquo;arrête avant d&rsquo;atteindre TypeIt. Fix : ajouter `</p>]]></description>
</item>
</channel>
</rss>
