<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare Pages on kenji.blog</title><link>http://kenji.blog/fr/tags/cloudflare-pages/</link><description>Recent content in Cloudflare Pages on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/cloudflare-pages/index.xml" rel="self" type="application/rss+xml"/><item><title>Comment héberger un blog Hugo gratuitement et à une vitesse fulgurante sur Cloudflare Pages ou GitHub Pages</title><link>http://kenji.blog/fr/p/hugo-hosting-cloudflare-vs-github-pages/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/hugo-hosting-cloudflare-vs-github-pages/</guid><description>&lt;img src="http://kenji.blog/p/hugo-hosting-cloudflare-vs-github-pages/img/eyecatch.jpg" alt="Featured image of post Comment héberger un blog Hugo gratuitement et à une vitesse fulgurante sur Cloudflare Pages ou GitHub Pages" />&lt;p>Lors de la gestion d&amp;rsquo;un site web ou d&amp;rsquo;un blog, la vitesse d&amp;rsquo;affichage (performances), les coûts d&amp;rsquo;exploitation et la sécurité sont des éléments cruciaux. Autrefois, la combinaison d&amp;rsquo;un CMS dynamique (comme WordPress) et d&amp;rsquo;un serveur d&amp;rsquo;hébergement partagé était la norme, mais aujourd&amp;rsquo;hui, l&amp;rsquo;architecture appelée &amp;ldquo;Jamstack&amp;rdquo; attire beaucoup l&amp;rsquo;attention. Parmi ses solutions, l&amp;rsquo;association de &amp;ldquo;Hugo&amp;rdquo;, un générateur de sites statiques (SSG) ultra-rapide écrit en langage Go, avec des services d&amp;rsquo;hébergement modernes comme Cloudflare Pages ou GitHub Pages, permet de construire un environnement de blog &lt;strong>totalement gratuit et extrêmement rapide&lt;/strong>.&lt;/p>
&lt;p>Dans cet article, nous plongerons profondément dans les détails techniques : les étapes concrètes pour publier un site statique utilisant Hugo sur Cloudflare Pages ou GitHub Pages, les différences d&amp;rsquo;architecture entre ces plateformes, la mise en place d&amp;rsquo;une CI/CD (Intégration Continue / Déploiement Continu) avec GitHub Actions, l&amp;rsquo;optimisation des DNS, les stratégies de cache, et enfin l&amp;rsquo;intégration d&amp;rsquo;une analyse d&amp;rsquo;audience respectueuse de la vie privée.&lt;/p>
&lt;hr>
&lt;h2 id="1-les-bases-des-générateurs-de-sites-statiques-ssg-et-de-jamstack">1. Les bases des générateurs de sites statiques (SSG) et de Jamstack
&lt;/h2>&lt;h3 id="11-pourquoi-un-site-statique-">1.1 Pourquoi un site statique ?
&lt;/h3>&lt;p>Les CMS dynamiques traditionnels (par exemple WordPress) exécutent des requêtes vers une base de données (comme MySQL) à chaque demande d&amp;rsquo;un utilisateur, et génèrent dynamiquement du HTML côté serveur (avec PHP, par exemple) pour le renvoyer. Bien que cette approche offre une grande flexibilité, elle a une faible résistance aux pics de trafic (les &amp;ldquo;buzz&amp;rdquo; ou les attaques DDoS) et a tendance à complexifier l&amp;rsquo;infrastructure, nécessitant souvent le placement d&amp;rsquo;un serveur de cache (Redis ou Varnish) en amont.&lt;/p>
&lt;p>D&amp;rsquo;un autre côté, avec un générateur de sites statiques (SSG) adoptant l&amp;rsquo;architecture Jamstack (JavaScript, APIs, and Markup), tous les fichiers HTML, CSS et JavaScript sont générés à l&amp;rsquo;avance (lors de la phase de build). Lorsqu&amp;rsquo;un utilisateur effectue une requête, le serveur web (ou le CDN) se contente de renvoyer les fichiers statiques déjà générés. Cela permet d&amp;rsquo;obtenir une vitesse fulgurante et une sécurité très robuste.&lt;/p>
&lt;h3 id="12-lavantage-de-hugo">1.2 L&amp;rsquo;avantage de Hugo
&lt;/h3>&lt;p>Il existe de nombreuses options pour les SSG telles que Next.js, Gatsby, Jekyll ou Astro, mais la plus grande caractéristique de Hugo est sa &lt;strong>vitesse de compilation (build)&lt;/strong>. Bénéficiant du traitement asynchrone et concurrentiel du langage Go, il peut compiler un site de plusieurs milliers ou dizaines de milliers de pages en quelques secondes seulement. Cela réduit considérablement le temps d&amp;rsquo;attente dans les pipelines CI/CD, ce qui se traduit directement par une amélioration de l&amp;rsquo;expérience développeur (DX : Developer Experience).&lt;/p>
&lt;hr>
&lt;h2 id="2-comparaison-des-architectures-des-services-dhébergement">2. Comparaison des architectures des services d&amp;rsquo;hébergement
&lt;/h2>&lt;p>Le prochain défi consiste à déterminer où héberger les fichiers statiques générés par Hugo. Les choix typiques incluent Cloudflare Pages, GitHub Pages et Netlify, mais chacun d&amp;rsquo;entre eux possède une architecture réseau sous-jacente différente.&lt;/p>
&lt;h3 id="21-cdn-et-edge-computing">2.1 CDN et Edge Computing
&lt;/h3>&lt;p>Toutes ces plateformes distribuent le contenu en utilisant des CDN (Content Delivery Network) répartis mondialement. Cependant, leur facteur de différenciation réside dans leur capacité, au-delà de la simple mise en cache de fichiers statiques, à utiliser &amp;ldquo;l&amp;rsquo;informatique en périphérie&amp;rdquo; (edge computing) pour effectuer le routage des requêtes ou la réécriture des en-têtes directement depuis le PoP (Point of Presence) le plus proche de l&amp;rsquo;utilisateur.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Utilisateur (Tokyo)&amp;#34;] --&amp;gt;|Faible latence| B[&amp;#34;Nœud Edge (NRT)&amp;#34;]
C[&amp;#34;Utilisateur (New York)&amp;#34;] --&amp;gt;|Faible latence| D[&amp;#34;Nœud Edge (EWR)&amp;#34;]
E[&amp;#34;Utilisateur (Londres)&amp;#34;] --&amp;gt;|Faible latence| F[&amp;#34;Nœud Edge (LHR)&amp;#34;]
B --&amp;gt; G[&amp;#34;Stockage d&amp;#39;origine / Object Store&amp;#34;]
D --&amp;gt; G
F --&amp;gt; G
&lt;/pre>
&lt;h3 id="22-github-pages">2.2 GitHub Pages
&lt;/h3>&lt;p>GitHub Pages est un service qui permet de publier des fichiers HTML, CSS et JavaScript directement depuis un dépôt GitHub. En arrière-plan, il utilise des CDN comme Fastly et offre des performances tout à fait satisfaisantes. Toutefois, ses fonctionnalités en tant qu&amp;rsquo;infrastructure pure sont un peu modestes : il existe des restrictions sur la personnalisation des en-têtes (par exemple, la configuration de &lt;code>Cache-Control&lt;/code> ou des en-têtes de sécurité) et la configuration des redirections dépend des meta refresh HTML ou des plugins Jekyll.&lt;/p>
&lt;h3 id="23-cloudflare-pages">2.3 Cloudflare Pages
&lt;/h3>&lt;p>Cloudflare Pages est un service d&amp;rsquo;hébergement de sites statiques construit sur le plus grand réseau Anycast au monde dont Cloudflare est fier (déployé dans plus de 275 villes).
Il offre d&amp;rsquo;immenses possibilités d&amp;rsquo;optimisation des performances, telles que la prise en charge standard de HTTP/3 (QUIC), l&amp;rsquo;optimisation des images et l&amp;rsquo;intégration de fonctions en périphérie (Cloudflare Workers). De plus, il n&amp;rsquo;y a pas de facturation pour la bande passante, ce qui permet de l&amp;rsquo;utiliser gratuitement même en cas d&amp;rsquo;augmentation fulgurante du trafic.&lt;/p>
&lt;h3 id="24-netlify">2.4 Netlify
&lt;/h3>&lt;p>Netlify est un pionnier de la Jamstack et offre une expérience développeur (DX) tout-en-un intégrant des fonctionnalités de formulaire, d&amp;rsquo;authentification (Identity), de fonctions serverless, etc. Cependant, si vous dépassez la bande passante gratuite (100 Go par mois), des frais de paiement à l&amp;rsquo;usage élevés sont appliqués. Par conséquent, il est nécessaire de faire attention à la gestion des coûts pour les blogs qui utilisent beaucoup d&amp;rsquo;images ou de vidéos.&lt;/p>
&lt;hr>
&lt;h2 id="3-calcul-théorique-des-performances-et-de-la-latence-modèle-mathématique-avec-latex">3. Calcul théorique des performances et de la latence (Modèle mathématique avec LaTeX)
&lt;/h2>&lt;p>Lors de l&amp;rsquo;évaluation des performances web, la réduction de la latence est l&amp;rsquo;indicateur le plus important. Modélisons à quel point la latence est réduite en utilisant un CDN (Edge) par rapport à un accès direct au serveur d&amp;rsquo;origine.&lt;/p>
&lt;p>Soit $C$ le taux de réussite du cache (Cache Hit Ratio), c&amp;rsquo;est-à-dire la probabilité que la requête de l&amp;rsquo;utilisateur accède au cache. On a $0 \le C \le 1$.
Soit $L_{origin}$ la latence vers le serveur d&amp;rsquo;origine, et $L_{edge}$ la latence vers le nœud Edge le plus proche.&lt;/p>
&lt;p>La nouvelle latence moyenne $L_{new}$ se calcule avec l&amp;rsquo;espérance mathématique suivante :&lt;/p>
$$ L_{new} = C \times L_{edge} + (1 - C) \times (L_{edge} + L_{origin}) $$&lt;p>En simplifiant cette équation, nous obtenons :&lt;/p>
$$ L_{new} = L_{edge} + (1 - C) \times L_{origin} $$&lt;p>Par exemple, si un utilisateur à Tokyo accède à un serveur d&amp;rsquo;origine situé sur la côte est des États-Unis (New York), en tenant compte de la distance physique de la fibre optique et du délai de traitement par les routeurs, $L_{origin}$ sera d&amp;rsquo;environ 200 ms. En revanche, si on utilise un CDN comme Cloudflare, l&amp;rsquo;utilisateur peut se connecter à un nœud Edge à Tokyo, ce qui réduit $L_{edge}$ à environ 10 ms.&lt;/p>
&lt;p>Si le taux de réussite du cache est de $C = 0.95$ (95 %),&lt;/p>
$$ L_{new} = 10 + (1 - 0.95) \times 200 = 10 + 0.05 \times 200 = 10 + 10 = 20 \text{ ms} $$&lt;p>Ainsi, l&amp;rsquo;introduction d&amp;rsquo;un CDN permet de réduire de façon spectaculaire (d&amp;rsquo;environ 90 %) la latence moyenne, qui passe de 210 ms à 20 ms.&lt;/p>
&lt;hr>
&lt;h2 id="4-mise-en-place-dun-pipeline-cicd-avec-github-actions">4. Mise en place d&amp;rsquo;un pipeline CI/CD avec GitHub Actions
&lt;/h2>&lt;p>Pour automatiser le processus de mise à jour de notre blog Hugo, nous allons configurer un pipeline CI/CD utilisant GitHub Actions. De cette façon, il suffira de rédiger un article en Markdown localement et de faire un &lt;code>git push&lt;/code> pour lancer automatiquement le build et le déployer sur Cloudflare Pages ou GitHub Pages.&lt;/p>
&lt;p>Le diagramme de séquence ci-dessous illustre le flux global depuis le Push d&amp;rsquo;un article jusqu&amp;rsquo;à sa distribution à l&amp;rsquo;utilisateur.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Utilisateur (Auteur)&amp;#34;
participant G as &amp;#34;Dépôt GitHub&amp;#34;
participant A as &amp;#34;GitHub Actions&amp;#34;
participant C as &amp;#34;Cloudflare Pages&amp;#34;
participant V as &amp;#34;Visiteur&amp;#34;
U-&amp;gt;&amp;gt;G: &amp;#34;git push origin main&amp;#34;
G-&amp;gt;&amp;gt;A: &amp;#34;Déclenche l&amp;#39;événement Push&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;Checkout &amp;amp; Setup Hugo&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;hugo --minify (Build)&amp;#34;
A-&amp;gt;&amp;gt;C: &amp;#34;Déploiement vers Cloudflare Pages (Direct Upload)&amp;#34;
C--&amp;gt;&amp;gt;A: &amp;#34;URL de déploiement (Succès)&amp;#34;
V-&amp;gt;&amp;gt;C: &amp;#34;Requête pour la page web&amp;#34;
C--&amp;gt;&amp;gt;V: &amp;#34;Renvoie le HTML mis en cache (Edge)&amp;#34;
&lt;/pre>
&lt;h3 id="41-configuration-du-déploiement-pour-cloudflare-pages-direct-upload">4.1 Configuration du déploiement pour Cloudflare Pages (Direct Upload)
&lt;/h3>&lt;p>Avec Cloudflare Pages, il existe deux méthodes : lier un dépôt GitHub pour effectuer le build sur l&amp;rsquo;infrastructure de Cloudflare, ou utiliser « Direct Upload » pour transférer directement les fichiers statiques générés par GitHub Actions. Si vous souhaitez gérer plus strictement la version de Hugo et la combiner avec d&amp;rsquo;autres tâches (comme les tests ou l&amp;rsquo;optimisation des images), il est recommandé de compiler sur GitHub Actions et d&amp;rsquo;utiliser la méthode Direct Upload.&lt;/p>
&lt;p>Voici un exemple pratique de fichier &lt;code>.github/workflows/deploy.yml&lt;/code> pour un déploiement vers Cloudflare Pages.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy Hugo site to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build-and-deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ubuntu-latest&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Checkout repository&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;actions/checkout@v4&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;recursive&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Setup Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;peaceiris/actions-hugo@v3&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.125.0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Build Hugo Site&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;hugo --minify --gc&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_ENVIRONMENT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;production&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;cloudflare/pages-action@v1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">apiToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_API_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">accountId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_ACCOUNT_ID }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">projectName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;your-project-name&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">directory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;public&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">gitHubToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.GITHUB_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dans ce pipeline, l&amp;rsquo;option &lt;code>--minify&lt;/code> est utilisée pour minifier le HTML/CSS/JS, et &lt;code>--gc&lt;/code> est utilisé pour supprimer les fichiers inutiles. Ce sont les bases de l&amp;rsquo;optimisation des performances.&lt;/p>
&lt;hr>
&lt;h2 id="5-examen-approfondi-de-la-configuration-dns--domaine-personnalisé-et-enregistrements-cname--alias">5. Examen approfondi de la configuration DNS : Domaine personnalisé et enregistrements CNAME / ALIAS
&lt;/h2>&lt;p>Lors de l&amp;rsquo;utilisation d&amp;rsquo;un domaine personnalisé (par exemple, &lt;code>kenji.blog&lt;/code>), une configuration appropriée du DNS (Domain Name System) est indispensable.&lt;/p>
&lt;h3 id="51-restrictions-des-enregistrements-cname-et-zone-apex">5.1 Restrictions des enregistrements CNAME et Zone Apex
&lt;/h3>&lt;p>Normalement, lorsque vous pointez un sous-domaine (par exemple &lt;code>www.kenji.blog&lt;/code>) vers un service externe, vous utilisez un enregistrement &lt;code>CNAME&lt;/code>. Cependant, selon les spécifications DNS (RFC 1034), il n&amp;rsquo;est pas possible de configurer un enregistrement &lt;code>CNAME&lt;/code> pour le domaine racine (également appelé Zone Apex ou domaine nu, par ex. &lt;code>kenji.blog&lt;/code>). La raison est que la Zone Apex doit contenir obligatoirement un enregistrement SOA (Start of Authority), un enregistrement NS (Name Server) ou un enregistrement MX (Mail Exchange), et la règle dicte que le CNAME ne peut pas coexister avec d&amp;rsquo;autres enregistrements de ressources.&lt;/p>
&lt;h3 id="52-solutions--alias--aname--cname-flattening">5.2 Solutions : ALIAS / ANAME / CNAME Flattening
&lt;/h3>&lt;p>Pour résoudre ce problème, les fournisseurs DNS modernes offrent leurs propres fonctionnalités étendues.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Enregistrement ALIAS / ANAME&lt;/strong> : Le serveur DNS effectue dynamiquement la résolution de nom et renvoie l&amp;rsquo;enregistrement A final (adresse IP) au client. Des services comme Amazon Route 53 le prennent en charge.&lt;/li>
&lt;li>&lt;strong>CNAME Flattening&lt;/strong> : C&amp;rsquo;est une fonctionnalité offerte par Cloudflare. Elle agit comme si vous aviez configuré un CNAME sur votre Zone Apex, mais le serveur DNS faisant autorité de Cloudflare renvoie de manière transparente au client les adresses IP résolues automatiquement (enregistrements A et AAAA).&lt;/li>
&lt;/ul>
&lt;p>Si vous utilisez Cloudflare Pages, déléguer les serveurs de noms de votre domaine à Cloudflare et exploiter ce &amp;ldquo;CNAME Flattening&amp;rdquo; sera la configuration la plus transparente et la plus performante.&lt;/p>
&lt;hr>
&lt;h2 id="6-stratégies-de-cache-et-contrôle-des-en-têtes-http">6. Stratégies de cache et contrôle des en-têtes HTTP
&lt;/h2>&lt;p>Une autre clé pour accélérer les sites statiques est la &amp;ldquo;stratégie de cache&amp;rdquo;. Avec Cloudflare Pages, vous pouvez utiliser un fichier généré (le fichier &lt;code>_headers&lt;/code>) pour contrôler en détail les en-têtes de réponse HTTP.&lt;/p>
&lt;h3 id="61-edge-cache-vs-cache-du-navigateur">6.1 Edge Cache vs Cache du navigateur
&lt;/h3>&lt;p>Il existe deux grands types de cache : le &amp;ldquo;Edge Cache&amp;rdquo;, conservé du côté du CDN, et le &amp;ldquo;Cache du navigateur&amp;rdquo; (Browser Cache), stocké dans le navigateur de l&amp;rsquo;utilisateur.&lt;/p>
&lt;p>Pour les fichiers statiques (images, CSS, JS, etc. dont le nom de fichier inclut un hachage), l&amp;rsquo;idéal est de les mettre en cache sur le navigateur pendant une longue période. En revanche, pour que les mises à jour des fichiers HTML soient reflétées immédiatement, il est courant de raccourcir (ou de désactiver) le cache du navigateur et de traiter la requête via l&amp;rsquo;Edge Cache.&lt;/p>
&lt;p>Exemple de configuration de &lt;code>_headers&lt;/code> dans Cloudflare Pages :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Les fichiers HTML ne sont pas mis en cache par le navigateur et sont validés à chaque fois
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*.html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=0, must-revalidate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Les fichiers d&amp;#39;assets (CSS/JS/images) sont mis en cache sur le navigateur pendant 1 an
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/assets/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/img/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-formule-de-calcul-pour-la-réduction-des-coûts-de-bande-passante">6.2 Formule de calcul pour la réduction des coûts de bande passante
&lt;/h3>&lt;p>La configuration d&amp;rsquo;en-têtes de cache appropriés permet de réduire considérablement la quantité de données transférées depuis le serveur (Edge). Le coût mensuel de la bande passante $Cost$ peut être modélisé avec la quantité de transfert de chaque ressource $B_i$, le taux de réussite du cache $C_i$, et le coût unitaire de la bande passante $R$ comme suit :&lt;/p>
$$ Cost = \sum_{i=1}^{n} \left( B_i \times (1 - C_i) \times R \right) $$&lt;p>Étant donné que le transfert de données sortant est gratuit sur Cloudflare ($R = 0$), le coût financier direct sera de $0$. Cependant, si vous utilisez en parallèle d&amp;rsquo;autres infrastructures comme GitHub Pages, ou si vous utilisez AWS S3 comme backend, maximiser ce taux de réussite de cache $C_i$ sera la clé pour réduire les coûts d&amp;rsquo;infrastructure.&lt;/p>
&lt;hr>
&lt;h2 id="7-analyses-daudience-combinant-confidentialité-et-performances">7. Analyses d&amp;rsquo;audience combinant confidentialité et performances
&lt;/h2>&lt;p>Lors de la gestion d&amp;rsquo;un blog, l&amp;rsquo;analyse d&amp;rsquo;audience (Web Analytics) est essentielle pour savoir combien d&amp;rsquo;utilisateurs le visitent. Pendant longtemps, Google Analytics (GA4) a été le standard de facto, mais face aux récentes tendances de protection de la vie privée (RGPD, CCPA) et à la suppression progressive des cookies tiers, la situation évolue.&lt;/p>
&lt;h3 id="71-impact-sur-les-performances-web">7.1 Impact sur les performances web
&lt;/h3>&lt;p>L&amp;rsquo;intégration de Google Analytics (plus particulièrement &lt;code>gtag.js&lt;/code> ou Google Tag Manager) entraîne le chargement et l&amp;rsquo;exécution de nombreux scripts externes, ce qui a un impact négatif sur les performances (surtout sur le TTFB et le temps de blocage du thread principal).&lt;/p>
&lt;p>Prenons le temps de décomposer le temps de chargement d&amp;rsquo;un site de la façon suivante :&lt;/p>
&lt;pre class="mermaid">
pie title Répartition typique des temps de chargement d&amp;#39;un site
&amp;#34;TTFB (Time to First Byte)&amp;#34; : 15
&amp;#34;Téléchargement du contenu (HTML/CSS)&amp;#34; : 20
&amp;#34;Analyse du DOM et Rendu&amp;#34; : 45
&amp;#34;Analytique &amp;amp; JS Tiers&amp;#34; : 20
&lt;/pre>
&lt;p>Il n&amp;rsquo;est pas rare que les outils d&amp;rsquo;analyse JS tiers représentent environ 20 % à 30 % du temps de chargement global.&lt;/p>
&lt;h3 id="72-mise-en-place-de-cloudflare-web-analytics">7.2 Mise en place de Cloudflare Web Analytics
&lt;/h3>&lt;p>C&amp;rsquo;est pourquoi les solutions d&amp;rsquo;analyse &amp;ldquo;privacy-first&amp;rdquo; qui n&amp;rsquo;utilisent pas de cookies (cookieless), comme Cloudflare Web Analytics ou Plausible Analytics, attirent l&amp;rsquo;attention.&lt;/p>
&lt;p>Cloudflare Web Analytics fonctionne simplement en intégrant un extrait de JavaScript très léger. Il n&amp;rsquo;émet pas de cookies, vous n&amp;rsquo;avez donc pas besoin d&amp;rsquo;installer une bannière de consentement aux cookies contraignante.&lt;/p>
&lt;p>Son implémentation dans Hugo est également très simple. Il vous suffit d&amp;rsquo;ajouter l&amp;rsquo;extrait de code fourni dans &lt;code>layouts/partials/head.html&lt;/code> ou &lt;code>layouts/partials/analytics.html&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">{{ if eq hugo.Environment &amp;#34;production&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">defer&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;https://static.cloudflareinsights.com/beacon.min.js&amp;#39;&lt;/span> &lt;span class="na">data-cf-beacon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;{&amp;#34;token&amp;#34;: &amp;#34;YOUR_CLOUDFLARE_BEACON_TOKEN&amp;#34;}&amp;#39;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- End Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>L&amp;rsquo;ajout de l&amp;rsquo;attribut &lt;code>defer&lt;/code> permet de charger le script de manière asynchrone sans bloquer l&amp;rsquo;analyse du document HTML, et de l&amp;rsquo;exécuter après la construction du DOM. Cela permet de minimiser l&amp;rsquo;impact sur la vitesse d&amp;rsquo;affichage initiale (LCP : Largest Contentful Paint et FCP : First Contentful Paint).&lt;/p>
&lt;hr>
&lt;h2 id="8-conclusion-et-bonnes-pratiques">8. Conclusion et bonnes pratiques
&lt;/h2>&lt;p>Dans le cadre de l&amp;rsquo;exploitation d&amp;rsquo;un site statique utilisant Hugo, l&amp;rsquo;adoption de plateformes d&amp;rsquo;hébergement modernes telles que Cloudflare Pages ou GitHub Pages offre d&amp;rsquo;énormes avantages en termes de rapport coût-performance, de vitesse d&amp;rsquo;affichage et de sécurité.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Build ultra-rapide&lt;/strong> : Tirer parti de la rapidité de Hugo pour minimiser le temps d&amp;rsquo;exécution des pipelines CI/CD (GitHub Actions).&lt;/li>
&lt;li>&lt;strong>Distribution via l&amp;rsquo;Edge&lt;/strong> : Utiliser le réseau Edge de Cloudflare pour distribuer le contenu aux utilisateurs du monde entier avec une latence de l&amp;rsquo;ordre de la milliseconde.&lt;/li>
&lt;li>&lt;strong>Configuration DNS appropriée&lt;/strong> : Exploiter le CNAME Flattening pour exploiter la Zone Apex (domaine personnalisé) de manière sécurisée et rapide.&lt;/li>
&lt;li>&lt;strong>Optimisation des stratégies de cache&lt;/strong> : Utiliser &lt;code>_headers&lt;/code> pour séparer correctement le cache du navigateur et l&amp;rsquo;Edge Cache en fonction du type de ressource.&lt;/li>
&lt;li>&lt;strong>Analytique légère&lt;/strong> : Intégrer des outils comme Cloudflare Web Analytics pour ne pas dégrader les performances tout en respectant la vie privée.&lt;/li>
&lt;/ol>
&lt;p>En combinant ces éléments, vous pouvez créer gratuitement un système de blog évolutif et robuste, capable de supporter des trafics massifs atteignant des millions de pages vues (PV) par mois. Si vous envisagez de lancer un blog technique, un site d&amp;rsquo;entreprise ou un site portfolio, je vous invite vivement à essayer cette configuration Jamstack + Hugo + Cloudflare Pages.&lt;/p></description></item></channel></rss>