<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Web sur Olivier DOSSMANN</title>
    <link>https://olivier.dossmann.net/tags/web/</link>
    <description>Contenu récent dans Web sur Olivier DOSSMANN</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fr</language>
    <copyright>© 2005-2026 Olivier DOSSMANN</copyright>
    <lastBuildDate>Tue, 28 Apr 2026 18:18:10 +0200</lastBuildDate><atom:link href="https://olivier.dossmann.net/tags/web/index.xml" rel="self" type="application/rss+xml" />
    <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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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>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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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>
    
    <item>
	    <title>Bye Bye Gandi Mail, Bonjour Mailo</title>
      <link>https://olivier.dossmann.net/2023/08/bye-bye-gandi-mail-bonjour-mailo/</link>
      <pubDate>Fri, 25 Aug 2023 21:26:05 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2023/08/bye-bye-gandi-mail-bonjour-mailo/</guid>
      <description>&lt;p&gt;Ça fait &lt;a href=&#34;https://sebsauvage.net/links/?o9qvaA&#34;&gt;quelques mois qu&amp;rsquo;on nous rabache que Gandi Mail va devenir payant&lt;/a&gt;. &lt;a href=&#34;https://www.nextinpact.com/article/71947/gandi-passe-mails-en-payant-utilisateurs-cherchent-solutions-remplacement&#34;&gt;NextInpact affirme aussi que Gandi passe les mails en payant&lt;/a&gt;. Quel problème cela pose ? Où en suis-je ? Y a-t-il d&amp;rsquo;autres alternatives à cela ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/boites_aux_lettres.jpg&#34; alt=&#34;Trois boîtes aux lettres en forme de maison&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://flickr.com/photos/irio/&#34;&gt;profil d&amp;rsquo;irio sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence BY 2.0.&lt;/p&gt;
&lt;h1 id=&#34;problèmes-posés&#34;&gt;Problèmes posés&lt;/h1&gt;
&lt;p&gt;Gandi annonce la mise du service Gandi Mail payant à partir de fin septembre/début octobre. Le prix des boîtes mail passe &lt;strong&gt;de gratuit à 4.79€ par mois&lt;/strong&gt;. C&amp;rsquo;est à dire &lt;strong&gt;57.48€/an&lt;/strong&gt;. Et cela &lt;strong&gt;pour chaque boîte courriel !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le souci ? Quand on utilise plusieurs boîtes courriel, ça douille tout de suite plus ! Exemple : j&amp;rsquo;ai 4 boîtes courriel utilisées chez Gandi, &lt;strong&gt;ce qui me ferait passer de 0€/an à… 229.92€&lt;/strong&gt; !!&lt;/p&gt;
&lt;p&gt;Avouez que &lt;strong&gt;la facture est plutôt corsée&lt;/strong&gt; quand on a été habitué plus de 10 ans à ne rien débourser pour cela. Et encore, j&amp;rsquo;abuse un peu car il faut savoir que les domaines sous Gandi sont généralement plus chers que d&amp;rsquo;autres fournisseurs de domaines. Les adresses courriel gratuites et de bonne qualité amenait des clients chez Gandi.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;utilise Gandi pour l&amp;rsquo;ensemble de mes domaines car j&amp;rsquo;apprécie le service, les possibilités (comme le « Live DNS ») et - antérieurement - la possibilité de créer des adresses courriels avec 1 000 alias de redirection courriels (vous choisissez des adresses courriels qui vont rediriger vers 1 à plusieurs adresses courriels, même si les adresses cibles ne vous appartiennent pas).&lt;/p&gt;
&lt;p&gt;Et dans tout cela, où me situe-je ?&lt;/p&gt;
&lt;h1 id=&#34;où-jen-suis&#34;&gt;Où j&amp;rsquo;en suis&lt;/h1&gt;
&lt;p&gt;Si j&amp;rsquo;écris cet article, c&amp;rsquo;est parce que &lt;strong&gt;j&amp;rsquo;aimerais partager à la fois le fait qu&amp;rsquo;il y a du changement chez Gandi Mail, mais aussi mes pérégrinations en matière de recherche d&amp;rsquo;un fournisseur de mail&lt;/strong&gt; prenant en compte les noms de domaine sans forcément les gérer.&lt;/p&gt;
&lt;p&gt;On le dit souvent, en informatique il est intéressant de pouvoir changer un service sans avoir d&amp;rsquo;impact sur un autre : choisir un fournisseur d&amp;rsquo;adresses courriels sans changer de fournisseur de domaine par exemple. Et c&amp;rsquo;est ce que je visais.&lt;/p&gt;
&lt;h1 id=&#34;quelles-alternatives-&#34;&gt;Quelles alternatives ?&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://sebsauvage.net/links/?o9qvaA&#34;&gt;Si SebSauvage propose Infomaniak&lt;/a&gt; en migrant ses domaines là bas, d&amp;rsquo;&lt;a href=&#34;https://ludovic.hirlimann.net/2023/06/gandi-je-suis-enerve-la-partie-email.html&#34;&gt;autres proposent différents services comme FastMail, Ikoula&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La plupart du temps, il faut migrer ses domaines avec : ce que je ne recherche pas du tout. C&amp;rsquo;est le cas pour &lt;a href=&#34;https://www.ovhcloud.com/fr/&#34;&gt;OVH&lt;/a&gt; qui propose des offres quand on gère les domaines chez eux.&lt;/p&gt;
&lt;p&gt;Je suis alors tombé sur &lt;a href=&#34;https://jtremesay.org/migration-de-gandi-mail-vers-mailo.html&#34;&gt;un article intéressant sur le passage à Mailo.com&lt;/a&gt;, service que je ne connaissais pas. &lt;a href=&#34;https://www.mailo.com/&#34;&gt;Mailo.com&lt;/a&gt; est Français, garantit aux utilisateurs d&amp;rsquo;être respectueux de leurs données, ne pas les vendre à des tiers et visant une utilisation éthique et responsable du Web. Le service &lt;strong&gt;Mailo est gratuit, mais une option à 2€/mois existe&lt;/strong&gt;, ce qui permet de gérer 5 adresses mails. Ça tombe bien, j&amp;rsquo;ai 4 adresses à créer !&lt;/p&gt;
&lt;h1 id=&#34;quelques-détails-sur-ma-migration&#34;&gt;Quelques détails sur ma migration&lt;/h1&gt;
&lt;p&gt;Ce qui est intéressant dans ce dernier article sur Mailo.com, c&amp;rsquo;est que l&amp;rsquo;auteur suggère &lt;strong&gt;l&amp;rsquo;utilisation d&amp;rsquo;imapsync&lt;/strong&gt; comme outil pour synchroniser son ancienne boîte aux lettres avec la nouvelle. Et il donne les détails sur comment configurer tout cela.&lt;/p&gt;
&lt;p&gt;À noter une petite subtilité que je n&amp;rsquo;avais pas prise en compte : si sous Gandi Mail vous avez droit à 1 000 redirections courriel, sous Mailo c&amp;rsquo;est limité à 100 redirection par boîte courriel. Quand on a 390+ redirections… il faut faire du tri ! Fort heuresement, Mailo propose un fonctionnement intéressant : ajouter &lt;code&gt;++&lt;/code&gt; dans l&amp;rsquo;adresse courriel. Par exemple si vous faites une boîte &lt;a href=&#34;mailto:prenom.nom@domaine.tld&#34;&gt;prenom.nom@domaine.tld&lt;/a&gt;, vous pouvez créer dynamiquement &lt;a href=&#34;mailto:prenom.nom++quelquechose@domaine.tld&#34;&gt;prenom.nom++quelquechose@domaine.tld&lt;/a&gt;. Autant que vous voulez. Sans utiliser d&amp;rsquo;ordinateur. À la volée je vous disais !&lt;/p&gt;
&lt;p&gt;Autre chose à viser aussi : le catch-all. C&amp;rsquo;est le fait que n&amp;rsquo;importe quelle adresse mal écrite, ou différente de votre boîte courriel entraînera quand même la redirection vers votre boîte courriel. Exemple : au lieu d&amp;rsquo;écrire &lt;a href=&#34;mailto:prenom.nom@domaine.tld&#34;&gt;prenom.nom@domaine.tld&lt;/a&gt;, si je me trompe en écrivant &lt;a href=&#34;mailto:prenmo.nmo@domaine.tld&#34;&gt;prenmo.nmo@domaine.tld&lt;/a&gt;, je recevrais quand même l&amp;rsquo;adresse courriel.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Je joue les montagnes russes avec les prix : je suis passé de 4 boîtes Gandi Mail gratuites à potentiellement 230€/an pour finalement payer 24€/an. Le coût numérique augmente légèrement. Je pense être en droit de me demander jusqu&amp;rsquo;où cela ira pour bénéficier d&amp;rsquo;un pseudo contrôle de mes données et le choix de mes fournisseurs sur Internet ?&lt;/p&gt;
&lt;p&gt;Quoiqu&amp;rsquo;il en soit le passage de Gandi Mail à Mailo, même si rocambolesque et pas de tout repos, a été plus serein avec l&amp;rsquo;aide de l&amp;rsquo;&lt;a href=&#34;https://jtremesay.org/migration-de-gandi-mail-vers-mailo.html&#34;&gt;article de Jonathan Tremesaygues sur le passage de Gandi Mail à Mailo à l&amp;rsquo;aide d&amp;rsquo;imapsync&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je trie encore mes 390+ redirections Gandi Mail vers Mailo au fur et à mesure, mais c&amp;rsquo;était nécessaire et je suis bien content de l&amp;rsquo;avoir fait, malgré le côté payant de la chose !&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.infomaniak.com/fr&#34;&gt;Infomaniak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fastmail.com/&#34;&gt;FastMail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ikoula.com/fr/&#34;&gt;Ikoula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ovhcloud.com/fr/&#34;&gt;OVH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.mailo.com/&#34;&gt;Mailo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jtremesay.org/migration-de-gandi-mail-vers-mailo.html&#34;&gt;Article de Jonathan Tremesaygues sur le passage de Gandi Mail à Mailo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>La Gachette qui publie mon blog</title>
      <link>https://olivier.dossmann.net/2023/01/la-gachette-qui-publie-mon-blog/</link>
      <pubDate>Fri, 20 Jan 2023 17:46:32 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2023/01/la-gachette-qui-publie-mon-blog/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Peut-être serez-vous surpris d&amp;rsquo;apprendre que la publication d&amp;rsquo;un article sur ce blog revient simplement à écrire du texte dans un fichier et &lt;a href=&#34;https://fr.wikipedia.org/wiki/Commit&#34;&gt;envoyer un commit&lt;/a&gt; sur un dépôt Git. &lt;strong&gt;Ni plus, ni moins&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est là que commence toute une &lt;strong&gt;chaîne de publication&lt;/strong&gt; afin de mettre à disposition le fameux article sur le Web ! Pour cela j&amp;rsquo;ai utilisé très peu d&amp;rsquo;outils et un peu d&amp;rsquo;imagination.&lt;/p&gt;
&lt;p&gt;Le but du présent article est de &lt;strong&gt;vous présenter l&amp;rsquo;outil de la chaîne que j&amp;rsquo;ai dû développer pour mener à bien ce projet : &lt;a href=&#34;https://github.com/blankoworld/gachette&#34;&gt;Gachette&lt;/a&gt;&lt;/strong&gt;. Puis de vous décrire comment le mettre en place.&lt;/p&gt;
&lt;p&gt;Mais avant tout commençons à planter le décor !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/goutte.jpg&#34; alt=&#34;Phénomène de goutte qui remonte après être tombé dans l&amp;rsquo;eau&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://flickr.com/photos/nikkvalentine/&#34;&gt;profil de Nikk sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence CC BY 2.0.&lt;/p&gt;
&lt;h1 id=&#34;plantons-le-décor-avec-lhistoire-logicielle-de-ce-blog&#34;&gt;Plantons le décor avec l&amp;rsquo;Histoire logicielle de ce blog&lt;/h1&gt;
&lt;p&gt;(je comprendrais que ce chapitre ne soit pas très enthousiasmant pour vous, si c&amp;rsquo;est le cas, passez au suivant &amp;#x1f609;)&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 je vous parlais d&amp;rsquo;Hugo, le moteur de blog statique&lt;/a&gt; que j&amp;rsquo;utilise pour « confectionner » ce blog. Outil très intéressant qui &lt;strong&gt;utilise de simples fichiers pour générer un site web entier&lt;/strong&gt;, statique ; c&amp;rsquo;est à dire en pur HTML et ne demandant aucune autre ressource finale qu&amp;rsquo;un serveur Web tel qu&amp;rsquo;Apache2, nginx, lighttpd, Caddy Server et j&amp;rsquo;en passe… Dans ma situation, le serveur Web en question est Nginx depuis 2013 environ - mais qu&amp;rsquo;importe.&lt;/p&gt;
&lt;p&gt;Afin de garder en mémoire les travaux effectués, &lt;a href=&#34;https://olivier.dossmann.net/2017/04/gitea-service-git-sans-prise-de-t%C3%AAte-issu-de-gogs/&#34;&gt;je vous partageais en 2017 l&amp;rsquo;outil Gitea, service Git sans prise de tête issu de Gogs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;À cette époque (entre 2016 et 2019/2020), pour publier mon blog il me faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(manuel) écrire l&amp;rsquo;article dans &lt;strong&gt;un fichier texte&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(manuel) (facultatif) l&amp;rsquo;enregistrer sous Git avec &lt;strong&gt;un commit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(manuel) (facultatif) &lt;strong&gt;envoyer&lt;/strong&gt; l&amp;rsquo;article &lt;strong&gt;sur Gitea&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(manuel) &lt;strong&gt;compiler le site&lt;/strong&gt; à l&amp;rsquo;aide de la commande &lt;code&gt;hugo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(manuel) &lt;strong&gt;synchroniser les fichiers résultants&lt;/strong&gt; sur mon serveur doté de Nginx, par exemple avec une commande &lt;code&gt;rsync&lt;/code&gt; simple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À force de &lt;a href=&#34;https://olivier.dossmann.net/2016/02/fosdem-2016/&#34;&gt;traîner à FOSDEM en 2016&lt;/a&gt; et &lt;a href=&#34;https://olivier.dossmann.net/2017/02/fosdem-2017-rencontre-avec-des-aliens/&#34;&gt;en 2017&lt;/a&gt;, j&amp;rsquo;ai non seulement appris que l&amp;rsquo;informatique sert à automatiser des tâches mais qu&amp;rsquo;il est aussi possible de le faire de manière « simple ».&lt;/p&gt;
&lt;p&gt;Je me renseigne et j&amp;rsquo;apprends que sous Gitlab, Github et Gitea (plateformes que j&amp;rsquo;utilise à l&amp;rsquo;époque), il existe un &lt;a href=&#34;https://blog.hubspot.fr/website/webhook&#34;&gt;système de webhooks&lt;/a&gt;. Qu&amp;rsquo;est-ce à dire ? Grossomodo je peux configurer ces plateformes pour qu&amp;rsquo;à &lt;strong&gt;chaque envoi de mon travail peut résulter un appel à une adresse Web&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il suffit ensuite, à l&amp;rsquo;adresse appelée, de &lt;strong&gt;pouvoir étudier la requête envoyée et d&amp;rsquo;agir en conséquence&lt;/strong&gt; (par exemple déployer un site).&lt;/p&gt;
&lt;p&gt;Sur le papier ça a l&amp;rsquo;air fun :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(manuel) j&amp;rsquo;écris mon article dans &lt;strong&gt;un fichier texte&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(manuel) je &lt;strong&gt;commite et pousse sur Gitea/Github/Gitlab&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(automatique) la plateforme de réception &lt;strong&gt;envoie un appel&lt;/strong&gt; à un de mes serveurs&lt;/li&gt;
&lt;li&gt;(automatique) un de mes serveurs reçevant l&amp;rsquo;appel &lt;strong&gt;lance un script&lt;/strong&gt; ou une action &lt;strong&gt;pour publier&lt;/strong&gt; les dernières nouveautés&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parfait on se lance là dedans !&lt;/p&gt;
&lt;h1 id=&#34;la-naissance-de-gachette&#34;&gt;La naissance de Gachette&lt;/h1&gt;
&lt;p&gt;En 2019 où j&amp;rsquo;étudiais la question, je ne trouvais pas de serveur simple et léger qui puisse supporter les appels envoyés par Github, Gitlab et Gitea. &lt;strong&gt;Hors de question d&amp;rsquo;avoir 3 serveurs de webhooks différents sur mes machines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme j&amp;rsquo;ai cru comprendre être ingénieur logiciel au travail &amp;#x1f923;, je me suis dit pouvoir l&amp;rsquo;être aussi à la maison sur mon temps personnel. À l&amp;rsquo;époque je m&amp;rsquo;amusais un peu avec le &lt;a href=&#34;https://crystal-lang.org/&#34;&gt;langage Crystal&lt;/a&gt; avec des amis, c&amp;rsquo;était l&amp;rsquo;occasion.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ainsi qu&amp;rsquo;est né &lt;a href=&#34;https://github.com/blankoworld/gachette&#34;&gt;Gachette&lt;/a&gt;, un serveur de webhooks sous Licence MIT en &lt;a href=&#34;https://crystal-lang.org/&#34;&gt;Crystal&lt;/a&gt; (une syntaxe comme Ruby, mais compilé) qui supporte les plateformes Github, Gitlab et Gitea.&lt;/p&gt;
&lt;p&gt;Sous ce langage, il existe quelques &lt;a href=&#34;https://fr.wikipedia.org/wiki/Framework&#34;&gt;frameworks&lt;/a&gt;, dont &lt;a href=&#34;https://kemalcr.com/&#34;&gt;Kemal, un framework web minimaliste&lt;/a&gt; qui permet d&amp;rsquo;ouvrir quelques routes très facilement. C&amp;rsquo;est ce que j&amp;rsquo;ai utilisé pour créer &lt;a href=&#34;https://github.com/blankoworld/gachette/releases/tag/0.1&#34;&gt;la première version 0.1 de Gachette en 2019&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;À tout casser on doit être à 100 lignes de code. Bref. À aujourd&amp;rsquo;hui, plutôt 200+ lignes de code Crystal.&lt;/p&gt;
&lt;p&gt;Voyons les particularités de mise en place de Gachette.&lt;/p&gt;
&lt;h1 id=&#34;mise-en-place-de-gachette-sur-un-serveur&#34;&gt;Mise en place de Gachette sur un serveur&lt;/h1&gt;
&lt;p&gt;Je ne vais pas reproduire &lt;a href=&#34;https://github.com/blankoworld/gachette/blob/master/README.md#installation&#34;&gt;ce que le fichier README de Gachette énonce si bien pour l&amp;rsquo;installation&lt;/a&gt;, cependant je peux vous faire un résumé rapide de l&amp;rsquo;installation/configuration :&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;&#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;# On récupère le projet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/blankoworld/gachette.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; gachette
&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;# Pré-requis : Crystal, Shards et make doivent être installés&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;shards install
&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;# On compile le logiciel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À l&amp;rsquo;issue de ces commandes devrait apparaître un fichier &lt;strong&gt;bin/gachette&lt;/strong&gt; qui est un exécutable utilisable tel quel.&lt;/p&gt;
&lt;p&gt;On le place où on veut, par exemple dans &lt;strong&gt;/srv/www/gachette/gachette&lt;/strong&gt; puis on édite le fichier &lt;strong&gt;/etc/systemd/system/gachette.service&lt;/strong&gt; dont le contenu est le 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;&#34;&gt;&lt;code class=&#34;language-service&#34; data-lang=&#34;service&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Gachette webhooks service&lt;/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;After&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;network.target&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;font-weight:bold&#34;&gt;[Service]&lt;/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;Type&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;simple&lt;/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;User&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;WorkingDirectory&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/srv/www/gachette&lt;/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;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/srv/www/gachette/gachette -c /etc/gachette.ini -b 0.0.0.0 -p 3000&lt;/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;Environment&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;KEMAL_ENV=production&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&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;always&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;font-weight:bold&#34;&gt;[Install]&lt;/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;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À noter qu&amp;rsquo;il faut adapter &lt;strong&gt;User=http&lt;/strong&gt; par l&amp;rsquo;utilisateur de votre système d&amp;rsquo;exploitation, par exemple sous Debian c&amp;rsquo;est &lt;em&gt;User=www-data&lt;/em&gt;. Mais également le port utilisé, ici c&amp;rsquo;est le port &lt;strong&gt;3000&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite créez le fichier &lt;strong&gt;/etc/gachette.ini&lt;/strong&gt; avec un contenu qui va décrire les dépôts/projets qui vont contacter le serveur webhooks et déclencher une action. Imaginons que le projet Gachette, sur Github, à l&amp;rsquo;adresse &lt;a href=&#34;https://github.com/blankoworld/gachette&#34;&gt;https://github.com/blankoworld/gachette&lt;/a&gt; veuille qu&amp;rsquo;à chaque commit nous exécutions le contenu du script &lt;em&gt;/srv/www/gachette/deploiement.sh&lt;/em&gt;, nous allons écrire :&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;&#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;# contenu du fichier /etc/gachette.ini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt;Un_nom_au_hasard&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:#bb60d5&#34;&gt;service&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; github
&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;namespace&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; blankoworld/gachette
&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;key&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; monMot2Passe
&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;scriptfile&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; /srv/www/gachette/deploiement.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois la configuration faite, le service installé, vous pouvez faire en tant qu&amp;rsquo;utilisateur root :&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;&#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;# pour lancer le service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start gachette.service
&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;# pour voir l&amp;#39;état du service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status gachette.service
&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;# pour lancer le service à chaque redémarrage : &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; gachette.service
&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;# pour suivre ce qu&amp;#39;il se passe dans Gachette : &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;journalctl -xe -f -u gachette.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tout résidera ensuite dans &lt;strong&gt;votre capacité à créer des scripts qui feront le travail de déploiement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans ma situation, pour le présent blog, j&amp;rsquo;ai un script qui :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;récupère la dernière version du dépôt Git du blog&lt;/li&gt;
&lt;li&gt;compile le site pour générer les fichiers statiques&lt;/li&gt;
&lt;li&gt;synchronise le résultat - si réussi - vers un dossier particulier&lt;/li&gt;
&lt;li&gt;relance le serveur Web avec les nouveaux fichiers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Suite à &lt;a href=&#34;https://olivier.dossmann.net/2022/12/utilisation-de-tr%C3%A6fik-pour-publier-ses-conteneurs-docker/&#34;&gt;mon dernier article sur Træfik pour publier ses conteneurs Docker&lt;/a&gt;, je me suis même essayé à l&amp;rsquo;utilisation de conteneurs Docker pour isoler les environnements, voire même à avoir des images Docker communes pour l&amp;rsquo;ensemble des sites Web statiques : très pratique !&lt;/p&gt;
&lt;p&gt;On s&amp;rsquo;amuse bien par ici en somme &amp;#x1f609;.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Bien que certains jugerons ma chaîne de publication assez alambiquée, utilisant des outils peu communs, voire pas du tout utilisés (Gachette notamment), ce système a déjà fait ses preuves et tourne bien : moins d&amp;rsquo;une minute après avoir enregistré un article, il est publié sur le web sans action humaine.&lt;/p&gt;
&lt;p&gt;Il n&amp;rsquo;y a pour cela que 3 outils simples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gitea comme dépôt Git ; qui déclenche une demande auprès d&amp;rsquo;un serveur distant (ici Gachette)&lt;/li&gt;
&lt;li&gt;Gachette qui reçoit la demande et lance un script de compilation/déploiement/traitement (bref, une action est menée)&lt;/li&gt;
&lt;li&gt;Nginx comme serveur Web pour diffuser les pages statiques ainsi générées&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;utilisation de Docker en sus améliore le côté réutilisable des outils : pour plusieurs sites statiques j&amp;rsquo;utilise la même image qui va compiler les fichiers puis les mettre à disposition sur le net.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La difficulté réside cependant à notre capacité à créer des scripts&lt;/strong&gt; pour lancer les différentes actions sur le serveur. La ligne de commande et Bash sont de fidèles alliés !&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://docs.github.com/fr/webhooks-and-events/webhooks/creating-webhooks&#34;&gt;Configurer un Webhook sur Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#configure-a-webhook-in-gitlab&#34;&gt;Configure a webhook in Gitlab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitea.io/en-us/usage/webhooks/&#34;&gt;Gitea Webhooks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Utilisation de træfik pour publier ses conteneurs Docker</title>
      <link>https://olivier.dossmann.net/2022/12/utilisation-de-tr%C3%A6fik-pour-publier-ses-conteneurs-docker/</link>
      <pubDate>Wed, 07 Dec 2022 07:16:11 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2022/12/utilisation-de-tr%C3%A6fik-pour-publier-ses-conteneurs-docker/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a 8 ans &lt;a href=&#34;https://olivier.dossmann.net/2014/04/voici-docker-plus-l%C3%A9ger-et-plus-simple-quune-machine-virtuelle/&#34;&gt;je vous faisais découvrir Docker&lt;/a&gt;. À l&amp;rsquo;époque je ne savais pas encore à quel point cet outil très controversé serait utilisé !&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.docker.com/&#34;&gt;Docker&lt;/a&gt; est quasiment devenu un standard. Qu&amp;rsquo;on le veuille ou non il arrive souvent qu&amp;rsquo;on ait un conteneur Docker à lancer. On finit toujours par devoir lire la &lt;a href=&#34;https://docs.docker.com/get-started/&#34;&gt;documentation de Docker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Avant de continuer sur la problématique du présent article, je tiens à vous signaler qu&amp;rsquo;il est important de savoir un minimum jouer avec les fichiers &lt;strong&gt;docker-compose.yml&lt;/strong&gt;. Cas échéant je crains que cet article ne vous soit d&amp;rsquo;aucune autre utilité que nourrir votre curiosité.&lt;/p&gt;
&lt;p&gt;Ainsi, un problème qui survient fréquemment quand on a crée nos images, nos conteneurs puis que nous lançons ces derniers : comment publier nos conteneurs afin qu&amp;rsquo;ils soient disponibles sur Internet ? En général la solution est d&amp;rsquo;utiliser un proxy (par exemple &lt;a href=&#34;https://nginx.org/en/docs/&#34;&gt;Nginx&lt;/a&gt;) qui va étudier les requêtes HTTP demandées sur le serveur puis rediriger vers le port choisi d&amp;rsquo;un conteneur Docker qu&amp;rsquo;on a lancé.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logos/traefik.png&#34; alt=&#34;Image du logo de Traefik&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dans cet article je vais rapidement expliquer pourquoi le choix de &lt;a href=&#34;https://traefik.io/&#34;&gt;Træfik&lt;/a&gt; plutôt que Nginx que j&amp;rsquo;utilisais avant ça. Ensuite j&amp;rsquo;expliquerai les configurations utilisées pour mettre à disposition nos conteneurs. Nous aborderons rapidement quelques points pour aller plus loin et finirons par une conclusion.&lt;/p&gt;
&lt;h1 id=&#34;choix-du-proxy&#34;&gt;Choix du proxy&lt;/h1&gt;
&lt;p&gt;Habituellement, pour mettre en place l&amp;rsquo;accès à des sites web que j&amp;rsquo;héberge, j&amp;rsquo;utilisais &lt;a href=&#34;https://httpd.apache.org/&#34;&gt;Apache&lt;/a&gt;, &lt;a href=&#34;https://www.nginx.com/&#34;&gt;Nginx&lt;/a&gt; ou encore &lt;a href=&#34;https://caddyserver.com/&#34;&gt;Caddy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cependant il y avait pas mal de contraintes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;chaque nouveau domaine demandait une configuration spécifique avec un fichier spécifique, des dossiers spécifiques,&lt;/li&gt;
&lt;li&gt;pour avoir un certificat SSL par &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt;, il fallait parfois user d&amp;rsquo;intelligence, même une fois qu&amp;rsquo;on utilise &lt;a href=&#34;https://certbot.eff.org/&#34;&gt;Certbot&lt;/a&gt;, notamment pour redémarrer le serveur Web une fois les certificats renouvelés,&lt;/li&gt;
&lt;li&gt;quand on lançait un conteneur Docker, il valait mieux choisir un port spécifique, par exemple 8081, puis recopier ce nombre &lt;strong&gt;en dur&lt;/strong&gt; dans la configuration du serveur Web (Nginx dans mon cas) et je ne suis pas le plus imaginatif pour les numéros de ports qui se cumulaient…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qui est assez pénible. Très consommateur de temps.&lt;/p&gt;
&lt;p&gt;Étant donné que nous utilisons déjà les possibilités de Docker et Docker Compose, autant continuer en utilisant un outil ayant un backend avec Docker, non ?&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est là que Træfik entre en jeu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il permet &lt;strong&gt;avec quelques lignes dans vos fichiers docker-compose.yml&lt;/strong&gt; de &lt;strong&gt;définir le domaine à utiliser&lt;/strong&gt; pour tel ou tel conteneur Docker&lt;/li&gt;
&lt;li&gt;il s&amp;rsquo;occupe de &lt;strong&gt;faire la demande de certificat Let&amp;rsquo;s Encrypt et le renouvellement&lt;/strong&gt; de ces derniers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;le lancement d&amp;rsquo;un conteneur Docker ne demande pas de relancer Træfik&lt;/strong&gt;, il y a une détection automatique des configurations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;on laisse les ports choisis par Docker pour nos conteneurs&lt;/strong&gt;, ce qui nous évite d&amp;rsquo;en faire une gestion&lt;/li&gt;
&lt;li&gt;étant codé en Go (tout comme Docker et Docker Compose), Træfik fait partie du même monde, il est donc aussi rapide et compatible avec les outils utilisés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pas besoin d&amp;rsquo;installer Træfik&lt;/strong&gt; : il sera un conteneur Docker comme le reste des services de la machine &amp;#x1f603;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au final ce sont les contraintes des serveurs Web dont j&amp;rsquo;ai eu l&amp;rsquo;usage qui m&amp;rsquo;ont convaincu d&amp;rsquo;essayer Træfik. Voyons donc à quoi cela ressemble !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; : Træfik ne résoud pas tous les problèmes du monde. Il va falloir expérimenter, recommencer plusieurs fois, plier son cerveau pour saisir de quoi il retourne. Parfois demander de l&amp;rsquo;aide. C&amp;rsquo;est un processus d&amp;rsquo;apprentissage qui en vaut la peine cependant !&lt;/p&gt;
&lt;h1 id=&#34;configuration-de-træfik&#34;&gt;Configuration de træfik&lt;/h1&gt;
&lt;p&gt;Pour mettre en place Træfik nous allons procéder comme la &lt;a href=&#34;https://doc.traefik.io/traefik/&#34;&gt;documentation de Træfik Proxy&lt;/a&gt; le propose :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;faire un &lt;strong&gt;docker-compose.yml&lt;/strong&gt; pour décrire notre service Træfik&lt;/li&gt;
&lt;li&gt;utiliser un fichier de configuration externe pour configurer le service : le fichier &lt;strong&gt;traefik.yml&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;demander à exposer les ports 80 et 443&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour cela, voici le fichier &lt;strong&gt;docker-compose.yml&lt;/strong&gt; pour lancer le service Træfik :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-docker-compose&#34; data-lang=&#34;docker-compose&#34;&gt;version: &amp;#39;3&amp;#39;

services:
    proxy:
      image: traefik:v2.8
      restart: always
      ports:
      	- 80:80
        - 443:443
      volumes:
        # pour que Træfik écoute les événements Docker : à adapter chez vous
        - /var/run/docker.sock:/var/run/docker.sock
        # Utilisation d&amp;#39;un fichier de configuration
        - ${PWD}/traefik.yml:/etc/traefik/traefik.yml
        # Mémorisation des certificats TLS (par Let&amp;#39;s Encrypt)
        - ${PWD}/acme.json:/acme.json
      labels:
        # Activation du tls
        - &amp;#34;traefik.http.routers.api.tls&amp;#34;
        # nawak, pour que les logs la boucle sur service error: port is missing
        - &amp;#34;traefik.http.services.nawak.loadbalancer.server.port=8484&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ce qui va monter le fichier local &lt;strong&gt;/var/run/docker.sock&lt;/strong&gt; pour discuter avec Docker : adaptez-le au fichier Socket de votre service Docker.&lt;/p&gt;
&lt;p&gt;Cela va utiliser le fichier &lt;strong&gt;traefik.yml&lt;/strong&gt; local qui contient notre configuration pour notre service Træfik.&lt;/p&gt;
&lt;p&gt;On stocke les données des certificats dans le fichier local &lt;strong&gt;acme.json&lt;/strong&gt; : pensez à faire &lt;code&gt;touch acme.json&lt;/code&gt; pour créer le fichier avant de lancer.&lt;/p&gt;
&lt;p&gt;Et voici le contenu de notre fichier &lt;strong&gt;traefik.yml&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;&#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;api&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;dashboard&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 style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# pour activer un tableau de bord&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;providers&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&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;network&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;traefik&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# réseau de discussion entre les conteneurs et traefik&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;exposedByDefault&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;false&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;# n&amp;#39;active pas les conteneurs par défaut sur le web&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;entryPoints&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;web&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;address&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;:80&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;http&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;redirections&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;entryPoint&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;to&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;websecure&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# pointe sur websecure plus bas (port 443 en somme)&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;scheme&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;https&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;websecure&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;address&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;:443&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;http&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;tls&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;# configuration par défaut&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;certResolver&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;letsencrypt&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# pointe sur la config. letsencrypt plus bas&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;traefik&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;# adresse pour le dashboard ;-)&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;address&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;:8080&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;certificatesResolvers&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;letsencrypt&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;acme&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;email&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;mon-courriel@domaine.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:#062873;font-weight:bold&#34;&gt;storage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/acme.json&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;httpChallenge&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 type utilisé pour valider les certificats Let&amp;#39;s Encrypt&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;entryPoint&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;web&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;Je me suis permis de commenter un peu partout pour savoir de quoi il retourne.&lt;/p&gt;
&lt;p&gt;Sachez qu&amp;rsquo;il existe aussi une méthode pour créer un fichier sur lequel Traefik va lire régulièrement pour mettre à jour sa configuration. Peut-être ferais-je un autre article sur ce sujet un jour. Petite piste : c&amp;rsquo;est le &lt;a href=&#34;https://doc.traefik.io/traefik/providers/file/&#34;&gt;&lt;em&gt;Provider&lt;/em&gt; nommé &lt;strong&gt;file&lt;/strong&gt;&lt;/a&gt; qui permet de faire ça.&lt;/p&gt;
&lt;p&gt;Une fois configuré, les autres conteneurs Docker que nous lançons n&amp;rsquo;ont plus besoin que des lignes suivantes dans &lt;strong&gt;leur fichier docker-compose.yml&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-docker-compose&#34; data-lang=&#34;docker-compose&#34;&gt;labels:
  - &amp;#34;traefik.enable=true&amp;#34;
  - &amp;#34;traefik.http.routers.un-nom-de-service.rule=Host(`mon.domaine.com`)&amp;#34;
  - &amp;#34;traefik.http.routers.un-nom-de-service.entrypoints=websecure&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Au lancement de vos conteneurs via un fichier docker-compose.yml, Træfik lira les informations contenues dans &lt;strong&gt;labels&lt;/strong&gt; et tentera de les analyser puis utiliser à bon essien.&lt;/p&gt;
&lt;p&gt;Dans l&amp;rsquo;exemple donné ci-avant, on comprend que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trafik.enable : le service doit être publié par Traefik (car dans la configuration nous avions mis &lt;code&gt;exposedByDefault: false&lt;/code&gt;, donc pas de publication par défaut)&lt;/li&gt;
&lt;li&gt;traefik.http.routers.un-nom-de-service.rule=Host(`mon.domaine.com`) : pour votre service remplacez un-nom-de-service par ce que vous voulez. Et &lt;strong&gt;mon.domaine.com&lt;/strong&gt; par le domaine que vous détenez&lt;/li&gt;
&lt;li&gt;la dernière ligne ne sert qu&amp;rsquo;à indiquer quel entrée par défaut accepter/utiliser. En l&amp;rsquo;occurence celle nommée &lt;em&gt;websecure&lt;/em&gt; qui, dans notre configuration du fichier traefik.yml est configurée pour être disponible sur le port 443 avec un résolveur de certificat Let&amp;rsquo;s Encrypt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemple de docker-compose.yml pour lancer un service :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-docker-compose&#34; data-lang=&#34;docker-compose&#34;&gt;version: &amp;#39;3&amp;#39;

services:
    whoami:
      image: traefik/whoami
      labels:
        - &amp;#34;traefik.enable=true&amp;#34;
        - &amp;#34;traefik.http.routers.whoami.rule=Host(`whoami.domaine.com`)&amp;#34;
        - &amp;#34;traefik.http.routers.whoami.entrypoints=websecure&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Y aurait-il encore d&amp;rsquo;autres fonctionnalités sympas ?&lt;/p&gt;
&lt;h1 id=&#34;pour-aller-plus-loin&#34;&gt;Pour aller plus loin&lt;/h1&gt;
&lt;p&gt;Dans ce que j&amp;rsquo;ai pratiqué, voici quelques points à étudier pour aller plus loin :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;utilisation de &lt;a href=&#34;https://doc.traefik.io/traefik/https/acme/#dnschallenge&#34;&gt;Let&amp;rsquo;s Encrypt par challenge DNS&lt;/a&gt; qui permet de gérer les DNS de son fournisseur de domaine en direct. Par exemple pour Gandi il suffit de fournir la variable d&amp;rsquo;environnement GANDIV5_API_KEY&lt;/li&gt;
&lt;li&gt;utilisation d&amp;rsquo;un fichier externe avec &lt;code&gt;watch: true&lt;/code&gt; pour appliquer les changements dès modification du fichier&lt;/li&gt;
&lt;li&gt;utilisation de middleware pour une authentification basique&lt;/li&gt;
&lt;li&gt;activer un port, par exemple 8080 pour l&amp;rsquo;accès au tableau de bord&lt;/li&gt;
&lt;li&gt;dans certains cas où les services ne sont pas forcément dans des Docker, il peut être intéressant de fournir une IP et un port spécifique par un loadBalancer, Cf. &lt;a href=&#34;https://doc.traefik.io/traefik/routing/services/#servers&#34;&gt;https://doc.traefik.io/traefik/routing/services/#servers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y a beaucoup plus à découvrir avec Træfik. Je vous invite à &lt;a href=&#34;https://doc.traefik.io/traefik/&#34;&gt;lire la documentation&lt;/a&gt; qui est très riche et bien expliquée.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Utiliser Træfik a permis de réduire considérablement le temps de maintenance de mes services, que ce soit en terme de mises à jour, de renouvellement de certificats et d&amp;rsquo;organisation des dossiers/fichiers.&lt;/p&gt;
&lt;p&gt;Cependant qu&amp;rsquo;on se le dise, ce n&amp;rsquo;est pas exempt de quelques difficultés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il n&amp;rsquo;y a pas toujours des images Docker de vos services, il faut donc parfois fabriquer soi-même les conteneurs,&lt;/li&gt;
&lt;li&gt;la courbe d&amp;rsquo;apprentissage de Træfik est assez difficile,&lt;/li&gt;
&lt;li&gt;on se casse les méninges jusqu&amp;rsquo;à comprendre comment fournir un service sur Træfik&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si on fait l&amp;rsquo;effort d&amp;rsquo;apprendre Træfik et d&amp;rsquo;investir du temps, c&amp;rsquo;est surtout pour assurer la possibilité de connecter tout cela à un &lt;a href=&#34;https://doc.traefik.io/traefik/observability/metrics/overview/&#34;&gt;système de métriques&lt;/a&gt;, pouvoir faire de la journalisation, vérifier l&amp;rsquo;état de santé des serveurs, etc.&lt;/p&gt;
&lt;p&gt;Il y a de quoi faire !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>État des lieux 2022</title>
      <link>https://olivier.dossmann.net/2022/09/%C3%A9tat-des-lieux-2022/</link>
      <pubDate>Wed, 21 Sep 2022 18:54:18 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2022/09/%C3%A9tat-des-lieux-2022/</guid>
      <description>&lt;h1 id=&#34;intro&#34;&gt;Intro&lt;/h1&gt;
&lt;p&gt;Il fait bien longtemps, chers lecteurs, que ce blog n&amp;rsquo;avait pas été mis à jour. Qu&amp;rsquo;en est-il aujourd&amp;rsquo;hui ? Qu&amp;rsquo;adviendra-t-il à celui-ci dans l&amp;rsquo;avenir ?&lt;/p&gt;
&lt;p&gt;Nous allons faire l&amp;rsquo;état des lieux du blog, de ma présence sur le net et des choses à venir, mais avant tout peut-être voudriez-vous savoir ce qui fait qu&amp;rsquo;on laisse un blog en déperdition aussi longtemps.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/lieux/BlackHole.jpg&#34; alt=&#34;Trou noir&#34; title=&#34;Image d&#39;un trou noir dans l&#39;espace&#34;&gt;&lt;/p&gt;
&lt;p&gt;Image dans le domaine public trouvée sur une galerie photo de &lt;a href=&#34;https://www.flickr.com/photos/my_public_domain_photos/&#34; title=&#34;Aller sur la galerie photo de aeroman3&#34;&gt;aeroman3&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;état-des-lieux&#34;&gt;État des lieux&lt;/h1&gt;
&lt;p&gt;IRL (In Real Life) nous rattrape bien plus souvent qu&amp;rsquo;il n&amp;rsquo;y paraît. Et cela a un impact sur l&amp;rsquo;espace numérique que l&amp;rsquo;on se fait.&lt;/p&gt;
&lt;p&gt;En effet que ce soit financier, familial, moral ou technique, toutes ces choses s&amp;rsquo;ammoncèlent pour faire une montagne qui nous écrase au sol.&lt;/p&gt;
&lt;p&gt;Long est le chemin pour s&amp;rsquo;en sortir et avoir à nouveau un peu de souffle pour conter des histoires et/ou rassembler nos pérégrinations quelque part.&lt;/p&gt;
&lt;p&gt;En sommes j&amp;rsquo;ai cumulé pas mal de choses qui m&amp;rsquo;ont empêché de tenir ce blog, mais surtout les serveurs sur lesquels mon espace numérique tournait.&lt;/p&gt;
&lt;p&gt;Fort heureusement, récemment, un généreux donateur (via &lt;a href=&#34;https://liberapay.com/bl4n&#34;&gt;Liberapay&lt;/a&gt;) fourni de quoi payer une partie de l&amp;rsquo;hébergement à l&amp;rsquo;année.&lt;/p&gt;
&lt;p&gt;Le bilan, après ces 3 années n&amp;rsquo;est pour autant pas folichon.&lt;/p&gt;
&lt;p&gt;Sur le blog :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;quelques liens cassés (que je résoudrais petit à petit)&lt;/li&gt;
&lt;li&gt;je n&amp;rsquo;ai plus de Microblog car le service herds.eu a été fermé (j&amp;rsquo;étais le seul résident de cette instance)&lt;/li&gt;
&lt;li&gt;mon CV ne fonctionne plus sur la version actuelle d&amp;rsquo;Hugo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sur le reste de mon espace numérique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les sauvegardes c&amp;rsquo;est fini&lt;/li&gt;
&lt;li&gt;je n&amp;rsquo;ai plus de service de contact/agenda auto-hébergé&lt;/li&gt;
&lt;li&gt;sur la trentaine de sites que j&amp;rsquo;avais, seulement 7 restent&lt;/li&gt;
&lt;li&gt;mes automatisations ne sont plus&lt;/li&gt;
&lt;li&gt;je suis passé de 2 serveurs dédiés à un seul, très petit&lt;/li&gt;
&lt;li&gt;plus aucun serveur Jabber/XMPP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le bilan est lourd. Le temps me manque. Mes priorités sont toutes autres.&lt;/p&gt;
&lt;p&gt;Mais alors que viser pour les prochains temps ?&lt;/p&gt;
&lt;h1 id=&#34;lavenir-proche&#34;&gt;L&amp;rsquo;avenir proche&lt;/h1&gt;
&lt;p&gt;Bien que mes objectifs aient changé ces dernières années, l&amp;rsquo;informatique et le numérique plus généralement me tient à cœur. J&amp;rsquo;en reviens toujours à ce domaine, quoiqu&amp;rsquo;il arrive.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée pour les prochains temps sera donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;de partager mes pérégrinations sur les différentes technologies que j&amp;rsquo;aborde de mon côté&lt;/li&gt;
&lt;li&gt;remettre petit à petit les services&lt;/li&gt;
&lt;li&gt;corriger quelques liens morts&lt;/li&gt;
&lt;li&gt;apporter de l&amp;rsquo;automatisation pour remettre ma chaîne de publication en ordre&lt;/li&gt;
&lt;li&gt;réouvrir des services tels que les salons Jabber/XMPP&lt;/li&gt;
&lt;li&gt;en profiter &amp;#x1f603;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De la sorte, le blog tournera forcément un peu plus et quelques articles sortiront !&lt;/p&gt;
&lt;h1 id=&#34;quelques-articles-potentiels&#34;&gt;Quelques articles potentiels&lt;/h1&gt;
&lt;p&gt;Dans les prochaines idées d&amp;rsquo;article :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilisation de Traefik et Docker pour les services&lt;/li&gt;
&lt;li&gt;Mise en place de Gachette, serveur de webhooks personnel pour créer une chaîne de publication&lt;/li&gt;
&lt;li&gt;Quelques lignes sur DreamLight Valley, le nouveau RPG Disney&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Si vous lisez ces lignes, je vous remercie de m&amp;rsquo;avoir gardé dans vos lecteurs de flux RSS. Je m&amp;rsquo;excuse également d&amp;rsquo;avoir cassé vos flux si c&amp;rsquo;est le cas, et j&amp;rsquo;espère que vous serez contents de lire les prochains articles à venir !&lt;/p&gt;
&lt;p&gt;Au plaisir de vous faire de la lecture,&lt;/p&gt;
&lt;p&gt;Olivier D.&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Mise à jour des DNS Gandi (v5) avec la bbox de Bougues</title>
      <link>https://olivier.dossmann.net/2019/05/mise-%C3%A0-jour-des-dns-gandi-v5-avec-la-bbox-de-bougues/</link>
      <pubDate>Mon, 06 May 2019 20:18:29 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2019/05/mise-%C3%A0-jour-des-dns-gandi-v5-avec-la-bbox-de-bougues/</guid>
      <description>&lt;p&gt;Figurez-vous qu&amp;rsquo;après &lt;a href=&#34;https://olivier.dossmann.net/2017/02/ivre-il-coupe-internet-episode-3/&#34;&gt;mes pérégrinations dans le monde de l&amp;rsquo;Internet nomade&lt;/a&gt;, j&amp;rsquo;ai eu l&amp;rsquo;occasion de passer à la Fibre. Et avec elle son lot de « malheurs » : une IP dynamique.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En quoi est-ce problématique ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une IP fixe permet de bénéficier d&amp;rsquo;une adresse constante, c&amp;rsquo;est à dire qu&amp;rsquo;elle permet, par exemple, d&amp;rsquo;avoir un nom de domaine qui redirige vers une à plusieurs machines de la maison. Par exemple avec &lt;strong&gt;bogossdu69.fr&lt;/strong&gt; je pourrais éventuellement arriver sur mon partage de fichiers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/expansion_lumi%C3%A8re.jpg&#34; alt=&#34;Expansion de lumière&#34; title=&#34;Des lampes de plafonds rectangulaires alignées pour former une étoile à 5 ou 6 branches&#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/sattygalle/&#34;&gt;profil de sattygalle sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence CC BY-SA 2.0.&lt;/p&gt;
&lt;h1 id=&#34;la-situation&#34;&gt;La situation&lt;/h1&gt;
&lt;p&gt;Mon but est donc de mettre à jour régulièrement mes noms de domaine lorsque mon IP change.&lt;/p&gt;
&lt;p&gt;Je dispose de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une box Bouygues nommée &lt;strong&gt;bbox&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;une ip dynamique&lt;/li&gt;
&lt;li&gt;un nom de domaine chez Gandi.net&lt;/li&gt;
&lt;li&gt;une machine allumée en permanence sur la box&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;lobjectif&#34;&gt;L&amp;rsquo;objectif&lt;/h1&gt;
&lt;p&gt;Mettre à jour régulièrement le nom de domaine pour qu&amp;rsquo;il pointe vers ma box en permanence.&lt;/p&gt;
&lt;h1 id=&#34;ma-solution-en-1-commande&#34;&gt;Ma solution en 1 commande&lt;/h1&gt;
&lt;p&gt;En une commande :&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;&#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;curl -s https://mabbox.bytel.fr/api/v1/wan/ip |jq &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;.[0].wan.ip.address&amp;#39;&lt;/span&gt;| xargs -I&lt;span style=&#34;color:#666&#34;&gt;{}&lt;/span&gt; curl -X PUT -H &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;X-Api-key: LaSuperCleAPIdeGandiV5&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -d &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;{&amp;#34;rrset_ttl&amp;#34;:&amp;#34;1800&amp;#34;,&amp;#34;rrset_values&amp;#34;:[&amp;#34;{}&amp;#34;]}&amp;#39;&lt;/span&gt; https://dns.api.gandi.net/api/v5/domains/domain.tld/records/bogossdu69/A
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En remplaçant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LaSuperCleAPIdeGandiV5&lt;/strong&gt; par la clé de sécurité dans votre interface Gandi sur &lt;em&gt;Tableau de Bord &amp;gt; Paramètres &amp;gt; Sécurité &amp;gt; (Re)Générer la clé d&amp;rsquo;API&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;domain.tld&lt;/strong&gt; par votre domaine, par exemple dossmann.net&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bogossdu69&lt;/strong&gt; par votre sous-domaine, par exemple olivier (ce qui donnera olivier.dossmann.net)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;le-détail&#34;&gt;Le détail&lt;/h1&gt;
&lt;p&gt;L&amp;rsquo;idée est de lancer un script régulièrement (par exemple toutes les 5 minutes) sur la machine branchée à la Box.&lt;/p&gt;
&lt;p&gt;Pour cela on va utiliser les outils suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mabbox.bytel.fr/api/v1/wan/ip&#34;&gt;l&amp;rsquo;IP donnée par l&amp;rsquo;API de votre bbox&lt;/a&gt; et dont la documentation est sur &lt;a href=&#34;https://api.bbox.fr/doc/apirouter/#api-WAN-GetWANIP&#34;&gt;le site officiel de l&amp;rsquo;API de Bouygues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;curl fourni dans la plupart des distributions GNU/Linux (et plus encore !)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stedolan.github.io/jq/&#34;&gt;jq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;outil timerctl fourni dans le système pour planifier l&amp;rsquo;exécution de tâches régulières&lt;/li&gt;
&lt;li&gt;et &lt;a href=&#34;https://github.com/blankoworld/divers/blob/master/maj_domaines_gandi.sh&#34;&gt;la commande précédente aménagée dans un script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;API de notre box va fournir l&amp;rsquo;IP publique dynamique de notre connexion internet. &lt;strong&gt;jq&lt;/strong&gt; va permettre la récupération de la bonne information parmi l&amp;rsquo;ensemble fourni par notre box. Après quoi &lt;strong&gt;curl&lt;/strong&gt; mettra à jour les DNS dynamiques de Gandi (notre fournisseur de nom de domaine).&lt;/p&gt;
&lt;p&gt;Il ne nous reste plus qu&amp;rsquo;à taper la commande entière dans le fichier &lt;strong&gt;/etc/systemd/system/maj_domaine.service&lt;/strong&gt; sous la forme 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;&#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:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Mise a jour du domaine Gandi&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;font-weight:bold&#34;&gt;[Service]&lt;/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;Environment&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;API_KEY=oefijzoifjzeoifjzeoifjeo&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&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/usr/bin/bash /home/user/maj_domaine.sh&lt;/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;Type&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;adapter &lt;strong&gt;API_KEY&lt;/strong&gt; avec votre clé d&amp;rsquo;API et &lt;strong&gt;/home/user/&lt;/strong&gt; par l&amp;rsquo;adresse où se trouve le script !&lt;/p&gt;
&lt;p&gt;Puis de renseigner le fichier &lt;strong&gt;/etc/systemd/system/maj_domaine.timer&lt;/strong&gt; avec :&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;&#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:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Lance maj du domaine toutes les 8 min&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;font-weight:bold&#34;&gt;[Timer]&lt;/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;OnBootSec&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;8min&lt;/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;OnUnitActiveSec&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;8min&lt;/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;Persistent&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;True&lt;/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;Unit&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;maj_domaine.service&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;font-weight:bold&#34;&gt;[Install]&lt;/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;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il ne nous reste plus qu&amp;rsquo;à prévenir &lt;em&gt;systemd&lt;/em&gt; via 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;&#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 systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; maj_domaine.timer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start maj_domaine.timer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start maj_domaine.service
&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;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;À l&amp;rsquo;aide des outils listés dans ce billet on peut sans problème survivre à une IP dynamique à la maison chez Bouygues Telecom. Je n&amp;rsquo;ai eu jusqu&amp;rsquo;à ce jour aucun problème et espère que cela continuera ainsi.&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Déploiement d&#39;une application Crystal en production</title>
      <link>https://olivier.dossmann.net/2018/10/d%C3%A9ploiement-dune-application-crystal-en-production/</link>
      <pubDate>Sun, 07 Oct 2018 15:29:39 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2018/10/d%C3%A9ploiement-dune-application-crystal-en-production/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Le mois dernier &lt;a href=&#34;https://olivier.dossmann.net/2018/09/installation-de-pixelfed-une-alternative-%C3%A0-instagram/&#34; title=&#34;Lire mon article sur l&#39;installation de PixelFed&#34;&gt;je parlais de l&amp;rsquo;installation de PixelFed&lt;/a&gt;, un outil récent avec peu de documentation. Aujourd&amp;rsquo;hui je voudrais installer en production un site web développé avec Amber, un framework du langage Crystal pour développer rapidement des sites webs.&lt;/p&gt;
&lt;p&gt;Force est de constater que souvent &lt;a href=&#34;https://docs.amberframework.org/amber/deployment/manual-deploy&#34;&gt;les tutoriels proposés&lt;/a&gt; ne correspondent pas à mes attentes. J&amp;rsquo;ai décidé de vous livrer aujourd&amp;rsquo;hui le résultat de mes enquêtes sur le sujet !&lt;/p&gt;
&lt;p&gt;Après une présentation du framework Amber, je listerai rapidement les étapes à suivre pour déployer son application sur un serveur.&lt;/p&gt;
&lt;p&gt;Un &lt;a href=&#34;https://olivier.dossmann.net/wiki/services/deploiement_amber/&#34; title=&#34;En savoir plus sur le déploiement d&#39;une application Amber en mode production&#34;&gt;tutoriel plus détaillé pour Amber est disponible sur mon wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logos/amber.jpg&#34; alt=&#34;Logo d&amp;rsquo;Amber, similaire à un Crystal sur fond orange&#34; title=&#34;Logo d&#39;Amber framework&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;au-sujet-damber&#34;&gt;Au sujet d&amp;rsquo;Amber&lt;/h3&gt;
&lt;p&gt;C&amp;rsquo;est un framework web. C&amp;rsquo;est à dire un outil pour simplifier la création de sites Web. Il peut aussi bien faire des sites vitrines que des applications webs ou des API web. Il est donc multifonctions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amberframework.org/&#34; title=&#34;Aller sur la page officielle d&#39;Amber&#34;&gt;Amber&lt;/a&gt; est écrit en &lt;a href=&#34;https://crystal-lang.org/&#34; title=&#34;Découvrir la page officielle du langage Crystal&#34;&gt;Crystal&lt;/a&gt;, un langage dont la syntaxe est similaire à &lt;a href=&#34;https://fr.wikipedia.org/wiki/Ruby&#34; title=&#34;Découvrir Ruby sur Wikipédia&#34;&gt;Ruby&lt;/a&gt;, mais dont l&amp;rsquo;application résultante est plus rapide. Ça dépotte !&lt;/p&gt;
&lt;p&gt;Pourquoi je parle de Ruby aussi ? Parce qu&amp;rsquo;il possède un outil formidable très connu pour créer des sites webs : &lt;a href=&#34;https://rubyonrails.org/&#34; title=&#34;En savoir plus sur Ruby On Rails&#34;&gt;Ruby On Rails&lt;/a&gt;. Déjà très intéressant pour créer des sites webs, il était normal que les développeurs Crystal s&amp;rsquo;attardent à la création d&amp;rsquo;un outil similaire : Amber !&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai déjà utilisé Ruby On Rails, alors je me suis dis pourquoi pas tenter Amber ? Allons-y !&lt;/p&gt;
&lt;h3 id=&#34;déploiement-en-bref&#34;&gt;Déploiement, en bref&lt;/h3&gt;
&lt;p&gt;Je rappelle qu&amp;rsquo;un &lt;a href=&#34;https://olivier.dossmann.net/wiki/services/deploiement_amber/&#34; title=&#34;En savoir plus sur le déploiement d&#39;une application Amber en mode production&#34;&gt;tutoriel plus détaillé pour Amber est disponible sur mon wiki&lt;/a&gt;. Et le &lt;a href=&#34;https://docs.amberframework.org/amber/getting-started/quick-start&#34; title=&#34;Suivre le tutoriel de la documentation officielle d&#39;Amber pour installer et créer un nouveau projet&#34;&gt;&amp;ldquo;Quick Start&amp;rdquo; d&amp;rsquo;Amber explique très bien comment créer un projet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour déployer Amber, il faut suivre quelques étapes clés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;créer une base de données &lt;strong&gt;sur le serveur&lt;/strong&gt; et garder en tête l&amp;rsquo;identifiant, le mot de passe et la base de donnée associée&lt;/li&gt;
&lt;li&gt;configurer le mode production &lt;strong&gt;sur notre machine&lt;/strong&gt; et garder quelque part la clé située dans le fichier &lt;strong&gt;.encryption_key&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;compiler &lt;strong&gt;sur notre machine&lt;/strong&gt; l&amp;rsquo;application en mode &lt;strong&gt;--release&lt;/strong&gt;, mais &lt;strong&gt;aussi amber&lt;/strong&gt; lui même. Si votre machine et le serveur sont d&amp;rsquo;architectures différentes, pensez à &lt;a href=&#34;https://crystal-lang.org/docs/syntax_and_semantics/cross-compilation.html&#34; title=&#34;En savoir plus sur la compilation croisée de Crystal&#34;&gt;la compilation croisée d&amp;rsquo;application Crystal (en)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;copie de &lt;strong&gt;certains dossiers&lt;/strong&gt; de votre application &lt;strong&gt;vers le serveur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;migration du schéma de la base de données &lt;strong&gt;sur le serveur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;création d&amp;rsquo;un fichier systemd &lt;strong&gt;sur le serveur&lt;/strong&gt; pour le lancement/arrêt du service (votre site web)&lt;/li&gt;
&lt;li&gt;lancement de votre service &lt;strong&gt;sur le serveur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;configuration et relance de Nginx en association avec votre site web &lt;strong&gt;sur le serveur&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je vous donne ce qui est généralement important ci-dessous.&lt;/p&gt;
&lt;p&gt;La configuration de la connexion dans le fichier de production :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;database_url: postgres://amber_user:mot2passe@localhost:5432/amber_production
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Savoir quels fichiers copier :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bin/&lt;/li&gt;
&lt;li&gt;config/environments/.production.enc et QUE celui-là (les autres sont inutiles pour la production)&lt;/li&gt;
&lt;li&gt;db/&lt;/li&gt;
&lt;li&gt;public/&lt;/li&gt;
&lt;li&gt;src/locales/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On oublie souvent de déployer la base (en mettant la clé située dans le fichier .encryption_key) :&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;&#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;AMBER_ENV&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;production &lt;span style=&#34;color:#bb60d5&#34;&gt;AMBER_ENCRYPTION_KEY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;oliBK0J9-HrSK1K8VPTtsMERyj2as1mUZqvPqfKGGeQ&amp;#34;&lt;/span&gt; ./bin/amber db migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Avec un fichier systemd bien rempli, notamment les variables d&amp;rsquo;environnement :&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;&#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:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Lance le framework web Amber pour le site monsite.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;After&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;network.target&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;font-weight:bold&#34;&gt;[Service]&lt;/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;Type&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;simple&lt;/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;User&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;WorkingDirectory&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/srv/www/monsite&lt;/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;Environment&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;AMBER_ENV=production&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&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;PORT=3002&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&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;AMBER_ENCRYPTION_KEY=oliBK0J9-HrSK1K8VPTtsMERyj2as1mUZqvPqfKGGeQ&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&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/home/www/monsite/bin/tutamber&lt;/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;Restart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;always&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;font-weight:bold&#34;&gt;[Install]&lt;/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;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et finalement on se mange souvent sur une configuration Nginx pourrie, mais on commence simple :&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;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;server&lt;/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;listen&lt;/span&gt;      &lt;span style=&#34;color:#4070a0&#34;&gt;*:80&lt;/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;listen&lt;/span&gt;      &lt;span style=&#34;color:#4070a0&#34;&gt;[::]:80&lt;/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;server_name&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;monsite.domaine.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:#007020;font-weight:bold&#34;&gt;root&lt;/span&gt;        &lt;span style=&#34;color:#4070a0&#34;&gt;/srv/www/monsite&lt;/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;index&lt;/span&gt;       &lt;span style=&#34;color:#4070a0&#34;&gt;index.html&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;font-weight:bold&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;X-Real-IP&lt;/span&gt;  &lt;span style=&#34;color:#bb60d5&#34;&gt;$remote_addr&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;font-weight:bold&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;/&lt;/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;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;Host&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$host&lt;/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;proxy_pass&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;http://127.0.0.1:3002&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et voilà !&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Le déploiement d&amp;rsquo;une application Amber n&amp;rsquo;est pas plus compliquée qu&amp;rsquo;un autre service. Mais il faut avouer qu&amp;rsquo;elle n&amp;rsquo;est pas si bien détaillée sur le site même d&amp;rsquo;Amber. Le projet est encore jeune, tout autant que le langage Crystal lui-même. Avec mon tutoriel vous savez quoi faire : installer des sites Amber partout &amp;#x1f602;.&lt;/p&gt;
&lt;p&gt;Cependant je vous conseille vivement de tester Crystal, Amber et d&amp;rsquo;autres éléments de la communauté : c&amp;rsquo;est facile à écrire, c&amp;rsquo;est réactif, bien pensé, avec une communauté active, des personnes gentilles qui répondent aux questions, c&amp;rsquo;est top !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Installation de PixelFed, une alternative à Instagram</title>
      <link>https://olivier.dossmann.net/2018/09/installation-de-pixelfed-une-alternative-%C3%A0-instagram/</link>
      <pubDate>Fri, 14 Sep 2018 23:34:55 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2018/09/installation-de-pixelfed-une-alternative-%C3%A0-instagram/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Peut-être le saviez-vous, ma curiosité m&amp;rsquo;a amenée à parcourir les réseaux sociaux. Ainsi &lt;a href=&#34;https://herds.eu/bl4n&#34; title=&#34;Découvrir mon profil&#34;&gt;je réside sur GNU Social&lt;/a&gt;, un réseau alternatif. Àla Twitter. Mais &lt;a href=&#34;https://fr.wikipedia.org/wiki/Red%C3%A9centralisation_d%27Internet&#34; title=&#34;En savoir plus sur la décentralisation d&#39;Internet&#34;&gt;décentralisé&lt;/a&gt;. Depuis début 2018, ce réseau évolue rapidement. De nouvelles applications basées sur celui-ci fleurissent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://joinmastodon.org/&#34; title=&#34;Découvrir Mastodon et rejoindre une instance&#34;&gt;Mastodon&lt;/a&gt; : encore meilleur que Twitter !&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://joinpeertube.org/fr/home/&#34; title=&#34;En apprendre plus sur PeerTube et rejoindre une instance&#34;&gt;PeerTube&lt;/a&gt; : YouTube sans la censure&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://join.funkwhale.audio/&#34; title=&#34;En savoir plus sur Funkwhale et rejoindre une instance&#34;&gt;Funkwhale&lt;/a&gt; : Groovshark chez soi, à partager en famille&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pixelfed.social/&#34; title=&#34;Page officielle du projet&#34;&gt;PixelFed&lt;/a&gt; : alternative à Instagram&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous allons nous intéresser au dernier de la liste : &lt;strong&gt;PixelFed&lt;/strong&gt;, un outil pour publier et partager des photos. Un tutoriel plus accessible sur son installation manque cruellement sur le web, alors pourquoi ne pas se lancer ici ?&lt;/p&gt;
&lt;p&gt;Je vous expliquerai en plusieurs étapes ma procédure d&amp;rsquo;installation. Le logiciel n&amp;rsquo;est pas encore stable, je préfère donc en parler ici plutôt que sur &lt;a href=&#34;https://olivier.dossmann.net/wiki/&#34; title=&#34;Se rendre sur mon recueil d&#39;astuces&#34;&gt;mon recueil d&amp;rsquo;astuces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logos/pixelfed.gif&#34; alt=&#34;Logo de PixelFed : sorte de fleur à plusieurs pétales des couleurs de l&amp;rsquo;arc en ciel dont le centre forme un P blanc&#34; title=&#34;Logo de PixelFed qui passe d&#39;une version pixelisé à une version nette&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;avant-propos&#34;&gt;Avant-propos&lt;/h3&gt;
&lt;p&gt;Ce « tutoriel » est très probablement &lt;strong&gt;réservé à des personnes ayant un minimum d&amp;rsquo;assurance avec la ligne de commande&lt;/strong&gt; ; les serveurs et probablement d&amp;rsquo;autres compétences dont je ne me rends pas compte. La lecture sera probablement longue, prenez votre temps et achevez les tâches progressivement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PixelFed est un outil récent&lt;/strong&gt; qui n&amp;rsquo;a pas été testé ni longtemps ni sur énormément d&amp;rsquo;instances. Je crois qu&amp;rsquo;il est sage de dire qu&amp;rsquo;il est &lt;strong&gt;réservé aux têtes brûlées&lt;/strong&gt;. Ces personnes qui souhaitent être à la fois « hype » mais se casser les dents sur des soucis. Cela m&amp;rsquo;est arrivé : j&amp;rsquo;ai mis plusieurs heures à trouver ce qui n&amp;rsquo;allait pas.&lt;/p&gt;
&lt;p&gt;Je ne serais en aucun cas tenu pour responsable de toute perte de données, de problèmes ou de catastrophe résultant de l&amp;rsquo;application des commandes de ce tutoriel. Vous êtes assez intelligents pour vous renseigner si le besoin s&amp;rsquo;en fait sentir. D&amp;rsquo;ailleurs un &lt;a href=&#34;https://webchat.freenode.net/?randomnick=1&amp;amp;channels=%23pixelfed&amp;amp;uio=d4&#34; title=&#34;Se connecter au canal IRC de PixelFed&#34;&gt;canal IRC pour PixelFed&lt;/a&gt; existe pour vous aider. Vous n&amp;rsquo;êtes pas seul, l&amp;rsquo;univers que nous connaissons est rempli d&amp;rsquo;aliens comme vous et moi :)&lt;/p&gt;
&lt;h3 id=&#34;prérequis&#34;&gt;Prérequis&lt;/h3&gt;
&lt;p&gt;Sur &lt;a href=&#34;https://github.com/pixelfed/pixelfed&#34; title=&#34;Se rendre sur le dépôt officiel de PixelFed&#34;&gt;la page du dépôt du projet&lt;/a&gt; on lit que &lt;strong&gt;l&amp;rsquo;application requièrt PHP supérieur ou égal à 7.1&lt;/strong&gt;. Pour &lt;a href=&#34;https://packages.debian.org/stretch/php&#34; title=&#34;Voir le paquet PHP pour Debian Stretch&#34;&gt;Debian c&amp;rsquo;est mort&lt;/a&gt;, à moins que vous soyez &lt;a href=&#34;https://olivier.dossmann.net/wiki/systeme/pinning_debian/&#34; title=&#34;Découvrir mes astuces pour le Pinning sous Debian/Ubuntu&#34;&gt;le roi du pinning&lt;/a&gt;. Pour Ubuntu, c&amp;rsquo;est déjà mieux : PHP 7.1 (sous bionic).&lt;/p&gt;
&lt;p&gt;Dans le présent tutoriel j&amp;rsquo;ai travaillé sur une &lt;strong&gt;machine possédant ArchLinux&lt;/strong&gt; et PHP 7.2. J&amp;rsquo;ai donc utilisé les éléments suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;php, Cf. &lt;a href=&#34;https://wiki.archlinux.org/index.php/PHP&#34;&gt;https://wiki.archlinux.org/index.php/PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;php-fpm, Cf. &lt;a href=&#34;https://wiki.archlinux.org/index.php/nginx#PHP_implementation&#34;&gt;https://wiki.archlinux.org/index.php/nginx#PHP_implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;postgreSQL, Cf. &lt;a href=&#34;https://olivier.dossmann.net/wiki/services/postgres/&#34;&gt;https://olivier.dossmann.net/wiki/services/postgres/&lt;/a&gt; et &lt;a href=&#34;https://wiki.archlinux.org/index.php/PostgreSQL&#34;&gt;https://wiki.archlinux.org/index.php/PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;redis, &lt;a href=&#34;https://wiki.archlinux.org/index.php/redis&#34;&gt;https://wiki.archlinux.org/index.php/redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;nginx, Cf. &lt;a href=&#34;https://wiki.archlinux.org/index.php/nginx&#34;&gt;https://wiki.archlinux.org/index.php/nginx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;ai installé les paquets suivants :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo pacman -S php php-fpm php-gd php-pgsql git postgresql redis
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis à la lecture du &lt;a href=&#34;https://github.com/pixelfed/pixelfed/blob/dev/README.md&#34; title=&#34;Lire le fichier README de PixelFed&#34;&gt;fichier README sur le dépôt git officiel de PixelFed&lt;/a&gt;, j&amp;rsquo;ai du installer plusieurs autres logiciels, y compris sur &lt;a href=&#34;https://wiki.archlinux.org/index.php/Arch_User_Repository&#34; title=&#34;Apprendre à utiliser les dépôts AUR d&#39;ArchLinux&#34;&gt;les dépôts AUR d&amp;rsquo;ArchLinux&lt;/a&gt; en utilisant l&amp;rsquo;outil &lt;a href=&#34;https://github.com/trizen/trizen&#34; title=&#34;Savoir comment installer l&#39;outil trizen&#34;&gt;trizen&lt;/a&gt; - que je recommande.&lt;/p&gt;
&lt;p&gt;Voici les logiciels supplémentaires :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;trizen -S optipng jpegoptim pngquant gifsicle svgo composer
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Éditez également le fichier &lt;strong&gt;/etc/php/php.ini&lt;/strong&gt; et décommentez (enlever le &amp;ldquo;;&amp;rdquo;) devant les lignes suivantes :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extension=bcmath.so
extension=gd.so
extension=iconv.so
extension=pdo_pgsql.so
extension=pgsql.so
extension=zip.so
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nous lancerons les différents services plus tard, passons déjà à l&amp;rsquo;installation de PixelFed.&lt;/p&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;p&gt;Nous vérifions que le dossier &lt;strong&gt;/srv/http/&lt;/strong&gt; existe :&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;&#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 mkdir -p /srv/http
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;puis nous créeons le dossier &lt;em&gt;pixelfed&lt;/em&gt; et lançons l&amp;rsquo;installation des dépendances :&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;&#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/http
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo git clone https://github.com/dansup/pixelfed.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; pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;composer install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le plus gros de l&amp;rsquo;installation est faite ! Faisons de la configuration avant le grand lancement !&lt;/p&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;
&lt;p&gt;La configuration va se passer en quelques étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;configuration d&amp;rsquo;un fichier pour &lt;em&gt;php-fpm&lt;/em&gt;, spécifique à PixelFed&lt;/li&gt;
&lt;li&gt;configuration du fichier &lt;strong&gt;.env&lt;/strong&gt; de PixelFed&lt;/li&gt;
&lt;li&gt;lancement de postgreSQL&lt;/li&gt;
&lt;li&gt;configuration d&amp;rsquo;une base de données pour postgreSQL&lt;/li&gt;
&lt;li&gt;ajout d&amp;rsquo;un fichier de service pour systemd afin de lancer &lt;em&gt;horizon&lt;/em&gt; pour PixelFed&lt;/li&gt;
&lt;li&gt;configuration de Nginx&lt;/li&gt;
&lt;li&gt;création d&amp;rsquo;une clé pour PixelFed&lt;/li&gt;
&lt;li&gt;création du lien sur les &lt;em&gt;storage&lt;/em&gt; de PixelFed&lt;/li&gt;
&lt;li&gt;modification des permissions du dossier &lt;strong&gt;/srv/http/pixelfed&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On crée le fichier &lt;strong&gt;/etc/php/php-fpm.d/pixelfed.conf&lt;/strong&gt; 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;&#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:#007020;font-weight:bold&#34;&gt;[pixelfed]&lt;/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;user&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;group&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;listen&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;/run/php-fpm/php-fpm-pixelfed.sock&lt;/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;listen.owner&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;listen.group&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;pm&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;dynamic&lt;/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;pm.max_children&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;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&#34;&gt;pm.start_servers&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;2&lt;/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;pm.min_spare_servers&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;1&lt;/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;pm.max_spare_servers&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Au cas où, on crée nous même le fichier &lt;strong&gt;/run/php-fpm/php-fpm-pixelfed.sock&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;&#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 mkdir -p /run/php-fpm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo touch /run/php-fpm/php-fpm-pixelfed.sock &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chown http:http /run/php-fpm/php-fpm-pixelfed.sock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rendons-nous dans le dossier PixelFed pour créer le fichier de configuration et l&amp;rsquo;éditer :&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;&#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/http/pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;avec le contenu suivant :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;APP_NAME=&amp;#34;Le plus terrible des noms d&amp;#39;instance que tu peux trouver&amp;#34;
APP_ENV=production
APP_DEBUG=false
APP_URL=http://tondomaine.tld

# Language configuration
#APP_LOCALE=fr
#APP_FALLBACK_LOCALE=fr

ADMIN_DOMAIN=&amp;#34;tondomaine.tld&amp;#34;
APP_DOMAIN=&amp;#34;tondomaine.tld&amp;#34;

LOG_CHANNEL=stack

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=&amp;#34;pixelfed&amp;#34;
DB_USERNAME=&amp;#34;roidumonde&amp;#34;
DB_PASSWORD=&amp;#34;ilestdesnôootres,ilabusonverrecommeuxlesôÔtres&amp;#34;

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.tondomaine.tld
MAIL_PORT=587
MAIL_USERNAME=tonpseudo@tondomaine.tld
MAIL_PASSWORD=mot2passe
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=&amp;#34;contact@tondomaine.tld&amp;#34;
MAIL_FROM_NAME=&amp;#34;Le nom d&amp;#39;expéditeur que tu veux que les personnes voient&amp;#34;

SESSION_DOMAIN=&amp;#34;.tondomaine.tld&amp;#34;
SESSION_SECURE_COOKIE=true
API_BASE=&amp;#34;/api/1/&amp;#34;
API_SEARCH=&amp;#34;/api/search&amp;#34;

OPEN_REGISTRATION=true
RECAPTCHA_ENABLED=false
ENFORCE_EMAIL_VERIFICATION=false

MAX_PHOTO_SIZE=15000
MAX_CAPTION_LENGTH=150
MAX_ALBUM_LENGTH=4

MIX_PUSHER_APP_KEY=&amp;#34;${PUSHER_APP_KEY}&amp;#34;
MIX_PUSHER_APP_CLUSTER=&amp;#34;${PUSHER_APP_CLUSTER}&amp;#34;
MIX_APP_URL=&amp;#34;${APP_URL}&amp;#34;
MIX_API_BASE=&amp;#34;${API_BASE}&amp;#34;
MIX_API_SEARCH=&amp;#34;${API_SEARCH}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour certaines variables vous trouverez des informations dans &lt;a href=&#34;https://laravel.com/docs/&#34; title=&#34;Se rendre sur la documentation de Laravel&#34;&gt;la documentation de Laravel&lt;/a&gt;, outil utilisé pour crée PixelFed.&lt;/p&gt;
&lt;p&gt;Puis on lance postgreSQL et on crée une base de données suivant les informations ajoutées dans le fichier de configuration précédent :&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;&#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 systemctl start postgresql.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; postgresql.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo su - postgres
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;createuser roidumonde
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;createdb -O roidumonde -E UTF-8 pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;psql pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ALTER USER roidumonde WITH PASSWORD &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;ilestdesnôootres,ilabusonverrecommeuxlesôÔtres&amp;#39;&lt;/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-weight:bold&#34;&gt;\q&lt;/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;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant on va créer le fichier de service systemd pour lancer &lt;strong&gt;horizon&lt;/strong&gt;. Éditez &lt;strong&gt;/etc/systemd/system/horizon.service&lt;/strong&gt; et mettez y 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;&#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:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Service horizon pour PixelFed&lt;/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;After&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;network.target&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;font-weight:bold&#34;&gt;[Service]&lt;/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;Type&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;simple&lt;/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;User&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;http&lt;/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;WorkingDirectory&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/srv/http/pixelfed&lt;/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;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;php artisan horizon&lt;/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;Restart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;on-failure&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;font-weight:bold&#34;&gt;[Install]&lt;/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;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;suivi de :&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;&#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 systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; : À la lecture d&amp;rsquo;&lt;a href=&#34;https://github.com/pixelfed/pixelfed/issues/1220&#34;&gt;un ticket sur Github qui m&amp;rsquo;a été signalé par raphgilles&lt;/a&gt;, le fichier &lt;strong&gt;/etc/systemd/system/horizon.service&lt;/strong&gt; peut 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;&#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:#007020;font-weight:bold&#34;&gt;[Unit]&lt;/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;Description&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;Service horizon pour PixelFed&lt;/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;After&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;network.target&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;font-weight:bold&#34;&gt;[Service]&lt;/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;Type&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;simple&lt;/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;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/usr/bin/php7.2 /srv/http/pixelfed/artisan horizon&lt;/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;Restart&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;on-failure&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;font-weight:bold&#34;&gt;[Install]&lt;/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;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De là on édite le fichier &lt;strong&gt;/etc/nginx/nginx.conf&lt;/strong&gt; et on rajoute la section suivante sous la ligne :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# HTTPS Server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;avec :&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;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;server&lt;/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;listen&lt;/span&gt;         &lt;span style=&#34;color:#4070a0&#34;&gt;*:80&lt;/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;listen&lt;/span&gt;         &lt;span style=&#34;color:#4070a0&#34;&gt;[::]:80&lt;/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;server_name&lt;/span&gt;    &lt;span style=&#34;color:#4070a0&#34;&gt;tondomaine.tld&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;font-weight:bold&#34;&gt;root&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;/srv/http/pixelfed/public&lt;/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;index&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;index.php&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;index.html&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;font-weight:bold&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;/&lt;/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;try_files&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$uri&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$uri/&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;$is_args$args&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&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;location&lt;/span&gt; ~ &lt;span style=&#34;color:#235388&#34;&gt;\.php$&lt;/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;try_files&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$uri&lt;/span&gt; =&lt;span style=&#34;color:#40a070&#34;&gt;404&lt;/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;fastcgi_split_path_info&lt;/span&gt;  &lt;span style=&#34;color:#4070a0&#34;&gt;^(.+\.php)(.*)&lt;/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;fastcgi_pass&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;unix:/run/php-fpm/php-fpm-pixelfed.sock&lt;/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;fastcgi_index&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;index.php&lt;/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;include&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;fastcgi.conf&lt;/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;fastcgi_param&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$document_root$fastcgi_script_name&lt;/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;fastcgi_param&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;PATH_INFO&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;$fastcgi_path_info&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il n&amp;rsquo;y a plus qu&amp;rsquo;à lancer redis, générer une clé pour PixelFed, générer le lien vers le dossier &lt;em&gt;storage&lt;/em&gt;, migrer la base de données et changer les permissions du dossier :&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;&#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 systemctl start redis.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; redis.service
&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; /srv/http/pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php artisan key:generate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php artisan storage:link
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php artisan migrate
&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; /srv/http
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown http:http pixelfed -R
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chaud bouillant pour tester si tout va bien ? C&amp;rsquo;est parti !&lt;/p&gt;
&lt;h3 id=&#34;ça-passe-ou-ça-casse-&#34;&gt;Ça passe ou ça casse !&lt;/h3&gt;
&lt;p&gt;Tout est prêt, il ne reste plus qu&amp;rsquo;à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lancer horizon&lt;/li&gt;
&lt;li&gt;lancer php-fpm&lt;/li&gt;
&lt;li&gt;lancer Nginx&lt;/li&gt;
&lt;li&gt;tout casser &amp;#x1f62d;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Faites :&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;&#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 systemctl start horizon.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; horizon.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start php-fpm.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; php-fpm.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start nginx.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#007020&#34;&gt;enable&lt;/span&gt; nginx.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alors, si vous allez sur tondomaine.tld, tout fonctionne ?&lt;/p&gt;
&lt;h3 id=&#34;accéder-au-dashboard-admin&#34;&gt;Accéder au Dashboard admin&lt;/h3&gt;
&lt;p&gt;Au moment où j&amp;rsquo;ai écris ce tutoriel, le &lt;a href=&#34;https://github.com/pixelfed/pixelfed/issues/327&#34; title=&#34;Découvrir les détails du bug 327&#34;&gt;bug 327&lt;/a&gt; avait encore cours. Pour pallier à ce problème, j&amp;rsquo;ai lancé 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;&#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 mkdir -p /srv/http/pixelfed/storage/app/public/m &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chown http:http /srv/http/pixelfed/storage/app/public/m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et pour devenir administrateur, sachant que nous sommes le premier utilisateur (id : 1) à s&amp;rsquo;être enregistré :&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;&#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 su - postgres
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;psql pixelfed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UPDATE users SET &lt;span style=&#34;color:#bb60d5&#34;&gt;is_admin&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;t&amp;#39;&lt;/span&gt; WHERE &lt;span style=&#34;color:#bb60d5&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\q&lt;/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;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et vous voilà administrateur !&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Je dois avouer que l&amp;rsquo;installation est non seulement longue, mais compliquée. Le nombre de problèmes à régler est plus important que pour l&amp;rsquo;installation d&amp;rsquo;une autre application PHP que j&amp;rsquo;ai eu l&amp;rsquo;occasion d&amp;rsquo;utiliser.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai par exemple encore quelques soucis pour comprendre comment personnaliser les pages d&amp;rsquo;à propos, de licence, la page d&amp;rsquo;accueil, etc. sans casser mon installation et ses mises à jours. J&amp;rsquo;aimerais également savoir si le lien entre PixelFed et Redis fonctionne réellement, parce que d&amp;rsquo;après le Dashboard admin, Redis est inactif…&lt;/p&gt;
&lt;p&gt;Je suis pressé d&amp;rsquo;être à l&amp;rsquo;année prochaine pour voir ce que ce projet donnera ! Et peut-être aurons-nous une application mobile pour faciliter l&amp;rsquo;envoi de données ? Voire la possibilité d&amp;rsquo;utiliser AndStatus, Twidere ou Tusky pour envoyer nos belles images et nos têtes curieuses &amp;#x1f47d; .&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Mon wiki en tenue d&#39;Adam &amp; Eve</title>
      <link>https://olivier.dossmann.net/2018/07/mon_wiki_en_tenue_d_adama_et_eve/</link>
      <pubDate>Tue, 24 Jul 2018 11:53:08 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2018/07/mon_wiki_en_tenue_d_adama_et_eve/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://olivier.dossmann.net/2017/06/migrer-son-wiki-de-dokuwiki-%C3%A0-hugo/&#34; title=&#34;Lire l&#39;article à propos de la migration de Dokuwiki à Hugo&#34;&gt;Rappelez-vous l&amp;rsquo;année dernière je parlais de migrer de Dokuwiki à Hugo&lt;/a&gt;. Au bout d&amp;rsquo;un an je suis fier de vous annoncer la sortie effective de &lt;a href=&#34;https://olivier.dossmann.net/wiki/&#34; title=&#34;Se rendre sur le Recueil d&#39;Astuces d&#39;Olivier&#34;&gt;mon Wiki sous Hugo en tenue d&amp;rsquo;Adam &amp;amp; Eve&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Après avoir listé rapidement les changements effectués, je vous montrerais quelques images de l&amp;rsquo;avant/après. Je dois avouer être satisfait de ce recueil d&amp;rsquo;astuces qui se présente dans son plus simple apparât grâce à ce thème.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/adam_eve.jpg&#34; alt=&#34;Image au bord d&amp;rsquo;un ruisseau d&amp;rsquo;Adam et Eve, proche des animaux et de la nature&#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/waitingfortheword/&#34; title=&#34;Aller sur la page du profil de Waiting For The Word sur flickr&#34;&gt;profil de Waiting For The Word sur flickr&lt;/a&gt; sous licence CC BY 2.0.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;le-travail-accompli&#34;&gt;Le travail accompli&lt;/h3&gt;
&lt;p&gt;Si j&amp;rsquo;ai pris autant de temps c&amp;rsquo;est essentiellement pour &lt;strong&gt;le remaniement du contenu&lt;/strong&gt;. J&amp;rsquo;ai également profité pour &lt;strong&gt;construire progressivement le &lt;a href=&#34;https://github.com/blankoworld/hugo_theme_adam_eve&#34; title=&#34;Voir la page du projet Adam &amp;amp; Eve, thème pour Hugo&#34;&gt;thème Adam &amp;amp; Eve pour les sites Hugo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;supprimé des pages inutiles&lt;/li&gt;
&lt;li&gt;mis aux archives les pages obsolètes&lt;/li&gt;
&lt;li&gt;corrigé quelques fautes&lt;/li&gt;
&lt;li&gt;remanié du contenu pour qu&amp;rsquo;il soit plus lisible&lt;/li&gt;
&lt;li&gt;corrigé des liens, supprimé d&amp;rsquo;autres&lt;/li&gt;
&lt;li&gt;réordonné la page d&amp;rsquo;accueil et crée différentes rubriques plus adaptées&lt;/li&gt;
&lt;li&gt;crée un endroit d&amp;rsquo;archives&lt;/li&gt;
&lt;li&gt;déplacé - dans un endroit secrètement secret du mystère mystérieux - mes pages personnelles&lt;/li&gt;
&lt;li&gt;adapté le contenu de &lt;a href=&#34;https://www.dokuwiki.org/&#34; title=&#34;Se rendre sur le site officiel de Dokuwiki&#34;&gt;Dokuwiki&lt;/a&gt; à &lt;a href=&#34;http://gohugo.io/&#34; title=&#34;Visiter le site officiel d&#39;Hugo&#34;&gt;Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;crée un &lt;a href=&#34;https://github.com/blankoworld/hugo_theme_adam_eve&#34; title=&#34;Aller sur la page du projet Adam &amp;amp; Eve, thème pour Hugo&#34;&gt;thème Adam &amp;amp; Eve pour Hugo&lt;/a&gt; avec des encarts, façon &lt;a href=&#34;https://www.dokuwiki.org/plugin:note&#34; title=&#34;Connaître les détails de Note Plugin, une extension de Dokuwiki&#34;&gt;Note Plugin de Dokuwiki&lt;/a&gt; et des &lt;a href=&#34;https://gohugo.io/content-management/shortcodes/&#34; title=&#34;En savoir plus sur les shortcodes sous Hugo&#34;&gt;« shortcodes » Hugo&lt;/a&gt; afin d&amp;rsquo;afficher différemment les liens externes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;ai traité 367 pages &lt;a href=&#34;https://www.dokuwiki.org/&#34; title=&#34;Se rendre sur le site officiel de Dokuwiki&#34;&gt;Dokuwiki&lt;/a&gt;. Le résultat contient pas loin de 200 pages désormais. Le nettoyage fait donc du bien !&lt;/p&gt;
&lt;h3 id=&#34;le-changement-visuel&#34;&gt;Le changement visuel&lt;/h3&gt;
&lt;p&gt;Le wiki utilisait le thème de base de &lt;a href=&#34;https://www.dokuwiki.org/&#34; title=&#34;Se rendre sur le site officiel de Dokuwiki&#34;&gt;Dokuwiki&lt;/a&gt; avant le passage à &lt;a href=&#34;http://gohugo.io/&#34; title=&#34;Aller sur la page d&#39;accueil d&#39;Hugo&#34;&gt;Hugo&lt;/a&gt;. Il ressemblait donc à ceci :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/dokuwiki.png&#34; alt=&#34;Image d&amp;rsquo;une ancienne page de mon wiki sur le sujet de la suppression de l&amp;rsquo;amorce Grub sur le système&#34;&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équivalent à ce jour de la page correspondante est :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/grub_wiki_adam_et_eve.png&#34; alt=&#34;Image récente de la même page que la précédente mais avec le thème Adam &amp;amp; Eve&#34;&gt;&lt;/p&gt;
&lt;p&gt;Naviguez sur &lt;a href=&#34;https://olivier.dossmann.net/wiki/&#34; title=&#34;Découvrir mon Recueil d&#39;Astuces&#34;&gt;mon wiki&lt;/a&gt; pour découvrir les différentes pages &amp;#x1f609;.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Grâce à cette formidable aventure j&amp;rsquo;ai pu à la fois ranger et réduire mon wiki et créer un nouveau thème pour les futures personnes souhaitant se lancer dans la création d&amp;rsquo;un wiki à l&amp;rsquo;aide d&amp;rsquo;Hugo.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai aussi parfait ma compréhension et mes connaissances de l&amp;rsquo;outil Hugo. Je vous partagerai sûrement tout cela dans un billet voire ajouterai une page wiki concernant Hugo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit du 15 août 2018 :&lt;/strong&gt; J&amp;rsquo;ai &lt;a href=&#34;https://github.com/gohugoio/hugoThemes/issues/407&#34; title=&#34;En savoir plus sur la demande d&#39;intégration du thème Adam &amp;amp; Eve pour Hugo&#34;&gt;publié mon thème sur le dépôt officiel d&amp;rsquo;Hugo&lt;/a&gt;. Il est en attente de validation. Croisons les doigts !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Wekan, mon alternative à MyTinyTodo</title>
      <link>https://olivier.dossmann.net/2018/02/wekan-mon-alternative-%C3%A0-mytinytodo/</link>
      <pubDate>Wed, 21 Feb 2018 19:07:46 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2018/02/wekan-mon-alternative-%C3%A0-mytinytodo/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Pour encore beaucoup de personnes, s&amp;rsquo;organiser n&amp;rsquo;est pas une tâche facile. On commence par faire des pense-bête sur de petits papiers. Puis les notes s&amp;rsquo;accumulent et le bureau se retrouve complètement recouvert !&lt;/p&gt;
&lt;p&gt;Pour pallier à ce genre de problèmes, j&amp;rsquo;utilise &lt;a href=&#34;http://www.mytinytodo.net/&#34;&gt;MyTinyTodo&lt;/a&gt;. Cependant c&amp;rsquo;est un outil mono-utilisateur et la dernière version date de 2014.&lt;/p&gt;
&lt;p&gt;Je commence donc à tester plusieurs alternatives. Aujourd&amp;rsquo;hui je vais vous parler de l&amp;rsquo;une d&amp;rsquo;entre elles : &lt;a href=&#34;https://wekan.github.io/&#34;&gt;Wekan&lt;/a&gt;, un kanban Libre façon &amp;ldquo;Trello&amp;rdquo; (service de pense-bête en ligne).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/lieux/PenseBete.jpg&#34; alt=&#34;Un bureau complètement recouvert par des pense-bêtes de couleur&#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/arrighi/&#34;&gt;profil de Michael Arrighi sur Flickr&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;présentation-de-wekan&#34;&gt;Présentation de Wekan&lt;/h3&gt;
&lt;p&gt;Wekan se base sur &lt;a href=&#34;https://fr.wikipedia.org/wiki/Kanban_(d%C3%A9veloppement)&#34;&gt;les kanban&lt;/a&gt;, un &lt;strong&gt;système de colonne et de lignes (appelées couloirs)&lt;/strong&gt; pour trier ses tâches.&lt;/p&gt;
&lt;p&gt;Par exemple on pourrait imaginer des colonnes &amp;ldquo;À faire&amp;rdquo;, &amp;ldquo;En cours&amp;rdquo;, &amp;ldquo;En attente&amp;rdquo; et &amp;ldquo;Terminées&amp;rdquo; pour trier ses tâches suivant leur état d&amp;rsquo;avancement. C&amp;rsquo;est vous qui choisissez !&lt;/p&gt;
&lt;p&gt;Ce logiciel utilise des technologies Web assez modernes, ce qui permet une &lt;strong&gt;utilisation agréable de l&amp;rsquo;interface. C&amp;rsquo;est assez intuitif&lt;/strong&gt; de manière générale, bien plus que MyTinyTodo ne l&amp;rsquo;est !&lt;/p&gt;
&lt;p&gt;Je pense d&amp;rsquo;ailleurs que ça vaut le coup de comparer un peu MyTinyTodo et Wekan pour comprendre ce que Wekan peut apporter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/wekan.png&#34; alt=&#34;Un aperçu écran de l&amp;rsquo;interface de Wekan sur un tableau d&amp;rsquo;exemple crée pour l&amp;rsquo;occasion&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;comparaison-succinte-des-deux-outils&#34;&gt;Comparaison succinte des deux outils&lt;/h3&gt;
&lt;p&gt;MyTinyTodo utilise &lt;a href=&#34;https://fr.wikipedia.org/wiki/Getting_Things_Done&#34;&gt;GTD&lt;/a&gt;, une technique qui « trie » les tâches par un degré d&amp;rsquo;importance (4 niveaux). Pour agir sur l&amp;rsquo;interface et changer rapidement quelques tâches de degré d&amp;rsquo;importance, c&amp;rsquo;est une torture parce qu&amp;rsquo;il faut les sélectionner une à une. Là où Wekan propose simplement de déplacer la tâche dans la colonne appropriée.&lt;/p&gt;
&lt;p&gt;En revanche, la &lt;strong&gt;méthode de Kanban&lt;/strong&gt; énnoncée auparavant sous Wekan &lt;strong&gt;implique que vous sachiez comment organiser vos tickets&lt;/strong&gt;. Alors que MyTinyTodo propose plutôt des catégories de tâches. Mais dont le déplacement n&amp;rsquo;est pas aussi simple qu&amp;rsquo;un glisser/déposer.&lt;/p&gt;
&lt;p&gt;MyTinyTodo est mono-utilisateur. Wekan multi-utilisateur, avec un partage des tâches/tableaux et des sections privées/publiques.&lt;/p&gt;
&lt;p&gt;MyTinyTodo consomme peu : 20Mo de mémoire vive à tout péter, avec une base SQLITE3 facile à sauvegarder. Tandis que Wekan utilise 120Mo de mémoire vive, utilise MongoDB qui utilise 20 Mo de mémoire vive et est embêtant à sauvegarder car il faut un script pour lancer la sauvegarde de la base (si on l&amp;rsquo;utilise dans un Docker c&amp;rsquo;est légèrement plus complexe).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;était, dans les grandes lignes, ce qui diffère des deux outils. J&amp;rsquo;ai tout de même mon opinion sur l&amp;rsquo;outil Wekan, dont nous allons tout de suite parler.&lt;/p&gt;
&lt;h3 id=&#34;mon-expérience-de-wekan&#34;&gt;Mon expérience de Wekan&lt;/h3&gt;
&lt;p&gt;Wekan, est une brise fraîche pour la gestion des tâches car le glisser/déposer d&amp;rsquo;une colonne ou d&amp;rsquo;une ligne (ils appellent ça des couloirs) à l&amp;rsquo;autre est aisé. Ce qui implique moins de temps à trier et plus de temps pour réellement faire les tâches. C&amp;rsquo;est agréable.&lt;/p&gt;
&lt;p&gt;Seulement &lt;strong&gt;cet outil est de la folie furieuse&lt;/strong&gt; pour tout le reste :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il consomme pas mal en mémoire vive (120Mo) et en processeur (CPU)&lt;/li&gt;
&lt;li&gt;supprimer une tâche n&amp;rsquo;est pas intuitif : il faut aller dans &amp;ldquo;plus&amp;rdquo; puis trouver un petit lien souligné nommé « Supprimer »&lt;/li&gt;
&lt;li&gt;supprimer un tableau ? Pas possible ! On peut l&amp;rsquo;archiver oui. Et plus tard, si vous êtes un guerrier, vous pouvez utiliser &lt;a href=&#34;https://github.com/wekan/wekan-cleanup&#34;&gt;wekan-cleanup&lt;/a&gt; (un script) pour nettoyer votre base MongoDB&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;outil n&amp;rsquo;est pas disponible sur ARM en 32 bits. Notamment à cause de meteorJS qui est le framework utilisé pour développer l&amp;rsquo;outil&lt;/li&gt;
&lt;li&gt;pas encore de possibilité d&amp;rsquo;utiliser autre chose que la base de données MongoDB&lt;/li&gt;
&lt;li&gt;il utilise NodeJS. Sérieux, c&amp;rsquo;est assez galère de faire une installation propre sans exploser son propre système qui contient lui aussi du Javascript en pagaille&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le produit final est certes agréable pour l&amp;rsquo;utilisateur, mais côté serveur il faut pallier aux problèmes cités.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Vous l&amp;rsquo;aurez compris, &lt;strong&gt;je suis mitigé sur Wekan&lt;/strong&gt;. Je souhaite trouver un outil plus léger, disponible sur ARM, avec une interface web et une méthode simple et « raffinée » pour déplacer rapidement les tâches d&amp;rsquo;une priorité ou d&amp;rsquo;une catégorie à une autre. Peut-être que je cherche le mouton à 5 pattes, mais mon petit doigt me dit que je trouverai une solution pour « créer » un outil capable de saisir et organiser rapidement mes tâches et les accomplir plutôt qu&amp;rsquo;à perdre du temps à les gérer !&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
