<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Olivier DOSSMANN</title>
    <link>https://olivier.dossmann.net/</link>
    <description>Contenu récent sur Olivier DOSSMANN</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fr</language>
    <copyright>© 2005-2026 Olivier DOSSMANN</copyright>
    <lastBuildDate>Thu, 08 Oct 2026 18:05:11 +0200</lastBuildDate><atom:link href="https://olivier.dossmann.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
	    <title>Découverte d&#39;ArchLinux, 20 ans déjà !</title>
      <link>https://olivier.dossmann.net/2026/10/2026_archlinux_20_ans/</link>
      <pubDate>Thu, 08 Oct 2026 18:05:11 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/10/2026_archlinux_20_ans/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Au &lt;strong&gt;10 octobre 2026&lt;/strong&gt;, cela fera &lt;a href=&#34;https://olivier.dossmann.net/2006/10/kiss-le-bisou-linux/&#34;&gt;&lt;strong&gt;20 ans&lt;/strong&gt; que &lt;strong&gt;j’ai installé ArchLinux&lt;/strong&gt; pour la première fois&lt;/a&gt;. Que de souvenirs et que d’aventures sur cette &lt;strong&gt;distribution qui a signé une forme de stabilité dans mon écosystème&lt;/strong&gt; : je n’ai jamais été aussi bien que sous ArchLinux. Et pourtant j’ai testé des distributions ! Je vous invite d&amp;rsquo;ailleurs à consulter &lt;a href=&#34;https://olivier.dossmann.net/wiki/distributions/#distributions-test%C3%A9es&#34;&gt;la Liste des distributions que j’ai testées&lt;/a&gt; sur mon Recueil d&amp;rsquo;astuces.&lt;/p&gt;
&lt;p&gt;Nous parlerons rapidement de la manière dont j&amp;rsquo;ai découvert cette distribution après quoi j&amp;rsquo;aimerais vous partager quelques astuces et outils du moment autour de cette distribution.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/distributions/fond_ecran_archlinux.jpg&#34; alt=&#34;Fond d&amp;rsquo;écran pour ArchLinux avec un bleu caractéristique de la distribution et le logo en forme d&amp;rsquo;arche en plein milieu&#34; title=&#34;Suggestion de fond d&#39;écran pour ArchLinux&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur &lt;a href=&#34;https://flickr.com/photos/132473982@N05/&#34; title=&#34;Se rendre sur le profil Flickr de Mohd Sohail&#34;&gt;le profil Flickr de Mohd Sohail&lt;/a&gt;&lt;/em&gt; sous Licence CC BY-SA 2.0.&lt;/p&gt;
&lt;h1 id=&#34;comment-jai-découvert-archlinux&#34;&gt;Comment j&amp;rsquo;ai découvert ArchLinux&lt;/h1&gt;
&lt;p&gt;Tout commence en &lt;strong&gt;avril 2005&lt;/strong&gt;, dans le magazine « &lt;a href=&#34;https://web.archive.org/web/20050401021024/http://www.lpmagazine.org/pl/modules/news/&#34;&gt;&lt;strong&gt;Linux+DVD magazine&lt;/strong&gt;&lt;/a&gt; » qui parle d&amp;rsquo;une distribution assez récente nommée &lt;strong&gt;Arch Linux 0.7&lt;/strong&gt;. D&amp;rsquo;ailleurs pour la petite histoire, j&amp;rsquo;ai été correcteur, puis rédacteur dans ce magazine. À l&amp;rsquo;époque je trouvais que la qualité du français n&amp;rsquo;était pas au rendez-vous. J&amp;rsquo;ai découvert qu&amp;rsquo;à la base l&amp;rsquo;équipe du magazine était polonaise et qu&amp;rsquo;une traduction était faite pour chaque article. Au départ les articles étaient seulement traduits. Puis quelques correcteurs français sont apparus. Et finalement ce sont carrément les correcteurs français qui sont devenus rédacteurs !&lt;/p&gt;
&lt;p&gt;À l&amp;rsquo;époque &lt;strong&gt;je n&amp;rsquo;avais pas le niveau pour installer cette distribution&lt;/strong&gt; : j&amp;rsquo;avais encore quelques difficultés avec la ligne de commande - même si j&amp;rsquo;en faisais pas mal depuis le début des années 2000. Ce n&amp;rsquo;est qu&amp;rsquo;&lt;strong&gt;en 2006, après avoir essayé Knoppix, Debian, Mandrake, Damn Small Linux, Suse Linux, Mandriva, Ubuntu&lt;/strong&gt;, &lt;a href=&#34;https://olivier.dossmann.net/2006/10/ubuntusb/&#34; title=&#34;Se rendre sur l&#39;article concernant UbuntUSB&#34;&gt;UbuntUSB&lt;/a&gt;, […] et surtout Gentoo et Slackware que &lt;strong&gt;j&amp;rsquo;ai voulu quelque chose de différent&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un GNU/Linux &lt;strong&gt;moins lourd qu&amp;rsquo;Ubuntu Linux&lt;/strong&gt; et &lt;strong&gt;Mandrake/Mandriva Linux&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;avec des &lt;strong&gt;paquets récents&lt;/strong&gt; (contrairement à Debian à l&amp;rsquo;époque où le &lt;a href=&#34;https://wiki.debian.org/AptConfiguration&#34;&gt;pinning&lt;/a&gt; était monnaie courante),&lt;/li&gt;
&lt;li&gt;une distribution à construire &lt;strong&gt;aux petits oignons&lt;/strong&gt;, tout comme Gentoo et Slackware,&lt;/li&gt;
&lt;li&gt;mais qui ne demande &lt;strong&gt;pas autant de temps d&amp;rsquo;attente due à la compilation&lt;/strong&gt; de nos programmes comme le demandent Gentoo et Slackware.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après avoir passé des jours sur Gentoo à compiler plusieurs fois le noyau et attendre des nuits entières que LibreOffice (OpenOffice à l&amp;rsquo;époque) soit compilé - sans erreur - je crois qu&amp;rsquo;&lt;strong&gt;un passage sur ArchLinux paraît comme une promenade de santé&lt;/strong&gt; &amp;#x1f923;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc &lt;strong&gt;installé ArchLinux le 10 octobre 2006&lt;/strong&gt; comme vous pouvez le voir sur l&amp;rsquo;&lt;a href=&#34;https://olivier.dossmann.net/2006/10/kiss-le-bisou-linux/&#34; title=&#34;Découvrir l&#39;article du 10 octobre 2006 concernant ArchLinux&#34;&gt;article « Kiss, le bisou Linux ? »&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Au début je trouvais que &lt;strong&gt;c&amp;rsquo;était assez fragile cette distribution&lt;/strong&gt;. Avec le recul je me dis que j&amp;rsquo;étais plutôt aventureux et cassait moi-même la distribution. D&amp;rsquo;ailleurs le gestionnaire de paquet de cette distribution s&amp;rsquo;appelle &lt;strong&gt;pacman&lt;/strong&gt; et nous allons voir qu&amp;rsquo;il &lt;strong&gt;a bien évolué au fil du temps&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;quelques-mots-sur-le-gestionnaire-de-paquet-nommé-pacman&#34;&gt;Quelques mots sur le gestionnaire de paquet nommé Pacman&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;pacman&lt;/strong&gt; est donc le &lt;strong&gt;gestionnaire de paquet officiel d&amp;rsquo;ArchLinux&lt;/strong&gt;. Il s&amp;rsquo;utilise avec la commande du même nom.&lt;/p&gt;
&lt;p&gt;Quelques éléments majeurs de l&amp;rsquo;&lt;strong&gt;évolution de ce gestionnaire&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2002 marque l&amp;rsquo;arrivée&lt;/strong&gt; du gestionnaire de paquet, écrit par Judd Vinet, créateur d&amp;rsquo;ArchLinux,&lt;/li&gt;
&lt;li&gt;puis pacman inclut &lt;strong&gt;une base de données&lt;/strong&gt; pour suivre l&amp;rsquo;évolution des paquets au cours de la vie de la distribution installée,&lt;/li&gt;
&lt;li&gt;une bibliothèque (lib) arrive pour séparer les traitements communs du gestionnaire de paquets et le front-end habituel : &lt;strong&gt;libalpm est née&lt;/strong&gt;. Cela permet à d&amp;rsquo;autres front-end de voir le jour pour le dépôt AUR (ArchLinux User Repository, un dépôt communautaire pour les paquets non supportés officiellement par la distribution),&lt;/li&gt;
&lt;li&gt;au départ les paquets étaient compressés en &lt;code&gt;.pkg.tar.gz&lt;/code&gt;, puis ils sont passés au format &lt;code&gt;.pkg.tar.xz&lt;/code&gt; qui favorisait une &lt;strong&gt;compression forte&lt;/strong&gt; (réduisant la taille des paquets, favorisant au passage un téléchargement plus rapide) et une décompression rapide chez l&amp;rsquo;utilisateur,&lt;/li&gt;
&lt;li&gt;puis la &lt;strong&gt;signature des paquets&lt;/strong&gt; est devenue obligatoire,&lt;/li&gt;
&lt;li&gt;puis un &lt;strong&gt;nouveau format de compression apparaît&lt;/strong&gt; pour avoir une décompression encore plus rapide que &lt;strong&gt;le format XZ&lt;/strong&gt; : &lt;code&gt;.pkg.tar.zst&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;avec la version 6.0 de pacman arrive les &lt;strong&gt;téléchargements en parallèle&lt;/strong&gt;, ce qui fait un bien fou ! Il suffit pour cela d&amp;rsquo;utiliser &lt;code&gt;ParallelDownloads&lt;/code&gt; dans le fichier &lt;strong&gt;pacman.conf&lt;/strong&gt; et de donner un nombre de téléchargements à faire en simultané,&lt;/li&gt;
&lt;li&gt;et finalement une nouvelle façon d&amp;rsquo;installer les paquets avec un &lt;strong&gt;utilisateur aux permissions limitées&lt;/strong&gt; apparaît ; &lt;strong&gt;avec l&amp;rsquo;usage d&amp;rsquo;une sandbox&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que d&amp;rsquo;évolutions au fil du temps !&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ailleurs &lt;strong&gt;pacman&lt;/strong&gt; possède un &lt;a href=&#34;https://fr.wikipedia.org/wiki/Easter_egg&#34;&gt;&lt;strong&gt;easter egg&lt;/strong&gt;&lt;/a&gt; connu nommé ILoveCandy. Pour l&amp;rsquo;activer il suffit d&amp;rsquo;ajouter le mot clé &lt;strong&gt;ILoveCandy&lt;/strong&gt; dans la section &lt;code&gt;# Misc options&lt;/code&gt; (sous &lt;code&gt;[options]&lt;/code&gt;) du fichier &lt;strong&gt;/etc/pacman.conf&lt;/strong&gt;. Puis au prochain &lt;code&gt;pacman -Syu&lt;/code&gt; vous devriez voir des caractères ASCII en forme de &lt;a href=&#34;https://fr.wikipedia.org/wiki/Pac-Man&#34;&gt;Pacman&lt;/a&gt; tenter de manger les &amp;ldquo;points&amp;rdquo; de la barre de téléchargement.&lt;/p&gt;
&lt;p&gt;Assez rigolo je dois dire &amp;#x1f929;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/archlinux_pacman_ILoveCandy.jpg&#34; alt=&#34;Image d&amp;rsquo;un téléchargement avec pacman en utilisant l&amp;rsquo;option ILoveCandy&#34; title=&#34;Exemple d&#39;écran faisant plusieurs téléchargement en parallèle avec l&#39;option ILoveCandy de pacman&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;la-découverte-des-environnements-de-bureau-de-type-tiling-manager&#34;&gt;La découverte des environnements de bureau de type Tiling Manager&lt;/h1&gt;
&lt;p&gt;Avec le côté « bidouille » d&amp;rsquo;ArchLinux, beaucoup de personnes participaient à l&amp;rsquo;arrivée de paquets dans AUR (dépôt de paquets communautaires) pour des environnements de bureau dit &lt;a href=&#34;https://fr.wikipedia.org/wiki/Gestionnaire_de_fen%C3%AAtres_par_pavage&#34;&gt;Tiling Manager&lt;/a&gt;. Sacrée tuile ! Au départ difficile, &lt;strong&gt;j&amp;rsquo;ai très vite apprécié un environnement de bureau que je compose moi-même de A à Z&lt;/strong&gt; - ou presque. Je suis passé progressivement d&amp;rsquo;awesome à Sway :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2008 : &lt;a href=&#34;https://olivier.dossmann.net/2008/04/environnement-de-bureau-awesome/&#34;&gt;mon passage à awesome&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;2016 : &lt;a href=&#34;https://olivier.dossmann.net/2016/02/environnement-de-bureau-i3/&#34;&gt;je re-découvre i3wm&lt;/a&gt; et passe dessus,&lt;/li&gt;
&lt;li&gt;juin 2021 : essais de &lt;a href=&#34;https://fr.wikipedia.org/wiki/Sway_(logiciel)&#34; title=&#34;Découvrir Sway, un gestionnaire de fenêtres et compositeur Wayland inspiré d&#39;i3&#34;&gt;Sway, alternative Wayland d&amp;rsquo;i3wm&lt;/a&gt; compatible avec les fichiers de configuration d&amp;rsquo;i3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je n&amp;rsquo;adopte finalement &lt;strong&gt;Sway qu&amp;rsquo;en mai 2025 et en fait mon environnement de bureau principal&lt;/strong&gt; - j&amp;rsquo;ai beaucoup tardé cette fois.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/bureaux/2008_captures/archlinux_awesome.jpg&#34; alt=&#34;Image de mon bureau en 2008 sous ArchLinux avec le gestionnaire de fenêtres awesome&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image prise en avril 2008 de mon bureau ArchLinux avec mon premier tiling manager nommé awesome.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;mon-installation-semestrielle-darchlinux&#34;&gt;(mon) installation semestrielle d&amp;rsquo;ArchLinux&lt;/h1&gt;
&lt;p&gt;À force d&amp;rsquo;installer tout un tas de choses, il est bon de nettoyer. Ou de réinstaller. Mais avec une distribution aux petits oignons, installer n&amp;rsquo;est pas une mince affaire. On peut oublier des paquets, des configurations, etc.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;utilise donc 2 stratagèmes pour facilier la tâche :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;dépôt dotfiles&lt;/strong&gt; : c&amp;rsquo;est un dépôt Git qui contient les configurations de nos applications (généralement contenues dans le dossier &lt;code&gt;~/.config&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;installeur nommé &lt;a href=&#34;https://gitlab.com/greyxor/obscais/&#34; title=&#34;Découvrir le projet de GreyXor nommé OBSCAIS&#34;&gt;OBSCAIS&lt;/a&gt;&lt;/strong&gt; qui facilite grandement une installation complète d&amp;rsquo;ArchLinux sur sa machine avec quelques fichiers et dossiers de configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je voulais aborder le sujet car on partage souvent nos dotfiles sur le Web, mais on ne parle jamais des outils pour automatiser notre installation.&lt;/p&gt;
&lt;p&gt;Si &lt;strong&gt;au départ j&amp;rsquo;utilisais Ansible pour cela&lt;/strong&gt;, j&amp;rsquo;ai &lt;strong&gt;vite déchanté&lt;/strong&gt; et cherché une autre solution. Ce n&amp;rsquo;est que &lt;strong&gt;par hasard que j&amp;rsquo;ai découvert OBSCAIS&lt;/strong&gt;. J&amp;rsquo;en suis très satisfait et j&amp;rsquo;ai déjà plusieurs dossiers (un par machine) pour installer ArchLinux à plusieurs endroits &amp;#x1f601;.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;autre solution aurait été de passer à &lt;a href=&#34;https://fr.wikipedia.org/wiki/NixOS&#34;&gt;NixOS&lt;/a&gt;, ce qui me paraît drastique pour automatiser l&amp;rsquo;installation de notre système d&amp;rsquo;exploitation.&lt;/p&gt;
&lt;p&gt;À noter que sous Debian il y a le &lt;a href=&#34;https://wiki.debian.org/DebianInstaller/Preseed&#34;&gt;Preseed&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Kickstart_(Linux)&#34;&gt;Kickstart&lt;/a&gt; pour RedHat/Fedora, etc.&lt;/p&gt;
&lt;p&gt;Finalement &lt;strong&gt;le monde du Logiciel Libre vous laisse le choix des armes&lt;/strong&gt; &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Jamais je n&amp;rsquo;aurais pensé trouver &lt;strong&gt;une distribution GNU/Linux qui me correspond&lt;/strong&gt;, qui me ressemble. Enfin pas trop quand même, je suis dispersé !&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai testé de nombreuses distributions parmi Mandrake, Debian, Ubuntu, Gentoo, etc. Et j&amp;rsquo;ai eu de nombreux essais - infructueux - pour trouver une place dans différentes communautés comme Debian, Mandrake/Mandriva, NuTyX et Frugalware. Cela n&amp;rsquo;a pas fonctionné comme je l&amp;rsquo;espérais.&lt;/p&gt;
&lt;p&gt;Avec le recul je me rends compte que cette &lt;strong&gt;expérience de 20 ans environ&lt;/strong&gt; - avec des aléas comme souvent - m&amp;rsquo;a laissé naviguer sous ArchLinux avec brio. Que ce soit en machine de bureau ou bien en serveur, &lt;strong&gt;ArchLinux a toujours été à mes côtés pour fournir le service que je demandais&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plus besoin de tester différentes distributions&lt;/strong&gt; en se disant qu&amp;rsquo;elle sera meilleure que la précédente. Plus besoin d&amp;rsquo;installer en cassant le système en place ni en perdant les données. Plus de recherches incessantes sur Internet pour réparer ce que j&amp;rsquo;ai cassé, etc. Je peux enfin &lt;strong&gt;utiliser mon système pour travailler, m&amp;rsquo;amuser&lt;/strong&gt; ou tout simplement casser d&amp;rsquo;autres choses &amp;#x1f923;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merci&lt;/strong&gt; à ArchLinux, sa communauté, son wiki et tous les archers qui m&amp;rsquo;ont aidé. &lt;strong&gt;Merci&lt;/strong&gt; à l&amp;rsquo;auteur d&amp;rsquo;&lt;strong&gt;OBSCAIS&lt;/strong&gt; de partager &lt;strong&gt;un script qui change la vie&lt;/strong&gt; et &lt;strong&gt;merci&lt;/strong&gt; à &lt;strong&gt;ma persévérance et ma patience&lt;/strong&gt; de quelques années jusqu&amp;rsquo;à avoir un environnement qui me plaît &amp;#x1f604;.&lt;/p&gt;
&lt;p&gt;Et vous, quelle est votre distribution phare ?&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2006/10/kiss-le-bisou-linux/&#34;&gt;Mon article sur ma première installation ArchLinux (il y a &lt;strong&gt;20 ans&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/wiki/distributions/#distributions-test%C3%A9es&#34;&gt;Liste des distributions que j’ai testées sur mon Recueil d&amp;rsquo;astuces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20050401021024/http://www.lpmagazine.org/pl/modules/news/&#34;&gt;&lt;strong&gt;Linux+DVD magazine&lt;/strong&gt; en 2005&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2006/10/ubuntusb/&#34;&gt;Mon article sur UbuntUSB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.debian.org/AptConfiguration&#34;&gt;Le pinning sous Debian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Easter_egg&#34;&gt;Définition d&amp;rsquo;un &lt;strong&gt;easter egg&lt;/strong&gt; selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Pac-Man&#34;&gt;Pacman selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gestionnaire_de_fen%C3%AAtres_par_pavage&#34;&gt;Tiling Manager selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2008/04/environnement-de-bureau-awesome/&#34;&gt;Article sur mon passage à awesome (Tiling manager)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2016/02/environnement-de-bureau-i3/&#34;&gt;Un article pour décrire que je re-découvre i3wm (Tiling manager)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Sway_(logiciel)&#34;&gt;Définition de Sway, alternative Wayland d&amp;rsquo;i3wm, selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/greyxor/obscais/&#34;&gt;Projet OBSCAIS sur Gitlab, par GreyXor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/NixOS&#34;&gt;NixOS selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.debian.org/DebianInstaller/Preseed&#34;&gt;Méthode Preseed pour Debian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Kickstart_(Linux)&#34;&gt;Kickstart selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Geminispace VR</title>
      <link>https://olivier.dossmann.net/2026/09/geminispace-vr/</link>
      <pubDate>Tue, 22 Sep 2026 17:26:18 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/09/geminispace-vr/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;En ce moment j&amp;rsquo;ai l&amp;rsquo;impression que l&amp;rsquo;&lt;strong&gt;informatique tourne à 100 à l&amp;rsquo;heure&lt;/strong&gt; : on a du mal à suivre toutes les évolutions. Voire même tout simplement à savoir si ce sont réellement des évolutions &amp;#x1f914;. Qu&amp;rsquo;il y ait des outils variés - créés avec ou sans IA (Intelligence Artificielle) - ou bien de nouvelles façons de faire, on ne s&amp;rsquo;en sort plus. Et pourtant avec ce billet &lt;strong&gt;je vais y participer&lt;/strong&gt; ; tout en vous prévenant que je n&amp;rsquo;ai pas inventé la roue, l&amp;rsquo;eau chaude ou que sais-je comme expression ringarde pour dire que &lt;strong&gt;je n&amp;rsquo;ai rien inventé de nouveau&lt;/strong&gt;. Cette fois, &lt;strong&gt;je voulais simplement un peu de fun&lt;/strong&gt; dans ce monde.&lt;/p&gt;
&lt;p&gt;Tout commence par une phrase anodine de &lt;a href=&#34;https://richard-dern.fr/&#34; title=&#34;Découvrir le blog de Richard Dern&#34;&gt;Richard Dern&lt;/a&gt; pendant une conversation au sujet de la « simplicité » dans l&amp;rsquo;informatique moderne :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cela dit, tu as étudié Gemini ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il parle bien évidemment du &lt;a href=&#34;https://fr.wikipedia.org/wiki/Gemini_(protocole)&#34; title=&#34;En savoir plus sur le protocole Gemini vu par Wikipédia&#34;&gt;protocole Gemini&lt;/a&gt;. D&amp;rsquo;ailleurs je me demande si je dois le remercier ou non &amp;#x1f923;. D&amp;rsquo;un côté j&amp;rsquo;ai découvert énormément de choses et vous en ait fait part dans &lt;a href=&#34;https://olivier.dossmann.net/2026/09/etendre-blog-hugo-protocole-gemini/&#34; title=&#34;Découvrir l&#39;article d&#39;Olivier concernant l&#39;extension d&#39;un blog Hugo jusqu&#39;au protocole Gemini&#34;&gt;mon dernier article sur « Étendre un blog Hugo jusqu&amp;rsquo;au protocole Gemini »&lt;/a&gt; ; de l&amp;rsquo;autre j&amp;rsquo;y ai passé beaucoup de temps &amp;#x1f605;. @&lt;a href=&#34;https://richard-dern.fr&#34; title=&#34;Découvrir le blog de Richard Dern&#34;&gt;Richard Dern&lt;/a&gt; si tu me lis, ne m&amp;rsquo;en veux pas !&lt;/p&gt;
&lt;p&gt;Pour en revenir à mon histoire, je me renseigne sur &lt;strong&gt;Gemini&lt;/strong&gt;, j&amp;rsquo;apprends que c&amp;rsquo;est une &lt;strong&gt;alternative du Web située entre HTTP et Gopher&lt;/strong&gt;. Et là je me souviens qu&amp;rsquo;à une époque très lointaine. Très lointaine. Très très lointaine (&lt;strong&gt;en 1995&lt;/strong&gt;). Des développeurs de Gopher avait créé un client Gopher qui incluait un outil de visualisation en 3D. « E que s&amp;rsquo;apelerio &lt;a href=&#34;https://en.wikipedia.org/wiki/GopherVR&#34;&gt;GopherVR&lt;/a&gt; ». En 3D. Oui 3D. En 1995, vous imaginez ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/gophervr.gif&#34; alt=&#34;Aperçu d&amp;rsquo;à quoi peut ressembler une fenêtre d&amp;rsquo;accès au Gopherspace en utilisant GopherVR&#34; title=&#34;Fenêtre Gopher VR ouverte sur un site avec un aperçu 3D de ce site&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image trouvée sur un &lt;a href=&#34;https://linuxfr.org/users/chilinhualong/journaux/aux-sources-du-fun-n-1-retrouver-le-fun-dans-les-inutilitaires-graphiques&#34;&gt;article de LinuxFR concernant les INutilitaires graphiques&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Je me suis permis d&amp;rsquo;imaginer&lt;/strong&gt; ! Je me suis dit : je veux du fun, j&amp;rsquo;ai un casque VR simple à disposition, je m&amp;rsquo;intéresse un peu au Geminispace, les pages Web du Geminispace sont simples, pourquoi on essaierait pas &lt;strong&gt;un petit Geminispace VR pour le fun&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;Et en même temps, j&amp;rsquo;avoue qu&amp;rsquo;un espace VR serait une sorte de troll comparé au protocole Gemini qui se veut extrêmement simple : faire un Geminispace VR serait un comble, un oxymore. Mais pourquoi pas après tout ?&lt;/p&gt;
&lt;p&gt;Je vous propose dans cet article de vous présenter le concept de l&amp;rsquo;outil, où le trouver pour le tester (même sans casque VR) et ce qui pourrait être amélioré à l&amp;rsquo;avenir. C&amp;rsquo;est parti !&lt;/p&gt;
&lt;h1 id=&#34;concept-et-technologies-utilisées&#34;&gt;Concept et technologies utilisées&lt;/h1&gt;
&lt;h2 id=&#34;loutillage&#34;&gt;L&amp;rsquo;outillage&lt;/h2&gt;
&lt;p&gt;En me renseignant sur les technologies VR, &lt;strong&gt;je découvre &lt;a href=&#34;https://en.wikipedia.org/wiki/WebXR&#34; title=&#34;En savoir plus sur WebXR sur la page Wikipédia spécifique, version anglaise&#34;&gt;WebXR&lt;/a&gt;&lt;/strong&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WebXR est un standard web qui permet d&amp;rsquo;exécuter des expériences de réalité virtuelle (VR ou Virtual Reality) et de réalité augmentée (AR ou Augmented Reality) directement dans un navigateur compatible, sans avoir besoin d&amp;rsquo;installer d&amp;rsquo;application ou de plugin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cela semble pratique, et &lt;strong&gt;couplé à Javascript&lt;/strong&gt; peut-être encore plus. &lt;strong&gt;Un simple site HTML/Javascript pourrait suffire&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;le-concept&#34;&gt;Le concept&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;imagine alors une forme de navigation :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;je souhaite visiter &lt;strong&gt;un seul site à la fois&lt;/strong&gt; (sans saisir d&amp;rsquo;adresse pour le moment),&lt;/li&gt;
&lt;li&gt;une fois sur le site - un Geminispace je le rappelle - je voudrais &lt;strong&gt;représenter chaque lien de la page par un polyèdre&lt;/strong&gt;, chaque dossier, chaque fichier par un polyèdre. Chaque fois &lt;strong&gt;avec une couleur différente&lt;/strong&gt; (vert pour un fichier, violet pour un fichier Gemini, gris pour le reste),&lt;/li&gt;
&lt;li&gt;si je vise un polyèdre quelconque il s&amp;rsquo;illumine,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;en « tirant/cliquant »&lt;/strong&gt; sur le polyèdre scintillant, &lt;strong&gt;on se déplace&lt;/strong&gt; dans le contenu pointé par le lien ciblé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/geminispace-vr_root.png&#34; alt=&#34;Dodécaèdre rouge pour accéder à la racine du répertoire courant&#34;&gt;&lt;/p&gt;
&lt;p&gt;A priori rien de compliqué. &lt;strong&gt;Naviguer est une succession de « tirs »&lt;/strong&gt;, tout comme le serait une succession de clics. Parfait !&lt;/p&gt;
&lt;p&gt;En revanche, je risque de me perdre dans le site : &lt;strong&gt;un dodécaèdre rouge&lt;/strong&gt; au dessus de notre tête &lt;strong&gt;représente la racine&lt;/strong&gt; d&amp;rsquo;où nous venons (comme un arbre de fichier avec son répertoire courant). De la même façon si on navigue ensuite sur un autre Geminispace, &lt;strong&gt;un second dodécaèdre rouge&lt;/strong&gt; apparaît au dessus de nous &lt;strong&gt;pour représenter le site précédent&lt;/strong&gt;. La navigation s&amp;rsquo;effectue relativement bien.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/geminispace-vr_double-root.png&#34; alt=&#34;Dodécaèdre rouge pour accéder à la racine du répertoire courant&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nous sommes au début du projet, je dois dire que cette forme d&amp;rsquo;expérimentation est intéressante. Et inhabituelle pour moi.&lt;/p&gt;
&lt;p&gt;Au fur et à mesure de l&amp;rsquo;usage, j&amp;rsquo;ai ajouté quelques règles/éléments :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sur les pages ayant énormément de liens, la population de polyèdres affichés explose les compteurs. Pour pallier à cela j&amp;rsquo;ai ajouté &lt;strong&gt;une légende sur votre droite qui permet de désactiver les liens par type&lt;/strong&gt; (dossiers, fichiers *.gmi et liens HTTP(S)),&lt;/li&gt;
&lt;li&gt;on affiche &lt;strong&gt;un panneau central avec le&lt;/strong&gt; contenu du &lt;strong&gt;fichier index.gmi&lt;/strong&gt; du répertoire courant,&lt;/li&gt;
&lt;li&gt;à droite et à gauche du panneau central &lt;strong&gt;se trouvent des pyramides couchées bleues qui représentent « page suivante » et « page précédente »&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;si la navigation sur une page contient &lt;strong&gt;un ou plusieurs liens&lt;/strong&gt;, ils &lt;strong&gt;sont symbolisés par une sphère&lt;/strong&gt; (une couleur différente par type de lien) sur le bord gauche du panneau central. Pointer la sphère fait qu&amp;rsquo;elle s&amp;rsquo;illumine. &lt;strong&gt;Au tir/clic : on s&amp;rsquo;y rend&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;j&amp;rsquo;ai ajouté un &lt;strong&gt;message de validation Oui/Non au départ du site&lt;/strong&gt; (si le lien nous fait naviguer vers d&amp;rsquo;autres rivages que le site actuel,&lt;/li&gt;
&lt;li&gt;si on valide le départ, &lt;strong&gt;un second dodécaèdre rouge apparaît pour représenter le site d&amp;rsquo;où nous sommes partis&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/geminispace-vr_exit-space.png&#34; alt=&#34;Deux polyèdres pour choisir Oui/Non avant de quitter l&amp;rsquo;espace courant&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas une interface dite agréable en soi, mais &lt;strong&gt;c&amp;rsquo;est très amusant de « tirer » sur des liens&lt;/strong&gt; et essayer de s&amp;rsquo;en sortir dans tout ce bazar &amp;#x1f923;.&lt;/p&gt;
&lt;h1 id=&#34;où-trouver-geminispacevr-et-comment-le-tester&#34;&gt;Où trouver GeminispaceVR et comment le tester ?&lt;/h1&gt;
&lt;h2 id=&#34;ledit-projet&#34;&gt;Ledit « projet »&lt;/h2&gt;
&lt;p&gt;Les &lt;a href=&#34;https://gitlab.com/odtre/gemini-vr/&#34; title=&#34;Aller sur le dépôt Gitlab du projet pour en découvrir le code source&#34;&gt;sources de cette expérimentation sont disponibles sur Gitlab dans l&amp;rsquo;espace odtre/gemini-vr&lt;/a&gt;. Ce projet est sous &lt;a href=&#34;https://www.gnu.org/licenses/why-affero-gpl.fr.html&#34; title=&#34;Découvrir pourquoi la licence A-GPL&#34;&gt;licence A-GPL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une démo est disponible sur &lt;a href=&#34;https://demo.geminispace-vr.dossmann.net/&#34; title=&#34;Découvrir - ENFIN - Geminispace VR&#34;&gt;demo.geminispace-vr.dossmann.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce projet a aussi été le cœur d&amp;rsquo;un &lt;strong&gt;test de Fable 5.1&lt;/strong&gt; (modèle provenant de chez ClaudeAI) &lt;strong&gt;pour voir l&amp;rsquo;autonomie d&amp;rsquo;une AI sur un projet&lt;/strong&gt; à partir d&amp;rsquo;un prompt plus conséquent. 3$ plus tard c&amp;rsquo;était déjà utilisable. Et les corrections ont consommé 25$ de plus. Heureusement que les 100 premiers dollars étaient offerts &amp;#x1f605;.&lt;/p&gt;
&lt;h2 id=&#34;tester--utiliser&#34;&gt;Tester / utiliser&lt;/h2&gt;
&lt;p&gt;Ainsi l&amp;rsquo;&lt;strong&gt;usage de Geminispace VR se fait via un navigateur&lt;/strong&gt; compatible. Autrement dit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mozilla &lt;strong&gt;Firefox&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Google &lt;strong&gt;Chromium&lt;/strong&gt;/Chrome,&lt;/li&gt;
&lt;li&gt;Microsoft Edge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ou tout simplement le navigateur de votre casque VR, par exemple &lt;em&gt;Meta Quest Browser&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Voici quelques uns de mes tests d&amp;rsquo;usage.&lt;/p&gt;
&lt;h2 id=&#34;navigateur-firefox-et-chromium-sur-pc-fixe&#34;&gt;Navigateur Firefox et Chromium sur PC fixe&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Au centre de l&amp;rsquo;écran se trouve &lt;strong&gt;un cercle&lt;/strong&gt; qui représente un pointeur (j&amp;rsquo;appelle ça &lt;strong&gt;la mire&lt;/strong&gt; &amp;#x1f937;),&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;clic gauche maintenu&lt;/strong&gt;, &lt;strong&gt;puis un déplacement de la souris&lt;/strong&gt; va permettre de &lt;strong&gt;« regarder » ailleurs&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;si vous déplacez correctement &lt;strong&gt;le cercle au centre sur un polyèdre, il s&amp;rsquo;illuminera&lt;/strong&gt; et &lt;strong&gt;un clic permet de valider&lt;/strong&gt; le choix « ciblé »,&lt;/li&gt;
&lt;li&gt;en bas à droite un &lt;strong&gt;rectangle arrondi&lt;/strong&gt; permet de mettre en &lt;strong&gt;plein écran&lt;/strong&gt;. Inutile je trouve.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mon expérience n&amp;rsquo;est pas très concluante sur le navigateur d&amp;rsquo;un PC fixe. Il &lt;strong&gt;manque clairement un dispositif de pointage&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;navigateur-firefox-sur-téléphone-mobile&#34;&gt;Navigateur Firefox sur téléphone mobile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Il faut &lt;strong&gt;accepter&lt;/strong&gt; au départ l&amp;rsquo;&lt;strong&gt;usage des senseurs du téléphone&lt;/strong&gt; mobile pour une expérience plus sympathique,&lt;/li&gt;
&lt;li&gt;et &lt;strong&gt;mettre l&amp;rsquo;écran en mode « paysage »&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;un mouvement du téléphone (par exemple vers le haut) va faire comme si &lt;strong&gt;le téléphone était une fenêtre sur un nouveau monde&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;de là, une &lt;strong&gt;simple pression&lt;/strong&gt; sur l&amp;rsquo;écran peut faire l&amp;rsquo;&lt;strong&gt;effet d&amp;rsquo;un « clic »&lt;/strong&gt; pour valider une cible visé,&lt;/li&gt;
&lt;li&gt;mais cette &lt;strong&gt;simple pression en continu&lt;/strong&gt; peut aussi faire &lt;strong&gt;avancer dans le monde&lt;/strong&gt; (comme si on aggrandissait),&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;pression avec deux doigts&lt;/strong&gt; fait l&amp;rsquo;effet inverse : &lt;strong&gt;cela recule&lt;/strong&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La &lt;strong&gt;navigation est plus agréable ainsi&lt;/strong&gt;. Et toujours pas satisfaisante. Bonne chance pour arriver à cliquer sur le rectangle arrondi en bas à droite qui n&amp;rsquo;apparaît pas car il est hors champ de l&amp;rsquo;écran. Nul.&lt;/p&gt;
&lt;h2 id=&#34;naviguer-casque-vr-avec-le-navigateur-intégré&#34;&gt;Naviguer casque VR avec le navigateur intégré&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On lance le navigateur, on saisit l&amp;rsquo;URL, on met en &lt;strong&gt;plein écran&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;le cercle au centre qui représentait un pointeur devrait disparaître,&lt;/li&gt;
&lt;li&gt;vos &lt;strong&gt;dispositifs de pointage&lt;/strong&gt; devraient faire &lt;strong&gt;apparaître des lasers&lt;/strong&gt; qui permettent de &lt;strong&gt;cibler des polyèdres&lt;/strong&gt; en tous genres,&lt;/li&gt;
&lt;li&gt;à l&amp;rsquo;appui sur &lt;strong&gt;votre gachette&lt;/strong&gt; du dispositif de pointage, cela &lt;strong&gt;devrait valider la cible&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;si vous utilisez les joysticks des dispositifs de pointage vous pouvez vous déplacer dans cet « univers graphique » (mais le déplacement rend malade).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/geminispace-vr_link.png&#34; alt=&#34;Petite sphère utilisée pour représenter un lien dans le texte et pouvoir cliquer/tirer dessus&#34;&gt;&lt;/p&gt;
&lt;p&gt;Clairement &lt;strong&gt;l&amp;rsquo;expérience est bien plus satisfaisante sur un casque VR&lt;/strong&gt;. Usage totalement inutile et pourtant c&amp;rsquo;est le fameux fun que j&amp;rsquo;attendais &amp;#x1f973;. J&amp;rsquo;en suis content.&lt;/p&gt;
&lt;h1 id=&#34;améliorations-possibles&#34;&gt;Améliorations possibles&lt;/h1&gt;
&lt;p&gt;Bien que le projet ait été fabriqué pour tester différentes choses comme WebXR, Fable 5.1 de chez ClaudeAI, une application sur casque VR et la navigation possible en 3D dans un Geminispace, je pense qu&amp;rsquo;&lt;strong&gt;on pourrait améliorer&lt;/strong&gt; certaines choses :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l&amp;rsquo;&lt;strong&gt;affichage du panneau central&lt;/strong&gt; est à parfaire. Je parle notamment de reconnaître tout ou partie de la syntaxe des fichiers Gemini (*.gmi),&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;&lt;strong&gt;arrivée sur une page contenant énormément de liens&lt;/strong&gt; fait ralentir l&amp;rsquo;affichage, il serait bon de trouver une alternative (j&amp;rsquo;en imagine déjà plusieurs : désactiver automatiquement dans la légende le polyèdre correspondant si on dépasse un seuil critique de liens ou alors stopper l&amp;rsquo;affichage des liens à partir du seuil ou encore disposer les liens à la GopherVR en spirale),&lt;/li&gt;
&lt;li&gt;il pourrait être sympa d&amp;rsquo;&lt;strong&gt;afficher en couleur les titres d&amp;rsquo;une page&lt;/strong&gt;, par exemple rouge pour le titre &lt;code&gt;#&lt;/code&gt;, vert pour &lt;code&gt;##&lt;/code&gt; et bleu pour &lt;code&gt;###&lt;/code&gt; (ce sont des titres de la syntaxe Gemini),&lt;/li&gt;
&lt;li&gt;décaler le &lt;strong&gt;texte des citations&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;afficher &lt;strong&gt;les images&lt;/strong&gt; ou un système pour les consulter/voir,&lt;/li&gt;
&lt;li&gt;améliorer l&amp;rsquo;&lt;strong&gt;affichage des boutons « page précédente » / « page suivante »&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;améliorer l&amp;rsquo;affichage du panneau central,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;avais aussi pensé ajouter un champ de saisie pour aller sur un site défini, mais cela demanderait la gestion d&amp;rsquo;un clavier et aussi la vérification de ce qui est saisi. On s&amp;rsquo;éloigne du fun à mon sens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;À vous&lt;/strong&gt; d&amp;rsquo;imaginer ce qui pourrait être amélioré &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Initialement &lt;strong&gt;parti d&amp;rsquo;une recherche&lt;/strong&gt; sur le protocole Gemini, je me suis &lt;strong&gt;retrouvé dans une tornade d&amp;rsquo;idées&lt;/strong&gt; provenant de &lt;strong&gt;mon imagination&lt;/strong&gt; et dans un projet assez différent de mon habitude. J&amp;rsquo;ai &lt;strong&gt;apprécié modeler le concept initial&lt;/strong&gt; et s&amp;rsquo;essayer à la 3D et l&amp;rsquo;AI - même si finalement je n&amp;rsquo;ai fais que diriger les opérations.&lt;/p&gt;
&lt;p&gt;Je ne m&amp;rsquo;attendais pas à réussir quoique ce soit et j&amp;rsquo;avoue que &lt;strong&gt;ça commence petit à petit à être utilisable&lt;/strong&gt; &amp;#x1f604;. Jamais je ne me serais imaginé arriver à ce degré d&amp;rsquo;usage, bien qu&amp;rsquo;on puisse encore améliorer le concept !&lt;/p&gt;
&lt;p&gt;Je me suis amusé à le faire tester à d&amp;rsquo;autres personnes, des adultes, des adolescents, etc. C&amp;rsquo;est très drôle de voir à quel point le seul concept d&amp;rsquo;une arborescence de dossiers et fichiers fait la différence entre quelqu&amp;rsquo;un qui saura s&amp;rsquo;en sortir ou quelqu&amp;rsquo;un qui sera totalement perdu. Promis, je ne suis pas sadique, je leur ai expliqué pendant l&amp;rsquo;expérience &amp;#x1f609;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N&amp;rsquo;hésitez pas à forker le projet&lt;/strong&gt;, améliorer les éléments qui vous semblent pertinents, proposer des PR (Pull Request), créer des tickets, le refaire de 0 dans un autre langage, etc. &lt;strong&gt;Partagez également l&amp;rsquo;outil&lt;/strong&gt;, c&amp;rsquo;est là pour s&amp;rsquo;amuser, alors &lt;strong&gt;amusez-vous&lt;/strong&gt; !&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://richard-dern.fr/&#34;&gt;Blog de Richard Dern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gemini_(protocole)&#34;&gt;Le protocole Gemini suivant Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2026/09/etendre-blog-hugo-protocole-gemini/&#34;&gt;Article sur « Étendre un blog Hugo jusqu&amp;rsquo;au protocole Gemini » d&amp;rsquo;après Olivier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/GopherVR&#34;&gt;GopherVR expliqué par Wikipedia (en)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxfr.org/users/chilinhualong/journaux/aux-sources-du-fun-n-1-retrouver-le-fun-dans-les-inutilitaires-graphiques&#34;&gt;Article de LinuxFR concernant les INutilitaires graphiques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/WebXR&#34;&gt;WebXR suivant Wikipedia (en)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/odtre/gemini-vr/&#34;&gt;Code source de Geminispace VR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gnu.org/licenses/why-affero-gpl.fr.html&#34;&gt;Pourquoi la licence A-GPL ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://demo.geminispace-vr.dossmann.net/&#34; title=&#34;Découvrir Geminispace VR en ligne&#34;&gt;Démo de Geminispace VR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Étendre un blog Hugo jusqu&#39;au protocole Gemini</title>
      <link>https://olivier.dossmann.net/2026/09/etendre-blog-hugo-protocole-gemini/</link>
      <pubDate>Tue, 15 Sep 2026 17:17:32 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/09/etendre-blog-hugo-protocole-gemini/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Cela fait plusieurs années qu&amp;rsquo;à la fois certains amis et quelques articles du Web me rappellent que &lt;strong&gt;le protocole Gemini existe&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gemini_(protocole)&#34;&gt;Définition du protocole Gemini par Wikipédia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce dernier (naissance en 2019) se veut être &lt;strong&gt;une alternative minimaliste au Web&lt;/strong&gt; actuel, mais pas autant que le protocole Gopher (existant depuis 1991).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gopher&#34;&gt;Découverte du protocole Gopher par Wikipédia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Une partie des internautes - sûrement les vieux barbus dont je fais partie, mais ça doit être un cliché de ma part - déplore les apparences trompeuses du Web (feuilles de style CSS mal fichues), les incompatibilités entre navigateurs, les trackers, les publicités, le pistage systématique, les batailles pour la protection des données (RGPD), etc.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://eur-lex.europa.eu/FR/legal-content/summary/general-data-protection-regulation-gdpr.html&#34;&gt;Règlement Général sur la Protection des Données (RGPD)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bref, « on en a gros » !&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kaamelott-gifboard.fr/gif/on-en-a-gros&#34;&gt;GIF animé évoquant « On en a gros » de la série TV Kaamelott&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ainsi que l&amp;rsquo;idée est d&amp;rsquo;avoir un protocole différent, avec un accès spécifique (&lt;strong&gt;gemini:// au lieu de http://&lt;/strong&gt;) par des navigateurs faciles à développer et des serveurs tout aussi faciles à fabriquer/coder.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;autres en parlent mieux que moi si le cœur vous en dit :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bortzmeyer.org/gemini.html&#34;&gt;« Le protocole Gemini, revenir à du simple et sûr pour distribuer l&amp;rsquo;information en ligne ? » par Stéphane Bortzmeyer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ploum.net/gemini-le-protocole-du-slow-web/index.html&#34;&gt;« Gemini, le protocole du slow web » par Ploum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.flozz.fr/2023/04/12/decollage-ce-blog-vient-detre-propulse-dans-le-geminispace/&#34;&gt;« Décollage : ce blog vient d&amp;rsquo;être propulsé dans le Geminispace ! » par Flozz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On s&amp;rsquo;égare un peu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;S&amp;rsquo;informer ne fait pas de mal, n&amp;rsquo;est-ce pas ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ainsi j&amp;rsquo;ai voulu &lt;strong&gt;faire déborder ce blog sur le Geminispace&lt;/strong&gt; (l&amp;rsquo;espace internet composé de tous les sites disponibles en gemini://) et créer ma &lt;em&gt;capsule&lt;/em&gt; Gemini ou &lt;em&gt;gemlogs&lt;/em&gt;. Ce sont les deux mots que je retrouve fréquemment quand on parle de blog sur l&amp;rsquo;espace Gemini.&lt;/p&gt;
&lt;p&gt;Le plan de cet article va être relativement simple. Nous débuterons par l&amp;rsquo;usage d&amp;rsquo;Hugo pour générer le blog au format gemtext (Gemini). Puis nous continuerons avec la mise en place d&amp;rsquo;un serveur Gemini pour servir le blog ainsi généré. Et finalement nous listerons quelques clients Gemini pour consulter notre nouveau gemlog (blog Gemini).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est parti !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/gemini-company.jpg&#34; alt=&#34;Image d&amp;rsquo;une ancienne machine ayant un « Gemini II » estampillé&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur &lt;a href=&#34;https://flickr.com/photos/cogdog/&#34;&gt;le profil de Alan Levine sur Flickr&lt;/a&gt;&lt;/em&gt; sous Licence Domaine public.&lt;/p&gt;
&lt;h1 id=&#34;utiliser-les-capacités-dhugo-pour-générer-un-blog-pour-gemini&#34;&gt;Utiliser les capacités d&amp;rsquo;Hugo pour générer un blog pour Gemini&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;utilise &lt;strong&gt;Hugo&lt;/strong&gt; depuis 2016, un &lt;strong&gt;moteur de blog&lt;/strong&gt; statique écrit en Go &lt;strong&gt;qui génère des dizaines de milliers d&amp;rsquo;articles en quelques secondes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://olivier.dossmann.net/2016/03/hugo_le_moteur_de_blog_statique_rapide_et_moderne/&#34;&gt;Mon article sur Hugo, le moteur de blog statique rapide et moderne&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La particularité d&amp;rsquo;Hugo est donc de &lt;strong&gt;générer des fichiers&lt;/strong&gt; (par exemple HTML) &lt;strong&gt;à partir de fichier source&lt;/strong&gt; (par exemple au format Markdown) &lt;strong&gt;en passant par des templates&lt;/strong&gt; (pour décrire le résultat attendu et remplir les « trous » par le contenu des fichiers sources).&lt;/p&gt;
&lt;p&gt;En partant de ce principe, &lt;strong&gt;Hugo est capable de créer des fichiers Gemtext&lt;/strong&gt; (suffixe de fichier &lt;em&gt;gmi&lt;/em&gt;), attendus par Gemini.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Gemini_(protocol)#Gemtext_format&#34;&gt;Format Gemtext du protocole Gemini suivant Wikipédia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://admin.flounder.online/gemini_text_guide.gmi&#34;&gt;« Writing Gemtext (.gmi) » par Flounder (small web)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remarquez que ce &lt;strong&gt;format est relativement simple&lt;/strong&gt;. On va donc procéder à 2 actions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;modifier le fichier &lt;strong&gt;config.toml&lt;/strong&gt; pour l&amp;rsquo;informer de &lt;strong&gt;générer des fichiers gmi&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ajouter des templates&lt;/strong&gt; à utiliser pour générer les fichiers gmi à partir du contenu markdown déjà fourni.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À noter que plusieurs sites parlent déjà d&amp;rsquo;utiliser un projet Hugo pour créer du contenu pour Gemini (voire même pour Gopher !) :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mkamarin.com/posts/xhugo2ggx/&#34;&gt;« Converting hugo sites to Gopher Hole and/or to Gemini Capsule » par Mike A. Marin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.alkahan.net/post/2026/04/20260426-une-capsule-gemini-avec-hugo/&#34;&gt;« Une capsule gemini avec Hugo » par Alkahan&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://bacardi55.io/2021/02/13/managing-this-site-and-my-gemini-capsule-with-hugo/&#34;&gt;« Managing this site and my gemini capsule with Hugo » par bacardi55&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mkamarin/Hugo-2-Gopher-and-Gemini&#34;&gt;Dépôt Github de mkamarin concernant le projet Hugo-2-Gopher-and-Gemini&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;le-fichier-configtoml&#34;&gt;Le fichier config.toml&lt;/h2&gt;
&lt;p&gt;Quelques lignes à renseigner dans le fichier &lt;strong&gt;config.toml&lt;/strong&gt; (chez moi au format TOML) suffisent pour déclarer le nouveau besoin.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord la déclaration d&amp;rsquo;un nouveau type de fichier :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[mediaTypes.&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;text/gemini&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    suffixes = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;gmi&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous souhaitez créer un fichier de &lt;em&gt;flux Atom&lt;/em&gt; (pour vous déclarer sur des aggrégateurs de Gemini), il est aussi nécessaire d&amp;rsquo;ajouter quelques lignes :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[mediaTypes.&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;application/atom+xml&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    suffixes = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;xml&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite on ajoute les différents formats de sorties :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[outputFormats.GEMINI]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mediaType = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;text/gemini&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    baseName = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    isPlainText = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    isHTML = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    protocol = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;gemini://&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permalinkable = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous aviez ajouté un type de fichier &lt;em&gt;atom+xml&lt;/em&gt;, n&amp;rsquo;oubliez pas d&amp;rsquo;ajouter aussi le format de sortie correspondant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[outputFormats.ATOM]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mediaType = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;application/atom+xml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    baseName = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;atom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    isPlainText = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    isHTML = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    protocol = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;gemini://&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    permalinkable = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on demande à générer les fichiers en fonction des formats de sortie :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[outputs]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    home = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    section = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    page = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous vouliez ajouter le format ATOM (par exemple sur votre page d&amp;rsquo;accueil pour avoir un /atom.xml), il suffit de l&amp;rsquo;ajouter dans la ligne &amp;ldquo;home = &amp;ldquo; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[outputs]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    home = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;ATOM&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    section = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    page = [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le nouveau format est donc appelé GEMINI qu&amp;rsquo;on ajoute aux sorties &amp;ldquo;home&amp;rdquo;, &amp;ldquo;section&amp;rdquo; et &amp;ldquo;page&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;À la prochaine compilation, &lt;strong&gt;cela va générer des fichiers gmi&lt;/strong&gt;. Du moins s&amp;rsquo;il y a des fichiers templates adéquats dans votre structure Hugo &amp;#x1f605;.&lt;/p&gt;
&lt;h2 id=&#34;quelques-templates-pour-hugo&#34;&gt;Quelques templates pour Hugo&lt;/h2&gt;
&lt;p&gt;Nous avons déclaré &lt;strong&gt;3 sorties&lt;/strong&gt; (en plus de Gemini). Donc nous avons théoriquement 3 templates à créer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un template pour la page d&amp;rsquo;accueil (&lt;strong&gt;layouts/index.gmi&lt;/strong&gt;),&lt;/li&gt;
&lt;li&gt;un template pour une page seule (&lt;strong&gt;layouts/_default/single.gmi&lt;/strong&gt;),&lt;/li&gt;
&lt;li&gt;et un template pour la liste des articles (&lt;strong&gt;layouts/_default/list.gmi&lt;/strong&gt;) contenus dans le dossier &amp;ldquo;post&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On créé donc le fichier &lt;strong&gt;layouts/index.gmi&lt;/strong&gt; pour la page d&amp;rsquo;accueil :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gotmpl&#34; data-lang=&#34;gotmpl&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Site.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## Derniers billets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;range&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;20&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;where&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;site&lt;span style=&#34;color:#4070a0&#34;&gt;.RegularPages&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;site&lt;span style=&#34;color:#4070a0&#34;&gt;.Params.mainSections&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.ByDate.Reverse&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Date.Format&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;2006-01-02&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; — &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## Autres pages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;site&lt;span style=&#34;color:#4070a0&#34;&gt;.GetPage&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/post&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Tous les billets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Site.BaseURL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Version HTML de ce site
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je fais simple pour le début :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le titre du site,&lt;/li&gt;
&lt;li&gt;une liste des 20 derniers billets précédés de la date,&lt;/li&gt;
&lt;li&gt;un lien vers la liste de tous les billets,&lt;/li&gt;
&lt;li&gt;et un lien vers la version HTML du site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans la même veine nous allons créer le fichier &lt;strong&gt;layouts/_default/list.gmi&lt;/strong&gt; pour afficher la liste des articles (contenus &lt;strong&gt;dans le dossier « post »&lt;/strong&gt;) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gotmpl&#34; data-lang=&#34;gotmpl&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Content&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plainify&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;range&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Pages.GroupByDate&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;2006&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Key&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;range&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Pages.ByDate.Reverse&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Date.Format&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;2006-01-02&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; — &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;site&lt;span style=&#34;color:#4070a0&#34;&gt;.Home.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Retour à l&amp;#39;accueil
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il affiche :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le titre du site,&lt;/li&gt;
&lt;li&gt;éventuellement le contenu d&amp;rsquo;un &lt;em&gt;_index.md&lt;/em&gt; contenu dans le dossier &amp;ldquo;post&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;puis affiche les articles groupés par année,&lt;/li&gt;
&lt;li&gt;pour chaque année il affiche la liste des articles sous forme d&amp;rsquo;un lien composé de la date et du titre de l&amp;rsquo;article,&lt;/li&gt;
&lt;li&gt;puis à la fin on affiche un lien pour revenir à l&amp;rsquo;accueil du site web.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il ne reste que le fichier &lt;strong&gt;layouts/_default/single.gmi&lt;/strong&gt; qui désigne l&amp;rsquo;affichage qu&amp;rsquo;aura un article au format Gemini. Je n&amp;rsquo;ai &lt;strong&gt;pas réinventé la roue, j&amp;rsquo;ai demandé à Internet&lt;/strong&gt; et voici le résultat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gotmpl&#34; data-lang=&#34;gotmpl&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Date.Format&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;2006-01-02&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Params.tags&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; — &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;delimit&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Params.tags&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Content&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Blocs de code : on les protège avant de retirer le reste des balises HTML */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;pre[^&amp;gt;]*&amp;gt;&amp;lt;code[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n```\n$1\n```\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Images -&amp;gt; lien gemtext dédié */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;img[^&amp;gt;]*src=&amp;#34;([^&amp;#34;]+)&amp;#34;[^&amp;gt;]*alt=&amp;#34;([^&amp;#34;]*)&amp;#34;[^&amp;gt;]*/?&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n=&amp;gt; $1 $2\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;img[^&amp;gt;]*src=&amp;#34;([^&amp;#34;]+)&amp;#34;[^&amp;gt;]*/?&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n=&amp;gt; $1\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Liens -&amp;gt; ligne &amp;#34;=&amp;gt; url texte&amp;#34; dédiée : gemtext exige que ce marqueur
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;     débute la ligne pour être reconnu comme un lien cliquable, donc on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;     l&amp;#39;isole avec un saut de ligne avant et après plutôt que de le laisser
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;     inline dans le paragraphe */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;a[^&amp;gt;]*href=&amp;#34;([^&amp;#34;]+)&amp;#34;[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/a&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n=&amp;gt; $1 $2\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Titres */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;h[1-6][^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/h[1-6]&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n### $1\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Listes */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;li[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/li&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;* $1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`&amp;lt;/?(ul|ol)[^&amp;gt;]*&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Paragraphes et sauts de ligne */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`&amp;lt;br\s*/?&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;{{- /* Reste des balises HTML : on jette */ -}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;replaceRE&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;`(?s)&amp;lt;[^&amp;gt;]+&amp;gt;`&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{-&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;htmlUnescape&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$content&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Version HTML de cet article
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.PrevInSection&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.PrevInSection.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Article précédent : &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.PrevInSection.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.NextInSection&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.NextInSection.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Article suivant : &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.NextInSection.Title&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;site&lt;span style=&#34;color:#4070a0&#34;&gt;.Home.OutputFormats.Get&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;GEMINI&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt;=&amp;gt; &lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;.Permalink&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;}}&lt;/span&gt; Retour à l&amp;#39;accueil
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le template va :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;afficher le titre,&lt;/li&gt;
&lt;li&gt;afficher la date, puis la liste des tags attribués à cet article,&lt;/li&gt;
&lt;li&gt;afficher le contenu de l&amp;rsquo;article en remplaçant d&amp;rsquo;abord les blocs de code, puis les images, puis les liens, puis les titres, puis les listes, puis les paragraphes et sauts de lignes et enfin le reste des balises HTML sont jetées,&lt;/li&gt;
&lt;li&gt;en bas de l&amp;rsquo;article on va afficher un lien HTML de l&amp;rsquo;article, un lien vers l&amp;rsquo;article précédent, un lien vers l&amp;rsquo;article suivant et finalement un lien pour retourner à l&amp;rsquo;accueil.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Il y a encore du boulot&lt;/strong&gt; pour avoir quelque chose de propre, mais c&amp;rsquo;est un bon début !&lt;/p&gt;
&lt;p&gt;On peut tester le résultat en faisant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ls ./public
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le dossier « public » devrait a minima contenir un fichier &lt;strong&gt;index.gmi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Passons à la publication du blog (appelé aussi &lt;em&gt;gemlogs&lt;/em&gt;).&lt;/p&gt;
&lt;h1 id=&#34;servir-les-fichiers-sur-lespace-gemini&#34;&gt;Servir les fichiers sur l&amp;rsquo;espace Gemini&lt;/h1&gt;
&lt;p&gt;À la découverte du protocole Gemini on découvre aussi &lt;strong&gt;pléthore d&amp;rsquo;outils/logiciels&lt;/strong&gt;. Et même une page Github nommée « awesome-gemini ».&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://geminiprotocol.net/software/&#34;&gt;Liste de logiciels connus par le site officiel geminiprotocol.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini&#34;&gt;Liste sous Github d&amp;rsquo;outils en tous genres autour du protocole Gemini&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pas facile de faire le tri, alors je suis allé au plus simple : un &lt;strong&gt;serveur léger et rapide&lt;/strong&gt;, relativement &lt;strong&gt;maintenu&lt;/strong&gt; et qui &lt;strong&gt;gère le certificat TLS auto-signé de longue durée&lt;/strong&gt; nécessaire à la création d&amp;rsquo;un espace Gemini. Un espace seulement (ne gère &lt;strong&gt;pas d&amp;rsquo;hôtes virtuels&lt;/strong&gt; appelés vhosts).&lt;/p&gt;
&lt;p&gt;Je parle d&amp;rsquo;&lt;strong&gt;Agate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mbrubeck/agate&#34;&gt;Découvrir le dépôt Github d&amp;rsquo;Agate&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;utiliser-le-serveur-agate-à-laide-de-docker-compose&#34;&gt;Utiliser le serveur Agate à l&amp;rsquo;aide de Docker Compose&lt;/h2&gt;
&lt;p&gt;En bref, j&amp;rsquo;ai fait un fichier &lt;strong&gt;docker-compose.yml&lt;/strong&gt; et un fichier &lt;strong&gt;.env&lt;/strong&gt; comme ceci (le fichier &lt;strong&gt;docker-compose.yml&lt;/strong&gt; en premier) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;agate&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ghcr.io/mbrubeck/agate:3.3.24&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;agate&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;unless-stopped&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;init&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Agate n&amp;#39;a besoin d&amp;#39;aucune capacité Linux particulière.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;cap_drop&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ALL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Empêche toute élévation de privilèges.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;security_opt&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;no&lt;/span&gt;-new-privileges:true&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Le système de fichiers du conteneur est en lecture seule.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Les seuls emplacements accessibles en écriture sont les volumes&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# explicitement montés et /tmp.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;read_only&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Agate n&amp;#39;a pas besoin d&amp;#39;un utilisateur root.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;user&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;${AGATE_UID}:${AGATE_GID}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;pids_limit&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;1965:1965/tcp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Contenu de la capsule Gemini&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ${DATA_DIR:-./data}:/gmi:ro&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Certificats et clés privées persistants&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ${CERTS_DIR:-./certs}:/certs&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;tmpfs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- /tmp:rw,noexec,nosuid,nodev,size=16m&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;--hostname&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;${DOMAIN_URL}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et mon fichier &lt;strong&gt;.env&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Nom de domaine de la capsule Gemini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DOMAIN_URL&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;gemini.example.org
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Répertoire contenant les fichiers Gemtext&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DATA_DIR&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;/srv/data/agate/gmi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Répertoire persistant contenant les certificats et clés privées&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;CERTS_DIR&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;/srv/data/agate/certs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# UID/GID utilisés par Agate dans le conteneur.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Le répertoire certs et le répertoire logs doivent appartenir à cet UID/GID.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;AGATE_UID&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;65534&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;AGATE_GID&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;65534&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les dossiers doivent exister et appartenir au UID/GID pour que tout fonctionne. Donc pensez à changer les permissions desdits dossiers &amp;#x1f609;. Par exemple chez moi j&amp;rsquo;ai dû faire :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; /srv/data/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p agate/gmi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chown 65534:65534 -R ./agate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pour que cela fonctionne.&lt;/p&gt;
&lt;h2 id=&#34;ouverture-de-ports&#34;&gt;Ouverture de ports&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est le &lt;strong&gt;port 1965&lt;/strong&gt; (sur &lt;strong&gt;TCP&lt;/strong&gt;) que le serveur Gemini utilise. Il faut donc penser à &lt;strong&gt;ouvrir le port de votre box&lt;/strong&gt;, de votre pare-feu ou tout autre élément bloquant les entrées/sorties.&lt;/p&gt;
&lt;p&gt;Une fois cela fait, démarrez le serveur Gemini (ici Agate). Quelque chose comme :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous devriez désormais avoir &lt;strong&gt;votre capsule Gemini&lt;/strong&gt;, bravo !&lt;/p&gt;
&lt;p&gt;Mais au fait, comment se rendre sur l&amp;rsquo;espace Gemini ?&lt;/p&gt;
&lt;h1 id=&#34;naviguer-dans-lespace-gemini&#34;&gt;Naviguer dans l&amp;rsquo;espace Gemini&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;C&amp;rsquo;est bien beau d&amp;rsquo;avoir un serveur Gemini, mais comment y accéder ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afin de naviguer dans le Geminispace vous avez &lt;strong&gt;besoin d&amp;rsquo;un navigateur compatible&lt;/strong&gt;. Si vous êtes patients et méthodique, vous trouverez une liste de clients Gemini sur la page suivante :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://geminiprotocol.net/software/&#34;&gt;Liste de logiciels connus par le site officiel geminiprotocol.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ou encore sur Github :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini#clients&#34;&gt;Section « clients » de la page Github qui liste des projets pour le protocole Gemini&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et si vous êtes paresseux - comme moi - vous pouvez utiliser l&amp;rsquo;un de ceux que je propose pour chaque type de navigateurs parmi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un client graphique compatible Linux, MacOSX et Windows : &lt;strong&gt;Lagrange&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;un client en ligne de commande (sous GNU/Linux) : &lt;strong&gt;amfora&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;et une navigation via un proxy HTTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://git.skyjake.fi/gemini/lagrange&#34;&gt;Navigateur graphique multiplateformes Lagrange&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/makew0rld/amfora&#34;&gt;amfora, un navigateur en ligne de commande&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://portal.mozz.us/&#34;&gt;Portail portal.mozz.us pour accéder à Gemini par HTTP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dans la situation où cela vous débéquette d&amp;rsquo;installer un énième logiciel, le proxy HTTP est une bonne alternative. Il en existe d&amp;rsquo;autres évidemment.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini#web-proxies&#34;&gt;Section « web-proxies » de la liste Github « awesome-gemini »&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Passer à Gemini depuis Hugo semble se passer &lt;strong&gt;relativement bien&lt;/strong&gt; et &lt;strong&gt;assez facilement&lt;/strong&gt; après quelques bidouilles. Et je dis bien bidouille car, si vous le remarquez bien, ce article a été écrit de manière différente : je place les liens &lt;strong&gt;après&lt;/strong&gt; les phrases et paragraphes.&lt;/p&gt;
&lt;p&gt;En effet un lien Gemini commence en début de ligne sous un format spécial :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gemtext&#34; data-lang=&#34;gemtext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;https://perdu.com&lt;/span&gt; &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;Je suis perdu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ainsi, entre le HTML où les liens se trouvent à n&amp;rsquo;importe quel endroit et le gemtext (format Gemini) dans lequel je voudrais afficher les liens, je dois faire des sauts de ligne et afficher le lien. Ce qui découpe fortement les articles déjà existants.&lt;/p&gt;
&lt;p&gt;En dehors de la lisibilité, &lt;strong&gt;le blog s&amp;rsquo;étend désormais sur Gemini depuis le 8 septembre&lt;/strong&gt; au soir. Vous pouvez le consulter sur un proxy HTTP dont je vous donne le lien ci-après :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://portal.mozz.us/gemini/olivier.dossmann.net/&#34;&gt;Le site Olivier DOSSMANN sur le protocole Gemini via le portail « proxy » portal.mozz.us&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Revoir les articles m&amp;rsquo;a amené à constater qu&amp;rsquo;il manque encore des sujets de mon ancien blog nommé « Le BlankoJoueb » que vous pouvez trouver à l&amp;rsquo;adresse suivante (pour les petits curieux) :&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blanko.pages-perso.free.fr/joueb/&#34;&gt;Le BlankoJoueb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avance doucement mais sûrement vers le Geminispace dont nous parlerons encore sur ce blog. Ça vaudra le détour avec ce que je vais sortir &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gemini_(protocole)&#34;&gt;Définition du protocole Gemini par Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Gopher&#34;&gt;Découverte du protocole Gopher par Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://eur-lex.europa.eu/FR/legal-content/summary/general-data-protection-regulation-gdpr.html&#34;&gt;Règlement Général sur la Protection des Données (RGPD)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kaamelott-gifboard.fr/gif/on-en-a-gros&#34;&gt;GIF animé évoquant « On en a gros » de la série TV Kaamelott&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.bortzmeyer.org/gemini.html&#34;&gt;« Le protocole Gemini, revenir à du simple et sûr pour distribuer l&amp;rsquo;information en ligne ? » par Stéphane Bortzmeyer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ploum.net/gemini-le-protocole-du-slow-web/index.html&#34;&gt;« Gemini, le protocole du slow web » par Ploum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.flozz.fr/2023/04/12/decollage-ce-blog-vient-detre-propulse-dans-le-geminispace/&#34;&gt;« Décollage : ce blog vient d&amp;rsquo;être propulsé dans le Geminispace ! » par Flozz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://flickr.com/photos/cogdog/&#34;&gt;Profil de Alan Levine sur Flickr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2016/03/hugo_le_moteur_de_blog_statique_rapide_et_moderne/&#34;&gt;Mon article sur Hugo, le moteur de blog statique rapide et moderne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Gemini_(protocol)#Gemtext_format&#34;&gt;Format Gemtext du protocole Gemini suivant Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://admin.flounder.online/gemini_text_guide.gmi&#34;&gt;« Writing Gemtext (.gmi) » par Flounder (small web)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.mkamarin.com/posts/xhugo2ggx/&#34;&gt;« Converting hugo sites to Gopher Hole and/or to Gemini Capsule » par Mike A. Marin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.alkahan.net/post/2026/04/20260426-une-capsule-gemini-avec-hugo/&#34;&gt;« Une capsule gemini avec Hugo » par Alkahan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bacardi55.io/2021/02/13/managing-this-site-and-my-gemini-capsule-with-hugo/&#34;&gt;« Managing this site and my gemini capsule with Hugo » par bacardi55&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mkamarin/Hugo-2-Gopher-and-Gemini&#34;&gt;Dépôt Github de mkamarin concernant le projet Hugo-2-Gopher-and-Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://geminiprotocol.net/software/&#34;&gt;Liste de logiciels connus par le site officiel geminiprotocol.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini&#34;&gt;Liste sous Github d&amp;rsquo;outils en tous genres autour du protocole Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mbrubeck/agate&#34;&gt;Découvrir le dépôt Github d&amp;rsquo;Agate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini#clients&#34;&gt;Section « clients » de la page Github qui liste des projets pour le protocole Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git.skyjake.fi/gemini/lagrange&#34;&gt;Navigateur graphique multiplateformes Lagrange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/makew0rld/amfora&#34;&gt;amfora, un navigateur en ligne de commande&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://portal.mozz.us/&#34;&gt;Portail portal.mozz.us pour accéder à Gemini par HTTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kr1sp1n/awesome-gemini#web-proxies&#34;&gt;Section « web-proxies » de la liste Github « awesome-gemini »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://portal.mozz.us/gemini/olivier.dossmann.net/&#34;&gt;Le site Olivier DOSSMANN sur le protocole Gemini via le portail « proxy » portal.mozz.us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blanko.pages-perso.free.fr/joueb/&#34;&gt;Le BlankoJoueb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Firmware CrossPoint (&#43; WebDAV) sur la liseuse Xteink X4</title>
      <link>https://olivier.dossmann.net/2026/08/firmware-crosspoint--webdav-sur-la-liseuse-xteink-x4/</link>
      <pubDate>Wed, 05 Aug 2026 13:56:53 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/08/firmware-crosspoint--webdav-sur-la-liseuse-xteink-x4/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;De temps en temps je lis les nouvelles du site &lt;a href=&#34;https://www.minimachines.net/&#34;&gt;MiniMachines&lt;/a&gt; qui publie des bons plans sur du matériel - mais pas que. C&amp;rsquo;est toujours l&amp;rsquo;occasion de savoir où en sont les prix du marché de l&amp;rsquo;informatique (notamment les ordinateurs, les périphériques et les composants électroniques). J&amp;rsquo;avoue que c&amp;rsquo;est comme une forme de &lt;a href=&#34;https://www.urbandictionary.com/define.php?term=pron&#34; title=&#34;Définition de pr0n suivant l&#39;Urban Dictionary&#34;&gt;&lt;em&gt;pr0n&lt;/em&gt;&lt;/a&gt; pour certains geeks &amp;#x1f605;.&lt;/p&gt;
&lt;p&gt;Je suis ainsi tombé sur un &lt;a href=&#34;https://www.minimachines.net/actu/xteink-4-pro-liseuse-142435&#34;&gt;article concernant &lt;strong&gt;la micro liseuse Xteink 4 Pro&lt;/strong&gt; à 4.3 pouces de diagonale écran&lt;/a&gt;. Si d&amp;rsquo;emblée l&amp;rsquo;appareil ne m&amp;rsquo;intéresse pas - car &lt;strong&gt;trop petit&lt;/strong&gt; - j&amp;rsquo;ai immédiatement &lt;strong&gt;pensé à quelqu&amp;rsquo;un de la famille à qui ça pourrait plaire&lt;/strong&gt;. Une personne qui aime lire mais n&amp;rsquo;a pas - encore - de liseuse et dont l&amp;rsquo;anniversaire arrive prochainement. Parfait, ça ne pouvait pas mieux tomber !&lt;/p&gt;
&lt;p&gt;Dans cet article je vais vous parler du &lt;strong&gt;choix de la liseuse&lt;/strong&gt;, la &lt;strong&gt;découverte d&amp;rsquo;un firmware (pilote) alternatif&lt;/strong&gt; et ensuite l&amp;rsquo;&lt;strong&gt;installation de celui-ci&lt;/strong&gt;. Et enfin, suite à &lt;strong&gt;quelques désagréments&lt;/strong&gt;, comment et pourquoi &lt;strong&gt;j&amp;rsquo;ai activé un accès WebDAV&lt;/strong&gt; sur cette liseuse.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/xteink_x4.jpg&#34; alt=&#34;Liseuse Xteink X4 avec sa boîte et son manuel utilisateur posés sur une table de couleur verte&#34; title=&#34;Liseuse Xteink X4&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;la-liseuse&#34;&gt;La liseuse&lt;/h1&gt;
&lt;p&gt;Je me renseigne pour en savoir plus sur ces liseuses Xteink et ce qu&amp;rsquo;elles valent. Sur le &lt;a href=&#34;https://www.xteink.com/fr&#34;&gt;site officiel Xteink&lt;/a&gt; &lt;strong&gt;plusieurs modèles sont proposés&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xteink X4 Pro&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xteink X4&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xteink X3&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ci-après une &lt;strong&gt;image comparative&lt;/strong&gt; (prise de chez MiniMachines, sûrement elle-même prise de chez Xteink) &lt;strong&gt;des 3 modèles&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/xteink_x4_comparaison.jpg&#34; alt=&#34;Comparaison en 3 colonnes des 3 modèles de liseuses de chez Xteink à savoir la X3, la X4 et la X4 Pro&#34; title=&#34;Tableau comparatif des 3 modèles de liseuses. X3, X4 et X4 Pro (de droite à gauche)&#34;&gt;&lt;/p&gt;
&lt;p&gt;A priori le &lt;strong&gt;modèle intermédiaire&lt;/strong&gt;, c&amp;rsquo;est à dire la &lt;strong&gt;Xteink X4&lt;/strong&gt;, &lt;strong&gt;serait idéal&lt;/strong&gt; pour le cadeau d&amp;rsquo;anniversaire que je souhaite faire. Cependant je tombe sur l&amp;rsquo;&lt;a href=&#34;https://www.liseuses.net/xteink-x4-test-liseuse/&#34; title=&#34;Se rendre sur la page de liseuses.net concernant le test de la Xteink X4&#34;&gt;&lt;strong&gt;article de Liseuses.net concernant la Xteink X4&lt;/strong&gt;&lt;/a&gt;. Pour récapituler &lt;strong&gt;ce que j&amp;rsquo;en comprends&lt;/strong&gt; : la liseuse fait parler d&amp;rsquo;elle non pas pour &lt;strong&gt;son interface utilisateur - à chier&lt;/strong&gt;, il faut dire ce qui est - mais pour à la fois &lt;strong&gt;son prix ET son pilote alternatif disponible sur Internet&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;découverte-puis-installation-du-pilote-alternatif-crosspoint&#34;&gt;Découverte puis installation du pilote alternatif CrossPoint&lt;/h1&gt;
&lt;p&gt;Mais de quel pilote parlons-nous ? Il s&amp;rsquo;agit du &lt;a href=&#34;https://crosspointreader.com/&#34;&gt;&lt;strong&gt;pilote CrossPoint&lt;/strong&gt; disponible sur crosspointreader.com&lt;/a&gt;. C&amp;rsquo;est un pilote &lt;strong&gt;open source&lt;/strong&gt; permettant d&amp;rsquo;&lt;strong&gt;améliorer l&amp;rsquo;expérience utilisateur&lt;/strong&gt; sur plusieurs liseuses. Sur la Xteink X4 &lt;strong&gt;cela offre plus de fonctionnalités&lt;/strong&gt; et s&amp;rsquo;exprime par :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une &lt;strong&gt;meilleure mise en forme du texte&lt;/strong&gt; et une meilleure &lt;strong&gt;mise en page&lt;/strong&gt; des ebooks (livres numériques),&lt;/li&gt;
&lt;li&gt;davantage de &lt;strong&gt;polices&lt;/strong&gt; et d&amp;rsquo;&lt;strong&gt;options de configuration&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;amélioration du &lt;strong&gt;système de menus&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;de meilleurs &lt;strong&gt;outils pour transférer les ebooks&lt;/strong&gt; vers la Xteink X4,&lt;/li&gt;
&lt;li&gt;et une &lt;strong&gt;prise en charge de langues&lt;/strong&gt; supplémentaires (comme le &lt;strong&gt;Français&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En somme ce pilote promet monts et merveilles et devrait nous propulser &lt;strong&gt;vers l&amp;rsquo;infini et au delà&lt;/strong&gt; ! (pour ceux qui ont la référence &amp;#x1f609;) Voyons &lt;strong&gt;comment l&amp;rsquo;installer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A priori c&amp;rsquo;est simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on &lt;strong&gt;branche la liseuse en USB&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;on se rend sur le &lt;strong&gt;site de CrossPoint&lt;/strong&gt;, plus spécifiquement sur l&amp;rsquo;&lt;a href=&#34;https://crosspointreader.com/#flash-tools&#34;&gt;URL permettant de « flasher » la liseuse avec CrossPoint&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;on &lt;strong&gt;choisi son appareil&lt;/strong&gt;, ici Xteink X4,&lt;/li&gt;
&lt;li&gt;puis on &lt;strong&gt;sélectionne le pilote à installer&lt;/strong&gt; (notez que Stock English et Stock Chinese permettent de réinstaller la version d&amp;rsquo;origine de la liseuse), on sélectionne CrossPoint v1.5.0,&lt;/li&gt;
&lt;li&gt;et on &lt;strong&gt;clique sur le bouton « Flash CrossPoint »&lt;/strong&gt; (un menu apparaît dans le navigateur pour sélectionner l&amp;rsquo;appareil sur lequel installer).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/crosspointreader_flash_xteink_x4.png&#34; alt=&#34;Méthode pour flasher la Xteink X4 sur le site de CrossPoint&#34; title=&#34;Image présentant le formulaire pour flasher la liseuse Xteink X4 sur le site crosspointreader.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;Simple comme bonjour, mais compliqué comme de l&amp;rsquo;informatique : ça n&amp;rsquo;a pas fonctionné chez moi. Serait-ce le karma et mes choix de vie qui influent &amp;#x1f602; ? Non pas du tout, chaque difficulté avait une solution.&lt;/p&gt;
&lt;p&gt;Premièrement &lt;strong&gt;il faut un navigateur compatible&lt;/strong&gt;, par exemple &lt;strong&gt;Chrome&lt;/strong&gt;. Chez moi : Chromium (sous ArchLinux). Ensuite, toujours &lt;strong&gt;sous ArchLinux, la liseuse n&amp;rsquo;était pas reconnue&lt;/strong&gt;. Je vous rassure : il y a peu de chance que vous ayez le même souci sur Windows ou sur tout autre système GNU/Linux. Comment le régler si jamais ? Il suffit d&amp;rsquo;&lt;strong&gt;ajouter votre utilisateur au groupe uucp&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo gpasswd -a olivier uucp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pensez à redémarrer la session utilisateur.&lt;/p&gt;
&lt;p&gt;Et vous voilà avec un nouveau pilote, une liseuse toute neuve et superbement utilisable ! Alors pourquoi n&amp;rsquo;étais-je &lt;strong&gt;pas content jusqu&amp;rsquo;au bout&lt;/strong&gt; ?&lt;/p&gt;
&lt;h1 id=&#34;accès-à-une-bibliothèque-auto-hébergée&#34;&gt;Accès à une bibliothèque auto-hébergée&lt;/h1&gt;
&lt;p&gt;Pour &lt;strong&gt;transférer des fichiers&lt;/strong&gt; (et donc des livres) sur la Xteink X4 (avec un pilote CrossPoint fraîchement installé) nous avons - à ma connaissance - &lt;strong&gt;plusieurs façons&lt;/strong&gt; de procéder :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;utiliser la &lt;strong&gt;carte micro SD&lt;/strong&gt; sur un ordinateur, puis la remettre dans la liseuse,&lt;/li&gt;
&lt;li&gt;utiliser le menu « Transfert de fichiers » dans le menu principal de la liseuse et choisir « Rejoindre un réseau ». Cela permettra d&amp;rsquo;&lt;strong&gt;accéder depuis son ordinateur à une interface Web&lt;/strong&gt; contenant un onglet pour gérer les fichiers contenus sur la liseuse,&lt;/li&gt;
&lt;li&gt;utiliser ce même menu de transfert de fichiers pour sélectionner « &lt;strong&gt;Connexion Calibre&lt;/strong&gt; sans fil »,&lt;/li&gt;
&lt;li&gt;aller dans « Réglages » &amp;gt; « Système » &amp;gt; « OPDS Servers », puis ajouter un lien vers un &lt;strong&gt;serveur OPDS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cette dernière option implique d&amp;rsquo;avoir un serveur OPDS installé. &lt;a href=&#34;https://fr.wikipedia.org/wiki/OPDS&#34;&gt;&lt;strong&gt;Qu&amp;rsquo;est OPDS&lt;/strong&gt;&lt;/a&gt; ? Je vais faire simple : un &lt;strong&gt;format de syndication&lt;/strong&gt; (comme les flux RSS si on veut) développé &lt;strong&gt;par des groupes comme Internet Archive&lt;/strong&gt; (dont vous connaissez sûrement la &lt;a href=&#34;https://web.archive.org/&#34;&gt;WayBack Machine&lt;/a&gt; pour consulter des &amp;ldquo;snapshots&amp;rdquo; d&amp;rsquo;un site web dans le temps) &lt;strong&gt;ou&lt;/strong&gt; encore &lt;strong&gt;les Éditions O&amp;rsquo;Reilly&lt;/strong&gt; (qui fabriquent des livres d&amp;rsquo;informatique). En gros tu mets un serveur, tu t&amp;rsquo;y connectes et tu peux récupérer des articles, des livres, etc. au format numérique. &lt;strong&gt;C&amp;rsquo;est une bibliothèque numérique&lt;/strong&gt; en somme !&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est très pratique à l&amp;rsquo;usage, mais pas à la préparation : il faut monter un serveur OPDS. On pourrait donc se rapatrier sur une connexion Calibre sans fil, mais là encore ça demande l&amp;rsquo;installation d&amp;rsquo;un outil particulier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La personne&lt;/strong&gt; à qui j&amp;rsquo;offre la liseuse &lt;strong&gt;a accès à un serveur &lt;a href=&#34;https://opencloud.eu/en&#34;&gt;OpenCloud&lt;/a&gt;&lt;/strong&gt;. Ce service &lt;strong&gt;propose un serveur &lt;a href=&#34;https://fr.wikipedia.org/wiki/WebDAV&#34;&gt;WebDAV&lt;/a&gt;&lt;/strong&gt;. Récemment j&amp;rsquo;ai pu lire un &lt;a href=&#34;https://www.fredix.xyz/2026/08/ebook-autohebergement/&#34;&gt;article concernant l&amp;rsquo;utilisation de KOreader sur une liseuse pour accéder au WebDAV d&amp;rsquo;un serveur OpenCloud&lt;/a&gt;. Cela tombe bien car cela pourrait être très pratique pour la personne !&lt;/p&gt;
&lt;p&gt;Fort de cela, j&amp;rsquo;apprend que &lt;a href=&#34;https://github.com/crosspoint-reader/crosspoint-reader/discussions/2097#discussioncomment-17627253&#34;&gt;la communauté des utilisateurs Xteink X4 discute d&amp;rsquo;une possibilité d&amp;rsquo;inclure WebDAV dans CrossPoint&lt;/a&gt;. Et qu&amp;rsquo;une &lt;a href=&#34;https://github.com/mmajewsk/crosspoint-reader/tree/feature/webdav-client&#34;&gt;branche d&amp;rsquo;un fork du &lt;strong&gt;dépôt propose un avant-goût de la fonctionnalité WebDAV&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tentons l&amp;rsquo;aventure !&lt;/p&gt;
&lt;h1 id=&#34;installation-dun-pilote-alternatif-crosspoint-ayant-webdav&#34;&gt;Installation d&amp;rsquo;un pilote alternatif CrossPoint ayant WebDAV&lt;/h1&gt;
&lt;p&gt;La &lt;strong&gt;procédure d&amp;rsquo;installation&lt;/strong&gt; d&amp;rsquo;un pilote &lt;strong&gt;est similaire à celle que nous avions faite&lt;/strong&gt; avant.&lt;/p&gt;
&lt;p&gt;Cependant, &lt;strong&gt;ce qui change :&lt;/strong&gt; on doit &lt;strong&gt;compiler le pilote&lt;/strong&gt; nous-même avec le dépôt fourni. Étant sous ArchLinux je vais décrire la procédure utilisée sur ma machine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On commence par le &lt;strong&gt;dépôt non-officiel&lt;/strong&gt; suivant : &lt;a href=&#34;https://github.com/mmajewsk/crosspoint-reader/tree/feature/webdav-client&#34;&gt;https://github.com/mmajewsk/crosspoint-reader/tree/feature/webdav-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On duplique le dépôt, et on &lt;strong&gt;se rend sur la branche webdav-client&lt;/strong&gt; puis on télécharge les sous-modules git :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/mmajewsk/crosspoint-reader.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; crosspoint-reader
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git switch feature/webdav-client
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule update --init --recursive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;On a besoin de &lt;strong&gt;la commande pio&lt;/strong&gt;, disponible dans le paquet « platformio-core » (Cf. le &lt;a href=&#34;https://wiki.archlinux.org/title/Arduino#PlatformIO&#34;&gt;wiki ArchLinux concernant PlatformIO sur la page Arduino&lt;/a&gt;) :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pacman -S platformio-core
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;De là on peut enfin &lt;strong&gt;compiler le pilote&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pio run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Une fois la compilation terminée, le &lt;strong&gt;pilote est disponible dans le dossier .pio/build/default&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Il se nomme &lt;strong&gt;firmware.bin&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;On réutilise le &lt;a href=&#34;https://crosspointreader.com/#flash-tools&#34;&gt;&lt;strong&gt;site web de CrossPoint pour flasher la liseuse&lt;/strong&gt;&lt;/a&gt;, mais cette fois on choisit l&amp;rsquo;option « &lt;strong&gt;Custom bin&lt;/strong&gt; »,&lt;/li&gt;
&lt;li&gt;On sélectionne notre fichier &lt;strong&gt;firmware.bin&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Et on clique sur le bouton « &lt;strong&gt;Flash CrossPoint&lt;/strong&gt; ».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WebDAV fait&lt;/strong&gt; désormais &lt;strong&gt;partie du menu principal&lt;/strong&gt; ! J&amp;rsquo;ai testé rapidement avec un dossier WebDAV à moi : &lt;strong&gt;cela fonctionne bien&lt;/strong&gt;. Je suis content, &lt;strong&gt;désormais le cadeau est prêt à être emballé&lt;/strong&gt; &amp;#x1f60b;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Avec un &lt;strong&gt;prix aussi avantageux et un pilote alternatif aussi riche&lt;/strong&gt;, cette liseuse &lt;strong&gt;Xteink X4 est une très belle opportunité&lt;/strong&gt; de faire un &lt;strong&gt;cadeau sympathique&lt;/strong&gt; à une personne qu&amp;rsquo;on apprécie.&lt;/p&gt;
&lt;p&gt;Après avoir &lt;strong&gt;compilé puis flashé le nouveau pilote&lt;/strong&gt; basé sur CrossPoint, &lt;strong&gt;on accède à un menu WebDAV&lt;/strong&gt; qui va changer la vie à la personne à qui j&amp;rsquo;offre cette liseuse. J&amp;rsquo;espère que ça lui plaira et qu&amp;rsquo;elle sera contente de pouvoir ajouter son propre dossier WebDAV contenant ses ebooks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les manipulations&lt;/strong&gt; autour de cette liseuse &lt;strong&gt;sont relativement simples&lt;/strong&gt; et j&amp;rsquo;espère que cela vous motivera aussi à en avoir une ou tout simplement à en offrir une.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; : au 14 août (et peut-être avant), le site constructeur Xteink affichait l&amp;rsquo;épuisement du stock des liseuses X4 et l&amp;rsquo;abandon de cette dernière. &lt;strong&gt;Cependant le modèle X4 Pro&lt;/strong&gt; est toujours disponible et succède la X4. Le pilote CrossPoint fonctionne aussi avec ce modèle.&lt;/p&gt;
&lt;p&gt;Sachez également que &lt;a href=&#34;https://www.readme.club/firmware&#34;&gt;la communauté des liseuses Xteink X3, X4 et X4 Pro a fabriqué &lt;strong&gt;tout un tas de pilotes disponibles sur le site readme.club&lt;/strong&gt;&lt;/a&gt;. Il y a des jeux proposés, de nouvelles fonctionnalités et même un sniffeur réseau wifi. &lt;strong&gt;De quoi pousser l&amp;rsquo;expérience utilisateur encore plus loin&lt;/strong&gt; !&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.minimachines.net/&#34;&gt;MiniMachines&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.urbandictionary.com/define.php?term=pron&#34; title=&#34;Définition de pr0n suivant l&#39;Urban Dictionary&#34;&gt;Définition du mot pr0n suivant l&amp;rsquo;Urban Dictionary&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.minimachines.net/actu/xteink-4-pro-liseuse-142435&#34;&gt;Article de MiniMachines concernant la micro liseuse Xteink 4 Pro&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.xteink.com/fr&#34;&gt;Site officiel Xteink&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.liseuses.net/xteink-x4-test-liseuse/&#34;&gt;Article de Liseuses.net concernant la Xteink X4&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://crosspointreader.com/&#34;&gt;Pilote CrossPoint disponible sur crosspointreader.com&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://crosspointreader.com/#flash-tools&#34;&gt;URL permettant de « flasher » la liseuse avec CrossPoint&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/OPDS&#34;&gt;Ce qu&amp;rsquo;est OPDS (suivant Wikipedia)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/&#34;&gt;La WayBack Machine&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://opencloud.eu/en&#34;&gt;OpenCloud&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/WebDAV&#34;&gt;WebDAV (suivant Wikipedia)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fredix.xyz/2026/08/ebook-autohebergement/&#34;&gt;Article concernant l&amp;rsquo;utilisation de KOreader sur une liseuse pour accéder au WebDAV d&amp;rsquo;un serveur OpenCloud&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/crosspoint-reader/crosspoint-reader/discussions/2097#discussioncomment-17627253&#34;&gt;Possibilité d&amp;rsquo;inclure WebDAV dans CrossPoint suivant la communauté des utilisateurs Xteink X4&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mmajewsk/crosspoint-reader/tree/feature/webdav-client&#34;&gt;Branche webdav-client d&amp;rsquo;un fork de CrossPoint Reader pour avoir un avant-goût de la fonctionnalité WebDAV&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/Arduino#PlatformIO&#34;&gt;PlatformIO sur la page Arduino du wiki d&amp;rsquo;ArchLinux&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.readme.club/firmware&#34;&gt;Ensemble de pilotes alternatifs pour la Xteink X3, X4 et X4 Pro par leur communauté sur readme.club&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>BT-22 Wingman Elite, un chargeur de batterie en 1 clic</title>
      <link>https://olivier.dossmann.net/2026/07/bt22_wingman_elite_chargeur_batterie/</link>
      <pubDate>Thu, 30 Jul 2026 16:27:15 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/07/bt22_wingman_elite_chargeur_batterie/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;À la suite d&amp;rsquo;une multitude d&amp;rsquo;échanges avec un ami &lt;strong&gt;je découvre&lt;/strong&gt; l&amp;rsquo;existence d&amp;rsquo;&lt;strong&gt;un petit appareil nommé&lt;/strong&gt; le &lt;a href=&#34;https://www.kodai-industries.com/collections/bt-22-wingman-elite&#34;&gt;&lt;strong&gt;BT-22&lt;/strong&gt; Wingman Elite de chez Kodai Industries&lt;/a&gt;. Nous allons voir à quoi cela ressemble et pour quel(s) usage(s). Je vous donnerai mes impressions sur ce produit qui &lt;strong&gt;permet de charger nos objets électroniques&lt;/strong&gt; tels que téléphone mobile, écouteurs sans fils, liseuse, console de jeux portable, ordinateur portable, etc.&lt;/p&gt;
&lt;p&gt;Pour information, je n&amp;rsquo;ai &lt;strong&gt;aucun lien d&amp;rsquo;affiliation avec le constructeur&lt;/strong&gt; et/ou le vendeur. Je ne fais que partager &lt;strong&gt;mes impressions sur un appareil que j&amp;rsquo;ai acheté&lt;/strong&gt; récemment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/BT-22.png&#34; alt=&#34;Image du BT-22 et sa lanière&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;présentation&#34;&gt;Présentation&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;ai ainsi fini par craquer pour le &lt;strong&gt;BT-22 Wingman Elite&lt;/strong&gt; de chez Kodai Industries, un &lt;strong&gt;chargeur de batterie externe&lt;/strong&gt; qui ne vient pas avec sa batterie intégrée : on &lt;strong&gt;choisit son propre &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_battery_sizes#Lithium-ion_batteries_(rechargeable)&#34;&gt;modèle de batterie&lt;/a&gt;&lt;/strong&gt; (18650 ou 21700]) qu&amp;rsquo;on glisse dedans. &lt;strong&gt;Un clic&lt;/strong&gt;, et on peut utiliser l&amp;rsquo;ensemble &lt;strong&gt;pour charger&lt;/strong&gt; la batterie ou nos appareils électroniques !&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est &lt;strong&gt;simple, pratique&lt;/strong&gt; et cela utilise l&amp;rsquo;&lt;strong&gt;USB PD&lt;/strong&gt; (Power Delivery) pour négocier automatiquement la bonne puissance avec l&amp;rsquo;appareil branché et ainsi &lt;strong&gt;favoriser une charge rapide&lt;/strong&gt;. Résultat : ça charge vite, et &lt;strong&gt;c&amp;rsquo;est simple d&amp;rsquo;utilisation&lt;/strong&gt; - un seul bouton, un seul clic. Parfait &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Livré sans batterie&lt;/strong&gt; - comme je le disais déjà - il est intéressant de commander ses propres batteries sur un site de vente en ligne de produit pour cigarettes électroniques (batterie 18650 ou 21700) ou un vendeur spécialisé. Dans mon cas cela a été des &lt;a href=&#34;https://www.nkon.nl/fr/bak-n21700-45d-4400mah-60a.html&#34;&gt;&lt;strong&gt;batteries BAK 45D 21700 à 4500Mah&lt;/strong&gt; - 60A sur nkon.nl&lt;/a&gt;. J&amp;rsquo;en suis content.&lt;/p&gt;
&lt;h1 id=&#34;description-du-produit&#34;&gt;Description du produit&lt;/h1&gt;
&lt;p&gt;Le &lt;strong&gt;BT-22 Wingman Elite&lt;/strong&gt; de chez Kodai Industries possède les &lt;strong&gt;caractéristiques suivantes&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Insertion d&amp;rsquo;une batterie &lt;strong&gt;en 1 clic&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;appareil est au &lt;strong&gt;format carte de crédit&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;37 g&lt;/strong&gt;rammes (sans batterie),&lt;/li&gt;
&lt;li&gt;Affichage du &lt;strong&gt;niveau de batterie&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;3 modes :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;charge rapide&lt;/strong&gt; (sortie &lt;strong&gt;9V/12V&lt;/strong&gt;),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mode éco&lt;/strong&gt; (sortie &lt;strong&gt;5V&lt;/strong&gt; seulement),&lt;/li&gt;
&lt;li&gt;mode &amp;ldquo;courant&amp;rdquo; : l&amp;rsquo;appareil n&amp;rsquo;est &lt;strong&gt;pas en sommeil&lt;/strong&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fonctionne avec plusieurs batteries. Il est &lt;strong&gt;compatible&lt;/strong&gt; avec de &lt;strong&gt;multiples appareils&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Livré avec une &lt;strong&gt;lanière composée d&amp;rsquo;un câble USB&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Module de lampe&lt;/strong&gt; avec 4 modes :
&lt;ul&gt;
&lt;li&gt;Lumière blanche/mélangée,&lt;/li&gt;
&lt;li&gt;Lumière froide,&lt;/li&gt;
&lt;li&gt;Lumière chaude,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode SOS&lt;/strong&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apparence travaillée&lt;/strong&gt; façon futuriste.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut également &lt;strong&gt;commander un support&lt;/strong&gt; pour poser le chargeur et ses batteries.&lt;/p&gt;
&lt;p&gt;Le produit est disponible sur le &lt;a href=&#34;https://www.kodai-industries.com/&#34;&gt;site officiel de Kodai Industries&lt;/a&gt;. Il est à &lt;strong&gt;environ 30€&lt;/strong&gt; avec des &lt;strong&gt;frais de ports d&amp;rsquo;environ 11€&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;mes-impressions&#34;&gt;Mes impressions&lt;/h1&gt;
&lt;p&gt;Le &lt;strong&gt;tarif&lt;/strong&gt; est &lt;strong&gt;relativement correct&lt;/strong&gt; pour ce type d&amp;rsquo;objet et ce qu&amp;rsquo;il propose. Oui, c&amp;rsquo;est plus cher qu&amp;rsquo;une &amp;ldquo;powerbank&amp;rdquo; classique : à budget égal vous trouverez une powerbank de capacité supérieure. Mais l&amp;rsquo;argument qui m&amp;rsquo;a convaincu est ailleurs : &lt;strong&gt;quand la batterie est usée, on ne change qu&amp;rsquo;elle&lt;/strong&gt;, pas tout l&amp;rsquo;appareil. C&amp;rsquo;est plus &lt;strong&gt;écologique&lt;/strong&gt; qu&amp;rsquo;une &amp;ldquo;powerbank&amp;rdquo; qu&amp;rsquo;on jette entièrement au bout de deux ans - ce qui est discutable à cause du trajet de livraison. &lt;strong&gt;Plus souple à l&amp;rsquo;usage&lt;/strong&gt; aussi, puisqu&amp;rsquo;on peut &lt;strong&gt;choisir la capacité de sa batterie selon ses besoins&lt;/strong&gt; du moment. Et s&amp;rsquo;il faut plus de capacité de recharge, on emmène avec soi plusieurs batteries.&lt;/p&gt;
&lt;p&gt;En revanche, &lt;strong&gt;je raille&lt;/strong&gt; légèrement : le câble USB en dragonne (un câble qui s&amp;rsquo;enroule et se porte comme un bracelet) est une excellente idée sur le papier, mais cette &lt;strong&gt;lanière s&amp;rsquo;est révélé très fragile&lt;/strong&gt;. Dommage.&lt;/p&gt;
&lt;p&gt;Un module lumineux est fourni. Je ne vois absolument pas à quoi il sert au quotidien, mais je me dis qu&amp;rsquo;il doit bien y avoir une utilisation que je n&amp;rsquo;ai pas encore trouvé.&lt;/p&gt;
&lt;p&gt;Petite anecdote encore, mon &lt;strong&gt;premier exemplaire est arrivé abîmé&lt;/strong&gt; par le transport : il &lt;strong&gt;chauffait énormément&lt;/strong&gt; et &lt;strong&gt;était inutilisable&lt;/strong&gt;. Le &lt;strong&gt;SAV a été bluffant&lt;/strong&gt; de réactivité : &lt;strong&gt;échange immédiat&lt;/strong&gt;, contre simplement une photo de l&amp;rsquo;ancien appareil à la benne. Il semblerait que ce type de souci arrive de temps en temps à cause du mode de transport, une forme d&amp;rsquo;électricité statique accumulée en chemin et détériorant les circuits. Bon à savoir si ça vous arrive aussi.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Malgré ce premier accroc, j&amp;rsquo;ai l&amp;rsquo;impression que le &lt;strong&gt;BT-22 Wingman Elite va m&amp;rsquo;accompagner partout&lt;/strong&gt; : pratique, &lt;strong&gt;rapide à charger, simple d&amp;rsquo;utilisation&lt;/strong&gt;. Le câble fragile et le module lumineux inutile sont mes seuls vrais bémols. Pour le reste, c&amp;rsquo;est tout bon &amp;#x1f603;.&lt;/p&gt;
&lt;p&gt;Pensez à acheter &lt;strong&gt;des batteries de qualité&lt;/strong&gt; en lisant les commentaires sur les sites où vous comptez les acheter. Un prix important n&amp;rsquo;implique pas forcément une bonne qualité de batterie (la preuve en est pour les &lt;strong&gt;BAK 45D 21700 à 2,49€ pièce sont très abordables&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Je vous conseille également de prêter &lt;strong&gt;attention au stockage de vos batteries&lt;/strong&gt; : les laisser de préférence presque vides et dans un étui empêchant tout contact avec d&amp;rsquo;autres métaux ou substances. Un sac ignifugé est également idéal pour stocker ce genre de batteries.&lt;/p&gt;
&lt;p&gt;Et surtout : &lt;strong&gt;profitez de cette nouvelle liberté&lt;/strong&gt; d&amp;rsquo;avoir un &amp;ldquo;powerbank&amp;rdquo; modulable et adaptée à vos consommations et besoin. Un bonheur !&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kodai-industries.com/collections/bt-22-wingman-elite&#34;&gt;le BT-22 Wingman Elite de chez Kodai Industries&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_battery_sizes#Lithium-ion_batteries_(rechargeable)&#34;&gt;les modèles de batterie suivant Wikipedia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nkon.nl/fr/bak-n21700-45d-4400mah-60a.html&#34;&gt;les batteries BAK 45D 21700 à 4500Mah - 60A sur nkon.nl&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kodai-industries.com/&#34;&gt;site officiel de Kodai Industries&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Projet tablette, alternative à Sweepy pour les tâches ménagères</title>
      <link>https://olivier.dossmann.net/2026/06/alternative_a_sweepy_pour_taches_menageres/</link>
      <pubDate>Tue, 23 Jun 2026 21:12:35 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/06/alternative_a_sweepy_pour_taches_menageres/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Je continue dans ma lancée de &lt;a href=&#34;https://olivier.dossmann.net/2026/05/projet-tablette-introduction/&#34;&gt;création d&amp;rsquo;une tablette tactile pour la maison&lt;/a&gt; en attaquant un des &lt;strong&gt;sujets principaux de ce foyer : les tâches ménagères&lt;/strong&gt;. L&amp;rsquo;idée est de &lt;strong&gt;remplacer une application existante&lt;/strong&gt; - et payante - par un &lt;strong&gt;équivalent en Logiciel Libre auto-hébergé&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cet article ressemble bien plus à une &lt;strong&gt;réflexion autour du sujet&lt;/strong&gt; et une &lt;strong&gt;présentation de la solution choisie&lt;/strong&gt; qu&amp;rsquo;à un guide d&amp;rsquo;installation. Il n&amp;rsquo;y sera donc pas question de configuration serveur ni de déploiement spécifique. Si ces détails vous intéressent, vous pouvez le suggérer en commentaire d&amp;rsquo;un de &lt;a href=&#34;https://www.journalduhacker.net/newest/blankoworld&#34;&gt;mes articles publiés sur le Journal du Hacker&lt;/a&gt; - dont je vous recommande vivement la lecture (je parle du Journal, pas de mes articles &amp;#x1f923;).&lt;/p&gt;
&lt;h1 id=&#34;lancien-sweepy&#34;&gt;L&amp;rsquo;ancien Sweepy&lt;/h1&gt;
&lt;p&gt;Un jour &lt;strong&gt;quelqu&amp;rsquo;un nous conseille&lt;/strong&gt; une application - payante - nommée &lt;strong&gt;Sweepy&lt;/strong&gt; (sur téléphone mobile) pour gérer à plusieurs les tâches ménagères. Que cela signifie-t-il et comment cela fonctionne-t-il ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/sweepy_accueil.png&#34; alt=&#34;Page d&amp;rsquo;accueil de Sweepy listant les pièces de la maison et leur état d&amp;rsquo;avancement&#34; title=&#34;Image de la page d&#39;accueil de Sweepy&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Page d&amp;rsquo;accueil de Sweepy avec la liste des pièces&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/sweepy_chambre.png&#34; alt=&#34;Page d&amp;rsquo;accueil d&amp;rsquo;une pièce dans Sweepy listant les tâches de ladite pièce, ici la chambre&#34; title=&#34;Image de la page d&#39;accueil d&#39;une pièce dans Sweepy&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Page d&amp;rsquo;accueil d&amp;rsquo;une pièce dans Sweepy avec la liste de ses tâches&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous sommes &lt;strong&gt;plusieurs dans le foyer&lt;/strong&gt; et souvent nous &lt;strong&gt;oublions des tâches à faire&lt;/strong&gt; ; voire nous faisons, l&amp;rsquo;un après l&amp;rsquo;autre, à quelques heures de différence, la même tâche. En pareille situation nous pourrions mettre une feuille comme dans les aires d&amp;rsquo;autoroute pour &lt;strong&gt;noter qui a fait une tâche en dernier&lt;/strong&gt;. Cela ne nous convient pas. Quand notre contact nous a parlé de Sweepy, on s&amp;rsquo;est dit &amp;ldquo;pourquoi pas ?&amp;rdquo;. Et on s&amp;rsquo;est lancé.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;application est &lt;strong&gt;centrée sur les pièces de la maison&lt;/strong&gt; : on crée chaque pièce, puis &lt;strong&gt;on ajoute&lt;/strong&gt; petit à petit &lt;strong&gt;chaque tâche&lt;/strong&gt; qu&amp;rsquo;on souhaite effectuer &lt;strong&gt;dans la pièce&lt;/strong&gt; et les points (ou plutôt la pénibilité) de la tâche. On évoque aussi le laps de temps maximum entre chaque action d&amp;rsquo;une même tâche, autrement dit &lt;strong&gt;on définit un cycle au bout duquel on doit recommencer la tâche&lt;/strong&gt; (parce que oui une maison ne reste pas propre indéfiniment !).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;application se veut être un &lt;a href=&#34;https://fr.wikipedia.org/wiki/Jeu_s%C3%A9rieux&#34;&gt;&lt;strong&gt;serious game&lt;/strong&gt;&lt;/a&gt; avec un thème tout aussi ressemblant à un jeu vidéo : bleu avec un nuage blanc animé pour nous tenir compagnie. &lt;strong&gt;On voit les points de chacun&lt;/strong&gt;, des trophées à déverrouiller, des trophées cachés et on voit nos &lt;strong&gt;statistiques de jeu&lt;/strong&gt; - oups, je veux dire de travail. Cela va jusqu&amp;rsquo;à &lt;strong&gt;nous inciter à dépenser les points accumulés pour embellir les pièces&lt;/strong&gt; qui sont matérialisées par des images du type de pièce (salle de bain, chambre, etc.). Comment améliorer une pièce de la maison ? On utilise les points en échange d&amp;rsquo;un meuble, d&amp;rsquo;une décoration, d&amp;rsquo;un tableau, etc. pour le déposer dans une pièce. Évidemment le &lt;strong&gt;nombre d&amp;rsquo;objets qu&amp;rsquo;on peut acheter est limité dans le temps&lt;/strong&gt; et change chaque jour/semaine. &lt;strong&gt;De quoi obliger à revenir sur l&amp;rsquo;application chaque jour&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bien que &lt;strong&gt;ce type de système ne m&amp;rsquo;intéresse pas&lt;/strong&gt;, et encore moins la gamification d&amp;rsquo;une application, il semble que mes colocs soient plus réceptifs. Et cela fonctionne donc pour eux.&lt;/p&gt;
&lt;h1 id=&#34;lidée-dune-application-alternative-nos-attentes&#34;&gt;L&amp;rsquo;idée d&amp;rsquo;une application alternative, nos attentes&lt;/h1&gt;
&lt;p&gt;Après avoir &lt;strong&gt;utilisé cette application pendant 2 ans&lt;/strong&gt; tout de même, j&amp;rsquo;ai constaté qu&amp;rsquo;&lt;strong&gt;on y utilisait peu de fonctionnalités&lt;/strong&gt;. Elle est effectivement &lt;strong&gt;payante si nous sommes plus qu&amp;rsquo;une&lt;/strong&gt; personne (c&amp;rsquo;est-à-dire plus qu&amp;rsquo;un téléphone mobile sur le même foyer). Ainsi on pourrait &lt;strong&gt;noter les éléments suivants comme l&amp;rsquo;« essence même » de notre activité&lt;/strong&gt; sur Sweepy :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;plusieurs utilisateurs&lt;/strong&gt; sur la même interface,&lt;/li&gt;
&lt;li&gt;création de &lt;strong&gt;pièces de la maison&lt;/strong&gt; pour regrouper les tâches,&lt;/li&gt;
&lt;li&gt;notion de &lt;strong&gt;difficulté de la tâche&lt;/strong&gt; (représentée par des points dans Sweepy),&lt;/li&gt;
&lt;li&gt;système de &lt;strong&gt;cycle des tâches&lt;/strong&gt;, c&amp;rsquo;est-à-dire la fréquence à laquelle refaire la tâche régulièrement (par exemple &amp;ldquo;tous les 6 jours&amp;rdquo;),&lt;/li&gt;
&lt;li&gt;possibilité d&amp;rsquo;&lt;strong&gt;affecter une tâche à quelqu&amp;rsquo;un&lt;/strong&gt; - peu usité chez nous, mais utile,&lt;/li&gt;
&lt;li&gt;visualisation rapide de la &lt;strong&gt;progression d&amp;rsquo;une tâche&lt;/strong&gt; : au début elle a une barre de progression verte, puis au fil des jours elle devient orange puis rouge,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tri des tâches&lt;/strong&gt; de la maison entière &lt;strong&gt;par « urgence »&lt;/strong&gt; (les plus urgentes d&amp;rsquo;abord) ou par pièce.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sweepy propose aussi une affectation aléatoire des tâches pour chaque personne. Une sorte de &lt;em&gt;suggestion&lt;/em&gt;, mais nous n&amp;rsquo;avons jamais utilisé cette fonctionnalité.&lt;/p&gt;
&lt;p&gt;Avec si &lt;strong&gt;peu de besoins&lt;/strong&gt;, je me suis dit qu&amp;rsquo;on pourrait &lt;strong&gt;éventuellement trouver une application auto-hébergeable&lt;/strong&gt; qui serait &lt;strong&gt;libre ou&lt;/strong&gt; au moins &lt;strong&gt;open-source&lt;/strong&gt; et utilisable à la maison.&lt;/p&gt;
&lt;h1 id=&#34;une-solution-alternative-incomplète&#34;&gt;Une solution alternative incomplète ?&lt;/h1&gt;
&lt;p&gt;Sur les critères listés dans le précédent chapitre j&amp;rsquo;ai trouvé quelques &lt;strong&gt;solutions auto-hébergées&lt;/strong&gt; (c&amp;rsquo;est-à-dire que je pourrais installer moi-même sur un serveur à la maison) comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://grocy.info/&#34;&gt;&lt;strong&gt;Grocy&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vikunja.io/&#34;&gt;&lt;strong&gt;Vikunja&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.donetick.com/&#34;&gt;&lt;strong&gt;Donetick&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y en a sûrement d&amp;rsquo;autres. Commençons.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://grocy.info/&#34;&gt;&lt;strong&gt;Grocy&lt;/strong&gt;&lt;/a&gt; est un outil que j&amp;rsquo;ai déjà utilisé dans le passé. Je le trouve plutôt &lt;strong&gt;complet mais pas du tout intuitif&lt;/strong&gt; pour le commun des mortels. Il &lt;strong&gt;possède une API&lt;/strong&gt; (Application Programming Interface permettant de connecter d&amp;rsquo;autres applications après) que je pourrais utiliser pour générer une interface plus simple. Il a l&amp;rsquo;avantage de gérer plusieurs choses de la maison, en plus des tâches ménagères, comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la &lt;strong&gt;gestion des piles&lt;/strong&gt;/batteries de la maison,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;gestion des manuels d&amp;rsquo;utilisation&lt;/strong&gt; des appareils de la maison,&lt;/li&gt;
&lt;li&gt;les &lt;strong&gt;stocks de nourriture&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;recettes de repas&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;liste des courses&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;et plus encore.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Plutôt overkill&lt;/strong&gt; pour l&amp;rsquo;usage visé.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/grocy_corvees.png&#34; alt=&#34;Tableau de bord des corvées sous Grocy avec le menu latéral gauche qui liste les fonctionnalités du logiciel Grocy&#34; title=&#34;Image du tableau de bord des corvées sous Grocy&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tableau de bord des corvées sous Grocy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Concernant &lt;a href=&#34;https://vikunja.io/&#34;&gt;&lt;strong&gt;Vikunja&lt;/strong&gt;&lt;/a&gt;, il propose une &lt;strong&gt;boîte de réception&lt;/strong&gt; dans laquelle on peut &lt;strong&gt;créer des tâches à la volée&lt;/strong&gt; avant de les redistribuer/trier. Il propose une &lt;strong&gt;gestion par projet&lt;/strong&gt;, &lt;strong&gt;par étiquette&lt;/strong&gt;, et son affichage est &lt;strong&gt;très moderne&lt;/strong&gt; : vous pouvez afficher les tâches &lt;strong&gt;en vue kanban, liste, Gantt ou tableau&lt;/strong&gt;. C&amp;rsquo;est merveilleux ! Il dispose également d&amp;rsquo;&lt;strong&gt;une API&lt;/strong&gt; et d&amp;rsquo;un &lt;strong&gt;système de webhooks&lt;/strong&gt;, ce qui est très pratique pour le lier à un outil comme &lt;a href=&#34;https://n8n.io/&#34;&gt;n8n&lt;/a&gt; pour automatiser certaines actions.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;outil se rapproche de mes attentes. Je pourrais par exemple utiliser les projets pour définir une pièce et les tâches à l&amp;rsquo;intérieur. Cependant, bien qu&amp;rsquo;il propose une gestion de répétition cyclique avec une répétition à la date d&amp;rsquo;achèvement, on sent qu&amp;rsquo;&lt;strong&gt;il cible une autre forme de gestion&lt;/strong&gt;, plus personnelle et privée. En dehors du cadre de notre gestion des tâches ménagères.&lt;/p&gt;
&lt;p&gt;Je garde donc &lt;a href=&#34;https://vikunja.io/&#34;&gt;Vikunja&lt;/a&gt; pour un usage autre car &lt;strong&gt;il me plaît beaucoup&lt;/strong&gt;. Mais pas pour notre solution alternative.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/vikunja.png&#34; alt=&#34;Page d&amp;rsquo;accueil de Vikunja avec un menu sur la barre latérale gauche et au centre les projets, puis sous les projets une liste de tâches récentes&#34; title=&#34;Image de la page d&#39;accueil de Vikunja&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Page d&amp;rsquo;accueil de Vikunja&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Passons à &lt;a href=&#34;https://www.donetick.com/&#34;&gt;&lt;strong&gt;Donetick&lt;/strong&gt;&lt;/a&gt; qui est &lt;strong&gt;minimaliste et léger&lt;/strong&gt;. Visuellement il &lt;strong&gt;se rapproche de Sweepy&lt;/strong&gt;. À la création d&amp;rsquo;une tâche, les options permettent de renseigner la &lt;strong&gt;répétition cyclique basée sur la date d&amp;rsquo;achèvement&lt;/strong&gt; de la tâche. C&amp;rsquo;est ce qui permet de relancer la répétition seulement au jour où on a fini une tâche. Par exemple si on doit faire une tâche tous les 7 jours, si la première fois on l&amp;rsquo;effectue un samedi, la prochaine échéance est samedi d&amp;rsquo;après. Mais si on finit par faire la tâche le dimanche, alors la prochaine échéance sera un dimanche. C&amp;rsquo;est un petit projet très récent qui reste discret (et écrit en &lt;a href=&#34;https://fr.wikipedia.org/wiki/Go_(langage)&#34;&gt;langage Go&lt;/a&gt;). Il permet, de base, de &lt;strong&gt;trier les tâches suivant l&amp;rsquo;urgence&lt;/strong&gt; à les faire. Et son &lt;strong&gt;système d&amp;rsquo;étiquettes&lt;/strong&gt; permettrait de regrouper les tâches par « pièces » (puisqu&amp;rsquo;une pièce serait représentée par une étiquette).&lt;/p&gt;
&lt;p&gt;En revanche, &lt;strong&gt;pas de visualisation par barre de progression&lt;/strong&gt; en fonction de l&amp;rsquo;urgence. Et bien qu&amp;rsquo;un &lt;strong&gt;système de création de filtres personnalisés&lt;/strong&gt; existe, pour une raison qui m&amp;rsquo;est inconnue pour l&amp;rsquo;instant, ils ne restent effectifs/existants que sur le navigateur qui les a créé. Plutôt embêtant.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/donetick.png&#34; alt=&#34;Page d&amp;rsquo;accueil de Donetick avec une liste de tâches triées par urgence&#34; title=&#34;Image de la page d&#39;accueil de Donetick&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Page d&amp;rsquo;accueil de Donetick&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;3 outils, 3 façons différentes d&amp;rsquo;aborder le sujet. Mais &lt;strong&gt;aucun ne remplit toutes les cases&lt;/strong&gt;. Ils ont tous une API pour accéder aux données, c&amp;rsquo;est ce qui m&amp;rsquo;a donné l&amp;rsquo;&lt;strong&gt;idée de créer un frontend&lt;/strong&gt; à l&amp;rsquo;un d&amp;rsquo;eux. Lequel choisir ? On a écarté &lt;a href=&#34;https://grocy.info/&#34;&gt;Grocy&lt;/a&gt; et &lt;a href=&#34;https://vikunja.io/&#34;&gt;Vikunja&lt;/a&gt;, pourquoi ne pas tenter l&amp;rsquo;aventure avec &lt;a href=&#34;https://www.donetick.com/&#34;&gt;Donetick&lt;/a&gt; et voir ce que cela donne ? Il est léger, avec une simple base de données SQLite3 sous forme de fichier. Pour une cinquantaine de tâches ménagères ça sera super &amp;#x1f60b;.&lt;/p&gt;
&lt;h1 id=&#34;un-dashboard-maison-pour-la-maison&#34;&gt;Un Dashboard maison, pour la maison !&lt;/h1&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/donetick-dashboard.png&#34; alt=&#34;Page d&amp;rsquo;accueil de donetick-dashboard avec une carte par tâche et des barres de progression pour chacune des tâches&#34; title=&#34;Image de la page d&#39;accueil de donetick-dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Page d&amp;rsquo;accueil de donetick-dashboard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ainsi que j&amp;rsquo;ai &lt;strong&gt;créé de toutes pièces un Dashboard&lt;/strong&gt; à &lt;a href=&#34;https://www.donetick.com/&#34;&gt;Donetick&lt;/a&gt; pour les &lt;strong&gt;spécificités de notre foyer&lt;/strong&gt; : &lt;a href=&#34;https://gitlab.com/blankoworld/donetick-dashboard/&#34;&gt;donetick-dashboard alias « Maison Propre »&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans la forme, ça ressemble à un &lt;strong&gt;Dashboard classique&lt;/strong&gt; : &lt;strong&gt;des &lt;em&gt;cartes&lt;/em&gt; affichées représentant les tâches&lt;/strong&gt;. Un menu avec des boutons pour &lt;strong&gt;choisir la pièce&lt;/strong&gt; de la maison et &lt;strong&gt;filtrer sur les tâches correspondantes&lt;/strong&gt;. Et de quoi &lt;strong&gt;se connecter&lt;/strong&gt; en haut à droite de l&amp;rsquo;écran.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est simple, fonctionnel. Au début nous sommes amenés à nous connecter via une fenêtre modale, puis les tâches sont récupérées via l&amp;rsquo;API de &lt;a href=&#34;https://www.donetick.com/&#34;&gt;Donetick&lt;/a&gt; et affichées. Pour un foyer, le nombre de tâches est généralement si infime que &lt;a href=&#34;https://www.donetick.com/&#34;&gt;Donetick&lt;/a&gt; suffit amplement avec son fichier *.db (SQLite3) comme base de données.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/blankoworld/donetick-dashboard/&#34;&gt;donetick-dashboard&lt;/a&gt; propose les fonctionnalités suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tâches&lt;/strong&gt; principales affichées &lt;strong&gt;par ordre d&amp;rsquo;urgence&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;barre de progression&lt;/strong&gt; de la tâche &lt;strong&gt;en couleur&lt;/strong&gt; (rouge, orange, vert),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;filtrage par pièce&lt;/strong&gt; (il faut créer des tags sur &lt;a href=&#34;https://www.donetick.com/&#34;&gt;Donetick&lt;/a&gt; avec le nom des pièces et y affecter vos tâches),&lt;/li&gt;
&lt;li&gt;possibilité de &lt;strong&gt;marquer une tâche comme « faite »&lt;/strong&gt; - avec fenêtre modale de validation (pour éviter les erreurs),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;multi-utilisateur&lt;/strong&gt; : on passe d&amp;rsquo;un compte à l&amp;rsquo;autre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La technologie utilisée est &lt;a href=&#34;https://nuxt.com/&#34;&gt;&lt;strong&gt;NuxtJS&lt;/strong&gt;&lt;/a&gt; que j&amp;rsquo;avais déjà touchée l&amp;rsquo;année dernière pour faire un Dashboard similaire.&lt;/p&gt;
&lt;p&gt;Le projet est &lt;a href=&#34;https://hub.docker.com/r/bl4n/donetick-dashboard&#34;&gt;&lt;strong&gt;disponible en Docker&lt;/strong&gt; sur le Hub Docker&lt;/a&gt; et utilisable &lt;strong&gt;avec docker-compose&lt;/strong&gt; dans le &lt;a href=&#34;https://gitlab.com/blankoworld/donetick-dashboard/&#34;&gt;dépôt du projet donetick-dashboard&lt;/a&gt;, n&amp;rsquo;hésitez pas à aller jeter un œil et tester par vous-même &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;retour-dexpérience&#34;&gt;Retour d&amp;rsquo;expérience&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Après&lt;/strong&gt; plus de &lt;strong&gt;5 semaines d&amp;rsquo;utilisation&lt;/strong&gt; ce Dashboard &lt;strong&gt;rend pleinement service&lt;/strong&gt; au quotidien. Les utilisateurs sont contents. Ils apprécient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l&amp;rsquo;&lt;strong&gt;apparence simple&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;système de carte&lt;/strong&gt; - bien qu&amp;rsquo;ils aimeraient réduire la taille des cartes affichées,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;facilité d&amp;rsquo;utilisation&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;le système de &lt;strong&gt;filtre par pièce&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;le changement possible d&amp;rsquo;utilisateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ils ont aussi émis quelques souhaits - et je trouve important de le signaler :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ils aimeraient &lt;strong&gt;réduire la taille des cartes&lt;/strong&gt; affichées qui leur paraissent trop grandes,&lt;/li&gt;
&lt;li&gt;ils attendent avec impatience un système pour &lt;strong&gt;afficher les points&lt;/strong&gt; de chacun et les &lt;strong&gt;points que rapporte chaque tâche&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;ils ont voulu trier la liste des pièces toujours de la même manière - ce qui a été intégré,&lt;/li&gt;
&lt;li&gt;ils voulaient disposer d&amp;rsquo;une liste « fixe » de tâches par pièce pour éviter que valider une tâche ne la réordonne tout en bas - ce qui a été intégré,&lt;/li&gt;
&lt;li&gt;ils voudraient &lt;strong&gt;changer de système de validation&lt;/strong&gt; d&amp;rsquo;une tâche et passer d&amp;rsquo;une fenêtre modale à un changement du bouton lui-même,&lt;/li&gt;
&lt;li&gt;le pourcentage de l&amp;rsquo;ensemble de la maison les dérange. Ils préfèreraient un &lt;strong&gt;pourcentage par pièce&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je suis plutôt content de l&amp;rsquo;engouement de certains, contrairement à ce qu&amp;rsquo;ils exprimaient initialement. Avoir des retours est plaisant - même si parfois ça me crispe. Et content de modifier ensuite l&amp;rsquo;application.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;De Sweepy à &lt;a href=&#34;https://gitlab.com/blankoworld/donetick-dashboard/&#34;&gt;donetick-dashboard&lt;/a&gt;, le chemin n&amp;rsquo;était pas évident. Mais le résultat est là : une solution libre, auto-hébergée, et adoptée par le foyer.&lt;/p&gt;
&lt;p&gt;Je suis assez &lt;strong&gt;content du résultat&lt;/strong&gt; aux vues de mes connaissances en matière de Dashboard et frontend en tous genres. Également &lt;strong&gt;surpris de l&amp;rsquo;engouement des utilisateurs&lt;/strong&gt; que j&amp;rsquo;ai. Et pressé de pouvoir trouver le temps d&amp;rsquo;intégrer leurs demandes à l&amp;rsquo;outil.&lt;/p&gt;
&lt;p&gt;Je sais bien qu&amp;rsquo;il ne faut jamais réinventer la roue, mais cette &lt;strong&gt;expérience unique&lt;/strong&gt; m&amp;rsquo;amène à penser que certaines situations s&amp;rsquo;y prêtent. Sachons tout de même doser pour éviter de développer à l&amp;rsquo;infini toutes nos applications &amp;#x1f609;.&lt;/p&gt;
&lt;p&gt;Et vous, &lt;strong&gt;quel outil libre/open-source auto-hébergé de gestion de tâches utilisez-vous&lt;/strong&gt; au quotidien ?&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l&amp;rsquo;article par ordre d&amp;rsquo;apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2026/05/projet-tablette-introduction/&#34;&gt;Mon billet concernant la création d&amp;rsquo;une tablette tactile pour la maison&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.journalduhacker.net/newest/blankoworld&#34;&gt;Mes articles publiés sur le Journal du Hacker&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Jeu_s%C3%A9rieux&#34;&gt;Définition de serious game suivant Wikipédia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://grocy.info/&#34;&gt;Site officiel de Grocy&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vikunja.io/&#34;&gt;Site officiel de Vikunja&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.donetick.com/&#34;&gt;Site officiel de Donetick&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://n8n.io/&#34;&gt;Site officiel de n8n&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Go_(langage)&#34;&gt;Le langage Go suivant Wikipédia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/blankoworld/donetick-dashboard/&#34;&gt;Dépôt officiel de donetick-dashboard alias « Maison Propre »&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nuxt.com/&#34;&gt;Site officiel de NuxtJS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hub.docker.com/r/bl4n/donetick-dashboard&#34;&gt;Image officielle de donetick-dashboard sur le Hub Docker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Projet Tablette, Introduction</title>
      <link>https://olivier.dossmann.net/2026/05/projet-tablette-introduction/</link>
      <pubDate>Sun, 24 May 2026 21:40:00 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/05/projet-tablette-introduction/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Après trois ans dans un tiroir&lt;/strong&gt;, ma &lt;a href=&#34;https://olivier.dossmann.net/2026/05/probleme-ecran-tactile-sur-chuwi-hi10go/&#34;&gt;&lt;strong&gt;tablette tactile&lt;/strong&gt; CHUWI Hi10Go dont je parlais dans l&amp;rsquo;article précédent&lt;/a&gt; a refait surface. Et &lt;strong&gt;avec elle, un projet&lt;/strong&gt; qui attendait patiemment : le &lt;strong&gt;Projet Tablette&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;T&amp;rsquo;as pas cherché loin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est sûr, le titre n&amp;rsquo;est pas très racoleur. On fait avec.&lt;/p&gt;
&lt;p&gt;Cet article présente ce que j&amp;rsquo;entends par « Projet Tablette » - à part que c&amp;rsquo;est une tablette. Les grandes lignes, les usages imaginés, et ce que vous retrouverez dans les prochains articles au fil des semaines.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/CHUWI_Hi10Go.jpg&#34; alt=&#34;CHUWI Hi10Go&#34; title=&#34;Photo d&#39;un tablette tactile CHUWI Hi10Go installée par défaut sous Windows&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;les-grandes-lignes&#34;&gt;Les grandes lignes&lt;/h1&gt;
&lt;p&gt;À l&amp;rsquo;achat de la tablette, j&amp;rsquo;imaginais surtout &lt;strong&gt;m&amp;rsquo;amuser sous GNU/Linux - sans usage précis&lt;/strong&gt; en tête. Honnêtement, un écran tactile ne m&amp;rsquo;a jamais semblé indispensable dans mon quotidien. Mais la vie de famille a ses propres exigences, et j&amp;rsquo;ai progressivement construit un projet dans ma tête pour servir le foyer entier.&lt;/p&gt;
&lt;p&gt;Ainsi je visualise &lt;strong&gt;plusieurs usages&lt;/strong&gt; potentiellement intéressants au sein du foyer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pouvoir suivre les &lt;strong&gt;tâches ménagères&lt;/strong&gt; de la maison, leur avancement et leur date d&amp;rsquo;échéance,&lt;/li&gt;
&lt;li&gt;Permettre de consulter les &lt;strong&gt;recettes familiales&lt;/strong&gt;, voire en ajouter de nouvelles,&lt;/li&gt;
&lt;li&gt;Suivre le &lt;strong&gt;calendrier&lt;/strong&gt; de chacun (emploi du temps),&lt;/li&gt;
&lt;li&gt;Gérer la liste de &lt;strong&gt;courses&lt;/strong&gt; (génération automatique ?, ajout simple, etc.),&lt;/li&gt;
&lt;li&gt;Éventuellement, la gestion d&amp;rsquo;une hypothétique &lt;strong&gt;domotique&lt;/strong&gt; (si mise en place),&lt;/li&gt;
&lt;li&gt;Une interface de commande pour choisir et lancer de la &lt;strong&gt;musique&lt;/strong&gt; dans la maison,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peu importe les éléments retenus, &lt;strong&gt;la tablette tactile serait une interface centrale&lt;/strong&gt; pour tout ceci. Elle pourrait même &lt;strong&gt;inciter certains membres&lt;/strong&gt; de la famille &lt;strong&gt;à s&amp;rsquo;impliquer davantage&lt;/strong&gt; dans le quotidien.&lt;/p&gt;
&lt;h1 id=&#34;quimaginer-concrètement-sur-cette-tablette&#34;&gt;Qu&amp;rsquo;imaginer concrètement sur cette tablette ?&lt;/h1&gt;
&lt;p&gt;Venant du domaine du &lt;a href=&#34;https://fr.wikipedia.org/wiki/Logiciel_libre&#34;&gt;Logiciel Libre&lt;/a&gt;, mon &lt;strong&gt;premier réflexe&lt;/strong&gt; est naturellement d&amp;rsquo;&lt;strong&gt;utiliser&lt;/strong&gt; au maximum &lt;strong&gt;des logiciels libres&lt;/strong&gt;. Concrètement, ça pourrait ressembler à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;système d&amp;rsquo;exploitation&lt;/strong&gt; GNU/Linux (Ubuntu supporte bien les écrans tactiles, mais ce n&amp;rsquo;est pas le seul),&lt;/li&gt;
&lt;li&gt;dans un premier temps, un &lt;strong&gt;environnement de bureau&lt;/strong&gt; tout-en-un pour utiliser la tablette (peut-être GNOME ? Même si je ne suis pas spécialement fan),&lt;/li&gt;
&lt;li&gt;un système « central » pour lancer les différentes applications composant notre gestion du foyer. Je parle d&amp;rsquo;&lt;strong&gt;un portail&lt;/strong&gt;, de raccourcis sur le bureau ou n&amp;rsquo;importe quoi d&amp;rsquo;autre permettant de lancer simplement au toucher une application,&lt;/li&gt;
&lt;li&gt;si nous utilisons des logiciels libres de type « application web », j&amp;rsquo;imagine pouvoir les &lt;strong&gt;héberger à la maison&lt;/strong&gt;, soit sur la machine directement, soit sur une machine tierce (ceci est du détail),&lt;/li&gt;
&lt;li&gt;si certains logiciels libres n&amp;rsquo;existent pas ou ne conviennent pas, &lt;strong&gt;éventuellement développer les applications&lt;/strong&gt; nécessaires. Et maintenir tout ça,&lt;/li&gt;
&lt;li&gt;et dernier point - sans doute le plus délicat - &lt;strong&gt;écouter les membres de la famille&lt;/strong&gt; et &lt;strong&gt;ajuster selon leurs besoins&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est le plus difficile pour moi. Avec des utilisateurs professionnels, j&amp;rsquo;arrive généralement à identifier les vrais besoins derrière les demandes exprimées. Avec des proches, c&amp;rsquo;est une autre paire de manches. Il y a des anicroches &amp;#x1f613;.&lt;/p&gt;
&lt;h1 id=&#34;un-produit-minimum-viable---selon-moi&#34;&gt;Un produit minimum viable - selon moi&lt;/h1&gt;
&lt;p&gt;La plupart des personnes de mon entourage imaginent qu&amp;rsquo;il est simple de mettre en place une tablette :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tu installes n&amp;rsquo;importe quelle distribution Linux moderne, tu lances automatiquement un navigateur web au démarrage et roulez jeunesse !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est sans compter mes &lt;strong&gt;habitudes professionnelles et mon côté méticuleux&lt;/strong&gt; (à me lire je suis un mafieux au travail et un tortionnaire à la maison &amp;#x1f923;).&lt;/p&gt;
&lt;p&gt;Ainsi &lt;strong&gt;j&amp;rsquo;imagine&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;avoir un système permettant de &lt;strong&gt;déployer rapidement la tablette&lt;/strong&gt; : même si nous n&amp;rsquo;en avons qu&amp;rsquo;une seule, si elle devient « importante », il serait intéressant de pouvoir retrouver rapidement notre travail en cas d&amp;rsquo;incident,&lt;/li&gt;
&lt;li&gt;(facultatif) optimiser progressivement : &lt;strong&gt;réduire la consommation&lt;/strong&gt; si possible, &lt;strong&gt;alléger les outils&lt;/strong&gt;, &lt;strong&gt;améliorer l&amp;rsquo;expérience utilisateur&lt;/strong&gt; - même si le « user-friendly » n&amp;rsquo;est pas mon point fort, soyons honnêtes,&lt;/li&gt;
&lt;li&gt;avoir une &lt;strong&gt;interface unique pour tous&lt;/strong&gt; les éléments (que ça soit des raccourcis sur un bureau, une application de gestion qui se lance automatiquement, un portail web, etc.),&lt;/li&gt;
&lt;li&gt;avoir un &lt;strong&gt;clavier visuel&lt;/strong&gt; pour taper quelques caractères si besoin,&lt;/li&gt;
&lt;li&gt;(exprimé par la famille) permettre une &lt;strong&gt;mise en veille rapide de l&amp;rsquo;appareil&lt;/strong&gt; et un rallumage rapide de ce dernier,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avoir une première application fonctionnelle&lt;/strong&gt; pour que la &lt;strong&gt;famille puisse adopter la tablette rapidement&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mis bout à bout, &lt;strong&gt;cela paraît gigantesque&lt;/strong&gt; ! &lt;strong&gt;J&amp;rsquo;ai avancé&lt;/strong&gt; point par point, avec ce que j&amp;rsquo;avais - et le temps disponible. &lt;strong&gt;Progressivement&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Dans les &lt;strong&gt;prochaines semaines&lt;/strong&gt;, vous retrouverez des &lt;strong&gt;articles concernant le Projet Tablette&lt;/strong&gt; et mes pérégrinations sur les différents sujets. J&amp;rsquo;avais commencé au début du mois avec &lt;a href=&#34;https://olivier.dossmann.net/2026/05/probleme-ecran-tactile-sur-chuwi-hi10go/&#34;&gt;&lt;strong&gt;mes difficultés à faire fonctionner l&amp;rsquo;écran tactile&lt;/strong&gt; sur la tablette Chuwi Hi10Go avec Ubuntu 22.04&lt;/a&gt;. Je ne m&amp;rsquo;arrêterai donc pas en si bon chemin, croyez-moi !&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;aimerais pouvoir &lt;strong&gt;partager mon alternative à l&amp;rsquo;application de gestion des tâches&lt;/strong&gt; ménagères, comment j&amp;rsquo;ai imaginé une &lt;strong&gt;interface d&amp;rsquo;accueil&lt;/strong&gt; pour les applications de la maison, ou encore &lt;strong&gt;quelle distribution choisir&lt;/strong&gt; pour un système d&amp;rsquo;exploitation orienté usage familial.&lt;/p&gt;
&lt;p&gt;Je ne vais pas prétendre que tout s&amp;rsquo;est passé sans accroc. La tablette m&amp;rsquo;a refroidi en 2023, c&amp;rsquo;est un fait. Et même aujourd&amp;rsquo;hui, je sais que &lt;strong&gt;ce genre de projet réserve des surprises&lt;/strong&gt; parfois désagréables.&lt;/p&gt;
&lt;p&gt;Mais il y a quelque chose de &lt;strong&gt;satisfaisant à&lt;/strong&gt; prendre un objet qu&amp;rsquo;on avait mis de côté et le &lt;strong&gt;remettre en vie&lt;/strong&gt; pour un usage concret. Surtout quand cet objet tourne sous GNU/Linux, &lt;strong&gt;avec des logiciels libres&lt;/strong&gt;, dans un coin de la maison.&lt;/p&gt;
&lt;p&gt;Je ne promets pas que le résultat sera parfait. Je promets que ce sera honnête. Et si ça peut donner des idées à quelqu&amp;rsquo;un qui a une vieille tablette qui traîne - ou qui veut se lancer dans un projet similaire - tant mieux.&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2026/05/probleme-ecran-tactile-sur-chuwi-hi10go/&#34;&gt;Article précédent concernant une &lt;strong&gt;tablette tactile&lt;/strong&gt; CHUWI Hi10Go&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Logiciel_libre&#34;&gt;Définition de Logiciel Libre suivant Wikipédia&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Problème d&#39;écran tactile sur Chuwi Hi10Go</title>
      <link>https://olivier.dossmann.net/2026/05/probleme-ecran-tactile-sur-chuwi-hi10go/</link>
      <pubDate>Tue, 12 May 2026 20:20:35 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/05/probleme-ecran-tactile-sur-chuwi-hi10go/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a longtemps j&amp;rsquo;étais tombé sur un &lt;a href=&#34;https://richard-dern.fr/interets/informatique/2021/11/17/installer-nixos-sur-une-tablette-asus-t100ta/&#34;&gt;article de Richard Dern sur une &lt;strong&gt;tablette Asus T100TA&lt;/strong&gt;&lt;/a&gt; dans lequel il explique comment il y avait installé &lt;a href=&#34;https://fr.wikipedia.org/wiki/NixOS&#34;&gt;NixOS&lt;/a&gt;. Ce jour là je ne sais pas ce qu&amp;rsquo;il s&amp;rsquo;est passé mais &lt;strong&gt;une lubie s&amp;rsquo;est installée&lt;/strong&gt; dans ma tête : et si je faisais pareil ? Et si j&amp;rsquo;avais une &lt;strong&gt;tablette sous GNU/Linux&lt;/strong&gt; pour piloter la maison ? Un écran intelligent, posé quelque part, par exemple la cuisine, toujours à portée de main.&lt;/p&gt;
&lt;p&gt;Bref, une mouche m&amp;rsquo;a piquée en mai 2023 et &lt;strong&gt;j&amp;rsquo;ai finalement commandé une CHUWI Hi10Go&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;était pas sans contrepartie et l&amp;rsquo;objet était « piégé ». Nous allons voir en quoi, puis nous parlerons d&amp;rsquo;accéléromètre et finalement d&amp;rsquo;écran tactile. Accrochez-vous !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/tactile.jpg&#34; alt=&#34;Image en noir et blanc d&amp;rsquo;une main vue de près en train d&amp;rsquo;appuyer sur un ordinateur tablette.&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://www.flickr.com/photos/hernanpc/&#34;&gt;profil Flickr de Hernán Piñera&lt;/a&gt;&lt;/em&gt; sous Licence CC BY-SA 2.0.&lt;/p&gt;
&lt;h1 id=&#34;la-tablette-et-le-problème&#34;&gt;La tablette et le problème&lt;/h1&gt;
&lt;p&gt;La CHUWI Hi10Go est une tablette &lt;strong&gt;10,1 pouces&lt;/strong&gt; avec &lt;strong&gt;6 Go de RAM&lt;/strong&gt;, &lt;strong&gt;128 Go de stockage&lt;/strong&gt; et un &lt;strong&gt;processeur Celeron N5100&lt;/strong&gt; cadencé à &lt;strong&gt;2.8 Ghz&lt;/strong&gt;. Le tout pour &lt;strong&gt;192,99€&lt;/strong&gt; (à l&amp;rsquo;époque, c&amp;rsquo;est à dire en mai 2023). Pour le prix, c&amp;rsquo;est une belle machine. J&amp;rsquo;étais content. J&amp;rsquo;ai installé Ubuntu 22.04, j&amp;rsquo;ai branché un clavier et là… &lt;strong&gt;L&amp;rsquo;écran était à l&amp;rsquo;envers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pas légèrement de travers. Carrément à 180°, comme si j&amp;rsquo;avais pendu la tablette par les pieds. Et quand je la tournais dans l&amp;rsquo;autre sens, le système détectait le mouvement et faisait pivoter l&amp;rsquo;image pour qu&amp;rsquo;elle reste - toujours - à l&amp;rsquo;envers. Tête en bas, invariablement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bah, tu désactives la rotation automatique et tu mets l&amp;rsquo;orientation fixe&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous avez raison, c&amp;rsquo;est une solution ; mais c&amp;rsquo;est aussi passer à côté de l&amp;rsquo;intérêt principal d&amp;rsquo;une tablette tactile.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai &lt;strong&gt;cherché des solutions en 2023&lt;/strong&gt;. Longtemps. Forums, wikis, fils Reddit, questions Stack Overflow… &lt;strong&gt;sans - réel - succès&lt;/strong&gt;. Agacé et débordé par d&amp;rsquo;autres choses, j&amp;rsquo;ai &lt;strong&gt;posé la tablette dans un coin&lt;/strong&gt;. Elle a dormi là pendant deux ans.&lt;/p&gt;
&lt;p&gt;Puis, récemment, je l&amp;rsquo;ai ressortie (sûrement une autre mouche qui m&amp;rsquo;a piquée, ça en fait des mouches décidément !), bien motivé à en finir avec ce problème. Et cette fois j&amp;rsquo;ai complété mes connaissances et trouvé une, voire plusieurs, solutions.&lt;/p&gt;
&lt;h1 id=&#34;laccéléromètre-et-sa-matrice&#34;&gt;L&amp;rsquo;accéléromètre et sa matrice&lt;/h1&gt;
&lt;p&gt;Le coupable, c&amp;rsquo;est l&amp;rsquo;&lt;strong&gt;accéléromètre&lt;/strong&gt; - le capteur qui mesure l&amp;rsquo;orientation physique de la tablette et &lt;strong&gt;dit au système comment afficher l&amp;rsquo;image&lt;/strong&gt;. Il transmet ses données sous forme d&amp;rsquo;une matrice de transformation (une grille de chiffres qui encode les axes et les rotations). Si cette matrice est mal configurée pour le modèle, le système interprète systématiquement l&amp;rsquo;orientation à l&amp;rsquo;envers. C&amp;rsquo;est exactement ce qui se passe sur la CHUWI Hi10Go sous Linux. Sûrement que sous Windows le pilote installé par défaut corrigeait le problème. Mais pas sous Linux.&lt;/p&gt;
&lt;p&gt;Sous Ubuntu, on &lt;strong&gt;corrige ça via une règle udev&lt;/strong&gt; (le gestionnaire de périphériques Linux) dans l&amp;rsquo;&lt;a href=&#34;https://wiki.archlinux.org/title/Udev#Hardware_database&#34;&gt;hardware database&lt;/a&gt;, par exemple dans le fichier &lt;code&gt;/etc/udev/hwdb.d/61-sensor.hwdb&lt;/code&gt; avec le contenu suivant &lt;strong&gt;pour inverser la matrice de l&amp;rsquo;accéléromètre&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Chuwi Hi10 Go
sensor:modalias:acpi:MXC6655*:dmi:*:svnCHUWIINNOVATIONLIMITED:pnHi10Go:*
 ACCEL_MOUNT_MATRIX=-1, 0, 0; 0,-1, 0; 0, 0, 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J&amp;rsquo;ai trouvé cette règle sur le &lt;a href=&#34;https://github.com/systemd/systemd/pull/21773/changes&#34;&gt;dépôt Github de systemd&lt;/a&gt;. Curieux que je n&amp;rsquo;étais pas tombé dessus auparavant, surtout que cela date de 2021 !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Puis on recharge la base de données matérielle&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemd-hwdb update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo udevadm trigger -v -p &lt;span style=&#34;color:#bb60d5&#34;&gt;DEVNAME&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;/dev/iio:device0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après un redémarrage, l&amp;rsquo;écran s&amp;rsquo;affiche enfin dans le bon sens. Quel soulagement. Et ceci chaque fois que je tourne physiquement la tablette de 90° en 90°.&lt;/p&gt;
&lt;h1 id=&#34;second-problème-caché-lécran-tactile&#34;&gt;Second problème caché : l&amp;rsquo;écran tactile&lt;/h1&gt;
&lt;p&gt;Parce qu&amp;rsquo;on ne doit pas crier victoire trop vite, je me suis rendu compte d&amp;rsquo;un &lt;strong&gt;autre souci&lt;/strong&gt;. L&amp;rsquo;écran était dans le bon sens, mais le &lt;strong&gt;touchscreen&lt;/strong&gt; (l&amp;rsquo;écran tactile, un composant Goodix Capacitive TouchScreen) ne répondait pas correctement. Les &lt;strong&gt;coordonnées de toucher étaient elles aussi inversées&lt;/strong&gt; : si j&amp;rsquo;appuie en haut à gauche, le curseur apparaît en bas à droite. &amp;ldquo;&lt;em&gt;Farpait&lt;/em&gt;&amp;rdquo; &amp;#x1f923;.&lt;/p&gt;
&lt;p&gt;La correction passe également par une règle udev sur la variable &lt;code&gt;LIBINPUT_CALIBRATION_MATRIX&lt;/code&gt;. Cette variable permet de &lt;strong&gt;recalibrer les coordonnées du tactile&lt;/strong&gt; indépendamment du reste.&lt;/p&gt;
&lt;p&gt;On crée un fichier, par exemple &lt;code&gt;/etc/udev/rules.d/98-goodix-touchscreen-calibration.rules&lt;/code&gt; avec le contenu suivant :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION==&amp;#34;add|change&amp;#34;, KERNEL==&amp;#34;event*&amp;#34;, ATTRS{name}==&amp;#34;Goodix Capacitive TouchScreen&amp;#34;, ENV{LIBINPUT_CALIBRATION_MATRIX}=&amp;#34;-1 0 1 0 -1 1&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis on recharge les règles :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo udevadm control --reload-rules
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo udevadm trigger --subsystem-match&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;input
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie que la règle est bien prise en compte :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo udevadm info /dev/input/event15 | grep LIBINPUT_CALIBRATION
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et la sortie attendue :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;E: LIBINPUT_CALIBRATION_MATRIX=-1 0 1 0 -1 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut désormais tester avec le doigt sur l&amp;rsquo;écran. &lt;strong&gt;Miracle, le tactile répond enfin correctement&lt;/strong&gt; &amp;#x1f604;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Après ces deux corrections &lt;strong&gt;la tablette est enfin utilisable&lt;/strong&gt;. Je suis content de mon achat - même avec deux ans de retard sur le planning initial. J&amp;rsquo;ai bon espoir qu&amp;rsquo;elle devienne ce que j&amp;rsquo;avais imaginé dès le départ : &lt;strong&gt;une interface centrale pour piloter la maison&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mais cette expérience m&amp;rsquo;a rappelé quelque chose : &lt;strong&gt;on parle trop peu du tactile sous GNU/Linux&lt;/strong&gt;. Les articles sur le sujet sont rares, souvent anciens, rarement complets. C&amp;rsquo;est dommage, parce qu&amp;rsquo;il y a clairement une demande et des solutions existent, comme on vient de le voir.&lt;/p&gt;
&lt;p&gt;Côté &lt;strong&gt;GNOME&lt;/strong&gt; (interface graphique par défaut sur Ubuntu) : je n&amp;rsquo;ai jamais été fan car trop différent de mes habitudes, trop lourd à mon goût. Mais force est de constater qu&amp;rsquo;&lt;strong&gt;avec Ubuntu, l&amp;rsquo;environnement a bien évolué&lt;/strong&gt;. Le tactile y est géré de façon cohérente - clavier virtuel, gestes, rotation. C&amp;rsquo;est un vrai effort visible et ça change la donne pour des machines comme les tablettes.&lt;/p&gt;
&lt;p&gt;Pour 192,99€, on ne pouvait pas rêver mieux. À condition de &lt;strong&gt;passer une heure à corriger&lt;/strong&gt; ce que les fabricants n&amp;rsquo;ont pas pris la peine de configurer pour Linux. Ce qui, &lt;strong&gt;dans notre écosystème&lt;/strong&gt;, est finalement &lt;strong&gt;presque devenu une tradition&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://richard-dern.fr/interets/informatique/2021/11/17/installer-nixos-sur-une-tablette-asus-t100ta/&#34;&gt;article de Richard Dern sur une tablette Asus T100TA&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/NixOS&#34;&gt;NixOS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/Udev#Hardware_database&#34;&gt;hardware database&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/systemd/systemd/pull/21773/changes&#34;&gt;dépôt Github de systemd&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Publier son blog Hugo sur Gitlab Pages</title>
      <link>https://olivier.dossmann.net/2026/04/publier-son-blog-hugo-sur-gitlab-pages/</link>
      <pubDate>Tue, 28 Apr 2026 18:18:10 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/04/publier-son-blog-hugo-sur-gitlab-pages/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a plus d&amp;rsquo;un an je travaillais en équipe dans le cadre du passage d&amp;rsquo;un titre professionnel d&amp;rsquo;&lt;em&gt;Administrateur Système DevOps&lt;/em&gt;. Pour étayer nos travaux nous avions choisi, entre autre, de &lt;strong&gt;publier un site à l&amp;rsquo;aide du très célèbre &lt;a href=&#34;https://gohugo.io/&#34;&gt;moteur de blog statique Hugo&lt;/a&gt;&lt;/strong&gt;. Nous utilisions la plateforme &lt;a href=&#34;https://olivier.dossmann.net/2025/05/ce-que-jaurais-voulu-savoir-sur-gitlab-ci/&#34;&gt;&lt;strong&gt;Gitlab CI&lt;/strong&gt; dont je vous parlais déjà&lt;/a&gt; &lt;strong&gt;pour automatiser le déploiement&lt;/strong&gt; du site &lt;strong&gt;sur &lt;a href=&#34;https://docs.gitlab.com/user/project/pages/&#34;&gt;Gitlab Pages&lt;/a&gt;&lt;/strong&gt;. C&amp;rsquo;est une &lt;strong&gt;plateforme pour publier gratuitement ses sites webs statiques&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd&amp;rsquo;hui nous allons voir comment publier son blog/site fabriqué avec Hugo sur Gitlab Pages, ce qui ressemblera beaucoup au &lt;a href=&#34;https://docs.gitlab.com/tutorials/hugo/&#34;&gt;tutoriel officiel de Gitlab pour construire et déployer un site Hugo&lt;/a&gt;. Le présent tutoriel s&amp;rsquo;appuie sur l&amp;rsquo;&lt;a href=&#34;https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/&#34;&gt;article précédent concernant les &lt;strong&gt;premiers pas avec Hugo, moteur de blog statique&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;je vous invite à en prendre connaissance&lt;/strong&gt; - excepté si vous savez déjà utiliser Hugo.&lt;/p&gt;
&lt;p&gt;Dans un premier temps nous listerons les pré-requis à l&amp;rsquo;usage de ce tutoriel, puis nous aborderons le nommage du dépôt Gitlab lors de sa création. Après quoi nous agrémenterons ce dernier avec un site Hugo (avec une configuration minime). Et nous attaquerons l&amp;rsquo;automatisation de la compilation du site sur Gitlab CI pour finalement terminer sur la publication du blog/site.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/tanuki.jpg&#34; alt=&#34;Photo d&amp;rsquo;un Tanuki du Japon qui est l&amp;rsquo;animal mascotte de Gitlab&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur &lt;a href=&#34;https://commons.wikimedia.org/w/index.php?curid=83176199&#34;&gt;Wikimedia Commons concernant le Tanuki du Japon&lt;/a&gt;&lt;/em&gt; sous Licence CC BY-SA 4.0.&lt;/p&gt;
&lt;h1 id=&#34;pré-requis&#34;&gt;Pré-requis&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;savoir &lt;a href=&#34;https://git-scm.com/book/fr/v2/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git&#34;&gt;utiliser &lt;strong&gt;Git&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;avoir un &lt;strong&gt;compte Gitlab&lt;/strong&gt; et &lt;a href=&#34;https://docs.gitlab.com/user/ssh/&#34;&gt;avoir déposé une &lt;strong&gt;clé SSH sur son profil Gitlab&lt;/strong&gt;&lt;/a&gt; pour y accéder,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;&lt;strong&gt;installer Hugo&lt;/strong&gt; sur sa machine&lt;/a&gt; &lt;strong&gt;et savoir l&amp;rsquo;utiliser&lt;/strong&gt; (cas échéant je vous invite à lire mon article nommé « &lt;a href=&#34;https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/&#34;&gt;Premiers pas avec Hugo, moteur de blog statique&lt;/a&gt; »).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce « tutoriel » peut sembler &lt;strong&gt;long la première fois&lt;/strong&gt;, mais il vaut la peine d&amp;rsquo;être accompli jusqu&amp;rsquo;au bout. &lt;strong&gt;Les fois d&amp;rsquo;après sont plus rapides&lt;/strong&gt;, plus faciles et ne durent que quelques minutes seulement ! Je l&amp;rsquo;ai déjà fait en moins de 10 minutes - si je devais être une référence &amp;#x1f923;.&lt;/p&gt;
&lt;h1 id=&#34;création-du-dépôt-et-règles-de-nommage&#34;&gt;Création du dépôt et règles de nommage&lt;/h1&gt;
&lt;p&gt;Dans le principe, c&amp;rsquo;est très simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vous &lt;strong&gt;créez un nouveau dépôt&lt;/strong&gt; à l&amp;rsquo;aide de « &lt;strong&gt;Nouveau projet/dépôt&lt;/strong&gt; » puis « &lt;strong&gt;Créer un projet vide&lt;/strong&gt; »,&lt;/li&gt;
&lt;li&gt;vous &lt;strong&gt;renseignez les champs demandés&lt;/strong&gt;, par exemple pour l&amp;rsquo;URL de projet on choisit son pseudo dans le menu déroulant,&lt;/li&gt;
&lt;li&gt;puis il s&amp;rsquo;agit de donner un &lt;strong&gt;nom spécifique&lt;/strong&gt; au dépôt et un &lt;em&gt;slug&lt;/em&gt; correspondant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_new-project-slug.png&#34; alt=&#34;Impression écran de la création d&amp;rsquo;un projet vide avec le « slug » façon pseudonyme.gitlab.io&#34;&gt;&lt;/p&gt;
&lt;p&gt;Parlons du nom du dépôt (et du champ « identifiant &lt;em&gt;slug&lt;/em&gt; » hérité de ce nom).&lt;/p&gt;
&lt;p&gt;Imaginons que vous ayez comme pseudo &lt;strong&gt;blankoworld&lt;/strong&gt;, pour ne viser personne &amp;#x1f923; . À défaut dans Gitlab Pages &lt;strong&gt;votre accès est&lt;/strong&gt; : &lt;strong&gt;blankoworld.gitlab.io&lt;/strong&gt;. Essayez : il n&amp;rsquo;y a rien pour l&amp;rsquo;instant à cette URL.&lt;/p&gt;
&lt;p&gt;Pour faciliter les choses et bénéfier d&amp;rsquo;une adresse URL permettant d&amp;rsquo;accéder à votre blog/site statique, &lt;strong&gt;je vous suggère fortement de créer un dépôt nommé&lt;/strong&gt; blankoworld.&lt;strong&gt;gitlab.io&lt;/strong&gt; (oui oui, avec le domaine dans le titre du dépôt). C&amp;rsquo;est la méthode la plus simple. Bien évidemment, changez &lt;em&gt;blankoworld&lt;/em&gt; par votre pseudo choisi sur Gitlab.&lt;/p&gt;
&lt;p&gt;Si au contraire vous créez un dépôt nommé &lt;em&gt;veille&lt;/em&gt; par exemple, il sera finalement disponible à l&amp;rsquo;adresse &lt;em&gt;blankoworld.gitlab.io/veille&lt;/em&gt;. C&amp;rsquo;est ce qui permet de bénéficier de plusieurs blog/sites statiques sans être limité par Gitlab.&lt;/p&gt;
&lt;p&gt;Il est aussi &lt;strong&gt;possible d&amp;rsquo;utiliser un groupe&lt;/strong&gt; Gitlab, en ce cas cela fonctionne avec le nom du groupe, par exemple &lt;em&gt;odtre.gitlab.io&lt;/em&gt; pour le groupe nommé &lt;em&gt;odtre&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Et si vous êtes intéressés par l&amp;rsquo;&lt;strong&gt;usage d&amp;rsquo;un nom de domaine&lt;/strong&gt; en lieu et place de celui fourni par Gitlab pour votre blog/site statique généré ; je vous invite à &lt;strong&gt;lire la &lt;a href=&#34;https://docs.gitlab.com/user/project/pages/custom_domains_ssl_tls_certification/&#34;&gt;documentation Gitlab au sujet des noms de domaines personnalisés&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_new-project-visibility.png&#34; alt=&#34;Impression écran de l&amp;rsquo;encart « Niveau de visibilité » pour la création d&amp;rsquo;un nouveau dépôt&#34;&gt;&lt;/p&gt;
&lt;p&gt;Autre point important : le &lt;strong&gt;niveau de visibilité&lt;/strong&gt; de votre dépôt Git. &lt;strong&gt;Si le dépôt est public&lt;/strong&gt;, ça facilitera possiblement les actions pour &lt;strong&gt;afficher le site final au reste du monde&lt;/strong&gt;. Nous verrons cela en détail plus tard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_new-project-README-option.png&#34; alt=&#34;Impression écran de l&amp;rsquo;encart « Configuration du Projet » pour la création d&amp;rsquo;un nouveau dépôt&#34;&gt;&lt;/p&gt;
&lt;p&gt;Laissez « &lt;strong&gt;Initialiser le dépôt avec un README&lt;/strong&gt; » coché, comme ça nous aurons déjà un &lt;strong&gt;dépôt Git prêt à être récupéré&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;récupération-initiale-du-dépôt-et-préparation&#34;&gt;Récupération initiale du dépôt et préparation&lt;/h1&gt;
&lt;p&gt;En bref, ça pourrait faire quelque chose comme les &lt;strong&gt;lignes suivantes dans une invite de commande&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;PSEUDO_GITLAB&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;VOTRE_PSEUDO &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# par exemple blankoworld&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DEPOT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;VOTRE_DEPOT          &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# par exemple blankoworld.gitlab.io&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@gitlab.com:&lt;span style=&#34;color:#70a0d0&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;PSEUDO_GITLAB&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;/&lt;span style=&#34;color:#70a0d0&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DEPOT&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DEPOT&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site . --force    &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# le point définit le dossier courant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/zhaohuabing/hugo-theme-cleanwhite themes/cleanwhite
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;theme = &amp;#39;cleanwhite&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;public/&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;s#baseURL = \(.*\)#baseURL = &amp;#39;https://&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;DEPOT&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/&amp;#39;#&amp;#34;&lt;/span&gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add . &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# on ajoute les fichiers au prochain commit git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;chore: Hugo initialized&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# création du prochain commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Procédons étape par étape&lt;/strong&gt; avec des explications.&lt;/p&gt;
&lt;p&gt;On va &lt;strong&gt;récupérer notre dépôt Gitlab&lt;/strong&gt; à l&amp;rsquo;aide de la commande suivante :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@gitlab.com:blankoworld/blankoworld.gitlab.io
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;blankoworld&lt;/strong&gt; (le premier qui apparaît) est &lt;strong&gt;notre pseudo&lt;/strong&gt; sur Gitlab, mais ça peut aussi être le &amp;ldquo;groupe&amp;rdquo; Gitlab sur lequel nous avons créé le dépôt (rappelez-vous le menu déroulant qui demandait l&amp;rsquo;URL du projet),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;blankoworld.gitlab.io&lt;/strong&gt; est le &lt;strong&gt;mot clé&lt;/strong&gt; que je vous avais demandé de fabriquer &lt;strong&gt;en fonction de votre pseudo/groupe&lt;/strong&gt; pour faciliter l&amp;rsquo;accès. Je dis mot-clé car il sera repéré par Gitlab pour &lt;strong&gt;mettre à disposition le site&lt;/strong&gt; contenu dans le dépôt &lt;strong&gt;directement à la racine de l&amp;rsquo;adresse URL&lt;/strong&gt; blankoworld.&lt;strong&gt;gitlab.io&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite &lt;strong&gt;on se rend dans ce répertoire&lt;/strong&gt; pour préparer un site Hugo. D&amp;rsquo;après &lt;a href=&#34;https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/&#34;&gt;mon tutoriel sur la fabrication initiale d&amp;rsquo;un site Hugo&lt;/a&gt;, &lt;strong&gt;en choisissant le &lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;thème &lt;em&gt;CleanWhite&lt;/em&gt; pour Hugo&lt;/a&gt;&lt;/strong&gt;, cela ressemblerait à quelque chose comme :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; blankoworld.gitlab.io  &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# pour se rendre dans le répertoire qu&amp;#39;on vient de récupérer avec Git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site . --force   &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# `--force` prend en compte les fichiers existant du dépôt Git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/zhaohuabing/hugo-theme-cleanwhite themes/cleanwhite
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;theme = &amp;#39;cleanwhite&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour éviter d&amp;rsquo;augmenter la taille du dépôt Gitlab distant, &lt;strong&gt;on va ignorer&lt;/strong&gt; - seulement sous Git - les fichiers contenus dans le &lt;strong&gt;répertoire public/&lt;/strong&gt;. Ce qui revient à le &lt;strong&gt;rajouter dans le fichier .gitignore&lt;/strong&gt; comme ceci :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;public/&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nous devons également &lt;strong&gt;adapter l&amp;rsquo;URL du site dans la configuration&lt;/strong&gt; afin qu&amp;rsquo;il corresponde à l&amp;rsquo;URL fournie par Gitlab Pages pour servir votre - futur - site statique. Dans le cas où vous auriez suivi mes conseils et utilisé quelque chose comme &lt;em&gt;mon_pseudo.gitlab.io&lt;/em&gt;, alors l&amp;rsquo;URL sera &lt;em&gt;&lt;a href=&#34;https://mon_pseudo.gitlab.io/&#34;&gt;https://mon_pseudo.gitlab.io/&lt;/a&gt;&lt;/em&gt;. Dans mon cas c&amp;rsquo;est &lt;a href=&#34;https://blankoworld.gitlab.io/&#34;&gt;https://blankoworld.gitlab.io/&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Éditons le fichier hugo.toml pour adapter l&amp;rsquo;URL&lt;/strong&gt; du site comme il se doit :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;baseURL = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;https://blankoworld.gitlab.io/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;locale = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;My New Hugo Project&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;theme = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;cleanwhite&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il ne reste plus qu&amp;rsquo;à &lt;strong&gt;enregistrer les changements dans le dépôt Git et l&amp;rsquo;envoyer&lt;/strong&gt; sur Gitlab :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .                               &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# on ajoute les fichiers au prochain commit git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;chore: Hugo initialized&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# création du prochain commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push                                &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# on pousse le résultat sur Gitlab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;À ce stade, nous avons un site Hugo&lt;/strong&gt; - très sommaire - &lt;strong&gt;avec un thème&lt;/strong&gt; et l&amp;rsquo;URL de Gitlab enregistrée dans la configuration. Ce sont les &lt;strong&gt;seuls besoins vitaux pour compiler et publier&lt;/strong&gt; le site. Rédiger un article est une étape qui peut attendre.&lt;/p&gt;
&lt;p&gt;Voyons désormais comment permettre la publication de notre travail.&lt;/p&gt;
&lt;h1 id=&#34;automatisation-avec-compilation-dhugo&#34;&gt;Automatisation avec compilation d&amp;rsquo;Hugo&lt;/h1&gt;
&lt;p&gt;La &lt;a href=&#34;https://docs.gitlab.com/ci/&#34;&gt;documentation de Gitlab sur l&amp;rsquo;intégration continue parle d&amp;rsquo;un fichier &lt;strong&gt;.gitlab-ci.yml&lt;/strong&gt;&lt;/a&gt; à fournir à la base du répertoire principal.&lt;/p&gt;
&lt;p&gt;Ce &lt;strong&gt;fichier .gitlab-ci.yml&lt;/strong&gt; - oui, oui, avec un point devant le nom du fichier - &lt;strong&gt;va décrire les actions à effectuer pour construire&lt;/strong&gt;, ou plutôt compiler, votre site Hugo et le publier sur Gitlab Pages.&lt;/p&gt;
&lt;p&gt;Créons donc le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; &lt;strong&gt;à la base de notre répertoire principal&lt;/strong&gt; - dans mon cas dans le dossier blankoworld.gitlab.io - avec le contenu suivant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;hugomods/hugo:exts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;variables&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;GIT_SUBMODULE_STRATEGY&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;recursive&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;HUGO_ENV&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;production&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;create-pages&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- hugo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;pages&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;artifacts&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- public&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;if&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est une &lt;strong&gt;version allégée&lt;/strong&gt; de celle trouvée sur la &lt;a href=&#34;https://docs.gitlab.com/tutorials/hugo/&#34;&gt;documentation Gitlab à propos de la &lt;strong&gt;publication d&amp;rsquo;un site Hugo en utilisant Gitlab CI&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Inutile d&amp;rsquo;être un as de l&amp;rsquo;écriture de fichiers &lt;strong&gt;.gitlab-ci.yml&lt;/strong&gt; pour en &lt;strong&gt;comprendre le détail&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les lignes 1 à 2 renseignent l&amp;rsquo;&lt;strong&gt;image Docker&lt;/strong&gt; à utiliser pour compiler votre site. Ici nous utilisons les &lt;a href=&#34;https://docker.hugomods.com/&#34;&gt;excellentes images Docker fournies par Hugomods&lt;/a&gt;. Attention cependant à trouver une image qui contient aussi l&amp;rsquo;outil Git pour récupérer le thème du site,&lt;/li&gt;
&lt;li&gt;ligne 4 à 6, nous avons respectivement une variable &lt;strong&gt;GIT_SUBMODULE_STRATEGY&lt;/strong&gt; pour définir la &lt;strong&gt;statégie de récupération Git&lt;/strong&gt; (utile pour récupérer notre thème) et &lt;strong&gt;HUGO_ENV&lt;/strong&gt; pour définir l&amp;rsquo;&lt;strong&gt;environnement cible&lt;/strong&gt; pour la compilation Hugo,&lt;/li&gt;
&lt;li&gt;ligne 8 à 17 sont &lt;strong&gt;les lignes où tout va se jouer&lt;/strong&gt;. C&amp;rsquo;est là qu&amp;rsquo;on décrit la &lt;strong&gt;commande à lancer&lt;/strong&gt; - ici c&amp;rsquo;est juste &lt;code&gt;hugo&lt;/code&gt;. Le fait qu&amp;rsquo;on souhaite utiliser Gitlab Pages et qu&amp;rsquo;on va utiliser le contenu résultant du dossier &lt;em&gt;public&lt;/em&gt; pour l&amp;rsquo;envoyer sur Gitlab Pages.&lt;/li&gt;
&lt;li&gt;ligne 15 et 16 définissent &lt;strong&gt;dans quel cas exécuter cette étape&lt;/strong&gt; nommée &lt;em&gt;create-pages&lt;/em&gt;. En l&amp;rsquo;occurrence cela ne sera que si la branche attachée au commit est la branche par défaut dans Gitlab. Si vous m&amp;rsquo;avez suivi dès le départ, nous n&amp;rsquo;avons qu&amp;rsquo;une seule branche dans Gitlab nommée &lt;code&gt;master&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois le &lt;strong&gt;fichier dûment complété, n&amp;rsquo;oubliez pas de l&amp;rsquo;ajouter au dépôt Git et de pousser&lt;/strong&gt; le tout sur Gitlab :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .gitlab-ci.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;feat(CI): Add .gitlab-ci.yml file to compile Hugo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous devriez retrouver rapidement les détails de la compilation dans le &lt;strong&gt;menu Gitlab&lt;/strong&gt; (à gauche) nommé &amp;ldquo;&lt;strong&gt;Compilation &amp;gt; Pipelines&lt;/strong&gt;&amp;rdquo;. Les pipelines de Gitlab CI représentent une suite automatisée d&amp;rsquo;étapes justement fournies dans le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt;. Donc &lt;strong&gt;chaque fois que vous ferez un commit&lt;/strong&gt; sur votre dépôt &lt;strong&gt;et que vous poussez&lt;/strong&gt; le résultat sur Gitlab, &lt;strong&gt;une pipeline s&amp;rsquo;exécutera&lt;/strong&gt; si et seulement si le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; est présent dans votre dépôt (et qu&amp;rsquo;il soit bien bien formé comme Gitlab CI l&amp;rsquo;attend).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_menu-pipelines.png&#34; alt=&#34;Impression écran du menu Gitlab pour accéder aux pipelines&#34;&gt;&lt;/p&gt;
&lt;p&gt;Mais ne crions pas victoire trop tôt, &lt;strong&gt;nous avons encore quelques détails à régler&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;publication-de-son-blog&#34;&gt;Publication de son blog&lt;/h1&gt;
&lt;p&gt;Bien entendu, suite à notre dernier commit Git, une pipeline s&amp;rsquo;est exécutée. Elle est sûrement arrivée au bout de son exécution et le site est envoyé vers Gitlab Pages.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_pipelines-result.png&#34; alt=&#34;Impression écran du résultat d&amp;rsquo;une pipeline sous Gitlab CI&#34;&gt;&lt;/p&gt;
&lt;p&gt;Cependant même en ayant l&amp;rsquo;URL &lt;strong&gt;il se pourrait que vos visiteurs n&amp;rsquo;accèdent pas au site&lt;/strong&gt; : nous devons vérifier la « &lt;strong&gt;visibilité du site&lt;/strong&gt; ». Et où cela se trouve ? Dans les paramètres de votre dépôt.&lt;/p&gt;
&lt;p&gt;Sur Gitlab, une fois sur votre dépôt :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;allez dans le &lt;strong&gt;menu latéral gauche&lt;/strong&gt; et choisissez cette fois &amp;ldquo;&lt;strong&gt;Paramètres &amp;gt; Général&lt;/strong&gt;&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;puis cliquez sur le titre &amp;ldquo;&lt;strong&gt;Visibilité, fonctionnalités du projet, autorisations&lt;/strong&gt;&amp;rdquo;. Vous devriez avoir une loooooongue liste de boutons à cocher/décocher,&lt;/li&gt;
&lt;li&gt;parmi eux, &lt;strong&gt;sous un titre &amp;ldquo;&lt;em&gt;Pages&lt;/em&gt;&amp;rdquo;&lt;/strong&gt;, doit se trouver un bouton activé. Et &lt;strong&gt;un menu déroulant&lt;/strong&gt; pour choisir qui peut voir le site,&lt;/li&gt;
&lt;li&gt;si vous souhaitez que tout le monde puisse accéder au site, &lt;strong&gt;choisissez &amp;ldquo;&lt;em&gt;Toute personne ayant accès&lt;/em&gt;&amp;rdquo;&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ET n&amp;rsquo;oubliez pas&lt;/strong&gt; d&amp;rsquo;aller plus bas de la page pour &lt;strong&gt;cliquer sur le bouton &amp;ldquo;Enregistrer les modifications&amp;rdquo;&lt;/strong&gt;. Cas échéant vos modifications n&amp;rsquo;auront aucun effet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le menu &amp;ldquo;&lt;strong&gt;Paramètres &amp;gt; Général&lt;/strong&gt;&amp;rdquo; en image :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_menu-general.png&#34; alt=&#34;Impression écran du menu Paramètres &amp;gt; Général sur Gitlab&#34;&gt;&lt;/p&gt;
&lt;p&gt;et son petit copain l&amp;rsquo;encart &amp;ldquo;&lt;strong&gt;Pages&lt;/strong&gt;&amp;rdquo; également en image :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/gitlab-pages_general-visibility.png&#34; alt=&#34;Impression écran de l&amp;rsquo;encart « u menu Paramètres &amp;gt; Général sur Gitlab&#34;&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est tout bon ! Vous devriez avoir un site accessible sur &lt;em&gt;mon_depot.gitlab.io&lt;/em&gt;, dans mon cas c&amp;rsquo;est &lt;strong&gt;blankoworld.gitlab.io&lt;/strong&gt;. Allez vérifier tout de même &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;À travers &lt;strong&gt;quelques étapes&lt;/strong&gt; comme la &lt;strong&gt;création du dépôt&lt;/strong&gt;, celle du &lt;strong&gt;site Hugo&lt;/strong&gt;, la &lt;strong&gt;configuration&lt;/strong&gt; de ce dernier, l&amp;rsquo;ajout d&amp;rsquo;un &lt;strong&gt;fichier .gitlab-ci.yml&lt;/strong&gt; et finalement une &lt;strong&gt;configuration Gitlab&lt;/strong&gt;, nous avons vu que quelques minutes suffisent à démarrer un nouveau blog/site statique, ce qui est &lt;strong&gt;très pratique&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Loin d&amp;rsquo;être un modèle de beauté, nous avons pourtant &lt;strong&gt;un site prêt à l&amp;rsquo;usage sur Gitlab Pages&lt;/strong&gt;, à l&amp;rsquo;adresse &lt;a href=&#34;https://blankoworld.gitlab.io/&#34;&gt;blankoworld.gitlab.io&lt;/a&gt;. Chaque nouvelle modification enregistrée par Git (via un commit) puis poussée sur Gitlab génèrera &lt;strong&gt;une pipeline Gitlab CI qui publiera le site&lt;/strong&gt; Hugo sur l&amp;rsquo;adresse fournie ci-avant.&lt;/p&gt;
&lt;p&gt;Si d&amp;rsquo;aventures vous voudriez voir ce qui a été fait, je vous invite à lire le &lt;a href=&#34;https://gitlab.com/blankoworld/blankoworld.gitlab.io/&#34;&gt;dépôt Gitlab utilisé pour ce tutoriel sur la publication d&amp;rsquo;un site Hugo sur Gitlab Pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vous pourriez aller plus loin en ajoutant un &lt;a href=&#34;https://docs.gitlab.com/user/project/pages/custom_domains_ssl_tls_certification/&#34;&gt;&lt;strong&gt;domaine personnalisé sur votre dépôt Gitlab&lt;/strong&gt; en lisant la documentation Gitlab&lt;/a&gt;. Vous allez devoir cependant apprendre comment avoir un &lt;a href=&#34;https://fr.wikipedia.org/wiki/Nom_de_domaine&#34;&gt;nom de domaine&lt;/a&gt; et comment en modifier ce qu&amp;rsquo;on appelle la &lt;a href=&#34;https://fr.wikipedia.org/wiki/Domain_Name_System&#34;&gt;zone DNS&lt;/a&gt;. Mais ceci est une autre histoire que nous n&amp;rsquo;aborderons pas aujourd&amp;rsquo;hui.&lt;/p&gt;
&lt;p&gt;Amusez-vous bien et n&amp;rsquo;hésitez pas à tester votre site Hugo en local avant de pousser le résultat sur le dépôt Gitlab &amp;#x1f609; .&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo, moteur de blog statique&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2025/05/ce-que-jaurais-voulu-savoir-sur-gitlab-ci/&#34;&gt;Article sur ce que j&amp;rsquo;aurais voulu savoir sur Gitlab CI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/user/project/pages/&#34;&gt;Gitlab Pages&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/tutorials/hugo/&#34;&gt;Tutoriel officiel de Gitlab pour construire et déployer un site Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/&#34;&gt;Mes premiers pas avec Hugo, moteur de blog statique&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git-scm.com/book/fr/v2/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git&#34;&gt;Les bases de Git&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/user/ssh/&#34;&gt;Déposer une clé SSH sur son profil Gitlab&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;Installer Hugo sur sa machine&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/user/project/pages/custom_domains_ssl_tls_certification/&#34;&gt;Documentation Gitlab au sujet des noms de domaines personnalisés&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;Thème &lt;em&gt;CleanWhite&lt;/em&gt; pour Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ci/&#34;&gt;Documentation de Gitlab sur l&amp;rsquo;intégration continue&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docker.hugomods.com/&#34;&gt;Images Docker d&amp;rsquo;Hugo, fournies par Hugomods&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/blankoworld/blankoworld.gitlab.io/&#34;&gt;Dépôt Gitlab utilisé pour ce tutoriel sur la publication d&amp;rsquo;un site Hugo sur Gitlab Pages&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Nom_de_domaine&#34;&gt;Nom de domaine par Wikipédia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Domain_Name_System&#34;&gt;Zone DNS par Wikipédia&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Premiers pas avec Hugo, moteur de blog statique</title>
      <link>https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/</link>
      <pubDate>Tue, 07 Apr 2026 17:19:03 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/04/premiers-pas-avec-hugo-moteur-de-blog-statique/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; est un &lt;strong&gt;moteur de blog statique&lt;/strong&gt; célèbre pour sa rapidité et sa souplesse d&amp;rsquo;utilisation. Il permet de &lt;strong&gt;générer&lt;/strong&gt; un site web contenant &lt;strong&gt;des milliers d&amp;rsquo;articles en quelques secondes&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Qu&amp;rsquo;entends-tu par &lt;strong&gt;générer&lt;/strong&gt; un site web ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dire que c&amp;rsquo;est un moteur de site statique signifie que l&amp;rsquo;outil va prendre &lt;strong&gt;un répertoire&lt;/strong&gt; d&amp;rsquo;origine &lt;strong&gt;comme base pour compulser les données&lt;/strong&gt; et générer des pages webs comme par exemple &lt;strong&gt;des pages HTML, CSS, XML&lt;/strong&gt; ou encore du JS (mais d&amp;rsquo;autres formats sont possibles).&lt;/p&gt;
&lt;p&gt;Quel(s) avantage(s) à ce qu&amp;rsquo;il soit statique ? Une fois vos fichiers générés dans un dossier cible (par exemple un dossier nommé « public »), vous pouvez le déposer &lt;strong&gt;chez n&amp;rsquo;importe quel hébergeur web&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Imaginez votre blog, votre site vitrine ou un site professionnel : &lt;strong&gt;aucune dépendance&lt;/strong&gt;, &lt;strong&gt;pas de faille de sécurité&lt;/strong&gt; liée au langage ou au framework choisi pour publier le site, &lt;strong&gt;pas de surcoût&lt;/strong&gt; de serveur pour des environnements particuliers, &lt;strong&gt;pas de lenteurs&lt;/strong&gt; sur votre site pour calculer tous les éléments avant de les servir &lt;strong&gt;à chaque visiteur&lt;/strong&gt;, etc.&lt;/p&gt;
&lt;p&gt;En somme fournir un site web statique est &lt;strong&gt;très pratique, économique et facile&lt;/strong&gt;. D&amp;rsquo;autant qu&amp;rsquo;il existe des hébergeurs gratuits pour fournir vos fichiers HTML, CSS, XML, JS. Pourquoi ne pas en profiter ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://olivier.dossmann.net/2016/03/hugo_le_moteur_de_blog_statique_rapide_et_moderne/&#34;&gt;En 2016, j&amp;rsquo;ai fait le choix de migrer mon blog sur Hugo&lt;/a&gt;, j&amp;rsquo;ai donc un peu de bouteille dans son utilisation. J&amp;rsquo;ai d&amp;rsquo;ailleurs proposé un &lt;a href=&#34;https://github.com/blankoworld/hugo_theme_adam_eve/&#34;&gt;thème nommé Adam &amp;amp; Eve pour Hugo&lt;/a&gt; que j&amp;rsquo;utilise pour l&amp;rsquo;&lt;a href=&#34;https://olivier.dossmann.net/wiki&#34;&gt;espace Recueil de ce blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd&amp;rsquo;hui nous allons faire nos premiers pas dans la création d&amp;rsquo;un blog statique à l&amp;rsquo;aide d&amp;rsquo;Hugo. Nous parlerons de l&amp;rsquo;installation de l&amp;rsquo;outil, puis de la création du squelette principal, le choix d&amp;rsquo;un thème, la configuration du blog et la rédaction d&amp;rsquo;un article avant de générer notre premier blog Hugo &amp;#x1f60e;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/voiture_gros_moteur.jpg&#34; alt=&#34;Une voiture bleue avec un énorme moteur qui dépasse de l&amp;rsquo;avant de la voiture en hauteur&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://www.flickr.com/photos/50826080@N00/&#34;&gt;profil de Stephen Bowler sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence CC BY 2.0.&lt;/p&gt;
&lt;h1 id=&#34;installation&#34;&gt;Installation&lt;/h1&gt;
&lt;p&gt;Étant donné qu&amp;rsquo;&lt;strong&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;&lt;/strong&gt; est un &lt;strong&gt;outil qui s&amp;rsquo;utilise en ligne de commande&lt;/strong&gt;, il faut installer le binaire sur notre machine. En fonction de votre système d&amp;rsquo;exploitation la méthode diffère.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;&lt;strong&gt;documentation officielle&lt;/strong&gt; sur l&amp;rsquo;installation d&amp;rsquo;Hugo&lt;/a&gt; est bien faite. Je vous invite à &lt;strong&gt;la consulter promptement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si vous avez une distribution GNU/Linux, il existe sûrement un &lt;a href=&#34;https://gohugo.io/installation/linux/#repository-packages&#34;&gt;paquet spécifique d&amp;rsquo;Hugo pour votre distribution&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple &lt;strong&gt;sous ArchLinux&lt;/strong&gt; il me suffit de faire :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pacman -S hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et le tour est joué !&lt;/p&gt;
&lt;p&gt;Une fois installée, vous pouvez taper la commande suivante dans une console pour vérifier que tout soit en ordre :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela &lt;strong&gt;affiche la version d&amp;rsquo;Hugo&lt;/strong&gt; que vous venez d&amp;rsquo;installer.&lt;/p&gt;
&lt;p&gt;Plusieurs méthodes permettent d&amp;rsquo;&lt;strong&gt;avoir des infos sur la commande &lt;code&gt;hugo&lt;/code&gt;&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;man hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo &lt;span style=&#34;color:#007020&#34;&gt;help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ou tout simplement se rendre sur la &lt;a href=&#34;https://gohugo.io/documentation/&#34;&gt;&lt;strong&gt;documentation officielle d&amp;rsquo;Hugo&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;créer-un-nouveau-site&#34;&gt;Créer un nouveau site&lt;/h1&gt;
&lt;p&gt;Pour &lt;strong&gt;générer un nouveau site&lt;/strong&gt; nommé &lt;em&gt;superblog&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site superblog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hugo lui-même vous informe des étapes à suivre pour terminer votre projet de site, parmi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;se rendre dans le nouveau répertoire,&lt;/li&gt;
&lt;li&gt;choisir et &lt;strong&gt;ajouter un thème&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;configurer le site&lt;/strong&gt; à l&amp;rsquo;aide du fichier &lt;strong&gt;hugo.toml&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;créer &lt;strong&gt;du contenu&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;vérifier le résultat avec un &lt;strong&gt;serveur local dédié&lt;/strong&gt; (rien que ça !).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agissons de suite : rendez-vous dans le répertoire &lt;strong&gt;superblog&lt;/strong&gt; et passons au chapitre suivant.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; superblog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;choisir-un-thème&#34;&gt;Choisir un thème&lt;/h1&gt;
&lt;p&gt;L&amp;rsquo;avantage d&amp;rsquo;avoir un outil très connu c&amp;rsquo;est de &lt;strong&gt;bénéficier d&amp;rsquo;innombrables thèmes proposés par la communauté&lt;/strong&gt;. Vous les retrouverez sur un &lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;site officiel dédié aux thèmes prévus pour Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Étant donné que le &lt;strong&gt;travail est fourni par la communauté&lt;/strong&gt;, leur qualité ou la couverture de fonctionnalités intégrées est dépendante du temps passé sur ces thèmes et le temps accordé à leur maintenance. Autrement dit : &lt;strong&gt;il y a à boire et à manger&lt;/strong&gt; là dedans !&lt;/p&gt;
&lt;p&gt;Parcourez l&amp;rsquo;&lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;annuaire de thèmes Hugo&lt;/a&gt;, choisissez un thème, par exemple le &lt;a href=&#34;https://themes.gohugo.io/themes/hugo-theme-cleanwhite/&#34;&gt;thème Clean White pour Hugo&lt;/a&gt; et cliquez de droit sur le bouton « Download » pour copier l&amp;rsquo;adresse où se trouve le thème.&lt;/p&gt;
&lt;p&gt;Pour l&amp;rsquo;installer il suffira de taper la commande suivante dans le répertoire &lt;strong&gt;superblog&lt;/strong&gt; (exemple avec le thème &lt;em&gt;Clean White&lt;/em&gt;) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Nécessite d&amp;#39;avoir la commande `git` installée sur sa machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; git submodule add https://github.com/zhaohuabing/hugo-theme-cleanwhite themes/cleanwhite
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On &lt;strong&gt;enregistre&lt;/strong&gt; ensuite &lt;strong&gt;le thème dans la configuration&lt;/strong&gt; de ce site - dont nous parlerons dans le chapitre suivant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;theme = &amp;#39;cleanwhite&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Si vous êtes curieux du résultat&lt;/strong&gt;, vous pouvez directement lancer la commande suivante :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo serve -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;qui aura pour effet de &lt;strong&gt;lancer un serveur web en arrière plan&lt;/strong&gt; et de vous fournir une adresse URL où consulter votre nouveau site. Par exemple sur http://localhost:1313/. Pour arrêter le serveur, pressez simultanément les touches &lt;strong&gt;[Ctrl]+[c]&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Regardons de plus près la configuration du site.&lt;/p&gt;
&lt;h1 id=&#34;configuration-du-site-le-fichier-hugotoml&#34;&gt;Configuration du site, le fichier hugo.toml&lt;/h1&gt;
&lt;p&gt;La &lt;strong&gt;configuration principale de votre site&lt;/strong&gt; se trouve dans le &lt;strong&gt;fichier hugo.toml&lt;/strong&gt; (anciennement &lt;em&gt;config.toml&lt;/em&gt;). La &lt;a href=&#34;https://gohugo.io/configuration/&#34;&gt;documentation officielle sur le fichier hugo.toml&lt;/a&gt; vous donnera une idée de l&amp;rsquo;ampleur des possibilités qu&amp;rsquo;offre la configuration d&amp;rsquo;un site Hugo.&lt;/p&gt;
&lt;p&gt;Cantonnons-nous ici de quelques éléments seulement. Le contenu actuel du fichier &lt;strong&gt;hugo.toml&lt;/strong&gt; est :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;baseURL = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;https://example.org/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;locale = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;My New Hugo Project&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;theme = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;cleanwhite&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les éléments sont plutôt parlants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;baseURL&lt;/strong&gt; : va définir l&amp;rsquo;&lt;strong&gt;adresse URL finale&lt;/strong&gt; de votre site (par exemple pour mon blog ça sera &lt;a href=&#34;https://olivier.dossmann.net/)&#34;&gt;https://olivier.dossmann.net/)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;locale&lt;/strong&gt; : définit le &lt;strong&gt;langage du site&lt;/strong&gt; au regard de la &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc5646#section-2.1&#34;&gt;RFC5646&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;title&lt;/strong&gt; : est le &lt;strong&gt;titre affiché&lt;/strong&gt; sur le site,&lt;/li&gt;
&lt;li&gt;et &lt;strong&gt;theme&lt;/strong&gt; est l&amp;rsquo;adresse vers les fichiers du thème utilisé pour notre site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Modifions le fichier &lt;em&gt;hugo.toml&lt;/em&gt; pour ressembler à ceci :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;baseURL = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;https://example.org/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;locale = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;fr&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;Mon Super Blog&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;theme = &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;cleanwhite&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;enableEmoji = &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On relance le &lt;strong&gt;serveur local&lt;/strong&gt; intégré à Hugo pour voir le résultat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Faites Ctrl + c pour arrêter le serveur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo serve -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On a rajouté une ligne &lt;code&gt;enableEmoji&lt;/code&gt; pour activer l&amp;rsquo;&lt;strong&gt;utilisation des emojis&lt;/strong&gt; dans les articles. Cf. la &lt;a href=&#34;https://gohugo.io/quick-reference/emojis/&#34;&gt;page de la documentation officielle consacrée à la liste des émojis disponibles sous Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;mon-premier-article&#34;&gt;Mon premier article&lt;/h1&gt;
&lt;p&gt;Commençons par créer ledit article :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Très souvent les thèmes proposés n&amp;#39;utilisent que les articles situés dans le dossier &amp;#34;post&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new content -k post post/mon_premier_post.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;extension &lt;code&gt;.md&lt;/code&gt; est ici nécessaire. L&amp;rsquo;option &lt;strong&gt;-k&lt;/strong&gt; va suggérer d&amp;rsquo;utiliser un template &lt;em&gt;post.md&lt;/em&gt; s&amp;rsquo;il existe. C&amp;rsquo;est ce qu&amp;rsquo;on appelle &lt;strong&gt;un archétype&lt;/strong&gt; : un fichier au &lt;a href=&#34;https://fr.wikipedia.org/wiki/Markdown&#34;&gt;format Markdown&lt;/a&gt; situé dans le dossier &lt;em&gt;themes/monTheme/archetypes/&lt;/em&gt; (par exemple &lt;code&gt;themes/cleanwhite/archetypes/post.md&lt;/code&gt;) qui sera copié en lieu et place de l&amp;rsquo;article demandé ; ici dans post/mon_premier_post.md. Les &lt;strong&gt;fichiers&lt;/strong&gt; sont &lt;strong&gt;toujours placés dans le dossier content&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le fichier est &lt;strong&gt;placé dans le dossier content/post/mon_premier_post.md&lt;/strong&gt; dont voici le contenu :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;title&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;       &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;An Example Post&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;subtitle&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;date&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;2018-06-04&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;author&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;       &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;tags&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;[&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;tag1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;tag2&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;categories&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;[&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;Tech&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les articles auront &lt;strong&gt;toujours la même forme&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Une entête&lt;/strong&gt; délimitée par une chaîne de caractère de début et de fin (ici &lt;code&gt;---&lt;/code&gt; en début et fin),&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;contenu de l&amp;rsquo;article&lt;/strong&gt;, écrit au &lt;strong&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Markdown&#34;&gt;format Markdown&lt;/a&gt;&lt;/strong&gt; (par défaut).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dans le cas présent, nous n&amp;rsquo;avons aucun contenu.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;article propose seulement une entête contenant des &lt;strong&gt;informations&lt;/strong&gt; qui seront &lt;strong&gt;utilisées comme méta-données de l&amp;rsquo;article&lt;/strong&gt; (par exemple son titre, une description, un sous-titre, l&amp;rsquo;auteur de l&amp;rsquo;article, éventuellement une image, des balises (tags) et des catégories). L&amp;rsquo;exemple utilise les tags nommés &lt;em&gt;tag1&lt;/em&gt; et &lt;em&gt;tag2&lt;/em&gt; ; et une catégorie &lt;em&gt;Tech&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Notez également la date fournie : on peut &lt;strong&gt;déterminer la date de publication d&amp;rsquo;un article&lt;/strong&gt;. Si c&amp;rsquo;est une date dans le futur, alors l&amp;rsquo;article ne sera pas publié - ce qui est très pratique !&lt;/p&gt;
&lt;p&gt;Pour empêcher également qu&amp;rsquo;un article soit publié, on peut rajouter une information comme :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;draft&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce qui aura pour effet, excepté si l&amp;rsquo;option &lt;code&gt;-D&lt;/code&gt; est ajoutée, de &lt;strong&gt;ne pas rendre disponible cet article&lt;/strong&gt; - très pratique aussi !&lt;/p&gt;
&lt;p&gt;Ajoutez quelques lignes à la fin du fichier (après les méta-données et la chaîne de caractère &lt;code&gt;---&lt;/code&gt;) pour regarder le résultat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;# Titre 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quelques lignes avec du texte en &lt;span style=&#34;font-weight:bold&#34;&gt;**gras**&lt;/span&gt;, ou &lt;span style=&#34;font-style:italic&#34;&gt;*italique*&lt;/span&gt;, c&amp;#39;est comme vous voulez.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;# Titre 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;## Sous-titre
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Avec un lien vers [&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;mon blog&lt;/span&gt;](&lt;span style=&#34;color:#4070a0&#34;&gt;https://olivier.dossmann.net/&lt;/span&gt;).
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie à l&amp;rsquo;aide de la commande &lt;code&gt;hugo serve -D&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&#34;compilation-du-site&#34;&gt;Compilation du site&lt;/h1&gt;
&lt;p&gt;Maintenant que nous avons un site, un thème configuré dans le fichier &lt;em&gt;hugo.toml&lt;/em&gt; et un article, voyons l&amp;rsquo;&lt;strong&gt;étape de compilation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La compilation, avec Hugo, c&amp;rsquo;est le fait de &lt;strong&gt;prendre l&amp;rsquo;ensemble des fichiers&lt;/strong&gt; et informations du site et de &lt;strong&gt;les transformer en un dossier complet&lt;/strong&gt; qui &lt;strong&gt;fournit les pages Web&lt;/strong&gt; - et tout autre fichier nécessaire à l&amp;rsquo;élaboration du site. Hugo &lt;strong&gt;stocke le résultat&lt;/strong&gt; dans un &lt;strong&gt;dossier nommé &lt;code&gt;public&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour lancer la compilation complète, on peut, à la racine du site, taper la commande suivante :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette commande seule suffit à compiler l&amp;rsquo;ensemble du site et le rendre disponible dans le dossier &lt;em&gt;public&lt;/em&gt;. C&amp;rsquo;est le contenu de ce dernier que vous devez déposer dans l&amp;rsquo;espace fourni par votre hébergeur de site web.&lt;/p&gt;
&lt;p&gt;On peut agrémenter la commande de &lt;strong&gt;plusieurs options&lt;/strong&gt;, par exemple :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo -D --minify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;option &lt;strong&gt;-D&lt;/strong&gt; va aussi &lt;strong&gt;compiler les articles dits « brouillons »&lt;/strong&gt; (ayant &lt;code&gt;draft: true&lt;/code&gt; dans la section des méta-données).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;option &lt;strong&gt;&amp;ndash;minify&lt;/strong&gt; va &lt;strong&gt;réduire la taille des fichiers&lt;/strong&gt; en enlevant le plus possible les espaces, retour à la ligne et assimilés.&lt;/p&gt;
&lt;p&gt;Il y a énormément d&amp;rsquo;options et là encore la &lt;a href=&#34;https://gohugo.io/commands/hugo/&#34;&gt;documentation officielle d&amp;rsquo;Hugo sur la commande hugo&lt;/a&gt; permet d&amp;rsquo;en savoir plus.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;À travers &lt;strong&gt;quelques étapes simples&lt;/strong&gt;, nous avons vu comment &lt;strong&gt;installer la commande &lt;code&gt;hugo&lt;/code&gt;&lt;/strong&gt;, créer un &lt;strong&gt;nouveau site&lt;/strong&gt;, ajouter un &lt;strong&gt;thème&lt;/strong&gt;, &lt;strong&gt;configurer&lt;/strong&gt; le site, &lt;strong&gt;rédiger un article&lt;/strong&gt; et &lt;strong&gt;compiler&lt;/strong&gt; l&amp;rsquo;ensemble pour générer les fichiers suffisants pour &lt;strong&gt;créer un nouveau site web statique&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hugo est un &lt;strong&gt;moteur de site statique&lt;/strong&gt; très &lt;strong&gt;riche&lt;/strong&gt; et bourré de &lt;strong&gt;fonctionnalités en tous genres&lt;/strong&gt; comme la gestion de contenu &lt;a href=&#34;https://gohugo.io/content-management/multilingual/&#34;&gt;&lt;strong&gt;multilingue&lt;/strong&gt;&lt;/a&gt;, l&amp;rsquo;usage de « &lt;a href=&#34;https://gohugo.io/shortcodes/&#34;&gt;&lt;strong&gt;bouts de code&lt;/strong&gt;&lt;/a&gt; » réemployables, le &lt;a href=&#34;https://gohugo.io/content-management/image-processing/&#34;&gt;&lt;strong&gt;redimensionnement des images&lt;/strong&gt;&lt;/a&gt;, les &lt;a href=&#34;https://gohugo.io/content-management/comments/&#34;&gt;&lt;strong&gt;commentaires&lt;/strong&gt;&lt;/a&gt;, la &lt;a href=&#34;https://gohugo.io/templates/rss/&#34;&gt;génération d&amp;rsquo;un ou plusieurs &lt;strong&gt;flux RSS&lt;/strong&gt;&lt;/a&gt;, la personnalisation des &lt;strong&gt;thèmes&lt;/strong&gt;, une &lt;a href=&#34;https://gohugo.io/templates/404/&#34;&gt;&lt;strong&gt;page 404 personnalisée&lt;/strong&gt;&lt;/a&gt;, l&amp;rsquo;usage de &lt;a href=&#34;https://gohugo.io/quick-reference/syntax-highlighting-styles/&#34;&gt;&lt;strong&gt;coloration syntaxique&lt;/strong&gt;&lt;/a&gt; pour les balises HTML code, le &lt;strong&gt;serveur web embarqué&lt;/strong&gt;, une &lt;a href=&#34;https://gohugo.io/host-and-deploy/&#34;&gt;commande de &lt;strong&gt;déploiement&lt;/strong&gt;&lt;/a&gt; et bien plus encore…&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est &lt;strong&gt;mon outil favori depuis 2016&lt;/strong&gt;. Je prévois cette année encore de concocter un article supplémentaire à son sujet qui dépendra du présent article qui, je l&amp;rsquo;espère, vous plaira.&lt;/p&gt;
&lt;p&gt;Qui sait, peut-être vous lancerez-vous, vous aussi, dans la création et la publication d&amp;rsquo;un blog - et cela gratuitement &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l’article par ordre d’apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Site officiel du moteur de site statique Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2016/03/hugo_le_moteur_de_blog_statique_rapide_et_moderne/&#34;&gt;Article de 2016 sur ma migration vers Hugo comme moteur de blog statique&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/blankoworld/hugo_theme_adam_eve/&#34;&gt;Mon thème Hugo nommé Adam &amp;amp; Eve&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;Documentation officielle sur l&amp;rsquo;installation d&amp;rsquo;Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/documentation/&#34;&gt;Documentation officielle d&amp;rsquo;Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;Annuaire des thèmes pour Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://themes.gohugo.io/themes/hugo-theme-cleanwhite/&#34;&gt;Thème Clean White pour Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/configuration/&#34;&gt;Documentation officielle sur le fichier de configuration hugo.toml&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc5646#section-2.1&#34;&gt;RFC5646&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/quick-reference/emojis/&#34;&gt;Liste des émojis disponibles sous Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Markdown&#34;&gt;Le format Markdown&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/commands/hugo/&#34;&gt;Documentation officielle d&amp;rsquo;Hugo sur la commande &lt;code&gt;hugo&lt;/code&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/content-management/multilingual/&#34;&gt;Fonction multilingue d&amp;rsquo;Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/shortcodes/&#34;&gt;Les « bouts de code » sous Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/content-management/image-processing/&#34;&gt;Redimensionnement des images dans Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/content-management/comments/&#34;&gt;Fonction de commentaires dans Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/templates/rss/&#34;&gt;Les flux RSS dans Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/templates/404/&#34;&gt;La page 404 dans Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/quick-reference/syntax-highlighting-styles/&#34;&gt;Fonction de coloration syntaxique dans Hugo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/host-and-deploy/&#34;&gt;La sous-commande &lt;code&gt;deploy&lt;/code&gt; dans Hugo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Encore un autre lecteur de flux RSS, Yarr</title>
      <link>https://olivier.dossmann.net/2026/03/encore-un-autre-lecteur-de-flux-rss-yarr/</link>
      <pubDate>Sun, 22 Mar 2026 11:42:00 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/03/encore-un-autre-lecteur-de-flux-rss-yarr/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a fort fort longtemps (en 2009), je testais &lt;a href=&#34;https://tt-rss.org/&#34;&gt;&lt;strong&gt;TinyTinyRSS&lt;/strong&gt;, un lecteur de flux RSS&lt;/a&gt; avec une interface Web. J&amp;rsquo;en parlais d&amp;rsquo;ailleurs dans un &lt;a href=&#34;https://olivier.dossmann.net/2009/09/nouvelles-astuces-sur-rxvt-unicode-et-tinytinyrss/&#34; title=&#34;Découvrir mon article sur TinyTinyRSS et rxvt-unicode&#34;&gt;article pour signaler la venue de deux nouveaux tutoriels (dont TinyTinyRSS) dans mon Recueil d&amp;rsquo;astuces&lt;/a&gt;. Ce lecteur était &lt;strong&gt;agréable à l&amp;rsquo;usage, rapide&lt;/strong&gt; et utilisait une base de données &lt;strong&gt;postgreSQL&lt;/strong&gt;. Bref, tout ce que je voulais à l&amp;rsquo;époque. Le temps a passé ; je dépensais moins de temps sur les flux RSS. Puis j&amp;rsquo;ai arrêté - qu&amp;rsquo;importe les raisons. Ça fait &lt;strong&gt;bientôt 10 ans&lt;/strong&gt; que j&amp;rsquo;ai laissé cela derrière moi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bouh la honte Olivier !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Certes.&lt;/p&gt;
&lt;p&gt;Récemment, &lt;strong&gt;une mouche m&amp;rsquo;a piquée&lt;/strong&gt; - ou une &lt;em&gt;lubie&lt;/em&gt; - et &lt;strong&gt;je me suis renseigné&lt;/strong&gt; sur les outils de lecture de &lt;strong&gt;flux RSS&lt;/strong&gt; façon &lt;strong&gt;auto-hébergés et minimalistes&lt;/strong&gt;. Je ne vais pas détailler la liste dans cet article puisque, vous l&amp;rsquo;aurez compris, on parle déjà dans le titre de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;&lt;strong&gt;Yarr&lt;/strong&gt;&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Ainsi nous commencerons par présenter l&amp;rsquo;outil, pour ensuite décrire comment l&amp;rsquo;utiliser avec docker-compose pour finalement terminer par mon retour d&amp;rsquo;expérience après quelques jours d&amp;rsquo;utilisation (démarrage au 25 février 2026) et via un &lt;strong&gt;tour complet de l&amp;rsquo;outil&lt;/strong&gt; - ça va être long mais il y a des images &amp;#x1f609; .&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/faisceaux_lumineux.jpg&#34; alt=&#34;Image de faisceaux lumineux multiples qui ont sûrement dérivé&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://www.flickr.com/photos/12836528@N00/&#34;&gt;profil de Kevin Dooley sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence CC BY 2.0.&lt;/p&gt;
&lt;h1 id=&#34;découverte-de-yarr&#34;&gt;Découverte de Yarr&lt;/h1&gt;
&lt;p&gt;Avant de découvrir : &lt;strong&gt;on cherche&lt;/strong&gt; ! J&amp;rsquo;ai donc établi une petite liste de &lt;strong&gt;critères pour la recherche d&amp;rsquo;un lecteur de flux RSS&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;simple, voire &lt;strong&gt;basique&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;avec une &lt;strong&gt;interface Web&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto-hébergeable&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open Source&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rapide&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;léger&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;sans forcément une base de données de type MySQL ou PostgreSQL. SQLite acceptable,&lt;/li&gt;
&lt;li&gt;écrit, éventuellement, &lt;strong&gt;en Go&lt;/strong&gt; (j&amp;rsquo;envisage d&amp;rsquo;apprendre prochainement le Go).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;ai donc cherché. J&amp;rsquo;ai trouvé quelques outils comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://miniflux.app/&#34;&gt;Miniflux&lt;/a&gt; (en Go),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://freshrss.org/index.html&#34;&gt;FreshRSS&lt;/a&gt; (en PHP),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/LeedRSS/Leed&#34;&gt;LeedRSS&lt;/a&gt; (en PHP),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ncarlier/feedpushr&#34;&gt;feedpushr&lt;/a&gt; (en Go),&lt;/li&gt;
&lt;li&gt;et &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; (en Go).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je l&amp;rsquo;ai déjà annoncé : nous n&amp;rsquo;irons pas plus loin avec cette liste.&lt;/p&gt;
&lt;p&gt;Nul besoin de faire la promotion de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;, je pense qu&amp;rsquo;&lt;a href=&#34;https://lord.re/posts/246-yarr-web-rss-pour-remplacer-ttrss/&#34;&gt;Internet fait déjà de belles suggestions d&amp;rsquo;utilisation de Yarr comme remplaçant de TinyTinyRSS&lt;/a&gt;. Petite histoire marrante : le nom est l&amp;rsquo;&lt;strong&gt;acronyme de Yet Another Rss Reader&lt;/strong&gt;, littéralement « Encore un autre lecteur RSS » ou « L&amp;rsquo;énième lecteur de flux RSS ».&lt;/p&gt;
&lt;p&gt;Une fois cette lecture de blog effectuée, j&amp;rsquo;ai voulu tester &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;. Je me suis donc lancé dans l&amp;rsquo;écriture d&amp;rsquo;un fichier &lt;strong&gt;docker-compose.yml&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;mon-fichier-docker-composeyaml-pour-yarr&#34;&gt;Mon fichier docker-compose.yaml pour Yarr&lt;/h1&gt;
&lt;p&gt;Il aura fallu &lt;strong&gt;moins de 20 minutes&lt;/strong&gt; pour trouver l&amp;rsquo;image Docker de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; sur le &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;dépôt officiel de Yarr sur Github&lt;/a&gt;. Cependant l&amp;rsquo;image étant sur Github Actions - que je connais peu - j&amp;rsquo;ai eu plus de mal à trouver le nom donné à l&amp;rsquo;image pour la récupérer depuis Docker. Je vous le donne de suite : &lt;strong&gt;ghcr.io/nkanaev/yarr:v2.5&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le nom de l&amp;rsquo;image obtenu, il reste à en connaître son usage. Heureusement j&amp;rsquo;ai trouvé un article sur la création d&amp;rsquo;un fichier docker-compose.yaml pour &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; (Cf. &lt;a href=&#34;https://awesome-docker-compose.com/apps/rss/yarr&#34;&gt;https://awesome-docker-compose.com/apps/rss/yarr&lt;/a&gt;) dont je me suis, forcément, grandement inspiré. Et oui je le dis quand j&amp;rsquo;utilise quelque chose qui n&amp;rsquo;est pas de moi &amp;#x1f609; .&lt;/p&gt;
&lt;p&gt;Ainsi j&amp;rsquo;ai pu construire le fichier &lt;strong&gt;docker-compose.yaml&lt;/strong&gt; suivant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;yarr&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ghcr.io/nkanaev/yarr:v2.5&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;yarr&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#40a070&#34;&gt;7070&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ${DATA_DIR:-./data}:/data&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- --addr=0.0.0.0:7070&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- --db=/data/yarr.db&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- --auth=${Y_USER}:${PASSWORD}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- TZ=Europe/Paris&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.${SERVICE}.rule=Host(`$DOMAIN_URL`)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.${SERVICE}.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;où :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DATA_DIR&lt;/strong&gt;, &lt;strong&gt;Y_USER&lt;/strong&gt;, &lt;strong&gt;PASSWORD&lt;/strong&gt;, &lt;strong&gt;SERVICE&lt;/strong&gt; et &lt;strong&gt;DOMAIN_URL&lt;/strong&gt; sont à renseigner dans un fichier &lt;em&gt;.env&lt;/em&gt; (avec une valeur),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DATA_DIR&lt;/strong&gt; est le chemin vers le point de montage où seront stockées les données de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Y_USER&lt;/strong&gt; est le nom d&amp;rsquo;utilisateur que vous souhaitez utiliser comme &lt;em&gt;login&lt;/em&gt; pour s&amp;rsquo;identifier sur votre &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PASSWORD&lt;/strong&gt;… bah le mot de passe pour s&amp;rsquo;identifier au service &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SERVICE&lt;/strong&gt; est un nom (en minuscule, sans espace et sans point) pour le routeur dans Træfik (si vous n&amp;rsquo;utilisez pas Træfik, supprimez la section &amp;ldquo;labels&amp;rdquo; de ce docker-compose.yaml),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOMAIN_URL&lt;/strong&gt; est l&amp;rsquo;adresse web pour accéder au service, mais seulement si vous utilisez Træfik en frontal. Sinon supprimez la section &amp;ldquo;labels&amp;rdquo; de ce fichier docker-compose.yaml.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemple de fichier &lt;em&gt;.env&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;SERVICE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;monService&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;DOMAIN_URL&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;domain.tld&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;DATA_DIR&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/srv/http/yarr_data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Y_USER&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;olivier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;PASSWORD&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;mot2passe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous noterez qu&amp;rsquo;on &lt;strong&gt;autorise&lt;/strong&gt; volontairement &lt;strong&gt;toutes les IP&lt;/strong&gt; pour accéder au service (0.0.0.0). Ce dernier s&amp;rsquo;ouvrira sur le &lt;strong&gt;port 7070&lt;/strong&gt; dans le conteneur, mais Docker choisira un port aléatoire sur ce service (pour éviter de demander un port déjà utilisé). Nous en parlerons ci-après avec la commande &lt;code&gt;docker compose port&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le fichier &lt;em&gt;.env&lt;/em&gt; configuré, on lance et accède rapidement au service (pour tester par exemple) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Lance le service en arrière plan - récupération de la main sur l&amp;#39;invite de commande&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Affiche les conteneurs lancés&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose ps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Affiche l&amp;#39;adresse pour accéder au service en local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose port yarr &lt;span style=&#34;color:#40a070&#34;&gt;7070&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On lance un navigateur, on tape l&amp;rsquo;adresse retournée par la dernière commande (chez moi &lt;strong&gt;0.0.0.0:32768&lt;/strong&gt;) et le lecteur de flux RSS apparaît. C&amp;rsquo;est parti pour une période d&amp;rsquo;essai de plusieurs jours (tests commencés à partir du 25 février 2026).&lt;/p&gt;
&lt;h1 id=&#34;mon-expérience-avec-yarr---on-fait-le-tour&#34;&gt;Mon expérience avec Yarr - on fait le tour !&lt;/h1&gt;
&lt;h2 id=&#34;lauthentification&#34;&gt;L&amp;rsquo;authentification&lt;/h2&gt;
&lt;p&gt;Dans le fichier docker-compose.yml précédent nous avons ajouté l&amp;rsquo;option &lt;code&gt;--auth&lt;/code&gt; afin d&amp;rsquo;activer l&amp;rsquo;authentification de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;. La &lt;strong&gt;première page&lt;/strong&gt; sur laquelle nous tombons est donc celle &lt;strong&gt;pour s&amp;rsquo;identifier&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/yarr_accueil.png&#34; alt=&#34;Formulaire d&amp;rsquo;accueil pour s&amp;rsquo;identifier&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simple&lt;/strong&gt;, efficace.&lt;/p&gt;
&lt;h2 id=&#34;linterface-générale&#34;&gt;L&amp;rsquo;interface générale&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;accueil est plutôt &lt;strong&gt;austère&lt;/strong&gt; - chouette c&amp;rsquo;est &lt;strong&gt;ce que je voulais&lt;/strong&gt; ! - et propose une &lt;strong&gt;disposition en 3 colonnes&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/yarr_3_colonnes.png&#34; alt=&#34;Disposition en 3 colonnes sur la page d&amp;rsquo;accueil de Yarr&#34;&gt;&lt;/p&gt;
&lt;p&gt;Chaque colonne sert un objectif précis, de gauche à droite :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la &lt;strong&gt;liste des flux&lt;/strong&gt; RSS,&lt;/li&gt;
&lt;li&gt;puis la &lt;strong&gt;liste des articles&lt;/strong&gt;/éléments d&amp;rsquo;un flux en particulier,&lt;/li&gt;
&lt;li&gt;puis &lt;strong&gt;l&amp;rsquo;article&lt;/strong&gt; choisi parmi la liste précédente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Donc plus on se dirige à droite, plus la lecture se précise.&lt;/p&gt;
&lt;p&gt;Sur téléphone mobile il n&amp;rsquo;y aura plus qu&amp;rsquo;une seule colonne : celle tout à gauche. On choisira ainsi un flux, ce qui affichera la liste des articles et si on choisit un article, on verra son contenu. Toujours sur une colonne. &lt;strong&gt;Astucieux&lt;/strong&gt;, &lt;strong&gt;logique&lt;/strong&gt; et presque &lt;strong&gt;intuitif&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avoue que sur ce dernier point, sur téléphone mobile, j&amp;rsquo;ai été totalement perdu : je ne savais pas où j&amp;rsquo;étais et ce que je faisais. Ce n&amp;rsquo;est qu&amp;rsquo;en comparant l&amp;rsquo;usage entre un grand écran et un petit écran que j&amp;rsquo;ai saisi ce qu&amp;rsquo;il en était. Sur ce coup-là, je suis le couteau le moins aiguisé du tiroir…&lt;/p&gt;
&lt;h2 id=&#34;la-configuration-de-linterface&#34;&gt;La configuration de l&amp;rsquo;interface&lt;/h2&gt;
&lt;p&gt;Je continue ma découverte avec l&amp;rsquo;&lt;strong&gt;icône représentant 3 petits points&lt;/strong&gt; en haut à droite de la première colonne (ou en haut à droite sur un petit écran ne présentant donc qu&amp;rsquo;une seule colonne). Les options de l&amp;rsquo;outil apparaissent :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/yarr_options.png&#34; alt=&#34;Image contenant le menu d&amp;rsquo;option de configuration de l&amp;rsquo;outil Yarr&#34;&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ici que va se jouer les &lt;strong&gt;seules options disponibles dans &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New Feed&lt;/strong&gt; : Permet d&amp;rsquo;&lt;strong&gt;ajouter un nouveau flux&lt;/strong&gt;. Il faut 2 infos : l&amp;rsquo;adresse URL du flux, et le dossier dans lequel le ranger,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refresh Feeds&lt;/strong&gt; : &lt;strong&gt;Actualisation&lt;/strong&gt; des flux,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme&lt;/strong&gt; : Pour changer l&amp;rsquo;&lt;strong&gt;apparence de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;&lt;/strong&gt;. Nous en parlerons tout à l&amp;rsquo;heure,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto Refresh&lt;/strong&gt; : Permet de choisir le &lt;strong&gt;laps de temps&lt;/strong&gt; entre plusieurs &lt;strong&gt;rafraîchissements automatiques&lt;/strong&gt;. Comprendre : on récupère les flux tous les X temps (de 0mn à 4h),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show first&lt;/strong&gt; : Permet de choisir si on préfère afficher les &lt;strong&gt;articles parus récemment&lt;/strong&gt; en premier (&lt;em&gt;New&lt;/em&gt;) &lt;strong&gt;ou ceux les plus anciens&lt;/strong&gt; en premier (&lt;em&gt;Old&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;Subscriptions :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Import&lt;/strong&gt; : Donne la possibilité d&amp;rsquo;importer une liste de flux (au &lt;strong&gt;format OPML&lt;/strong&gt;),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; : Permet d&amp;rsquo;exporter sa liste de flux (au &lt;strong&gt;format OPML&lt;/strong&gt;) pour la partager par exemple,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shortcuts&lt;/strong&gt; : Affiche un rappel des &lt;strong&gt;raccourcis claviers&lt;/strong&gt; possibles pour naviguer et lire les flux. Et ils sont &lt;strong&gt;très utiles&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log out&lt;/strong&gt; : Apparaîtra seulement si l&amp;rsquo;option &lt;code&gt;--auth&lt;/code&gt; a été utilisée. C&amp;rsquo;est pour &lt;strong&gt;se déconnecter&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;avais peur de tomber sur un lecteur avec des milliers de configurations. Finalement &lt;strong&gt;&lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; va à l&amp;rsquo;essentiel&lt;/strong&gt;. Cela me plaît - encore une fois.&lt;/p&gt;
&lt;h2 id=&#34;choix-dun-thème&#34;&gt;Choix d&amp;rsquo;un thème&lt;/h2&gt;
&lt;p&gt;Vous aurez remarqué que &lt;strong&gt;mes impressions écrans&lt;/strong&gt; présentent les pages d&amp;rsquo;une &lt;strong&gt;couleur simili jaune&lt;/strong&gt; (qui fait penser à &lt;a href=&#34;https://ethanschoonover.com/solarized/&#34;&gt;Solarized Light d&amp;rsquo;Ethan Shoonover&lt;/a&gt;). C&amp;rsquo;est parce que j&amp;rsquo;ai choisi un thème. On peut &lt;strong&gt;choisir entre 3 thèmes&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;blanc&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jaune&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;noir&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je suis content du thème jaune car ma vue pose problème avec les thèmes noirs (l&amp;rsquo;astigmathie a une forme d&amp;rsquo;opposition rebelle au &amp;ldquo;dark theme&amp;rdquo; et peut rendre les textes &amp;ldquo;flous&amp;rdquo;). Certes, la &lt;a href=&#34;https://www.nngroup.com/articles/dark-mode/&#34;&gt;performance de lecture est plus importante en mode &amp;ldquo;light&amp;rdquo;&lt;/a&gt;, mais ça reste trop lumineux pour moi. Je n&amp;rsquo;aime pas le jaune en tant que tel, mais pour mon efficacité de lecture c&amp;rsquo;est le &amp;ldquo;moins pire&amp;rdquo; &amp;#x1f923; . Évidemment les tendances s&amp;rsquo;inversent la nuit (mais pas pour moi), dans la pénombre et/ou dans un environnement peu lumineux. Mais nous ne sommes pas ici pour lancer le troll « Dark Mode vs. Light Mode », ou bien ? Combat !&lt;/p&gt;
&lt;h2 id=&#34;les-trois-icônes-principales&#34;&gt;Les trois icônes principales&lt;/h2&gt;
&lt;p&gt;Vous avez découvert l&amp;rsquo;usage en 3 colonnes, cette fois nous allons découvrir l&amp;rsquo;usage des 3 icônes tout en haut qui sont, en quelque sorte, le menu principal de &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un rond rempli de noir,&lt;/li&gt;
&lt;li&gt;une étoile,&lt;/li&gt;
&lt;li&gt;3 traits horizontaux parallèles de longueurs différentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La première (le &lt;strong&gt;rond noir&lt;/strong&gt;) permet d&amp;rsquo;&lt;strong&gt;afficher la liste des flux&lt;/strong&gt; sur lesquels nous avons encore des articles/éléments à lire.&lt;/p&gt;
&lt;p&gt;La seconde (&lt;strong&gt;étoile noire&lt;/strong&gt;) affiche une liste des flux sur lequels vous avez marqués des articles/éléments comme &lt;strong&gt;favoris&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Et la dernière (les &lt;strong&gt;3 traits horizontaux&lt;/strong&gt;) affiche la &lt;strong&gt;liste complète des flux&lt;/strong&gt;, qu&amp;rsquo;importe qu&amp;rsquo;il vous reste ou non des articles/éléments à lire.&lt;/p&gt;
&lt;p&gt;Exemple d&amp;rsquo;affichage en 3 colonnes sur le rond noir avec le choix d&amp;rsquo;un article et son affichage :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/yarr_exemple.png&#34; alt=&#34;Affichage en 3 colonnes de Yarr avec le choix du flux MiniMachines.net, d&amp;rsquo;un article précis et de son affichage dans la dernière colonne&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simple, basique, sans fioritures&lt;/strong&gt;. Utilisable &lt;strong&gt;avec des raccourcis&lt;/strong&gt; clavier. &lt;strong&gt;Parfait&lt;/strong&gt; !&lt;/p&gt;
&lt;h2 id=&#34;les-derniers-petits-détails---et-après-jarrête-promis&#34;&gt;Les derniers petits détails - et après j&amp;rsquo;arrête promis !&lt;/h2&gt;
&lt;p&gt;Dernière liste d&amp;rsquo;icônes dans l&amp;rsquo;interface :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deuxième colonne :
&lt;ul&gt;
&lt;li&gt;icône de &lt;strong&gt;loupe&lt;/strong&gt; : Fait une &lt;strong&gt;recherche dans la liste d&amp;rsquo;article&lt;/strong&gt; de &lt;strong&gt;CE&lt;/strong&gt; flux choisi,&lt;/li&gt;
&lt;li&gt;icône de &lt;strong&gt;validation&lt;/strong&gt; : &lt;strong&gt;Marque tous les articles&lt;/strong&gt; de ce flux &lt;strong&gt;comme lus&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;icône de &lt;strong&gt;3 petits points&lt;/strong&gt; l&amp;rsquo;un à côté de l&amp;rsquo;autre verticalement : c&amp;rsquo;est ici qu&amp;rsquo;on a les &lt;strong&gt;détails du flux&lt;/strong&gt;. On peut le renommer, le changer de place, le supprimer, aller sur le site Web, etc.,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;troisième colonne :
&lt;ul&gt;
&lt;li&gt;icône d&amp;rsquo;&lt;strong&gt;étoile&lt;/strong&gt; (vide/remplie) : Marque l&amp;rsquo;article en &lt;strong&gt;favori&lt;/strong&gt; ou au contraire l&amp;rsquo;enlève des favoris,&lt;/li&gt;
&lt;li&gt;icône d&amp;rsquo;un &lt;strong&gt;rond&lt;/strong&gt; (vide/rempli) : Marque l&amp;rsquo;article comme &lt;strong&gt;lu ou non-lu&lt;/strong&gt; (suivant de quel état on commence),&lt;/li&gt;
&lt;li&gt;icône de &lt;strong&gt;traits verticaux entrecoupés comme de petits pistons&lt;/strong&gt; : Permet de &lt;strong&gt;changer la police&lt;/strong&gt; d&amp;rsquo;écriture (parmi sans-serif, serif et monospace) ainsi que &lt;strong&gt;la taille de police&lt;/strong&gt; (petit, ou grand, plus on appuie plus ça réduit/aggrandit),&lt;/li&gt;
&lt;li&gt;icône d&amp;rsquo;un &lt;strong&gt;livre ouvert&lt;/strong&gt; : Choisi de &lt;strong&gt;lire l&amp;rsquo;article dans &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;&lt;/strong&gt; ou bien seulement les informations du flux RSS,&lt;/li&gt;
&lt;li&gt;icône d&amp;rsquo;un &lt;strong&gt;carré avec une flèche qui en sort&lt;/strong&gt;) : Va &lt;strong&gt;directement sur le site Web de l&amp;rsquo;article&lt;/strong&gt; en question.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/yarr_flux_options.png&#34; alt=&#34;Détail des options disponible pour un flux donné dans la seconde colonne sur l&amp;rsquo;icône avec les 3 petits points&#34;&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;utilise souvent l&amp;rsquo;icône de validation de la seconde colonne pour marquer tous les articles comme lus une fois que j&amp;rsquo;ai parcouru la liste des titres et que rien ne m&amp;rsquo;intéressait.&lt;/p&gt;
&lt;p&gt;Les raccourcis claviers sont là pour faciliter le traitement des articles (lu, non-lu, favori, lire à l&amp;rsquo;extérieur, etc.). Parfois j&amp;rsquo;utilise le raccourci &amp;ldquo;o&amp;rdquo; pour lire l&amp;rsquo;article sur le site Web.&lt;/p&gt;
&lt;p&gt;Du reste, je n&amp;rsquo;utilise quasiment rien. Après tout je ne viens que pour lire des titres, trier et lire un article de temps en temps &amp;#x1f937; . Je ne suis pas là pour bosser.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Au début &lt;strong&gt;un peu perdu par l&amp;rsquo;interface&lt;/strong&gt; afin de &lt;strong&gt;comprendre à quoi sert chaque élément&lt;/strong&gt; - surtout entre interface petit écran et grand écran - j&amp;rsquo;ai finalement &lt;strong&gt;apprécié &lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt; à l&amp;rsquo;usage&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est un outil &amp;ldquo;menu&amp;rdquo; (maigre, &lt;strong&gt;léger&lt;/strong&gt;), simple, &lt;strong&gt;basique, sans fioritures&lt;/strong&gt;. &lt;strong&gt;Configurable&lt;/strong&gt; un minimum. Utilisable avec des &lt;strong&gt;raccourcis clavier&lt;/strong&gt;. Très efficace d&amp;rsquo;ailleurs avec un clavier quand on s&amp;rsquo;y fait. C&amp;rsquo;est même redoutable de rapidité quand on a le coup de main !&lt;/p&gt;
&lt;p&gt;À vrai dire, je ne sais même pas de quoi j&amp;rsquo;aurais besoin en plus pour lire des flux. J&amp;rsquo;ajoute rapidement des flux, j&amp;rsquo;&lt;strong&gt;importe et exporte facilement&lt;/strong&gt; pour partager avec d&amp;rsquo;autres, je vois de nouveaux articles, je clique sur ce qui m&amp;rsquo;intéresse, je lis, je note le reste des articles comme lus pour ce flux et voilà.&lt;/p&gt;
&lt;p&gt;Ni plus. Ni moins. &lt;strong&gt;Parfait&lt;/strong&gt; &amp;#x1f604; .&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Voici les liens de l&amp;rsquo;article par ordre d&amp;rsquo;apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://tt-rss.org/&#34;&gt;TinyTinyRSS, un lecteur de flux RSS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/2009/09/nouvelles-astuces-sur-rxvt-unicode-et-tinytinyrss/&#34;&gt;Mon article pour signaler la venue de deux nouveaux tutoriels (dont TinyTinyRSS) dans mon Recueil d&amp;rsquo;astuces&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nkanaev/yarr&#34;&gt;Yarr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://miniflux.app/&#34;&gt;Miniflux&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://freshrss.org/index.html&#34;&gt;FreshRSS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/LeedRSS/Leed&#34;&gt;LeedRSS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ncarlier/feedpushr&#34;&gt;feedpushr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://lord.re/posts/246-yarr-web-rss-pour-remplacer-ttrss/&#34;&gt;Bel article sur  l&amp;rsquo;utilisation de Yarr comme remplaçant de TinyTinyRSS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://awesome-docker-compose.com/apps/rss/yarr&#34;&gt;Exemple de docker-compose pour Yarr&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ethanschoonover.com/solarized/&#34;&gt;Solarized Light d&amp;rsquo;Ethan Shoonover&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nngroup.com/articles/dark-mode/&#34;&gt;La performance de lecture suivant le thème light/dark et nos yeux&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>RustFS, alternative au service de stockage objet MinIO</title>
      <link>https://olivier.dossmann.net/2026/02/rustfs-alternative-au-service-de-stockage-objet-minio/</link>
      <pubDate>Sun, 15 Feb 2026 17:27:26 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2026/02/rustfs-alternative-au-service-de-stockage-objet-minio/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://olivier.dossmann.net/2025/11/mon-labo-k8s-pour-essayer-des-applications/&#34;&gt;Quand on étudie &lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/a&gt;, on arrive tôt ou tard sur la question de la &lt;strong&gt;gestion des sauvegardes&lt;/strong&gt;. Et avec elles le &lt;strong&gt;sujet du stockage&lt;/strong&gt; de ces dernières. La référence en matière de sauvegarde - dont je parlerais sûrement dans un prochain article - est &lt;a href=&#34;https://velero.io/&#34;&gt;Velero&lt;/a&gt;. Cet outil supporte plusieurs fournisseurs de stockage pour ses opérations de sauvegarde comme Amazon Web Services, Google Cloud, Microsoft Azure ou VMware Sphere. Principalement des fournisseurs liés à une entreprise. Que faire dans la situation où nous souhaitons &lt;strong&gt;auto-héberger une solution de stockage&lt;/strong&gt; chez soi ?&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ce dont je voudrais parler aujourd&amp;rsquo;hui : une solution spécifique que j&amp;rsquo;ai - presque - choisie. Surtout &lt;strong&gt;pourquoi cette solution&lt;/strong&gt; ? Je décrirais son &lt;strong&gt;installation sous Docker Compose&lt;/strong&gt; derrière un proxy nommé &lt;a href=&#34;https://olivier.dossmann.net/2022/12/utilisation-de-tr%C3%A6fik-pour-publier-ses-conteneurs-docker/&#34;&gt;Traefik, dont je vous ai déjà parlé&lt;/a&gt;. Et j&amp;rsquo;ajouterais quelques mots sur les ports réseau à ouvrir, l&amp;rsquo;&lt;strong&gt;initialisation des premiers « buckets »&lt;/strong&gt; (nous y reviendrons) et l&amp;rsquo;usage de noms de domaines.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logos/rustfs.png&#34; alt=&#34;Logo du projet RustFS, simple écriture du mot RustFS en bleu&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;pourquoi-cette-solution&#34;&gt;Pourquoi cette solution ?&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Si vous n&amp;rsquo;êtes pas fan de l&amp;rsquo;histoire&lt;/strong&gt; de « pourquoi choisir cette solution », &lt;strong&gt;vous pouvez passer au chapitre suivant&lt;/strong&gt;, je ne vous en voudrais pas &amp;#x1f609;.&lt;/p&gt;
&lt;p&gt;En étudiant &lt;a href=&#34;https://velero.io/docs/&#34;&gt;la documentation de Velero&lt;/a&gt; on découvre parmi les &lt;strong&gt;fournisseurs de solutions de stockage&lt;/strong&gt; le célèbre Amazon Web Services. Et avec lui le service &lt;strong&gt;Amazon S3&lt;/strong&gt;. Ce service est une &lt;strong&gt;solution de &lt;a href=&#34;https://fr.wikipedia.org/wiki/Stockage_objet&#34;&gt;stockage objet&lt;/a&gt;&lt;/strong&gt; qui a développé un &lt;strong&gt;protocole ouvert&lt;/strong&gt; du même nom : &lt;a href=&#34;https://fr.wikipedia.org/wiki/Amazon_S3&#34;&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/a&gt;. Grâce à cela, de nombreux outils compatibles avec ce protocole ont vu le jour ; que ce soit des clients comme des serveurs. Top, c&amp;rsquo;est ce que je recherche !&lt;/p&gt;
&lt;p&gt;Ayant beaucoup entendu parler de &lt;strong&gt;MinIO&lt;/strong&gt;, je m&amp;rsquo;enquiers de l&amp;rsquo;installer fin novembre 2025. En Docker Compose, &lt;a href=&#34;https://olivier.dossmann.net/2022/12/utilisation-de-tr%C3%A6fik-pour-publier-ses-conteneurs-docker/&#34;&gt;derrière Traefik comme je l&amp;rsquo;explique dans un précédent article sur le sujet&lt;/a&gt;. Mais &lt;strong&gt;quelques problèmes se posent&lt;/strong&gt; successivement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;en août 2025 les dépôts de Bitnami, qui fournissaient jusqu&amp;rsquo;alors d&amp;rsquo;excellentes images, chartes Helm et outils en tous genres sont chamboulés par &lt;a href=&#34;https://github.com/bitnami/charts/issues/35164&#34;&gt;une &lt;strong&gt;décision drastique prise par Bitnami&lt;/strong&gt;&lt;/a&gt;. L&amp;rsquo;impact est énorme sur la communauté,&lt;/li&gt;
&lt;li&gt;faute de cette image pratique, je me tourne vers l&amp;rsquo;image officielle qui demande des &lt;strong&gt;ajustements pour avoir des « buckets » à l&amp;rsquo;initialisation&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;finalement &lt;strong&gt;le 13 février 2026, l&amp;rsquo;entreprise qui gérait MinIO décide d&amp;rsquo;abandonner la maintenance&lt;/strong&gt; de la version communautaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Coup dur. Je recherche des alternatives. Je tombe sur le &lt;a href=&#34;https://github.com/rustfs/rustfs/issues/555#issuecomment-3620454213&#34;&gt;message de loverustfs qui compare les &lt;strong&gt;solutions alternatives&lt;/strong&gt; à RustFS, dont MinIO, Garage, Ceph, Seaweeedfs, etc.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit (24 fév. 2026)&lt;/strong&gt; : Un &lt;a href=&#34;https://github.com/pgsty/minio&#34;&gt;fork de MinIO&lt;/a&gt; est apparu il y a quelques jours. Si le cœur vous en dit &amp;#x1f937;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs&#34;&gt;&lt;strong&gt;RustFS&lt;/strong&gt;&lt;/a&gt; n&amp;rsquo;est probablement pas la solution la plus performante (Seaweedfs semble plus performant), mais il se défend bien. Et il semble &lt;strong&gt;proche de MinIO&lt;/strong&gt; en terme d&amp;rsquo;interface et d&amp;rsquo;utilisation. Allons donc, ne le faisons pas attendre, installons-le !&lt;/p&gt;
&lt;h1 id=&#34;rustfs-sous-docker-compose&#34;&gt;RustFS sous Docker Compose&lt;/h1&gt;
&lt;p&gt;L&amp;rsquo;idée est d&amp;rsquo;installer/utiliser &lt;strong&gt;RustFS avec Docker Compose&lt;/strong&gt;. Derrière &lt;strong&gt;Træfik&lt;/strong&gt;. Avec des domaines.&lt;/p&gt;
&lt;h2 id=&#34;installation-minimale&#34;&gt;Installation minimale&lt;/h2&gt;
&lt;p&gt;On commence par une installation de base. On a besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une &lt;strong&gt;image Docker&lt;/strong&gt;. Ça tombe bien, il y a des &lt;a href=&#34;https://hub.docker.com/r/rustfs/rustfs&#34;&gt;images officielles de RustFS sur le Hub Docker&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;ouvrir &lt;strong&gt;2 ports&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;9000&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;9001&lt;/strong&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;un volume local&lt;/strong&gt; pour stocker les données et pouvoir les réutiliser entre 2 redémarrages de conteneurs,&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;identifiant&lt;/strong&gt; et un &lt;strong&gt;mot de passe&lt;/strong&gt; initial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; : le projet &lt;strong&gt;RustFS est encore jeune&lt;/strong&gt;, il est en développement actif et les versions ne sont pas toutes utilisables telles quelles. Par exemple dans ma situation, la &lt;em&gt;version 1.0.0-alpha.83&lt;/em&gt; était inutilisable. Ceci dû à un &lt;a href=&#34;https://github.com/rustfs/rustfs/issues/1838&#34;&gt;bug sur l&amp;rsquo;architecture de ma machine comme le montre ce ticket Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une première ébauche d&amp;rsquo;un fichier docker-compose.yaml pourrait s&amp;rsquo;écrire de la manière suivante :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;rustfs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rustfs/rustfs:1.0.0-alpha.82&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#40a070&#34;&gt;9000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#40a070&#34;&gt;9001&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ./storage_data:/data&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- /etc/localtime:/etc/localtime:ro&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- /etc/timezone:/etc/timezone:ro&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_VOLUMES=/data&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_ADDRESS=0.0.0.0:9000&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_CONSOLE_ENABLE=true&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_ACCESS_KEY=olivier&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_SECRET_KEY=mot2passe&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_OBS_LOGGER_LEVEL=info&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;healthcheck&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;test&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;[&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;curl -f http://127.0.0.1:9000/health &amp;amp;&amp;amp; curl -f http://127.0.0.1:9001/rustfs/console/health&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;interval&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;30s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;timeout&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;10s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;retries&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;start_period&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;40s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Veillez à changer les éléments suivants - au minimum :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./storage_data&lt;/code&gt; dans la section &lt;em&gt;volumes&lt;/em&gt;. Renseigner par un &lt;strong&gt;dossier&lt;/strong&gt; dans lequel vous voulez &lt;strong&gt;stocker les données&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUSTFS_ACCESS_KEY&lt;/code&gt; dans la section &lt;em&gt;environment&lt;/em&gt;. Changez &lt;em&gt;olivier&lt;/em&gt; par un &lt;strong&gt;identifiant&lt;/strong&gt; que vous souhaitez utiliser,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUSTFS_SECRET_KEY&lt;/code&gt; dans la section &lt;em&gt;environment&lt;/em&gt;. Changez la valeur &lt;em&gt;mot2passe&lt;/em&gt; par quelque chose de bien plus long et bien plus compliqué que cela (une &lt;strong&gt;clé secrète&lt;/strong&gt; en somme).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De cette façon, le service va se lancer avec des ports choisis par Docker Compose. Vous pouvez les connaître en tapant les commandes suivantes :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose port rustfs &lt;span style=&#34;color:#40a070&#34;&gt;9000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose port rustfs &lt;span style=&#34;color:#40a070&#34;&gt;9001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On constate sur l&amp;rsquo;interface (port initial 9001), après s&amp;rsquo;être authentifié avec l&amp;rsquo;identifiant et la clé secrète, qu&amp;rsquo;il n&amp;rsquo;y aucun bucket.&lt;/p&gt;
&lt;h2 id=&#34;initialisation-des-buckets&#34;&gt;Initialisation des buckets&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Qu&amp;rsquo;est un bucket ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est un &lt;strong&gt;espace qui regroupe plusieurs objets&lt;/strong&gt; qu&amp;rsquo;on aurait déposé à cet endroit. Cela permet de se repérer plus facilement dans un espace de stockage objet.&lt;/p&gt;
&lt;p&gt;Afin de créer un bucket, soit on utilise l&amp;rsquo;interface (méthode manuelle), soit on créé un conteneur d&amp;rsquo;initialisation qui fera le job à notre place (automatique).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;opte pour le &lt;strong&gt;conteneur d&amp;rsquo;initialisation&lt;/strong&gt; pour créer 3 buckets. Dans notre fichier docker-compose.yaml on ajoute les lignes suivantes :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;init_buckets&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;minio/mc:RELEASE.2025-08-13T08-35-41Z&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;depends_on&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- rustfs&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;on&lt;/span&gt;-failure&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;entrypoint&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /bin/sh -c &amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      sleep 5;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc alias set s3server http://rustfs:9000 \&amp;#34;olivier\&amp;#34; \&amp;#34;mot2passe\&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/default;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/bucket1;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/bucket2;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      exit 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pensez à changer olivier et mot2passe&lt;/strong&gt; par les mêmes identifiants/mot de passe que renseignés dans le service &lt;code&gt;rustfs&lt;/code&gt; du docker-compose.yaml précédent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;astuce est donc d&amp;rsquo;utiliser le client &lt;code&gt;mc&lt;/code&gt; de MinIO pour ajouter les buckets qu&amp;rsquo;on souhaiterait. Dans l&amp;rsquo;exemple présenté ci-avant, le conteneur d&amp;rsquo;initialisation permet de créer 3 buckets :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;default&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bucket1&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bucket2&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Libre à vous d&amp;rsquo;adapter ce conteneur pour répondre à vos besoins en matière de création initiale de bucket.&lt;/p&gt;
&lt;p&gt;Il ne reste alors plus que la mise à disposition sur Internet via l&amp;rsquo;usage de sous-domaines et de Træfik.&lt;/p&gt;
&lt;h2 id=&#34;configurer-les-labels-pour-træfik&#34;&gt;Configurer les labels pour Træfik&lt;/h2&gt;
&lt;p&gt;Træfik est un proxy souvent utilisé avec Docker Compose pour se charger des routes. L&amp;rsquo;idée de Træfik est d&amp;rsquo;&lt;strong&gt;utiliser le champ &lt;code&gt;labels&lt;/code&gt;&lt;/strong&gt; pour récupérer des instructions utiles à la &lt;strong&gt;création des routes en lien avec les domaines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour RustFS sous Docker Compose, et avec Træfik en frontal, je suggère les labels suivants :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.rule=Host(`api.mondomaine.tld`)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.service=api-rustfs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.services.api-rustfs.loadbalancer.server.port=9000&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.rule=Host(`mondomaine.tld`)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.service=rustfs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.services.rustfs.loadbalancer.server.port=9001&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Prenez soin de changer les éléments suivants&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;websecure&lt;/code&gt; par le &lt;strong&gt;nom de votre routeur&lt;/strong&gt; permettant d&amp;rsquo;avoir du HTTPS,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api.mondomaine.tld&lt;/code&gt; par le &lt;strong&gt;domaine de votre choix&lt;/strong&gt; pour accéder à l&amp;rsquo;API de RustFS,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mondomaine.tld&lt;/code&gt; par le &lt;strong&gt;domaine utilisé&lt;/strong&gt; pour accéder à l&amp;rsquo;&lt;strong&gt;interface Web&lt;/strong&gt; de RustFS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Évidemment tout un tas d&amp;rsquo;autres options sont possibles, il suffit de lire la documentation de Træfik pour cela.&lt;/p&gt;
&lt;h2 id=&#34;résultat-final-complet&#34;&gt;Résultat final complet&lt;/h2&gt;
&lt;p&gt;Ce qui nous donne :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;rustfs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rustfs/rustfs:1.0.0-alpha.82&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#40a070&#34;&gt;9000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#40a070&#34;&gt;9001&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ./storage_data:/data&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- /etc/localtime:/etc/localtime:ro&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- /etc/timezone:/etc/timezone:ro&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_VOLUMES=/data&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_ADDRESS=0.0.0.0:9000&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_CONSOLE_ENABLE=true&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_ACCESS_KEY=olivier&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_SECRET_KEY=mot2passe&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- RUSTFS_OBS_LOGGER_LEVEL=info&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;healthcheck&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;test&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;[&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;curl -f http://127.0.0.1:9000/health &amp;amp;&amp;amp; curl -f http://127.0.0.1:9001/rustfs/console/health&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;interval&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;30s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;timeout&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;10s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;retries&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;start_period&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;40s&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.rule=Host(`api.mondomaine.tld`)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.api-rustfs.service=api-rustfs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.services.api-rustfs.loadbalancer.server.port=9000&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.rule=Host(`mondomaine.tld`)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.routers.rustfs.service=rustfs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;traefik.http.services.rustfs.loadbalancer.server.port=9001&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;init_buckets&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;minio/mc:RELEASE.2025-08-13T08-35-41Z&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;depends_on&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- rustfs&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;on&lt;/span&gt;-failure&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;entrypoint&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /bin/sh -c &amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      sleep 5;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc alias set s3server http://rustfs:9000 \&amp;#34;olivier\&amp;#34; \&amp;#34;mot2passe\&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/default;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/bucket1;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      /usr/bin/mc mb s3server/bucket2;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      exit 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;      &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Avec ce contenu vous devriez pouvoir &lt;strong&gt;démarrer une instance RustFS&lt;/strong&gt; sans problème &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;quelle-aventure&#34;&gt;Quelle aventure !&lt;/h1&gt;
&lt;p&gt;Au bout du compte, avoir cherché à lancer un service de stockage objet a été une &lt;strong&gt;sacrée odyssée pour moi&lt;/strong&gt;. Beaucoup d&amp;rsquo;aléas liés au &lt;strong&gt;changement de politique de Bitnami&lt;/strong&gt; (pour les images MinIO), à l&amp;rsquo;&lt;strong&gt;arrêt de maintenance du code du serveur MinIO&lt;/strong&gt; par AIStor et aux &lt;strong&gt;effets de bord de RustFS&lt;/strong&gt; en plein développement.&lt;/p&gt;
&lt;p&gt;Mes besoins spécifiques en terme d&amp;rsquo;infrastructure (Docker Compose et Træfik) m&amp;rsquo;ont amené à devoir retravailler plusieurs fois le fichier docker-compose.yaml. Et j&amp;rsquo;ai essuyé quelques plâtres avant d&amp;rsquo;avoir une instance fonctionnelle.&lt;/p&gt;
&lt;p&gt;Je suis ainsi &lt;strong&gt;content de partager ce fichier docker-compose.yaml&lt;/strong&gt;. Bien qu&amp;rsquo;il y a matière à faire évoluer ce fichier. On peut imaginer &lt;strong&gt;améliorer ce fichier&lt;/strong&gt; en utilisant des &lt;strong&gt;variables&lt;/strong&gt; pour le dossier où seront stockées les données, le nom du service, le domaine et bien évidemment l&amp;rsquo;identifiant et le mot de passe du service RustFS. Et déposer les valeurs dans &lt;strong&gt;un fichier .env&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On pourrait également trouver un autre client que &lt;code&gt;mc&lt;/code&gt; pour &lt;strong&gt;initialiser les buckets&lt;/strong&gt; au départ. Voire trouver un autre outil permettant de créer les buckets plus facilement. Imaginons une nouvelle image Docker ayant un script d&amp;rsquo;initialisation avec des variables d&amp;rsquo;environnement le permettant.&lt;/p&gt;
&lt;p&gt;Je laisse votre imagination faire le reste &amp;#x1f60a;.&lt;/p&gt;
&lt;h1 id=&#34;sources-utilisées-pour-la-mise-en-place-de-rustfs&#34;&gt;Sources utilisées pour la mise en place de RustFS&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs/issues/555&#34;&gt;Benchmarks de plusieurs solutions alternatives à Minio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.rustfs.com/concepts/comparison.html&#34;&gt;Comparaison à Ceph et MinIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.rustfs.com/management/bucket/creation.html&#34;&gt;Documentation sur la création de buckets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs/blob/main/docker-compose.yml&#34;&gt;Fichier docker-compose.yml d&amp;rsquo;exemple sur le dépôt Github du projet RustFS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.rustfs.com/developer/mc.html&#34;&gt;Documentation sur l&amp;rsquo;utilisation du client MinIO Client (mc) pour RustFS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://belginux.com/installer-rustfs-avec-docker/&#34;&gt;Tutoriel d&amp;rsquo;installation de RustFS avec Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs/issues/1838&#34;&gt;Bug RustFS (ticket Github) version 1.0.0-alpha.83 sur l&amp;rsquo;architecture de ma machine&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/bitnami/charts/issues/35164&#34;&gt;Décision drastique prise par Bitnami&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs&#34;&gt;Dépôt Github de RustFS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pgsty/minio&#34;&gt;Fork de MinIO&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hub.docker.com/r/rustfs/rustfs&#34;&gt;Images docker officielles de RustFS sur le Hub Docker&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Stockage_objet&#34;&gt;Le stockage objet selon Wikipédia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Amazon_S3&#34;&gt;S3 selon Wikipédia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://velero.io/docs/&#34;&gt;Velero (documentation)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://velero.io/&#34;&gt;Velero&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Mon Labo K8S pour essayer des applications</title>
      <link>https://olivier.dossmann.net/2025/11/mon-labo-k8s-pour-essayer-des-applications/</link>
      <pubDate>Sun, 09 Nov 2025 06:25:39 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2025/11/mon-labo-k8s-pour-essayer-des-applications/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Quand on commence à étudier Kubernetes (k8s), on a &lt;strong&gt;besoin d&amp;rsquo;un environnement où tester&lt;/strong&gt; ce qu&amp;rsquo;on apprend. Les environnements possibles sont nombreux : &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/&#34;&gt;Minikube&lt;/a&gt;, &lt;a href=&#34;https://kubernetes.io/fr/&#34;&gt;Kubernetes (k8s) officiel&lt;/a&gt;, &lt;a href=&#34;https://k0sproject.io/&#34;&gt;k0s&lt;/a&gt;, &lt;a href=&#34;https://k3s.io/&#34;&gt;k3s&lt;/a&gt;, etc. Cela ne s&amp;rsquo;arrête plus !&lt;/p&gt;
&lt;p&gt;Entre les &lt;strong&gt;difficultés à installer l&amp;rsquo;environnement&lt;/strong&gt; et celles à appliquer ce qu&amp;rsquo;on apprend, on ne s&amp;rsquo;en sort plus. Cela devient &lt;strong&gt;vite compliqué&lt;/strong&gt; au point de vouloir tout arrêter ; c&amp;rsquo;était mon cas.&lt;/p&gt;
&lt;p&gt;De plus je souhaitais avoir un environnement reproductible et spécifique à chacun de mes projets, de quoi travailler unitairement sur un service particulier.&lt;/p&gt;
&lt;p&gt;Avant de décrocher complètement, j&amp;rsquo;ai fait une pause, &lt;strong&gt;pris du recul&lt;/strong&gt; et étudié la question. Je vous relate ici le résultat de cette petite aventure dans le monde de Kubernetes et des outils envisagés pour &lt;strong&gt;créer un labo de développement&lt;/strong&gt; d&amp;rsquo;applications tournant sous Kubernetes.&lt;/p&gt;
&lt;p&gt;Dans un premier temps nous poserons le problème, après quoi nous étudierons quelques solutions pour finalement détailler le produit de cette pérégrination.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/tubes_a_essai.jpg&#34; alt=&#34;Quelques tubes à essais avec une pipette vus de près&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur &lt;a href=&#34;https://www.publicdomainpictures.net/fr/view-image.php?image=45299&amp;amp;picture=tubes-a-essai&#34;&gt;publicdomainpictures.net&lt;/a&gt;&lt;/em&gt; sous Licence CC0 Public Domain.&lt;/p&gt;
&lt;h1 id=&#34;le-contexte&#34;&gt;Le contexte&lt;/h1&gt;
&lt;p&gt;Venant du &lt;a href=&#34;https://olivier.dossmann.net/tags/docker/&#34;&gt;monde de Docker et Docker Compose&lt;/a&gt;, il me semblait aller de soi d&amp;rsquo;étudier ensuite le monde de Kubernetes - qui utilise la conteneurisation. Seulement je ne pensais pas que l&amp;rsquo;installation même de &lt;strong&gt;Kubernetes était un cap à franchir&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Je souhaite en &lt;strong&gt;profiter pour migrer&lt;/strong&gt; petit à petit &lt;strong&gt;mes services sur Kubernetes&lt;/strong&gt;. Chacun d&amp;rsquo;eux devient donc un projet en soi. Et comme souvent, &lt;strong&gt;j&amp;rsquo;aime avoir un environnement spécifique de développement&lt;/strong&gt; pour créer les fichiers nécessaires à Kubernetes et permettre a posteriori d&amp;rsquo;améliorer le service. Je cherche donc à avoir un simili de docker-compose.yml pour chaque service et permettant de développer l&amp;rsquo;application dans un environnement Kubernetes propre.&lt;/p&gt;
&lt;p&gt;Au début on découvre &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/&#34;&gt;&lt;strong&gt;Minikube&lt;/strong&gt;&lt;/a&gt;. Du moins c&amp;rsquo;est un outil très souvent conseillé. &lt;strong&gt;Pratique&lt;/strong&gt; sur une machine bureautique pour triturer rapidement quelques fichiers Kubernetes (des fichiers au format YAML). Il est &lt;strong&gt;bien documenté&lt;/strong&gt; et possède plusieurs plugins pour faciliter l&amp;rsquo;étude du Kubernetes en place ; par exemple un &lt;strong&gt;plugin Dashboard&lt;/strong&gt; permet de visualiser les métriques du serveur et les objets instanciés. J&amp;rsquo;ai la sensation que cet outil reste « trop spécifique ». Il ne représente pas totalement un « vrai » Kubernetes. Ça peut parfois causer des torts au moment de déployer sur un autre serveur Kubernetes. L&amp;rsquo;outil est également &lt;strong&gt;lourd&lt;/strong&gt; et relativement &lt;strong&gt;lent&lt;/strong&gt; pour instancier un nouvel environnement.&lt;/p&gt;
&lt;p&gt;Pourquoi ne pas tester un Kubernetes connu pour sa légèreté ? Par exemple &lt;a href=&#34;https://k3s.io/&#34;&gt;&lt;strong&gt;k3s&lt;/strong&gt;&lt;/a&gt;. D&amp;rsquo;autant qu&amp;rsquo;il s&amp;rsquo;installe rapidement à l&amp;rsquo;aide de &lt;a href=&#34;https://github.com/alexellis/k3sup&#34;&gt;&lt;strong&gt;k3sup&lt;/strong&gt;&lt;/a&gt; (qui fonctionne à merveille). Sur le papier c&amp;rsquo;est une bonne idée : &lt;strong&gt;léger, facile à installer&lt;/strong&gt;. En revanche il &lt;strong&gt;ne permet pas d&amp;rsquo;instancier un nouvel environnement&lt;/strong&gt; ; il faut donc jouer avec les namespaces Kubernetes. Rebelote : ce n&amp;rsquo;est pas un outil adapté à l&amp;rsquo;apprentissage de Kubernetes. Au départ on fait forcément des erreurs dues à l&amp;rsquo;incompréhension ou l&amp;rsquo;ignorance ; ce qui peut rendre l&amp;rsquo;environnement rapidement inutilisable.&lt;/p&gt;
&lt;p&gt;Après ces deux premières tentatives, je sais désormais ce que je veux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;possibilité de &lt;strong&gt;créer un environnement « propre »&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;encore mieux s&amp;rsquo;il peut créer &lt;strong&gt;plusieurs environnements&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;si possible &lt;strong&gt;léger&lt;/strong&gt; (petit) - ce qui exclue les machines virtuelles,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;facile à installer&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;et &lt;strong&gt;rapide&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous avons nos critères, il ne reste plus qu&amp;rsquo;à chercher le(s) outil(s) permettant de créer rapidement un environnement de développement autour de Kubernetes.&lt;/p&gt;
&lt;h1 id=&#34;solutions-étudiées&#34;&gt;Solutions étudiées&lt;/h1&gt;
&lt;p&gt;À la recherche des mots clés « lightweight » (similaire au mot léger) et « kubernetes » dans un moteur de recherche, on trouve plusieurs outils comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://microk8s.io/&#34;&gt;MicroK8S&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k0sproject.io/&#34;&gt;k0s&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k3s.io/&#34;&gt;k3s&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;et &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;kind&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;k3s&lt;/strong&gt; a déjà été cité dans cet article. Il ne me convient pas pour un environnement de développement/d&amp;rsquo;étude concernant k8s. Il est sûrement très &lt;strong&gt;redoutable à l&amp;rsquo;installation rapide&lt;/strong&gt; sur une quantité importante de machines à l&amp;rsquo;aide de &lt;a href=&#34;https://github.com/alexellis/k3sup&#34;&gt;k3sup&lt;/a&gt;. Mais ce n&amp;rsquo;est pas le sujet de cet article.&lt;/p&gt;
&lt;p&gt;La liste mentionne également &lt;a href=&#34;https://microk8s.io/&#34;&gt;&lt;strong&gt;MicroK8S&lt;/strong&gt;&lt;/a&gt;, le petit rejeton de la famille Ubuntu, qui semble être une &lt;strong&gt;alternative à &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/&#34;&gt;Minikube&lt;/a&gt;&lt;/strong&gt; avec des &lt;strong&gt;plugins&lt;/strong&gt; (Dashboard, DNS, registry, istio, etc.). Je pense qu&amp;rsquo;il est effectivement intéressant pour un usage complet entre des développeurs, une intégration continue (CI) / déploiement continue (CD) et plusieurs environnements allant jusqu&amp;rsquo;à des environnements dit « de production ». Je sens cependant que la similitude avec Minikube ne puisse me convenir. Je le &lt;strong&gt;laisse de côté pour l&amp;rsquo;instant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://k0sproject.io/&#34;&gt;&lt;strong&gt;k0s&lt;/strong&gt;&lt;/a&gt;, quant à lui, semble être la &lt;strong&gt;solution idéale pour&lt;/strong&gt; une installation sur &lt;strong&gt;une machine physique&lt;/strong&gt;. À &lt;strong&gt;usage privé&lt;/strong&gt;. Bien qu&amp;rsquo;il semble &lt;strong&gt;léger, facile à installer&lt;/strong&gt; et utiliser, je comprends rapidement qu&amp;rsquo;il est fait pour avoir une installation unique sur une machine physique précise. Il &lt;strong&gt;ne répond pas à&lt;/strong&gt; mon critère de &lt;strong&gt;création multiple d&amp;rsquo;environnements&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Et un de plus en moins !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il reste le dernier de cette liste : &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;&lt;strong&gt;kind&lt;/strong&gt;&lt;/a&gt;. A priori il semble &lt;strong&gt;léger&lt;/strong&gt;, prévu pour un usage &lt;strong&gt;spécifique au développement&lt;/strong&gt; ou de l&amp;rsquo;&lt;strong&gt;intégration continue&lt;/strong&gt; (CI) et &lt;strong&gt;utilise Docker&lt;/strong&gt; pour créer un cluster complet à chaque fois. Waouh, rien que ça ! Sur le papier, cet outil est &lt;strong&gt;très prometteur&lt;/strong&gt; car il répond aux critères précédemment listés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;créer des environnements « propres » grâce à l&amp;rsquo;usage de Docker,&lt;/li&gt;
&lt;li&gt;ainsi il permet l&amp;rsquo;usage de plusieurs environnements,&lt;/li&gt;
&lt;li&gt;il est léger, petit,&lt;/li&gt;
&lt;li&gt;facile à installer puisque &lt;a href=&#34;https://aur.archlinux.org/packages/kind&#34;&gt;kind est disponible dans les dépôts AUR d&amp;rsquo;ArchLinux&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;et pour la rapidité nous verrons.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À l&amp;rsquo;usage, kind (qui veut dire Kubernetes IN Docker) semble &lt;strong&gt;facile à prendre en main&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Créer un cluster nommé olivier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind create cluster --name olivier
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Supprime le cluster nommé olivier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind delete cluster --name olivier
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois le cluster créé, il s&amp;rsquo;agit simplement de jouer avec la commande &lt;code&gt;kubectl&lt;/code&gt; habituelle pour contacter le cluster. Et la commande étant à taper, je peux tout à fait &lt;strong&gt;scripter la création du cluster&lt;/strong&gt; et sa destruction.&lt;/p&gt;
&lt;p&gt;Il serait plus pratique de l&amp;rsquo;utiliser avec &lt;strong&gt;d&amp;rsquo;autres outils pour en faciliter l&amp;rsquo;usage&lt;/strong&gt;. J&amp;rsquo;ai donc cherché au fur et à mesure de nouveaux outils dont voici la liste :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ahmetb/kubectx&#34;&gt;&lt;strong&gt;kubectx&lt;/strong&gt;&lt;/a&gt; va permettre de &lt;strong&gt;commuter&lt;/strong&gt; d&amp;rsquo;&lt;strong&gt;un contexte Kubernetes&lt;/strong&gt; à un autre. Autrement dit passer d&amp;rsquo;un cluster à un autre facilement,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yannh/kubeconform&#34;&gt;&lt;strong&gt;kubeconform&lt;/strong&gt;&lt;/a&gt; pour &lt;strong&gt;valider&lt;/strong&gt; nos fichiers YAML,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/stackrox/kube-linter&#34;&gt;&lt;strong&gt;kube-linter&lt;/strong&gt;&lt;/a&gt; pour pousser à l&amp;rsquo;usage des &lt;strong&gt;bonnes pratiques&lt;/strong&gt; en matière de rédaction de fichiers YAML,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skaffold.dev/&#34;&gt;&lt;strong&gt;skaffold&lt;/strong&gt;&lt;/a&gt; pour &lt;strong&gt;surveiller&lt;/strong&gt; la moindre modification (équivalent d&amp;rsquo;un « watcher ») sur nos fichiers YAML et les déployer directement sur le cluster,&lt;/li&gt;
&lt;li&gt;et &lt;a href=&#34;https://fr.wikipedia.org/wiki/Make&#34;&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/a&gt; (avec un &lt;strong&gt;fichier Makefile&lt;/strong&gt;) pour mélanger tout ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mon idée est d&amp;rsquo;utiliser un fichier Makefile pour fournir plusieurs commandes permettant de créer le cluster, le détruire, vérifier les fichiers YAML ou encore lancer un déploiement automatique s&amp;rsquo;il y a des changements dans les fichiers en cours de développement.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;imagine quelque chose comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make cluster&lt;/code&gt; pour &lt;strong&gt;créer un cluster&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make dev&lt;/code&gt; pour lancer skaffold et &lt;strong&gt;écouter le moindre changement&lt;/strong&gt; sur le dossier de développement de l&amp;rsquo;application,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make kubeconform&lt;/code&gt; pour &lt;strong&gt;vérifier&lt;/strong&gt; les fichiers une fois écrits,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make lint&lt;/code&gt; pour vérifier les &lt;strong&gt;bonnes pratiques&lt;/strong&gt; avec kube-linter,&lt;/li&gt;
&lt;li&gt;et &lt;code&gt;make clean&lt;/code&gt; pour &lt;strong&gt;détruire le cluster&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tentons l&amp;rsquo;aventure et voyons le résultat !&lt;/p&gt;
&lt;h1 id=&#34;ce-que-jai-finalement-produit&#34;&gt;Ce que j&amp;rsquo;ai finalement produit&lt;/h1&gt;
&lt;h2 id=&#34;en-bref&#34;&gt;En bref&lt;/h2&gt;
&lt;p&gt;Le fichier &lt;strong&gt;Makefile&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;CLUSTER_NAME&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; k8s-dev-example
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;KUBECTL&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubectl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;SKAFFOLD&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; skaffold
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;KIND&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kind
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;KUBECONFORM&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubeconform
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;KUSTOMIZE&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kustomize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;NAMESPACES&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;.PHONY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt; help
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;help&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;Commandes disponibles :&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;  make cluster       - Crée un cluster Kind&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;  make namespaces    - Crée les namespaces Kubernetes (dev/staging/prod)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;  make dev           - Lance Skaffold pour l&amp;#39;env dev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;  make kubeconform   - Lance kubeconform sur l&amp;#39;env de DEV&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@echo &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;  make clean         - Supprime le cluster Kind&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;cluster&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KIND&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; create cluster --name &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;||&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;namespaces&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	@for ns in &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;NAMESPACES&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt;; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KUBECTL&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; get ns &lt;span style=&#34;color:#bb60d5&#34;&gt;$$&lt;/span&gt;ns &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KUBECTL&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; create ns &lt;span style=&#34;color:#bb60d5&#34;&gt;$$&lt;/span&gt;ns; &lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;dev&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt; cluster namespaces
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;SKAFFOLD&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;kubeconform&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt; kubeconform-dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;kubeconform-dev&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KUSTOMIZE&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; build overlays/dev | &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KUBECONFORM&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; -strict -summary -ignore-missing-schemas
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;clean&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;KIND&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt; delete cluster --name &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;$(&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce &lt;a href=&#34;https://gitlab.com/odtre/templates/k8s-dev-example/&#34;&gt;fichier Makefile est disponible sur le dépôt Gitlab d&amp;rsquo;ODTRE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il va utiliser deux dossiers principaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;base&lt;/strong&gt; qui contient les fichiers YAML de l&amp;rsquo;application qu&amp;rsquo;on souhaite implémenter sur Kubernetes,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;overlays/dev&lt;/strong&gt; qui contient un fichier kustomization.yaml pour surcharger le dossier &lt;em&gt;base&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et 2 fichiers de configuration :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;kube-linter.yaml&lt;/strong&gt; avec votre configuration de l&amp;rsquo;outil,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skaffold.yaml&lt;/strong&gt; avec le contenu suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;skaffold/v4beta13&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Config&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;k8s-demo-app&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;manifests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;kustomize&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- ./overlays/dev&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Exemple de redirection de port sur le service nommé dev-nginx (car l&amp;#39;overlay ajoute dev- devant tout)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;portForward&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;resourceType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;resourceName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dev-nginx&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dev&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;localPort&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela permet de surveiller le dossier &lt;em&gt;./overlays/dev&lt;/em&gt; avec &lt;em&gt;kustomize&lt;/em&gt; pour interpréter les fichiers. Et il va ouvrir le &lt;strong&gt;port 4000&lt;/strong&gt; sur la machine locale pour &lt;strong&gt;rediriger sur le port 80&lt;/strong&gt; du service Nginx d&amp;rsquo;exemple (fourni dans le dépôt Gitlab mentionné précédemment).&lt;/p&gt;
&lt;h2 id=&#34;à-lusage&#34;&gt;À l&amp;rsquo;usage&lt;/h2&gt;
&lt;p&gt;Tout n&amp;rsquo;est pas parfait. Cependant ce fichier Makefile permet de lancer quelques commandes &lt;code&gt;make&lt;/code&gt; utiles :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Lance l&amp;#39;environnement de DEV. Si le cluster n&amp;#39;existe pas : il le créé. Sinon il ignore.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Vérifie la conformité des fichiers YAML en utilisant le dossier overlays/dev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make kubeconform
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Détruit le cluster de DEV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make clean
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Pousse à l&amp;#39;usage des bonnes pratiques sur les fichiers contenus dans le dossier ./base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kube-linter lint --config kube-linter.yaml ./base
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour toute aide supplémentaire, faites : &lt;code&gt;make help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi &lt;strong&gt;il devient facile de travailler sur un nouvel environnement&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;je copie les fichiers disponible sur un &lt;a href=&#34;https://gitlab.com/odtre/templates/k8s-dev-example/&#34;&gt;dépôt template sur Gitlab&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;j&amp;rsquo;ouvre le fichier Makefile en écriture,&lt;/li&gt;
&lt;li&gt;j&amp;rsquo;édite la ligne suivante pour adapter le nom du cluster de travail :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CLUSTER_NAME :&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; k8s-dev-example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et le tour est joué !&lt;/p&gt;
&lt;p&gt;Je suis assez &lt;strong&gt;satisfait de cet environnement&lt;/strong&gt;. Il &lt;strong&gt;répond aux critères&lt;/strong&gt; édictés plusieurs fois dans cet article. Et je me sens plus à l&amp;rsquo;aise de pouvoir modifier comme bon me semble cet environnement de développement/travail.&lt;/p&gt;
&lt;p&gt;Les outils utilisés me font penser à &lt;strong&gt;une boîte à outil&lt;/strong&gt; de base pour le &lt;strong&gt;travail sur Kubernetes&lt;/strong&gt;. Même sans utiliser le fichier Makefile je suis amené à pratiquer les outils comme kubeconform, kubectl, kube-linter et kustomize.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est donc une très bonne chose d&amp;rsquo;avoir regroupé ces outils autour de Makefile et de les utiliser régulièrement sur mes projets Kubernetes.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Nous avons posé le contexte d&amp;rsquo;une &lt;strong&gt;recherche d&amp;rsquo;outil&lt;/strong&gt; simple, rapide et léger &lt;strong&gt;pour créer de nombreux environnements Kubernetes&lt;/strong&gt; afin de travailler sur ces environnements dans le cadre d&amp;rsquo;un &lt;strong&gt;développement de fichiers YAML&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Après quelques essais sur Minikube et k3s, mes recherches se sont portées sur l&amp;rsquo;&lt;strong&gt;utilisation de kind&lt;/strong&gt;. Puis j&amp;rsquo;ai utilisé make pour le manipuler et regrouper aussi les différents outils utiles.&lt;/p&gt;
&lt;p&gt;La &lt;strong&gt;boîte à outil&lt;/strong&gt; se compose de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;kind&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skaffold&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubectl&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubeconform&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kube-linter&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;et &lt;strong&gt;make&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;aborde désormais de &lt;strong&gt;manière plus sereine&lt;/strong&gt; le développement d&amp;rsquo;une application qui sera hébergée par un Kubernetes. J&amp;rsquo;ai un template à ma disposition pour ces fichiers. Template que je peux faire évoluer au gré des obstacles rencontrés. Il utilise tous les outils que j&amp;rsquo;ai appréciés. J&amp;rsquo;en suis &lt;strong&gt;pleinement satisfait&lt;/strong&gt; &amp;#x1f60e; .&lt;/p&gt;
&lt;p&gt;Et vous, &lt;strong&gt;quel environnement Kubernetes utilisez-vous&lt;/strong&gt; pour vos développements de fichiers YAML ?&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/fr/&#34;&gt;Kubernetes (k8s) officiel&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://microk8s.io/&#34;&gt;MicroK8S&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://minikube.sigs.k8s.io/docs/&#34;&gt;Minikube&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k0sproject.io/&#34;&gt;k0s&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k3s.io/&#34;&gt;k3s&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;kind&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/stackrox/kube-linter&#34;&gt;kube-linter&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yannh/kubeconform&#34;&gt;kubeconform&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ahmetb/kubectx&#34;&gt;kubectx&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Make&#34;&gt;make&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skaffold.dev/&#34;&gt;skaffold&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/odtre/templates/k8s-dev-example/&#34;&gt;dépôt Gitlab du template proposé dans cet article pour développer sur un environnement Kubernetes « propre »&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Clavier Keychron Q6 Knob ISO version</title>
      <link>https://olivier.dossmann.net/2025/09/clavier-keychron-q6-knob-iso-version/</link>
      <pubDate>Wed, 10 Sep 2025 21:47:52 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2025/09/clavier-keychron-q6-knob-iso-version/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;À une époque lointaine je m&amp;rsquo;intéressais aux &lt;strong&gt;claviers mécaniques&lt;/strong&gt;. Notamment le &lt;a href=&#34;https://www.daskeyboard.com/blog/das-keyboard-ii-105-keys-for-accent-users/&#34; title=&#34;Lire un article sur le Das Keyboard 2&#34;&gt;Das Keyboard 2&lt;/a&gt;. Aucun article sur le présent site n&amp;rsquo;avait été publié. Je l&amp;rsquo;ai pourtant fait lors de l&amp;rsquo;acquisition de mon &lt;a href=&#34;https://olivier.dossmann.net/2017/04/clavier-usb-compact-thinkpad-avec-trackpoint/&#34;&gt;clavier USB Compact Thinkpad avec TrackPoint&lt;/a&gt; en 2017. Mais ce n&amp;rsquo;est pas un clavier mécanique.&lt;/p&gt;
&lt;p&gt;Aujourd&amp;rsquo;hui j&amp;rsquo;aimerais partager avec vous des éléments autour des claviers mécaniques. Et pour cela nous parlerons, entre autre, du clavier &lt;a href=&#34;https://keychron.fr/fr/products/keychron-q6-qmk-custom-mechanical-keyboard-iso-layout-collection&#34;&gt;Keychron Q6 Knob ISO Version&lt;/a&gt; acquis il y a quelques années déjà : en &lt;strong&gt;2022&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Je tiens à préciser que &lt;a href=&#34;https://richard-dern.fr/interets/informatique/2022/01/11/a-la-recherche-du-clavier-parfait-un-clavier-100-custom/&#34;&gt;d&amp;rsquo;autres personnes, comme Richard Dern, parlent mieux de ce sujet sur leur blog&lt;/a&gt;, voire &lt;a href=&#34;https://richard-dern.fr/interets/informatique/2022/01/15/a-la-recherche-du-clavier-parfait-a-propos-de-lorientation-des-switches/&#34;&gt;détaillent mieux les parties concernant les composants de clavier mécaniques&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;aimerais surtout partager les caractéristiques de ce clavier, pourquoi je l&amp;rsquo;ai choisi, quels composants permettent de construire son propre clavier, combien cela coûte et les outils disponibles pour améliorer son expérience sur un &lt;strong&gt;clavier personnalisé et personnalisable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/clavier_keychron_q6_knob_iso_version.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;le-keychron-q6-knob-iso-version&#34;&gt;Le Keychron Q6 Knob ISO Version&lt;/h1&gt;
&lt;p&gt;Vous l&amp;rsquo;aurez compris : j&amp;rsquo;ai acheté un Keychron Q6 Knob ISO Version.&lt;/p&gt;
&lt;h2 id=&#34;modèle-et-disposition&#34;&gt;Modèle et disposition&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Que veut dire Keychron Q6 Knob ISO Version&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keychron&lt;/strong&gt; est la &lt;strong&gt;marque&lt;/strong&gt; du clavier (l&amp;rsquo;entreprise qui fabrique le clavier),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q6&lt;/strong&gt; en est le &lt;strong&gt;modèle&lt;/strong&gt;. Il existe plusieurs modèles en fonction du nombre de touches, du type de clavier (filaire, bluetooth ou wifi), etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knob&lt;/strong&gt; est une &lt;strong&gt;alternative&lt;/strong&gt; possédant un &lt;strong&gt;potentiomètre&lt;/strong&gt;. Bref, un gros bouton qui tourne pour changer le volume &amp;#x1f604;&lt;/li&gt;
&lt;li&gt;Et &lt;strong&gt;ISO version&lt;/strong&gt; signifie que la &lt;strong&gt;disposition&lt;/strong&gt; du clavier est européenne plutôt que la version ANSI qui par exemple ne se présente pas de la même manière au niveau de la touche entrée (bien plus fine que celle pour la version européenne).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; : En réalité &lt;a href=&#34;https://en.wikipedia.org/wiki/ISO/IEC_9995&#34;&gt;ISO est un standard nommé aussi IEC 9995&lt;/a&gt; (merci à &lt;a href=&#34;https://gitlab.com/greyxor/&#34;&gt;GreyXor&lt;/a&gt; de l&amp;rsquo;avoir signalé).&lt;/p&gt;
&lt;h1 id=&#34;caractéristiques&#34;&gt;Caractéristiques&lt;/h1&gt;
&lt;p&gt;Ayant pris seulement la base du clavier (sans les touches ni les switches - dont nous parlerons plus tard), voici les caractéristiques de ce support de clavier :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clavier avec une &lt;strong&gt;base en aluminium&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Branchement &lt;strong&gt;filaire&lt;/strong&gt; avec de l&amp;rsquo;USB-C - avec un adaptateur USB-C vers USB Type B,&lt;/li&gt;
&lt;li&gt;Bouton pour changer de &lt;strong&gt;disposition Win/Mac&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Clavier &lt;strong&gt;programmable&lt;/strong&gt; (avec un &lt;strong&gt;firmware QMK&lt;/strong&gt; - open source),&lt;/li&gt;
&lt;li&gt;Touches &lt;strong&gt;rétroéclairées&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Disposition &lt;strong&gt;ISO&lt;/strong&gt; (européenne),&lt;/li&gt;
&lt;li&gt;Couleur « &lt;strong&gt;Navy Blue&lt;/strong&gt; ».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apparence de la base que j&amp;rsquo;ai prise :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/clavier_keychron_q6_knob_iso_version_navy_blue.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;pourquoi-ce-choix&#34;&gt;Pourquoi ce choix ?&lt;/h1&gt;
&lt;p&gt;À &lt;strong&gt;200€ environ - rien que la base&lt;/strong&gt;, sans touches - on peut se demander ce qui a motivé cet achat. Et curieusement la réponse est : financière !&lt;/p&gt;
&lt;p&gt;Je divague ? Pas totalement.&lt;/p&gt;
&lt;p&gt;En effet ces dernières annnées, avant l&amp;rsquo;acquisition d&amp;rsquo;un tel objet, j&amp;rsquo;achetais 1 clavier par an. Pas pour être à la page, ni pour toujours avoir un clavier neuf. Mais parce que &lt;strong&gt;mes claviers tombent en panne&lt;/strong&gt; environ &lt;strong&gt;1 an après&lt;/strong&gt; leur achat.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;utilise &lt;strong&gt;énormément&lt;/strong&gt; la ligne de commande. Et contrôle mon bureau au clavier. Il a donc &lt;strong&gt;une place cruciale&lt;/strong&gt; dans mes usages. Et à cet effet &lt;strong&gt;il s&amp;rsquo;use aussi très vite&lt;/strong&gt;. Avec 12 000 phrases par mois sur un seul salon de discussion sur lequel je suis actif, avec 50 mots par phrase en moyenne, même si un mot faisait 3 lettres, cela fait - en arrondissant beaucoup - quelque chose comme &lt;strong&gt;2 millions de touches appuyées sur 1 an&lt;/strong&gt;. Et ceci n&amp;rsquo;est qu&amp;rsquo;un seul de mes - nombreux - usages. J&amp;rsquo;écris sur d&amp;rsquo;autres supports.&lt;/p&gt;
&lt;p&gt;Au début j&amp;rsquo;achetais des claviers simples, à 30€, puis 60€ pour monter en gamme. Et à force mes habitudes se tournaient vers des &lt;strong&gt;claviers pratiques, rétroéclairés, mécaniques, avec un potentiomètre pour le son&lt;/strong&gt;, etc. Et les coûts avoisinaient facilement 200€. Jusqu&amp;rsquo;à ce qu&amp;rsquo;il tombe en panne et que je doive en racheter un.&lt;/p&gt;
&lt;p&gt;Autant vous dire qu&amp;rsquo;à 200€ l&amp;rsquo;année, ça commence à faire cher. Ainsi j&amp;rsquo;ai décidé de me tourner vers les &lt;strong&gt;claviers « faits-maison » : des claviers qu&amp;rsquo;on assemble soi-même&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée ? Si quelque chose tombe en panne je le remplace au prix de la pièce. &lt;strong&gt;Pas au prix d&amp;rsquo;un clavier entier&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;historique-de-mes-claviers&#34;&gt;Historique de mes claviers&lt;/h1&gt;
&lt;p&gt;Pour vous donner un ordre de grandeur des dépenses, voici un &lt;strong&gt;historique de mes achats&lt;/strong&gt; et de leur prix approximatif. &lt;strong&gt;Uniquement pour les claviers mécaniques&lt;/strong&gt;, sans les claviers intermédiaires :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2009&lt;/strong&gt; - (~80€) Das Keyboard 2 (switches Cherry MX blue),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2017&lt;/strong&gt; - (~120€) Das Keyboard 4 Ultimate (switches Cherry MX brown),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2019&lt;/strong&gt; - (~200€) Corsair K95 RGB platinum (switches Cherry MX brown),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2022&lt;/strong&gt; - (~70€) DREVO Calibur V2 Te RGB 60% (switches Cherry MX brown),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2022&lt;/strong&gt; - (~210€ + switches + touches) Keychron Q6 Knob ISO Version (nu, sans touches, sans switches)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avant 2022, rien qu&amp;rsquo;en clavier mécanique, sur 10 ans j&amp;rsquo;avais dépensé 400€. Et quasiment tout autant en clavier &amp;ldquo;non mécanique&amp;rdquo;. Soit &lt;strong&gt;800€ sur 10 ans&lt;/strong&gt;, soit &lt;strong&gt;80€ par an&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;&lt;strong&gt;idée&lt;/strong&gt; est donc de &lt;strong&gt;diminuer ce budget pour les 10 ans à venir&lt;/strong&gt; (à partir de 2022).&lt;/p&gt;
&lt;h1 id=&#34;les-composants-dun-clavier--fait-maison--assemblé&#34;&gt;Les composants d&amp;rsquo;un clavier « fait-maison » (assemblé)&lt;/h1&gt;
&lt;p&gt;Avoir un clavier assemblé veut dire &lt;strong&gt;composer soi-même son clavier&lt;/strong&gt; : il faut choisir chacun des composants. Trouver des composants compatibles, comparer les prix, commander, patienter, monter/assembler.&lt;/p&gt;
&lt;p&gt;Nous ne sommes pas là pour faire un cours sur les éléments nécessaires à un clavier ni pour détailler chacun des composants, mais voici les éléments de base :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;boîtier&lt;/strong&gt; de clavier (pour mettre la carte mère de clavier notamment),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mousse&lt;/strong&gt; dans le boîtier pour &lt;strong&gt;réduire l&amp;rsquo;écho&lt;/strong&gt; (quand on tape sur une touche),&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;carte mère&lt;/strong&gt; pour gérer la ou les dispositions de clavier,&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;plaque&lt;/strong&gt; à mettre par dessus,&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;switches&lt;/strong&gt; (qui sont le &lt;strong&gt;lien entre un emplacement de touche et la touche&lt;/strong&gt; elle-même),&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;stabilisateurs&lt;/strong&gt; pour les touches plus grosses comme la touche Entrée, la barre espace, etc.,&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;touches&lt;/strong&gt; pardi !&lt;/li&gt;
&lt;li&gt;et un &lt;strong&gt;repose-poignet&lt;/strong&gt; (facultatif).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;combien-cela-a-t-il-coûté&#34;&gt;Combien cela a-t-il coûté ?&lt;/h1&gt;
&lt;p&gt;Faisons le &lt;strong&gt;calcul approximatif&lt;/strong&gt;. En &lt;strong&gt;2022&lt;/strong&gt; j&amp;rsquo;ai acheté :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;80€&lt;/strong&gt; - &lt;strong&gt;switches&lt;/strong&gt; pour clavier mécanique,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;28€&lt;/strong&gt; - une seule &lt;strong&gt;touche personnalisée&lt;/strong&gt; (Toadstool Retainer de Mario Bros),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;210€&lt;/strong&gt; - la base du &lt;strong&gt;clavier keychron&lt;/strong&gt; (sans les touches, sans les switches),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;40€&lt;/strong&gt; - une seule &lt;strong&gt;touche en métal&lt;/strong&gt; (le point interrogation de Mario Bros),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;62€&lt;/strong&gt; - ensemble de &lt;strong&gt;touches north-facing&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;57€&lt;/strong&gt; - &lt;strong&gt;repose-poignet&lt;/strong&gt; en marbre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total : ~480€&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;À ce prix, le &lt;strong&gt;clavier devient économique au bout de 2 ans et demi&lt;/strong&gt; - pour moi. En effet, ces dernières années je dépensais pas moins de 200€ de clavier par an (avant l&amp;rsquo;arrivée du Keychron Q6 dans le foyer).&lt;/p&gt;
&lt;h1 id=&#34;retours-dexpérience&#34;&gt;Retour(s) d&amp;rsquo;expérience&lt;/h1&gt;
&lt;p&gt;À l&amp;rsquo;heure où j&amp;rsquo;écris ces lignes nous sommes en 2025. Le clavier est &lt;strong&gt;toujours vivant. Toujours robuste. Toujours fonctionnel&lt;/strong&gt;. J&amp;rsquo;ai dû &lt;strong&gt;changer 2 switches&lt;/strong&gt; seulement à moindre coût. Les touches ont été changées pour une raison simple : on m&amp;rsquo;en a offertes.
Je n&amp;rsquo;ai &lt;strong&gt;rien dépensé de plus pour ce clavier&lt;/strong&gt;. J&amp;rsquo;ai donc &lt;strong&gt;réduit grandement mon budget clavier à l&amp;rsquo;année&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;rsquo;utilisation est appréciable&lt;/strong&gt;. Très appréciable ! J&amp;rsquo;ai choisi des switches qui me conviennent parfaitement : &lt;strong&gt;la pression des touches est adaptée à ma frappe&lt;/strong&gt;. Ni trop dure, ni trop molle.
De temps en temps, je change les touches (appelées « caps » en anglais) &lt;strong&gt;pour le plaisir&lt;/strong&gt;. Comme si c&amp;rsquo;était un revêtement de saison ou une &lt;strong&gt;nouvelle parure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En revanche ce clavier est très lourd. &lt;strong&gt;Il est mastoc&lt;/strong&gt;. Ce qui le rend &lt;strong&gt;impossible à transporter&lt;/strong&gt; comme on le ferait avec d&amp;rsquo;autres claviers. Si vous prévoyez de déplacer le clavier, mieux vaut en prendre un plus petit - avec moins de touches.
Mais quoi de mieux qu&amp;rsquo;un bon gros clavier pour son bureau ?&lt;/p&gt;
&lt;p&gt;Finalement je me sens &lt;strong&gt;à l&amp;rsquo;aise avec ce clavier&lt;/strong&gt; qui coche mes critères et répond à son rôle à merveille ; sans défaillir !&lt;/p&gt;
&lt;h1 id=&#34;outils-disponibles-pour-un-tel-clavier&#34;&gt;Outils disponibles pour un tel clavier&lt;/h1&gt;
&lt;p&gt;La particularité d&amp;rsquo;un tel clavier est de pouvoir être &lt;strong&gt;personnalisable&lt;/strong&gt; non seulement en matière de touches, de réaction et de pressions, mais aussi en terme de réponse à un appui. C&amp;rsquo;est à dire de pouvoir définir sous chaque touche l&amp;rsquo;action qui sera entreprise. Si la plupart des claviers répondront par un A à l&amp;rsquo;appui de la touche A, nous pouvons tout à fait définir que l&amp;rsquo;appui sur la touche A met en pause la vidéo en cours de lecture. Et c&amp;rsquo;est ça qu&amp;rsquo;on recherche, croyez-moi !&lt;/p&gt;
&lt;p&gt;Pour ce faire, nous disposons d&amp;rsquo;une ribambelle d&amp;rsquo;outils, parmi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://config.qmk.fm/&#34;&gt;&lt;strong&gt;QMK Configurator&lt;/strong&gt;, une interface Web de configuration de son clavier&lt;/a&gt; (utilise le firmware QMK, votre clavier doit donc être compatible),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://launcher.keychron.com/&#34;&gt;&lt;strong&gt;Keychron Launcher&lt;/strong&gt;, l&amp;rsquo;outil officiel de Keychron pour configurer son clavier en ligne&lt;/a&gt; (nécessite un navigateur parmi Microsoft Edge, Chrome ou Opera - qui doit surtout gérer WebUSB, Cf. &lt;a href=&#34;https://caniuse.com/webusb&#34;&gt;Support de WebUSB sur la plupart des navigateurs courants&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.usevia.app/&#34;&gt;&lt;strong&gt;VIA&lt;/strong&gt;, une interface conviviale et simple&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ces outils ne fonctionneront que si le clavier est reconnu par le système et le navigateur. Pour savoir comment procéder avec le Keychron Q6, je vous renvoie vers &lt;a href=&#34;https://olivier.dossmann.net/wiki/materiel/keychron_q6/&#34;&gt;ma page d&amp;rsquo;astuce concernant le Keychron Q6 ISO Knob version&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez également installer sur votre machine certains outils, comme ceux contenus dans &lt;a href=&#34;https://qmk.fm/toolbox&#34;&gt;&lt;strong&gt;QMK Toolbox&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Après avoir détaillé les caractéristiques de ce &lt;strong&gt;clavier Keychron Q6 Knob ISO Version&lt;/strong&gt;, les composants nécessaires à sa complétude, l&amp;rsquo;historique de mes claviers pour comprendre la baisse éventuelle du budget par an et mes retours d&amp;rsquo;expérience, il semble clair qu&amp;rsquo;au bout de 3 ans je suis &lt;strong&gt;pleinement satisfait&lt;/strong&gt; de ce clavier.
Avec l&amp;rsquo;ensemble des claviers mécaniques que j&amp;rsquo;ai achetés, je peux désormais dire que ce clavier me convient parfaitement. Il est devenu &lt;strong&gt;LE clavier&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;De 2022 à 2025, ce changement de clavier est &lt;strong&gt;devenu rentable&lt;/strong&gt;. Le temps nous dira de combien il l&amp;rsquo;est. Rien que pour la maintenance possible par « petites doses » (comme &lt;strong&gt;changer seulement les touches usées&lt;/strong&gt;), cela vaut le coup ! En revanche on s&amp;rsquo;aperçoit que &lt;strong&gt;changer d&amp;rsquo;apparence peut coûter cher&lt;/strong&gt; : en fonction de l&amp;rsquo;ensemble de touches choisi les prix varient entre luxe et arnaque (les prix sont parfois indécents)…&lt;/p&gt;
&lt;p&gt;Par ailleurs une &lt;strong&gt;large gamme d&amp;rsquo;outils&lt;/strong&gt; est disponible pour personnaliser les touches et on peut facilement se lancer dans une programmation du clavier très forte avec une &lt;strong&gt;réelle évolution de l&amp;rsquo;usage&lt;/strong&gt; que nous en faisons. &lt;strong&gt;Je conseille&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Et vous ? &lt;strong&gt;Quel sera votre prochain clavier mécanique ?&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.daskeyboard.com/blog/das-keyboard-ii-105-keys-for-accent-users/&#34; title=&#34;Lire un article sur le Das Keyboard 2&#34;&gt;Clavier &lt;strong&gt;Das Keyboard 2&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://keychron.fr/fr/products/keychron-q6-qmk-custom-mechanical-keyboard-iso-layout-collection&#34;&gt;Clavier &lt;strong&gt;Keychron Q6 Knob ISO Version&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://richard-dern.fr/interets/informatique/2022/01/11/a-la-recherche-du-clavier-parfait-un-clavier-100-custom/&#34;&gt;Article de Richard Dern sur la &lt;strong&gt;recherche du clavier parfait&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://richard-dern.fr/interets/informatique/2022/01/15/a-la-recherche-du-clavier-parfait-a-propos-de-lorientation-des-switches/&#34;&gt;Article de Richard Dern concernant l&amp;rsquo;&lt;strong&gt;orientation des switches&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://config.qmk.fm/&#34;&gt;&lt;strong&gt;QMK Configurator&lt;/strong&gt;, une interface Web de configuration de son clavier&lt;/a&gt; (utilise le firmware QMK, votre clavier doit donc être compatible),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://launcher.keychron.com/&#34;&gt;&lt;strong&gt;Keychron Launcher&lt;/strong&gt;, l&amp;rsquo;outil officiel de Keychron pour configurer son clavier en ligne&lt;/a&gt; (nécessite un navigateur parmi Microsoft Edge, Chrome ou Opera),&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.usevia.app/&#34;&gt;&lt;strong&gt;VIA&lt;/strong&gt;, une interface conviviale et simple&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/wiki/materiel/keychron_q6/&#34;&gt;Ma &lt;strong&gt;page d&amp;rsquo;astuce&lt;/strong&gt; concernant le Keychron Q6 ISO Knob version&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Ce que j&#39;aurais voulu savoir sur Gitlab CI</title>
      <link>https://olivier.dossmann.net/2025/05/ce-que-jaurais-voulu-savoir-sur-gitlab-ci/</link>
      <pubDate>Sun, 18 May 2025 13:55:39 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2025/05/ce-que-jaurais-voulu-savoir-sur-gitlab-ci/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a quelques mois &lt;a href=&#34;https://olivier.dossmann.net/2024/10/mes_conseils_pour_reussir_une_formation_bootcamp/&#34;&gt;je parlais de ma formation Bootcamp pour devenir Ingénieur DevOps&lt;/a&gt;. J&amp;rsquo;y ai utilisé - à nouveau - &lt;strong&gt;Gitlab CI&lt;/strong&gt; (Continuous Integration). Vous savez, cet &lt;strong&gt;outil permettant d&amp;rsquo;exécuter des actions&lt;/strong&gt; après avoir envoyé votre code/dépôt sur la plateforme Gitlab ?&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est très utile, par exemple pour &lt;strong&gt;lancer les tests&lt;/strong&gt; sur votre code, vérifier que &lt;strong&gt;le code s&amp;rsquo;exécute dans un environnement précis&lt;/strong&gt; ou tout simplement vérifier que &lt;strong&gt;le code compile&lt;/strong&gt;. Et si votre dépôt n&amp;rsquo;est pas du code, par exemple un site web, vous pouvez tester les liens morts ; voire publier votre site ! &lt;strong&gt;Les possibilités sont - finalement - nombreuses&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;En revanche, un tel outil est parfois déstabilisant. Et des cheveux, j&amp;rsquo;en ai arrachés ! J&amp;rsquo;aurais apprécié tomber sur un article explicatif. Avec des astuces. Peut-être que le présent article m&amp;rsquo;aurait convenu, qui sait !&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;aurai par exemple aimé savoir comment &lt;strong&gt;publier facilement un site web&lt;/strong&gt;, &lt;strong&gt;tester localement&lt;/strong&gt; le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; avant de l&amp;rsquo;envoyer sur Gitlab, connaître &lt;strong&gt;plus d&amp;rsquo;astuces&lt;/strong&gt; pour les mots clés Gitlab, savoir &lt;strong&gt;utiliser Docker dans Gitlab CI&lt;/strong&gt; et ce que sont les &lt;strong&gt;composants réutilisables&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce sont ainsi tous les sujets que nous allons aborder aujourd&amp;rsquo;hui.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/raton_laveur.jpg&#34; alt=&#34;Un visage de Raton Laveur&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://www.flickr.com/photos/131830853@N05/&#34;&gt;profil de didier.camus sur Flickr&lt;/a&gt;&lt;/em&gt; sous Licence Œuvre du domaine public.&lt;/p&gt;
&lt;h1 id=&#34;publier-rapidement-un-site-statique&#34;&gt;Publier rapidement un site statique&lt;/h1&gt;
&lt;p&gt;Gitlab met à disposition des utilisateurs un &lt;strong&gt;espace permettant d&amp;rsquo;héberger des sites webs statiques&lt;/strong&gt;. Incroyable n&amp;rsquo;est-ce pas ? Cet espace est &lt;a href=&#34;https://docs.gitlab.com/user/project/pages/&#34; title=&#34;Voir la documentation de Gitlab concernant Gitlab Pages&#34;&gt;Gitlab Pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Comment cela fonctionne ? Il suffit de créer un dépôt Gitlab, d&amp;rsquo;ajouter un fichier &lt;strong&gt;.gitlab-ci.yml&lt;/strong&gt; contenant la section suivante :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;busybox&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;pages&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;stage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;deploy&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- echo &amp;#34;The site will be deployed to $CI_PAGES_URL&amp;#34;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;artifacts&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- public&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;if&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Code récupéré du projet &lt;a href=&#34;https://gitlab.com/pages/plain-html&#34;&gt;https://gitlab.com/pages/plain-html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cela signifie qu&amp;rsquo;au terme de la CI/CD (dans l&amp;rsquo;étape nommée &lt;em&gt;deploy&lt;/em&gt;), &lt;strong&gt;le contenu du dossier public sera publié sur Gitlab Pages&lt;/strong&gt;. À quelle adresse ? Imaginons que vous partez d&amp;rsquo;un dépôt dont l&amp;rsquo;adresse est : &lt;code&gt;https://gitlab.com/blankoworld/monprojet/&lt;/code&gt;, l&amp;rsquo;adresse URL d&amp;rsquo;accès à votre site publié sera : &lt;code&gt;https://blankoworld.gitlab.io/monprojet/&lt;/code&gt;. Pratique non ?&lt;/p&gt;
&lt;p&gt;Astuce : Si votre dépôt est privé, vous pouvez quand même rendre votre site public. Il suffit d&amp;rsquo;aller dans &lt;strong&gt;Settings &amp;gt; General&lt;/strong&gt;, Section « &lt;strong&gt;Visibility, project features, permissions&lt;/strong&gt; » et dans le sous-titre « &lt;strong&gt;Pages&lt;/strong&gt; », activez la fonctionnalité. Et dans le menu déroulant à côté, choisissez « &lt;strong&gt;Everyone&lt;/strong&gt; ». N&amp;rsquo;oubliez pas de &lt;strong&gt;sauvegarder&lt;/strong&gt; cette configuration. Le code sera privé, le site web statique public !&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;plus d&amp;rsquo;exemple&lt;/strong&gt;, veuillez vous rendre sur la page Gitlab présentant la &lt;a href=&#34;https://gitlab.com/pages&#34; title=&#34;Liste d&#39;exemple de projets utilisant Gitlab Pages&#34;&gt;liste de projets utilisant Gitlab Pages&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;tester-avant-denvoyer-sur-le-dépôt-&#34;&gt;Tester avant d&amp;rsquo;envoyer sur le dépôt ?&lt;/h1&gt;
&lt;p&gt;Le truc vraiment embêtant avec les fichiers &lt;em&gt;.gitlab-ci.yml&lt;/em&gt;, c&amp;rsquo;est qu&amp;rsquo;&lt;strong&gt;on ne peut pas les tester sur notre machine&lt;/strong&gt; (localement). Pour avancer il faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;modifier le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;le valider (faire un commit),&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;envoyer sur Gitlab,&lt;/li&gt;
&lt;li&gt;patienter que la pipeline se lance (et parfois se termine),&lt;/li&gt;
&lt;li&gt;bénéficier du résultat ou, dans la plupart des cas, recommencer à l&amp;rsquo;étape 1…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À une époque on pouvait utiliser une commande &lt;code&gt;gitlab-runner exec&lt;/code&gt; en local. Mais celle-ci a été supprimée : &lt;a href=&#34;https://gitlab.com/gitlab-org/gitlab-runner/-/commit/f8508c924f80b104ec7353353e6ad0edb5daae66&#34;&gt;https://gitlab.com/gitlab-org/gitlab-runner/-/commit/f8508c924f80b104ec7353353e6ad0edb5daae66&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Suivant ce que nous faisons dans la CI/CD de Gitlab, il est possible d&amp;rsquo;utiliser un outil bien pratique nommé &lt;strong&gt;gitlab-ci-local&lt;/strong&gt; : &lt;a href=&#34;https://github.com/firecow/gitlab-ci-local&#34; title=&#34;Se rendre sur la page Github du projet gitlab-ci-local&#34;&gt;gitlab-ci-local&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vous trouverez quelques détails de &lt;a href=&#34;https://olivier.dossmann.net/wiki/developpement/gitlab-ci-local/&#34; title=&#34;Visiter le recueil d&#39;astuces d&#39;Olivier concernant l&#39;outil gitlab-ci-local&#34;&gt;gitlab-ci-local sur mon recueil d&amp;rsquo;astuces&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;généralités&#34;&gt;Généralités&lt;/h1&gt;
&lt;p&gt;Voici quelques pistes intéressantes sur le sujet Gitlab :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une &lt;strong&gt;documentation de départ&lt;/strong&gt; est : &lt;a href=&#34;https://docs.gitlab.com/topics/build_your_application/&#34;&gt;https://docs.gitlab.com/topics/build_your_application/&lt;/a&gt;. Elle permet d&amp;rsquo;en savoir plus sur la &lt;a href=&#34;https://docs.gitlab.com/ci/yaml/&#34; title=&#34;Lire la documentation officielle de Gitlab concernant la syntaxe du fichier *gitlab-ci.yml*&#34;&gt;syntaxe de gitlab-ci.yaml&lt;/a&gt;, les &lt;a href=&#34;https://docs.gitlab.com/ci/variables/predefined_variables/&#34; title=&#34;En savoir plus sur les variables pré-définies dans la CI Gitlab&#34;&gt;variables pré-définies&lt;/a&gt; ou encore le &lt;a href=&#34;https://docs.gitlab.com/ci/pipelines/pipeline_architectures/#basic-pipelines&#34; title=&#34;Découvrir les pipelines de Gitlab CI&#34;&gt;fonctionnement d&amp;rsquo;un pipeline dans Gitlab CI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Toujours utiles : les actions que je nomme comme « &lt;strong&gt;globales&lt;/strong&gt; ». Par exemple les mots clés &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;variables&lt;/code&gt; ou &lt;code&gt;before_script&lt;/code&gt; peuvent &lt;strong&gt;être utilisés en début du fichier&lt;/strong&gt; pour définir des actions ou des valeurs qui &lt;strong&gt;seront utilisées dans toutes les étapes du pipeline&lt;/strong&gt;. Ce qui peut être un avantage, ou un inconvénient. Exemple : &lt;code&gt;image: ubuntu:latest&lt;/code&gt; va définir que toutes les étapes se lanceront dans un docker partant de l&amp;rsquo;image Ubuntu,&lt;/li&gt;
&lt;li&gt;Entrées/sorties : &lt;strong&gt;un artefact = une sortie&lt;/strong&gt;. C&amp;rsquo;est à dire des fichiers utilisables/disponibles pour les étapes suivantes (donc en &lt;strong&gt;entrée pour les autres étapes&lt;/strong&gt;) en utilisant le mot clé &lt;strong&gt;dependencies&lt;/strong&gt; (Cf. &lt;a href=&#34;https://docs.gitlab.com/ci/jobs/job_artifacts/#fetching-artifacts)&#34;&gt;https://docs.gitlab.com/ci/jobs/job_artifacts/#fetching-artifacts)&lt;/a&gt;. Sauf si &lt;code&gt;dependencies = []&lt;/code&gt; est utilisé.&lt;/li&gt;
&lt;li&gt;Utiliser des &lt;strong&gt;variables globales en début du fichier&lt;/strong&gt; (par exemple pour les numéros de versions) fait gagner du temps sur le long terme. Exemple :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;variables&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;DOCKER_VERSION&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;27.3.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;UBUNTU_VERSION&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;24.04&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Concernant le &lt;strong&gt;mot clé script&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;si on veut écrire plusieurs lignes, utiliser la syntaxe suivante :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- echo &amp;#34;première étape des scripts&amp;#34;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- |&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;    echo &amp;#34;première ligne&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;    echo &amp;#34;seconde ligne&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-style:italic&#34;&gt;    echo &amp;#34;etc.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;limiter à 10 lignes max&lt;/strong&gt;imum,&lt;/li&gt;
&lt;li&gt;si on utilise la syntaxe pour écrire plusieurs lignes, le &lt;strong&gt;debug&lt;/strong&gt; est plus &lt;strong&gt;difficile&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;organiser les étapes&lt;/strong&gt;, on peut donner à chacune d&amp;rsquo;elle une &lt;strong&gt;étape pré-requise en utilisant le mot clé « &lt;a href=&#34;https://docs.gitlab.com/ci/yaml/#needs&#34; title=&#34;En savoir plus sur le mot clé needs dans la documentation de Gitlab&#34;&gt;needs&lt;/a&gt; »&lt;/strong&gt;, cela permet de chaîner les étapes dans un certain ordre. Exemple : si on veut que l&amp;rsquo;étape « deploy » se fasse après « compile », alors à la fin de l&amp;rsquo;étape « deploy » on met &lt;code&gt;needs: [compile]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;le-cas-docker&#34;&gt;Le Cas Docker&lt;/h1&gt;
&lt;h2 id=&#34;création-dune-image-docker-dans-un-conteneur-docker&#34;&gt;Création d&amp;rsquo;une image Docker… dans un conteneur Docker&lt;/h2&gt;
&lt;p&gt;Dans la situation où vous voudriez &lt;strong&gt;fabriquer des images Docker&lt;/strong&gt;, vous allez être confrontés à plusieurs problématiques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il faut utiliser des commandes &lt;code&gt;docker&lt;/code&gt; pour créer des images,&lt;/li&gt;
&lt;li&gt;mais la plupart des Gitlab Runner exécutent les étapes de Gitlab CI dans un Docker,&lt;/li&gt;
&lt;li&gt;donc on se retrouve à vouloir exécuter des commandes &lt;code&gt;docker&lt;/code&gt; dans un environnement Docker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous voyez le problème ?&lt;/p&gt;
&lt;p&gt;Pour contourner cette situation il suffit d&amp;rsquo;&lt;strong&gt;utiliser &lt;a href=&#34;https://docs.gitlab.com/ci/docker/using_docker_build/#use-docker-in-docker&#34; title=&#34;Se rendre sur la documentation officielle de Gitlab CI au sujet de Docker-in-Docker&#34;&gt;Docker-in-Docker&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En somme le début du fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; ressemblera à :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;variables&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;DOCKER_VERSION&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;27.4.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker:$DOCKER_VERSION&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- docker:$DOCKER_VERSION-dind&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;sidentifier&#34;&gt;S&amp;rsquo;identifier&lt;/h2&gt;
&lt;p&gt;Pour utiliser les dépôts de conteneurs de Gitlab, rien de plus simple il suffit d&amp;rsquo;écrire le code suivant dans le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;before_script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- docker info&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- echo &amp;#34;$CI_REGISTRY_PASSWORD&amp;#34; | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nul besoin de renseigner les variables. Elles sont renseignées par Gitlab CI.&lt;/p&gt;
&lt;h2 id=&#34;construire-limage&#34;&gt;Construire l&amp;rsquo;image&lt;/h2&gt;
&lt;p&gt;Pour construire l&amp;rsquo;image cela va ressembler à :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;variables&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;CONTAINER_TEST_IMAGE&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;build-image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;stage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker pull &amp;#34;$CONTAINER_TEST_IMAGE&amp;#34; || true&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t $CONTAINER_TEST_IMAGE .&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker push $CONTAINER_TEST_IMAGE&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On part du principe que &lt;strong&gt;le fichier Dockerfile est situé à la racine&lt;/strong&gt; de votre projet Gitlab.&lt;/p&gt;
&lt;p&gt;CONTAINER_TEST_IMAGE est une variable &lt;strong&gt;globale&lt;/strong&gt; construite à partir des &lt;a href=&#34;https://docs.gitlab.com/ci/variables/predefined_variables/&#34; title=&#34;En savoir plus sur les variables pré-définies de Gitlab CI dans la documentation officielle de Gitlab&#34;&gt;&lt;strong&gt;variables pré-définies&lt;/strong&gt; de Gitlab CI&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;pousser-limage-sur-le-dépôt&#34;&gt;Pousser l&amp;rsquo;image sur le dépôt&lt;/h2&gt;
&lt;p&gt;Dans cette situation nous sommes contents d&amp;rsquo;avoir déjà ajouté l&amp;rsquo;authentification aux dépôts de conteneurs Gitlab.&lt;/p&gt;
&lt;p&gt;Cette fois on fait une étape pour récupérer l&amp;rsquo;image précédente et lui donner un nouveau nom :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;push-image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;stage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;push&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- export IMAGE_TAG=&amp;#34;$(date +&amp;#39;%Y%m%d&amp;#39;)-${CI_COMMIT_SHORT_SHA}&amp;#34;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker pull $CONTAINER_TEST_IMAGE&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker tag $CONTAINER_TEST_IMAGE $CI_REGISTRY_IMAGE:$IMAGE_TAG&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;if&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$CI_COMMIT_BRANCH == &amp;#34;main&amp;#34;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;idée est :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;de &lt;strong&gt;créer un nom de tag&lt;/strong&gt; pour l&amp;rsquo;image (variable IMAGE_TAG),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;récupérer l&amp;rsquo;image précédente&lt;/strong&gt; - puisque les étapes d&amp;rsquo;un fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; s&amp;rsquo;exécutent dans des conteneurs isolés les uns des autres,&lt;/li&gt;
&lt;li&gt;apposer un &lt;strong&gt;nouveau tag&lt;/strong&gt; sur l&amp;rsquo;image récupérée,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;publier le résultat&lt;/strong&gt; en poussant l&amp;rsquo;image ainsi étiquetée.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceci ne s&amp;rsquo;exécute que si la branche est nommée &lt;strong&gt;main&lt;/strong&gt;. Donc chaque commit sur cette branche générera une image Docker et un tag.&lt;/p&gt;
&lt;h2 id=&#34;ordre-dexécution-des-étapes&#34;&gt;Ordre d&amp;rsquo;exécution des étapes&lt;/h2&gt;
&lt;p&gt;Afin que les deux étapes précédentes s&amp;rsquo;exécutent dans un certain ordre, &lt;strong&gt;ne pas oublier les lignes suivantes&lt;/strong&gt; dans le fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;stages&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- push&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;comme-si-ça-ne-suffisait-pas&#34;&gt;Comme si ça ne suffisait pas…&lt;/h2&gt;
&lt;p&gt;En outre, voici d&amp;rsquo;&lt;strong&gt;autres éléments à rajouter&lt;/strong&gt; dans son fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;variables&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;DOCKER_HOST&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tcp://docker:2376&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/certs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ces lignes permettent de renseigner un &lt;strong&gt;autre accès à l&amp;rsquo;API Docker&lt;/strong&gt; pour lancer les commandes &lt;code&gt;docker&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&#34;les-composants-réutilisables&#34;&gt;Les composants réutilisables&lt;/h1&gt;
&lt;p&gt;Gitlab CI offre la possibilité d&amp;rsquo;utiliser des &lt;a href=&#34;https://docs.gitlab.com/ci/components/&#34;&gt;&lt;strong&gt;composants réutilisables&lt;/strong&gt;&lt;/a&gt; pour agrémenter les étapes de son fichier &lt;em&gt;.gitlab-ci.yml&lt;/em&gt;. Ceci évite de réinventer la roue (en codant soi-même).&lt;/p&gt;
&lt;p&gt;Plusieurs composants sont disponibles sur la &lt;a href=&#34;https://gitlab.com/components&#34;&gt;page Gitlab components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Exemple d&amp;rsquo;utilisation d&amp;rsquo;un composant :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;include&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#062873;font-weight:bold&#34;&gt;component&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gitlab.com/components/container-scanning/container-scanning@5.1.0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est très utile dans certaines situations comme pour tester des fichiers Terraform (avec &lt;a href=&#34;https://gitlab.com/components/opentofu&#34;&gt;le composant OpenTofu&lt;/a&gt;), &lt;a href=&#34;https://gitlab.com/components/go&#34;&gt;le composant Go&lt;/a&gt;, &lt;a href=&#34;https://gitlab.com/components/go&#34;&gt;le composant Rust&lt;/a&gt; ou même utiliser les &lt;a href=&#34;https://gitlab.com/components/autodevops&#34;&gt;fonctionnalités Autodevops de Gitlab&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Au premier abord Gitlab CI paraît complexe et maigre en fonctionnalités. Cependant la lecture de la &lt;strong&gt;documentation (très fournie&lt;/strong&gt; !) donne rapidement un aperçu bien plus avantageux de cet outil. On y découvre les composants réutilisables, les mots clés &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;variables&lt;/code&gt;, &lt;code&gt;before_script&lt;/code&gt;, les artefacts (sorties), les variables globales, le déploiement de sites statiques et j&amp;rsquo;en passe !&lt;/p&gt;
&lt;p&gt;Certaines difficultés telles que Docker viennent s&amp;rsquo;immiscer dans nos essais. Mais &lt;strong&gt;une fois les obstacles franchis c&amp;rsquo;est un outil très satisfaisant&lt;/strong&gt;. Je l&amp;rsquo;apprécie.&lt;/p&gt;
&lt;p&gt;Je serais ravi de tomber plus souvent sur des articles décrivant ses fonctionnalités. J&amp;rsquo;espère participer à une diffusion plus grande de la connaissance Gitlab CI et, qui sait, peut-être partagerais-je prochainement d&amp;rsquo;autres astuces ?&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
