<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Roadmap - Catégorie - arleo.eu</title><link>https://www.arleo.eu/categories/roadmap/</link><description>Roadmap - Catégorie - arleo.eu</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Sat, 09 May 2026 12:48:49 +0200</lastBuildDate><atom:link href="https://www.arleo.eu/categories/roadmap/" rel="self" type="application/rss+xml"/><item><title>Roadmap : faut-il migrer les 16 articles vers content/posts/ ?</title><link>https://www.arleo.eu/posts/roadmap-migration-content-posts/</link><pubDate>Sat, 09 May 2026 12:48:49 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/posts/roadmap-migration-content-posts/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-migration-content-posts-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="statut---réflexion--décision-en-attente">Statut : 🤔 RÉFLEXION — décision en attente</h2>
<p>Cette page documente une question d&rsquo;architecture de contenu Hugo pour laquelle je n&rsquo;ai pas encore tranché.</p>
<h2 id="le-contexte">Le contexte</h2>
<p>Le thème LoveIt (que utilise arleo.eu) suit la convention Hugo recommandée : les articles de blog vont dans <code>content/posts/</code>. La home filtre <code>where .Site.RegularPages &quot;Type&quot; &quot;posts&quot;</code>.</p>
<p>Or, par historique de migration depuis Grav, mes 16 articles éditoriaux sont à la <strong>racine</strong> de <code>content/</code>, pas dans <code>content/posts/</code> :</p>
<div class="code-block code-line-numbers open" data-start="0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copier dans le presse-papiers"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>content/
├── csp-nonce/index.fr.md          ← article
├── post-mortem-522-wan-failover/  ← article
├── jquery-migration/              ← article
├── ...
├── privacy-policies/              ← page de référence (footer)
├── documentation/                 ← page de référence (menu)
└── scripts/                       ← page de référence (menu)</code></pre></div>
<p>Hugo considère par défaut tous ces dossiers comme des pages de &ldquo;Type: page&rdquo;, pas &ldquo;Type: posts&rdquo;. Donc le filtre LoveIt sur la home ne les voit pas, et je dois soit overrider <code>layouts/index.html</code>, soit filtrer manuellement.</p>
<h2 id="la-question">La question</h2>
<p>Faut-il migrer les 16 articles vers <code>content/posts/</code> pour suivre la convention LoveIt, ou les laisser à la racine ?</p>
<h2 id="option-a--migrer-vers-contentposts">Option A — Migrer vers <code>content/posts/</code></h2>
<div class="code-block code-line-numbers open" data-start="0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copier dans le presse-papiers"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>content/
├── posts/
│   ├── csp-nonce/index.fr.md
│   ├── post-mortem-522-wan-failover/
│   ├── jquery-migration/
│   └── ...
├── privacy-policies/
├── documentation/
└── scripts/</code></pre></div>
<h3 id="avantages">Avantages</h3>
<ul>
<li><strong>Conformité au thème</strong> : pas d&rsquo;override de layouts nécessaire</li>
<li><strong>Lisibilité repo</strong> : on voit immédiatement quels dossiers sont des articles vs des pages de référence</li>
<li><strong>Évolutivité</strong> : si LoveIt évolue (nouvelles features sur Type=posts), elles s&rsquo;appliquent gratuitement</li>
<li><strong>Mental model</strong> standard : tout dev Hugo qui découvre le repo comprend instantanément</li>
</ul>
<h3 id="inconvénients">Inconvénients</h3>
<ul>
<li><strong>Changement d&rsquo;URL</strong> : <code>/csp-nonce/</code> deviendrait <code>/posts/csp-nonce/</code> par défaut. Casse tous les liens entrants (Google, Reddit, hackernews, mes propres articles internes)</li>
<li><strong>Mitigation possible</strong> via <code>url:</code> explicite dans le front matter : <code>url: /csp-nonce/</code> — Hugo génère alors la page à <code>/csp-nonce/</code> même si le source est dans <code>posts/</code>. Les URLs sont préservées.</li>
<li><strong>Friction migration</strong> : 16 dossiers à déplacer, 16 fichiers à éditer pour ajouter <code>url:</code></li>
<li><strong>Liens internes</strong> dans le contenu Markdown — nombreux articles se citent les uns les autres. À auditer pour s&rsquo;assurer qu&rsquo;ils restent corrects.</li>
</ul>
<h2 id="option-b--garder-la-racine">Option B — Garder la racine</h2>
<div class="code-block code-line-numbers open" data-start="0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copier dans le presse-papiers"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>content/
├── csp-nonce/index.fr.md
├── post-mortem-522-wan-failover/
├── ...
├── privacy-policies/
├── documentation/
└── scripts/</code></pre></div>
<h3 id="avantages-1">Avantages</h3>
<ul>
<li><strong>URLs identiques</strong> sans rien faire — <code>/csp-nonce/</code> reste <code>/csp-nonce/</code></li>
<li><strong>Pas de migration</strong> : 0 fichier touché</li>
<li><strong>Liens internes</strong> : intacts par définition</li>
<li><strong>Override <code>layouts/home.html</code> déjà en place</strong> : 1 ligne de différence, ça marche</li>
</ul>
<h3 id="inconvénients-1">Inconvénients</h3>
<ul>
<li><strong>Override custom</strong> à maintenir si LoveIt évolue</li>
<li><strong>Lisibilité repo</strong> : pages de référence et articles mélangés à la racine</li>
<li><strong>Convention bizarre</strong> : un dev Hugo découvrant le repo se demande pourquoi pas de <code>posts/</code></li>
</ul>
<h2 id="considérations-seo">Considérations SEO</h2>
<p>Le SEO craint le changement d&rsquo;URL. Si je migre vers <code>posts/</code> SANS <code>url:</code> override, les 16 articles passent de <code>arleo.eu/csp-nonce/</code> à <code>arleo.eu/posts/csp-nonce/</code>. Cloudflare cache, Google indexe, robots.txt connaît la map du site… tout doit être ré-indexé.</p>
<p>Avec <code>url:</code> override (Option A v2), aucun changement d&rsquo;URL. Mais alors quel est l&rsquo;intérêt de migrer ? Juste la lisibilité du repo. Le coût (16 fichiers à éditer) vs le bénéfice (lisibilité interne) → probablement pas rentable.</p>
<h2 id="considérations-hugo-mcp">Considérations Hugo MCP</h2>
<p>Les outils MCP que j&rsquo;utilise pour éditer le contenu (<code>hugo-mcp</code> v1.8.1) acceptent une route comme paramètre : <code>create_page(route=&quot;/csp-nonce&quot;)</code>. Le mapping route → fichier est défini par Hugo.</p>
<p>Si je migre vers <code>posts/</code> :</p>
<ul>
<li>Avec <code>url:</code> override : MCP appelle <code>create_page(route=&quot;/csp-nonce&quot;)</code>, le fichier est créé à <code>content/posts/csp-nonce/index.fr.md</code> mais la page est servie à <code>/csp-nonce/</code>. Workflow inchangé pour l&rsquo;utilisateur.</li>
<li>Sans <code>url:</code> override : MCP doit appeler <code>create_page(route=&quot;/posts/csp-nonce&quot;)</code>. Workflow différent. Tous les articles existants tombent sur des routes inconnues.</li>
</ul>
<p>Je penche fortement pour l&rsquo;Option A v2 (migration + <code>url:</code> override) si je migre.</p>
<h2 id="la-décision-provisoire">La décision (provisoire)</h2>]]></description></item><item><title>Roadmap : Sprint sécurité MCP — 4 domaines, 10 chantiers (LIVRÉ ✅)</title><link>https://www.arleo.eu/posts/roadmap-sprint-securite-mcp/</link><pubDate>Sat, 09 May 2026 12:47:59 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/posts/roadmap-sprint-securite-mcp/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-sprint-securite-mcp-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="statut---livré--sprint-clos-le-9-mai-2026">Statut : ✅ LIVRÉ — sprint clos le 9 mai 2026</h2>
<p><strong>Mise à jour 9 mai 2026 (fin de session)</strong> : les 10 chantiers sont livrés en une session marathon, et <strong>les 3 releases coordonnées sont publiées</strong> (<code>hugo-mcp</code> v1.9.0, <code>mcp-oauth-proxy</code> v2.1.0, <code>mcp-installer</code> v1.3.0). Tout l&rsquo;écosystème MCP est durci dans la même journée. Recap technique complet : <a href="/posts/sprint-securite-mcp-livre/" rel="">Sprint sécurité MCP livré : v1.9.0, 10 chantiers, écosystème durci</a>.</p>
<p>Cette page reste publiée à fins d&rsquo;archive — pour montrer la trajectoire d&rsquo;un sprint annoncé puis tenu. Tout le contenu original ci-dessous est préservé.</p>
<hr>
<h2 id="statut-original-avant-livraison">Statut original (avant livraison)</h2>
<p>Cette page documentait publiquement un sprint de hardening en cours sur l&rsquo;infrastructure MCP d&rsquo;arleo.eu. Pour des raisons de sécurité, les détails précis des chantiers n&rsquo;étaient pas exposés tant que les correctifs n&rsquo;étaient pas livrés (philosophie &ldquo;sec-first&rdquo; : ne pas publier de roadmap d&rsquo;attaque).</p>
<h2 id="pourquoi-cette-transparence">Pourquoi cette transparence</h2>
<p>J&rsquo;ai débattu de publier ou non cette page. Arguments pour la transparence :</p>
<ul>
<li><strong>Engagement public</strong> = pression saine sur soi-même pour livrer</li>
<li><strong>Documentation</strong> d&rsquo;un homelab dont l&rsquo;objectif est apprendre et partager</li>
<li><strong>Honnêteté</strong> vis-à-vis des lecteurs qui consomment les autres articles techniques</li>
</ul>
<p>Arguments contre :</p>
<ul>
<li><strong>Roadmap d&rsquo;attaque</strong> : si je liste précisément ce qui n&rsquo;est pas encore protégé, je donne des indices à un attaquant patient</li>
<li><strong>Pression artificielle</strong> : annoncer un sprint puis ne pas livrer = pire que ne rien annoncer</li>
</ul>
<p>Compromis adopté : publier la <strong>direction</strong> et les <strong>domaines de hardening</strong> sans préciser ce qui est faible aujourd&rsquo;hui. Détail technique précis publié à la livraison.</p>
<h2 id="domaines-couverts-par-le-sprint">Domaines couverts par le sprint</h2>
<p>Le sprint couvrait 10 chantiers regroupés en 4 domaines :</p>
<h3 id="1-hardening-applicatif-fastapi--pydantic">1. Hardening applicatif (FastAPI + Pydantic)</h3>
<p>Renforcement des couches d&rsquo;entrée du MCP : validation stricte des inputs, gestion d&rsquo;erreurs unifiée, pas de leak d&rsquo;information dans les responses (stack traces, paths internes, versions de libs).</p>
<h3 id="2-authentification-et-tokens">2. Authentification et tokens</h3>
<p>Refonte de la gestion des tokens d&rsquo;accès au MCP : durée de vie, rotation, révocation, hashing en stockage. Permettre de couper l&rsquo;accès d&rsquo;un client compromis sans redéployer le service.</p>
<h3 id="3-observabilité-et-audit">3. Observabilité et audit</h3>
<p>Intégration de logs structurés JSON ingérés dans BetterStack via Vector. Chaque appel MCP doit produire un événement traçable : qui, quoi, quand, durée, statut. Permet la détection d&rsquo;anomalies en quasi-temps réel.</p>
<h3 id="4-infrastructure-et-résilience">4. Infrastructure et résilience</h3>
<p>TLS pour le trafic interne entre le NUC et la VM, règles ModSec dédiées au path <code>/mcp</code>, runbook de récupération en cas de désastre (vol de tokens, compromise serveur, perte de données).</p>
<h2 id="ce-qui-était-déjà-en-place-avant-le-sprint">Ce qui était déjà en place avant le sprint</h2>
<p>Pour ne pas créer de fausse impression, voici les couches <strong>déjà en place</strong> sur l&rsquo;infrastructure avant le sprint (donc hors scope) :</p>
<ul>
<li>nginx + TLS 1.3 obligatoire (Mozilla Modern config)</li>
<li>Cloudflare WAF + Bot Management + IP whitelist</li>
<li>ModSecurity + OWASP CRS 4.x sur tous les vhosts</li>
<li>CrowdSec en mode WAF + bouncer Cloudflare</li>
<li>systemd hardening niveau 1.7 (cf. <a href="/posts/hardening-systemd-mcp/" rel="">hardening systemd</a>)</li>
<li>HMAC validation sur les webhooks</li>
<li>Frontmatter validation Pydantic (1 chantier sur 4 dans la catégorie validation)</li>
</ul>
<p>Le sprint visait à <strong>compléter</strong> cette base, pas à la remplacer.</p>
<h2 id="méthode">Méthode</h2>
<p>Pour chaque chantier :</p>
<ol>
<li>Implémenté en local + tests unitaires</li>
<li>Validé sur <code>mcp-test-vm</code> (VM de pré-prod)</li>
<li>Déployé sur prod uniquement après tests réussis</li>
<li>Audit log structuré JSON pour traçabilité du déploiement</li>
<li>Article post-mortem ou write-up technique publié <strong>après</strong> livraison</li>
</ol>
<p>Aucun déploiement direct prod sans étape pré-prod.</p>
<h2 id="releases-publiées">Releases publiées</h2>]]></description></item><item><title>Roadmap : Webhook Git → rebuild Hugo automatique</title><link>https://www.arleo.eu/posts/roadmap-webhook-git-rebuild/</link><pubDate>Sat, 09 May 2026 12:47:17 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/posts/roadmap-webhook-git-rebuild/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-webhook-git-rebuild-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="statut---backlog--pas-encore-implémenté">Statut : 🗂️ BACKLOG — pas encore implémenté</h2>
<p>Cette page documente une intention d&rsquo;architecture qui sera implémentée dans une prochaine itération. Le code n&rsquo;est pas encore en prod.</p>
<h2 id="contexte">Contexte</h2>
<p>Dans la <a href="/posts/strategie-4-mcp-vs-git/" rel="">Stratégie 4 (séparation MCP / Git)</a>, j&rsquo;ai expliqué pourquoi <code>content/</code> est dans <code>.gitignore</code> côté repo arleo.eu : pour qu&rsquo;aucun conflit ne soit possible entre l&rsquo;écriture MCP et l&rsquo;écriture Git.</p>
<p>Concrètement, ça veut dire que quand je push depuis VS Code une nouvelle version de <code>layouts/</code>, <code>themes/</code>, <code>static/</code>, <code>hugo.toml</code>, ou <code>deploy.sh</code>, <strong>rien ne se passe automatiquement</strong> côté serveur. Je dois SSH dans la VM Hugo et faire <code>git pull &amp;&amp; hugo --minify &amp;&amp; rsync</code> à la main.</p>
<p>C&rsquo;est pas critique (push de structure = ~1× par semaine), mais c&rsquo;est de la friction inutile. Donc : webhook GitHub → rebuild auto.</p>
<h2 id="architecture-cible">Architecture cible</h2>]]></description></item></channel></rss>