<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Astuce sur Olivier DOSSMANN</title>
    <link>https://olivier.dossmann.net/tags/astuce/</link>
    <description>Contenu récent dans Astuce 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/astuce/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>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>Mes conseils pour réussir une formation Bootcamp</title>
      <link>https://olivier.dossmann.net/2024/10/mes_conseils_pour_reussir_une_formation_bootcamp/</link>
      <pubDate>Sun, 13 Oct 2024 10:14:59 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2024/10/mes_conseils_pour_reussir_une_formation_bootcamp/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Il y a peu je commençais une &lt;strong&gt;formation&lt;/strong&gt; chez &lt;a href=&#34;https://datascientest.com/&#34;&gt;DataScientest&lt;/a&gt;. &lt;strong&gt;En Bootcamp&lt;/strong&gt;. Ce format est l&amp;rsquo;équivalent d&amp;rsquo;un &lt;strong&gt;temps complet&lt;/strong&gt; (lundi à vendredi de 8h à 18h) passé sur le contenu du programme pédagogique. Durée prévue dans ma situation : 3 mois.&lt;/p&gt;
&lt;p&gt;Ce temps est nécessaire pour apprendre les différentes notions. C&amp;rsquo;est à la fois long et court : &lt;strong&gt;c&amp;rsquo;est dense&lt;/strong&gt; et le temps accordé est parfois « tout juste » pour lire. Alors comment tenir ce &lt;strong&gt;Marathon de 3 mois&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;aborderais dans un premier temps les éléments qui m&amp;rsquo;ont permis d&amp;rsquo;organiser mon plan de la semaine. Après quoi j&amp;rsquo;aborderais des sujets proches du contenu des cours comme les exercices et les examens. Finalement je donnerais des astuces diverses que j&amp;rsquo;ai listées au fur et à mesure de mon avancée dans l&amp;rsquo;aventure. Cette liste risque donc de s&amp;rsquo;allonger avec le temps !&lt;/p&gt;
&lt;p&gt;À noter que &lt;strong&gt;ces conseils sont forcément emprunts de mon expérience&lt;/strong&gt; de vie, mes compétences et mes particularités (la folie, ça compte ? &amp;#x1f914;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/humains/deep_work.jpg&#34; alt=&#34;Un homme travaillant avec un outil ressemblant à un marteau&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://flickr.com/photos/adouea/43082145135/&#34;&gt;profil de Aurélien Adoue sur Flickr&lt;/a&gt;&lt;/em&gt; sous Licence Attribution 2.0 Generic.&lt;/p&gt;
&lt;h1 id=&#34;organisation&#34;&gt;Organisation&lt;/h1&gt;
&lt;p&gt;1 mois que j&amp;rsquo;ai commencé la formation. Une &lt;strong&gt;durée prévue de 3 mois&lt;/strong&gt;. &lt;strong&gt;Une vie à mener à côté&lt;/strong&gt;. &lt;strong&gt;Des objectifs professionnels&lt;/strong&gt; en lien avec le résultat de ce Bootcamp. Vous ne pouvez pas vous pointer les mains dans les poches.&lt;/p&gt;
&lt;p&gt;Il est évident qu&amp;rsquo;&lt;strong&gt;il faut un plan&lt;/strong&gt;. Tous les conseils pointent sur la même chose : il faut &lt;strong&gt;compartimenter son temps&lt;/strong&gt;. Et s&amp;rsquo;y tenir ; oui &lt;strong&gt;s&amp;rsquo;y tenir&lt;/strong&gt;. Faites-le suivant votre vie et vos possibilités. Mais tenez-y vous ! Et mettez au courant votre entourage de votre planning.&lt;/p&gt;
&lt;h2 id=&#34;mon-planning&#34;&gt;Mon planning&lt;/h2&gt;
&lt;p&gt;Dans mon cas, j&amp;rsquo;ai opté pour le planning suivant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les &lt;strong&gt;matins du lundi au jeudi&lt;/strong&gt; : lecture des &lt;strong&gt;nouveaux cours&lt;/strong&gt;. Apprentissage et exercices, voire &lt;strong&gt;examens&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;les &lt;strong&gt;après-midi du lundi au jeudi&lt;/strong&gt; : &lt;strong&gt;révision des cours&lt;/strong&gt; lus les jours précédents (parfois semaines précédentes), sinon faire des &lt;strong&gt;exercices&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;vendredi&lt;/strong&gt; : &lt;strong&gt;mise en pratique&lt;/strong&gt; des outils/notions appri(e)s(es) sur des projets personnels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De cette manière &lt;strong&gt;la nouveauté arrive quand je suis frais, c&amp;rsquo;est à dire le matin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Viens ensuite l&amp;rsquo;après-midi, après le repas, où je suis moins attentif que le matin. Idéal pour des révisions sur des sujets déjà abordés les jours précédents. Et cela fait une fin de journée plus tranquille que le matin.&lt;/p&gt;
&lt;p&gt;Une révision passe par la rédaction de « fiches » de synthèse pour créer des récapitulatifs de ce qui a été vu. Parfois je dessine des &lt;a href=&#34;https://fr.wikipedia.org/wiki/Carte_heuristique&#34;&gt;cartes heuristiques&lt;/a&gt; : plus parlantes pour moi.&lt;/p&gt;
&lt;p&gt;Pendant la lecture des cours &lt;strong&gt;je note des idées d&amp;rsquo;utilisation des outils découverts&lt;/strong&gt; (en somme des projets qui germent dans ma tête). Ce qui me permet d&amp;rsquo;aborder le vendredi un projet réfléchi pendant la semaine. Exemple : à la lecture du contenu, j&amp;rsquo;ai noté qu&amp;rsquo;il y avait beaucoup d&amp;rsquo;abréviations. Par ailleurs, un des modules du cours apprend à utiliser un outil de création d&amp;rsquo;API. Quoi de mieux que de créer une API pour lister les abréviations ? Et hop!, un projet à faire le vendredi.&lt;/p&gt;
&lt;p&gt;Autre exemple : on apprend le scripting Bash ? Quoi de mieux que de faire un outil pour automatiser l&amp;rsquo;installation de nos logiciels habituels sur les machines virtuelles fournies par le centre de formation ? Ou bien simplifier la vie en ajoutant des raccourcis (alias) Bash pour les commandes usuelles pendant les cours ?&lt;/p&gt;
&lt;p&gt;On apprend la méthode ETL (Extract, Transform, Load) sur des API ? Utilisons notre API des abréviations pour extraire les données !&lt;/p&gt;
&lt;p&gt;Que faire une fois les données extraites ? On a appris à utiliser - en bonus - SQLAlchemy (bibliothèque pour faire des requêtes sur une base de données), pourquoi ne pas l&amp;rsquo;utiliser pour insérer les données extraites de l&amp;rsquo;API pour les charger dans une base de données à nous ?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mais en dehors de ces moments, que fais-tu Olivier ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;hors-planning&#34;&gt;Hors planning&lt;/h2&gt;
&lt;p&gt;Si le planning existe, c&amp;rsquo;est pour une raison : &lt;strong&gt;il est nécessaire d&amp;rsquo;avoir une vie à côté !&lt;/strong&gt; Il faut du temps pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la &lt;strong&gt;famille&lt;/strong&gt; (conjoint(e), enfants, parents, etc.),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;des pauses&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;avoir &lt;strong&gt;du temps à soi&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dormir&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;manger&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Réellement, &lt;strong&gt;il FAUT ce temps&lt;/strong&gt; pour votre famille et vous !&lt;/p&gt;
&lt;p&gt;La famille apporte un entourage (indirectement ça peut être de la confiance en soi), les pauses un souffle pour votre cerveau, le temps à soi pour se retrouver, dormir pour ranger les informations dans votre cerveau et manger pour redonner de l&amp;rsquo;énergie à votre corps !&lt;/p&gt;
&lt;p&gt;Chacun de ces éléments va permettre de franchir plus facilement les obstacles de votre parcours en Bootcamp. D&amp;rsquo;où le côté strict des horaires que vous vous donnez.&lt;/p&gt;
&lt;p&gt;Ainsi après une matinée de lecture de nouveaux cours, vers midi, je m&amp;rsquo;arrête. Et je passe à autre chose : le repas, une pause et un repos &lt;strong&gt;allongé sur le dos&lt;/strong&gt; pendant 10 mn environ. Avant de recommencer sur l&amp;rsquo;après-midi avec les révisions de la veille.&lt;/p&gt;
&lt;p&gt;Après 17h ? Je m&amp;rsquo;arrête également. Je passe aux tâches quotidiennes, de la famille et du repas du soir. Un peu de détente. Un bon gros sommeil de plus de 8h.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et la journée recommence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le week-end ? Pas de formation.&lt;/strong&gt; La famille, les amis, du temps pour notre conjoint, pour soi, etc. On fait toutes ces choses qui donnent &lt;strong&gt;de l&amp;rsquo;énergie&lt;/strong&gt; et remplissent &lt;strong&gt;notre cœur&lt;/strong&gt;, &lt;strong&gt;notre corps&lt;/strong&gt; et &lt;strong&gt;notre moral&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La partie organisation est très importante, elle va définir si vous aurez la tête sous l&amp;rsquo;eau ou pas. Prenez donc le temps de définir tout ça. Respectez votre planning et les personnes qui vous entourent. Par ailleurs, ce n&amp;rsquo;est qu&amp;rsquo;une seule clé parmi d&amp;rsquo;autres : pour que cela fonctionne il est nécessaire d&amp;rsquo;être efficace lors de sa période de travail. C&amp;rsquo;est ce que nous allons voir dans le prochain chapitre.&lt;/p&gt;
&lt;h1 id=&#34;travail-efficace&#34;&gt;Travail efficace&lt;/h1&gt;
&lt;p&gt;Il n&amp;rsquo;y a pas de secrets selon moi, &lt;strong&gt;un travail efficace est&lt;/strong&gt; déterminé par :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;un &lt;strong&gt;environnement&lt;/strong&gt; spécifique de travail,&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;technique d&amp;rsquo;assimilation&lt;/strong&gt; particulière,&lt;/li&gt;
&lt;li&gt;et une façon d&amp;rsquo;agir durant &lt;strong&gt;les examens&lt;/strong&gt; chronométrés.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je vais donc vous parler de chacun des ces points en donnant quelques astuces issues d&amp;rsquo;études faites sur la question.&lt;/p&gt;
&lt;h2 id=&#34;point-1-lenvironnement-de-travail&#34;&gt;Point 1 : l&amp;rsquo;environnement de travail&lt;/h2&gt;
&lt;p&gt;À la lecture du livre &lt;a href=&#34;https://calnewport.com/deep-work-rules-for-focused-success-in-a-distracted-world/&#34;&gt;Deep work, retrouver la concentration dans un monde de distractions&lt;/a&gt; écrit par Cal NEWPORT (un professeur dans les sciences informatiques du MIT - rien que ça!), j&amp;rsquo;ai bien compris qu&amp;rsquo;il fallait un environnement &lt;strong&gt;sans distractions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Exit les &lt;strong&gt;téléphones mobiles&lt;/strong&gt; : on le met &lt;strong&gt;sur mode avion&lt;/strong&gt;. On s&amp;rsquo;enferme dans une pièce, à clé. On mobilise toutes nos ressources pour se concentrer sur la tâche à accomplir : apprendre les cours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toute perturbation est à proscrire&lt;/strong&gt; et malheureusement pour certains : la musique en fait partie. Il semble que des études ont déterminé que cela activait des zones du cerveau qui empêchent une concentration complète.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée du livre « Deep work » est que &lt;strong&gt;si vous êtes concentrés vous prendrez moins de temps à travailler&lt;/strong&gt;. Ce qui me semble tout à fait adapté pour une formation en Bootcamp, n&amp;rsquo;est-ce pas ?&lt;/p&gt;
&lt;h2 id=&#34;point-2-assimiler-les-cours&#34;&gt;Point 2 : assimiler les cours&lt;/h2&gt;
&lt;p&gt;Là encore, les scientifiques ont étudié la question. Et c&amp;rsquo;est au travers d&amp;rsquo;une &lt;strong&gt;&lt;a href=&#34;https://scienceetonnante.com/2023/09/01/mieux-apprendre-etudier-les-vraies-techniques-scientifiques/&#34;&gt;vidéo de Science étonnante concernant les (vraies) techniques pour mieux apprendre et étudier&lt;/a&gt;&lt;/strong&gt; que j&amp;rsquo;ai pu améliorer mon apprentissage.&lt;/p&gt;
&lt;p&gt;Je vous conseille de regarder la vidéo - YouTube - et d&amp;rsquo;imaginer une nouvelle façon d&amp;rsquo;étudier, de réviser et de travailler.&lt;/p&gt;
&lt;p&gt;De mon côté j&amp;rsquo;ai opté pour &lt;strong&gt;la relecture régulière&lt;/strong&gt;, la lecture &lt;strong&gt;de plusieurs cours&lt;/strong&gt; qui font souvent &lt;strong&gt;des liens sur le domaine étudié&lt;/strong&gt; et &lt;strong&gt;la mise en pratique&lt;/strong&gt; par des cas concrets de la vie courante pour s&amp;rsquo;entraîner avec les outils étudiés. J&amp;rsquo;en parlais tout à l&amp;rsquo;heure : la création d&amp;rsquo;une API, l&amp;rsquo;extraction des données de cette dernière pour les introduire ensuite dans une autre base de données sous un autre format.&lt;/p&gt;
&lt;p&gt;À noter que plus loin dans cet article je vous demanderais de ne pas suivre de vidéos YouTube pendant vos études Bootcamp, je ne suis pas schizophrène : considérez cette vidéo comme l&amp;rsquo;exception qui confirme la règle &amp;#x1f603; .&lt;/p&gt;
&lt;h2 id=&#34;point-3-les-examens&#34;&gt;Point 3 : les examens&lt;/h2&gt;
&lt;p&gt;Certains examens sont chronométrés. Ce qui peut très vite être déstabilisant !&lt;/p&gt;
&lt;p&gt;Je propose plusieurs choses pour s&amp;rsquo;en sortir :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rien de mieux que &lt;strong&gt;la préparation&lt;/strong&gt; : si vous avez fait les cours régulièrement et &lt;strong&gt;que vous avez révisé&lt;/strong&gt; 1 jour après, 2 jours après, 1 semaine après, vous retiendrez bien mieux les cours ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faites des exercices&lt;/strong&gt; avant et sentez-vous un minimum à l&amp;rsquo;aise, &lt;strong&gt;travaillez les points sensibles&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;Lors des examens : &lt;strong&gt;ouvrez en avance les documentations&lt;/strong&gt; qui vous aident ;&lt;/li&gt;
&lt;li&gt;Dans les examens, optez pour &lt;strong&gt;des noms de variables courts&lt;/strong&gt; : plus vous rallongez le nom des fonctions et des variables, plus vous aurez à taper du code. Indirectement vous prenez un temps fou pour rédiger au lieu de réfléchir !&lt;/li&gt;
&lt;li&gt;Pour les examens, &lt;strong&gt;préparez&lt;/strong&gt; déjà à côté vos codes sur le sujet : c&amp;rsquo;est &lt;strong&gt;votre code, celui qui vous ressemble&lt;/strong&gt;. Rien n&amp;rsquo;interdit un copier-coller de votre propre travail !&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Avec ces 3 points, vous devriez déjà avoir &lt;strong&gt;de bonnes bases&lt;/strong&gt; pour aborder la formation. Il y a d&amp;rsquo;autres astuces diverses que nous allons découvrir maintenant.&lt;/p&gt;
&lt;h1 id=&#34;diverses-astuces&#34;&gt;Diverses astuces&lt;/h1&gt;
&lt;p&gt;Ne sachant dans quelles catégories mettre ces astuces, mais considérant ces dernières comme tout aussi importantes, je vous les dépose là. Piochez selon vos envies ;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Revoyez chaque semaine le planning&lt;/strong&gt; que vous allez suivre : quel cours étudier chaque jour. Prenez en compte les sujets sur lesquels vous avez déjà des connaissances pour passer plus de temps sur ceux que vous ne connaissez pas ;&lt;/li&gt;
&lt;li&gt;Ne prenez &lt;strong&gt;des notes qu&amp;rsquo;à une seconde lecture&lt;/strong&gt; (lors de révisions par exemple) : sinon vous allez passer trop de temps sur un cours ;&lt;/li&gt;
&lt;li&gt;Si vous avez un &lt;strong&gt;souci logiciel&lt;/strong&gt; qui empêche de travailler : &lt;strong&gt;passez à autre chose&lt;/strong&gt; !&lt;/li&gt;
&lt;li&gt;Quand vous revenez sur un souci logiciel - plus tard - si vous ne réussisez pas mieux, &lt;strong&gt;utilisez &lt;a href=&#34;https://chat.openai.com/&#34;&gt;ChatGPT&lt;/a&gt; pour décrire votre problème&lt;/strong&gt;. Cet outil est plutôt efficace pour donner des pistes. Rappelez vous, &lt;strong&gt;ChatGPT est un assistant&lt;/strong&gt;, vous le dirigez. Ce n&amp;rsquo;est pas lui qui doit vous diriger. ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&amp;rsquo;utilisez pas de vidéos pour apprendre&lt;/strong&gt; - YouTube ou autre - c&amp;rsquo;est une &lt;strong&gt;perte de temps considérable&lt;/strong&gt;. Pourquoi ? Tout simplement car vous ne pourrez pas voir rapidement si la vidéo vous apporte quelque chose de concret ou non. Et parfois ce qu&amp;rsquo;ils disent est tout bonnement faux ! Cela vous apporte plus de confusion qu&amp;rsquo;autre chose. En revanche chez DataScientest ils ont des vidéos de cours. Cela apporte généralement quelque chose de concret et de vrai ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lisez de la documentation&lt;/strong&gt; des outils utilisés : elles ne mentent pas. Elles décrivent. Et peut-être retiendrez-vous des options qui vous feront gagner plus tard un temps fou !&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restez humbles&lt;/strong&gt; : même si vous maîtrisez un sujet, vous trouverez souvent des nouveautés et des détails que vous ne connaissiez pas dans les cours ;&lt;/li&gt;
&lt;li&gt;Si vous avez la possibilité, &lt;strong&gt;apprenez à utiliser des dépôts Git rapidement pour enregistrer votre travail&lt;/strong&gt; sur les machines virtuelles distantes proposées par la formation. Cela vous évitera de mauvaises surprises quand les machines se réinitialisent…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si jamais je trouve d&amp;rsquo;autres astuces je les rajouterai ici.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Cette formation m&amp;rsquo;a permis de travailler mon environnement, mes méthodes de travail et découvrir des astuces pour &lt;strong&gt;être plus efficace en journée&lt;/strong&gt;. Et cela &lt;strong&gt;sans mettre de côté la famille&lt;/strong&gt; et la maison. Ce qui &lt;strong&gt;donne de l&amp;rsquo;énergie pour continuer chaque semaine&lt;/strong&gt; de travailler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C&amp;rsquo;est un cercle vertueux&lt;/strong&gt; que je conseille à chacun pour améliorer son quotidien et &lt;strong&gt;être plus productif&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Je souhaite de tout cœur &lt;strong&gt;que chacun trouve son équilibre&lt;/strong&gt; dans sa vie et réussisse sa formation en Bootcamp. Bonne chance à vous et bon travail !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Cron sous Docker avec Alpine</title>
      <link>https://olivier.dossmann.net/2022/10/cron-sous-docker-avec-alpine/</link>
      <pubDate>Wed, 12 Oct 2022 21:41:39 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2022/10/cron-sous-docker-avec-alpine/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Chose promie, chose due ! J&amp;rsquo;écris un article sur mes pérégrinations en informatique.&lt;/p&gt;
&lt;p&gt;Cette fois, je fais suite à &lt;a href=&#34;https://olivier.dossmann.net/2022/09/%C3%A9tat-des-lieux-2022/&#34;&gt;l&amp;rsquo;état des lieux 2022 de mon espace numérique&lt;/a&gt;. Certains de mes services/sites nécessitent régulièrement d&amp;rsquo;être mis à jour. Pour cela je souhaite utiliser &lt;strong&gt;Cron, un service sous GNU/Linux qui permet de planifier le lancement de script(s) à des fréquences définies&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme je souhaite utiliser Docker, je me suis demandé s&amp;rsquo;il était possible de créer un service dédié avec Cron, Docker et Alpine.&lt;/p&gt;
&lt;p&gt;Cet article explique quelques règles que j&amp;rsquo;ai dû suivre pour y parvenir. Il vous faudra a minima connaître Docker, voire Docker Compose pour comprendre quelque chose. À la rigueur vous connaissez déjà Cron et souhaitez l&amp;rsquo;utiliser sous Docker.&lt;/p&gt;
&lt;p&gt;Nous allons d&amp;rsquo;abord réflechir sur le sujet. Puis nous utiliserons l&amp;rsquo;exemple d&amp;rsquo;un site pour expliquer la solution choisie avant de conclure sur cette histoire.&lt;/p&gt;
&lt;p&gt;Pour les pressés, j&amp;rsquo;ai fais un chapitre « En bref » à la fin de cet article.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/objets/montre.jpg&#34; alt=&#34;Montre de poignet avec un stylo&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo trouvée sur le &lt;a href=&#34;https://flickr.com/photos/ducly/&#34;&gt;profil de Duc Ly sur Flickr&lt;/a&gt;&lt;/em&gt; sous licence CC BY-SA 2.0.&lt;/p&gt;
&lt;h1 id=&#34;réflexion-sur-le-sujet&#34;&gt;Réflexion sur le sujet&lt;/h1&gt;
&lt;p&gt;Ce que nous souhaitons faire, c&amp;rsquo;est lancer un service, par exemple &lt;strong&gt;almanax&lt;/strong&gt;, et le mettre à jour régulièrement avec une tâche dans le service &lt;strong&gt;cron&lt;/strong&gt;. Je vais expliquer un peu ma réflexion, si vous voulez entrer plus rapidement dans le vif du sujet, rendez-vous au chapitre suivant.&lt;/p&gt;
&lt;p&gt;Tout d&amp;rsquo;abord il faut savoir que &lt;strong&gt;l&amp;rsquo;environnement choisi est Docker&lt;/strong&gt;. Un système qui permet, &lt;strong&gt;à partir d&amp;rsquo;une image&lt;/strong&gt; de &lt;strong&gt;générer plusieurs conteneurs&lt;/strong&gt; ayant des points de montage différents pour changer les données qui s&amp;rsquo;y trouvent.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/develop/dev-best-practices/&#34;&gt;Docker propose plusieurs bonnes pratiques&lt;/a&gt;, parmi lesquelles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ne lancer qu&amp;rsquo;un seul processus/service dans chaque conteneur&lt;/li&gt;
&lt;li&gt;réutiliser les images ou les parties d&amp;rsquo;images au maximum pour réduire à la fois la maintenance des images/conteneurs, le travail effectué et la place système utilisée pour les images de base&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sachant que nous ne lançons qu&amp;rsquo;un seul processus par conteneur Docker, et que je souhaite utiliser Cron, je vais devoir lancer cron dans un autre service. Concrètement, Docker propose Docker Compose qui est un outil permettant de lancer plusieurs services à la fois, avec des dépendances entre eux (si besoin), une description des points de montage, des commandes à lancer sur chaque service, les ports ouverts, etc.&lt;/p&gt;
&lt;p&gt;On peut également choisir l&amp;rsquo;image qu&amp;rsquo;on souhaite utiliser pour chaque service.&lt;/p&gt;
&lt;p&gt;Certes nous allons lancer Cron dans un service à part, pour lancer les scripts que notre autre service a besoin pour mettre à jour ce dernier - je pense notamment à un script qui recompile et reconstitue mes pages webs statiques -, mais nous allons devoir avoir accès à notre service &lt;strong&gt;almanax&lt;/strong&gt; qui contient la logique principale du site.&lt;/p&gt;
&lt;p&gt;Pour cela, l&amp;rsquo;idée est de modifier l&amp;rsquo;image de &lt;strong&gt;almanax&lt;/strong&gt; pour qu&amp;rsquo;elle contienne elle aussi &lt;strong&gt;cron&lt;/strong&gt;. Ainsi on pourra lancer la même image sous Docker Compose, avec une commande de lancement différente.&lt;/p&gt;
&lt;p&gt;On utilise des services Docker. Chacun ayant déjà leur propre image sous Alpine. Ainsi, chaque image possède déjà Cron inclut dans Alpine.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;allais dire qu&amp;rsquo;une image vaut mieux que 1 000 mots, mais là nous allons donner un exemple avec Docker Compose pour comprendre de quoi il s&amp;rsquo;agit.&lt;/p&gt;
&lt;h1 id=&#34;mise-en-place-exemple-avec-lalmanax&#34;&gt;Mise en place, exemple avec l&amp;rsquo;Almanax&lt;/h1&gt;
&lt;p&gt;Peut-être le savez-vous déjà : j&amp;rsquo;ai crée une page statique qui liste une quinzaine de quêtes de l&amp;rsquo;Almanax dans un jeu nommé Dofus.&lt;/p&gt;
&lt;p&gt;Cet outil est un de mes services fourni aux utilisateurs, mais également &lt;a href=&#34;https://github.com/blankoworld/dofus-almanax&#34;&gt;un projet Open Source, dofus-almanax que je fournis via Github&lt;/a&gt;. C&amp;rsquo;est dans ce dépôt Github que vous trouverez la plupart des fichiers nécessaires au bon lancement d&amp;rsquo;un service Cron que nous allons décrire.&lt;/p&gt;
&lt;p&gt;On va étudier le fichier docker-compose.yml 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;version: &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  generator:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    build: .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image: dofus-almanax:0.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - almanax_public:/opt/almanax/public:rw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - almanax_data:/opt/almanax/dl:rw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  web:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image: caddy:2-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    restart: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    depends_on:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - generator
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - almanax_public:/usr/share/caddy:ro
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#70a0d0&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#bb60d5&#34;&gt;PWD&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;/Caddyfile:/etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ports:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - 8888:80
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cron:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image: dofus-almanax:0.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    restart: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    entrypoint: /usr/sbin/crond
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command: &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;-f&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;-l&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;-L&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/dev/stdout&amp;#34;&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;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - almanax_public:/opt/almanax/public:rw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - almanax_data:/opt/almanax/dl:rw
&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;volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  almanax_public:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  almanax_data:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nous avons 3 services :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generator : qui génère le site web au lancement, suite à quoi il s&amp;rsquo;éteint,&lt;/li&gt;
&lt;li&gt;web : un service pour mettre à disposition les fichiers statiques générés par &lt;strong&gt;generator&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;cron : un service pour mettre à jour régulièrement les fichiers statiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La particularité de la solution :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;generator&lt;/strong&gt; et &lt;strong&gt;cron&lt;/strong&gt; utilisent la même image : dofus-almanax:0.2&lt;/li&gt;
&lt;li&gt;ces deux services n&amp;rsquo;ont cependant pas la même commande au lancement : l&amp;rsquo;un prend la commande par défaut de l&amp;rsquo;image dofus-almanax:0.2, l&amp;rsquo;autre lance spécifiquement cron&lt;/li&gt;
&lt;li&gt;pour le service &lt;strong&gt;cron&lt;/strong&gt;, il spécifie avec le mot clé &lt;strong&gt;entrypoint&lt;/strong&gt; d&amp;rsquo;utiliser &lt;strong&gt;/usr/sbin/crond&lt;/strong&gt; (chemin absolu du binaire sous Alpine) et donne les paramètres &lt;code&gt;-f -l 2 -L /dev/stdout&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que font les paramètres ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; définit de lancer le service en &lt;code&gt;foreground&lt;/code&gt;, nécessaire sous Docker, sinon cela ne fonctionne pas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l 2&lt;/code&gt; définit un niveau de journalisation, habituellement c&amp;rsquo;est 8 (Cf. &lt;a href=&#34;https://unix.stackexchange.com/a/496741&#34;&gt;une explication des niveaux crond sous Stackoverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-L /dev/stdout&lt;/code&gt; permet d&amp;rsquo;avoir une sortie à l&amp;rsquo;écran dans Docker Compose&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ça, c&amp;rsquo;est les éléments de base. Cependant comment fonctionne la mise à jour, la configuration de cette dernière, etc.?&lt;/p&gt;
&lt;h1 id=&#34;fonctionnement-de-cron-dans-limage-dofus-almanax02&#34;&gt;Fonctionnement de Cron dans l&amp;rsquo;image dofus-almanax:0.2&lt;/h1&gt;
&lt;p&gt;Nous l&amp;rsquo;avions dit, l&amp;rsquo;idée est de tout mettre dans l&amp;rsquo;image &lt;strong&gt;dofus-almanax:0.2&lt;/strong&gt; (à la fois nos scripts, nos fichiers &lt;strong&gt;et&lt;/strong&gt; crond). Mais comment configurer le service Cron pour lui indiquer la fréquence à laquelle mettre à jour et comment mettre à jour nos fichiers ?&lt;/p&gt;
&lt;p&gt;Regardons l&amp;rsquo;image Docker, écrite sous le fichier Dockerfile 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-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;alpine:3.16&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;RUN&lt;/span&gt; apk update &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&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;    apk add --no-cache &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;        py3-lxml &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;	py3-mechanize &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;	tzdata &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&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;    rm -rf /var/cache/apk/*&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;ENV&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;TZ&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;Europe/Paris&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/opt/almanax&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;VOLUME&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/opt/almanax/public&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;VOLUME&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;/opt/almanax/dl&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;ENTRYPOINT&lt;/span&gt; [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;python3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;almanax_next_week.py&amp;#34;&lt;/span&gt;]&lt;span style=&#34;&#34;&gt;
&lt;/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;CMD&lt;/span&gt; [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/opt/almanax/public/index.html&amp;#34;&lt;/span&gt;]&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;COPY&lt;/span&gt; ./src /opt/almanax&lt;span style=&#34;&#34;&gt;
&lt;/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;COPY&lt;/span&gt; ./crontabs /etc/crontabs/root&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;RUN&lt;/span&gt; chown root:root /etc/crontabs/root &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&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;    chmod &lt;span style=&#34;color:#40a070&#34;&gt;600&lt;/span&gt; /etc/crontabs/root&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/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;COPY&lt;/span&gt; ./cron_scripts/generate.sh /opt/generate&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Étudions ce fichier dans les grandes lignes concernant le service Cron notamment.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nous partons d&amp;rsquo;une &lt;strong&gt;image Alpine 3.16 qui contient déjà crond&lt;/strong&gt; (le service Cron)&lt;/li&gt;
&lt;li&gt;Nous installons &lt;strong&gt;tzdata&lt;/strong&gt; qui nous permettra de choisir correctement un fuseau horaire&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENV TZ=Europe/Paris&lt;/code&gt; définit notre fuseau horaire, histoire de lancer le script au moment où nous nous y attendons&lt;/li&gt;
&lt;li&gt;Le fichier le plus important, &lt;strong&gt;cronbtabs&lt;/strong&gt; est copié vers &lt;strong&gt;/etc/crontabs/root&lt;/strong&gt;, la ligne &lt;code&gt;COPY ./crontabs /etc/crontabs/root&lt;/code&gt; est déterminante pour remplacer le fichier du service crond d&amp;rsquo;Alpine Linux&lt;/li&gt;
&lt;li&gt;On copie aussi un script &lt;strong&gt;generate.sh&lt;/strong&gt; dont nous parlerons après&lt;/li&gt;
&lt;li&gt;Ce même fichier nécessite des permissions spécifiques, notifiée vers la fin du fichier Dockerfile :&lt;/li&gt;
&lt;/ol&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-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;RUN&lt;/span&gt; chown root:root /etc/crontabs/root &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&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;    chmod &lt;span style=&#34;color:#40a070&#34;&gt;600&lt;/span&gt; /etc/crontabs/root&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Que contient le fichier crontabs et generate.sh ?&lt;/p&gt;
&lt;h1 id=&#34;la-configuration-du-service-crond&#34;&gt;La configuration du service crond&lt;/h1&gt;
&lt;p&gt;Sous Alpine, le fichier  utilisé pour configurer les éléments à lancer par crond est &lt;strong&gt;/etc/crontabs/root&lt;/strong&gt;. Dans le chapitre précédent nous parlions de comment le remplacer, voici désormais son 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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;       &lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;       *       *       *       /bin/sh /opt/generate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Nous voyons que nous utilisons effectivement le script &lt;strong&gt;generate.sh&lt;/strong&gt; - qui a d&amp;rsquo;ailleurs été renommé &lt;strong&gt;generate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nous utilisons &lt;code&gt;/bin/sh&lt;/code&gt; devant notre script :
&lt;ul&gt;
&lt;li&gt;c&amp;rsquo;est un chemin absolu vers le binaire sh&lt;/li&gt;
&lt;li&gt;et nous utilisons sh, pas bash (car bash n&amp;rsquo;est, à défaut, pas délivré sous Alpine Linux)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nous utilisons des caractères spécifique, formatés spécifiquement pour dire que nous lançons le service à 00h05 du matin&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour générer un fichier compatible avec crond, je vous suggère &lt;a href=&#34;https://crontab-generator.org/&#34;&gt;Crontab Generator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il va falloir appliquer quelques règles pour être sûr que tout cela fonctionne évidemment.&lt;/p&gt;
&lt;h1 id=&#34;en-bref-les-règles-à-appliquer-pour-crond&#34;&gt;En bref, les règles à appliquer pour crond&lt;/h1&gt;
&lt;p&gt;Voici les règles à retenir pour rédiger le fichier que le service crond va étudier :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7 espaces entre chaque élément défini dans le crontab (le fichier se nomme ainsi)&lt;/li&gt;
&lt;li&gt;utiliser /bin/sh sous Alpine pour lancer un script, puis le nom de votre script&lt;/li&gt;
&lt;li&gt;ne pas mettre de point dans le script qu&amp;rsquo;on lance (mettre par exemple &lt;code&gt;generate&lt;/code&gt; au lieu de &lt;code&gt;generate.sh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;le fichier &lt;code&gt;/etc/crontabs/root&lt;/code&gt; doit appartenir à root (&lt;code&gt;root:root&lt;/code&gt;) et avoir les permissions 600 (&lt;code&gt;chmod 600&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;utilisez &lt;code&gt;-L /dev/stdout&lt;/code&gt; sous votre Docker Compose pour avoir une sortie lisible et &lt;code&gt;-l 2&lt;/code&gt; pour plus de logs, mais &lt;code&gt;-l 8&lt;/code&gt; suffit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qui fait déjà pas mal de choses à savoir !&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Bien que la réflexion ait été longue (et croyez moi j&amp;rsquo;ai pris plusieurs jours pour tester au fur et à mesure ce que je souhaitais), nous avons réuni les seules règles à appliquer pour que cela fonctionne, tout en trouvant une solution sympathique qui a plusieurs avantages :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le service Cron accède à tous les fichiers communs de notre service initial&lt;/li&gt;
&lt;li&gt;le service Cron accède également à tous les scripts utiles de notre service initial&lt;/li&gt;
&lt;li&gt;il suffit de changer le script d&amp;rsquo;entrée de l&amp;rsquo;image initiale pour lancer Cron&lt;/li&gt;
&lt;li&gt;on a peu de changement à faire pour utiliser Cron finalement !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;inconvénient reste cependant qu&amp;rsquo;il faut pouvoir modifier l&amp;rsquo;image initiale. Si nous n&amp;rsquo;avions pas la possibilité de faire ça, j&amp;rsquo;imagine qu&amp;rsquo;on devrait créer un point de montage commun entre le service initial et le service cron pour accéder à la fois aux fichiers mais aussi aux binaires… ce qui est bien plus complexe/casse-tête !&lt;/p&gt;
&lt;h1 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h1&gt;
&lt;p&gt;Je me suis grandement inspiré, pour mes pérégrinations sur Cron dans Alpine sous Docker par :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://devopsheaven.com/cron/docker/alpine/linux/2017/10/30/run-cron-docker-alpine.html&#34;&gt;https://devopsheaven.com/cron/docker/alpine/linux/2017/10/30/run-cron-docker-alpine.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mixu.wtf/cron-in-docker-alpine-image/&#34;&gt;https://mixu.wtf/cron-in-docker-alpine-image/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://crontab-generator.org/&#34;&gt;Crontab Generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>Concept et utilisation du Bullet Journal ou bujo</title>
      <link>https://olivier.dossmann.net/2018/06/concept_et_utilisation_du_bullet_journal_ou_bujo/</link>
      <pubDate>Tue, 05 Jun 2018 09:39:43 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2018/06/concept_et_utilisation_du_bullet_journal_ou_bujo/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Vous le constaterez au gré de ce blog : je suis en constante recherche d&amp;rsquo;une méthode pour m&amp;rsquo;organiser.&lt;/p&gt;
&lt;p&gt;S&amp;rsquo;il y a quelques années je découvrais &lt;a href=&#34;https://fr.wikipedia.org/wiki/Getting_Things_Done&#34;&gt;la méthode GTD&lt;/a&gt;, elle n&amp;rsquo;a eu d&amp;rsquo;effet que de nourrir mon bureau de post-it. Certes j&amp;rsquo;ai agrémenté la méthode de &lt;a href=&#34;https://olivier.dossmann.net/2016/10/sorganiser-num%C3%A9riquement-avec-un-planning-des-contacts-et-des-t%C3%A2ches/&#34;&gt;divers outils numériques pour m&amp;rsquo;épauler dans l&amp;rsquo;organisation du planning&lt;/a&gt;. Si &lt;a href=&#34;https://olivier.dossmann.net/2017/06/sorganiser-avec-lessy/&#34;&gt;la méthode Lessy&lt;/a&gt; fonctionne pour mes jeux vidéos/projets à accomplir, elle n&amp;rsquo;est pas du tout adaptée à mon organisation journalière. Même &lt;a href=&#34;https://olivier.dossmann.net/2018/02/wekan-mon-alternative-%C3%A0-mytinytodo/&#34;&gt;Wekan, dont je partageais récemment mon expérience&lt;/a&gt;, n&amp;rsquo;a pas su résoudre l&amp;rsquo;achèvement régulier de mes tâches.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo.jpg&#34; alt=&#34;Image d&amp;rsquo;une pile de livres&#34;&gt;&lt;/p&gt;
&lt;p&gt;Je m&amp;rsquo;attache donc cette fois à l&amp;rsquo;utilisation sur plusieurs semaines/mois d&amp;rsquo;une nouvelle méthode : la méthode du &lt;a href=&#34;http://bulletjournal.com/&#34;&gt;Bullet Journal®&lt;/a&gt;. Je remercie d&amp;rsquo;ailleurs Dorian - qui se reconnaîtra - de m&amp;rsquo;avoir appris l&amp;rsquo;existence de cette méthode.&lt;/p&gt;
&lt;p&gt;Après une brève présentation de la méthode je vous montrerai mon bujo et vous expliquerait ensuite en quoi j&amp;rsquo;ai apprécié cette méthode.&lt;/p&gt;
&lt;h3 id=&#34;présentation&#34;&gt;Présentation&lt;/h3&gt;
&lt;p&gt;Le &lt;a href=&#34;http://bulletjournal.com/&#34;&gt;Bullet Journal®&lt;/a&gt; a été crée par Ryder Caroll pour rassembler les informations contenues dans la plupart des bouts de papier qu&amp;rsquo;on utilise :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la liste des courses&lt;/li&gt;
&lt;li&gt;les post-its&lt;/li&gt;
&lt;li&gt;le planning mensuel, hebdomadaire et journalier&lt;/li&gt;
&lt;li&gt;les évènements de l&amp;rsquo;année (anniversaires, fêtes, sorties, etc.)&lt;/li&gt;
&lt;li&gt;les prises de notes&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il désigne à la fois la méthode et le livre utilisé pour l&amp;rsquo;appliquer. Les fans l&amp;rsquo;appellent aussi &lt;strong&gt;le bujo&lt;/strong&gt; (deux premières lettre de chaque mot).&lt;/p&gt;
&lt;p&gt;Vous retrouverez une &lt;a href=&#34;https://web.archive.org/web/20180201091946/http://help.bulletjournal.com/article/37-start-here&#34;&gt;explication en anglais de la méthode sur le site officiel (sur WebArchive)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si je devais résumer en quelques points la méthode je dirais :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;utiliser un livre facile à emporter avec soi&lt;/li&gt;
&lt;li&gt;utiliser un livre à pages numérotées ou numéroter soi-même les pages&lt;/li&gt;
&lt;li&gt;utiliser un index dans ce livre pour définir à quelle page commence quelle section&lt;/li&gt;
&lt;li&gt;utiliser une légende pour les sigles du livre - au moins pour le premier bujo, le temps de s&amp;rsquo;habituer&lt;/li&gt;
&lt;li&gt;utiliser 2 pages au début pour un planning semestriel des 6 prochains mois et y rassembler les gros évènements. Par exemple les anniversaires.&lt;/li&gt;
&lt;li&gt;utiliser ensuite 2 pages pour un planning mensuel du mois en cours. 1 ligne par jour devrait aller. Y placer des événements clés du mois. Sur la page de droite placer les tâches que vous souhaitez effectuer dans le courant du mois&lt;/li&gt;
&lt;li&gt;utiliser après ça autant de page que nécessaires pour écrire, chaque jour, les tâches à faire&lt;/li&gt;
&lt;li&gt;faire le point régulièrement sur les tâches journalières&lt;/li&gt;
&lt;li&gt;ne pas se tracasser si on a manqué plusieurs jours, pas besoin d&amp;rsquo;écrire quoique ce soit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous trouverez énormément d&amp;rsquo;exemples sur le Web, notamment sur Youtube et Instagram. Au bas de cet article sont exposés quelques liens intéressants pour vous documenter et créer votre bujo ultime !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bullet_journal_method.jpg&#34; alt=&#34;Image issue du site web officiel du Bullet Journal®&#34;&gt;&lt;/p&gt;
&lt;p&gt;La communauté propose des exemples pour le suivi de l&amp;rsquo;humeur, la météo, les livres à lire, les séries TV en cours, les films à voir, les anniversaires à venir, le sommeil, les finances, les screencasts, etc.&lt;/p&gt;
&lt;h3 id=&#34;mon-bujo&#34;&gt;Mon bujo&lt;/h3&gt;
&lt;p&gt;Étant donné qu&amp;rsquo;un bujo est un support physique, je vous propose de mettre les images et commenter ensuite.&lt;/p&gt;
&lt;p&gt;Pour la petite histoire, ne sachant pas si je persisterais avec le bujo j&amp;rsquo;ai commencé par en fabriquer un avec les moyens du bord.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-0.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;La page de garde me semble importante pour 2 choses :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dire à qui appartient le livre&lt;/li&gt;
&lt;li&gt;donner une adresse où renvoyer le livre s&amp;rsquo;il est trouvé&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pratique si on l&amp;rsquo;oublie dans les transports en commun ou qu&amp;rsquo;il tombe de notre sac/poche.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-1.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;index sert à ce qu&amp;rsquo;il annonce : trouver une page parmi notre livre. Il fait partie intégrante de la méthode puisque grâce à cela nous pouvons rendre notre bujo modulaire et ajouter les sections que l&amp;rsquo;on souhaite.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-2.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ma page de légende ajoute quelques éléments supplémentaire à celle fournie par Ryder Caroll :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;je décris un sigle particulier qui permet de désigner 3 tâches prioritaires à faire dans la journée&lt;/li&gt;
&lt;li&gt;j&amp;rsquo;ai mis en place un système de récompense pour ces 3 tâches lorsqu&amp;rsquo;elles sont effectuées&lt;/li&gt;
&lt;li&gt;je fais le suivi de mon humeur et de la météo que vous découvrirez sur mon planning mensuel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adaptez suivant vos besoins, vos envies et vos émotions du moment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-3.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Si une section « Films/Séries » et une section « Livres » existe c&amp;rsquo;est parce que j&amp;rsquo;ai besoin d&amp;rsquo;en faire le suivi. Tout d&amp;rsquo;abord car je prends note des films/séries et livres qu&amp;rsquo;on me conseille. Ensuite je ne regarde pas toujours les séries en une fois, il est bon de savoir où nous en sommes dans la série. Et finalement j&amp;rsquo;ai besoin de suivre les sorties des films pour ne pas les louper.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-4.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Une autre partie importante du bujo : le planning semestriel. Utile pour les anniversaires par exemple. Comme en juin ici.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-5.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Le planning mensuel apporte une vision rapide du mois en cours. Dans mon cas il permet aussi de noter la température maximale chaque jour, la météo du moment et l&amp;rsquo;humeur du moment. J&amp;rsquo;utilise ensuite un système de graphe pour voir l&amp;rsquo;évolution de l&amp;rsquo;humeur. Je ne sais pas si ça me servira, mais je trouve ça fun à faire !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-6.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ci-dessus un exemple de tâches du jour. Avec des tâches prioritaires et une récompense à la clé quand elles sont effectuées : du chocolat ! On ajoute donc à la suite les jours suivants. Jusqu&amp;rsquo;au mois prochain. Pourquoi le mois prochain ? Car une fois le mois terminé, on refait un planning mensuel du mois qui arrive. Comme celui que j&amp;rsquo;ai fais pour Mai.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: Voici quelques images de ma nouvelle version.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-7.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-8.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bujo-9.jpg&#34; alt=&#34;Image de mon bujo&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plus le bujo est chaleureux plus l&amp;rsquo;utilisation de ce dernier est fréquente&lt;/strong&gt;. N&amp;rsquo;hésitez donc pas à rajouter des autocollants en tous genres, ça ravive le journal !&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;ce-que-jaime-dans-cette-méthode&#34;&gt;Ce que j&amp;rsquo;aime dans cette méthode&lt;/h3&gt;
&lt;p&gt;Le bujo est un concept intéressant qui allie finalement l&amp;rsquo;ensemble des caractéristiques des livres qu&amp;rsquo;il ingère. En effet c&amp;rsquo;est un savant mélange d&amp;rsquo;agenda, d&amp;rsquo;organiseur, de journal intime et de post-it. Il s&amp;rsquo;adapte en fonction des besoins et des priorités de chacun. Vous avez besoin de suivre l&amp;rsquo;évolution de vos repas, pourquoi ne pas faire une page ou deux dans le bujo ?&lt;/p&gt;
&lt;p&gt;La méthode étant modulaire, de nombreuses personnes partagent leurs expériences et leurs idées sur le bujo. C&amp;rsquo;est cet esprit de partage qui rassure : nous trouverons toujours quelqu&amp;rsquo;un qui montre une solution à un problème donné. Comme par exemple le « mood tracker » ou suivi des humeurs.&lt;/p&gt;
&lt;p&gt;Je m&amp;rsquo;attendais à ce que l&amp;rsquo;utilisation d&amp;rsquo;un livre et d&amp;rsquo;un stylo soit perturbant, voire inefficace dans un monde où l&amp;rsquo;informatique est partout. Mais finalement le livre ne tombe jamais en panne quand on en a besoin et il n&amp;rsquo;y a pas de bug de synchronisation. Je l&amp;rsquo;ai toujours avec moi et il ne me fait pas défaut !
Il est également complémentaire de &lt;a href=&#34;https://olivier.dossmann.net/2016/10/sorganiser-num%C3%A9riquement-avec-un-planning-des-contacts-et-des-t%C3%A2ches/&#34;&gt;mon agenda numérique sur téléphone mobile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pouvoir personnaliser son livre est une expérience magique que vous ne retrouverez pas dans un logiciel. Et l&amp;rsquo;esprit est plus libre quand on utilise quelque chose qu&amp;rsquo;on apprécie !&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://bulletjournal.com&#34;&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/livres/bullet-journal-logo.jpg&#34; alt=&#34;Image du logo du Bullet Journal®&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Après plusieurs semaines d&amp;rsquo;utilisation cette méthode m&amp;rsquo;a convaincu : elle réunit plusieurs types de notes qui autrefois s&amp;rsquo;éparpillaient joyeusement dans la maison. Je ne m&amp;rsquo;y retrouvais plus ! L&amp;rsquo;outil s&amp;rsquo;adapte à mes besoins et ne rencontre aucun problème. Je peux laisser libre cours à mon imagination et ma créativité - s&amp;rsquo;il en est.&lt;/p&gt;
&lt;p&gt;En voyant les conseils des utilisateurs du bujo, j&amp;rsquo;ai amélioré la qualité de mon carnet de note en achetant un Leuchtturm1917. Les 3 marques-pages, les pages numérotées et les points tous les 0,5 cm m&amp;rsquo;ont conquis !&lt;/p&gt;
&lt;p&gt;Cet outil permet donc de résoudre les problèmes au fur et à mesure tout en voyant venir. Il permet également d&amp;rsquo;archiver le passé et de le consulter. Je suis étonné de m&amp;rsquo;entendre dire qu&amp;rsquo;un carnet de note est plus efficace que les applications que j&amp;rsquo;ai pu trouver sur le téléphone mobile. Je vous conseille plus que vivement de tester la méthode, qu&amp;rsquo;importe le temps que ça vous prendra au début, franchissez le pas !&lt;/p&gt;
&lt;h3 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h3&gt;
&lt;p&gt;En fouinant sur le Web, j&amp;rsquo;ai déniché plusieurs pistes dont je me suis inspiré pour créer mon bujo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://bulletjournal.com/&#34;&gt;Site officiel du Bullet Journal®&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/fm15cmYU0IM&#34;&gt;Vidéo officielle de présentation du Bullet Journal®&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.leuchtturm1917.fr/&#34;&gt;Site des produits Leuchtturm1917 (carnets de notes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.leuchtturm1917.fr/bullet-journal.html&#34;&gt;Version Bullet Journal® du Leuchtturm1917&lt;/a&gt; (que j&amp;rsquo;ai commandé en couleur Émeraude)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/mBrywhgxrw4&#34;&gt;Vidéo du Bullet Journal® selon Margaux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/AwD2jvG2_PY&#34;&gt;Vidéo de présentation en Français de ce qu&amp;rsquo;est le Bullet Journal®&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/UQRviU6yKyY&#34;&gt;Vidéo de comment créer un Bullet Journal® quand on ne sait pas dessiner xD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et n&amp;rsquo;hésitez pas à parcourir le Web pour des exemples de Bullet Journal®, comme sur &lt;a href=&#34;https://www.instagram.com/explore/tags/bulletjournal/&#34;&gt;le tag #bulletjournal sur Instagram&lt;/a&gt; qui donne énormément d&amp;rsquo;exemples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avis personnel sur ces différents liens&lt;/strong&gt; : Au début je trouvais que la communauté en faisait des pataquès au niveau coloriage, dessins et décorations en tous genre. Mais après avoir essayé d&amp;rsquo;égayer mon bujo je peux vous assurer que ça apporte joie et gaieté chaque jour à utiliser votre « chef-d&amp;rsquo;œuvre ».&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Suivre la progression de ses jeux vidéos</title>
      <link>https://olivier.dossmann.net/2017/08/suivre_la_progression_de_ses_jeux_videos/</link>
      <pubDate>Sat, 12 Aug 2017 19:32:37 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2017/08/suivre_la_progression_de_ses_jeux_videos/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Précédemment &lt;a href=&#34;https://olivier.dossmann.net/2017/06/project-zero/#application-de-la-m%C3%A9thode-par-l-exemple&#34;&gt;je parlais de mon application de la méthode de Project Zero&lt;/a&gt; sur ma liste de jeux vidéos. Je réduis en effet ma liste de jeux en cours à 3 maximum par console. Ce qui me permet d&amp;rsquo;achever plus rapidement les jeux vidéos l&amp;rsquo;un après l&amp;rsquo;autre sans me disperser.&lt;/p&gt;
&lt;p&gt;Seulement voilà, la collection s&amp;rsquo;aggrandissant, il a fallu trouver un outil pour suivre facilement l&amp;rsquo;ensemble de mes jeux vidéos, triés par console, savoir lequel a été terminé, ceux qu&amp;rsquo;il me reste à finir, les jeux en cours, etc.&lt;/p&gt;
&lt;p&gt;Je vais donc vous faire part de mon expérience sur 2 outils qui permettent de gérer sa collection de jeux vidéos :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backloggery (site web)&lt;/li&gt;
&lt;li&gt;My Game Collection (Android)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/humains/downloading_eye.jpg&#34; alt=&#34;Œil pris de très près avec une barre de chargement qui fait le tour de la pupille&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;backloggerycom&#34;&gt;Backloggery.com&lt;/h3&gt;
&lt;p&gt;Après quelques recherches sur le Web je suis tombé sur un site intéressant : &lt;a href=&#34;http://backloggery.com/&#34;&gt;Backloggery.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il permet à un utilisateur de créer une liste de titres (jeux vidéos). Pour chacun d&amp;rsquo;eux, vous pouvez renseigner (liste non exhaustive) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le titre du jeu&lt;/li&gt;
&lt;li&gt;la console/système sur lequel il tourne&lt;/li&gt;
&lt;li&gt;votre progression parmi :
&lt;ul&gt;
&lt;li&gt;unfinished : jeu non terminé&lt;/li&gt;
&lt;li&gt;unplayed : pas encore joué&lt;/li&gt;
&lt;li&gt;beaten : jeu terminé&lt;/li&gt;
&lt;li&gt;completed : jeu terminé totalement&lt;/li&gt;
&lt;li&gt;mastered : jeu terminé avec un défi personnel fixé&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;votre avis de 1 à 5 (ou pas d&amp;rsquo;avis)&lt;/li&gt;
&lt;li&gt;si vous jouez actuellement à ce jeu ou non&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce site permet également de créer sa liste de jeux vidéos souhaités. Il propose de noter le jeu comme détenu, à la maison, souscris par abonnement, des commentaires, des notes de progression, le nombre de succès accomplis, etc.&lt;/p&gt;
&lt;p&gt;Puis, une fois le détail de vos jeux enregistrés, le site fait une page de statistiques de vos jeux, comme &lt;a href=&#34;http://backloggery.com/MetalMan1230&#34;&gt;par exemple le profil de MetalMan1230 sur Backloggery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce que j&amp;rsquo;aime :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un thème un peu rétro qui tient la route&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://backloggery.com/rules.php&#34;&gt;ses règles d&amp;rsquo;utilisation&lt;/a&gt; qui stipulent qu&amp;rsquo;aucune donnée à caractère personnel ne sera collectée. Au pire anonymisée.&lt;/li&gt;
&lt;li&gt;le côté simple pour la saisie des jeux, pas de chi-chi, tu entres le titre, la console et ton pourcentage d&amp;rsquo;accomplissement du jeu&lt;/li&gt;
&lt;li&gt;la page de statistiques est une très bonne idée car elle permet de visuellement comprendre notre état d&amp;rsquo;avancement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce que j&amp;rsquo;aime moins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le site n&amp;rsquo;est pas du tout mobile-friendly, c&amp;rsquo;est à dire qu&amp;rsquo;il ne s&amp;rsquo;adapte pas bien aux petits écran, c&amp;rsquo;est une galère.&lt;/li&gt;
&lt;li&gt;il n&amp;rsquo;y a pas d&amp;rsquo;API pour récupérer des infos de son compte (pour éventuellement créer une page web statique récapitulative)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il n&amp;rsquo;en reste pas moins que c&amp;rsquo;est un site que je conseille vivement !&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/backloggery_metalman1230_profile.png&#34; alt=&#34;Partie du profil de MetalMan1230 sur Backloggery&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;my-game-collection&#34;&gt;My Game Collection&lt;/h3&gt;
&lt;p&gt;Sur Android, il en est tout autrement : le Play Store propose tout un tas d&amp;rsquo;application, mais une d&amp;rsquo;entre elle semble se démarquer par sa richesse de fonctionnalités : &lt;a href=&#34;https://play.google.com/store/apps/details?id=com.tuyware.mygamecollection&#34;&gt;my-game-collection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée de l&amp;rsquo;application : récupérer sa liste de jeux sur un nombre important de services comme Steam, Backloggery, HowLongToBeat, Collectorz, Desura, Itch.io, vgcollect, etc. afin d&amp;rsquo;en créer une liste à suivre.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;outil propose ensuite d&amp;rsquo;ajouter des tags à vos jeux pour les filtrer par la suite. Il gère aussi la collection d&amp;rsquo;amiibo, de Skylanders, de personnages Disney Infinity, etc.&lt;/p&gt;
&lt;p&gt;Voici les éléments que j&amp;rsquo;apprécie particulièrement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;import de jeux parmi une liste bien fournie de site web&lt;/li&gt;
&lt;li&gt;pendant la synchronisation de notre liste avec une plateforme distante, on peut choisir au cas par cas de modifier les données du jeu vidéo tel qu&amp;rsquo;il apparaît dans notre liste (image de présentation, titre du jeu, tags utilisés pour l&amp;rsquo;œuvre, etc.). Si vous avez la flemme, il y a la synchronisation automatique&lt;/li&gt;
&lt;li&gt;avoir pensé aux figurines des jeux vidéos, comme pour Lego Dimensions&lt;/li&gt;
&lt;li&gt;gère aussi sa liste de consoles et d&amp;rsquo;accessoires&lt;/li&gt;
&lt;li&gt;le côté mobile est intéressant car on peut saisir à côté de sa collection sans déplacer le PC&lt;/li&gt;
&lt;li&gt;affichage - en utilisant le site HowLongToBeat - du nombre d&amp;rsquo;heure pour accomplir le jeu en totalité&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En revanche, je peux lister bon nombre de soucis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l&amp;rsquo;interface n&amp;rsquo;est pas simple à utiliser. C&amp;rsquo;est trop fourni donc on se retrouve avec de petits boutons, voire même avec des choses qui se chevauchent sans qu&amp;rsquo;on puisse appuyer sur le bouton situé derrière&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;outil propose un compte premium afin de pouvoir bénéficier de toutes les possibilités, c&amp;rsquo;est compréhensible mais assez dommage&lt;/li&gt;
&lt;li&gt;la synchronisation des données ne fonctionne que dans un sens (on récupère, on envoie pas). Du coup ça reste moyen pour gérer ses jeux Backloggery…&lt;/li&gt;
&lt;li&gt;quand la base de données igdb.com n&amp;rsquo;est pas suffisante pour les informations d&amp;rsquo;un jeu, il faut utiliser GiantBomb.com, mais ça demande une clé API. Quand on y connaît pas grand chose, c&amp;rsquo;est juste impossible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je dois l&amp;rsquo;avouer, ce dernier outil ne correspond pas du tout à mes attentes, bien qu&amp;rsquo;il contienne la liste des Skylanders (qui me serait utile) mais aussi une récupération sur HowLongToBeat du temps approximatif pour terminer le jeu.&lt;/p&gt;
&lt;p&gt;Si vous avez la flemme d&amp;rsquo;utiliser un ordinateur pour gérer votre collection, utilisez cet outil, sinon ravisez-vous et continuez sur d&amp;rsquo;autres services prévus à cet effet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/screenshots/mygamecollection.png&#34; alt=&#34;Écran de la liste des jeux vidéos détenus sous My Game Collection sous Android&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Après avoir eu du mal à trouver une application qui permette de suivre la progression pour chaque jeu vidéo détenu, je m&amp;rsquo;attendais à trouver quelque chose de plus basique que les outils présentés. Je reste donc étonné de ces derniers. Mais quelque peu déçu du manque de finition de ces applications.&lt;/p&gt;
&lt;p&gt;Dans l&amp;rsquo;idéal, et comme souvent, il faudrait que je crée mon propre outil pour correspondre à mes attentes. Mais qui a du temps pour ça ?&lt;/p&gt;
&lt;p&gt;Je vais donc rester sur une approche temporaire et double : utiliser Backloggery, exporter chaque fois vers My Game Collection pendant que je développerai un outil similaire ralliant le meilleur des deux dans un seul outil :)&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>30 consoles de salon pour 80 euros</title>
      <link>https://olivier.dossmann.net/2015/12/30-consoles-de-salon-pour-80-euros/</link>
      <pubDate>Wed, 30 Dec 2015 14:47:45 +0200</pubDate>
      
      <guid>https://olivier.dossmann.net/2015/12/30-consoles-de-salon-pour-80-euros/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Les vacances de Noël approchaient et je me demandais comment les occuper. Je ne suis pas très famille - ça c&amp;rsquo;est dit - et je voulais donc profiter pleinement du temps libre pour m&amp;rsquo;amuser un peu - en dehors des séances de jambe-en-l&amp;rsquo;air avec des inconnues.&lt;/p&gt;
&lt;p&gt;Sachant que je recevrai prochainement un vidéoprojecteur, je me disais que pour le tester on pourrait y brancher quelques consoles de jeu rétro.&lt;/p&gt;
&lt;p&gt;Mais voilà, toutes ces consoles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prennent de la place&lt;/li&gt;
&lt;li&gt;ont des systèmes de branchements variés&lt;/li&gt;
&lt;li&gt;ne sont pas compatibles avec la prise HDMI du vidéoprojecteur&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qui fait à la fois du bazar et beaucoup d&amp;rsquo;ennuis à brancher/débrancher.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc pensé à autre chose : utiliser un &lt;a href=&#34;http://www.materiel.net/micro-pc-raspberry-pi/raspberry-pi-2-type-b-112984.html&#34; title=&#34;Acheter un RaspberryPi 2 chez Materiel.NET&#34;&gt;RaspberryPi 2&lt;/a&gt; pour une soixantaine d&amp;rsquo;euros et mettre des émulateurs dessus.&lt;/p&gt;
&lt;p&gt;Je vais donc vous présenter ma nouvelle console rétrogaming de salon !&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://olivier.dossmann.net/images/materiel/emulation_station.jpg&#34;&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/materiel/emulation_station-490.jpg&#34; alt=&#34;Image miniature &#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;le-matériel&#34;&gt;Le matériel&lt;/h3&gt;
&lt;p&gt;Afin de composer cette console j&amp;rsquo;ai eu besoin :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;du RaspberryPi 2 Type B (40 euros)&lt;/li&gt;
&lt;li&gt;une alimentation compatible (10 euros)&lt;/li&gt;
&lt;li&gt;un boitier pour mettre le RPi 2 à l&amp;rsquo;intérieur (10 euros)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.materiel.net/connectique-bluetooth/trendnet-cle-bluetooth-2-1-tbw-106ub-100m-76438.html&#34;&gt;une clé USB bluetooth compatible&lt;/a&gt; (15 euros environ)&lt;/li&gt;
&lt;li&gt;une carte micro SD de 8 Go (10 euros)&lt;/li&gt;
&lt;li&gt;une manette de PS3 d&amp;rsquo;un ami (ou une manette de XBOX)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;EDIT au 1er août 2016&lt;/strong&gt; : Il est possible désormais d&amp;rsquo;acheter directement un RaspberryPi 3 qui contient le bluetooth et le wifi intégré. Ce qui évite l&amp;rsquo;achat d&amp;rsquo;une clé USB Bluetooth supplémentaire mais ne réduit pas le coût puisque le RPi 3 vaut 10 euros de plus que le RPi 2.&lt;/p&gt;
&lt;h3 id=&#34;le-logiciel&#34;&gt;Le logiciel&lt;/h3&gt;
&lt;p&gt;Quelle chance d&amp;rsquo;avoir trouvé le système suivant : &lt;a href=&#34;http://emulationstation.org/&#34;&gt;EmulationStation&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Ce système fait quasiment le café ! Car :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vous le téléchargez&lt;/li&gt;
&lt;li&gt;vous le &lt;a href=&#34;https://github.com/RetroPie/RetroPie-Setup/wiki/First-Installation&#34;&gt;copiez sur votre clé comme indiqué sur la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;vous mettez la carte dans la RPi&lt;/li&gt;
&lt;li&gt;vous allumez les TV&lt;/li&gt;
&lt;li&gt;vous allumez le RPi (avec un clavier branché)&lt;/li&gt;
&lt;li&gt;vous configurez&lt;/li&gt;
&lt;li&gt;vous branchez une manette de PS3 ou de XBOX en USB sur le RPi (pour la configurer)&lt;/li&gt;
&lt;li&gt;vous enlevez ce câble USB et le clavier une fois tout configuré&lt;/li&gt;
&lt;li&gt;vous relancez le RPi pour vérifier&lt;/li&gt;
&lt;li&gt;vous profitez !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Certes il faut installer et configurer, mais ce n&amp;rsquo;est qu&amp;rsquo;une petite heure ou deux de préparation puis vous faites de sacrés soirées chez vous ou chez les amis (puisque la console est petite, elle est mobile).&lt;/p&gt;
&lt;h3 id=&#34;les-jeux&#34;&gt;Les jeux&lt;/h3&gt;
&lt;p&gt;Étant donné que j&amp;rsquo;ai quelques jeux PlayStation 1, je me suis dis que c&amp;rsquo;était l&amp;rsquo;occasion d&amp;rsquo;y rejouer.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai trouvé le lien suivant pour copier, depuis Linux, un CD PlayStation 1 afin de l&amp;rsquo;utiliser sur notre nouvelle console rétrogaming.&lt;/p&gt;
&lt;p&gt;Voici donc &lt;a href=&#34;http://www.pandorawiki.org/Creating_images_of_PSX_games_using_Linux#From_the_command_line&#34;&gt;comment utiliser la ligne de commande Linux pour copier un CD de PlayStation en un fichier .toc&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Donner vie à nouveau à ses anciens jeux comme Crash Bandicoot 3 fût un réel plaisir !
J&amp;rsquo;ai pu également lister l&amp;rsquo;ensemble de mes jeux afin de les stocker à la cave et les remplacer par leur version numérique sur le RaspberryPi 2. C&amp;rsquo;est un gain de place de 3 bons gros cartons !&lt;/p&gt;
&lt;p&gt;Je souhaite que vous puissiez faire la même expérience positive de cette console rétrogaming et que vous pourrez ainsi cultivez nos jeunes têtes blondes avec les jeux d&amp;rsquo;antan ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Développer pour Arduino en ligne de commande</title>
      <link>https://olivier.dossmann.net/2015/10/d%C3%A9velopper-pour-arduino-en-ligne-de-commande/</link>
      <pubDate>Sun, 18 Oct 2015 11:12:18 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2015/10/d%C3%A9velopper-pour-arduino-en-ligne-de-commande/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;L&amp;rsquo;Arduino est une carte électronique assez connue permettant grossomodo de transformer n&amp;rsquo;importe quel objet en objet intelligent puisque vous allez pouvoir programmer ce dernier afin d&amp;rsquo;avoir des comportements spécifiques suivant les données reçues par un certain nombre de capteurs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.arduino.cc/new_home/assets/illu-arduino-UNO.png&#34; alt=&#34;Image d&amp;rsquo;une carte électronique Arduino&#34; title=&#34;Notre carte Arduino&#34;&gt;&lt;/p&gt;
&lt;p&gt;Arduino permet de réunir le monde de l&amp;rsquo;informatique à celui de l&amp;rsquo;électronique et favorise le DIY (Do It Yourself = fait le toi-même).&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&#34;http://arduino.cc&#34; title=&#34;Se rendre sur le site officiel Arduino&#34;&gt;site officiel d&amp;rsquo;Arduino&lt;/a&gt; propose de nombreuses documentations et surtout un logiciel pour développer, compiler et envoyer sur l&amp;rsquo;Arduino votre programme. C&amp;rsquo;est une interface simple, claire, compatible Windows, MacOSX et GNU/Linux car développée en Java. Cependant, je préfère très - ou trop ? - souvent développer des programmes sous VIM en mode console et faire les compilations et l&amp;rsquo;envoi en ligne de commande. Et je ne suis pas le seul. Voilà pourquoi j&amp;rsquo;ai décidé de vous partager mon environnement de travail pour Arduino.&lt;/p&gt;
&lt;h3 id=&#34;sommaire&#34;&gt;Sommaire&lt;/h3&gt;
&lt;p&gt;Programmer pour Arduino se résume finalement comme beaucoup d&amp;rsquo;autres projets aux 3 actions suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;développer un programme sur son éditeur préféré&lt;/li&gt;
&lt;li&gt;compiler le programme (parfois sur le même éditeur)&lt;/li&gt;
&lt;li&gt;envoyer le résultat en production. Dans notre cas ce sera dans l&amp;rsquo;Arduino&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si la première étape est facile pour tout le monde, puisque chacun a probablement déjà son éditeur préféré, les 2 dernières étapes sont moins simples.&lt;/p&gt;
&lt;p&gt;Sous GNU/Linux, et plus particulièrement sous une distribution dérivée Debian, cela se résume quasiment à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installer les paquets &lt;strong&gt;arduino-core&lt;/strong&gt; et &lt;strong&gt;arduino-mk&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;initialiser des variables dans son &lt;strong&gt;.bashrc&lt;/strong&gt;, &lt;strong&gt;.zshrc&lt;/strong&gt; ou tout autre invite de commande&lt;/li&gt;
&lt;li&gt;savoir créer pour chacun de ses projets Arduino un fichier Makefile&lt;/li&gt;
&lt;li&gt;savoir quelle commande utiliser pour compiler et pour envoyer le résultat sur l&amp;rsquo;arduino&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Passons donc à la préparation de l&amp;rsquo;environnement&lt;/p&gt;
&lt;h3 id=&#34;installation-et-configuration&#34;&gt;Installation et configuration&lt;/h3&gt;
&lt;p&gt;Comme vous l&amp;rsquo;avez vu, nous commençons par l&amp;rsquo;installation des paquets &lt;strong&gt;arduino-core&lt;/strong&gt; et &lt;strong&gt;arduino-mk&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install arduino-core arduino-mk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ceci devrait, entre autre, installer &lt;strong&gt;avrdude&lt;/strong&gt; qui nous facilitera l&amp;rsquo;envoi sur l&amp;rsquo;Arduino.&lt;/p&gt;
&lt;p&gt;Ensuite nous éditons le fichier de configuration de notre shell préféré, ici &lt;strong&gt;.bashrc&lt;/strong&gt; afin d&amp;rsquo;y initialiser les variables suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ARDUINO_DIR : le dossier dans lequel a été installé &lt;strong&gt;arduino-core&lt;/strong&gt; qui contient, entre autres les bibliothèques nécessaires à la programmation d&amp;rsquo;un Arduino&lt;/li&gt;
&lt;li&gt;ARDMK_DIR : le dossier dans lequel a été installé &lt;strong&gt;arduino-mk&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AVR_TOOLS_DIR : le dossier dans lequel chercher l&amp;rsquo;outil &lt;strong&gt;avrdude&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chez moi cela donne quelque chose comme :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export ARDUINO_DIR=&amp;quot;/usr/share/arduino&amp;quot;
export ARDMK_DIR=&amp;quot;/usr/share/arduino&amp;quot;
export AVR_TOOLS_DIR=&amp;quot;/usr&amp;quot;
export ISP_PORT=&amp;quot;/dev/ttyACM0&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;À noter que j&amp;rsquo;ai rajouté la variable &lt;strong&gt;ISP_PORT&lt;/strong&gt; pour définir d&amp;rsquo;emblée le port de communication avec mon Arduino. Ce n&amp;rsquo;est donc pas obligatoire dans votre cas (comme nous le verrons par la suite).&lt;/p&gt;
&lt;p&gt;Passons à l&amp;rsquo;utilisation de tout cela.&lt;/p&gt;
&lt;h3 id=&#34;utilisation&#34;&gt;Utilisation&lt;/h3&gt;
&lt;p&gt;Si nous devions résumer une utilisation simple de cet environnement, voici les étapes que nous ferions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;créer un dossier pour notre projet&lt;/li&gt;
&lt;li&gt;créer un fichier avec l&amp;rsquo;extension &lt;strong&gt;.ino&lt;/strong&gt; et remplir ledit fichier avec un programme&lt;/li&gt;
&lt;li&gt;créer un fichier &lt;strong&gt;Makefile&lt;/strong&gt; dans le dossier du projet&lt;/li&gt;
&lt;li&gt;y ajouter quelques variables&lt;/li&gt;
&lt;li&gt;lancer la commande &lt;strong&gt;make&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;brancher l&amp;rsquo;Arduino et faire un &lt;strong&gt;make upload&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et le tour est joué !&lt;/p&gt;
&lt;p&gt;Je pense que le point à éclaircir ici est celui du fichier &lt;strong&gt;Makefile&lt;/strong&gt; à remplir. Rien ne vaut un bon vieil exemple de mon fichier Makefile pour le projet Blink qui fait clignoter la LED 13 de mon Arduino MEGA 2560 :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BOARD_TAG = mega2560
ARDUINO_LIBS = 
ARDUINO_PORT = /dev/ttyACM0

include /usr/share/arduino/Arduino.mk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rien de plus, rien de moins. Avec ça, un simple &lt;strong&gt;make &amp;amp;&amp;amp; make upload&lt;/strong&gt; devrait faire l&amp;rsquo;affaire &amp;#x1f603;&lt;/p&gt;
&lt;h3 id=&#34;les-commandes-disponibles&#34;&gt;Les commandes disponibles&lt;/h3&gt;
&lt;p&gt;Le fichier &lt;strong&gt;Makefile&lt;/strong&gt; inclut celui fournit par le paquet &lt;strong&gt;arduino-mk&lt;/strong&gt;. Et ce dernier est rempli de commandes en tous genre. Le mieux pour s&amp;rsquo;en rendre compte est de lancer la commande suivante dans votre projet :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous aurez tout un tas de commandes possibles. Par exemple je souhaitais connaître les valeurs possibles de la variable BOARD_TAG, ayant un modèle spécial d&amp;rsquo;Arduino. J&amp;rsquo;ai donc fait :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make show_boards
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ce qui m&amp;rsquo;a permis de savoir que le modèle &lt;em&gt;mega2560&lt;/em&gt; était disponible.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Je trouve ce fichier Makefile parfait pour développer en toute sérénité sans avoir à installer l&amp;rsquo;environnement Java nécessaire au programme conseillé par Arduino et tout en gardant son outil de développement favori.&lt;/p&gt;
&lt;p&gt;Petit bonus pour ceux qui aiment s&amp;rsquo;amuser avec la sortie série d&amp;rsquo;un Arduino : si votre programme ajoute des &lt;strong&gt;Serial.print()&lt;/strong&gt;, vous pouvez voir la sortie de votre Arduino en utilisant le logiciel &lt;strong&gt;minicom&lt;/strong&gt; de la manière suivante :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;minicom -b 9600 -o -D /dev/ttyACM0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ça me rappelle mes débuts sous la carte Efika tiens !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Serveur de machines virtuelles avec VirtualBox</title>
      <link>https://olivier.dossmann.net/2014/03/serveur-de-machines-virtuelles-avec-virtualbox/</link>
      <pubDate>Mon, 31 Mar 2014 13:26:10 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2014/03/serveur-de-machines-virtuelles-avec-virtualbox/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Connaissez-vous les machines virtuelles ? Ces espèces de boîtes dans lesquelles on peut faire tourner un système d&amp;rsquo;exploitation entier et qui permettent - quasiment - de faire fonctionner des services de la même manière sous différentes plateformes ?&lt;/p&gt;
&lt;p&gt;Si vous lisez l&amp;rsquo;article, je suis sûr que oui ! La virtualisation est un outil formidable, plus encore avec &lt;a href=&#34;http://virtualbox.org&#34; title=&#34;Se rendre sur la page officielle de VirtualBox&#34;&gt;VirtualBox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le problème, quand on a un serveur distant, c&amp;rsquo;est que nous n&amp;rsquo;avons pas d&amp;rsquo;interface graphique pour créer et gérer ses machines virtuelles.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/virtualbox_ose.png&#34; alt=&#34;VirtualBox About Image&#34; title=&#34;Image du &#39;à propos&#39; de VirtualBox&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;description-du-problème&#34;&gt;Description du problème&lt;/h3&gt;
&lt;p&gt;En effet, quand on installe VirtualBox sur un serveur sans interface graphique, on ne sait pas trop comment créer une machine virtuelle ni comment la lancer. Certes on pourrait créer la machine virtuelle sur notre ordinateur, puis l&amp;rsquo;envoyer sur notre serveur. Mais comment la lancer ensuite ?&lt;/p&gt;
&lt;p&gt;Il existe bien un VBoxManage (commande console) pour gérer les machines virtuelles, mais c&amp;rsquo;est très fastidieux.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée serait d&amp;rsquo;avoir une interface qui se connecte au serveur distant afin de pouvoir créer et gérer nos machines virtuelles.&lt;/p&gt;
&lt;h3 id=&#34;linterface-qui-va-se-connecter-au-serveur-distant&#34;&gt;L&amp;rsquo;interface qui va se connecter au serveur distant&lt;/h3&gt;
&lt;p&gt;Cette interface existe, elle se nomme &lt;a href=&#34;http://remotebox.knobgoblin.org.uk/&#34; title=&#34;Aller sur le site officiel de RemoteBox&#34;&gt;RemoteBox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cela permet de se connecter à notre VirtualBox distant et de voir quelles machines virtuelles existent, en créer de nouvelles et les gérer.&lt;/p&gt;
&lt;p&gt;Et le mieux dans tout ça : l&amp;rsquo;interface ressemble très fortement à VirtualBox, ce qui ne nous dépayse pas ;)&lt;/p&gt;
&lt;h3 id=&#34;en-bref-comment-procédons-nous-&#34;&gt;En bref, comment procédons-nous ?&lt;/h3&gt;
&lt;p&gt;Pour résumer la manière de procéder, en quelques étapes (&lt;a href=&#34;https://olivier.dossmann.net/wiki/virtualisation/virtualbox/&#34; title=&#34;En savoir plus sur l&#39;installation et la configuration de VirtualBox en mode webservice&#34;&gt;que je détaille sur mon recueil d&amp;rsquo;astuces dans un tutoriel&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On installe VirtualBox sur le serveur distant&lt;/li&gt;
&lt;li&gt;On installe le pack d&amp;rsquo;extension qui permet de lancer le Web Service sur le serveur distant&lt;/li&gt;
&lt;li&gt;On enlève la vérification identifiant/mot de passe du Web Service (sachant que nos ports sont fermés)&lt;/li&gt;
&lt;li&gt;On lance le service web sur le serveur distant&lt;/li&gt;
&lt;li&gt;On installe RemoteBox sur notre machine locale&lt;/li&gt;
&lt;li&gt;On ouvre les ports 18083 et 3389 en SSH (tunnel)&lt;/li&gt;
&lt;li&gt;On utilise RemoteBox pour s&amp;rsquo;y connecter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y a plus de détails sur mon wiki au sujet de l&amp;rsquo;&lt;a href=&#34;https://olivier.dossmann.net/wiki/virtualisation/virtualbox/&#34; title=&#34;En savoir plus sur l&#39;installation et la configuration de VirtualBox en mode webservice&#34;&gt;installation et configuration de VirtualBox en mode serveur et utilisation de RemoteBox pour s&amp;rsquo;y connecter&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Avec RemoteBox, l&amp;rsquo;utilisation de VirtualBox sur nos machines distantes est facile et sécurisée (puisqu&amp;rsquo;on utilise des tunnels SSH). Je n&amp;rsquo;ai plus peur de créer une machine virtuelle et d&amp;rsquo;en suivre son installation mais aussi de gérer l&amp;rsquo;allumage et l&amp;rsquo;extinction de ces dernières.&lt;/p&gt;
&lt;p&gt;À noter qu&amp;rsquo;il existe aussi une interface nommée &lt;a href=&#34;http://sourceforge.net/projects/phpvirtualbox/&#34; title=&#34;Découvrir le projet phpVirtualBox&#34;&gt;phpvirtualbox&lt;/a&gt; qui permet d&amp;rsquo;avoir l&amp;rsquo;interface via un navigateur Web.&lt;/p&gt;
&lt;p&gt;En revanche les machines virtuelles demandent d&amp;rsquo;allouer un espace mémoire vive à ces dernières et bloquent donc une partie de la mémoire. Si on veut utiliser 5 machines à 1Go de mémoire vive, on bloque 5Go.&lt;/p&gt;
&lt;p&gt;Des solutions plus efficace existent pour ne lancer que quelques services dans des &lt;em&gt;genres&lt;/em&gt; de machines virtuelles : les conteneurs. Par exemple &lt;a href=&#34;http://docker.io&#34; title=&#34;Découvrir Docker&#34;&gt;Docker&lt;/a&gt; qui est une solution qui se fait connaitre de plus en plus et qui sera probablement le sujet d&amp;rsquo;un prochain article !&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Traduction de ses scripts Lua avec gettext</title>
      <link>https://olivier.dossmann.net/2013/09/traduction-de-ses-scripts-lua-avec-gettext/</link>
      <pubDate>Mon, 02 Sep 2013 18:32:01 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2013/09/traduction-de-ses-scripts-lua-avec-gettext/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;En ce moment j&amp;rsquo;avance sur un projet informatique écrit dans le language Lua. Je m&amp;rsquo;essaie ainsi à ce langage et en profite de sa puissance pour mes scripts de création de sites web comme &lt;a href=&#34;https://github.com/blankoworld/porteail&#34;&gt;PorteAil&lt;/a&gt; ou encore &lt;a href=&#34;https://github.com/blankoworld/makefly&#34;&gt;Makefly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, pour l&amp;rsquo;un ou l&amp;rsquo;autre raison j&amp;rsquo;ai besoin de traduire les messages d&amp;rsquo;erreurs de l&amp;rsquo;application en la langue de l&amp;rsquo;utilisateur. Il y a probablement plusieurs méthodes, mais voici celle que j&amp;rsquo;utilise.&lt;/p&gt;
&lt;p&gt;Notez que je donne le détail complet du code dans &lt;a href=&#34;https://olivier.dossmann.net/wiki/developpement/lua_gettext/&#34;&gt;mon tutoriel sur Gettext pour Lua&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/la_terre.jpg&#34; alt=&#34;La Terre&#34; title=&#34;Image de la Terre vue de l&#39;espace&#34;&gt;&lt;/p&gt;
&lt;p&gt;Image sous Licence Creative Commons CC-BY 2.0 trouvée sur une galerie photo de &lt;a href=&#34;http://www.flickr.com/photos/gsfc/&#34; title=&#34;Aller sur la galerie photo de gsfc&#34;&gt;gsfc&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;gettext&#34;&gt;Gettext&lt;/h3&gt;
&lt;p&gt;L&amp;rsquo;outil le plus utilisé selon Internet est &lt;a href=&#34;http://en.wikipedia.org/wiki/Gettext&#34;&gt;Gettext&lt;/a&gt;. Il permet de parcourir notre code afin d&amp;rsquo;en extraire les chaînes à traduire. Puis divers outils permettent de procéder à la traduction des chaînes, soit automatiquement, soit manuellement.&lt;/p&gt;
&lt;p&gt;Enfin l&amp;rsquo;outil va générer des fichiers binaires pour une rapidité accrue de traitement/lecture/rendu.&lt;/p&gt;
&lt;h3 id=&#34;implémentation&#34;&gt;Implémentation&lt;/h3&gt;
&lt;p&gt;Il n&amp;rsquo;y a pas d&amp;rsquo;implémentation à part entière pour Lua, il faut donc créer sa propre implémentation.&lt;/p&gt;
&lt;p&gt;En premier lieu on doit créer une fonction qui va lire nos chaînes et donner la traduction (en lisant le fichier binaire spécifique à la langue de l&amp;rsquo;utilisateur. Généralement c&amp;rsquo;est une fonction &lt;strong&gt;_&lt;/strong&gt; (espace souligné) qu&amp;rsquo;on utilise. Elle va lire le fameux fichier binaire (extension *.mo) de Gettext et donner le résultat.&lt;/p&gt;
&lt;p&gt;Sachant que nous voulons retourner les erreurs du programme/script en plusieurs langues, il va falloire initialiser la fonction avant le début de nos traitements.&lt;/p&gt;
&lt;p&gt;Vous pouvez voir tout ceci dans &lt;a href=&#34;https://olivier.dossmann.net/wiki/developpement/lua_gettext/&#34;&gt;le tutoriel sur Gettext pour Lua que je vous ai concocté&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;résumé&#34;&gt;Résumé&lt;/h3&gt;
&lt;p&gt;Si on devait synthétiser, voici ce qu&amp;rsquo;il faut faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;faire une fonction &lt;strong&gt;_&lt;/strong&gt; qui lit une chaîne et donne sa traduction&lt;/li&gt;
&lt;li&gt;faire une fonction qui lit un fichier *.mo et cherche une chaîne donnée pour en sortir son résultat&lt;/li&gt;
&lt;li&gt;initialiser le chargement du fichier *.mo et la fonction de traduction en début de script&lt;/li&gt;
&lt;li&gt;ajouter les chaînes à traduire dans des fonctions &lt;strong&gt;_()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;parcourir notre code avec gettext pour récupérer les chaînes à traduire&lt;/li&gt;
&lt;li&gt;traduire&lt;/li&gt;
&lt;li&gt;convertir en fichier binaire&lt;/li&gt;
&lt;li&gt;joindre le binaire à notre programme et enlever les fichiers temporaire (*.po, *.pot, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;En dehors de la lecture du fichier binaire de gettext qui se résoud facilement en cherchant sur Internet, l&amp;rsquo;implémentation fût facile et le résultat est au-delà de mes espérances.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;avantage d&amp;rsquo;avoir des fichiers à traduire au format *&lt;strong&gt;.po&lt;/strong&gt;, c&amp;rsquo;est que des interfaces graphiques simples telles que gTranslator ou poedit permettent à des non-initiés au code de programmation de traduire votre application sans avoir à lire du code.&lt;/p&gt;
&lt;p&gt;Des interfaces web permettent également de traduire en ligne sans installer quoique ce soit. C&amp;rsquo;est donc très utile pour des projets !&lt;/p&gt;
&lt;h3 id=&#34;liens-utiles&#34;&gt;Liens utiles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.lua.org/&#34;&gt;Lua (site officiel)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Gettext&#34;&gt;Gettext selon Wikipédia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/wiki/developpement/lua_gettext/&#34;&gt;Tutoriel Gettext pour Lua sur le Recueil d&amp;rsquo;astuces d&amp;rsquo;Olivier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
	    <title>Un seul outil pour les dernières versions de nos applications</title>
      <link>https://olivier.dossmann.net/2013/07/un-seul-outil-pour-les-derni%C3%A8res-versions-de-nos-applications/</link>
      <pubDate>Thu, 25 Jul 2013 11:24:18 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2013/07/un-seul-outil-pour-les-derni%C3%A8res-versions-de-nos-applications/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Quand on maintient un serveur web et qu&amp;rsquo;on utilise quelques applications chez soi librement téléchargées sur le net, on a besoin de connaître les dernières versions de chacune desdites applications.&lt;/p&gt;
&lt;p&gt;À cet effet on utilise très fréquemment les flux RSS. Le souci c&amp;rsquo;est qu&amp;rsquo;on a un flux RSS par projet. Cela fait très vite un joyeux bordèle dans notre lecteur de flux du fait des trop nombreuses applications.&lt;/p&gt;
&lt;p&gt;Certaines catégorisent, mettent dans des dossiers à part, voire un compte RSS à part dans leur lecteur.&lt;/p&gt;
&lt;p&gt;Je vais vous présenter ici quelques outils que j&amp;rsquo;ai utilisé pour me faciliter la tâche de veille technologique.&lt;/p&gt;
&lt;h3 id=&#34;étape-1--trouver-les-flux-rss&#34;&gt;Étape 1 : trouver les flux RSS&lt;/h3&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas toujours simple de trouver un flux RSS contenant les dernières versions d&amp;rsquo;un outil. Dans ma liste, le seul outil que j&amp;rsquo;ai vu proposer directement les dernières version est &lt;a href=&#34;http://ikiwiki.info/&#34; title=&#34;Se rendre sur le site officiel de ikiwiki&#34;&gt;ikiwiki&lt;/a&gt;. Exemple : &lt;a href=&#34;http://ikiwiki.info/news/index.rss&#34;&gt;http://ikiwiki.info/news/index.rss&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;autres ne se tracassent pas avec ça. À la place, on dispose au mieux du flux RSS de leur blog. Ce qui n&amp;rsquo;est pas plaisant car les blogs donnent d&amp;rsquo;autres articles que simplement les dernières versions.&lt;/p&gt;
&lt;p&gt;Une idée serait de suivre soit le flux RSS des blogs en ne filtrant que les dernières versions : quasi impossible car il n&amp;rsquo;y a pas de règles prédéfinies pour une sortie de version, soit tout simplement de suivre le flux RSS du &lt;strong&gt;dépôt du code source en ne filtrant que les tags&lt;/strong&gt;. Par exemple avec les dépôts si connus de Github. Exemple : &lt;a href=&#34;https://github.com/splitbrain/dokuwiki&#34;&gt;https://github.com/splitbrain/dokuwiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs outils existent pour cela, on nomme ça plus ou moins un &lt;strong&gt;github-tags&lt;/strong&gt;. D&amp;rsquo;ailleurs celui que j&amp;rsquo;utilise est : &lt;a href=&#34;https://github.com/Mic92/github-tags&#34; title=&#34;Découvrir le projet github-tags de Mic92&#34;&gt;github-tags de Mic92&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une &lt;a href=&#34;http://githubtags.higgsboson.tk/&#34; title=&#34;Tester github-tags&#34;&gt;démonstration de l&amp;rsquo;outil github-tags est disponible sur le web&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;étape-2--fuuuuuu-sion-&#34;&gt;Étape 2 : FUUUUUU… SION !&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/nature/soleil_fusion.png&#34; alt=&#34;Soleil en fusion&#34; title=&#34;Image d&#39;un soleil en fusion&#34;&gt;&lt;/p&gt;
&lt;p&gt;Image sous Licence Creative Commons CC-BY 2.0 trouvée sur une galerie photo de &lt;a href=&#34;http://www.flickr.com/photos/gsfc/&#34; title=&#34;Aller sur la galerie photo de gsfc&#34;&gt;gsfc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois l&amp;rsquo;ensemble des flux récupérés, il serait intéressant de n&amp;rsquo;en faire qu&amp;rsquo;un. C&amp;rsquo;est le travail de l&amp;rsquo;outil &lt;a href=&#34;http://moonmoon.org/&#34; title=&#34;Se rendre sur le site officiel de moonmoon&#34;&gt;moonmoon&lt;/a&gt; qui se charge de prendre l&amp;rsquo;adresse de plusieurs flux et affiche le résultat.&lt;/p&gt;
&lt;p&gt;Le tout est consultable par le web ou via un flux ATOM. On peut également récupérer le fichier OPML permettant d&amp;rsquo;importer tout les flux dans son propre lecteur de flux.&lt;/p&gt;
&lt;p&gt;Avouez que c&amp;rsquo;est génial comme outil, non ?&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Grâce à &lt;strong&gt;github-tags&lt;/strong&gt; et &lt;strong&gt;moonmoon&lt;/strong&gt;, plus d&amp;rsquo;excuses d&amp;rsquo;avoir des applications à la ramasse ! Vous serez toujours au goût du jour.&lt;/p&gt;
</description>
    </item>
    
    <item>
	    <title>Contraste du bureau avec Redshift</title>
      <link>https://olivier.dossmann.net/2013/03/contraste-du-bureau-avec-redshift/</link>
      <pubDate>Fri, 01 Mar 2013 12:30:00 +0100</pubDate>
      
      <guid>https://olivier.dossmann.net/2013/03/contraste-du-bureau-avec-redshift/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Il y a bientôt 2 ans, &lt;a href=&#34;https://olivier.dossmann.net/2010/03/modifiez-votre-environnement-de-travail-avant-que-ce-ne-soit-lui-qui-le-fasse/&#34; title=&#34;Lire l&#39;ancien article au sujet de l&#39;ergonomise à son poste de travail&#34;&gt;je vous parlais de l&amp;rsquo;ergonomie à son poste informatique&lt;/a&gt;. Ne vous inquiétez pas, c&amp;rsquo;est toujours à jour, simplement nous allons le compléter avec un logiciel supplémentaire : un outil qui permet d&amp;rsquo;adapter le contraste/température de votre écran en fonction de votre géolocalisation, de l&amp;rsquo;heure de la journée et de la &lt;em&gt;température&lt;/em&gt; du soleil.&lt;/p&gt;
&lt;h3 id=&#34;redshift&#34;&gt;Redshift&lt;/h3&gt;
&lt;p&gt;C&amp;rsquo;est bien de cela que nous parlons : &lt;a href=&#34;https://launchpad.net/redshift&#34; title=&#34;Visiter le projet Redshift sur Launchpad&#34;&gt;Redshift&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://olivier.dossmann.net/images/logiciels/redshift-scr-1.png&#34; alt=&#34;Redshift&#34; title=&#34;Le logiciel Redshift&#34;&gt;&lt;/p&gt;
&lt;p&gt;Cet outil permet d&amp;rsquo;adapter la couleur/contraste/température de votre écran pour économiser vos yeux.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Comment s&amp;rsquo;y prend-t-il ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est très simple, il s&amp;rsquo;occupe d&amp;rsquo;adapter cette &lt;em&gt;température&lt;/em&gt; en fonction de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l&amp;rsquo;heure de votre ordinateur&lt;/li&gt;
&lt;li&gt;la longitude et latitude que vous lui donnez&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En somme il va calculer le degré d&amp;rsquo;ensoleillement que vous subissez afin d&amp;rsquo;adapter l&amp;rsquo;écran à cette lumière théorique.&lt;/p&gt;
&lt;p&gt;Il vous faudra donc jouer le jeu en donnant votre positionnement GPS au logiciel afin qu&amp;rsquo;il puisse se lancer.&lt;/p&gt;
&lt;p&gt;Pour plus d&amp;rsquo;information je vous invite à lire le &lt;a href=&#34;https://olivier.dossmann.net/wiki/bureautique/redshift/&#34; title=&#34;Se rendre sur le tutoriel d&#39;Olivier pour en savoir plus&#34;&gt;tutoriel de Redshift sur mon recueil d&amp;rsquo;astuces&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Après plusieurs jours d&amp;rsquo;utilisation, je vous garantie qu&amp;rsquo;on sent la différence :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;moins de fatigue en fin de journée&lt;/li&gt;
&lt;li&gt;moins de picotements aux yeux&lt;/li&gt;
&lt;li&gt;moins d&amp;rsquo;éblouissements de la lumière&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En somme, ce n&amp;rsquo;est que du bonheur !&lt;/p&gt;
&lt;p&gt;Note : attention, je pense qu&amp;rsquo;il peut devenir désagréable de ne pas avoir ce logiciel quand on utilise d&amp;rsquo;autres ordinateurs.&lt;/p&gt;
&lt;h3 id=&#34;liens&#34;&gt;Liens&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://launchpad.net/redshift&#34; title=&#34;Visiter le projet Redshift sur Launchpad&#34;&gt;Page du projet Redshift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://olivier.dossmann.net/wiki/bureautique/redshift/&#34; title=&#34;Se rendre sur le tutoriel d&#39;Olivier pour en savoir plus&#34;&gt;Tutoriel de Redshift sur mon recueil d&amp;rsquo;astuces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
