<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dryusdan.space</title><link>https://dryusdan.space/</link><description/><atom:link href="https://dryusdan.space/feeds/all.rss.xml" rel="self"/><lastBuildDate>Tue, 23 Jun 2026 08:24:00 +0200</lastBuildDate><item><title>Le cold brew pour un café froid</title><link>https://dryusdan.space/notes/2026/06/le-cold-brew-pour-un-cafe-froid</link><description>&lt;p&gt;Avec un titre comme ça, tout le monde va se dire &amp;quot;Berk,
le café froid c'est déguelasse&amp;quot;. Alors oui, celui qui a
une infusion classique (67°C) ou avec un percolateur.
Mais avez-vous essayé le &amp;quot;cold brew&amp;quot; ?&lt;/p&gt;
&lt;p&gt;Le cold brew c'est une méthode d'infusion à froid qui, grosso
modo, prend entre 8 et 12h (voire 24h si vous l'aimez très
corsé). Niveau histoire ça remonterait au 17ème siècle. Le
café est moins acide, moins amer (ça tabasse pas le bide) et
les arômes sont présents et ne sont pas gâchés par trop d'amertume
(lorsque je me loupe sur le café).&lt;/p&gt;
&lt;p&gt;Mais je vous en parle aujourd'hui car il fait UNE CHALEUR
(vous vous en êtes sûrement rendu compte) ce qui m'empêche
de lancer le moindre truc qui chauffe. Sauf que vu la
chaleur des nuits, il me faut du café pour tenir. Et là
je me remémore un truc : il existe un café infusé à froid.
Pas un expresso on the rock, vraiment un café infusé à froid.
Tu prends une cafetière à piston (french press) ou une bouteille
spécialement prévue pour, tu fous ton café, tu colles ça au frigo
et quand tu te lèves le lendemain matin (soit grosso modo 8h après
avoir préparé ton café) tu te sers.&lt;/p&gt;
&lt;p&gt;Franchement entre le profil aromatique très intéressant, le fait
que ça ne chauffe pas, le fait que ça ne peut pas refroidir je ne peux
que le recommander. Apparemment il existerait plein de recettes aussi
pour tuner son café, genre mettre du sirop de canne, une lamelle de
citron, de l'eau pétillante, du tonic (hu?)... J'ai quand même
suivi &lt;a class="reference external" href="https://www.coffee-spirit.maxicoffee.com/tuto/recette-cold-brew/"&gt;un tuto&lt;/a&gt; pour faire mon premier cold brew.&lt;/p&gt;
&lt;p&gt;Bref je recommande&lt;/p&gt;
&lt;p&gt;Bon courage pour cette chaleur !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 23 Jun 2026 08:24:00 +0200</pubDate><guid>tag:dryusdan.space,2026-06-23:/notes/2026/06/le-cold-brew-pour-un-cafe-froid</guid><category>notes</category></item><item><title>Chaleur</title><link>https://dryusdan.space/notes/2026/06/chaleur</link><description>&lt;p&gt;Petit billet d'humeur sur la chaleur actuelle et
les 40°C prévus demain à Nantes et 45°C lundi selon le
modèle ARPEGE (&lt;a class="reference external" href="https://www.meteociel.fr/previsions-arpege-1h/15569/nantes.htm"&gt;source météociel&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="un tableau des températures, humidié et météo." src="/content/images/2026/06/meteociel.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Mais qui aurait pu le prévoir ? En 2024 le gouvernement
nous a lâché un énorme &amp;quot;va falloir s'adapter à une
augmentation des températures climatiques de 4°C.&amp;quot;.
Maintenant, paniqué il nous demande de boire de l'eau
et d'appeler un numéro vert (et Paris achète des climatiseurs).&lt;/p&gt;
&lt;p&gt;S'adapter est le maitre mot et je suis d'accord parce que
malheureusement on a plus le choix. J'ai personnellement actionné
un bon nombre de levier de mon côté pour éviter ce +4°C, il en
reste encore (comme le fromage dont les vaches laitières vont
terriblement souffrir (&lt;a class="reference external" href="https://bsky.app/profile/sergezaka.bsky.social/post/3moklgnorxk2e"&gt;Dr. Serge Zaka&lt;/a&gt;)). La faune et la flore
en général vont souffrir  (y a qu'à voir la taille des salades au
mois de mai, elles étaient minuscules).&lt;/p&gt;
&lt;p&gt;Mais après les leviers personnels, qu'est-ce qu'il reste ?&lt;/p&gt;
&lt;p&gt;Est-ce qu'on a vu des actions visant à densifier la végétation
en ville ? À lutter contre les ilots de chaleur (d'ailleurs
météofrance à sortie &lt;a class="reference external" href="https://meteofrance.com/le-changement-climatique/les-bases-du-changement-climatique/cartographie-de-leffet-dilot-de-chaleur"&gt;une carte&lt;/a&gt; et Nantes fait un +4°C) ? À
protéger les logements du soleil et plus généralement à protéger
les personnes ?&lt;/p&gt;
&lt;p&gt;Non. Nous avons élu un gouvernement (il s'agit d'un raccourci,
je n'ai pas parlé de la manipulation et des ingérences étrangère)
qui décide de nous protéger uniquement contre les menaces
physiques (et se protéger par la même occasion), mais ni contre
une ingérence étrangère (coucou Twitter) ni contre la chaleur.
Après c'est compliqué de coller une balle aux rayons UV.&lt;/p&gt;
&lt;p&gt;Pourtant il y a des choses &amp;quot;simples&amp;quot; à mettre en place, mais comme
cela nécessiterait de contraindre une partie de la population, nos
politiques font le choix de laisser des gens dans des appartements
sans volets, sous les toits en zinc.&lt;/p&gt;
&lt;p&gt;Vraiment, quand je parle de choses simples, je parle pas de refaire
l'architecture de tous nos bâtiments ou de remplacer le capitalisme
(chaque chose en son temps pour éviter de perdre trop de monde), mais
simplement d'imposer des volets extérieurs à chaque fenêtre et Velux,
idéalement des auvents, faciliter voir imposer l'installation de
ventilateur de plafond car oui, même si c'est moche ça fait circuler
l'air, permet de réduire la chaleur ressentit ou d'aider à réchauffer
la pièce en hiver (&lt;a class="reference external" href="https://www.leroymerlin.fr/comment-choisir/comment-choisir-son-ventilateur-de-plafond.html"&gt;Leroymerlin&lt;/a&gt; même si plein de site semblent
d'accord ainsi que des retours que j'ai eus), d'interdire la taille
des haies et des arbres après mars / avril (non parce que les tailles
haies sous 35°C en mai, c'était quoi le plan ? Faire crever la
végétation ?) et idéalement de réduire le nombre de place de parking
pour y mettre des énormes bacs à fleur plein de fougère et d'arbustes.
Peut-être réduire le nombre de lumière allumé la nuit (pour pouvoir
dormir le volet ouvert) et imposer une limite sonore aux véhicules
(comment ça la limite sonore ça existe déjà ?).&lt;/p&gt;
&lt;p&gt;Bien sûr que ce n'est pas un truc qui se fait en 6 mois, mais en 2024
on nous annonçait déjà &amp;quot;on va devoir s'adapter&amp;quot;. En 2026 on aurait
déjà pu un peu s'adapter et peut-être  subir un peu moins la chaleur la nuit.&lt;/p&gt;
&lt;p&gt;Après nous avons du technosolutionnisme comme &lt;a class="reference external" href="https://www.environnement-magazine.fr/territoires/article/2022/07/13/140427/nantes-metropole-experimente-ilot-fraicheur-autonome-energie"&gt;ce magnifique essai d'ilot de
fraicheur&lt;/a&gt; à Rezé dans une zone ultra minérale (je ne sais même pas ce qu'il
en est devenu d'ailleurs).&lt;/p&gt;
&lt;p&gt;De mon côté j'ai acheté des films anti UV pour mes fenêtres orientées plein
sud sans volet, ça marche très bien. La couverture de survie aussi en vrai
mais c'est plus fragile. J'ai couvert mon balcon d'un caillebotis en bois,
car le bois stock moins la chaleur et renvoie une partie des rayons pour
éviter que le balcon chauffe et fasse chauffer le bâtiment (couvrir la terrasse
de caillebotis c'est, malheureusement, hors de prix). J'en ai vu les effets,
la salle avec les fenêtres plein sud ne chauffe plus par effet de serre et le
balcon est plus frais plus rapidement selon le thermomètre.&lt;/p&gt;
&lt;p&gt;Petit disclamer, j'habite Nantes pas totalement par choix
mais surtout parce que j'y travaille. J'ai grandi à la
campagne, pas loin de Nantes, donc être entouré de béton
c'est pas vraiment mon kiff (et je pense pas pour beaucoup)?&lt;/p&gt;
&lt;p&gt;D'ailleurs pour les Nantais·e·s, Nantes à fait une carte et a mit
en place quelques zones de fraicheur : &lt;a class="reference external" href="https://metropole.nantes.fr/actualites/fortes-chaleurs-270-lieux-ou-se-mettre-au-frais-a-nantes-et-dans-la-metropole"&gt;https://metropole.nantes.fr/actualites/fortes-chaleurs-270-lieux-ou-se-mettre-au-frais-a-nantes-et-dans-la-metropole&lt;/a&gt;
(Bon, il faut sortir et on ne peut pas y dormir).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Classique, ça devait être une note, c'est quasiment un article.
J'avais besoin d'une soupape, la chaleur a le même effet pour
moi que les phares d'une voiture pour un lapin sur l'autoroute.&lt;/p&gt;
&lt;p&gt;Et je suis tombé sur cette chronique sur Instagram :
&lt;a class="reference external" href="https://www.instagram.com/p/DZc21VcNo0a"&gt;https://www.instagram.com/p/DZc21VcNo0a&lt;/a&gt; qui essaye de faire prendre
un peu de recul sur le discours moralisateur &amp;quot;vous faites pas assez
d'effort&amp;quot;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur ce, hydratez vous bien, force et courage !&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;jweckschmied"&gt;Jonas Weckschmied&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 20 Jun 2026 13:05:00 +0200</pubDate><guid>tag:dryusdan.space,2026-06-20:/notes/2026/06/chaleur</guid><category>notes</category></item><item><title>Ne pas perdre le lien entre l'interface Incus et SystemD</title><link>https://dryusdan.space/notes/2026/05/ne-pas-perdre-le-lien-entre-l-interface-incus-et-systemd</link><description>&lt;p&gt;J'ai rencontré⋅e avec mon lab un petit problème, surtout en ce moment où
il y a une faille critique détectée tous les deux jours : si je redémarre
systemd-networkd, Incus n'arrive plus à utiliser l'interface créée par SystemD
à laquelle Incus est rattachée (&lt;a class="reference external" href="https://dryusdan.space/mon-lab-episode-3-isoler-les-reseaux#interfacons-linux"&gt;Épisode 3&lt;/a&gt; de ma série &amp;quot;Mon lab&amp;quot;).&lt;/p&gt;
&lt;p&gt;J'ai ouvert un bug côté Incus qui m'a répondu qu'une commande existe (et que
c'est systemd qui supprime et recréer l'interface) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vxlan5&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;br5
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Problème, il n'y a pas d'équivelent à &lt;tt class="docutils literal"&gt;parent&lt;/tt&gt; dans la documentation de SystemD
(enfin facilement trouvable=. Mais il existe &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html#BatmanAdvanced="&gt;4 autres options&lt;/a&gt; qui permettent de
se lier à une interface parente (dont BATMAN)&lt;/p&gt;
&lt;p&gt;Mais là où ça devient plus intéressant c'est que juste au dessus systemd présente
une autre option qui permet que lors d'un reload ou restart, l'index de l'interface
ne va pas changer, ce qui correspond TOTALEMENT avec mon problème vu que Incus perd
l'interface car l'index change. Il s'agit de &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html#KeepMaster="&gt;KeepMaster&lt;/a&gt;. Je l'ai mis sur mes interfaces
VXLAN et je peux redémarrer systemd-networkd sans aucun problème !&lt;/p&gt;
&lt;p&gt;Sur ce, à bientôt !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 17 May 2026 18:06:00 +0200</pubDate><guid>tag:dryusdan.space,2026-05-17:/notes/2026/05/ne-pas-perdre-le-lien-entre-l-interface-incus-et-systemd</guid><category>notes</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category></item><item><title>Mon lab - Épisode 4 : Étendre les réseaux</title><link>https://dryusdan.space/mon-lab-episode-4-etendre-les-reseaux</link><description>&lt;p&gt;Dans &lt;a class="reference external" href="/mon-lab-episode-3-isoler-les-reseaux"&gt;l'article précédent&lt;/a&gt;, j'ai expliqué comment créer une multitude de
réseaux ethernet (L2) isolés les uns des autres grâce au VXLAN.&lt;/p&gt;
&lt;p&gt;Aujourd'hui je vais expliquer comment j'ai pu étendre un VXLAN jusqu'à
un hyperviseur hébergé dans un datacenter et donc étendre un réseau de type L2
sur plusieurs centaines de kilomètres.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Un schéma représentant 3 hyperviseurs sous un routeur nommé Turris et deux hyperviseurs reliés via un tunnel wireguard vers ce Turris et entre eux. On aperçois qu'un des réseaux de type L2 a été étendu sur tous les hyperviseurs" src="/content/images/2026/05/vpc-multicloud.png" /&gt;&lt;/p&gt;
&lt;p&gt;Il y a une petite subtilité dans mon infrastructure : mon routeur possède un tunnel
Wireguard dispensant ainsi mes hyperviseurs d'en avoir un chacun. S'il tombe, mes
hyperviseurs n'ont de toute manière plus internet. De plus, je laisse au routeur
tous les calculs à faire pour fragmenter des paquets, car sur mon lab j'ai un MTU
de 9200 et que souvent les équipements réseaux sont configurés avec un MTU de 1500
(enfin d'un point de vue utilisateur).&lt;/p&gt;
&lt;div class="section" id="la-realisation"&gt;
&lt;h2&gt;La réalisation&lt;/h2&gt;
&lt;div class="section" id="tunnelisons-avec-wireguard"&gt;
&lt;h3&gt;Tunnelisons avec Wireguard&lt;/h3&gt;
&lt;p&gt;Pour étendre le réseau, je vais partir de l'article précédent. Je connecte d'abord chacun
de mes hyperviseurs entre eux avec Wireguard. Cependant, je configure le tunnel Wireguard
à l'aide de &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-networkd&lt;/span&gt;&lt;/tt&gt; et non wg-quick. Mais contrairement au précédent article je
ne vais pas configurer les VXLANs sur l'interface &lt;tt class="docutils literal"&gt;eno1&lt;/tt&gt; mais sur
&lt;tt class="docutils literal"&gt;wg0&lt;/tt&gt;. Comme, par exemple, dans mon fichier &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/network/50-wg0.network&lt;/span&gt;&lt;/tt&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Match]
Name=wg0

[Network]
Address=100.64.0.5/32
Address=fd42:6c33:87f2::a/128

# VXLAN
VXLAN=vxlan199876

[Route]
Destination=100.64.0.1/32
Scope=link

[Route]
Destination=fd42:6c33:87f2::1/128
Scope=link

[Route]
Destination=100.64.0.13/32
Scope=link

[Route]
Destination=fd42:6c33:87f2::f/128
Scope=link

[Route]
Destination=172.25.0.0/24
Scope=link
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je vais pas vous présenter comment configurer Wireguard avec systemd-networkd, ce n'est pas le but
de cet article mais voici &lt;a class="reference external" href="https://blog.garamotte.net/posts/2020/08/29/fr-wireguard-with-systemd-networkd.html"&gt;un article&lt;/a&gt; que j'ai trouvé bien expliqué (&lt;a class="reference external" href="https://archive.dryusdan.fr/archive/1778780724.150898/index.html"&gt;archive&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Toujours dans la configuration réseau, je vais devoir modifier la valeur de la clé &lt;tt class="docutils literal"&gt;Local&lt;/tt&gt;
dans &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/network/20-vxlan10.netdev&lt;/span&gt;&lt;/tt&gt; et la remplacer par l'IP de l'interface wg0.
Je vous assure que j'ai galéré quelques temps, car je ne comprenais pas pourquoi FRR annonçait
comme next-hop l'IP public de mon instance et non wireguard. Tout ça parce qu'en réalité le
VXLAN était annoncé sur l'IP public.&lt;/p&gt;
&lt;p&gt;Dernier petit détail très important : le MTU. Wireguard utilise un MTU de 1420. Dans l'article
précédent je vous indiquais que VLXAN utilise 50 bytes s'il communique en IPv4 et 70 s'il communique
en IPv6. Il faut donc adapter en conséquence la valeur de MTUBytes par 1370 (IPv4) ou 1350 (IPv6)
sur les interfaces VXLANs (donc dans les fichiers &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;vxlan*.network&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="annoncons-avec-frr"&gt;
&lt;h3&gt;Annonçons avec FRR&lt;/h3&gt;
&lt;p&gt;Dans cette partie-là il n'y a quasiment rien à adapter, vous annoncez votre peer auprès de tous vos FRR
et &lt;em&gt;voilà&lt;/em&gt;. Il peut cependant être de bon aloi d'éditer légèrement la configuration du deamon bgp
(dans le fichier &lt;tt class="docutils literal"&gt;/etc/frr/daemons&lt;/tt&gt;) pour qu'il écoute uniquement sur l'adresse IP de l'interface
Wireguard et non de toutes les interfaces en replaçant la ligne&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;bgpd_options=&amp;quot;   -A 127.0.0.1&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;par&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;bgpd_options=&amp;quot;   -A 127.0.0.1 --listenon 100.64.0.5&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et c'est tout. Honnêtement je m'attendais à quelques galères en plus mais la plus grosse complexité a été
de comprendre pourquoi FRR annonçait l'IP public et pas l'IP du peer (la fameuse histoire du &lt;tt class="docutils literal"&gt;Local&lt;/tt&gt; plus haut).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="les-performances"&gt;
&lt;h2&gt;Les performances&lt;/h2&gt;
&lt;p&gt;Avant de parler performance, je présente un peu l'environnement des tests.
Mon lab est hébergé sur une ligne Free à Nantes, les hyperviseurs étaient deux instances
hébergées chez Scaleway, une dans l'AZ Paris 1 et l'autre dans Paris 2. Il est possible
que les performances aient pu bénéficier d'un impact positif du fait que Free et Scaleway
sont dans le même groupe.&lt;/p&gt;
&lt;p&gt;Pour en revenir aux performances, je n'ai rien vu de notable. Le ping entre deux LXC dans
un VXLAN sur les deux instances étaient similaires à ce que j'ai en passant par l'interface
publique.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@cloud-hv ~ # ping -c 4 151.115.146.191
PING 151.115.146.191 (151.115.146.191) 56(84) bytes of data.
64 bytes from 151.115.146.191: icmp_seq=1 ttl=54 time=2.00 ms
64 bytes from 151.115.146.191: icmp_seq=2 ttl=54 time=1.72 ms
64 bytes from 151.115.146.191: icmp_seq=3 ttl=54 time=1.71 ms
64 bytes from 151.115.146.191: icmp_seq=4 ttl=54 time=1.63 ms

--- 151.115.146.191 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 1.634/1.764/1.999/0.139 ms


root@test-cloudy:~# ping 10.0.0.112 -c 4
PING 10.0.0.112 (10.0.0.112) 56(84) bytes of data.
64 bytes from 10.0.0.112: icmp_seq=1 ttl=64 time=1.70 ms
64 bytes from 10.0.0.112: icmp_seq=2 ttl=64 time=2.22 ms
64 bytes from 10.0.0.112: icmp_seq=3 ttl=64 time=1.71 ms
64 bytes from 10.0.0.112: icmp_seq=4 ttl=64 time=1.57 ms

--- 10.0.0.112 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.569/1.799/2.224/0.250 ms
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et entre mon lab et le container sur l'instance, le ping est terriblement raisonnable&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@test-cloudy:~# ping 10.0.0.1 -c 4
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=15.0 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=15.3 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=15.2 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=15.6 ms

--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3018ms
rtt min/avg/max/mdev = 15.042/15.294/15.592/0.198 ms
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour vérifier si des plus gros paquets n'allaient pas rencontrer de vrais problèmes, j'ai
lancé un iperf entre un LXC sur mon lab et un container chez Scaleway. Et je n'ai rien
vu de problématique&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@gw-test ~ # iperf3 -c 10.0.1.185
Connecting to host 10.0.1.185, port 5201
[  5] local 10.0.0.1 port 51856 connected to 10.0.1.185 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  89.5 MBytes   750 Mbits/sec    0   2.04 MBytes
[  5]   1.00-2.00   sec   103 MBytes   863 Mbits/sec    0   2.04 MBytes
[  5]   2.00-3.00   sec  84.6 MBytes   711 Mbits/sec  330   1.56 MBytes
[  5]   3.00-4.00   sec  91.0 MBytes   764 Mbits/sec    0   1.69 MBytes
[  5]   4.00-5.00   sec  87.0 MBytes   729 Mbits/sec  181   1.26 MBytes
[  5]   5.00-6.00   sec  75.0 MBytes   629 Mbits/sec    0   1.34 MBytes
[  5]   6.00-7.00   sec  82.1 MBytes   689 Mbits/sec    0   1.40 MBytes
[  5]   7.00-8.00   sec  78.8 MBytes   661 Mbits/sec    0   1.44 MBytes
[  5]   8.00-9.00   sec  80.9 MBytes   677 Mbits/sec    0   1.47 MBytes
[  5]   9.00-10.00  sec  72.6 MBytes   610 Mbits/sec   44   1.06 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   844 MBytes   708 Mbits/sec  555            sender
[  5]   0.00-10.02  sec   842 MBytes   705 Mbits/sec                  receiver
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alors certes il y a un peu de &lt;em&gt;retransmit&lt;/em&gt;, ce qui est léger voire normal compte tenu de
l'ajout de couches, de mon réseau, du fait que je suis sur une fibre partagée, que l'hyperviseur
hébergeant l'instance est également partagé. Bref, ça ne me choque pas.&lt;/p&gt;
&lt;p&gt;Et voilà comment étendre une VXLAN entre plusieurs datacenter 😁&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Cet article signe la fin de cette série. Série qui m'a demandé beaucoup de recherches, du développement
et de longues soirées pour la mettre en place. Série que j'ai adoré écrire et vous partager.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur ce, portez-vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dannypostma"&gt;Danny Postma&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 15 May 2026 10:30:00 +0200</pubDate><guid>tag:dryusdan.space,2026-05-15:/mon-lab-episode-4-etendre-les-reseaux</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category><category>LabAAS</category></item><item><title>Qu'est ce qui tourne chez moi ?</title><link>https://dryusdan.space/quest-ce-qui-tourne-chez-moi</link><description>&lt;p&gt;Après avoir refait mon lab par une infra bien plus complexe (mais bien
plus drôle), j'ai commencé à rechercher des outils que j'aimerais mettre ou
remettre en place. Sachant que ces outils sont quasiment tous déployés soit
avec mes &lt;a class="reference external" href="https://git.dryusdan.fr/Ansible"&gt;playbooks Ansible&lt;/a&gt; ou avec &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/argocd"&gt;ArgoCD&lt;/a&gt; sur mon cluster Kubernetes.&lt;/p&gt;
&lt;p&gt;Et pourquoi ne pas vous en parler ? Vous pourriez découvrir certaines
applications ou m'en partager d'autres (tant que je n'ai pas remis les
commentaires, vous pourrez trouver tout ce qu'il faut pour me contacter
sur la page &lt;a class="reference external" href="https://dryusdan.space/hello"&gt;/hello&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Je possède deux types d'applications : les applications du quotidien
et les applications techniques.&lt;/p&gt;
&lt;div class="section" id="au-quotidien"&gt;
&lt;h2&gt;Au quotidien&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://nextcloud.com/fr/"&gt;Nextcloud&lt;/a&gt; + &lt;a class="reference external" href="https://www.collaboraonline.com/fr/code/"&gt;CollaboraCode&lt;/a&gt; : Un cloud selfhosted avec l'édition de fichiers
collaboratifs en ligne. C'est lourd, mais pour le moment ça reste encore suffisament
user friendly et ça répond encore à mon besoin pour avoir la flemme de chercher
autre chose.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://jotty.page/"&gt;Jotty&lt;/a&gt; : Un outil de prises de notes, de To-do list et de Kanban. Découvert grâce à
&lt;a class="reference external" href="https://blog.linuxine.net/article523/mon-appli-de-notes-suites"&gt;Linuxine&lt;/a&gt;. Il a très vite été adopté et a remplacé &lt;a class="reference external" href="https://vikunja.io/"&gt;Vikunja&lt;/a&gt; qui ne voulait
pas démarrer avec un container rootless sur Kube.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/24eme/signaturepdf"&gt;SignaturePDF&lt;/a&gt; : Un petit outil en PHP qui permet tout un tas de modifications de PDF
(signer, mettre un filigrane, supprimer des pages, changer l'orientation...).
Franchement une très bonne boite à outils, un indispensable selon moi, ça ne prend
pas de ressources et ça permet de remplir tous plein de documents.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://docs.tandoor.dev/"&gt;Tandoor recipes&lt;/a&gt;. Lorsque je l'ai installé c'était un outil de recettes de cuisine
qui peut importer les données de certains sites. Aujourd'hui il gère le menu de la
semaine, les recettes, les courses, le contenu du frigo. Je n'utilise clairement pas
tout, mais je le garde quand même, ça reste pratique.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/ovumcy/ovumcy-web"&gt;Ovumcy&lt;/a&gt; : Un outil de suivi des cycles menstruels. Au-delà d'éviter une grossesse
ou à l'inverse concevoir, je découvre que ce type d'outils peut tout simplement
permettre un suivi de santé liée aux périodes du cycle en proposant de décrire
ses symptômes. Ces informations peuvent être, au besoin, utilisées lors d'un suivi médical.
Forcément l'application est self-hosted et mobile first. Ça permet donc que ces données
ne soient pas accessibles par une entreprise quelconque ou qu'un trou du cul puisse
faire la chasse aux avortements.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://docs.paperless-ngx.com/"&gt;Paperless-ngx&lt;/a&gt; : Un outil pour trier et classifier vos documents. Il se base,
notamment, sur NLTK pour faire de la reconnaissance automatique. Cette semaine, par
exemple, j'ai mis ma fiche de paie qui a été triée dans le dossier &amp;quot;Fiches de paie&amp;quot; et
taggué au nom de ma boite en y ajoutant la date et tout. J'ai également reçu le reçu
fiscal de Framasoft qui a directement été trié dans le dossier impôt, la bonne date,
et marqué comme type &amp;quot;Reçu fiscal&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/dani-garcia/vaultwarden"&gt;Vaultwarden&lt;/a&gt;. Je pense que vous connaissez déjà celui-ci, mais je vais tout de même
le présenter. Il s'agit d'un gestionnaire de mots de passe self hosted et qui possède
différentes extensions et applications mobiles très complètes. Il retire le côté chiant
de devoir synchroniser un .kdbx sur tous ses appareils et donc il est plus avenant
pour les néophytes, mais la surface d'attaque est donc plus grande.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/SamR1/FitTrackee"&gt;Fittrackee&lt;/a&gt; : Il s'agit d'une application permettant de suivre ses activités
sportives. Je l'utilise principalement pour conserver mes données et ainsi
éviter de m'enfermer dans une marque d'équipement.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://kresus.org"&gt;Kresus&lt;/a&gt; : Un gestionnaire de compte. Je l'utilisais beaucoup, malheureusement
ma banque a explosé son interface il y a plusieurs mois empêchant le scrapping
des données 🙁. Et je le protégeais derrière GoAuthentik (que je mentionne plus bas). :D&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://jellyfin.org/"&gt;Jellyfin&lt;/a&gt; : Un média center.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.hortusfox.com/"&gt;Hortufox&lt;/a&gt; : Un tracker de plantes chez soi. Je l'utilise notamment pour enregistrer
la fréquence d'arrosage, le type de terre et si elles sont malades ou pas.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://wallabag.it/fr/"&gt;Wallabag&lt;/a&gt; : Un read it later, alternative à Pocket. Ça permet de mettre dans un coin
une page web (avec sauvegarde en cache local) et la relire plus tard.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://freshrss.org/index.html"&gt;FreshRSS&lt;/a&gt; : Un outil d'agrégation de flux RSS. Pour les non techniques, un fichier RSS
est un fichier mis à disposition par un site pour être récupéré par une application
comme celle-ci. Cela permet d'avoir une application de news pour tous les sites au lieu
d'une application par site. C'est bien pratique.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://addy.io/"&gt;Addy.io&lt;/a&gt; : Un outil de gestion d'alias et de forward d'email. Mozilla propose un
service similaire avec 5 alias.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/wishthis/wishthis"&gt;Wishthis&lt;/a&gt; : Un outil de gestion de listes de souhaits. Je l'ai utilisé un temps,
je l'ai délaissé depuis, mais il est encore présent. Faut en avoir l'utilité.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://goauthentik.io/"&gt;GoAuthentik&lt;/a&gt; : Mon SSO/LDAP. On pourrait penser que ce n'est pas utile, mais
dès qu'on partage certaines applications à des ami⋅e⋅s ou à sa famille, c'est
tout de suite bien plus pratique pour tout le monde. Ils n'auront qu'un mot de
passe à utiliser, je sais à quelles applications ils ont accès et je peux forcer
la double authentification ou imposer une &amp;quot;robustesse&amp;quot; du mot de passe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà globalement tous les services non techniques que j'utilise et que je partage à
mes proches :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-services-techniques"&gt;
&lt;h2&gt;Les services techniques&lt;/h2&gt;
&lt;p&gt;J'ai aussi deux trois services techniques, soit pour gérer ça, soit pour le fun&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://forgejo.org/"&gt;Forgejo&lt;/a&gt; : C'est ma forge logicielle&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://healthchecks.io/"&gt;Healthchecks&lt;/a&gt; : Un outil qui me permet de monitorer certaines tâches cron
(genre les backups, certains fetch de donnée) et qui m'alerte en cas de fail.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.rudder.io/"&gt;Rudder&lt;/a&gt; : Un outil de maintien en conformité de mes serveurs. Vous vous
souvenez de copy.fail ? En 5 minutes toutes mes machines ont été patchées et
j'étais sûr qu'elles l'ont été.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.knot-dns.cz/"&gt;Knot DNS&lt;/a&gt; : Mon serveur DNS faisant authorité&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://archivebox.io/"&gt;Archivebox&lt;/a&gt; : Un outil pour sauvegarder son morceau du web, de page que je ne
souhaite pas voir disparaitre. J'en ai même fait &lt;a class="reference external" href="/sauvez-le-web-faites-des-copies"&gt;un article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.zabbix.com/"&gt;Zabbix&lt;/a&gt; : Pour mon monitoring.&lt;/li&gt;
&lt;li&gt;Bientôt de la métrologie (Prometheus ou Victoriametrics)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/hockeypuck/hockeypuck"&gt;Hockeypuck&lt;/a&gt; : Un serveur de clé PGP fédéré (utilisé par Canonical qui eux ne
fédèrent pas è_é)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/netbox-community/netbox"&gt;Netbox&lt;/a&gt; : Mon outil de gestion d'infrastructures. J'y ai mes switch, mes 70
machines, sur quel port RJ45 est branché quel hyperviseur...&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://openbao.org/"&gt;OpenBao&lt;/a&gt; : Un fork de Hashicorp Vault pour la gestion des secrets (très utile
avec l'automatisation)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je pense avoir fait le tour des applications principales. C'est grosso modo une
liste, mais si elle peut vous faire découvrir certaines applications, je suis content⋅e.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;jain_mudit"&gt;Mudit Jain&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 09 May 2026 14:00:00 +0200</pubDate><guid>tag:dryusdan.space,2026-05-09:/quest-ce-qui-tourne-chez-moi</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category></item><item><title>Augmenter la taille d'un RAID5 et son LVM</title><link>https://dryusdan.space/augmenter-la-taille-raid5-lvm</link><description>&lt;p&gt;Il arrive, parfois, d'être à court de place sur son NAS maison. Dans ce
cas vous avez 3 options :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Faire du ménage&lt;/li&gt;
&lt;li&gt;Changer les disques un à un par des disques plus gros&lt;/li&gt;
&lt;li&gt;Si vous NAS le permet : ajouter un disque&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai déjà dû, par le passé, remplacer les disques un à un pour des disques
plus grands. Ça prend la semaine à faire et j'avoue ne pas l'avoir
documenté. Mais aujourd'hui je vais rajouter un disque dans mon NAS.&lt;/p&gt;
&lt;p&gt;J'utilise des Western RED 6To (qui ont pris 60€ en 2 ans) 😵‍💫 en
RAID 5. Je n'ai jamais été déçu et ils ont remplacé avec brio mes
Western RED 3To qui ont tourné de 2018 à 2024 sans relâche (et qui vont
de nouveau être utilisés pour le cloud familial).&lt;/p&gt;
&lt;p&gt;Bon, il est l'heure de changer le disque ! La partie hardware je vous
laisse la faire, y a rien de bien sorcier mais chaque machine étant montée
différemment présenter comment faire ici serai peu utile. Par contre la partie
software ça je vais vous montrer comment faire 😁&lt;/p&gt;
&lt;p&gt;Une fois le nouveau disque installé, il faut le partitionner. Soit vous vous
souvenez de votre partition, soit un coup de &lt;tt class="docutils literal"&gt;sfdisk&lt;/tt&gt; (qui vient avec
&lt;tt class="docutils literal"&gt;fdisk&lt;/tt&gt;) suffit si c'est le même disque.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;sfdisk --dump /dev/sda | sfdisk /dev/sdb&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ça fonctionnera surement avec un disque similaire, mais vous pouvez avoir
un message concernant une taille de cylindre différente.&lt;/p&gt;
&lt;p&gt;Il va maintenant falloir ajouter le disque dans la grappe RAID (5, toujours)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;mdadm --add /dev/md0 /dev/sdb1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais on ne s'arrête pas en si bon chemin, il faut spécifier à mdadm qu'il faut
utiliser 4 disques et non 3 comme avant, notamment pour éviter que le nouveau
disque soit ajouté comme disque de spare (ça fait cher le stockage sinon).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;mdadm --grow --raid-devices=4 /dev/md0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il ne reste plus qu'à attendre en regardant &lt;tt class="docutils literal"&gt;/proc/mdstat&lt;/tt&gt; (ça a mit 36h pour
moi)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;root@cookie ~ # &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/proc/mdstat
&lt;span class="go"&gt;Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10]&lt;/span&gt;
&lt;span class="go"&gt;md0 : active raid5 sdb1[4] sdc1[0] sda1[1] sdd1[3]&lt;/span&gt;
&lt;span class="go"&gt;      17581168128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]&lt;/span&gt;
&lt;span class="go"&gt;      bitmap: 2/44 pages [8KB], 65536KB chunk&lt;/span&gt;
&lt;span class="go"&gt;      [&amp;gt;....................]  resync =  0.01% (957244/17581168128) finish=4125min speed=95724K/sec&lt;/span&gt;

&lt;span class="go"&gt;unused devices: &amp;lt;none&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(c'est pas totalement la vraie sorti mdadm, j'ai oublié de les noter pour l'article).&lt;/p&gt;
&lt;p&gt;Au bout de ces 36h, il faut indiquer à lvm que le disque est plus grand pour pouvoir
augmenter la taille du LVM dessus et &lt;em&gt;infine&lt;/em&gt; la taille du filesystem.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;pvresize /dev/md0&lt;/span&gt;
&lt;span class="go"&gt;lvextend -l +100%FREE /dev/mapper/srv--data-data&lt;/span&gt;
&lt;span class="go"&gt;resize2fs /dev/srv-data/data&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien entendu le srv--data-data c'est le chemin vers mon lv, indiquez le vôtre à la place&lt;/p&gt;
&lt;p&gt;Et vous voilà avec un nouveau disque en plus ! (ça va aussi me servir de note, je ne
fais pas ça tous les jours)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur ce, portez-vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;wwarby"&gt;William Warby&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 16 Feb 2026 08:00:00 +0100</pubDate><guid>tag:dryusdan.space,2026-02-16:/augmenter-la-taille-raid5-lvm</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category></item><item><title>Rétrospective Janvier 2026</title><link>https://dryusdan.space/notes/2026/01/retrospective-janvier-2026</link><description>&lt;p&gt;Hey o/&lt;/p&gt;
&lt;p&gt;As usual, la rétrospective qui arrive 15 ans après le début du mois.
J'ai d'ailleurs bougé toutes mes rétrospectives dans les notes. Je trouve
que ça &amp;quot;pollue&amp;quot; un peu trop ma homepage.&lt;/p&gt;
&lt;div class="section" id="moi"&gt;
&lt;h2&gt;Moi&lt;/h2&gt;
&lt;p&gt;En janvier j'ai publié l'article finalisant la série d'article &amp;quot;mon home lab&amp;quot;.
Je me suis pas mal arraché pour l'écrire, entre l'apprentissage et la mise en œuvre.
Aujourd'hui je suis sur la fin de la migration de mon infrastructure legacy vers
la nouvelle, ça prend un temps monstre. Cependant je m'attendais à un peu plus
d'engouement 😅. Je pense que j'ai pas eu la bonne mentalité, certes je l'ai fait
pour moi mais aussi pour prouver ce que je pense valoir. Je n'ai pas vu l'article
partagé, et vu qu'au boulot on essaye de m'expliquer comment fonctionne le bouton
power de mon ordinateur en ce moment (je caricature un peu mais vite fait),
j'ai un peu de mal à avoir l'impression d'être bon 😓. J'en reste fier, c'est mon
cloud maison, j'ai appris ou revu pas mal de truc (incluant du Kubernetes, BGP +
BGP EVPN, du VXLAN), mais c'est pas impressionnant ni compliqué quoi :D&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="projet"&gt;
&lt;h2&gt;Projet&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bloguidien.fr"&gt;Bloguidien&lt;/a&gt; a repris, il faut que je m'y remette également.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="meteo"&gt;
&lt;h2&gt;Météo&lt;/h2&gt;
&lt;p&gt;IL PLEUT... Tellement que je dois vider l'eau de mes bacs à fleur/fraise. J'espère ne
pas perdre de plante là.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="serie"&gt;
&lt;h2&gt;Série&lt;/h2&gt;
&lt;p&gt;Je me suis lancé dans la série Fallout, le gore visuel tranche beaucoup avec le burlesque
des scènes. Ça reste une série sympa à regarder, bien que classique. Ça me donne envie de jouer
aux jeux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-chiffres"&gt;
&lt;h2&gt;Les chiffres&lt;/h2&gt;
&lt;p&gt;Je ne les ai pas oubliés, juste décalé&lt;/p&gt;
&lt;p&gt;Comme d'habitude : les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;2 499 minutes&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;732&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;732&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots (en novembre)&lt;/td&gt;
&lt;td&gt;2525&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;14 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;11,58 Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagés sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 13 Feb 2026 17:30:00 +0100</pubDate><guid>tag:dryusdan.space,2026-02-13:/notes/2026/01/retrospective-janvier-2026</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Mon lab - Épisode 3 : Isoler les réseaux</title><link>https://dryusdan.space/mon-lab-episode-3-isoler-les-reseaux</link><description>&lt;p&gt;Dans &lt;a class="reference external" href="https://dryusdan.space/mon-lab-episode-2-automatiser-ses-gateways"&gt;l'article précédent&lt;/a&gt;, j'ai présenté l'objectif de ce projet, réaliser
une infrastructure &lt;em&gt;cloud like&lt;/em&gt; et pour ça je vais créer ce qu'on appelle
communément dans le jargon : des VPC&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/incus-vpc.svg" type="image/svg+xml"&gt;Un schéma représentant 2 hyperviseurs dont leurs machines partages un même réseau tout en étant isolé des autres.&lt;/object&gt;&lt;/p&gt;
&lt;div class="section" id="avec-quelle-technologie"&gt;
&lt;h2&gt;Avec quelle technologie ?&lt;/h2&gt;
&lt;p&gt;Il y a plusieurs approches pour isoler des réseaux les uns avec les autres,
mais je n'en connais que deux :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Le VLAN&lt;/li&gt;
&lt;li&gt;Le VXLAN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le VLAN va taguer un paquet ethernet (L2) en indiquant l'ID du vlan. Il y a
comme limite 4096 IDs (ce qui est beaucoup pour un réseau de particulier) et est
difficilement scalable, par exemple vous pouvez difficilement tirer votre VLAN
entre deux régions (sauf peut-être avec du L2TP). Par exemple si vous avez un
hyperviseur à Nantes et un autre à Amsterdam, le VLAN ne sera pas le choix le plus
judicieux ni le plus simple à mettre en place. Et ce n'est pas vraiment prévu
pour être étendu.&lt;/p&gt;
&lt;p&gt;Le VXLAN va, quant à lui, encapsuler un paquet ethernet dans un paquet UDP (L4)
en ajoutant les infos nécessaires devant le paquet ethernet comme le VNI
(un identifiant), le port source et le port de destination. On passe aussi d'une
limite de 4096 IDs à 4 millions, c'est plus lourd d'un point de vue réseau (paquet
plus gros, encapsulation), mais plus scalable et plus extensible. Vous pouvez plus
facilement étendre ce réseau de type L2 virtuel entre plusieurs DC. D'un point de vue
professionnel, le VXLAN a été principalement pensé pour les datacenters et le &lt;em&gt;cloud&lt;/em&gt;,
pour isoler les client⋅e⋅s entre elleux en leurs permettant de jouir pleinement de leur L2
comme s'ils étaient tout⋅e⋅s seul⋅es. Point bonus, si vous voulez jouer à Mario Kart sur
Switch avec un⋅e pote à distance sans payer l'abonnement ? Vous collez votre switch
dans un vxlan et vous êtes logiciellement côte à côte. Attention cependant, on
parle d'encapsulation de L2 dans du L3, car on ne peut transporter un
paquet ethernet que sur du L2 ou L3 et que parler de L4 perd un peu de sens. J'ai
donc parlé de L4 (ce qui est vrai) mais on parle plus souvent de L3 dans ce cas.&lt;/p&gt;
&lt;p&gt;Vous l'aurez compris, je vais donc utiliser du VXLAN, c'est plus gros, plus fun,
plus &lt;em&gt;Cloud&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-vxlan"&gt;
&lt;h2&gt;Le VXLAN&lt;/h2&gt;
&lt;p&gt;Pour fonctionner, le VXLAN a besoin d'une VTEP qui est l'interface sur lequel il
reçoit les paquets et un moyen de communiquer. La communication sert à deux choses,
déjà recevoir les paquets (logique) mais aussi annoncer où se trouve telle ou telle
adresse mac.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Déjà pourquoi annoncer une adresse MAC ? C'est le fonctionnement de la couche 2. Pour
communiquer entre deux machines d'un même réseau local, votre ordinateur va hurler sur
le réseau physique local &amp;quot;à qui appartient cette IP ?&amp;quot; et va enregistrer l'adresse mac
de la réponse dans la table ARP. L'adresse MAC est un élément essentiel du fonctionnement
du réseau physique.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Il y a plusieurs manières de faire communiquer plusieurs VTEP entre elles.&lt;/p&gt;
&lt;div class="section" id="multicast"&gt;
&lt;h3&gt;Multicast&lt;/h3&gt;
&lt;p&gt;La première est la plus simple : le multicast. Cette méthode va annoncer à tous les membres
d'une adresse multicast les paquets de type broadcast, unknown unicast et multicast (aussi
appelé &amp;quot;BUM&amp;quot;). Chacun des membres va profiter de l'annonce pour récupérer l'adresse MAC et
l'insérer dans la &amp;quot;&lt;em&gt;Forwarding Data Base&lt;/em&gt;&amp;quot; ou &amp;quot;FDB&amp;quot;. En gros, vous avez deux VM dans un même
vxlan (enfin segment réseau) sur deux machines différentes, la première va faire une requête
ARP qui est un broadcast qui sera envoyé à toutes les VTEP, pour être transmise à toutes les
VM de ce segment. Les VTEP qui reçoivent le paquet en profitent pour noter l'adresse MAC
source qui a émis ce paquet et d'où il vient &amp;quot;Le paquet reçu à telle adresse MAC et a été
envoyé par cette VTEP ci&amp;quot;. L'inconvénient de cette méthode c'est que sur une infrastructure
conséquente ça bombarde de paquets pour savoir à qui appartient quoi à travers tout le réseau
sur lequel est ce multicast. C'est là où intervient la seconde manière : l'unicast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="unicast"&gt;
&lt;h3&gt;Unicast&lt;/h3&gt;
&lt;p&gt;Le principe ici est d'indiquer à chaque VTEP où sont les autres, ça a le mérite d'éviter de ne pas
saturer le réseau avec du multicast, mais à chaque nouvel ajout de machine (ou suppression) il
faut reconfigurer toutes les VTEP pour ajouter une nouvelle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bgp-evpn"&gt;
&lt;h3&gt;BGP EVPN&lt;/h3&gt;
&lt;p&gt;Pour éviter de reconfigurer chaque VTEP il existe un moyen qui est... D'écrire manuellement la
FDB ou d'automatiser ça avec BGP ! Et c'est ce que j'utilise !&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Rapide aparté (encore) sur ce qu'est le BGP. BGP pour Border Gateway Protocol est un protocole
d'échange de route. Une route c'est le chemin que va faire un paquet entre le routeur A et le
next-hop (le routeur suivant) qu'on va appeler routeur B.&lt;/p&gt;
&lt;p&gt;Pour faire simple, pour aller de ton PC à 192.0.2.5, ton paquet va aller de routeur en routeur par
un chemin qui a été (très probablement) défini par des échanges BGP.&lt;/p&gt;
&lt;p&gt;Pour faire encore plus simple et article sensationnel : Ça porte internet (et internet, les connexions
entre réseaux, pas le web avec des applications chez AWS là que les journalistes appellent internet)&lt;/p&gt;
&lt;p&gt;(C'est très simplifié car bien évidement c'est plus complet et complexe que ça)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;J'utilise plus particulièrement BGP EVPN (&lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7432"&gt;RFC 7432&lt;/a&gt;) qui permet ainsi de créer des routes avec des MAC
(route de type 2) et non pas des IPs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;kida.srv.dryusdan.net# sh evpn mac vni 436
Number of MACs (local and remote) known for this VNI: 5
Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy
MAC               Type   Flags Intf/Remote ES/VTEP            VLAN  Seq #&amp;#39;s
10:66:6a:5f:80:a1 local        tap1503e6bb                    1     0/0
10:66:6a:31:61:5b remote       198.51.100.30                          0/0
10:66:6a:9f:8d:a4 remote       198.51.100.30                          0/0
10:66:6a:cb:93:62 remote       198.51.100.28                          0/0
10:66:6a:79:a7:8d remote       198.51.100.30                          0/0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans l'exemple ci-dessus on aperçoit que les adresses MACs &lt;tt class="docutils literal"&gt;10:66:6a:31:61:5b&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;10:66:6a:9f:8d:a4&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;10:66:6a:79:a7:8d&lt;/tt&gt;
sont joignables à l'adresse IP &lt;tt class="docutils literal"&gt;198.51.100.30&lt;/tt&gt;, donc les requêtes vers ces MACs là seront envoyéds vers cette IP.
Mais BGP EVPN ne s'arrête pas là, il partage également les VNI (route de type 3) afin d'indiquer par tel VTEP
on peut joindre tel VNI.&lt;/p&gt;
&lt;p&gt;Vous avez la théorie ? Maintenant on va passer à la pratique :D&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="pratiquons"&gt;
&lt;h2&gt;Pratiquons&lt;/h2&gt;
&lt;p&gt;Dans les articles précédents j'ai indiqué que j'utilise Incus. Bien entendu il est possible de faire fonctionner
un VXLAN avec Proxmox ou Opennebula (par exemple) mais je n'expliquerai pas comment ici. Libre à vous de partager
comment vous avez fait ;)&lt;/p&gt;
&lt;p&gt;Dans les exemples ci-dessous, les hyperviseurs sont situés dans le réseau 198.51.100.0/24.&lt;/p&gt;
&lt;div class="section" id="bgp-danse-avec-frr"&gt;
&lt;h3&gt;BGP danse avec FRR&lt;/h3&gt;
&lt;p&gt;J'utilise FRR pour faire du BGP EVPN, notamment, car il va aller trifouiller la FDB du Linux et récupérer les VNI
pour créer les routes de type 3 ainsi que les veth présents sur la machine pour partager les macs (route de type 2).
Il va grosso modo faire une bonne partie du boulot.&lt;/p&gt;
&lt;p&gt;L'installation est très simple&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;apt install frr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite dans le fichier &lt;tt class="docutils literal"&gt;/etc/frr/daemons&lt;/tt&gt; je passe la ligne bgpd à yes : &lt;tt class="docutils literal"&gt;bgpd=yes&lt;/tt&gt;.
Une fois cela fait je configure frr au travers de son fichier &lt;tt class="docutils literal"&gt;/etc/frr/frr.conf&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;!
password COIN
!
no ip forwarding
no ipv6 forwarding
!
!
router bgp 65534
  bgp router-id 198.51.100.29
  no bgp default ipv4-unicast
!
  neighbor fabric peer-group
  neighbor fabric remote-as 65534
  neighbor fabric capability extended-nexthop
!
  address-family l2vpn evpn
    neighbor fabric activate
    advertise-all-vni
  exit-address-family
!
  neighbor 198.51.100.28 peer-group fabric
  neighbor 198.51.100.28 password COIN
  neighbor 198.51.100.28 description Kashekim
!
!
  neighbor 198.51.100.29 peer-group fabric
  neighbor 198.51.100.29 password COIN
  neighbor 198.51.100.29 description Kida
!
!
  neighbor 198.51.100.30 peer-group fabric
  neighbor 198.51.100.30 password COIN
  neighbor 198.51.100.30 description Audrey
!
!
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je crée d'abord un router BGP portant le numéro d'ASN 65534.
Bien entendu il est préférable de prendre des numéros d'ASN interne
(&lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Autonomous_System#Num%C3%A9ros_d'AS_sp%C3%A9ciaux"&gt;référencé sur Wikipedia&lt;/a&gt;). Je définis un identifiant unique (ici
c'est l'IP mais ça peut être autre chose).&lt;/p&gt;
&lt;p&gt;Je crée un groupe nommé &lt;tt class="docutils literal"&gt;fabric&lt;/tt&gt; et je lui permets de peer en IPv6
en plus de l'IPv4.&lt;/p&gt;
&lt;p&gt;Ensuite j'accepte les routes de type &lt;tt class="docutils literal"&gt;l2vpn evpn&lt;/tt&gt; et j'annonce les
routes de type 3 avec la commande &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;advertise-all-vni&lt;/span&gt;&lt;/tt&gt; (j'active
tout simplement l'EVPN).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;!
  address-family l2vpn evpn
    neighbor fabric activate
    advertise-all-vni
  exit-address-family
!
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis je définis mes peers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;systemctl restart frr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je redémarre FRR et cette partie est finie !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="interfacons-linux"&gt;
&lt;h3&gt;Interfaçons Linux&lt;/h3&gt;
&lt;p&gt;Après FRR, il faut s'attaquer aux VTEP. Incus permet de configurer pour nous
des interfaces vxlan, cependant uniquement en multicast ou unicast. Donc cela ne
me convient pas (vu que j'utilise BGP). Il va falloir les configurer &amp;quot;à la main&amp;quot;.
Personnellement j'utilise &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-networkd&lt;/span&gt;&lt;/tt&gt;, ce qui est pratique en plus, car je peux
générer la configuration dans Ansible avant de sortir un &lt;tt class="docutils literal"&gt;to_ini&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Cela me parait aussi être le moment idéal pour vous parler du MTU. L'encapsulation VXLAN
prend 50 bytes en IPv4 et 70 en IPv6. C'est-à-dire que sur les 1500 par défaut il va rester
entre 1450 (IPv4) et 1430 (IPv6) pour la trame ethernet encapsulé.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Petite explication, le MTU c'est la taille maximale qu'une trame ethernet va pouvoir faire.
Par défaut c'est 1500 bytes, mais dans des environnements maitrisés il peut être plus grand
(souvent 9000).&lt;/p&gt;
&lt;p&gt;Lorsqu'un paquet plus grand que ce qui est configuré sur l'interface arrive, il est tout
simplement ignoré. Si un paquet arrive par une interface avec un MTU de 9000 et doit sortir
avec sur un MTU de 1500, le routeur va découper le paquet en plus petit morceau. Cette opération
va avoir un coût en termes de ressources consommées.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Dans systemd-networkd nous allons créer 2 fichiers et modifier la définition réseau de l'interface
de la machine. Le premier sera la définition de l'interface virtuelle vxlan10 que j'ai créé :
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/network/20-vxlan10.netdev&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[NetDev]&lt;/span&gt;
&lt;span class="na"&gt;Name &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;vxlan10&lt;/span&gt;
&lt;span class="na"&gt;Kind &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;vxlan&lt;/span&gt;

&lt;span class="k"&gt;[VXLAN]&lt;/span&gt;
&lt;span class="na"&gt;VNI &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;Local &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;198.51.100.29&lt;/span&gt;
&lt;span class="na"&gt;MacLearning &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;DestinationPort &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4789&lt;/span&gt;
&lt;span class="na"&gt;KeepMaster &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici je crée une interface qui a pour nom &lt;tt class="docutils literal"&gt;vxlan10&lt;/tt&gt; que je la définis comme étant de type vxlan.
Ensuite j'indique l'adresse IP sur laquelle cette VTEP sera présente (en l'occurance l'IP de la
machine vu que je n'ai qu'une seule carte et pas de vrf), je définis le VNI qui est l'identifiant
unique sur 4 millions (10 ici), je désactive l'apprentissage des adresses mac source, car c'est FRR
qui s'en charge et je mets le port de destination à 4789 qui est le port officiel (bien que par
défaut il est à 8472 pour des raisons de legacy). L'option &lt;tt class="docutils literal"&gt;keepMaster&lt;/tt&gt; permet, en cas de redémarrage
de &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-networkd&lt;/span&gt;&lt;/tt&gt;, (par exemple avec une mise à jour) de conserver le lien avec l'interface
parente sinon le bridge d'Incus perd l'interface systemd et doit être reconfiguré.&lt;/p&gt;
&lt;p&gt;L'interface virtuelle est créée, maintenant il faut configurer son réseau dans le fichier
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/network/30-vxlan10.network&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;vxlan10&lt;/span&gt;

&lt;span class="k"&gt;[Link]&lt;/span&gt;
&lt;span class="na"&gt;MTUBytes &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1450&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;LinkLocalAddressing &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;IPv6AcceptRA &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;ConfigureWithoutCarrier &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;RequiredForOnline &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no-carrier&lt;/span&gt;

&lt;span class="k"&gt;[Bridge]&lt;/span&gt;
&lt;span class="na"&gt;NeighborSuppression &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, je configure l'interface vxlan10 en paramétrant le MTU à 1450 (sinon systemd va le définir tout
seul en fonction du MTU configuré sur la carte à laquelle cette VTEP sera raccroché). Je désactive
tout réseau dessus, car cette carte ne va faire que transiter du paquet. Donc pas de link-local, pas
de SLAAC et on ajoute un peu &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html#ConfigureWithoutCarrier="&gt;de tambouille systemd&lt;/a&gt; pour éviter que ça bloque le démarrage.&lt;/p&gt;
&lt;p&gt;Maintenant j'ajoute une petite ligne dans la définition de l'interface eno1 dans le fichier
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/network/10-eno1.network&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;eno1&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ether&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;DHCP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ipv4&lt;/span&gt;
&lt;span class="na"&gt;SLAAC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;ClientIdentifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;
&lt;span class="c1"&gt;# VXLAN&lt;/span&gt;
&lt;span class="na"&gt;VXLAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vxlan10&lt;/span&gt;

&lt;span class="k"&gt;[Link]&lt;/span&gt;
&lt;span class="na"&gt;MTUBytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1500&lt;/span&gt;

&lt;span class="k"&gt;[DHCP]&lt;/span&gt;
&lt;span class="na"&gt;UseDNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un redémarrage de systemd-networkd et la première VTEP apparait dans nos listes d'interfaces.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;systemctl restart systemd-networkd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous ne voulez pas utiliser systemd-networkd, la commande suivante va configurer cette interface.
Cependant, ce n'est pas &amp;quot;&lt;em&gt;reboot proof&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;ip link add vxlan10 type vxlan id 10 dstport 4789 dev eno1&lt;/span&gt;
&lt;span class="go"&gt;ip link set dev vxlan10 up&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="virtualisons"&gt;
&lt;h3&gt;Virtualisons !&lt;/h3&gt;
&lt;p&gt;La dernière étape, configurer Incus. En tant normal j'aurais apprécié brancher les machines
dessus mais Incus bloque. Je vais donc créer un bridge qui va inclure cette interface (comme
un switch en gros).&lt;/p&gt;
&lt;p&gt;Pour cela rien de plus simple, c'est bouclé en UNE commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;incus network create br10 \&lt;/span&gt;
&lt;span class="go"&gt;   bridge.driver=native \&lt;/span&gt;
&lt;span class="go"&gt;   bridge.external_interfaces=vxlan10 \&lt;/span&gt;
&lt;span class="go"&gt;   bridge.mtu=1450 \&lt;/span&gt;
&lt;span class="go"&gt;   ipv4.address=none \&lt;/span&gt;
&lt;span class="go"&gt;   ipv6.address=none&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ajoute l'interface créée juste avant (vxlan10) et je force le MTU à 1450, car par défaut Incus
va utiliser un MTU de 1500... Qui est donc plus grand que 1450 (et donc ça fait des chocapics). Comme
pour l'interface au-dessus, je n'attribue aucune adresse IP. De toute façon ces adresses vont être
configurées dans un dnsmasq qui n'est pas dans ce vxlan, donc ça va servir à rien.&lt;/p&gt;
&lt;p&gt;Maintenant je crée une machine normalement en indiquant le réseau fraichement créé&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;incus launch images:debian/13/cloud test --network br10 --storage lvmfs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La machine a démarré sur ce réseau isolé des autres. Vous allez très vite le constater, mais dans
un réseau comme celui-ci, il n'y a ni DHCP, ni DNS, ni gateway pour contacter l'extérieur, ni RIEN,
NADA. &lt;a class="reference external" href="https://dryusdan.space/mon-lab-episode-2-automatiser-ses-gateways"&gt;L'article précédent&lt;/a&gt; mentionne l'automatisation mise en place pour traiter ce cas, mais ce
n'est pas obligatoire (vous avez peut-être un usecase qui nécessite une machine isolée).&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/mon-lab-episode-2-automatiser-ses-gateways"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Mon lab - Épisode 2 : Automatiser ses gateways&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Il est temps de refaire une nouvelle infra, surtout pour le fun et la technique. Le socle est en place, mais comment je fais transiter les paquets ? Et surtout comment automatiser tout ça ?&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/d5ba6d6d9f6abc5ecb56da672db248fb.png" alt="Image of Mon lab - Épisode 2 : Automatiser ses gateways page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/d5ba6d6d9f6abc5ecb56da672db248fb.png" alt="Image of Mon lab - Épisode 2 : Automatiser ses gateways page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;hr class="docutils" /&gt;
&lt;p&gt;C'est le dernier épisode de cette saison 1, je m'attendais à ce qu'il soit beaucoup plus gros mais
finalement pas tant que ça malgré des explications au début (j'adore les articles qui expliquent).
Mine de rien je suis sur ce lab depuis mi-septembre sur mon temps libre (qui a été un peu bouffé les
trois premiers mois) et j'ai commencé à migrer quelques applications depuis 2 semaines. Certes j'ai
appris Kubernetes entre-temps et l'infrastructure conçu et développé pour être réinstallable sans effort
(sans compter les backups à récupérer). Ce genre de conception prend pas mal de temps. C'est, mine de
rien, un gros projet qui m'a permis d'apprendre pas mal de choses.&lt;/p&gt;
&lt;p&gt;Y a une saison 2 qui arrivera pas avant Mars (pour des raisons de coût) qui va montrer l'intérêt de VXLAN
notamment en l'étendant dans des datacenters et donc étendre mon lab sans que les machines ne voient de
différence (enfin techniquement). C'est en projet, mais avant : je vais migrer mon infra actuelle vers
cette belle infra (ça va me permettre de réinstaller mon serveur legacy par la même occasion 😁).&lt;/p&gt;
&lt;p&gt;Voici quelques ressources que j'ai utilisées pour apprendre&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://vincent.bernat.ch/fr/blog/2017-vxlan-linux"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;VXLAN &amp;amp; Linux&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;VXLAN est un protocole réseau pour transporter du trafic L2 au-dessus d'un réseau IP. Explorons comment l'utiliser sous Linux.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of VXLAN &amp;amp; Linux page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of VXLAN &amp;amp; Linux page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://vincent.bernat.ch/fr/blog/2017-vxlan-bgp-evpn"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;VXLAN: BGP EVPN avec FRR&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;VXLAN est un protocole réseau pour transporter du trafic L2 au-dessus d'un réseau IP. BGP EVPN est une des options de déploiement.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of VXLAN: BGP EVPN avec FRR page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of VXLAN: BGP EVPN avec FRR page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.netdev.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;systemd.netdev&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of systemd.netdev page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of systemd.netdev page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;systemd.network&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of systemd.network page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of systemd.network page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://linuxcontainers.org/incus/docs/main/reference/network_bridge/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Bridge network&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;As one of the possible network configuration types under Incus, Incus supports creating and managing network bridges. A network bridge creates a virtual L2 Ethernet switch that instance NICs can co...&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/061cf3d49e2e5745bc58daa7a0a916a9.png" alt="Image of Bridge network page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/061cf3d49e2e5745bc58daa7a0a916a9.png" alt="Image of Bridge network page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;(Oui, mine de rien les documentations des projets sont pas mal pour apprendre ^^)&lt;/p&gt;
&lt;p&gt;Et mes développements d'automatisation (que je n'ai malheureusement pas documentées, peut-être un jour)&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://git.dryusdan.fr/Ansible/incus"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;incus&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;incus&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/37670d8e1305126f6b233dcc64e9f0f0.png" alt="Image of incus page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/37670d8e1305126f6b233dcc64e9f0f0.png" alt="Image of incus page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://git.dryusdan.fr/Dryusdan/tofu-cluster"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;tofu-cluster&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;tofu-cluster&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/6741fc61c00ea0647c8b3dfb300bcacb.png" alt="Image of tofu-cluster page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/6741fc61c00ea0647c8b3dfb300bcacb.png" alt="Image of tofu-cluster page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;(Oui, y a un mot de passe en clair qui traine... Dès qu'il a fuité il a été changé).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur ce, portez-vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;maxvdo"&gt;Max van den Oetelaar&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 17 Jan 2026 15:10:00 +0100</pubDate><guid>tag:dryusdan.space,2026-01-17:/mon-lab-episode-3-isoler-les-reseaux</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category><category>LabAAS</category><category>featured</category></item><item><title>Rétrospective de décembre 2025 et de l'année</title><link>https://dryusdan.space/notes/2025/12/retrospective-decembre-et-2025</link><description>&lt;p&gt;Hello !
Bonne année (oui, il est encore temps !).&lt;/p&gt;
&lt;p&gt;C'est parti pour les chiffres de Décembre et de l'année complète si je les ais.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;2 181 minutes en décembre pour un total de 24 880 minutes en 2025.&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;240 en décembre pour un total de 2 119 commits.&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;0 en décembre pour un total de 14 cette année&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;2 en décembre pour un total de 56 en 2025&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;170 mots en décembre pour un total de 33 614 mots cette année&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;1 minute de lecture soit environs 184 minutes (3h) en 2025 !&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;14 Go en décembre pour atteindre les 154Go de traffic cette année&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagés sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5 liens partagé pour un total de 103 en 2025&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="moi"&gt;
&lt;h2&gt;Moi&lt;/h2&gt;
&lt;p&gt;Franchement, je ne sais pas quoi penser de cette année, mais la fin d'année
m'a permis d'être enfin stable (c'est cool quand on arrive à 30 ans je pense).
Je pense que j'ai enfin découvert le &amp;quot;laché prise&amp;quot; et ça fait un bien fou, mais
c'est si compliqué à avoir.&lt;/p&gt;
&lt;p&gt;Côté technique, mine de rien j'ai appris à utiliser Terraform. Honnêtement je
trouve que les recruteurs sont extrêmement sévère pour mettre Terraform
comme mandatory pour avoir un poste (c'est après 3 refus que j'ai appris à
l'utiliser). C'est un bon wrapper d'API, certes, mais c'est pas non plus très
complexe. J'ai également appris à administrer Kubernetes. J'indique administrer
car je vois une différence entre juste pousser un pod et déployer + manager ce bazar.
Petite fierté, je déploie un cluster k3s (avec cilium, kgateway, vault secret operator...)
en 88 secondes. 3 minutes avec le déploiement et le bootstrap des machines !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="lab"&gt;
&lt;h2&gt;Lab&lt;/h2&gt;
&lt;p&gt;J'aurais énormément apprécié sortir mon prochain article fin 2025, mais en plus d'être
important à écrire, j'ai passé trop de temps à apprendre Kubernetes :/&lt;/p&gt;
&lt;p&gt;J'ai refait aussi l'intégralité du réseau à la maison en m'offrant un Turris Omnia NG
(j'ouvre un datacenter sous la TV bientôt 😂).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="plantes"&gt;
&lt;h2&gt;Plantes&lt;/h2&gt;
&lt;p&gt;Rien de bien fou, j'ai 45 plantes en vie et une en soin intensif, j'espère qu'elle va
repartir en au printemps, mais je ne crois pas trop... Les 40°C lui ont été fatal :(&lt;/p&gt;
&lt;p&gt;Faut aussi que je plante mes nouvelles boutures de Pothos (qu'est-ce quelle pousse celle-ci oO).&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 13 Jan 2026 22:30:00 +0100</pubDate><guid>tag:dryusdan.space,2026-01-13:/notes/2025/12/retrospective-decembre-et-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Rigoler à en avoir mal au crâne</title><link>https://dryusdan.space/notes/2026/01/rigoler-a-en-avoir-mal-au-crane</link><description>&lt;p&gt;Hey o/&lt;/p&gt;
&lt;p&gt;Je sais, j’ai des articles à écrire mais ce soir c’était comédie avec comme première partie Hadir Smine (Hadir en rodage) de Lou Trotignon&lt;/p&gt;
&lt;p&gt;Hamir qui sera au micro comedy club à Nantes (quai de la fosse) dès le 23 janvier, vraiment allez voir cette meuf c’est des barres de rire&lt;/p&gt;
&lt;p&gt;Et parce que c’est NANTES ICI la salle à la cité des congrès a été  remplie très vite donc y a une nouvelle date pour le 9 novembre 2026. Et franchement TOUT PAREIL allez voir ce mec, c’est issu d’énorme barre de rire (j’en ai même mal au crâne 😂)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 09 Jan 2026 22:14:00 +0100</pubDate><guid>tag:dryusdan.space,2026-01-09:/notes/2026/01/rigoler-a-en-avoir-mal-au-crane</guid><category>notes</category></item><item><title>Créer un utilisateur PGbarman avec Ansible</title><link>https://dryusdan.space/notes/2025/12/creer-un-utilisateur-pgbarman-avec-ansible</link><description>&lt;p&gt;Par pur mémo (et surtout parce que j'ai galéré toute la soirée hier è_é)
la définition Ansible pour créer un utilisateur standard avec les bons
droits pour PGbarman&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;postgresql_privs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;postgres&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;barman&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;group&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;objs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pg_read_all_settings,pg_read_all_stats&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;present&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;admin_option&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;postgres&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;barman&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;privs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;EXECUTE&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;objs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pg_backup_start(text:boolean),pg_backup_stop(boolean),pg_switch_wal(),pg_create_restore_point(text)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pg_catalog&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;present&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 09 Dec 2025 08:53:00 +0100</pubDate><guid>tag:dryusdan.space,2025-12-09:/notes/2025/12/creer-un-utilisateur-pgbarman-avec-ansible</guid><category>notes</category><category>PostgreSQL</category><category>Lab</category></item><item><title>Rétrospective d'octobre et novembre 2025</title><link>https://dryusdan.space/notes/2025/11/retrospective-octobre-novembre-2025</link><description>&lt;p&gt;Hey o/
Bon, je suis un poil très occupué ces derniers temps, entre mon
nouveau boulot (où je me remet à jour à côté) et mon lab, je n'ai
pas eu le temps de faire les retrospectives d'octobre et de novembre.
Comme d'habitude : les chiffres qui devront bien augmenter pour ce
mois de novembre.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;2 577 minutes en octobre et 2614 minutes en novembre&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;57 en octobre et 320 en novembre&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;0 en octobre et 4 en novembre&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;0 en octobre et 7 en novembre&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots (en novembre)&lt;/td&gt;
&lt;td&gt;13 006&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;71 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;10,87 Go en octobre pour 146 672 accès, 11.87 Go en novembre pour 172 722&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagés sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1 en octobre, 8 en novembre&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les minutes de lectures n'excluent pas les configurations, c'est un &lt;tt class="docutils literal"&gt;wc &lt;span class="pre"&gt;-w&lt;/span&gt;&lt;/tt&gt;.
Et pour le nombre de commit j'ai viré 10 ans d'apprentissage Ansible, ça aide
(j'ai maintenant plus de 55 rôles sur mon repo).&lt;/p&gt;
&lt;div class="section" id="moi"&gt;
&lt;h2&gt;Moi&lt;/h2&gt;
&lt;p&gt;Pas grand chose d'autre à ajouté, Halloween est passé (j'adore cette période),
maintenant arrive noël (ça j'aime pas).&lt;/p&gt;
&lt;p&gt;Mon lab commence à récupérer quelques applications, ça va plus vite que prévu
et bien entendu il fonctionne bien. Je me remet à l'écriture du projet épisode
après une pause technique histoire de bien tester la solidité :D).&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 06 Dec 2025 11:15:00 +0100</pubDate><guid>tag:dryusdan.space,2025-12-06:/notes/2025/11/retrospective-octobre-novembre-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Encore un tattoo</title><link>https://dryusdan.space/notes/2025/12/encore-un-tattoo</link><description>&lt;p&gt;Je ne les vous présentes plus... Enfin si je vous les présentes encore :D&lt;/p&gt;
&lt;p&gt;Je vous laisse deviner la référence (et puis éventuellement le
reflet dans ma vie si jamais :D)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une cage doré d'où s'échappe un rouge gorge" class="image-process-article-image" src="/content/images/2025/12/tattoo.png" /&gt;&lt;/p&gt;
&lt;p&gt;je vous recommande très fortement &lt;a class="reference external" href="https://salehistoire.fr/tatoueurs-nantes/la-barbe"&gt;La Barbe Tatoo&lt;/a&gt;
(son &lt;a class="reference external" href="https://www.instagram.com/labarbetattoo/"&gt;Instagram&lt;/a&gt;. Je sais que
ça fonctionne beaucoup grâce à ça) !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 05 Dec 2025 18:54:00 +0100</pubDate><guid>tag:dryusdan.space,2025-12-05:/notes/2025/12/encore-un-tattoo</guid><category>notes</category></item><item><title>Au tour de uceprotect de péter un plomb</title><link>https://dryusdan.space/notes/2025/11/au-tour-de-uceprotect-de-peter-un-plomb</link><description>&lt;p&gt;Qu'est ce que je déteste les spammer listing, surtout quand
ils ont des règles à la con.&lt;/p&gt;
&lt;p&gt;Je peux comprendre le blocage d'une IP, mais là mon IP principal
parce que quelqu'un dans le même range d'IP a fait de la merde...
Le range est un /14 ! Soit 262 142 ips.&lt;/p&gt;
&lt;blockquote&gt;
On a bloqué 262 142 personnes car quelques personnes ont été
victimes d'un spambot (via une application ou un pc vérolé)&lt;/blockquote&gt;
&lt;p&gt;Groumph... Ça tend à rejoindre le niveau de &lt;a class="reference external" href="https://dryusdan.space/arretez-dutiliser-spamhaus"&gt;Spamhaus&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Nov 2025 14:52:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-24:/notes/2025/11/au-tour-de-uceprotect-de-peter-un-plomb</guid><category>notes</category></item><item><title>Générer ses certificats Let's Encrypt sans effort en s'appuyant sur Knot DNS</title><link>https://dryusdan.space/generer-ses-certificats-let-s-encrypt-sans-effort-en-s-appuyant-sur-knot-dns</link><description>&lt;p&gt;D'aussi loin que je me souvienne, j'ai hébergé un serveur DNS faisant autorité.
Je pense à peine après avoir loué mon premier VPS et ça a toujours été NSD.
Pourquoi ? Je ne me souviens plus vraiment, Bind n'avait pas très bonne
presse à ce moment-là et sa configuration n'est pas des plus sexy. Il ne
m'en a pas fallu plus pour choisir NSD... J'ai probablement utilisé ce
logiciel aussi, car j'apprenais à utiliser Docker et &lt;a class="reference external" href="https://github.com/xataz"&gt;Xataz&lt;/a&gt; (présent sur
un forum commun) en avait fait une image à l'époque.&lt;/p&gt;
&lt;p&gt;Bien que ce logiciel, qui m'a accompagné tant d'années (j'ai même créé un
&lt;a class="reference external" href="https://git.dryusdan.fr/Ansible/nsd"&gt;rôle Ansible&lt;/a&gt;), ne m'a jamais fait défaut, j'avais deux choses à lui
reprocher. Il ne régénérait pas de RRSIG tout seul ce qui fait qu'au bout de
2 semaines, si je n'avais pas modifié mes zones, toute mon infra s'effondrait,
car ces signatures n'étaient plus valides (un cron pour relancer le playbook
toutes les semaines solutionne le problème). Et un autre point qui m'a
bloqué&amp;nbsp;:&amp;nbsp;il ne gère pas la RFC 2136 qui permet de mettre à jour une zone DNS
sans avoir à modifier le fichier zone (faire un SED en SSH ça fonctionne,
mais une erreur peut avoir de mauvaise conséquence).&lt;/p&gt;
&lt;p&gt;Avec mon futur lab (si vous n'avez pas vu passer les articles je vous les redonnes
par pure bontée d'âme 😇 : &lt;a class="reference external" href="/mon-lab-episode-1-automatiser-le-socle"&gt;Mon lab - Automatiser le socle&lt;/a&gt; et
&lt;a class="reference external" href="/mon-lab-episode-2-automatiser-ses-gateways"&gt;Mon lab - Automatiser ses gateways&lt;/a&gt; ) j'ai pour volonté de rapprocher au
maximum les certificats x509 des applications pour notamment éviter un énorme
SPOF, utiliser davantage les IPv6 (au détriment de ceux qui sont en IPv4)
mais également pour les applications type &lt;a class="reference external" href="/installer-son-serveur-xmpp-100-conforme-aux-xep"&gt;Ejabberd&lt;/a&gt; (XMPP) éviter d'avoir une
tâche cron qui déplace les certificats du HAProxy à la VM hébergeant ce logiciel
mais d'avoir deux certificats distincts.&lt;/p&gt;
&lt;p&gt;Aujourd'hui niveau fonctionnement c'est très basique, je génère un certificat en
standalone car HAProxy ne sait pas délivrer de fichier, je détecte quand l'URL
possède le chemin de Let's encrypt et je l'expédie vers le serveur certbot
qui tourne.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend http-in
  bind &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;
  bind &lt;span class="p"&gt;:::&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;
  mode http
  acl acl_letsencrypt path_beg &lt;span class="s"&gt;/.well-known/acme-challenge/&lt;/span&gt;
  use_backend backend_letsencrypt if acl_letsencrypt

backend backend_letsencrypt
  mode http
  server srv_letsencrypt 127&lt;span class="s"&gt;.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;63443&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette configuration amène quelques limites. Les certificats ne seront générés
que sur la machine du reverse proxy et cela ne fonctionne pas pour les
certificats Wildcard, car il faut carrément utiliser le challenge DNS et ainsi
aller modifier sa zone DNS directement, ce qui est difficilement automatisable.&lt;/p&gt;
&lt;p&gt;C'est là que la &lt;a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc2136"&gt;RFC 2136&lt;/a&gt; plus communément appelé DDNS ou Dynamic DNS (pour
Dynamic Updates in the Domain Name System) vient à notre secours. Cette norme, qui
date de 1997, propose un mécanisme pour modifier une zone DNS en réalisant une
requête de type UPDATE qui indique quel enregistrement veut-il ajouter ou
modifier. Le serveur DNS de son côté met à jour sa base de donnée, modifie le SERIAL
du domaine et notifie les serveurs secondaires qui viendront récupérer les changements.
Ça a été beaucoup utilisé pour notifier un serveur DNS du changement de notre IP,
vu que les FAI commençaient à les changer de plus en plus régulièrement.&lt;/p&gt;
&lt;p&gt;J'ai donc remplacé mon serveur NSD par un &lt;a class="reference external" href="https://www.knot-dns.cz/"&gt;Knot&lt;/a&gt;, fait un rollover des DS records, grogné
contre le manager débilement compliqué (et buggué) d'OVH où il me reste UN domaine que
j'administre, puis vérifié avec &lt;a class="reference external" href="https://zonemaster.fr/fr/run-test"&gt;ZoneMaster&lt;/a&gt; que tous mes domaines sont bons et vérifier
si mon monitoring se met à hurler ou non. Bien entendu j'ai créé le &lt;a class="reference external" href="https://git.dryusdan.fr/Ansible/knot"&gt;rôle Knot pour Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.knot-dns.cz/"&gt;Knot&lt;/a&gt; embarque d'autres avantages que gérer les requêtes UPDATE. Il sait notamment gérer
la signature DNSSEC ainsi que les rollovers automatique, la signature RRSIG avec leurs
rotations régulières. On peut même y rajouter des modules comme geoip pour modifier ses
réponses DNS en fonction de la localisation de la requête.&lt;/p&gt;
&lt;p&gt;Bon, trêve de blabla, passons à la technique !&lt;/p&gt;
&lt;div class="section" id="installer-et-configurer-knot"&gt;
&lt;h2&gt;Installer et configurer Knot&lt;/h2&gt;
&lt;p&gt;Déjà il faut installer Knot, j'en profite pour ajouter deux trois paquets qui ajoute des
helpers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@mul:~$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;knot&lt;span class="w"&gt; &lt;/span&gt;knot-dnssecutils&lt;span class="w"&gt; &lt;/span&gt;knot-doc
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On retrouve une configuration basique dans le fichier &lt;tt class="docutils literal"&gt;/etc/knot/knot.conf&lt;/tt&gt;.
Basique, car les valeurs par défaut sont déjà bien suffisantes. D'ailleurs il s'agit de
YAML simplifié, ce qui fait que le templating avec un poil plus complexe que lâcher un
&lt;tt class="docutils literal"&gt;yaml.dump()&lt;/tt&gt;. Ici je vais surtout rajouter les clés TSIG (pour avoir des serveurs DNS
secondaires), créer une ACL pour autoriser les transferts et notify puis je définis mes
peers avant de claquer mes domaines. J'aurais d'ailleurs pu définir mes zones directement
dans la DB de Knot (à grand coup de commande), mais j'aime bien le format fichier. Sachant
que les zones sont au même format que NSD (donc cette partie n'a pas été réécrite dans mon
playbook) qui est le même que le format Bind9.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# On écoute sur toutes les interfaces IPv4&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;0.0.0.0@53&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# On écoute sur toutes les interfaces IPv6&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;::@53&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# L&amp;#39;utilisateur utilisé par knot pour faire tourner le serveur&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# (on évite root évidement)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;knot:knot&lt;/span&gt;
&lt;span class="nt"&gt;log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;syslog&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;info&lt;/span&gt;
&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/var/lib/knot&lt;/span&gt;

&lt;span class="c1"&gt;# Vous pouvez générer les clés avec la commande keymgr --tsig secondary&lt;/span&gt;
&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;secondary&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;FhrN0CHlZFXr1LQSgwO29JDkn3OO+DTFcdA8S6mvFbY=&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;hmac-sha256&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lecygnenoir&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;hmac-sha256&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;McjZZASgChl0U59UlQyhQXDYtSguY/E1jD3emJWEUpo=&lt;/span&gt;

&lt;span class="c1"&gt;# On défini les remotes et on les associes à une clé&lt;/span&gt;
&lt;span class="nt"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;secondary&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;10.8.0.2&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;secondary&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lecygnenoir&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;10.10.10.10&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lecygnenoir&lt;/span&gt;

&lt;span class="c1"&gt;# Je n&amp;#39;autorise que le serveur DNS secondaire&lt;/span&gt;
&lt;span class="c1"&gt;# à être notifié et à faire des requêtes IXFR/AXFR avec la clé nommé secondary&lt;/span&gt;
&lt;span class="c1"&gt;# Si la directive automatic-acl est à on, techniquement cette section là n&amp;#39;est&lt;/span&gt;
&lt;span class="c1"&gt;# pas utile&lt;/span&gt;
&lt;span class="nt"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dryusdan_secondary_dns&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;secondary&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;10.8.0.2&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;transfer&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lecygnenoir_secondary_dns&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;lecygnenoir&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;10.10.10.10&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;transfer&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;

&lt;span class="nt"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dnssec&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;signing-threads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Ou ECDSAP256SHA256 pour les tld type .net par exemple&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ECDSAP384SHA384&lt;/span&gt;

&lt;span class="c1"&gt;# Le but de ces templates va être d&amp;#39;éviter de dupliquer toutes ces lignes,&lt;/span&gt;
&lt;span class="c1"&gt;# mais il est possible de les surcharger&lt;/span&gt;
&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Le template par défaut récupère uniquement les fichiers .zone dans&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# /var/lib/knot&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/var/lib/knot&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;s.zone&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dnssec&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Je ne défini qu&amp;#39;une ACL, car certains de mes domaines&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# n&amp;#39;utilisent pas le DNS secondaire de lecygnenoir&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;dryusdan_secondary_dns&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Ce domaine sera signé avec DNSSEC&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;dnssec-signing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On attribue la policy DNSSEC défini plus haut&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;dnssec-policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dnssec&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Pareil que dans le template default&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/var/lib/knot&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;s.zone&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On demande à notifier dryusdan_secondary uniquement en cas de différence du SOA.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;zonefile-load&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;difference&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;secondary&lt;/span&gt;

&lt;span class="nt"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dryusdan.space&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dnssec&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;drysudan_secondary_dns&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lecygnenoir&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;secondary&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lecygnenoir&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et hop, le serveur Knot est fonctionnel. Pour la partie DNSSEC, je vous laisse lire &lt;a class="reference external" href="https://www.swordarmor.fr/gestion-automatique-de-dnssec-avec-knot.html"&gt;l'article d'Alarig&lt;/a&gt; à
ce sujet, c'est bien expliqué et ce n'est pas le but de mon article 😛.&lt;/p&gt;
&lt;div class="section" id="et-certbot-dans-tout-ca"&gt;
&lt;h3&gt;Et certbot dans tout ça ?&lt;/h3&gt;
&lt;p&gt;Je ne l'ai pas oublié ! J'utilise le plugin &lt;a class="reference external" href="https://certbot-dns-rfc2136.readthedocs.io/en/stable/"&gt;certbot-dns-rfc2136&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@mul:~$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;python3-certbot-dns-rfc2136
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je crée une nouvelle clé TSIG pour certbot.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@mul:~$ &lt;/span&gt;/usr/sbin/keymgr&lt;span class="w"&gt; &lt;/span&gt;--tsig&lt;span class="w"&gt; &lt;/span&gt;certbot
&lt;span class="go"&gt;key:&lt;/span&gt;
&lt;span class="go"&gt;  - id: certbot&lt;/span&gt;
&lt;span class="go"&gt;    algorithm: hmac-sha256&lt;/span&gt;
&lt;span class="go"&gt;    secret: okYvWtZFj8XcGX7XBF2fuzV6H2RYXLuGk1d/I3SFwgo=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis je la mets dans &lt;tt class="docutils literal"&gt;knot.conf&lt;/tt&gt;. Tant qu'à être dans ce fichier, j'en
profite également pour rajouter une nouvelle ACL&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;certbot_update&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;certbot&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;10.55.8.6&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;update&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;update-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;TXT&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous l'aurez saisi, je crée une règle qui autorise la clé TSIG certbot
provenant soit de localhost soit d'une autre machine d'effectuer un
update UNIQUEMENT pour un champ TXT, ce qui, en cas de scénario
catastrophe, permet de limiter au maximum les dégâts possibles. Là,
seuls les enregistrements TXT demandé par certbot seront créés, le reste
sera refusé.&lt;/p&gt;
&lt;p&gt;J'oublie pas de reload Knot&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@mul:~$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;reload&lt;span class="w"&gt; &lt;/span&gt;knot
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Côté Certbot il faut créer un fichier ini contenant la clé TSIG pour faire
cette requête. Je vais le placer dans &lt;tt class="docutils literal"&gt;/etc/letsencrypt/rfc2136.ini&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# L&amp;#39;adresse IP du serveur Knot&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;53&lt;/span&gt;
&lt;span class="c1"&gt;# Le nom de la clé TSIG&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;certbot&lt;/span&gt;
&lt;span class="c1"&gt;# La clé TSIG&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;okYvWtZFj8XcGX7XBF2fuzV6H2RYXLuGk1d/I3SFwgo=&lt;/span&gt;
&lt;span class="c1"&gt;# Et son algorithme&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;HMAC-SHA256&lt;/span&gt;
&lt;span class="c1"&gt;# TSIG sign SOA query (optional, default: false)&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_sign_query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois ça fait, c'est terminé ^^&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;root@mul ~ # &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;certonly&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--dns-rfc2136&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--dns-rfc2136-credentials&lt;span class="w"&gt; &lt;/span&gt;/etc/letsencrypt/rfc2136.ini&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;*.dryusdan.space
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par défaut il y a un délai de 60 secondes (modifiable par
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--dns-rfc2136-propagation-seconds&lt;/span&gt;&lt;/tt&gt;) avant que les checks soient
effectués.&lt;/p&gt;
&lt;p&gt;Pour vos certificats déjà  existants, modifiez la section &lt;tt class="docutils literal"&gt;[renewalparams]&lt;/tt&gt;
du fichier &lt;tt class="docutils literal"&gt;/etc/letsencrypt/renewal/dryusdan.space.conf&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[renewalparams]&lt;/span&gt;
&lt;span class="na"&gt;reuse_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0123456789abcdef0123456789abcdef&lt;/span&gt;
&lt;span class="na"&gt;key_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ecdsa&lt;/span&gt;
&lt;span class="na"&gt;elliptic_curve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;secp384r1&lt;/span&gt;
&lt;span class="na"&gt;authenticator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;dns-rfc2136&lt;/span&gt;
&lt;span class="na"&gt;dns_rfc2136_credentials&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/rfc2136.ini&lt;/span&gt;
&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voilà.&lt;/p&gt;
&lt;p&gt;Maintenant plus besoin d'être présent pour générer des certificats
wildcard ni même déplacer vos certificats entre votre reverse proxy
et votre serveur XMPP 😊&lt;/p&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dkomow"&gt;Daniil Komov&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 23 Nov 2025 16:00:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-23:/generer-ses-certificats-let-s-encrypt-sans-effort-en-s-appuyant-sur-knot-dns</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category></item><item><title>Bloguidien revient prochainement</title><link>https://dryusdan.space/notes/2025/11/bloguidien-revient-prochainement</link><description>&lt;p&gt;Bloguidien c'est un petit projet lancé par &lt;a class="reference external" href="https://lord.re"&gt;Lord&lt;/a&gt; et moi
il y a un an. Vous avez été très nombreuxes à y participer,
à rédiger des &amp;quot;prompts&amp;quot;. Merci à vous.&lt;/p&gt;
&lt;p&gt;Mais vous avez vu, presque 6 mois ensuite, plus de stock et
il était relativement difficile d'en trouver de nouveau.&lt;/p&gt;
&lt;p&gt;Mais le projet était cool et revient ! Légèrement modifié
car il passe à un format hebdomadaire ! Au lieu d'un prompt
par jour nous en auront un par semaine (mais ça s'appellera
encore bloguidien).&lt;/p&gt;
&lt;p&gt;Votre contribution est aussi la bienvenue. Vous avez une idée de
prompt ? Ou plusieurs ? Un sujet que vous souhaiteriez que plein de
mondes creusent ? Ajoutez la sur &lt;a class="reference external" href="https://semestriel.framapad.org/p/prompt-pour-blogger-aah5"&gt;le Framapad&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 21 Nov 2025 11:17:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-21:/notes/2025/11/bloguidien-revient-prochainement</guid><category>notes</category></item><item><title>Mon lab - Épisode 2 : Automatiser ses gateways</title><link>https://dryusdan.space/mon-lab-episode-2-automatiser-ses-gateways</link><description>&lt;p&gt;Je ne sais pas si vous vous souvenez, mais dans &lt;a class="reference external" href="/mon-lab-episode-1-automatiser-le-socle"&gt;l'article précédent&lt;/a&gt;
j'ai présenté la prochaine infrastructure et plus particulièrement
la gestion des VMs et des réseaux.&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/inside-hypervisor.svg" type="image/svg+xml"&gt;Un schéma représentant 2 hyperviseurs dont leurs machines partages un même réseau tout en étant isolé des autres.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Les machines (VMs et containers) seront sur leurs réseaux et n'ont
aucun moyen de joindre l'extérieur ni même l'hyperviseur hôte. Il
va falloir créer une passerelle. Autre point, si ces serveurs n'ont
pas accès à l'hôte, ils n'ont pas accès à un serveur DHCP ou DNS.
Autant le DNS ce n'est pas bien problématique, autant le DHCP cela
signifie qu'il faut assigner des IPs à nos machines manuellement...
Et je n'ai pas du tout envie de gérer des IPs (alors que j'ai
netbox, mais ce n'est pas le sujet). Il y a une dernière fonctionnalité
que j'aimerais mettre en place : joindre certains réseaux entre eux.
Pour celleux qui travaillent sur des infrastructures cloud, vous voyez très
bien où je vais : les VPC.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/incus-vpc.svg" type="image/svg+xml"&gt;Un schéma représentant 2 hyperviseurs dont leurs machines partages un même réseau tout en étant isolé des autres.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Pour celleux qui n'ont jamais joué avec des VPC, l'idée est que les machines
présentes dans &lt;tt class="docutils literal"&gt;VPC 1&lt;/tt&gt; peuvent communiquer entre elles sans être dans les
mêmes réseaux privés mais celles de &lt;tt class="docutils literal"&gt;VPC 2&lt;/tt&gt; ne peuvent pas contacter les
machines de &lt;tt class="docutils literal"&gt;VPC 1&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;VPC 3&lt;/tt&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Mais qui dit cloud dit création de ses propres images pour les déployer par
la suite sans avoir besoin de lancer un playbook Ansible pour faire toute la
configuration. Dans mon cas, je cherche à déployer rapidement les passerelles
afin de permettre aux instances présentes dans un réseau privé d'avoir accès
à internet et d'être accessible par la même occasion.&lt;/p&gt;
&lt;p&gt;Il faut bien entendu stocker ces images. Sur Incus il y a deux moyens. Stocker
ses images sur une des instances. Pratique, pas de dépendance tierce, mais peu
résilient en cas de panne de l'instance. L'autre méthode est de créer un
serveur &lt;tt class="docutils literal"&gt;&amp;quot;simplestreams&amp;quot;&lt;/tt&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="#creer-une-image-pour-un-host-avec-packer-1"&gt;Créer une image pour un host avec Packer&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="#la-creation-de-l-image-1"&gt;La création de l'image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#l-auto-configuration-du-dhcp-1"&gt;L'auto-configuration du DHCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#le-serveur-simplestreams-1"&gt;Le serveur simplestreams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#ameliorer-la-partie-packer-1"&gt;Améliorer la partie Packer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#sans-utiliser-packer-1"&gt;Sans utiliser Packer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="creer-une-image-pour-un-host-avec-packer-1"&gt;
&lt;h2&gt;Créer une image pour un host avec Packer&lt;/h2&gt;
&lt;p&gt;Pour celleux qui ne connaissent pas &lt;a class="reference external" href="https://developer.hashicorp.com/packer"&gt;Packer&lt;/a&gt;, il s'agit d'un outil développé par
Hashicorp pour créer des images identiques pour différents clouds providers.
J'ai fait le choix d'utiliser Packer, car ce dernier récupère une image déjà
existante comme base, la configure comme je veux et l'export en image le tout
en 26 secondes. Il est possible de le faire sans Packer, je vous la décris plus
bas, mais je n'ai pas retenu cette méthode.&lt;/p&gt;
&lt;div class="section" id="la-creation-de-l-image-1"&gt;
&lt;h3&gt;La création de l'image&lt;/h3&gt;
&lt;p&gt;Il existe un &lt;a class="reference external" href="https://developer.hashicorp.com/packer/integrations/bketelsen/incus"&gt;plugin Incus&lt;/a&gt; pour Packer. Ce plugin permet de récupérer une image
source et de configurer l'image formée par l'outil. C'est accompagné d'un builder
qui se base sur une source et qui lance tout un tas de &amp;quot;&lt;em&gt;provisionner&lt;/em&gt;&amp;quot; c'est-à-dire
des actions pour altérer l'image et la modeler comme nous le souhaitons.
Étant plutôt bien à l'aise avec Ansible j'ai tenté d'utiliser le &lt;a class="reference external" href="https://developer.hashicorp.com/packer/integrations/hashicorp/Ansible"&gt;provisionner Ansible&lt;/a&gt;
sans grand succès, car je n'ai à aucun moment réussi à me connecter en SSH. Je suis donc
parti⋅e sur notre bon vieux script bash accompagné tout de même d'un &lt;a class="reference external" href="https://developer.hashicorp.com/packer/docs/provisioners/file"&gt;provisionner
file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous avez lu le &lt;a class="reference external" href="/mon-lab-episode-1-automatiser-le-socle"&gt;premier article&lt;/a&gt;, comme à chaque fois tout se trouve sur &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image-packer"&gt;mon repository&lt;/a&gt;.
Vous allez également constater la même arborescence de fichier :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@Nemo:~/gateway-image-packer$ &lt;/span&gt;tree
&lt;span class="go"&gt;.&lt;/span&gt;
&lt;span class="go"&gt;├── dhcp_maker&lt;/span&gt;
&lt;span class="go"&gt;│   ├── dhcp-maker.py&lt;/span&gt;
&lt;span class="go"&gt;│   ├── poetry.lock&lt;/span&gt;
&lt;span class="go"&gt;│   └── pyproject.toml&lt;/span&gt;
&lt;span class="go"&gt;├── packer&lt;/span&gt;
&lt;span class="go"&gt;│   ├── build.pkr.hcl&lt;/span&gt;
&lt;span class="go"&gt;│   ├── plugins.pkr.hcl&lt;/span&gt;
&lt;span class="go"&gt;│   ├── source.pkr.hcl&lt;/span&gt;
&lt;span class="go"&gt;│   └── variables.pkr.hcl&lt;/span&gt;
&lt;span class="go"&gt;├── provisioning.sh&lt;/span&gt;
&lt;span class="go"&gt;└── rootfs&lt;/span&gt;
&lt;span class="go"&gt;    └── etc&lt;/span&gt;
&lt;span class="go"&gt;        ├── default&lt;/span&gt;
&lt;span class="go"&gt;        │   └── unbound&lt;/span&gt;
&lt;span class="go"&gt;        ├── locale.gen&lt;/span&gt;
&lt;span class="go"&gt;        ├── nftables.conf&lt;/span&gt;
&lt;span class="go"&gt;        ├── ssh&lt;/span&gt;
&lt;span class="go"&gt;        │   └── sshd_config.d&lt;/span&gt;
&lt;span class="go"&gt;        │       └── pxe-boot.conf&lt;/span&gt;
&lt;span class="go"&gt;        ├── sysctl.d&lt;/span&gt;
&lt;span class="go"&gt;        │   └── 10-forwarding.conf&lt;/span&gt;
&lt;span class="go"&gt;        ├── systemd&lt;/span&gt;
&lt;span class="go"&gt;        │   └── system&lt;/span&gt;
&lt;span class="go"&gt;        │       ├── dhcpmaker.service&lt;/span&gt;
&lt;span class="go"&gt;        │       └── nftables.service&lt;/span&gt;
&lt;span class="go"&gt;        └── unbound&lt;/span&gt;
&lt;span class="go"&gt;            └── unbound.conf.d&lt;/span&gt;
&lt;span class="go"&gt;                ├── forwardzone.conf&lt;/span&gt;
&lt;span class="go"&gt;                └── server.conf&lt;/span&gt;

&lt;span class="go"&gt;13 directories, 20 files&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Côté Packer j'ai donc créé un dossier pour tout ranger. Honnêtement,
je ne vais pas présenter &lt;tt class="docutils literal"&gt;plugins.pkr.hcl&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;variables.pkr.hcl&lt;/tt&gt;.
Par contre &lt;tt class="docutils literal"&gt;source.pkr.hcl&lt;/tt&gt; m'intéresse&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;incus&amp;quot; &amp;quot;debian&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.image&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;output_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.output_image&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;publish_properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.aliases&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.description&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.os&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.architecture&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;variant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.variant&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;reuse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;quot;&lt;tt class="docutils literal"&gt;image&lt;/tt&gt;&amp;quot; c'est l'image de base que je récupère, &lt;tt class="docutils literal"&gt;output_image&lt;/tt&gt; est
le nom de l'image exporté et &lt;tt class="docutils literal"&gt;reuse&lt;/tt&gt; est pour dire que si l'image, existe
tant pis, il faut écraser.
Maintenant la directive &lt;tt class="docutils literal"&gt;publish_properties&lt;/tt&gt;. Il s'agit en réalité des
metadata &lt;tt class="docutils literal"&gt;properties&lt;/tt&gt; que vous pouvez retrouver d'une simple commande&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@Nemp:~$ &lt;/span&gt;incus&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;metadata&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;meet-collie
&lt;span class="go"&gt;architecture: amd64&lt;/span&gt;
&lt;span class="go"&gt;creation_date: 1761465660&lt;/span&gt;
&lt;span class="go"&gt;expiry_date: 1764057660&lt;/span&gt;
&lt;span class="go"&gt;properties:&lt;/span&gt;
&lt;span class="go"&gt;  architecture: amd64&lt;/span&gt;
&lt;span class="go"&gt;  description: Debian trixie amd64 (cloud) (20251026_07:49)&lt;/span&gt;
&lt;span class="go"&gt;  name: debian-trixie-amd64-cloud-20251026_07:49&lt;/span&gt;
&lt;span class="go"&gt;  os: debian&lt;/span&gt;
&lt;span class="go"&gt;  release: trixie&lt;/span&gt;
&lt;span class="go"&gt;  serial: &amp;quot;20251026_07:49&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;  variant: cloud&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien sûr, j'ai collé le tout dans des variables pour pouvoir automatiser tout ça.
Il ne reste plus que le fichier &lt;tt class="docutils literal"&gt;build.pkr.hcl&lt;/tt&gt; pour comprendre tout le reste
de l'architecture de ce projet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;incus.debian&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./rootfs/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./dhcp_maker/dhcp-maker.py&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/local/bin/dhcp-maker&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./provisioning.sh&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici je copie l'intégralité de mon &lt;tt class="docutils literal"&gt;rootfs&lt;/tt&gt; à la racine du container pour
déployer facilement toutes mes configurations (tiens, ça ne vous rappelle pas
un &lt;tt class="docutils literal"&gt;rsync &lt;span class="pre"&gt;-azvP&lt;/span&gt; rootfs /&lt;/tt&gt; ? 😇). Je copie aussi mon programme &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dchp-maker&lt;/span&gt;&lt;/tt&gt;
que je présenterai plus tard. Je lance ensuite le script &lt;tt class="docutils literal"&gt;./provisioning.sh&lt;/tt&gt;.
Ce script va installer quelques dépendances pour &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dhcp-maker&lt;/span&gt;&lt;/tt&gt; mais également
&lt;tt class="docutils literal"&gt;nftables&lt;/tt&gt; pour réaliser un NAT.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive

apt-get&lt;span class="w"&gt; &lt;/span&gt;update
apt-get&lt;span class="w"&gt; &lt;/span&gt;-yq&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;Dpkg::Options::&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--force-confold&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;dnsmasq&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;less&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;nftables&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;python3-yaml&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;unbound&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;resolvconf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;À savoir que &lt;tt class="docutils literal"&gt;resolvconf&lt;/tt&gt; va désinstaller &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-networkd&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite ce script rend exécutable &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dhcp-maker&lt;/span&gt;&lt;/tt&gt;, active &lt;tt class="docutils literal"&gt;nftables&lt;/tt&gt;,
recharge systemd pour pouvoir activer le service &lt;tt class="docutils literal"&gt;dhcpmaker&lt;/tt&gt;, car ce
dernier vient de la copie du rootfs plus haut.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Add execution right for dhcp-maker&amp;quot;&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/dhcp-maker

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enable nftables&amp;quot;&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nftables

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enable dhcpmaker&amp;quot;&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;daemon-reload
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dhcpmaker
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite il va permettre à la machine de faire office de passerelle réseau
en activant l'IPv4 et IPv6 forwarding.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Add sysctl&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;net.ipv4.ip_forward=1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/sysctl.d/10-forwarding.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;net.ipv6.conf.all.forwarding=1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/sysctl.d/10-forwarding.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;quot;&lt;tt class="docutils literal"&gt;dnsmasq&lt;/tt&gt;&amp;quot; arrive avec tout un tas de valeurs par défaut déjà activées... Donc le
script retire ça pour utiliser les configurations de &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dhcp-maker&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disable and mask dnsmasq&amp;quot;&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;dnsmasq
systemctl&lt;span class="w"&gt; &lt;/span&gt;mask&lt;span class="w"&gt; &lt;/span&gt;dnsmasq

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Remove default dnsmasq config&amp;quot;&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/default/dnsmasq
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ai également retiré la configuration &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;trust-anchor&lt;/span&gt;&lt;/tt&gt; de Unbound qui vient avec
lui. Cette configuration ne fonctionne uniquement si &lt;tt class="docutils literal"&gt;resolveconf&lt;/tt&gt; est installé
et embarque le téléchargement des &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;anchors-keys&lt;/span&gt;&lt;/tt&gt; soit les clés et chemins vers
les roots DNS. Sauf qu'ici chaque gateway ne va pas contacter les roots DNS
directement, donc cela ne sert à rien.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Remove Unbound bad config&amp;quot;&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant, très important, il va falloir réinitialiser cloud-init pour pouvoir
utiliser la machine comme modèle et non comme copie d'une machine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;clean

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Remove machine-id files&amp;quot;&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/lib/dbus/machine-id&lt;span class="w"&gt; &lt;/span&gt;/etc/machine-id

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Reset cloud-init&amp;quot;&lt;/span&gt;
cloud-init&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;--logs
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="l-auto-configuration-du-dhcp-1"&gt;
&lt;h3&gt;L'auto-configuration du DHCP&lt;/h3&gt;
&lt;p&gt;J'utilise plusieurs services pour faire fonctionner correctement et de manière fluide cette passerelle.
Tout d'abord, &lt;tt class="docutils literal"&gt;dnsmasq&lt;/tt&gt;. Il gère la partie DHCP sur les interfaces dans le VPC, de serveur DNS autoritaire
pour chaque réseau afin de ne pas avoir à connaitre l'IP d'une machine mais également de forwarder DNS vers
Unbound. Vu qu'il peut y avoir plusieurs réseaux au sein d'un VPC, il peut y avoir plusieurs instances dnsmasq,
mais toutes les instances ne peuvent pas écouter sur l'interface publique de cette gateway, ni se partager
entre elles leurs baux DHCP. J'ai donc mis sur l'interface &amp;quot;public&amp;quot; un Unbound qui forward les requêtes DNS
vers un autre serveur DNS mais également qui cache les réponses pour tous les réseaux du VPC. Cet Unbound
permet également de forward vers dnsmasq les requêtes liées à un hostname.&lt;/p&gt;
&lt;p&gt;J'ai fait un schéma pour essayer d'être plus clair.&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/dns-query-in-vpc.svg" type="image/svg+xml"&gt;Un schéma représentant la logique des requêtes DNS au sein d'un VPC.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Pour faire simple. dnsmasq fait du DHCP et grâce à ça construit sa zone DNS, car il connait l'IP et le
hostname associé. Si une requête ne correspond à rien dans sa zone, il transmet la requête à Unbound
qui lui va avoir 2 instructions : s'il connait le domaine demandé (genre pn2.dryusdan.net) il transmet
la requête au dnsmasq associé, sinon il renvoie la requête au serveur DNS principal qui fait sa tambouille.&lt;/p&gt;
&lt;p&gt;Sachant que tout cela doit être automatique, j'ai développé un script qui configure tout à la création de la
machine. Ce script va&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Récupérer toutes les interfaces comportant un nom particulier et les trier&lt;/li&gt;
&lt;li&gt;Retourner une liste de sous-réseau en fonction d'un réseau défini (en gros je split &lt;tt class="docutils literal"&gt;10.0.0.0/8&lt;/tt&gt;
en &lt;tt class="docutils literal"&gt;/22&lt;/tt&gt;).&lt;/li&gt;
&lt;li&gt;Attribuer un sous-réseau à chaque interface détectée.&lt;/li&gt;
&lt;li&gt;Générer les configurations de &lt;tt class="docutils literal"&gt;dnsmasq&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;unbound&lt;/tt&gt; et de &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-networkd&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Écrire ces configurations&lt;/li&gt;
&lt;li&gt;S'occuper des services pour être reboot proof.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je ne vais pas passer sur l'intégralité du script qui se trouve sur &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image-packer/src/branch/main/dhcp_maker/dhcp-maker.py"&gt;mon repository git&lt;/a&gt;, parce qu'il sera
amené à évoluer (pour intégrer l'IPv6 par exemple) mais je vais tout de même m'arrêter sur trois fonctions.&lt;/p&gt;
&lt;p&gt;La fonction &lt;tt class="docutils literal"&gt;config_service&lt;/tt&gt; va spécifiquement générer la configuration de dnsmasq. Je crée une configuration
liée à l'interface &lt;em&gt;iif&lt;/em&gt; (qui sera écrite ensuite sous forme &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/default/dnsmasq.{iif}&lt;/span&gt;&lt;/tt&gt; pour être appelée par un
service dnsmasq déjà existant). Ici j'indique à dnsmasq d'ignorer le fichier resolv.conf localisé dans
&lt;tt class="docutils literal"&gt;/run/dnsmasq/resolv.conf&lt;/tt&gt; et de ne pas bind l'interface &lt;tt class="docutils literal"&gt;lo&lt;/tt&gt; (notamment utilisée par Unbound). Puis
je bind dnsmasq sur l'interface &lt;tt class="docutils literal"&gt;{iif}&lt;/tt&gt;, je lui indique son domaine qui est le nom de l'interface + le hostname
(en réalité ça me fait des noms à rallonge du genre &lt;tt class="docutils literal"&gt;pn50.gw1.cluster.dryusdan.net&lt;/tt&gt; mais le domaine est géré
par CoreDNS avec comme source Netbox). J'indique ensuite quel range dnsmasq doit utiliser pour son DHCP et la durée
du bail.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;config_service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iif_net&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;iif&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iif_net&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iif_net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;dnsmasq&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;IGNORE_RESOLVCONF&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;DNSMASQ_EXCEPT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;DNSMASQ_OPTS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;--interface=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; --except-interface=lo --bind-interfaces --domain &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; --dhcp-range &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;,12h --server ::1 --server 127.0.0.1&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;networkd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction permet de configurer Unbound pour lui indiquer que les requêtes pour le domaine
&lt;tt class="docutils literal"&gt;pn50.gw1.cluster.dryusdan.net&lt;/tt&gt; se trouve au niveau de l'IP que dnsmasq écoute.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_unbound_configs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/etc/unbound/unbound.conf.d/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;iif&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forwardzone-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.conf&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;unbound_conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;forward-zone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;forward-addr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;networkd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unbound_conf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default_flow_style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction va rechercher systemd-networkd, désactiver dhcpmaker pour éviter
une modification des configurations ci-dessus puis activer le service &amp;quot;variable&amp;quot;
packagé avec dnsmasq.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_with_systemd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;systemctl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;reload&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;systemd-networkd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;systemctl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;disable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dhcpmaker&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;iif&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;systemctl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;enable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--now&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dnsmasq@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iif&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="limitations"&gt;
&lt;h4&gt;Limitations&lt;/h4&gt;
&lt;p&gt;&amp;quot;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dhcp-maker&lt;/span&gt;&lt;/tt&gt;&amp;quot; a plusieurs limitations. Pas de conservation des IPs, en cas de
redémarrage il est possible que le serveur DHCP attribue d'autres IPs.
Il est également possible qu'en cas de réinstallation les attributions des
ranges d'IPs changent également. Si on rajoute une interface, le script ne se
relance pas, il faut même recréer la machine. Ce ne sont que des axes
d'amélioration mais ces limitations existent (Quoique relancer le dhcp-maker
devrait maintenant suffire).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="le-serveur-simplestreams-1"&gt;
&lt;h2&gt;Le serveur simplestreams&lt;/h2&gt;
&lt;p&gt;Bon c'est cool, j'ai build une image avec Packer je l'ai importé sur une des machines.
Mais si je réinstalle cette machine (comme il est prévu qu'elles soient réinstallables à
volonté), je suis obligé⋅e de reconstruire l'image et de la pousser à nouveau. Je pourrais
la déployer sur chaque machine, mais au final ça corrige le problème de SPOF, pas de
réinstallation. L'idéal serait de trouver un moyen d'héberger une image comme le fait
&lt;a class="reference external" href="https://images.linuxcontainers.org/"&gt;Linuxcontainers&lt;/a&gt;. &lt;em&gt;Canonical&lt;/em&gt; à l'époque de LXD a développé un protocole nommé
&lt;strong&gt;simplestreams&lt;/strong&gt; et cela a été repris dans Incus. Bon, protocole c'est TRÈS vite dit,
il s'agit plutôt d'une convention de nommage et d'organisation de fichiers accessible via HTTPS.
Ce protocole est utilisé si on veut que notre serveur héberge ses propres images mais n'est
que peu documenté... Cependant, assez récemment les gens derrière Incus &lt;a class="reference external" href="https://linuxcontainers.org/fr/incus/news/2024_03_26_18_03.html#outil-de-gestion-des-serveurs-dimages"&gt;ont développé un
outil&lt;/a&gt; pour permettre de gérer facilement les images et de créer les fichiers
nécessaires afin d'héberger ses images derrière n'importe quel serveur Web, S3, whatever.
La commande &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;incus-simplestreams&lt;/span&gt;&lt;/tt&gt; vient avec le paquet &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;incus-extra&lt;/span&gt;&lt;/tt&gt; pour Debian
ou &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;incus-tools&lt;/span&gt;&lt;/tt&gt; pour Archlinux.&lt;/p&gt;
&lt;p&gt;Pour créer une image publique, il faut une archive &lt;tt class="docutils literal"&gt;.tar.xz&lt;/tt&gt; contenant les metadata et
soit une image qcow2 si c'est une VM soit un squashfs si c'est un container.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@Nemo:~/images$ &lt;/span&gt;incus-simplestreams&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;incus.tar.xz&lt;span class="w"&gt; &lt;/span&gt;rootfs.squashfs
&lt;span class="gp"&gt;dryusdan@Nemo:~/images$ &lt;/span&gt;incus-simplestreams&lt;span class="w"&gt; &lt;/span&gt;list
&lt;span class="go"&gt;+------------------------------------------------------------------+------------------------------------+--------+---------+---------+--------------+-----------+----------------------+&lt;/span&gt;
&lt;span class="go"&gt;|                           FINGERPRINT                            |            DESCRIPTION             |   OS   | RELEASE | VARIANT | ARCHITECTURE |   TYPE    |       CREATED        |&lt;/span&gt;
&lt;span class="go"&gt;+------------------------------------------------------------------+------------------------------------+--------+---------+---------+--------------+-----------+----------------------+&lt;/span&gt;
&lt;span class="go"&gt;| bb98cde6f1616ac60ac75fed1a45a347042dd128e9fbbd03bf46aef75bd5516a | debian trixie amd64 (202511141828) | debian | trixie  | gateway | x86_64       | container | 2025/11/14 00:00 UTC |&lt;/span&gt;
&lt;span class="go"&gt;+------------------------------------------------------------------+------------------------------------+--------+---------+---------+--------------+-----------+----------------------+&lt;/span&gt;
&lt;span class="gp"&gt;dryusdan@Nemo:~/images$ &lt;/span&gt;tree
&lt;span class="go"&gt;.&lt;/span&gt;
&lt;span class="go"&gt;├── images&lt;/span&gt;
&lt;span class="go"&gt;│   ├── 10d7770cf96df16551b5c09e5c6548de61d95e37182aa223ee781dad1b84f3a3.incus.tar.xz&lt;/span&gt;
&lt;span class="go"&gt;│   └── 10d7770cf96df16551b5c09e5c6548de61d95e37182aa223ee781dad1b84f3a3.squashfs&lt;/span&gt;
&lt;span class="go"&gt;└── streams&lt;/span&gt;
&lt;span class="go"&gt;    └── v1&lt;/span&gt;
&lt;span class="go"&gt;        ├── images.json&lt;/span&gt;
&lt;span class="go"&gt;        └── index.json&lt;/span&gt;

&lt;span class="go"&gt;4 directories, 6 files&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces fichiers-là, vous les exportez où vous voulez. Puis sur votre serveur Incus, tapez la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;root@kida ~ # &lt;/span&gt;incus&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;customimage&lt;span class="w"&gt; &lt;/span&gt;https://images.example.tld&lt;span class="w"&gt; &lt;/span&gt;--protocol&lt;span class="o"&gt;=&lt;/span&gt;simplestreams
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Honnêtement quand j'ai découvert ça, ça m'a beaucoup aidé. J'ai un peu de configuration à
perfectionner (comme automatiser le push des images) mais la base est présente.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ameliorer-la-partie-packer-1"&gt;
&lt;h2&gt;Améliorer la partie Packer&lt;/h2&gt;
&lt;p&gt;Je vais tout de même améliorer le déploiement avec Packer, parce que même si cette solution
nous sort une image à exporter, en l'exportant on récupère les metadonnées nécessaires qu'on
a modifié, un rootfs qu'on peut &amp;quot;&lt;em&gt;squashfs-isé&lt;/em&gt;&amp;quot; et des templates dont je vous parlerai en
temps voulu.&lt;/p&gt;
&lt;p&gt;Je reprends globalement tout ce que j'ai déjà fait. Je variablise quelques informations&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;images:debian/13/cloud&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;OUTPUT_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;debian-gateway&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ALIASES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OUTPUT_IMAGE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Gateway image for Dryusdan&amp;#39;s cloud&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;debian&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;RELEASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;trixie&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ARCHITECTURE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;amd64&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;VARIANT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gateway&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Ici j&amp;#39;ai quelques variables utilisées plus tard&lt;/span&gt;
&lt;span class="nv"&gt;EXPORT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;REBUILD_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;IMAGE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;images&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rootfs.squashfs&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je lance le build de Packer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;packer&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;image=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;output_image=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OUTPUT_IMAGE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;aliases=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ALIASES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;os=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;release=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RELEASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;architecture=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCHITECTURE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;-var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;variant=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VARIANT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;./packer
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je récupère l'image.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;fingerprint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;incus&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OUTPUT_IMAGE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="o"&gt;[]&lt;/span&gt;.fingerprint&lt;span class="k"&gt;)&lt;/span&gt;
incus&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fingerprint&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EXPORT_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fingerprint&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En root, j'extrais l'image, je récupère les fichiers &lt;tt class="docutils literal"&gt;metadata.yaml&lt;/tt&gt; et
&lt;tt class="docutils literal"&gt;templates/&lt;/tt&gt; pour les recompresser. Puis je crée un squashfs avec le dossier
rootfs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Je viens de constater que sans être root, le tar désarchive en utilisant
l'utilisateur actuel, le miens étant 1000, tout mon système était donc avec l'UID
1000 et non 1. Il faut donc lancer cette partie en root.&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;--same-owner&lt;span class="w"&gt; &lt;/span&gt;--extract&lt;span class="w"&gt; &lt;/span&gt;--file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EXPORT_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fingerprint&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--directory&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REBUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;--same-owner&lt;span class="w"&gt; &lt;/span&gt;--create&lt;span class="w"&gt; &lt;/span&gt;--xz&lt;span class="w"&gt; &lt;/span&gt;--file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/incus.tar.xz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--directory&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REBUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;metadata.yaml&lt;span class="w"&gt; &lt;/span&gt;templates/
mksquashfs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REBUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rootfs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-comp&lt;span class="w"&gt; &lt;/span&gt;xz&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;boot
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je vais m'attarder sur les fichiers contenus dans &lt;tt class="docutils literal"&gt;incus.tar.xz&lt;/tt&gt;.
Le fichier metadata.yaml est créé par Incus et Packer, donc il est formaté comme je
le souhaite. Le dossier &amp;quot;&lt;em&gt;templates&lt;/em&gt;&amp;quot;, lui, possède des fichiers qui seront copiés dans le
container ou la VM lors de son déploiement, notamment le hostname.tpl pour que son
hostname justement soit le nom donné dans Incus. Ou encore des pré-configurations
pour cloud-init.&lt;/p&gt;
&lt;p&gt;J'ai créé un script nommé &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image-packer/src/branch/main/bootstrap.sh"&gt;bootstrap.sh&lt;/a&gt; qui effectue toutes ces actions. Tout ce
qu'il reste à faire après c'est ajouter l'image dans le &amp;quot;serveur simplestreams&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sans-utiliser-packer-1"&gt;
&lt;h2&gt;Sans utiliser Packer&lt;/h2&gt;
&lt;p&gt;Avant de saisir comment était formée une image construite avec les méthodes précédentes,
j'ai développé une méthode pour construire ses propres images. Ça se base forcément
sur du debootstrap. Cette fois-ci le repository a changé : &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image"&gt;gateway-image&lt;/a&gt; mais ne sera
pas maintenu, la méthode est fonctionnelle et je vous la présente parce que certain⋅e⋅s ne
voudront pas utiliser Packer 😉.&lt;/p&gt;
&lt;p&gt;Les configurations du &lt;tt class="docutils literal"&gt;rootfs&lt;/tt&gt; sont celles tirées du repository &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image-packer"&gt;gateway-image-packer&lt;/a&gt;.
Le fichier &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image/src/branch/main/get-templates.sh"&gt;get-templates.sh&lt;/a&gt; va récupérer l'archive contenant les metadatas et les
templates qui sont utiles pour cloud-init notamment. Le fichier &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image/src/branch/main/generate_metadata.py"&gt;generate_metadata.py&lt;/a&gt;
va basiquement altérer le fichier &lt;tt class="docutils literal"&gt;metadata.yaml&lt;/tt&gt; pour y modifier certaines valeurs
comme la date de création ou surtout les propriétés. Le fichier &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image/src/branch/main/make-squashfs.sh"&gt;make-squashfs.sh&lt;/a&gt; va
lancer un debootstrap (vu et revus), installer des dépendances, supprimer des fichiers
et configurer systemd. Ça ressemble à ce que je vous ai montré au tout début de cet
article. Puis je run un &lt;tt class="docutils literal"&gt;mksquashfs&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;En réalité, il existe même un fichier &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/gateway-image/src/branch/main/make-squashfs.sh"&gt;bootstrap.sh (encore un)&lt;/a&gt; qui permet de lancer
tout ça en une seule commande.&lt;/p&gt;
&lt;p&gt;Je ne m'attarde pas plus sur cette méthode, car la différence entre celle-ci et Packer
réside dans le debootstrap, debootstrap vu dans l'article précédent ou dans
&lt;a class="reference external" href="/installer-une-debian-stock-sur-un-raspberry-pi"&gt;Installer une Debian stock sur un Raspberry PI&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Maintenant vous savez créer une image custom pour votre infrastructure Incus, notamment
une gateway qui nous sera utile dans le prochain article !&lt;/p&gt;
&lt;p&gt;À bientôt pour l'épisode 3 ! Et si vous ne voulez pas le louper, abonnez vous au flux
&lt;a class="reference external" href="/rss"&gt;/RSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;jawis"&gt;Wai Siew&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 15 Nov 2025 14:30:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-15:/mon-lab-episode-2-automatiser-ses-gateways</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category><category>LabAAS</category></item><item><title>Mon lab - Épisode 1 : Automatiser le socle</title><link>https://dryusdan.space/mon-lab-episode-1-automatiser-le-socle</link><description>&lt;div class="section" id="au-tout-debut"&gt;
&lt;h2&gt;Au tout début&lt;/h2&gt;
&lt;p&gt;Mon lab, je l'hérite de quand j'étais étudiant, c'était mon premier PC qui a évolué
progressivement, nouveau boitier, nouvelle carte mère + CPU + RAM, nouveau disque...
Bref, la machine de 2025 ne ressemble plus du tout à celle de 2012. Autant vous dire
que ce serveur en a vu des horreurs, je me suis fait les dents dessus. Lorsqu'il a
quitté sa fonction de PC pour devenir un NAS (Et oui, au début j'en avais fait un
NAS !) c'était une Debian 8. Debian qui a connu que des mises à jour à coup de
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dist-upgrade&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd'hui le serveur tourne bien et porte 80% de mes usages d'internet, mais son
aspect unique, centralisé, juste branché en direct sur la Freebox et à la merci
de mes tests me dérange un peu. Surtout que, même si en termes de puissance il
reste très bien équipé, des projets et tests gourmands sont à l'étroit et dégradent
les autres applications disponibles. Je discute aussi avec des gens qui ont des labs
plus intéressants que le mien et qui me font rêver. Rajoutez un changement de boulot
dans une équipe orientée réseau (où j'ai tout à ré-apprendre) et vous avez tous les
ingrédients pour me donner envie de redessiner intégralement mon infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/actual-home.svg" type="image/svg+xml"&gt;Un schéma d'une infrastructure basique, il y a deux rectangles, représentant un PC et un serveur. Un autre rectangles représentant tout le reste. Le tout est branché sur un rond représentant la box internet du FAI.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;L'idée est que demain mon lab ressemble à ça :&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/futur-lab.svg" type="image/svg+xml"&gt;Un schéma d'une infrastructure BEAUCOUP plus poussé séparant l'infrastructure sur 3 zones réseaux. Une zone domestique, une zone lab maison et une zone lab hébergeur. Ces deux dernières zones sont relié au routeur qui lui ai relié à la box internet. Et dans chacune de ces zones se trouve tout un tas de serveur relié à des switchs relié au routeur.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Je n'ai certes pas prévu d'avoir autant de machines et non je n'ai pas simplement
branché des machines sur un switch relié à un routeur (même si vous venez de
grossièrement décrire le fonctionnement d'internet), les serveurs seront
des hyperviseurs gérant eux-mêmes leurs réseaux comme ceci&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/inside-hypervisor.svg" type="image/svg+xml"&gt;Un schéma représentant 2 hyperviseurs dont leurs machines partages un même réseau tout en étant isolé des autres.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Bref, beaucoup d'Overengineering pour héberger un serveur Minecraft (et deux trois
autres trucs).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;J'ai envie que dans mon lab tout soit reproductible, de toute façon c'est la mode
avec &lt;em&gt;l'infrastructure as code&lt;/em&gt; et le &lt;em&gt;&amp;quot;cloud&amp;quot;&lt;/em&gt;. Il y a aussi la raison derrière
qui est que si je fais une erreur assez grave comme modifier tous les droits de mon
système, je peux tout remettre d'équerre facilement (en théorie). Ça amène aussi
l'évolutivité de la plateforme et les mises à jour. Au revoir les binaires legacy en
python2.7 qui trainent sur mon serveur, mes erreurs de jeunesse et autres configurations
fantômes qui font tout tenir et que le jour où je modifie ça, tout explose.&lt;/p&gt;
&lt;p&gt;Pour répondre à cette envie, j'ai pas mal creusé et réfléchi. La première question est :
&lt;strong&gt;Comment automatiser l'installation du socle ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="#au-tout-debut"&gt;Au tout début&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#quel-outil-choisir-1"&gt;Quel outil choisir ?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="#maas-foreman-et-d-autres-outils-entrent-dans-la-piece-1"&gt;MaaS, Foreman et d'autres outils entrent dans la pièce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#mais-seul-pxe-reste-1"&gt;Mais seul PXE reste&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#le-netboot-1"&gt;Le netboot&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="#debian-avec-preseed-1"&gt;Debian avec preseed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#faire-sa-propre-image-debian-netboot-2"&gt;Faire sa propre image Debian Netboot&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="#le-script-install-sh-1"&gt;Le script install.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#les-autres-fichiers-dans-rootfs-1"&gt;Les autres fichiers dans rootfs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#maintenant-le-boot-pxe-1"&gt;Maintenant le boot PXE&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="#pxe-avec-le-preseed-1"&gt;PXE avec le preseed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#pxe-avec-le-squashfs-1"&gt;PXE avec le squashfs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="quel-outil-choisir-1"&gt;
&lt;h2&gt;Quel outil choisir ?&lt;/h2&gt;
&lt;p&gt;J'ai cherché un moyen pour installer automatiquement et à l'identique plusieurs
serveurs en prenant en compte le partitionnement et les logiciels de base utilisés par le
système et ce, sans aucune intervention manuelle (je n'ai pas d'IPMI pour intervenir).&lt;/p&gt;
&lt;div class="section" id="maas-foreman-et-d-autres-outils-entrent-dans-la-piece-1"&gt;
&lt;h3&gt;MaaS, Foreman et d'autres outils entrent dans la pièce&lt;/h3&gt;
&lt;p&gt;J'ai découvert MaaS. MaaS pour Metal as a Service est un outil développé par Canonical
pour déployer facilement et à grande échelle des serveurs. Par défaut l'outil embarque
Ubuntu LTS ou CentOS. Pour avoir une image Debian (ou autre) il faut utiliser Packer
(en soi c'est bien, c'est reproductible) mais sur la documentation Debian est flaggué
en Beta. La création de cette image ne me convient pas. Il faut lancer Packer qui va
exécuter des scripts shell qui vont configurer le serveur en ajoutant des PPA et des
dépôts Ubuntu pour finir par fournir une sorte d'ISO déployable par MaaS. MaaS
s'installe via Snap (😬) ou PPA et avec le changement de licence qu'ils ont fait sur
LXD, je me méfie. Bref ça rajoute énormément de complexité (c'est curieux d'écrire ça
au vu de ce que va être mon infra) pour une petite infrastructure ainsi que de surcouche
alors que je ne maitrisais même pas la base à ce moment-là.&lt;/p&gt;
&lt;p&gt;Pour les curieux⋅ses un petit article qui pourraient vous intéresser d'une personne qui a testé et
poussé MaaS.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Cet article fait partie d’une série d’articles dédiés à la découverte de MAAS, un outil de déploiement d’OS sur un parc de serveurs (souvent baremetal mais pas que) :\nPremiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical Déployer un hyperviseur VMware ESXi avec MAAS Introduction Il y a quelques mois, après plusieurs discussions avec mon collègue (et ami!) Julien, j’ai voulu tester MAAS (Metal As A Service) sur mon homelab.\n&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/bc8aa36d378a57336e9a25871e6596f7.png" alt="Image of Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/bc8aa36d378a57336e9a25871e6596f7.png" alt="Image of Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Il y a son pendant sous Fedora, mais il faut compiler les paquets pour Debian :
&lt;a class="reference external" href="https://cobbler.github.io/"&gt;Cobbler&lt;/a&gt;. J'ai testé de le faire tourner, mais sans grand succès, j'ai fini par
lâcher l'affaire. J'ai également regardé du côté de &lt;a class="reference external" href="https://theforeman.org/"&gt;Foreman&lt;/a&gt;, mais 4Go de RAM
pour faire tourner un serveur PXE ça m'a un peu refroidi. Je comprends cependant
l'intérêt dans un datacenter, mais pour un petit lab c'est un peu overkill.
Il m'a été proposé iVentoy, du célèbre outil Ventoy, mais le fait qu'il ne soit
que partiellement open-source me rebute. Il existe aussi Netboot.xyz
qui, sur le papier est très bien mais qui ajoute une surcouche et  je n'ai pas vu
comment gérer l'installation sans brancher un clavier. Il m'a également été proposé
Clonezilla qui, dans son approche, est pas mal, car on ne crée une image qu'une
fois et on la restaure sur chaque machine. Dans mon cas j'ai très peu de machines
similaires, certaines possèdent des NVME, d'autres des SSD SATA (Clonezilla fait la
différence), de l'Intel, de l'AMD (là c'est Debian qui installe les paquets spécifiques
au CPU)... Une en multi-disque. On finit par faire autant d'images qu'on a de machines,
ce qui perd de son intérêt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mais-seul-pxe-reste-1"&gt;
&lt;h3&gt;Mais seul PXE reste&lt;/h3&gt;
&lt;p&gt;Il me restait donc PXE et iPXE. Bon, iPXE c'est une évolution de PXE, soit il est présent sur la
carte réseau, soit il faut la flasher (vu que la mienne est soudée sur la CM c'est pas possible),
soit il faut boot en PXE, charger iPXE puis charger l'image ensuite. iPXE a de nombreux avantages,
boot d'une ISO en HTTPS, support donc d'HTTPS, du scripting plus avancé et retire la dépendance
à &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Trivial_File_Transfer_Protocol"&gt;TFTP&lt;/a&gt; (Trivial File Transfert Protocol) qui n'est pas sécurisé (pas d'authentification,
utilisation de l'UDP, pas de chiffrement). Dans mon cas je n'y vois pas de grand intérêt, tout
est local et mon facteur de risque rend difficilement envisageable un ajout de backdoor sur mon
serveur TFTP. Donc du PXE ça me va. Et ça me laisse des axes d'améliorations 😛&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Donc je pars sur du PXE.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PXE c'est assez simple, lorsqu'il démarre le service fait un DHCPDISCOVER pour demander une IP,
le serveur DHCP lui en donne une avec deux options :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;l'adresse IP d'un second serveur sur lequel il pourra récupérer sa configuration&lt;/li&gt;
&lt;li&gt;le chemin du fichier de configuration que le service doit récupérer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite le PXE va télécharger le fichier de configuration qui est le bootloader, l'éxecute. Le
bootloader quant à lui va lancer et télécharger les kernels, initramfs et tout ce qu'il a besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="le-netboot-1"&gt;
&lt;h2&gt;Le netboot&lt;/h2&gt;
&lt;p&gt;Déjà pourquoi partir sur Debian ? J'utilise cet OS depuis bientôt 10 ans et tous mes playbooks
sont configurés pour Debian. Il y a aussi le fait que je n'aime pas Ubuntu (vraiment avec Snap
là brrrrrrrrrrr). Proxmox aurait sûrement pu répondre à mon projet qui devait s'appuyer sur 2
technos (que vous verrez dans un prochain épisode) mais pas sûr... Et il fallait faire beaucoup
de réécriture de mes recettes terraform actuelles.&lt;/p&gt;
&lt;p&gt;Je garde quand même un atout dans ma manche : PXE. Demain je veux installer Proxmox ou tout autre
OS, je génère une nouvelle image et zou.&lt;/p&gt;
&lt;div class="section" id="debian-avec-preseed-1"&gt;
&lt;h3&gt;Debian avec preseed&lt;/h3&gt;
&lt;p&gt;Debian propose un installeur en PXE netboot. Mais l'installeur est interactif, ce qui est
contraire à l'automatisation... Sauf si on utilise un &lt;strong&gt;fichier Preseed&lt;/strong&gt;. En réalité le fichier
Preseed va &amp;quot;simplement&amp;quot; répondre aux questions de l'installeur à notre place sauf s'il n'a
pas réussi à résoudre une question.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Je vous partage tout de même cette méthode que j'ai creusé mais je ne l'utilise pas.
Vous pouvez directement passer à la méthode
« &lt;a class="reference external" href="#faire-sa-propre-image-debian-netboot-2"&gt;Faire sa propre image Debian Netboot&lt;/a&gt; »
si vous souhaitez un truc qui marche 😛&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Le Preseed, une fois la machine installée, se récupère avec la commande
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;debconf-get-selections&lt;/span&gt; &lt;span class="pre"&gt;--installer&lt;/span&gt;&lt;/tt&gt; . C'est illisible et très lourd pour ce que c'est.
J'ai pris une autre option, créer mon fichier Preseed en m'appuyant notamment sur ce site
&lt;a class="reference external" href="https://preseed.valete.fr"&gt;preseed.valete.fr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour le coup les commentaires, bien que en anglais, sont assez éloquents.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## locales

# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string fr_FR.UTF-8

d-i debian-installer/language string en

d-i debian-installer/country string FR

d-i keyboard-configuration/xkb-keymap string fr(latin9)

## Network

# Disable network configuration entirely. This is useful for cdrom installations on non-networked devices where the network questions, warning and long timeouts are a nuisance.
d-i netcfg/enable boolean true

# netcfg will choose an interface that has link if possible. This makes it skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto

# Any hostname and domain names assigned from dhcp take precedence over values set here. However, setting the values still prevents the questions from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string kida

# Any hostname and domain names assigned from dhcp take precedence over values set here. However, setting the values still prevents the questions from being shown, even if values come from dhcp.
d-i netcfg/get_domain string srv.dryusdan.net

# If non-free firmware is needed for the network or other hardware, you can configure the installer to always try to load it, without prompting. Or change to false to disable asking.
d-i hw-detect/load_firmware boolean true

### Mirror settings
# If you select ftp, the mirror/country string does not need to be set.
d-i mirror/protocol string http
d-i mirror/country string fr
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Globalement, ici j'ai configuré mon clavier en FR, activé le réseau et le DHCP
pour finir par nommer ma machine kida.srv.dryusdan.net. Puis j'ai configuré apt
pour utiliser deb.debian.org.&lt;/p&gt;
&lt;p&gt;La suite du fichier Preseed va créer un compte (avec comme mot de passe azerty
:p ). Il est important de noter qu'il faut soit créer un compte utilisateur
soit définir un mot de passe sur le compte root. Et si on veut uniquement
se connecter en SSH... Il faut gérer ça plus tard.
J'en profite pour régler l'heure et la timezone de la machine (qui de toute
façon seront réécrites par mes playbooks).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## accounts

# Skip creation of a root account (normal user account will be able to use sudo)
d-i passwd/root-login boolean true

# mkpasswd -s -m sha-512
d-i passwd/root-password-crypted password $6$fmioCke46GgEcazY$Orn2E3TT3Vbr17gSiFjgi0x5pbSQjL1S6uSlAdBUSGI/F/KtMDV2968H7ckj6NzLjEigpQmY4pMBtczXocRev.

# Le mot de passe est bidon, c&amp;#39;est azerty :p

# Skip creation of a normal user account.
d-i passwd/make-user boolean false


## Clock and timezone

# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true

d-i time/zone select
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'attaque maintenant le partitionnement. Tout d'abord si le
disque n'est pas détecté (par exemple sur une machine
virtuelle), on peut forcer son utilisation
en décommentant la ligne &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;d-i&lt;/span&gt; &lt;span class="pre"&gt;partman-auto/disk&lt;/span&gt; string /dev/vda&lt;/tt&gt;.
Je souhaite la création d'un LVM faisant 100% de l'espace restant
(restant car je partage une partie du disque avec la partition EFI).
Je confirme la suppression de tout block device type LVM ou MDADM
encore présent sur le disque puis je confirme l'écriture sans
remplir les disques de 0. Je demande ensuite que le fstab soit
généré avec des UUID car ça marche bien et ça ne change pas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## Partitioning

#d-i partman-auto/disk string /dev/vda

# use LVM to partition the disk
d-i partman-auto/method string lvm

# You can define the amount of space that will be used for the LVM volume group. It can either be a size with its unit (eg. 20 GB), a percentage of free space or the &amp;#39;max&amp;#39; keyword.
d-i partman-auto-lvm/guided_size string 100%

# If one of the disks that are going to be automatically partitioned contains an old LVM configuration, the user will normally receive a warning. This can be preseeded away...
d-i partman-lvm/device_remove_lvm boolean true

# The same applies to pre-existing software RAID array.
d-i partman-md/device_remove_md boolean true

# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm boolean true

# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm_nooverwrite boolean true

# This makes partman automatically partition without confirmation.
d-i partman-partitioning/confirm_write_new_label boolean true

# This makes partman automatically partition without confirmation.
d-i partman/choose_partition select finish

# This makes partman automatically partition without confirmation.
d-i partman/confirm boolean true

# This makes partman automatically partition without confirmation.
d-i partman/confirm_nooverwrite boolean true

# Ensure the partition table is GPT - this is required for EFI
d-i partman-partitioning/choose_label string gpt

# Ensure the partition table is GPT - this is required for EFI
d-i partman-partitioning/default_label string gpt

# When disk encryption is enabled, skip wiping the partitions beforehand.
d-i partman-auto-crypto/erase_disks boolean false

# This makes partman automatically partition without confirmation.
d-i partman-md/confirm boolean true

# The default is to mount by UUID, but you can also choose &amp;quot;traditional&amp;quot; to use traditional device names, or &amp;quot;label&amp;quot; to try filesystem labels before falling back to UUIDs.
d-i partman/mount_style select uuid
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Là ça devient fun, si fun que j'ai rédigé l'autre méthode qui est
présentée plus bas.&lt;/p&gt;
&lt;p&gt;Tout d'abord je crée un volume logique nommé &lt;tt class="docutils literal"&gt;vg&lt;/tt&gt; d'une taille
de 30GB extensible jusqu'à 1TB, une partition efi de 768MB en fat32
qui sera bootable et une  partition /boot de 1GB en ext4 qui sera
également bootable.&lt;/p&gt;
&lt;p&gt;Puis j'écris un &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lv-root&lt;/span&gt;&lt;/tt&gt; de 5GB dans &lt;tt class="docutils literal"&gt;vg&lt;/tt&gt; qui sera en ext4, monté
sur &lt;tt class="docutils literal"&gt;/&lt;/tt&gt;. Pareil pour &lt;tt class="docutils literal"&gt;/var&lt;/tt&gt;, hormis qu'il s'agit d'un lv de 10GB.&lt;/p&gt;
&lt;p&gt;Puis je passe sur incus qui sera un petit lv monté sur &lt;tt class="docutils literal"&gt;/var/lib/incus&lt;/tt&gt;
d'une taille allant de 10GB à 1TB.&lt;/p&gt;
&lt;p&gt;Pour finir je crée un swap qui fait 200% de ma mémoire vive&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;d-i partman-auto-lvm/new_vg_name string vg

d-i partman-auto/expert_recipe string                         \
    boot-root ::                                              \
        768 768 768 fat32                                     \
            $primary{ } $bootable{ }                          \
            method{ efi } format{ }                           \
        .                                                     \
        1024 1024 1024 ext4                                   \
            $primary{ } $bootable{ }                          \
            method{ format } format{ }                        \
            use_filesystem{ } filesystem{ ext4 }              \
          ker ce  mountpoint{ /boot }                               \
        .                                                     \
        30000 100 1000000 ext4                                \
            $defaultignore{ }                                 \
            $primary{}                                        \
            method{ lvm } format{ }                           \
            vg_name{ vg }                                     \
        .                                                     \
        5000 101 5000 ext4                                    \
            $defaultignore{ }                                 \
            $lvmok{ }                                         \
            in_vg{ vg } lv_name{ lv-root }                    \
            method{ format } format{ }                        \
            use_filesystem{ } filesystem{ ext4 }              \
            mountpoint{ / }                                   \
        .                                                     \
        10000 101 10000 ext4                                  \
            $defaultignore{ }                                 \
            $lvmok{ }                                         \
            in_vg{ vg } lv_name{ lv-var }                     \
            method{ format } format{ }                        \
            use_filesystem{ } filesystem{ ext4 }              \
            mountpoint{ /var }                                \
        .                                                     \
        10000 101 -1      ext4                                \
            $defaultignore{ }                                 \
            $lvmok{ }                                         \
            in_vg{ vg } lv_name{ lv-incus }                   \
            method{ format } format{ }                        \
            use_filesystem{ } filesystem{ ext4 }              \
            mountpoint{ /var/lib/incus }                      \
        .                                                     \
        200% 100 200% linux-swap                              \
            $defaultignore{ }                                 \
            $lvmok{ }                                         \
            in_vg{ vg } lv_name{ lv-swap }                    \
            method{ swap } format{ }                          \
            use_filesystem{ } filesystem{ linux-swap }        \
        .                                                     \
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous avez dû tiquer sur la ligne &lt;tt class="docutils literal"&gt;10000 101 10000 ext4&lt;/tt&gt;.
C'est théoriquement assez simple en surface. Le ext4 vous avez compris
c'est le format de la partition. En revanche le premier nombre (ici
&lt;tt class="docutils literal"&gt;10000&lt;/tt&gt;) c'est la taille minimale requise pour cette partition. Le second
nombre c'est la priorité utilisée par l'algorithme pour attribuer la
place restante sur le disque pour s'approcher de la taille maximum demandée
par chaque partition. Le 3ème nombre c'est la taille maximale.
Dans mon cas hormis Incus, toutes les partitions sont définies avec une taille
fixe. Lorsqu'il y a un &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-1&lt;/span&gt;&lt;/tt&gt; c'est pour indiquer &lt;em&gt;&amp;quot;prend toute la place
qu'il te reste&amp;quot;&lt;/em&gt;. Et je viens de l'apprendre, j'avais cru lire auparavant
que c'était pour indiquer que la taille minimale suffisait...&lt;/p&gt;
&lt;p&gt;C'est principalement le gros problème de Preseed, je n'ai pas trouvé
de documentation claire. C'était que des bouts de documentation à droite
à gauche, des posts sur des forums (qui sont en plus sur inscription only
maintenant) et je ne vous ai même pas parlé d'utiliser BTRFS et ses
subvolumes... L'histoire du -1 plus haut, je me suis dit qu'en cherchant
à écrire cet article, je venais de comprendre un truc, donc j'ai de
nouveau testé&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une image avec le terminal qui affiche tout un tas de partitionnement. On constate que le /var/lib/incus fait uniquement la taille minimal." src="/content/images/2025/11/partman-fail.png" /&gt;&lt;/p&gt;
&lt;p&gt;Ça n'a pas fonctionné. La seule documentation trouvée c'est &lt;a class="reference external" href="https://github.com/xobs/debian-installer/blob/b5dd4532de9ad15e9122893a0f00cb7cea531b5e/doc/devel/partman-auto-recipe.txt#L289-L319"&gt;l'algorithme
lui-même&lt;/a&gt; quand je cherchais à comprendre pourquoi &lt;a class="reference external" href="https://serverfault.com/questions/893483/what-do-the-3-numbers-mean-in-manual-partitioning-of-hdd-in-ubuntu-preseed"&gt;il y a 3 nombres&lt;/a&gt;
dans les recettes partman.&lt;/p&gt;
&lt;p&gt;J'ai quand même décrit cette partie avec Partman, car j'ai passé trop de
temps à essayer de comprendre pour ne pas en parler :D&lt;/p&gt;
&lt;p&gt;Théoriquement c'est censé être simple à comprendre, mais cela m'a
excessivement cassé les pieds. En plus de Partman, l'installeur de Debian
me demandait toujours s'il devait analyser un CD en tant que repository.
Sauf que non, no way. Mais impossible de le désactiver... J'ai trouvé la
réponse sur un post de 2005, en fait la partie CD-ROM était une demande de
&amp;quot;l'installeur du média d'installation&amp;quot; (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;apt-cdrom-setup&lt;/span&gt;&lt;/tt&gt;) et non de
&amp;quot;l'installeur Debian&amp;quot; (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;d-i&lt;/span&gt;&lt;/tt&gt;)... Pour être sûr que ça ne me demande
JAMAIS l'ajout d'un CD, j'ai tout collé.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## Apt setup

# Choose, if you want to scan additional installation media
# (default: false).
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-double boolean false
d-i apt-setup/cdrom/set-failed boolean false
d-i apt-setup/disable-cdrom-entries boolean true

# Faut-il analyser d&amp;#39;autres supports d&amp;#39;installation ?
apt-cdrom-setup apt-setup/cdrom/set-double      boolean false
apt-cdrom-setup apt-setup/cdrom/set-failed      boolean false
apt-cdrom-setup apt-setup/cdrom/set-first       boolean false
apt-cdrom-setup apt-setup/cdrom/set-next        boolean false
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici ça reste classique, j'active tous les repos Debian, je ne
choisis rien dans le &lt;tt class="docutils literal"&gt;run_tasksel&lt;/tt&gt; (celui qui demande si vous voulez
un serveur d'impression, ssh, web...). Je demande d'installer
openssh-server (que je configure plus bas) et je désactive le
popularity-contest. Puis je force Debian à installer grub en
indiquant qu'il est le seul OS sur cette machine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;d-i apt-setup/use_mirror boolean false

# You can choose to install non-free firmware.
d-i apt-setup/non-free-firmware boolean true

# You can choose to install non-free software.
d-i apt-setup/non-free boolean true

# You can choose to install contrib software.
d-i apt-setup/contrib boolean true

# If you don&amp;#39;t want to have the sources.list entry for a DVD/ BD installation image active in the installed system(entries for netinst or CD images will be disabled anyway, regardless of this setting).

## Package selection
# Or choose to not get the tasksel dialog displayed at all (and don&amp;#39;t install any packages):
d-i pkgsel/run_tasksel string

# Individual additional packages to install
d-i pkgsel/include string openssh-server

# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
popularity-contest popularity-contest/participate boolean false


## Boot loader

# This is fairly safe to set, it makes grub install automatically to the UEFI partition/boot record if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Là y a deux trois petites astuces. Déjà Debian va forcément vous demander
une confirmation pour reboot. Ça se désactive avec la ligne
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;finish-install/reboot_in_progress&lt;/span&gt;&lt;/tt&gt;. Ensuite un coup de &lt;tt class="docutils literal"&gt;exit/reboot&lt;/tt&gt;
ça fonctionne. Mais dans mon cas, je préfère un shutdown
pour le remettre sur le réseau standard et lui claquer un WOL, pour
éviter qu'il s'installe à l'infini.&lt;/p&gt;
&lt;p&gt;Pour les &lt;tt class="docutils literal"&gt;late_command&lt;/tt&gt; c'est là où ça devient intéressant. Je retire le mot
de passe root, je bloque le compte. Puis je lui crée un répertoire &lt;tt class="docutils literal"&gt;.ssh&lt;/tt&gt; pour
autoriser ma clé SSH à entrer sur le serveur et je modifie la configuration
d'OpenSSH pour autoriser la connexion à root.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## Finishing

# This is how to make the installer shutdown when finished, but not reboot into the installed system.
#d-i debian-installer/exit/reboot boolean true
d-i finish-install/reboot_in_progress note

## Advanced options
d-i preseed/late_command string \
    in-target /usr/bin/passwd -dl root; \
    in-target /usr/bin/mkdir -p /root/.ssh; \
    in-target /usr/bin/echo &amp;#39;ssh-ed25519 MASUPERCLESSH&amp;#39; &amp;gt; /root/.ssh/authorized_keys; \
    in-target /usr/bin/sed -i &amp;quot;s/#PermitRootLogin prohibit-password/PermitRootLogin yes/&amp;quot; /etc/ssh/sshd_config;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Comme dit plus haut, j'ai privilégié une autre méthode. Mais vous pouvez
tout de même &lt;a class="reference external" href="/content/preseed.cfg"&gt;accéder au preseed complet&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="faire-sa-propre-image-debian-netboot-2"&gt;
&lt;h3&gt;Faire sa propre image Debian Netboot&lt;/h3&gt;
&lt;p&gt;Je suis assez content⋅e, car je commence à réussir à faire des liens
entre mes articles. Il y a beaucoup de similitudes avec un précédemment
écrit : &lt;a class="reference external" href="/installer-une-debian-stock-sur-un-raspberry-pi#la-methode-fun"&gt;l'installation d'une Debian sur un Raspberry PI&lt;/a&gt;&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/installer-une-debian-stock-sur-un-raspberry-pi#la-methode-fun"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Installer une Debian stock sur un Raspberry PI&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;J'ai quelques Raspberry PI en stock, un qui me servait de serveur DNS, un qui fait du build de temps en temps et un dédié à Homeassistant (faudrait que je vous en parle un jour). Autant j'adore cette petite carte, autant l'OS proposé avec (Raspberry OS anciennement appelé Raspbian) n'a …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/dcada75f5119e0c67aeee871c6c5e661.png" alt="Image of Installer une Debian stock sur un Raspberry PI page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/dcada75f5119e0c67aeee871c6c5e661.png" alt="Image of Installer une Debian stock sur un Raspberry PI page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Pour réussir à faire l'installation que je souhaite, j'ai créé une image
live qui va inclure un script d'installation et ce script va simplement
partitionner la machine, puis lancer un debootstrap.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur IRC, on m'a lancé le défi d'utiliser l'initramfs en PXE pour y lancer les
instructions d'installation ... J'ai regardé mais pas réussi.&lt;/p&gt;
&lt;p&gt;Cependant pour les curieux⋅ses j'ai un petit article de Lord :&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://lord.re/posts/176-creer-initramfs-manuellement/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Se créer un initramfs manuellement&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;ou
Se monter un système Linux minimal 🔗
Alors que quelques années en arrière, le wiki d'Arch Linux était une des rares documentations à aborder des sujets assez variés et techniques, désormais le wiki Gentoo s'améliore grandement et arrive à faire au moins aussi bien.
Il lui arrive même de dépasser son concurrent et a l'avantage d'être plus centré sur ma distro favorite.
Il intègre désormais le fameux handbook permettant d'installer sa Gentoo.
Aujourd'hui je vais vous faire un ptit TL;DR de la partie dédiée à l'InitramFS.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/f89f7f064e5613beeb780079e459ff49.png" alt="Image of Se créer un initramfs manuellement page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/f89f7f064e5613beeb780079e459ff49.png" alt="Image of Se créer un initramfs manuellement page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;hr class="docutils" /&gt;
&lt;p&gt;Déjà pour réussir ça, il faut saisir comment boot un Linux. C'est expliqué
dans le lien de &lt;a class="reference external" href="https://lord.re/posts/176-creer-initramfs-manuellement/"&gt;Lord&lt;/a&gt; juste au dessus, mais je vais très succinctement le résumer
ici :&lt;/p&gt;
&lt;p&gt;BIOS/EUFI → Bootloader → Initramfs → Linux&lt;/p&gt;
&lt;p&gt;Le bootloader est un noyau Linux archi light et compressé mais qui aura
plus de capacité pour lancer la suite que le BIOS/EUFI. Il est nommé &lt;tt class="docutils literal"&gt;vmlinuz&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;vmlinuz&lt;/tt&gt; va ainsi pouvoir booter l'initramfs (en RAM) qui est plus complet,
notamment, car il peut être amené à déchiffrer un disque. Ensuite là c'est peanut,
initramfs a les clés nécessaires pour boot Linux en suivant les instructions
transmises par l'initramfs qui l'a récupéré du bootloader. Bref, on démarre
deux Linux avant d'avoir notre Linux final.&lt;/p&gt;
&lt;p&gt;Je vais extrêmement grossir le trait, mais décompressez une Debian netinstall
ou une iso Ubuntu et vous aurez grosso modo le même mécanisme qu'avec un PXE.
Il y a un secteur d'amorçage, qui va lancer le grub puis de bootloader puis
initramfs et pour finir par décompresser et exécuter le système de fichier en
lecture seule.&lt;/p&gt;
&lt;p&gt;Donc je vais créer un mini système que sera ensuite compressé pour boot dessus.
Pour finir ce système va lancer une installation automatique créé avant.
(En réalité ça me fait penser à &lt;a class="reference external" href="https://github.com/canonical/subiquity"&gt;Subiquity&lt;/a&gt; de Canonical... Mais en plus simple)&lt;/p&gt;
&lt;p&gt;Pour créer ce système, il faut quelques paquets :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;debootstrap&lt;/tt&gt; pour installer Debian&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;squashfs-tools&lt;/span&gt;&lt;/tt&gt; pour créer un système de fichier compressé&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;rsync&lt;/tt&gt; pour copier les données en conservant les permissions et envoyer le résultat
sur notre serveur TFTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et c'est tout (vous pensiez que c'était plus compliqué que ça ? :D).
À vrai dire, là c'est ça va être la base, mais vous pouvez retrouver le script d'installation
sur &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/pxe-hv-install"&gt;mon repository git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;je crée le système de base&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#Créer un dossier temporaire&lt;/span&gt;
debootstrap&lt;span class="w"&gt; &lt;/span&gt;--arch&lt;span class="o"&gt;=&lt;/span&gt;amd64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--components&lt;span class="o"&gt;=&lt;/span&gt;main,non-free,non-free-firmware&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--variant&lt;span class="o"&gt;=&lt;/span&gt;minbase&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--include&lt;span class="o"&gt;=&lt;/span&gt;arch-install-scripts,btrfs-progs,ca-certificates,console-setup,curl,debootstrap,dbus,dosfstools,e2fsprogs,iproute2,iputils-ping,linux-image-amd64,live-boot,locales,openssh-server,parted,systemd-resolved,systemd-sysv,systemd-timesyncd,zstd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--force-check-gpg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;trixie&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;http://deb.debian.org/debian
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Comme pour installer le Raspberry PI. J'ai rajouté &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;arch-install-scripts&lt;/span&gt;&lt;/tt&gt;,
par pur fainéantise pour faire un chroot ou encore &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;btrfs-progs&lt;/span&gt;&lt;/tt&gt; pour créer
et gérer un système de fichier en btrfs. J'inclus également &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;live-boot&lt;/span&gt;&lt;/tt&gt; qui
est une composante nécessaire pour Debian pour se lancer sur un squashfs
(j'ai testé sans, ça a fini en Kernel Panic). Et un  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;openssh-server&lt;/span&gt;&lt;/tt&gt; pour
pouvoir se connecter sur la machine si, par hasard, le script d'installation échoue.&lt;/p&gt;
&lt;p&gt;J'ai créé un répertoire rootfs comportant quelques fichiers et exécutables tels
que mes clés SSH, ou encore le script d'installation. Ce répertoire est
copié sur le système créé par debootstrap.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dryusdan@nemo:~/git/pxe-hv-install$ &lt;/span&gt;tree
&lt;span class="go"&gt;rootfs/&lt;/span&gt;
&lt;span class="go"&gt;├── etc&lt;/span&gt;
&lt;span class="go"&gt;│   ├── hostname&lt;/span&gt;
&lt;span class="go"&gt;│   ├── locale.gen&lt;/span&gt;
&lt;span class="go"&gt;│   ├── ssh&lt;/span&gt;
&lt;span class="go"&gt;│   │   └── sshd_config.d&lt;/span&gt;
&lt;span class="go"&gt;│   │       └── pxe-boot.conf&lt;/span&gt;
&lt;span class="go"&gt;│   └── systemd&lt;/span&gt;
&lt;span class="go"&gt;│       ├── network&lt;/span&gt;
&lt;span class="go"&gt;│       │   └── 10-dhcp.network&lt;/span&gt;
&lt;span class="go"&gt;│       └── system&lt;/span&gt;
&lt;span class="go"&gt;│           └── install.service&lt;/span&gt;
&lt;span class="go"&gt;├── root&lt;/span&gt;
&lt;span class="go"&gt;│   └── .ssh&lt;/span&gt;
&lt;span class="go"&gt;│       └── authorized_keys&lt;/span&gt;
&lt;span class="go"&gt;└── usr&lt;/span&gt;
&lt;span class="go"&gt;    └── local&lt;/span&gt;
&lt;span class="go"&gt;        └── bin&lt;/span&gt;
&lt;span class="go"&gt;            └── install.sh&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'explique en premier le script &lt;tt class="docutils literal"&gt;install.sh&lt;/tt&gt;, le plus intéressant
mais également le plus basique, pas d'installation compliquée avec des outils
compliqués. Il reste cependant adapté à un petit lab, car il est basique mais
n'offre que peu de personnalisation &amp;quot;facilement&amp;quot;.&lt;/p&gt;
&lt;div class="section" id="le-script-install-sh-1"&gt;
&lt;h4&gt;Le script install.sh&lt;/h4&gt;
&lt;p&gt;Tout d'abord le script commence par choisir un disque, plus ou moins arbitrairement.
Soit je l'ai indiqué dans le serveur TFTP, soit il se débrouille. J'évite aussi
les disques attachés à un soft raid (j'ai une machine qui a 3 disques &lt;tt class="docutils literal"&gt;/dev/sdX&lt;/tt&gt;
en soft-raid et un &lt;tt class="docutils literal"&gt;/dev/nvme0n1&lt;/tt&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;TFTP_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;172&lt;/span&gt;.26.0.1
&lt;span class="nv"&gt;DISK_FORCE_INSTALL_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;config/install-disk&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tftp://&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TFTP_SERVER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISK_FORCE_INSTALL_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ne&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;68&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;File exist, choose disk &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No disk choosed. Fetch disks&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$disk&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/proc/mdstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No mdadm found&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;md&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/proc/mdstat&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;disk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsblk&lt;span class="w"&gt; &lt;/span&gt;--nodeps&lt;span class="w"&gt; &lt;/span&gt;--exclude&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-io&lt;span class="w"&gt; &lt;/span&gt;NAME&lt;span class="w"&gt; &lt;/span&gt;--noheadings&lt;span class="w"&gt; &lt;/span&gt;--sort&lt;span class="w"&gt; &lt;/span&gt;NAME&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;md&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is in mdadm. Don&amp;#39;t rewrite it&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;If you want to rewrite it, please fix in on tftp server &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISK_FORCE_INSTALL_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Choosing &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois le disque choisi, je supprime ses entêtes et je crée
une partition efi pour l'EUFI et une partition qui va comporter
tous les subvolumes BTRFS. Pourquoi BTRFS ? On m'a dit que c'était
bien, je ne connaissais pas donc je vais tester.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;parted&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--script&lt;span class="w"&gt; &lt;/span&gt;mktable&lt;span class="w"&gt; &lt;/span&gt;gpt
parted&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--script&lt;span class="w"&gt; &lt;/span&gt;mkpart&lt;span class="w"&gt; &lt;/span&gt;EFI&lt;span class="w"&gt; &lt;/span&gt;fat32&lt;span class="w"&gt; &lt;/span&gt;1MiB&lt;span class="w"&gt; &lt;/span&gt;512MiB
parted&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--script&lt;span class="w"&gt; &lt;/span&gt;mkpart&lt;span class="w"&gt; &lt;/span&gt;LINUX&lt;span class="w"&gt; &lt;/span&gt;btrfs&lt;span class="w"&gt; &lt;/span&gt;512MiB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;%

&lt;span class="c1"&gt;# Petit trick parce que le nommage d&amp;#39;une partition nvme et sda n&amp;#39;est pas identique&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="s2"&gt;&amp;quot;nvme&amp;quot;&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;bootpart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;p1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;p2&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;bootpart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;disk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;2&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Formating disk&amp;quot;&lt;/span&gt;
mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;EFI&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bootpart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
mkfs.btrfs&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;LINUX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je monte la partition puis je crée les subvolumes&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mounting /dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; on &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
mount&lt;span class="w"&gt; &lt;/span&gt;/dev/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Creating subvolumes&amp;quot;&lt;/span&gt;
btrfs&lt;span class="w"&gt; &lt;/span&gt;subvolume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;@
btrfs&lt;span class="w"&gt; &lt;/span&gt;subvolume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;@var
btrfs&lt;span class="w"&gt; &lt;/span&gt;subvolume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;@incus
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je démonte tout ça pour monter progressivement les subvolumes en
créant les points de montages et également pour créer les quotas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unmount base&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/
umount&lt;span class="w"&gt; &lt;/span&gt;/mnt

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mount root subvolume into &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
mount&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
btrfs&lt;span class="w"&gt; &lt;/span&gt;quota&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
btrfs&lt;span class="w"&gt; &lt;/span&gt;qgroup&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;10G&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Creating var&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mounting var subvolume&amp;quot;&lt;/span&gt;
mount&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var&amp;quot;&lt;/span&gt;
btrfs&lt;span class="w"&gt; &lt;/span&gt;quota&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var&amp;quot;&lt;/span&gt;
btrfs&lt;span class="w"&gt; &lt;/span&gt;qgroup&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;16G&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Creating incus&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var/lib/incus&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mounting incus subvolume&amp;quot;&lt;/span&gt;
mount&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@incus&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fspart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/var/lib/incus&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mounting efi partition&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/boot/efi
mount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bootpart&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/boot/efi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis je lance debootstrap pour installer. Comme d'habitude,
vous pouvez choisir vos propres paquets. Cependant gpg est quand même
très utile pour apt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Debootstrap in &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
debootstrap&lt;span class="w"&gt; &lt;/span&gt;--arch&lt;span class="o"&gt;=&lt;/span&gt;amd64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--components&lt;span class="o"&gt;=&lt;/span&gt;main,non-free,non-free-firmware&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--variant&lt;span class="o"&gt;=&lt;/span&gt;minbase&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--include&lt;span class="o"&gt;=&lt;/span&gt;btrfs-progs,ca-certificates,console-setup,curl,dbus,dosfstools,e2fsprogs,firmware-misc-nonfree,gpg,grub-efi,iproute2,iputils-ping,linux-image-amd64,lm-sensors,man-db,less,locales,openssh-server,python3,systemd-resolved,systemd-sysv,systemd-timesyncd,vim,zstd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;--force-check-gpg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;trixie&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;http://deb.debian.org/debian
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je configure le fstab en utilisant le label parce que c'est
plus simple que de récupérer l'UUID du disque ou le chemin vers ce disque.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Configure fstab&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; &amp;quot;${ROOTFS}/etc/fstab&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;LABEL=LINUX /              btrfs   subvol=@,defaults,rw,noatime,autodefrag,compress=zstd 0 1&lt;/span&gt;
&lt;span class="s"&gt;LABEL=LINUX /var           btrfs   subvol=@var,defaults,rw,noatime,autodefrag,compress=zstd 0 2&lt;/span&gt;
&lt;span class="s"&gt;LABEL=LINUX /var/lib/incus btrfs   subvol=@incus,defaults,rw,noatime,autodefrag,compress=zstd 0 2&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je configure le reste du serveur, qui ressemble étrangement
(ou pas) au dossier rootfs vu plus haut. &lt;em&gt;Peut-être un
prochain axe d'amélioration.&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Configure server&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fr_FR.UTF-8 UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/etc/locale.gen&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en_GB.UTF-8 UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/etc/locale.gen&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Configure network&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-pv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/etc/systemd/network/&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; &amp;quot;${ROOTFS}/etc/systemd/network/10-dhcp.network&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;[Match]&lt;/span&gt;
&lt;span class="s"&gt;Name=e*&lt;/span&gt;

&lt;span class="s"&gt;[Network]&lt;/span&gt;
&lt;span class="s"&gt;DHCP=ipv4&lt;/span&gt;

&lt;span class="s"&gt;[DHCP]&lt;/span&gt;
&lt;span class="s"&gt;UseDNS=yes&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Configure ssh server&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; &amp;quot;${ROOTFS}/etc/ssh/sshd_config.d/first-boot-conf.ssh&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;PasswordAuthentication no&lt;/span&gt;
&lt;span class="s"&gt;PermitEmptyPasswords no&lt;/span&gt;
&lt;span class="s"&gt;PermitRootLogin prohibit-password&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Add ssh authorized_keys in root&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-vp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/root/.ssh/&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; &amp;quot;${ROOTFS}/root/.ssh/authorized_keys&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPP4tMAPIWv4fMMI7xLfdVFe54weHoFe2ZVZU+ZVPl8d&lt;/span&gt;
&lt;span class="s"&gt;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINF+bi103OW7hfuVXoO/MLzR9Ymi7wx0HGt7WvH8vrSa&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Change hostname&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pxe-install&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/etc/hostname&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fix /etc/hosts&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/etc/hosts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;127.0.0.1 localhost&lt;/span&gt;
&lt;span class="s"&gt;127.0.1.1 pxe-install&lt;/span&gt;

&lt;span class="s"&gt;# The following lines are desirable for IPv6 capable hosts&lt;/span&gt;
&lt;span class="s"&gt;::1     localhost ip6-localhost ip6-loopback&lt;/span&gt;
&lt;span class="s"&gt;ff02::1 ip6-allnodes&lt;/span&gt;
&lt;span class="s"&gt;ff02::2 ip6-allrouters&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis je lance les dernières configurations au travers du chroot, je
régénère l'initramfs, le grub, je force l'écriture sur disque et
j'éteins la machine !&lt;/p&gt;
&lt;p&gt;Alors petit trick, le &lt;tt class="docutils literal"&gt;PATH&lt;/tt&gt; de arch-chroot n'embarque pas &lt;tt class="docutils literal"&gt;/usr/sbin&lt;/tt&gt;
sauf que des binaires (notamment utilisés par &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;locale-gen&lt;/span&gt;&lt;/tt&gt; se trouvent
dedans, j'ajoute ce chemin dans le PATH et je le retire après mes actions
pour éviter de foutre la grouille sur mon terminal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;OLD_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin&amp;quot;&lt;/span&gt;

info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Prepare nextboot&amp;quot;&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;locale-gen
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-ntp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-timezone&lt;span class="w"&gt; &lt;/span&gt;Europe/Paris
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-networkd
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;update-initramfs&lt;span class="w"&gt; &lt;/span&gt;-u
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grub-install&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="o"&gt;=&lt;/span&gt;x86_64-efi&lt;span class="w"&gt; &lt;/span&gt;--efi-directory&lt;span class="o"&gt;=&lt;/span&gt;/boot/efi&lt;span class="w"&gt; &lt;/span&gt;--bootloader-id&lt;span class="o"&gt;=&lt;/span&gt;debian&lt;span class="w"&gt; &lt;/span&gt;--recheck&lt;span class="w"&gt; &lt;/span&gt;--no-nvram&lt;span class="w"&gt; &lt;/span&gt;--removable
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;update-grub

&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OLD_PATH&lt;/span&gt;

sync&lt;span class="p"&gt;;&lt;/span&gt;sync&lt;span class="p"&gt;;&lt;/span&gt;

info&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Install completed. Shutdown&amp;quot;&lt;/span&gt;
shutdown&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="les-autres-fichiers-dans-rootfs-1"&gt;
&lt;h4&gt;Les autres fichiers dans rootfs&lt;/h4&gt;
&lt;p&gt;Il n'y avait pas qu'un &lt;tt class="docutils literal"&gt;install.sh&lt;/tt&gt; dans le rootfs 😉. On
y trouve aussi le fichier &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pxe-boot.conf&lt;/span&gt;&lt;/tt&gt; qui autorise la
connexion au compte root en SSH.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;# rootfs/etc/ssh/sshd_config.d/pxe-boot.conf&lt;/span&gt;
PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin prohibit-password
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le fichier &lt;tt class="docutils literal"&gt;locale.gen&lt;/tt&gt; possède que deux locales, rien de folichon&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;# rootfs/etc/locale.gen&lt;/span&gt;
fr_FR&lt;span class="s"&gt;.UTF-8 UTF-8&lt;/span&gt;
en_GB&lt;span class="s"&gt;.UTF-8 UTF-8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le fichier &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;10-dhcp.network&lt;/span&gt;&lt;/tt&gt; quant à lui va activer le DHCP
sur toutes les interfaces commençant par &lt;tt class="docutils literal"&gt;e&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# rootfs/etc/systemd/network/10-dhcp.network&lt;/span&gt;
&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;e*&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;DHCP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ipv4&lt;/span&gt;

&lt;span class="k"&gt;[DHCP]&lt;/span&gt;
&lt;span class="na"&gt;UseDNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le service &lt;tt class="docutils literal"&gt;install.service&lt;/tt&gt; est la pièce maitresse, sans lui
rien ne sera lancé automatiquement. Mais même s'il est basique
il embarque deux trois dépendances liées au réseau&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# rootfs/etc/systemd/system/install.service&lt;/span&gt;
&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Install&lt;/span&gt;
&lt;span class="na"&gt;Requires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target network-online.target time-sync.target local-fs.target&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/install.sh&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il y a beaucoup de &lt;tt class="docutils literal"&gt;require&lt;/tt&gt;, car le &lt;tt class="docutils literal"&gt;network.target&lt;/tt&gt; attend uniquement
que l'interface soit up, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;network-online.target&lt;/span&gt;&lt;/tt&gt; attend que l'IP soit montée
sur l'interface, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;time-sync.target&lt;/span&gt;&lt;/tt&gt; attend que le client NTP lance une synchronisation
et &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;local-fs.target&lt;/span&gt;&lt;/tt&gt; attend que les disques soient réellement montés.&lt;/p&gt;
&lt;p&gt;Autant &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;network-online.target&lt;/span&gt;&lt;/tt&gt; est utile parce que le script se lance, DHCP ou non
et c'est un peu ennuyeux. Autant &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;time-sync.target&lt;/span&gt;&lt;/tt&gt; c'est utile si la pile de votre machine
est KO, fraichement remplacée et que vous utilisez les dépôts Debian en HTTPS.&lt;/p&gt;
&lt;p&gt;En rajoutant des dépendances aux services, il va falloir les activer au lancement du serveur
(et c'est là que arch-chroot va être utile :D)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#Je désactive le réseau de base Debian&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/bin/systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;networking

&lt;span class="c1"&gt;# J&amp;#39;active systemd-networkd et wait-online qui attend que le DHCP se soit lancé&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/bin/systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-networkd&lt;span class="w"&gt; &lt;/span&gt;systemd-networkd-wait-online.service

&lt;span class="c1"&gt;# J&amp;#39;active systemd-timesyncd et wait-sync pour forcer la synchronisation de l&amp;#39;horloge système&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/bin/systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-timesyncd.service&lt;span class="w"&gt; &lt;/span&gt;systemd-time-wait-sync.service

&lt;span class="c1"&gt;# J&amp;#39;active le script&lt;/span&gt;
arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/bin/systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous voulez activer un mot de passe sur votre compte root (au cas où le
réseau ne monte pas par exemple), attention le clavier sera en qwerty.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;arch-chroot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;echo -e &amp;quot;azerty&amp;quot; | passwd root --stdin&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et &lt;em&gt;voilà&lt;/em&gt;, le système est prêt à être compressé. Ce qui se fait assez
facilement d'ailleurs. Mais avant de continuer il faut récupérer l'initramfs
et vmlinuz, car ils sont utiles au démarrage de la machine en PXE&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;NETSYSTEM_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/netsystem&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NETSYSTEM_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;-azvP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/boot/initrd.img&amp;quot;&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NETSYSTEM_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/initrd.img&amp;quot;&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;-azvP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/boot/vmlinuz&amp;quot;&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NETSYSTEM_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/vmlinuz&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis je lance une compression excluant le /boot vu que ces fichiers ont été récupérés
juste avant, mieux vaut éviter les données inutiles sinon ça ralentit le temps de
téléchargement de l'image pour rien. La compression est du lzma. C'est plus gourmand
en ressource pour compresser, mais j'ai quelques cores dans le boitier.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mksquashfs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NETSYSTEM_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/dry-debian-custom.squashfs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-comp&lt;span class="w"&gt; &lt;/span&gt;xz&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;boot
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis j'envoie tout ça sur la machine qui va gérer le PXE.&lt;/p&gt;
&lt;p&gt;Comme je vous l'ai dit plus haut, tout est disponible sur
&lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/pxe-hv-install"&gt;mon repository git&lt;/a&gt;, les fichiers sont un peu plus travaillés. Et
vous pouvez les copier coller sans avoir besoin de les réassembler.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="maintenant-le-boot-pxe-1"&gt;
&lt;h2&gt;Maintenant le boot PXE&lt;/h2&gt;
&lt;p&gt;Maintenant que tout est prêt, je vais m'attaquer au boot. mais après
un moment de réflexion.&lt;/p&gt;
&lt;p&gt;Dans mon cas, j'ai un serveur DHCP géré par mon routeur. Si j'indique à mon
routeur d'envoyer les options DHCP pour le PXE, à chaque reboot de la machine
elle va se réinstaller en PXE (et au final former un boot reinstall loop). Je
dois donc éviter ça. Et j'aimerais éviter les erreurs de manipulation aussi.&lt;/p&gt;
&lt;p&gt;Je n'avais pas trouvé de meilleure solution que coller sa machine dans un VLAN
spécifique, le serveur DHCP + TFTP dans ce même VLAN et boot.&lt;/p&gt;
&lt;p&gt;Depuis j'ai constaté, en augmentant le verbose de mon tftp, qu'une ligne
m'intéresse&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;RRQ from 172.26.0.19 filename efi64/pxelinux.cfg/01-ad-6a-a9-c8-8f-c0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ça veut, théoriquement, dire qu'au lieu que syslinux utilise le fichier
&lt;tt class="docutils literal"&gt;default&lt;/tt&gt; (comme j'ai trouvé partout), je pourrais utiliser un fichier
ayant comme nom l'adresse mac de la machine, ce qui me permettrait
d'écrire les instructions de boot dans un fichier spécifique par machine.&lt;/p&gt;
&lt;p&gt;Bon, aujourd'hui j'ai plutôt une machine que je branche sur un autre réseau avec un
VLAN et comme ça ce requête via l'API du Mikrotik c'est automatisable.&lt;/p&gt;
&lt;p&gt;Pour faire simple, au lieu de passer par le routeur je passe par le RPI qui fait office
de routeur. Pas le même réseau, ça m'évite aussi de faire une connerie si jamais&lt;/p&gt;
&lt;p&gt;&lt;object data="/content/images/2025/11/tftp.svg" type="image/svg+xml"&gt;Un schéma reprenant l'infrastructure futur-lab, mais épuré. La différence se voit dans un serveur qui passe maintenant par le raspberry PI.&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Mais ça pourrait faire une nouvelle évolution à mener 😇&lt;/p&gt;
&lt;p&gt;EDIT : En relisant une &lt;a class="reference external" href="https://wiki.debian.org/PXEBootInstall"&gt;source de l'article&lt;/a&gt; j'ai vu que Debian l'expliquant, j'aurais
pu économiser un peu de temps...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Then SYSLINUX/PXELINUX will try to search its configuration at different paths, from the most specific to the least:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pxelinux.cfg/GUID&lt;/li&gt;
&lt;li&gt;pxelinux.cfg/MAC&lt;/li&gt;
&lt;li&gt;pxelinux.cfg/default&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maintenant que j'ai le comment, il va falloir passer à la configuration. Je vous laisse
gérer votre configuration réseau, la mienne est un poil alambiquée pour d'autres raisons
que ce projet.&lt;/p&gt;
&lt;p&gt;Pour mettre en place ce boot PXE je vais avoir besoin de 3 choses :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un serveur DHCP&lt;/li&gt;
&lt;li&gt;Un serveur TFTP&lt;/li&gt;
&lt;li&gt;Un bootloader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour le serveur DHCP je pars sur &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;isc-dhcp-server&lt;/span&gt;&lt;/tt&gt;. La configuration
est relativement simple, dans le fichier &lt;tt class="docutils literal"&gt;/etc/dhcp/dhcpd.conf&lt;/tt&gt; je supprime tout pour
y coller ces quelques lignes&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;default-lease-time 600;
max-lease-time 900;
ignore-client-uids true;

subnet 172.26.0.0 netmask 255.255.255.0 {
  range 172.26.0.10 172.26.0.250;
  option domain-name-servers 192.168.1.221;
  option routers 172.26.0.1;
  option broadcast-address 172.26.0.255;
  deny unknown-clients;
}

group {
  next-server 172.26.0.1;
  filename &amp;quot;efi64/syslinux.efi&amp;quot;;

  host srv1 { hardware ethernet AD:6A:A9:C8:8F:C0; }
  host srv2 { hardware ethernet 43:BD:7F:D8:3E:82; }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ignore-client-uids&lt;/span&gt;&lt;/tt&gt; est là pour éviter d'assigner une nouvelle IP, ou d'assigner
la même IP sur tous les clients qui ont le même UUID (ça m'est arrivé, c'est chiant).
Le &lt;tt class="docutils literal"&gt;subnet&lt;/tt&gt; défini le réseau. Au début, j'utilisais un &lt;tt class="docutils literal"&gt;/29&lt;/tt&gt;. Mais j'ai de l'espace
et aucun intéret à me comprimer dans un &lt;tt class="docutils literal"&gt;/29&lt;/tt&gt; (qui m'a apporté des doublons d'IP).
La petite particularité est le &lt;tt class="docutils literal"&gt;deny &lt;span class="pre"&gt;unknown-clients;&lt;/span&gt;&lt;/tt&gt; qui est là pour éviter
qu'en cas de maladresse mon serveur principal, mon pc ou whatever démarre en PXE sur le même VLAN
que mon RPI et se fasse réinstaller, je n'autorise les requêtes DHCP que des adresses
MAC connues.&lt;/p&gt;
&lt;p&gt;Adresses MAC qui sont définies dans la section &lt;tt class="docutils literal"&gt;group&lt;/tt&gt; en dessous. L'option &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;next-server&lt;/span&gt;&lt;/tt&gt; c'est
l'adresse du serveur qui a d'autres configurations à filer à la machine (aka notre serveur
TFTP) et &lt;tt class="docutils literal"&gt;filename&lt;/tt&gt; c'est le fichier de &amp;quot;configuration&amp;quot; que notre serveur va récupérer.&lt;/p&gt;
&lt;p&gt;Ensuite on édite &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/default/isc-dhcp-server&lt;/span&gt;&lt;/tt&gt; pour faire écouter
le serveur DHCP sur une seule interface.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;INTERFACESv4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eth0.100&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On commente tout le reste et la configuration du serveur DHCP est terminé.&lt;/p&gt;
&lt;p&gt;Côté serveur TFTP maintenant, c'est encore PLUS SIMPLE, déjà j'installe le paquet
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tftpd-hpa&lt;/span&gt;&lt;/tt&gt; et modifie la configuration présente dans &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/default/tftpd-hpa&lt;/span&gt;&lt;/tt&gt;
(Le verbosity n'est pas de trop je trouve)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;TFTP_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tftp&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;TFTP_DIRECTORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/srv/tftp&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;TFTP_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:69&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;TFTP_OPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--secure --verbosity 4&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;RUN_DAEMON&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant il ne reste plus qu'à aller créer un dossier &lt;tt class="docutils literal"&gt;/srv/tftp&lt;/tt&gt; et y mettre
les droits pour &lt;tt class="docutils literal"&gt;tftp&lt;/tt&gt; et zou !&lt;/p&gt;
&lt;div class="section" id="pxe-avec-le-preseed-1"&gt;
&lt;h3&gt;PXE avec le preseed&lt;/h3&gt;
&lt;p&gt;Sauf qu'il manque le bootloader ! Au tout départ j'ai pris celui de Debian netboot.
Ça fonctionne, mais j'utilise plus le netboot de Debian. (Je vais quand même vous le
montrer)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp
wget&lt;span class="w"&gt; &lt;/span&gt;https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;-xvf&lt;span class="w"&gt; &lt;/span&gt;netboot.tar.gz&lt;span class="w"&gt; &lt;/span&gt;./
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;debian-installer/amd64/grubx64.efi&lt;span class="w"&gt; &lt;/span&gt;.
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;debian-installer/amd64/grub&lt;span class="w"&gt; &lt;/span&gt;.
chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;tftp:tftp&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans la config DNS je modifie l'option &lt;tt class="docutils literal"&gt;filename&lt;/tt&gt; pour pointer vers &lt;tt class="docutils literal"&gt;grubx64.efi&lt;/tt&gt;.
Pour indiquer où est l'URL du preseed et que Debian démarre tout seul correctement, je révise
le fichier &lt;tt class="docutils literal"&gt;/srv/tftp/grub/grub.cfg&lt;/tt&gt; pour remplacer tous les &lt;tt class="docutils literal"&gt;menuentry&lt;/tt&gt; par celui
ci-dessous en rajoutant au passage 2 options en plus : un timeout de 2 secondes avec
une présélection par défaut sur l'entrée fraichement créée.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;menuentry&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Install&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;background_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;black
&lt;span class="w"&gt;  &lt;/span&gt;linux&lt;span class="w"&gt;    &lt;/span&gt;/debian-installer/amd64/linux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vga&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;788&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;---&lt;span class="w"&gt; &lt;/span&gt;quiet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;preseed/url&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://preseed.dryusdan.net/preseed.cfg&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;netcfg/get_hostname&lt;span class="o"&gt;=&lt;/span&gt;debian&lt;span class="w"&gt; &lt;/span&gt;netcfg/get_domain&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;initrd&lt;span class="w"&gt;   &lt;/span&gt;/debian-installer/amd64/initrd.gz
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;Install&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="pxe-avec-le-squashfs-1"&gt;
&lt;h3&gt;PXE avec le squashfs&lt;/h3&gt;
&lt;p&gt;Pour cette étape, il va falloir installer deux paquets
et configurer le répertoire &lt;tt class="docutils literal"&gt;/srv/tftp&lt;/tt&gt; en conséquence&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;syslinux-common&lt;span class="w"&gt; &lt;/span&gt;syslinux-efi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois les bootloaders récupérés je les mets en place dans le répertoire tftp&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp/&lt;span class="o"&gt;{&lt;/span&gt;boot,pxelinux.cfg,efi64&lt;span class="o"&gt;}&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp/efi64/
cp&lt;span class="w"&gt; &lt;/span&gt;/usr/lib/syslinux/modules/efi64/*&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp/efi64/
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/srv/tftp/efi64
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;../pxelinux.cfg/&lt;span class="w"&gt; &lt;/span&gt;./
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;../boot/&lt;span class="w"&gt; &lt;/span&gt;./
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Côté menu de démarrage je crée  le fichier &lt;tt class="docutils literal"&gt;/srv/tftp/pxelinux.cfg/default&lt;/tt&gt;
en y ajoutant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DEFAULT vesamenu.c32
TIMEOUT 100
MENU TITLE Starting menu
ALLOWOPTIONS 0
MENU AUTOBOOT Auto start in #

LABEL NETSYSTEM
    MENU LABEL PXEBOOT
    KERNEL boot/netsystem/vmlinuz
    APPEND boot=live initrd=boot/netsystem/initrd.img vga=792 config noswap noprompt fetch=tftp://172.26.0.1/boot/netsystem/dry-debian.squashfs root=/dev/ram0 rw net.ifnames=0 showmounts toram quickreboot
    TEXT HELP
    Boot on PXE
    ENDTEXT
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le menu va boot automatiquement sur vmlinuz qui va charger l'initramfs.
L'initramfs lui va charger le squashfs en RAM sans swap et en
lecture-écriture (pour les applications qui vont écrire leurs logs).
L'instruction &lt;tt class="docutils literal"&gt;toram&lt;/tt&gt; va charger tout l'OS en RAM (d'où la nécessité d'un OS léger).
Le &lt;tt class="docutils literal"&gt;quickreboot&lt;/tt&gt; va redémarrer sans demander à l'utilisateur de retirer sa clé et
&lt;tt class="docutils literal"&gt;showmounts&lt;/tt&gt;, quant à lui, va afficher le squashfs dans un point de montage sur
la machine. Ces options nous viennent du paquet &lt;a class="reference external" href="https://manpages.debian.org/trixie/live-boot-doc/live-boot.7.en.html"&gt;live-boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il y a 10 minutes, j'ai déplacé le dossier &lt;tt class="docutils literal"&gt;netsystem&lt;/tt&gt; vers ce serveur. Ce dossier
comporte un vmlinuz, un initrd.img et le squashfs. Il ne reste plus qu'à les déplacer
du répertoire où ils nous attendent au serveur TFTP dans &lt;tt class="docutils literal"&gt;/srv/tftp/boot/netsystem/&lt;/tt&gt;.
Maintenant il faut tester en installant les serveurs via PXE ! 😊&lt;/p&gt;
&lt;p&gt;Avec mon RPI 4 branchés sur une borne WIFI et faisant routeur (je vous ai dit que
cette partie-là est spéciale) je boucle une installation en moins de 4 minutes.&lt;/p&gt;
&lt;p&gt;À bientôt pour l'épisode 2 ! Et si vous ne voulez pas le louper, abonnez vous au flux
&lt;a class="reference external" href="/rss"&gt;/RSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;i_m_polo"&gt;Ildefonso Polo&lt;/a&gt;&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;PS :systemd J'ai essayé d'être le plus clair et explicite possible. J'ai essayé de vulgariser
un peu tout en étant le plus juste possible. Mais si j'ai fait une erreur, n'hésitez
pas à me le dire par e-mail ou sur le fediverse (tout est sur ma page &lt;a class="reference external" href="/hello"&gt;Hello&lt;/a&gt; ) 😊&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sources"&gt;
&lt;h3&gt;Sources&lt;/h3&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://wiki.debian.org/DebianInstaller/Preseed"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;DebianInstaller/Preseed - Debian Wiki&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of DebianInstaller/Preseed - Debian Wiki page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of DebianInstaller/Preseed - Debian Wiki page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://www.johannes-bauer.com/linux/rescue/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Debian Netboot Rescue System&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Debian Netboot Rescue System page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Debian Netboot Rescue System page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/installer-une-debian-stock-sur-un-raspberry-pi"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Installer une Debian stock sur un Raspberry PI&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;J'ai quelques Raspberry PI en stock, un qui me servait de serveur DNS, un qui fait du build de temps en temps et un dédié à Homeassistant (faudrait que je vous en parle un jour). Autant j'adore cette petite carte, autant l'OS proposé avec (Raspberry OS anciennement appelé Raspbian) n'a …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/dcada75f5119e0c67aeee871c6c5e661.png" alt="Image of Installer une Debian stock sur un Raspberry PI page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/dcada75f5119e0c67aeee871c6c5e661.png" alt="Image of Installer une Debian stock sur un Raspberry PI page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://manpages.debian.org/trixie/live-boot-doc/live-boot.7.en.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;live-boot(7) — live-boot-doc — Debian trixie — Debian Manpages&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of live-boot(7) — live-boot-doc — Debian trixie — Debian Manpages page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of live-boot(7) — live-boot-doc — Debian trixie — Debian Manpages page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://wiki.debian.org/PXEBootInstall"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;PXEBootInstall - Debian Wiki&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of PXEBootInstall - Debian Wiki page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of PXEBootInstall - Debian Wiki page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://antoinepernot.fr/articles/installation-pxe"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;PXE - Antoine Pernot&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Ingénieur en systèmes informatiques, réseaux et télécommunications&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/e4fde94ea77aac1728eadc962f7229f3.png" alt="Image of PXE - Antoine Pernot page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/e4fde94ea77aac1728eadc962f7229f3.png" alt="Image of PXE - Antoine Pernot page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://doc.ycharbi.fr/index.php/Squashfs"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Squashfs — Wiki doc&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Squashfs — Wiki doc page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Squashfs — Wiki doc page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 08 Nov 2025 14:00:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-08:/mon-lab-episode-1-automatiser-le-socle</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>Linux</category><category>LabAAS</category><category>featured</category></item><item><title>Sécurité routière et piéton</title><link>https://dryusdan.space/notes/2025/11/securite-routiere-et-pieton</link><description>&lt;p&gt;La sécurité routière nous a encore pondu un magnifique message de prévention&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://m.youtube.com/watch?v=LHx-sSjIw_s"&gt;https://m.youtube.com/watch?v=LHx-sSjIw_s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;« Ils sont un danger pour les autres : les piétons »&lt;/p&gt;
&lt;p&gt;Putain mais quelles bandes de connard à la sécurité routière, vraiment&lt;/p&gt;
&lt;p&gt;Ça j’en suis à me demander si cette pub est légal.&lt;/p&gt;
&lt;p&gt;La pub qui fout des fumées de cheminé lié aussi voitures c’est interdit par contre ça ban pas de problème tout va bien&lt;/p&gt;
&lt;p&gt;Nan vraiment, des connards fini dans cet organisme&lt;/p&gt;
&lt;p&gt;Je sais pas pour égaliser ça ils auraient pu foutre 10 conducteurs de voiture fonçant dans la foule. Mais non ça aurait été du terrorisme.&lt;/p&gt;
&lt;p&gt;Combien j’ai de pote, de connaissance qui ont été shooté par un automobiliste sans être sur leurs téléphones.&lt;/p&gt;
&lt;p&gt;Combien de blessé et de mort sur la route à cause de conducteur qui sont sur leurs téléphones ? Mais non c’est plus facile de blâmer et d’insulter le piéton qui déjà galère à avoir un trottoir. Faire porter le chapeau le plus total à ces derniers.&lt;/p&gt;
&lt;p&gt;Comme d’hab en fait… Faire porter le poids de l’irresponsabilité à des milliards de victime.&lt;/p&gt;
&lt;p&gt;Ha et n’oubliez pas votre bracelet de reconnaissance attaché à votre cheville. Au cas où hein&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 02 Nov 2025 21:31:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-02:/notes/2025/11/securite-routiere-et-pieton</guid><category>notes</category></item><item><title>Humanité, IA et le règne animal</title><link>https://dryusdan.space/notes/2025/11/humanite-ia-et-le-regne-animal</link><description>&lt;p&gt;Cette semaine, pendant mes nombreuses heures perdues dans le train,
j'écoutais un podcast : &amp;quot;&lt;a class="reference external" href="https://shows.acast.com/emotions/episodes/chat-gpt-psy"&gt;Chat GPT peut-il être un bon psy ?&lt;/a&gt;&amp;quot;.
Sans même écouter le podcast j'aurais dit non, mais j'avais encore 2
heures devant moi, donc j'ai mis mes écouteurs et je l'ai fait.&lt;/p&gt;
&lt;p&gt;Pour rajouter un peu de contexte, quelques jours auparavant j'ai eu
une discussion que je vais pouvoir résumer en une simple question :&lt;/p&gt;
&lt;blockquote&gt;
Être gentil, simple histoire d'humanité ou évolution inutile ?&lt;/blockquote&gt;
&lt;p&gt;Cette question vient de 2 faits :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;j'ai aidé un petit vieux totalement alcoolisé incapable de parler
il y a 3 semaines au détriment de mon train à prendre.&lt;/li&gt;
&lt;li&gt;On m'a appris qu'à Paris, il ne faut penser qu'à soi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour appuyer sur cette dernière phrase, en discutant avec des collègues
parisiens, je me plaignais de la chaleur du métro, il doit y faire au
moins 30°C et il m'a répondu qu'une fois une personne a fait un malaise
dans sa rame. Il l'a mise en PLS, a tiré la sonnette d'alarme et... S'est
fait engueulé par les autres personnes de cette même rame. Ça fait écho
avec la discussion que j'ai eue (qui a généré cette question) : &amp;quot;Le fort vit,
le faible non, si le fort aide le faible c'est un couillon. Regarde, le
loup chasse le lapin, si le lapin se blesse, le loup va pas l'aider.&amp;quot;&lt;/p&gt;
&lt;p&gt;Sauf que le loup il n'a pas inventé le feu, le loup ne vit pas entouré
de 10 millions d'individus (au contraire on galère à les réintroduire en
France). Le loup ne tue pas la planète à petit feu, n'a pas lancé de
guerre pour un bout d'os (relique pardon). Le loup n'a pas évolué comme
l'humain. Je ne peux pas croire que l'humanité se résume à
l'individualisme de masse, sinon nous n'aurions pas &lt;a class="reference external" href="https://www.croix-rouge.fr/"&gt;la Croix-Rouge&lt;/a&gt;,
&lt;a class="reference external" href="https://www.msf.fr/"&gt;Médecin sans frontière&lt;/a&gt; ou encore &lt;a class="reference external" href="https://lachorba.fr/"&gt;la Chorba&lt;/a&gt;. Seulement nous ne voyons
que ce qu'on nous montre au travers des médias ou ce qu'on entend à travers
des discussions tandis que les associations citées plus haut agissent dans
l'ombre.&lt;/p&gt;
&lt;p&gt;Ça peut paraitre bizarre le lien entre ce podcast qui parle d'IA et
l'individualisme latent dont je fais mention depuis tout à l'heure. Mais
il y en a bien un !
Dans ce podcast, outre la section qui mentionne les discussions Reddit
pour avoir le meilleur prompt possible pour remplacer le psychologue, deux
autres sections m'ont interpelé.&lt;/p&gt;
&lt;p&gt;La première est la solitude. Ça peut paraitre bizarre, mais dans notre monde
ultra connecté les gens sont seuls. Mais on oublie très vite que les &amp;quot;réseaux
sociaux&amp;quot; tels que Tiktok ou Instagram pour n'en citer que deux, consomme un temps
monstrueux, procure de la dopamine à foison mais... Ce n'est pas un réseau social,
juste un écran publicitaire en plus (je grossis légèrement le trait) nous bombardant
d'informations déprimantes, d'idéaux à la con et de jugements débiles. Un moule dans
lequel il faut rentrer, sinon t'es un couillon (ho, un lien). Mais tu as aussi le
jugement des autres. Qui n'a jamais reçu une réflexion parce qu'on a porté un truc
qui ne plaisait pas à quelqu'un ? (bon, mon passé aide peut-être à penser qu'on est
toujours critiqués, haaaa l'école...). J'ai de la chance aujourd'hui d'avoir des
ami⋅e⋅s qui ne me jugent pas, mais c'est pas le cas de tout le monde.
L'IA générative est conçue pour être toujours de ton côté, pour répondre les mots les plus
justes pour toi. Donc oui, elle ne te jugera pas et paraitra gentille (sans même
connaitre ce concept, cette émotion).&lt;/p&gt;
&lt;p&gt;L'autre point c'est le paraitre, à force de nous rabâcher que nous ne sommes pas importants,
qu'on est facilement échangeables (qu'on vit comme ça tous les jours au final), que
d'autres ont de plus grands problèmes, plus de problèmes ou comme ils sont magnifiques
ils valent mieux que toi. baaah t'as l'impression que ton impression d'être submergé par les
évènements, des émotions négatives, que tu penses que tu ne vas pas t'en sortir, que tout
t'écrases, c'est pas si grave, c'est normal c'est un petit coup de blues. Une tisane et un
plaid et c'est fini... Non, juste fucking non. Alors oui l'état du système de santé
en France d'autant plus sur les problèmes d'ordre mental c'est une catastrophe et
ça ne va pas en s'arrangeant, mais les problèmes existent et c'est toujours important
quoi qu'on en pense.&lt;/p&gt;
&lt;p&gt;De mon côté, ce que j'ai retenu de cette semaine, c'est que beaucoup semblent être sur ce
délire de la loi du plus fort entouré de 66 millions d'autres, que 10 minutes c'est plus
important qu'aider une personne en détresse. Qu'au final, l'IA générative semble être
un bon point d'entrée parce qu'elle semble sympa, humaine.&lt;/p&gt;
&lt;p&gt;Je ne saurais dire si c'est triste qu'une IA parait plus humaine que des humains, ou
si on se sent entourés de monstres à cause des médias (et je colle dans ce groupe les
réseaux sociaux chargés à l'algorithme). Toujours est-il que penser aux autres n'est
pas une faiblesse, les juger en revanche est désastreux pour notre société.
Penser à la loi du plus fort et forcer les gens à rentrer dans un moule c'est le
contraire d'une société. Tout uniformiser pour empêcher la dissidence empêche juste
d'évoluer en tant qu'individu et en tant que société. Si on retire toute dissidence,
de notre société on retire toute évolution et là nous ne serions pas mieux qu'une IA
générative, car elle aussi n'évolue pas. Dans sa conception et dans son exécution,
l'IA n'est pas humaine, ni gentille. Elle ne sera pas notre amie et le risque que cette
technologie se retourne contre nous (la vie privée, le secret médical tout ça) n'est clairement
pas à exclure, surtout vu le monde vers lequel on se dirige.&lt;/p&gt;
&lt;p&gt;Si ça va pas, qu'importe le sujet, allez voir un psychologue. Vraiment.&lt;/p&gt;
&lt;p&gt;Cet article devait être une note au début, c'est finalement un article. Peut-être un peu
décousu. On va dire que ces dernières discussions m'ont un peu scié, penser qu'à sa
gueule est un moyen de paraitre évolué, quand on vit en société j'ai eu beaucoup de mal
à le digérer. L'IA en tant que psychologue m'a sidéré également mais ça s'explique...
J'avais besoin de mettre ça sur le papier. Mais il ne faut pas oublier le travail
astronomique qu'abattent les associations comme celles citées plus haut.&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;akhu"&gt;Anthony Da Cruz&lt;/a&gt;
Compliqué à trouver mine de rien car trouver une photo qui montre l'humain et pas
une vague de voiture c'est pas simple.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 01 Nov 2025 14:20:00 +0100</pubDate><guid>tag:dryusdan.space,2025-11-01:/notes/2025/11/humanite-ia-et-le-regne-animal</guid><category>En Vrac</category></item><item><title>Rétrospective d'aout et septembre 2025</title><link>https://dryusdan.space/notes/2025/09/retrospective-aout-septembre-2025</link><description>&lt;p&gt;Pas mal de mouvement pour ma part, je suis donc bien
moins présent sur mon blog. J'vais donc faire un condensé
d'Aout et de Septembre avec l'option &amp;quot;J'affiche que les données
que j'ai en un claquement de doigt&amp;quot;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;1 393 minutes en août et 1613 minutes en septembre&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;1 867&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;11 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;6 Go en août, 7 Go en septembre&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagés sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="moi"&gt;
&lt;h2&gt;Moi&lt;/h2&gt;
&lt;p&gt;Bon, en soit gros gros changement pour moi, j'ai enfin retrouvé un taff
intéressant. Pour les curieux je suis maintenant SRE dans une équipe
Network Product, et je vais trifouiller du HAProxy mais aussi du BGP
pour faire (très simple). Bref de quoi bien s'amuser et surtout apprendre.
Mine de rien ça a relancer ma passion pour l'informatique, bref je
m'éclate enfin... Mais au prix de 4h30 de transport chaque jour pendant
quelques mois.&lt;/p&gt;
&lt;p&gt;J'ai dû me mettre aux podcasts avec tout ce temps, si vous en avez des bons à
me conseiller, je suis preneur ! Et faudrait que j'arrive à partager ce que
j'écoute mais c'est du Apple Podcast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mon-lab"&gt;
&lt;h2&gt;Mon lab&lt;/h2&gt;
&lt;p&gt;L'article sur le Raspberry Pi est un avant gout, mais j'ai une énorme
chantier sur mon lab de prévu, ça devrait arriver progressivement dans
quelques mois. En tout cas j'ai acquis quelques mini PC d'occasion, un
Switch Multi Layer (Mikrotik) et des cables réseau :D&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mon-jardin"&gt;
&lt;h2&gt;Mon jardin&lt;/h2&gt;
&lt;p&gt;J'ai récupéré quelques plantes (encore) dont une Plumbago qui semble s'éclater !
&lt;img alt="plumbago" src="/content/images/2025/10/plumbago.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Juste avant de vous quitter, vous avez sûrement dû en entendre parler mais vous
devez absolument voir le film &lt;strong&gt;K-Pop deamon hunter&lt;/strong&gt;. Voilà, c'est cool, entrainant
et j'écoute encore la musique tout les matins x)
(Ha et j'vais me faire un nouveau tatouage aussi, mais le mois prochain, bref)&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 08 Oct 2025 16:40:00 +0200</pubDate><guid>tag:dryusdan.space,2025-10-08:/notes/2025/09/retrospective-aout-septembre-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Confection d'une huile piquante</title><link>https://dryusdan.space/notes/2025/09/confection-d-une-huile-piquante</link><description>&lt;p&gt;Mon épicier local des piments Habanero en stock (du coin en plus,
on a un producteur dans la région nantaise oO). Donc pourquoi
pas en faire une huile piquante pour pizza 😋&lt;/p&gt;
&lt;p&gt;Sur internet j'ai vu qu'il y avait deux écoles, une qui fait frémir
le mélange, l'autre non. J'ai donc testé les deux :p&lt;/p&gt;
&lt;p&gt;J'ai y ai une gousse d'ail par bouteille, 3-5 branches de thym, une
demi branche de romarin, 3-4 gros piments habanero et 2 feuilles de laurier.
Pour la bouteille qui a chauffé, j'ai mis à feux doux (3 sur ma plaque vitro)
jusque ça commence à frémir.&lt;/p&gt;
&lt;p&gt;Plus qu'à attendre 3-5 semaines pour déguster (moins apparement pour la
bouteille qui a chauffé)&lt;/p&gt;
&lt;img alt="Une casserolle en cuivre ou baigne les piments, le thym et le romarin dans de l'huile d'olive." src="/content/images/2025/09/embouteillage-huile-piquante.jpg" /&gt;
&lt;img alt="Deux bouteille d'huile d'olive avec les ingrédients pour en faire une sauce piquante." src="/content/images/2025/09/cuisson-huile-piquante.jpg" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 28 Sep 2025 18:40:00 +0200</pubDate><guid>tag:dryusdan.space,2025-09-28:/notes/2025/09/confection-d-une-huile-piquante</guid><category>notes</category><category>Cuisine</category></item><item><title>Installer une Debian stock sur un Raspberry PI</title><link>https://dryusdan.space/installer-une-debian-stock-sur-un-raspberry-pi</link><description>&lt;p&gt;J'ai quelques Raspberry PI en stock, un qui me servait de serveur DNS,
un qui fait du build de temps en temps et un dédié à Homeassistant
(faudrait que je vous en parle un jour). Autant j'adore cette petite
carte, autant l'OS proposé avec (&lt;tt class="docutils literal"&gt;Raspberry OS&lt;/tt&gt; anciennement appelé
&lt;tt class="docutils literal"&gt;Raspbian&lt;/tt&gt;) n'a pas réussi à me conquérir. Beaucoup de modifications de
cet OS ne me plaisent pas énormément, &lt;tt class="docutils literal"&gt;Trixie&lt;/tt&gt; n'est pas encore proposé
et la surcouche Raspberry me semble lourde.&lt;/p&gt;
&lt;p&gt;Théoriquement, Debian est compatible avec le Raspberry PI, mais pour
l'installer on quitte le côté &amp;quot;j'écris sur la carte SD, j'envoie, bisous&amp;quot;.
Et c'est justement ce qu'on va faire ici.&lt;/p&gt;
&lt;p&gt;Alors attention, tout d'abord je n'ai testé que sur un Raspberry 3B+ et 4.
Ensuite le projet Raspberry a quand même édité un peu de code notamment
sur la gestion des ventilateurs du POE Hat (lorsque j'écris ces lignes mon
Raspberry PI4 est en sécurité suite à une surchauffe). Je ne saurais être
tenu responsable des dégâts occasionnés sur vos Raspberry.&lt;/p&gt;
&lt;p&gt;Maintenant que vous êtes averti et que mon Raspberry est refroidi on va
pouvoir s'atteler à la préparation de la création de la MicroSD bootable.&lt;/p&gt;
&lt;div class="section" id="la-methode-fun"&gt;
&lt;h2&gt;La méthode fun&lt;/h2&gt;
&lt;p&gt;Bien évidemment il y a deux approches, une fait à la main, c'était fun
mais dans le cas spécifique d'utilisation du POE HAT c'était cuit
(littéralement), car le Kernel maison de Raspberry (juste un fork hein,
rien de folichon) apporte quelques modifications pour justement ce HAT.
Même si évidemment on peut se débrouiller avec la Debian stock pour
récupérer le kernel côté Raspberry. Fork qui d'ailleurs a été fusionné
dans le kernel officiel mais dont l'option n'est pas compilée sur le
kernel Debian nativement.&lt;/p&gt;
&lt;p&gt;Mais je vais quand même vous donner la méthode fun, et ensuite la méthode
moins fun mais tout aussi efficace&lt;/p&gt;
&lt;p&gt;Si vous êtes sur une architecture amd64, vous allez devoir utiliser une sorte de
&amp;quot;virtualiseur&amp;quot; d'architecture. Son but sera d'émuler un comportement arm64
tout en réalisant des actions pour une architecture amd64.&lt;/p&gt;
&lt;p&gt;Pour celleux sur Debian ou dérivé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;qemu-user&lt;span class="w"&gt; &lt;/span&gt;qemu-user-binfmt&lt;span class="w"&gt; &lt;/span&gt;arch-install-scripts
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'embarque &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;arch-install-scripts&lt;/span&gt;&lt;/tt&gt; notamment pour utiliser arch-chroot qui
rajoute juste les points de montage &lt;tt class="docutils literal"&gt;/sys&lt;/tt&gt; et tout&lt;/p&gt;
&lt;p&gt;Pour celleux sur Archlinux ou dérivé&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;debian-archive-keyrings&lt;span class="w"&gt; &lt;/span&gt;qemu-user&lt;span class="w"&gt; &lt;/span&gt;qemu-user-binfmt
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sur Archlinux j'embarque &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;debian-archive-keyrings&lt;/span&gt;&lt;/tt&gt; pour valider la signature
des paquets&lt;/p&gt;
&lt;p&gt;Une fois le système prêt, on va passer au partitionnement de la carte SD. Pour
cela il va nous falloir une partition de 256Mo (personnellement la mienne fait
512Mo) de type &lt;tt class="docutils literal"&gt;W95 FAT32 (LBA)&lt;/tt&gt; qui sera un secteur d'amorçage. Le reste
sera une partition Linux standard.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@mul&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# fdisk /dev/sdd&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Commande&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="s1"&gt;&amp;#39;aide) : n&lt;/span&gt;
&lt;span class="s1"&gt; Type de partition&lt;/span&gt;
&lt;span class="s1"&gt;    p   primaire (0 primaire, 0 étendue, 4 libre)&lt;/span&gt;
&lt;span class="s1"&gt;    e   étendue (conteneur pour partitions logiques)&lt;/span&gt;
&lt;span class="s1"&gt; Sélectionnez (p par défaut) :&lt;/span&gt;

&lt;span class="s1"&gt; Utilisation de la réponse p par défaut.&lt;/span&gt;
&lt;span class="s1"&gt; Numéro de partition (1-4, 1 par défaut) :&lt;/span&gt;
&lt;span class="s1"&gt; Premier secteur (2048-124735487, 2048 par défaut) :&lt;/span&gt;
&lt;span class="s1"&gt; Dernier secteur, +/-secteurs ou +/-taille{K,M,G,T,P} (2048-124735487, 124735487 par défaut) : +512M&lt;/span&gt;

&lt;span class="s1"&gt; Une nouvelle partition 1 de type « Linux » et de taille 512 MiB a été créée.&lt;/span&gt;

&lt;span class="s1"&gt; Commande (m pour l&amp;#39;&lt;/span&gt;aide&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;t
&lt;span class="w"&gt; &lt;/span&gt;Numéro&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,2,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Code&lt;span class="w"&gt; &lt;/span&gt;Hexa&lt;span class="w"&gt; &lt;/span&gt;ou&lt;span class="w"&gt; &lt;/span&gt;synonyme&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;taper&lt;span class="w"&gt; &lt;/span&gt;L&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;afficher&lt;span class="w"&gt; &lt;/span&gt;tous&lt;span class="w"&gt; &lt;/span&gt;les&lt;span class="w"&gt; &lt;/span&gt;codes&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:0c

&lt;span class="w"&gt; &lt;/span&gt;Type&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;«&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;»&lt;span class="w"&gt; &lt;/span&gt;modifié&lt;span class="w"&gt; &lt;/span&gt;en&lt;span class="w"&gt; &lt;/span&gt;«&lt;span class="w"&gt; &lt;/span&gt;W95&lt;span class="w"&gt; &lt;/span&gt;FAT32&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;LBA&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;».

&lt;span class="w"&gt; &lt;/span&gt;Commande&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;aide&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;a
&lt;span class="w"&gt; &lt;/span&gt;Numéro&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,2,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;L’indicateur&lt;span class="w"&gt; &lt;/span&gt;d’amorçage&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;la&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;est&lt;span class="w"&gt; &lt;/span&gt;maintenant&lt;span class="w"&gt; &lt;/span&gt;activé.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La partition dédiée au boot est créée. On passe maintenant à la partition
globale qui va comporter tout le reste de la machine (je ne segmente pas sur
un raspberry pi j'avoue)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Commande&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;aide&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;n
Type&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partition
&lt;span class="w"&gt;   &lt;/span&gt;p&lt;span class="w"&gt;   &lt;/span&gt;primaire&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;primaire,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;étendue,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libre&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;e&lt;span class="w"&gt;   &lt;/span&gt;étendue&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;conteneur&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;partitions&lt;span class="w"&gt; &lt;/span&gt;logiques&lt;span class="o"&gt;)&lt;/span&gt;
Sélectionnez&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;p&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:

Utilisation&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;la&lt;span class="w"&gt; &lt;/span&gt;réponse&lt;span class="w"&gt; &lt;/span&gt;p&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut.
Numéro&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;-4,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:
Premier&lt;span class="w"&gt; &lt;/span&gt;secteur&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1050624&lt;/span&gt;-124735487,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1050624&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:
Dernier&lt;span class="w"&gt; &lt;/span&gt;secteur,&lt;span class="w"&gt; &lt;/span&gt;+/-secteurs&lt;span class="w"&gt; &lt;/span&gt;ou&lt;span class="w"&gt; &lt;/span&gt;+/-taille&lt;span class="o"&gt;{&lt;/span&gt;K,M,G,T,P&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1050624&lt;/span&gt;-124735487,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;124735487&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;par&lt;span class="w"&gt; &lt;/span&gt;défaut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:

Une&lt;span class="w"&gt; &lt;/span&gt;nouvelle&lt;span class="w"&gt; &lt;/span&gt;partition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;«&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;»&lt;span class="w"&gt; &lt;/span&gt;et&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;taille&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;59&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GiB&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;été&lt;span class="w"&gt; &lt;/span&gt;créée.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il n'y a plus qu'à enregistrer et c'est bon !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Commande&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="s1"&gt;&amp;#39;aide) : w&lt;/span&gt;

&lt;span class="s1"&gt;La table de partitions a été altérée.&lt;/span&gt;
&lt;span class="s1"&gt;Appel d&amp;#39;&lt;/span&gt;ioctl&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;relire&lt;span class="w"&gt; &lt;/span&gt;la&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;partitions.
Synchronisation&lt;span class="w"&gt; &lt;/span&gt;des&lt;span class="w"&gt; &lt;/span&gt;disques.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant que les partitions sont créées, on va s'attaquer
au formatage. C'est pas bien compliqué, on cherche du fat32 pour
la partition 1 et de l'ext4 pour la 2. Je les renomme quand
même en PIBOOT et PIROOT vous verrez pourquoi ensuite.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;PIBOOT&lt;span class="w"&gt; &lt;/span&gt;/dev/sda1
mkfs.ext4&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;PIROOT&lt;span class="w"&gt; &lt;/span&gt;/dev/sda2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant on monte ces partitions&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/dev/sdd2&lt;span class="w"&gt; &lt;/span&gt;/mnt
mkdir&lt;span class="w"&gt; &lt;/span&gt;-pv&lt;span class="w"&gt; &lt;/span&gt;/mnt/boot/firmware
mount&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/dev/sdd1&lt;span class="w"&gt; &lt;/span&gt;/mnt/boot/firmware
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et on y installe Debian !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;debootstrap&lt;span class="w"&gt; &lt;/span&gt;--arch&lt;span class="o"&gt;=&lt;/span&gt;arm64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;--components&lt;span class="o"&gt;=&lt;/span&gt;main,non-free,non-free-firmware&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;--variant&lt;span class="o"&gt;=&lt;/span&gt;minbase&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;--include&lt;span class="o"&gt;=&lt;/span&gt;bluez-firmware,ca-certificates,console-setup,dbus,dosfstools,e2fsprogs,firmware-brcm80211,firmware-misc-nonfree,iproute2,iw,libgpiod3,linux-image-arm64,lm-sensors,locales,man-db,less,raspi-firmware,sudo,systemd-resolved,systemd-sysv,systemd-timesyncd,vim,wpasupplicant,zstd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;--force-check-gpg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;trixie&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;/mnt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;http://deb.debian.org/debian
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En fonction des performances de votre microSD cela
peut être plus ou moins long.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez d'autres paquets sur votre Raspberry PI,
rajoutez dans le &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--include&lt;/span&gt;&lt;/tt&gt; ces paquets. Personnellement j'y ajoute
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;openssh-server,&lt;/span&gt; python3, gpg, &lt;span class="pre"&gt;bash-completion&lt;/span&gt;&lt;/tt&gt; pour pouvoir lancer
ansible juste derrière.&lt;/p&gt;
&lt;p&gt;Une fois tout cela terminé, on va générer les locales. Je mets
la &lt;tt class="docutils literal"&gt;fr_FR&lt;/tt&gt; pour la traduction française et la &lt;tt class="docutils literal"&gt;en_GB&lt;/tt&gt; en
fallback (parce que je ne veux pas de la &lt;tt class="docutils literal"&gt;en_US&lt;/tt&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fr_FR.UTF-8 UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/mnt/etc/locale.gen
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en_GB.UTF-8 UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/mnt/etc/locale.gen
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On configure le réseau avec systemd-networkd en indiquant
que toute carte réseau commençant par un &lt;tt class="docutils literal"&gt;e&lt;/tt&gt; est en DHCP. Au moins pour
le first boot c'est bon&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-pv&lt;span class="w"&gt; &lt;/span&gt;/mnt/etc/systemd/network/
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /mnt/etc/systemd/network/50-dhcp.network&lt;/span&gt;
&lt;span class="s"&gt;[Match]&lt;/span&gt;
&lt;span class="s"&gt;Name=e*&lt;/span&gt;
&lt;span class="s"&gt;[Network]&lt;/span&gt;
&lt;span class="s"&gt;DHCP=ipv4&lt;/span&gt;
&lt;span class="s"&gt;[DHCP]&lt;/span&gt;
&lt;span class="s"&gt;UseDNS=no&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On configure le fstab. Vous constaterez l'usage des labels
défini plus haut, cela permet d'ignorer si le support est une
carte SD, une clé USB, un NVME ou même un pigeon.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /mnt/etc/fstab&lt;/span&gt;
&lt;span class="s"&gt;LABEL=PIROOT / ext4 noatime 0 1&lt;/span&gt;
&lt;span class="s"&gt;LABEL=PIBOOT /boot/firmware vfat defaults 0 2&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On configure SSH vite fait pour une première connexion
en interdisant les mots de passe mais autorisant root&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /mnt/etc/ssh/sshd_config.d/rpi-first-boot-conf.ssh&lt;/span&gt;
&lt;span class="s"&gt;PasswordAuthentication no&lt;/span&gt;
&lt;span class="s"&gt;PermitEmptyPasswords no&lt;/span&gt;
&lt;span class="s"&gt;PermitRootLogin prohibit-password&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Forcément on ajoute notre clé SSH dans le fichier &lt;tt class="docutils literal"&gt;authorized_keys&lt;/tt&gt;
du compte root.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-vp&lt;span class="w"&gt; &lt;/span&gt;/mnt/root/.ssh/
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /mnt/root/.ssh/authorized_keys&lt;/span&gt;
&lt;span class="s"&gt;ssh-ed25519 votresuperbeclepubliquessh&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'aime bien les noms prédictibles, donc je force le ifnames
à 1 et je spécifie que le root est en ext4&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /mnt/etc/default/raspi-extra-cmdline&lt;/span&gt;
&lt;span class="s"&gt;rootfstype=ext4 elevator=deadline net.ifnames=1&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant on rentre dans le système avec arch-chroot
qui va s'occuper pour nous de faire tous les binds nécessaires&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;arch-chroot&lt;span class="w"&gt; &lt;/span&gt;/mnt
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on rajoute &lt;tt class="docutils literal"&gt;/sbin&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;/bin&lt;/tt&gt;, on déclare la variable
&lt;tt class="docutils literal"&gt;ROOTPART&lt;/tt&gt; en mentionnant le label de la partition root qui
sera utilisé dans le build de l'initramFS. Puis on génère les locales,
on active le NTP, on paramètre la timezone. On active au prochain
redémarrage netword et resolved, on définit le hostname.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;:/sbin:/bin&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ROOTPART&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;LABEL=PIROOT&amp;quot;&lt;/span&gt;
locale-gen
timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-ntp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-timezone&lt;span class="w"&gt; &lt;/span&gt;Europe/Paris
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-networkd
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved
hostnamectl&lt;span class="w"&gt; &lt;/span&gt;hostname&lt;span class="w"&gt; &lt;/span&gt;coincoin
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin on crée l'initramfs (enfin !), cela pourra prendre un peu
de temps en fonction de votre microSD&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;update-initramfs&lt;span class="w"&gt; &lt;/span&gt;-u
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on démonte tout&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
umount&lt;span class="w"&gt; &lt;/span&gt;/mnt/boot/firmware
umount&lt;span class="w"&gt; &lt;/span&gt;/mnt/
sync&lt;span class="p"&gt;;&lt;/span&gt;sync&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On branche dans le raspberry, on lance tout ça et TADAAAAAAAAAAAAAA
(normalement).&lt;/p&gt;
&lt;p&gt;Comme dit plus haut on perd quelques fonctionnalités, notamment le POE
HAT qui ne ventile plus rien. À partir de là soit on essaye de chopper
le kernel build par Raspberry, soit on tente de compiler notre propre
kernel, soit on se lance dans la méthode moins fun mais plus efficace.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-methode-moins-fun"&gt;
&lt;h2&gt;La méthode moins fun&lt;/h2&gt;
&lt;p&gt;Raspberry a sorti leur &lt;a class="reference external" href="https://github.com/RPi-Distro/pi-gen/"&gt;builder d'image&lt;/a&gt;, en gros c'est un énorme script
qui va passer par différente étape pour finaliser une image plus ou moins
complète. Étant donné qu'une image &lt;em&gt;light&lt;/em&gt; me suffit, je ne vais pas
dépasser l'étape 2. MAIS, et c'est là tout l'intérêt de la chose, c'est
qu'en modifiant à quelques endroits on peut retirer toutes les commandes
inutiles. Ça a l'avantage d'utiliser Debian et non Raspbian pour l'arm64 !&lt;/p&gt;
&lt;p&gt;Par exemple dans &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/pi-gen/src/branch/arm64"&gt;mon fork&lt;/a&gt; j'ai retiré network-manager et je passe par
toute la suite systemd. J'ai également retiré toute la suite de package de build
excepté python qui sera utilisé par Ansible.&lt;/p&gt;
&lt;p&gt;Pour le coup je ne peux pas trop expliquer, le readme est très explicite et au
final c'est &amp;quot;simple&amp;quot; si on est à chercher à faire un système adapté à vos besoins.&lt;/p&gt;
&lt;p&gt;En tout cas n'hésitez pas à utiliser mon fork, et si jamais il vous souhaitez que
je publie les images &lt;a class="reference external" href="https://dryusdan.space/hello"&gt;faites moi signe&lt;/a&gt; et je verrais ce que je peux faire :).&lt;/p&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;harrisonbroadbent"&gt;Harrison Broadbent&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 28 Sep 2025 14:00:00 +0200</pubDate><guid>tag:dryusdan.space,2025-09-28:/installer-une-debian-stock-sur-un-raspberry-pi</guid><category>Labs</category><category>Labs</category><category>Informatique</category></item><item><title>Est ce que je suis à la bourre dans mes articles ?</title><link>https://dryusdan.space/notes/2025/09/est-ce-que-je-suis-a-la-bourre-dans-mes-articles</link><description>&lt;p&gt;Oui !&lt;/p&gt;
&lt;p&gt;Je reviens dès que possible mais avec le début du nouveau travail et la vie familial j’ai pas trop de temps !&lt;/p&gt;
&lt;p&gt;Mais la rétrospective arrive ^^&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 15 Sep 2025 16:45:00 +0200</pubDate><guid>tag:dryusdan.space,2025-09-15:/notes/2025/09/est-ce-que-je-suis-a-la-bourre-dans-mes-articles</guid><category>notes</category></item><item><title>Rétrospective de juillet 2025</title><link>https://dryusdan.space/notes/2025/07/retrospective-juillet-2025</link><description>&lt;p&gt;C'est parti pour la retrospective de juillet. o/&lt;/p&gt;
&lt;p&gt;Comme à chaque fois, on commence par les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;149&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;1 079 minutes&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;524&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;3 minutes de lecture&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;12,1Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagéis sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;256,41km&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="jardin-enfin-balcon"&gt;
&lt;h2&gt;Jardin (enfin balcon)&lt;/h2&gt;
&lt;p&gt;Les fraisiers sont revenu à la vie et j'ai acquéri une petite pompe
solaire pour humidifié les plantes. Tout repars c'est vraiment cool !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="velo"&gt;
&lt;h2&gt;Vélo&lt;/h2&gt;
&lt;p&gt;Mon vélo quotidien est en train de mourir (roulement tout ça) et les pièces
sont de plus en plus spécifique... Donc je roule uniquement en Bullitt (j'ai mal
aux jambes)&lt;/p&gt;
&lt;p&gt;Et puis une autre nouvelle aujourd'hui mais on est en aout donc vous saurez ça
dans un mois !&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 06 Aug 2025 11:35:00 +0200</pubDate><guid>tag:dryusdan.space,2025-08-06:/notes/2025/07/retrospective-juillet-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Nouveau tattoo (encore)</title><link>https://dryusdan.space/notes/2025/08/nouveau-tattoo-encore</link><description>&lt;p&gt;Eh oui, encore un ! J'avoue que j'avais prévu
un nouveau tatouage Cyberpunk mais le projet nécessite
plus de temps.&lt;/p&gt;
&lt;p&gt;Du coup un petit tatouage pour l'été 😇&lt;/p&gt;
&lt;p&gt;&lt;img alt="Un timbre où il y a une forêt et une montagne" class="image-process-article-image" src="/content/images/2025/08/Yms.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;C'est toujours de &lt;a class="reference external" href="https://salehistoire.fr/tatoueurs-nantes/la-barbe"&gt;La Barbe Tattoo&lt;/a&gt; (&lt;a class="reference external" href="https://www.instagram.com/labarbetattoo/"&gt;Instagram&lt;/a&gt;).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 02 Aug 2025 18:15:00 +0200</pubDate><guid>tag:dryusdan.space,2025-08-02:/notes/2025/08/nouveau-tattoo-encore</guid><category>notes</category></item><item><title>Rétrospective de juin 2025</title><link>https://dryusdan.space/notes/2025/06/retrospective-juin-2025</link><description>&lt;p&gt;C'est parti pour la retrospective de juin (avec du retard). o/&lt;/p&gt;
&lt;p&gt;Comme à chaque fois, on commence par les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;2 395 minutes&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;1 453&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;7 minutes de lecture&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;14Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagéis sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;276,06km&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="projets"&gt;
&lt;h2&gt;Projets&lt;/h2&gt;
&lt;p&gt;J'en ai un sur le feu, je ne peux pas vous en dire plus
pour le moment.&lt;/p&gt;
&lt;p&gt;J'ai testé Apache Airflow au passage, c'est vraiment
intéressant comme outil.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="jardin-enfin-balcon"&gt;
&lt;h2&gt;Jardin (enfin balcon)&lt;/h2&gt;
&lt;p&gt;Dernière vague de chaleur, les fraisiers ont grillés. :(&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Un mois de juin pas très ouf, juillet est dans la même veine
je pense. On resiste à la chaleur, on cuit et le boulot est
naze.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 16 Jul 2025 09:15:00 +0200</pubDate><guid>tag:dryusdan.space,2025-07-16:/notes/2025/06/retrospective-juin-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Grid Legend : ça rigole pas</title><link>https://dryusdan.space/notes/2025/07/grid-legend-ca-rigole-pas</link><description>&lt;p&gt;J'ai relancé Grid Legend aujourd'hui. En soit le jeu est bien,
bien devant l'ancien Grid ou Dirt 5. J'aime beaucoup.&lt;/p&gt;
&lt;p&gt;Je l'ai testé sur mon simulateur et bordel la difficulté est
bien plus présente qu'avec la manette, ça fait plaisir (mais
j'ai perdu xD).&lt;/p&gt;
&lt;p&gt;Bref, top de chez top&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 14 Jul 2025 14:31:00 +0200</pubDate><guid>tag:dryusdan.space,2025-07-14:/notes/2025/07/grid-legend-ca-rigole-pas</guid><category>notes</category><category>Jeux vidéo</category></item><item><title>Retour sur Kagi</title><link>https://dryusdan.space/retour-sur-kagi</link><description>&lt;p&gt;Il y a un mois &lt;a class="reference external" href="/notes/2025/06/je-m-en-fais-tester-kagi"&gt;je vous partageais&lt;/a&gt; que j'allais tester &lt;a class="reference external" href="https://kagi.com/"&gt;Kagi&lt;/a&gt;.
Beaucoup d'entre vous m'ont partagé vouloir un retour, donc le voici 😁&lt;/p&gt;
&lt;p&gt;Déjà qu'est-ce que c'est que Kagi ? Kagi c'est un mix entre un moteur de
recherche et un méta moteur de recherche mais payant. Pourquoi ? Parce que faire un index
à partir de 0 c'est long. Donc il y a un mix.&lt;/p&gt;
&lt;p&gt;Alors quelle grosse différence ? Bon, déjà 10€/mois, c'est un certain prix en effet. (On me signal
que je suis un bon consommateur, certain⋅e⋅s de mes abonné⋅e⋅s ne consomme pas autant et le forfait à
6€ suffit).
Kagi indique n'afficher aucune pub ni ne revend d'information. Outre chercher (🥁) à se financer
sans la revente de donnée, kagi possède ses propres crawler qui ont pour but de réduire au maximum
la dépendance avec d'autres moteurs de recherche legacy (Kagi est un moteur et méta moteur de recherche).
Autre gros point positif on peut adapter sa recherche. Par exemple le site officiel (genre la
doc PostgreSQL) est intéressant, on le &amp;quot;force&amp;quot; à remonter plus facilement que certains sites
qu'on pense être des sites 100% basé sur l'IA&lt;/p&gt;
&lt;p&gt;&lt;img alt="capture_postgres" src="/content/images/2025/07/capture_2025-07-07.png" /&gt;&lt;/p&gt;
&lt;p&gt;Bon ce qui me chafouine c'est le côté métamoteur et l'arrivée de l'IA chez eux aussi. L'IA est
désactivable d'un clic et côté moteur de recherche je n'ai pas l'impression
d'être pollué (quelques fois mais c'est rare) par des sites bidons ou généré par IA. Tandis
que sur du Google entre les liens sponsorisés et les sites pourri, j'ai l'impression de devoir
aller sur la page 2 voir 3 parfois.&lt;/p&gt;
&lt;p&gt;Niveau alternative il y a DuckDuckGo ou Ecosia par exemple qui sont très dépendants de Google ou
Qwant qui est très dépendant de Bing. Dans les métas moteurs opensource je pense voir SearXNG, mais
je me souviens d'avoir de gros problème avec les bots qui en abusaient (en soit peut être qu'un coup
d'Anubis devant peut résouddre le souci maintenant). J'ai &lt;a class="reference external" href="/et-si-on-partage-nos-recherches-avec-yacy"&gt;beaucoup apprécié Yacy&lt;/a&gt; mais le peu de
monde qui l'ont déployé et donc les résultats sont trop pas vraiment top (mais je garde mon node !).&lt;/p&gt;
&lt;p&gt;Ça fais un bon mois que j'utilise Kagi et franchement j'apprécie beaucoup, c'est rapide, fluide,
intuitif. Bref, je recommande ;)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Je précise que cet article n'est pas sponsorisé, mais si Kagi a envie
de m'offrir un ou deux mois, je ne dis pas non hein 😇&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 06 Jul 2025 15:25:00 +0200</pubDate><guid>tag:dryusdan.space,2025-07-06:/retour-sur-kagi</guid><category>En vrac</category><category>Informatique</category></item><item><title>Petit plaisir des CD</title><link>https://dryusdan.space/notes/2025/06/petit-plaisir-des-cd</link><description>&lt;p&gt;J'aime bien acheter des CDs, t'as toujours un petit
truc en plus, une attention particulière (j'ai reçu un
mot notamment), des photos, une infographie, des explications...&lt;/p&gt;
&lt;p&gt;Bref, toujours un petit banger à chaque fois :3&lt;/p&gt;
&lt;p&gt;(Après est-ce que c'est parce que c'est pas de l'énorme production
mais plus des indés ? Peut-être)&lt;/p&gt;
&lt;img alt="L'album porte du désert de Scylla et Furax Barbarossa avec une petite encoche d'où est sorti un petit livret." class="image-process-article-image" src="/content/images/2025/06/IMG_4891.jpg" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 21 Jun 2025 17:46:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-21:/notes/2025/06/petit-plaisir-des-cd</guid><category>notes</category><category>Musique</category></item><item><title>Dryusdan.space est accessible via Netcat !</title><link>https://dryusdan.space/notes/2025/06/dryusdan-space-est-accessible-via-netcat</link><description>&lt;p&gt;En ce moment je passe mes journées à jongler entre Microsoft
Teams et Excel (en passant par SharePoint et autre truc là) qui
sont un délire d'interface web horrible et moche (genre VRAIMENT).&lt;/p&gt;
&lt;p&gt;J'avais besoin de vide, de changement d'air d'être loin de tout
truc qui ressemble à du web lourd et lent ! Bon nombre d'entre
vous me dirons tout simplement de prendre un livre (ce qui est
une bonne réponse) mais ce n'est pas assez technique 😜&lt;/p&gt;
&lt;p&gt;Il est vrai aussi que j'avais aussi envie de me lancer dans un projet
de minitel mais je n'ai clairement pas les connaissances. Et là &lt;a class="reference external" href="https://von.zone"&gt;Von&lt;/a&gt;
me parle de BBS qui est accessible via &lt;tt class="docutils literal"&gt;netcat&lt;/tt&gt;. Roh trop bien !&lt;/p&gt;
&lt;p&gt;Bref, j'ai développé un petit serveur TCP tout bête en Python qui va
chercher des fichiers textes généré grâce à un &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/pelican-text"&gt;plugin pelican&lt;/a&gt; basé
sur &lt;a class="reference external" href="https://github.com/flozz/rst2gemtext"&gt;une librairie&lt;/a&gt; de &lt;a class="reference external" href="https://blog.flozz.fr/"&gt;FLozz&lt;/a&gt; un poil retravaillé.&lt;/p&gt;
&lt;p&gt;Ha, et pour y accéder, rien de plus simple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nc&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9334&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On va dire que c'est pour les 10 ans du blog 😁&lt;/p&gt;
&lt;p&gt;(PS, j'ai envie de faire évoluer ce projet, faire un truc un
peu plus complet que juste mon blog en format texte)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 13 Jun 2025 17:30:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-13:/notes/2025/06/dryusdan-space-est-accessible-via-netcat</guid><category>notes</category><category>Informatique</category></item><item><title>Ho mais j'ai oublié les 10 ans du blog :o</title><link>https://dryusdan.space/notes/2025/06/ho-mais-j-ai-oublie-les-10-ans-du-blog</link><description>&lt;p&gt;J'ai oublié les 10 ans du blog, c'était le 7 juin 2015
avec l'article &lt;a class="reference external" href="https://dryusdan.space/le-debut-du-commencement"&gt;Le début du commencement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le blog a pas mal évolué quand même ^^&lt;/p&gt;
&lt;p&gt;Merci de me lire depuis tout ce temps :3&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 13 Jun 2025 11:10:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-13:/notes/2025/06/ho-mais-j-ai-oublie-les-10-ans-du-blog</guid><category>notes</category></item><item><title>Écrire le point médian sous Linux en AZERTY</title><link>https://dryusdan.space/notes/2025/06/ecrire-le-point-median-sous-linux</link><description>&lt;p&gt;Je n'arrivais pas à faire de point médian &lt;tt class="docutils literal"&gt;⋅&lt;/tt&gt; et j'avoue
que sur les recherches internet il y avait de tout et rien
qui fonctionnait franchement pour moi. Le plus proche était
le point des listes à puces ou une petite croix &lt;tt class="docutils literal"&gt;×&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Et là, je vous ai demandé sur le fediverse... Et il y avait
tout un tas d'option différente, toute dépendante du layout.
Layout qui pour moi reste l'AZERTY, car je n'ai pas eu la volonté
d'en essayer un autre.&lt;/p&gt;
&lt;p&gt;J'ai donc appris deux méthodes :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;La touche &lt;tt class="docutils literal"&gt;compose&lt;/tt&gt; qui permet
de faire © en tapant &lt;tt class="docutils literal"&gt;super / windows&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;o&lt;/tt&gt; puis &lt;tt class="docutils literal"&gt;c&lt;/tt&gt; on
obtient &lt;tt class="docutils literal"&gt;©&lt;/tt&gt; ou encore &lt;tt class="docutils literal"&gt;super / windows&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;shift&lt;/tt&gt;&amp;nbsp;+ &lt;tt class="docutils literal"&gt;b&lt;/tt&gt;
puis a on obtient &lt;tt class="docutils literal"&gt;ẵ&lt;/tt&gt; (je ne sais même pas ce que c'est comme
lettre). Pour le point median c'est &lt;tt class="docutils literal"&gt;super / windows&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;shift&lt;/tt&gt;
+ &lt;tt class="docutils literal"&gt;.&lt;/tt&gt; puis &lt;tt class="docutils literal"&gt;-&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Utiliser le layout &lt;tt class="docutils literal"&gt;FR (variante)&lt;/tt&gt; quhi gère tout un tas d'option
cool tel que les lettres accentuées majuscule. Et pour le fameux point
un simple &lt;tt class="docutils literal"&gt;alt gr&lt;/tt&gt; (ou alt pas content) + &lt;tt class="docutils literal"&gt;shift&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;.&lt;/tt&gt; : ⋅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voilà !&lt;/p&gt;
&lt;p&gt;Merci à tous⋅tes pour vos réponses !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 08 Jun 2025 20:10:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-08:/notes/2025/06/ecrire-le-point-median-sous-linux</guid><category>notes</category><category>Informatique</category><category>Linux</category><category>Écriture</category></item><item><title>Montage de mon nouveau PC \o/</title><link>https://dryusdan.space/notes/2025/06/montage-de-mon-nouveau-pc</link><description>&lt;p&gt;Nouveau petit PC à la maison, celui ci est... Portable
Et oui, c'est un Framework.&lt;/p&gt;
&lt;img alt="Le PC Framework pas encore monté avec tout ses composants" class="image-process-article-image" src="/content/images/2025/06/4834.png" /&gt;
&lt;p&gt;C'est très satisfaisant de le monter mais également
de voir ce qu'on peut réparer ou améliorer à l'avenir !&lt;/p&gt;
&lt;img alt="Le PC framework, carte mère visible sans RAM ni NVME." class="image-process-article-image" src="/content/images/2025/06/4835.png" /&gt;
&lt;p&gt;Et c'est tout bien rangé, c'est super stylé (en
tout cas j'ai bien apprécié)&lt;/p&gt;
&lt;img alt="Le PC framework, carte mère visible avec RAM et NVME." class="image-process-article-image" src="/content/images/2025/06/4836.png" /&gt;
&lt;img alt="Le PC framework monté." class="image-process-article-image" src="/content/images/2025/06/4838.png" /&gt;
&lt;p&gt;Je me suis cependant loupé sur un truc, pensant pouvoir
démonter et remonter la carte graphique alors que...
Vaut mieux éviter.&lt;/p&gt;
&lt;p&gt;Allez, je vous laisse le beau covering de mon PC.&lt;/p&gt;
&lt;img alt="Le PC framework fermé, avec diverse stickers tel que human dont chaque lettre est écrite avec les couleurs d'un drapeau de la communauté LGBTQA+. Un autre sticker indique &amp;quot;testé c'est douté&amp;quot;. Il y a un vélo, un manchot linux, le logo archlinx, une NES dont la nature commence à reprendre ses droits, le logo bash et Vim." class="image-process-article-image" src="/content/images/2025/06/4839.png" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 06 Jun 2025 22:00:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-06:/notes/2025/06/montage-de-mon-nouveau-pc</guid><category>notes</category><category>Informatique</category></item><item><title>Je m'en fais tester Kagi</title><link>https://dryusdan.space/notes/2025/06/je-m-en-fais-tester-kagi</link><description>&lt;p&gt;&lt;a class="reference external" href="https://lord.re"&gt;Lord&lt;/a&gt; en a parlé à diverse reprise sur IRC ou sur le
fediverse : &lt;a class="reference external" href="https://kagi.com/"&gt;Kagi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il s'agit d'un moteur de recherche (j'y revient) payant
pour ne pas faire de tracking. Ils génèrent leurs propres
Index mais se repose encore sur diverse moteur de recherche.
C'est donc un mix entre un moteur de recherche et d'un meta
moteur de recherche.&lt;/p&gt;
&lt;p&gt;En tout cas j'en entends que du bien et je vais enfin pouvoir
tester &lt;a class="reference external" href="https://kagi.com/"&gt;Kagi&lt;/a&gt;. Je vous ferai peut-être un article plus tard.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 04 Jun 2025 19:08:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-04:/notes/2025/06/je-m-en-fais-tester-kagi</guid><category>notes</category><category>Informatique</category></item><item><title>Publier les routes IPv6 de votre lab</title><link>https://dryusdan.space/notes/2025/06/publier-les-routes-ipv6-de-votre-lab</link><description>&lt;p&gt;La Freebox offre la possibilité de gérer votre /64 d'IPv6.
Ça a quelques avantages notamment la gestion complète des règles
de pare-feu pour cette range ci, tout en utilisant le pare-feu
par défaut pour le range &amp;quot;délégué à la Freebox&amp;quot;. En gros ça permet
d'éviter que votre imprimante ou votre TV soit accessible en
IPv6 sur la planète entière tout en profitant de l'IPv6 pour
votre lab.&lt;/p&gt;
&lt;p&gt;Sauf que sur votre ordinateur ne peut pas accéder à votre lab en
IPv6&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;mtr&lt;span class="w"&gt; &lt;/span&gt;-brwe&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a6::d
Start:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-04T06:26:09+0200
HOST:&lt;span class="w"&gt; &lt;/span&gt;Nemp&lt;span class="w"&gt;                 &lt;/span&gt;Loss%&lt;span class="w"&gt;   &lt;/span&gt;Snt&lt;span class="w"&gt;   &lt;/span&gt;Last&lt;span class="w"&gt;   &lt;/span&gt;Avg&lt;span class="w"&gt;  &lt;/span&gt;Best&lt;span class="w"&gt;  &lt;/span&gt;Wrst&lt;span class="w"&gt; &lt;/span&gt;StDev
&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a0::1&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9
&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;???&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;.0&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alors que l'extérieur le peut très bien&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@mail&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# mtr -brwe 2a01:e0a:21a:17a6::d&lt;/span&gt;
Start:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-04T06:23:02+0200
HOST:&lt;span class="w"&gt; &lt;/span&gt;mail.dryusdan.fr&lt;span class="w"&gt;                                        &lt;/span&gt;Loss%&lt;span class="w"&gt;   &lt;/span&gt;Snt&lt;span class="w"&gt;   &lt;/span&gt;Last&lt;span class="w"&gt;   &lt;/span&gt;Avg&lt;span class="w"&gt;  &lt;/span&gt;Best&lt;span class="w"&gt;  &lt;/span&gt;Wrst&lt;span class="w"&gt; &lt;/span&gt;StDev
&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;fe80::&lt;span class="w"&gt;                                                   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.3&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.2&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9
&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18498&lt;/span&gt;.your-cloud.host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;2a01:4f8:0:e0c0::580b&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.3&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.3
&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:4f8:0:e0c0::5801&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.3&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;57&lt;/span&gt;.1&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;193&lt;/span&gt;.6&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;65&lt;/span&gt;.5
&lt;span class="m"&gt;4&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;spine6.cloud1.nbg1.hetzner.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;2a01:4f8:0:e0c0::a1dd&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.1&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.3&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4
&lt;span class="m"&gt;5&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;spine15.cloud1.nbg1.hetzner.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;2a01:4f8:0:e0c0::a289&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.7&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;6&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;core12.nbg1.hetzner.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;2a01:4f8:0:3::2e1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.8&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;7&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;core4.fra.hetzner.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;2a01:4f8:0:3::f5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;decix.proxad.net&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2001&lt;/span&gt;:7f8::3022:0:1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.6&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.5&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.4&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.8&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;9&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e04:6003::6&lt;span class="w"&gt;                                        &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.4&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.5&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.3&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.2
&lt;span class="m"&gt;10&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e00:6000::5&lt;span class="w"&gt;                                        &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.6&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.6&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;11&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:600e::1&lt;span class="w"&gt;                                        &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0
&lt;span class="m"&gt;12&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:2009::1&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.7&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.2&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.2
&lt;span class="m"&gt;13&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:2008::1&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.7&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.2&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;14&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:2007::1&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;.1&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;.1&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4
&lt;span class="m"&gt;15&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:2006::5&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.7&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="m"&gt;16&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e03:2006:1700:fe00::8bce&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.5&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.6&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.2&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.8
&lt;span class="m"&gt;17&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a0::1&lt;span class="w"&gt;                                     &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.2&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.7&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.7&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4
&lt;span class="m"&gt;18&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a0:1:5ee:bad:c0de&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;.1&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.4&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;.1&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4
&lt;span class="m"&gt;19&lt;/span&gt;.&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a6::d&lt;span class="w"&gt;                                     &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0%&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.5&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.3&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;.7&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.3
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il semblerait donc que la Freebox n'avertit pas votre /64 lab sur
votre réseau standard. Dans le fonctionnement la box sait
vers qui router mais personne d'autre&lt;/p&gt;
&lt;p&gt;Qu'à cela ne tienne, on va utiliser le paquet Router Advertisement (RA)
en IPv6 pour informer tout le monde sur le LAN (en fe80:: donc)
qu'une route est disponible et ça... Avec &lt;a class="reference external" href="https://radvd.litech.org/"&gt;RADVD&lt;/a&gt; !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;interface&lt;span class="w"&gt; &lt;/span&gt;eno1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;AdvSendAdvert&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;AdvDefaultLifetime&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;route&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a7::/64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;route&lt;span class="w"&gt; &lt;/span&gt;2a01:e0a:21a:17a6::/64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En gros, j'indique avec &lt;tt class="docutils literal"&gt;AdvSendAdvert on&lt;/tt&gt; que l'interface eno1
(celle branchée sur ma Freeboite) répond aux sollicitations RA, il
faut l'activer sinon ça sert à rien. Avec &lt;tt class="docutils literal"&gt;AdvDefaultLifetime 0;&lt;/tt&gt;
j'indique que ce routeur n'est pas un routeur et donc la route
&lt;tt class="docutils literal"&gt;default&lt;/tt&gt; ne doit pas lui être associé. Et ensuite je lui donne
mes routes à transmettre sur le réseau.&lt;/p&gt;
&lt;p&gt;Et voilà, vous pouvez accéder à votre lab en IPv6 de votre ordinateur
sans trifouiller les routes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 04 Jun 2025 06:46:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-04:/notes/2025/06/publier-les-routes-ipv6-de-votre-lab</guid><category>notes</category><category>Labs</category><category>Informatique</category><category>Linux</category></item><item><title>Rétrospective de mai 2025</title><link>https://dryusdan.space/retrospective-mai-2025</link><description>&lt;p&gt;C'est parti pour la retrospective de mai. o/&lt;/p&gt;
&lt;p&gt;Comme à chaque fois, on commence par les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;276&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Minutes de musique écouté&lt;/td&gt;
&lt;td&gt;2 819 minutes&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;6 807&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;37 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;25.53Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagéis sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;238,20km&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="projets"&gt;
&lt;h2&gt;Projets&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/garmin-to-fittrackee"&gt;Garmin-to-fittrackee&lt;/a&gt; (&lt;a class="reference external" href="https://github.com/Dryusdan/garmin-to-fittrackee"&gt;sur Github&lt;/a&gt;) semble de plus en plus utilisé et
de plus en plus apprécié. Je reçois de plus en plus d'issues (principalement pour
améliorer :p ). Je m'attendais pas à ce que ce petit script soit utilisé.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/TecharoHQ/anubis"&gt;Anubis&lt;/a&gt; c'est pas de moi, mais je suis le 6ème contributeur et mon pseudo est
dans toutes les dernières releases :D (En vrai je fais que du yaml mais bon).&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://madeinfrance.bike"&gt;Madeinfrance.bike&lt;/a&gt; je pense le fermer. J'ai découvert de bonne adresses,
mais c'est un temps monstrueux pour chercher, faire les mails, écrire... Et vu l'état
des recherches Google, ça m'étonnerai que quelqu'un tombe dessus. Je l'ai vu passer
à un endroit mais rien de bien fun. Si vous vous sentez chaud pour continuer l'aventure,
contactez-moi ;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="competences"&gt;
&lt;h2&gt;Compétences&lt;/h2&gt;
&lt;p&gt;Je me suis attaqué à Terraform (enfin OpenTofu). Entre une doc approximative si on quitte
le provider AWS, les recherches Google qui ne trouvent plus rien hormis des sites qui n'ont
fait que cloner la doc officielle c'est pas franchement la panacée. Enfin, en 4j c'était plutôt
bien ficelé. Et dire qu'on m'a refusé des postes en arguant que Terraform c'est dur si on ne
connait pas, c'te blague.&lt;/p&gt;
&lt;p&gt;Bref, y a un nouvel article sur le feu et j'ai acquis une nouvelle compétence.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="boulots"&gt;
&lt;h2&gt;Boulots&lt;/h2&gt;
&lt;p&gt;Vous l'avez sûrement vu passer, le dernier changement c'est mensonge sur mensonge et j'ai arrêté
la technique pour faire du clickodrome et de l'Excel toute la journée alors que je devais faire
du Linux, Ansible et Python toute la journée... Et la recherche est pas aisée. D'un autre côté
c'est un peu ce que tout le monde vie en fait, juste j'étais sur mon nuage d'informaticien et là
BAM l'abondance c'est fini.&lt;/p&gt;
&lt;p&gt;J'ai quand même l'impression que les CVs et les lettres de motivation ne sont juste plus lus. Je suis
même quasiment sûr que je si je fais un nuage de tag en guise de CV que ça serai pareil.
Alors oui je refais des lettres de motivations et oui c'est une purge codifiée que je n'approuve pas.
Cependant quand on vient me demander qu'est-ce que je sais faire avec Proxmox et est-ce que je fais
de la haute disponibilité quand sur mon CV il y a un lien vers &lt;a class="reference external" href="https://dryusdan.space/installer-un-cluster-proxmox-ceph-tinc-openvswitch"&gt;un de mes articles&lt;/a&gt;. Ou encore&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que vous savez utiliser Ansible ?&lt;/blockquote&gt;
&lt;p&gt;C'est marqué sur mon CV, sur mon blog, sur mon git qui est lié à mon CV, t'as des rôles accessibles
publiquement et tout.&lt;/p&gt;
&lt;blockquote&gt;
On a beaucoup de serveur à gérer, vous avez du en gérer combien dans votre expérience
professionnelle ?&lt;/blockquote&gt;
&lt;p&gt;C'est marqué sur la première page, plus de 17 000 serveurs en fait... Surtout qu'après on me dit
que eux c'est plus : moins de 8 000... Même la réponse n'a pas été écoutée.&lt;/p&gt;
&lt;blockquote&gt;
Vous avez déjà utilisé du Linux dans votre vie professionnelle ?&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Je n'invente rien en plus, c'est vraiment des questions qui m'ont été posées telles quelles.&lt;/p&gt;
&lt;p&gt;J'ai quand même passé un temps monstrueux à juste réciter mon CV pour au final qu'on me dise
&amp;quot;Ha ouai, nan mais vous connaissez pas Terraform ni K8S, donc on vous prend pas&amp;quot;.
C'était visible que je ne les maitrise, vu que j'affiche Oracle DB mais pas Terraform c'est
PEUT-ÊTRE PARCE QUE JE NE LE MAITRISE PAS... Dans les énormes blagues j'ai eu un refus d'une
entreprise américaine qui m'a refusé parce que j'étais stressé (à la rigueur je peux comprendre
quand je suis censé être face aux clients) alors que j'ai passé leur test technique face à
un Bostonnais (niveau accent c'est velu) et j'ai essuyé un refus d'une boite française parce
que je ne savais pas parler anglais (lol). J'ai aussi eu le droit à &amp;quot;nan mais vous êtes
qu'administrateur système&amp;quot;. C'est fatiguant parce qu'entre DevOps, SysOps, SRE, administrateur
système, cloud architect plus personne ne sait à quoi correspond quelle fiche de poste... Et
alors osez expliquer que vous êtes quelqu'un qui adore quand c'est cassé et que vous aimez tout
autant faire en sorte que ça ne casse plus voir même améliorer la stabilité générale. La galère.
Si c'est cassé et qu'il y a du diagnostic à faire et c'est donc le travail d'un tech support et
donc d'un administrateur système et donc niveau salaire vous vous asseyez dessus. (D'ailleurs il
faudrait  un nom genre Sys gyroscope engineer pour parler d'un poste dont le but c'est de faire
de la stabilité)&lt;/p&gt;
&lt;p&gt;Bref, ça m'énerve, j'ai essuyé beaucoup de refus sur des conneries, je finis par perdre confiance
en moi, donc le stress augmente de plus en plus, donc j'échoue de plus en plus... On en est à un stade
où j'ai galéré sur du bash 😭 (alors que pour la blague j'ai fait un serveur un serveur HTTP dans ce
langage).&lt;/p&gt;
&lt;p&gt;Anyway, si pour une fois quelqu'un lit mon CV et tombe là-dessus ça va surement jouer en ma
défaveur... Mais vu que personne ne le lit, j'ai 0 inquiétude 😂 (et si jamais vous avez
lu jusqu'ici, dites &amp;quot;&lt;em&gt;cacahuètes&lt;/em&gt;&amp;quot; ! ). Si, pour une ou une autre vous voulez &lt;a class="reference external" href="/content/pdfs/CV-fr-anon.pdf"&gt;mon CV&lt;/a&gt; (au hasard vous avez
un poste qui se libère pour un SRE), le voici &lt;a class="reference external" href="/content/pdfs/CV-fr-anon.pdf"&gt;en français&lt;/a&gt; et &lt;a class="reference external" href="/content/pdfs/CV-en-anon.pdf"&gt;en anglais&lt;/a&gt; (en français et en anglais,
je vais pas leak mon adresse postale ou mon numéro de téléphone (après ça doit trainer dans la nature pas loin
de mon RIB vu les dernières fuite de donnée.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="jardin-enfin-balcon"&gt;
&lt;h2&gt;Jardin (enfin balcon)&lt;/h2&gt;
&lt;p&gt;Les fraisiers sont bien repartis ! Mais le citronier se fait bouffer par les cochenilles, c'est assez résistant
comme bestiole.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 02 Jun 2025 15:50:00 +0200</pubDate><guid>tag:dryusdan.space,2025-06-02:/retrospective-mai-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Petit album sympa : Porte du desert</title><link>https://dryusdan.space/notes/2025/05/petit-album-sympa</link><description>&lt;p&gt;Scylla et Furax Barbarossa ont fait un petit feat sur un album complet
sorti hier : Porte du desert.&lt;/p&gt;
&lt;p&gt;Et bah franchement je recommande&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 24 May 2025 08:19:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-24:/notes/2025/05/petit-album-sympa</guid><category>notes</category><category>Musique</category></item><item><title>Jour 3</title><link>https://dryusdan.space/notes/2025/05/jour-3</link><description>&lt;p&gt;Ouai vous allez pleurer, vous allez faire que de l’Excel et des PV quand vous aurez les accès. Vous allez dire « on vous a pas vendu ça »&lt;/p&gt;
&lt;p&gt;😶😐😑😵😵‍💫&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 14 May 2025 16:20:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-14:/notes/2025/05/jour-3</guid><category>notes</category></item><item><title>Nouveau job : jour 2 (je cherche un job)</title><link>https://dryusdan.space/notes/2025/05/nouveau-job-jour-2-je-cherche-un-job</link><description>&lt;p&gt;Bon, c’était pas une série mais vu le sketch que c’est…&lt;/p&gt;
&lt;p&gt;Ingénieur DevOps Sénior, je viens d’avoir un PC, je commence à avoir les infos (mais pas les accès). Le pc est de prêt, le miens arrivera éventuellement cette semaine.&lt;/p&gt;
&lt;p&gt;En résumé : je bosse sur Microsoft et Office 365, sans accès à internet du tout et mon job va être de relire des playbook ansible et de passer des données d’un Excel à une interface web entrecoupé de réunion .&lt;/p&gt;
&lt;p&gt;On m’a menti, je devais faire de la technique, de la recherche de bug, du patch… Sauf que les RACI ne sont pas d’accord.&lt;/p&gt;
&lt;p&gt;Bref, je cherche un job (again)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 13 May 2025 14:28:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-13:/notes/2025/05/nouveau-job-jour-2-je-cherche-un-job</guid><category>notes</category></item><item><title>Nouveau job, jour 1</title><link>https://dryusdan.space/notes/2025/05/nouveau-job-jour-1</link><description>&lt;p&gt;Allez, nouveau boulot, pas très enchanté mais ils m’ont mit dans le bain. J’ai pas de PC… Et officiellement j’en ai pas rattaché à mon nom. Peut être qu’il arrivera demain ou après demain. Peut être que je pourrais commander un frame.work et qu’il arrive
avant d’en avoir un.&lt;/p&gt;
&lt;p&gt;On dira ce qu’on voudra du public mais au moins j’avais des outils de travail le jour même.&lt;/p&gt;
&lt;p&gt;(Nan ça sera pas une série hein)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 12 May 2025 14:31:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-12:/notes/2025/05/nouveau-job-jour-1</guid><category>notes</category></item><item><title>HTTPS et SSH sont dans un bateau (nommé HAProxy)</title><link>https://dryusdan.space/https-et-ssh-sont-dans-un-bateau-nomme-haproxy</link><description>&lt;p&gt;Cet article devait être une note mais... Il s'avère que j'ai creusé
deux trois points que je vais expliquer ici ce qui ferait une très longue
note.&lt;/p&gt;
&lt;p&gt;L'idée aujourd'hui ne va pas être comment faire passer SSH dans de l'HTTPS
car Victor Hery l'a déjà bien expliqué dans &lt;a class="reference external" href="https://blog.victor-hery.com/2024/02/ssh-openssl-haproxy.html"&gt;son article&lt;/a&gt; mais d'améliorer ce
petit bout de configuration.
D'ailleurs, si vous n'avez pas lu son article, go ! Je vais pas rentrer dans
les mêmes détails que Victor.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://blog.victor-hery.com/2024/02/ssh-openssl-haproxy.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;SSH over Openssl over Haproxy  - - contourner les blocages&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;contourner les blocages&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of SSH over Openssl over Haproxy  - - contourner les blocages page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of SSH over Openssl over Haproxy  - - contourner les blocages page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;De mon côté j'ai surtout essayé de réduire la configuration à ce qui m'intéressait
mais également utiliser les &lt;cite&gt;abstracts namespaces&lt;/cite&gt; et que dryusdan.space soit accessible
en HTTP/2.&lt;/p&gt;
&lt;div class="section" id="http-2-et-alpn-sont-dans-la-meme-barque"&gt;
&lt;h2&gt;HTTP/2 et ALPN sont dans la même barque&lt;/h2&gt;
&lt;p&gt;Lorsque j'ai testé l'accès à mon blog j'ai constaté que ce dernier me répondait en HTTP/1.1.
Pourtant en vérifiant sur le frontend http ce dernier me répondait bien en HTTP/2.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-I&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space
HTTP/1.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pourquoi un frontend TCP (donc par définition sur la couche 4 du &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI"&gt;modèle OSI&lt;/a&gt;) intervient
sur le choix du protocole ?  Ça devrait être le backend qui devrait dicter le protocole
applicatif (la couche 7 du même modèle) utilisé, pas le frontend. Sauf qu'ici, notre
frontend TCP fait un petit truc intéressant en plus que du simple proxy TCP : il
déchiffre aussi les paquets.&lt;/p&gt;
&lt;p&gt;Mais qu'est-ce que TLS vient faire dans le choix du protocole applicatif ?! Je vous assure
que c'est extrêmement simple et bien expliqué mais ça m'a valu un peu de recherche. Bon, cette
recherche se résume à : lire la RFC relative à HTTP/2 soit la &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7540"&gt;RFC 7540&lt;/a&gt; et plus spécifiquement
les chapitres : &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7540#section-3.1"&gt;3.1. HTTP/2 Version Identification&lt;/a&gt; et &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7540#section-3.3"&gt;3.3. Starting HTTP/2 for &amp;quot;https&amp;quot; URIs&lt;/a&gt;.
Les titres sont d'ailleurs suffisamment clairs pour éviter de lire toute la RFC.
Grace à cette lecture, on constate qu'on peut utiliser HTTP/2 sans TLS (j'ai appris l'inverse
quand HTTP/2 venait de sortir... Mais j'ai appris ça pendant mes études de développement web),
mais également lors de la négociation TLS ! Négociation qui, chez nous, se fait sur le frontend
TCP et non HTTP grâce à l'extension ALPN !&lt;/p&gt;
&lt;p&gt;ALPN qu'est-ce que c'est du coup ? Selon la &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7301"&gt;RFC 7301&lt;/a&gt; et la documentation passé juste au-dessus,
ALPN c'est une extension TLS qui se déroule lors de la négociation TLS. Lorsque le client (navigateur)
fait la première requête, il envoie, entre autres, les protocoles qu'il va gérer, un identifiant de
session, une clé aléatoire, des ciphers mais également l'&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Application-Layer&lt;/span&gt; Protocol Negotiation&lt;/tt&gt;
qui est ni plus ni moins que la liste des protocoles qu'il gère (HTTP/1.1 et HTTP/2). Et le serveur
répond quel protocole il sélectionne. Si le serveur ne répond pas à l'&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Application-Layer&lt;/span&gt; Protocol
Negotiation&lt;/tt&gt;, dans le cadre d'un navigateur ce dernier va automatiquement utiliser HTTP/1.1.&lt;/p&gt;
&lt;p&gt;&lt;img alt="La décomposition avec le logiciel Wireshark d'un paquet TLSv1.2 Client Hello. Il est mit en évidence ici l'extension application_layer_protocol_negociaition pour lister les différents protocol supporté (comme h2 pour HTTP/2 et http/1.1)" src="/content/images/2025/05/ClientHelloALPN.png" /&gt;
&lt;img alt="La décomposition avec le logiciel Wireshark d'un paquet TLSv1.2 Server Hello. Il est mit en évidence ici l'extension application_layer_protocol_negociaition pour indiquer l'utilisation du protocol h2 (pour HTTP/2)" src="/content/images/2025/05/ServerHelloALPN.png" /&gt;&lt;/p&gt;
&lt;p&gt;Dans notre cas, ALPN n'était pas activé dans le frontend TCP, donc la négociation TLS ne l'effectuait
pas résultant un fallback sur HTTP/1.1.&lt;/p&gt;
&lt;p&gt;&lt;img alt="La décomposition avec le logiciel Wireshark d'un paquet TLSv1.2 Server Hello. Il est mit en évidence ici l'absence de l'extension application_layer_protocol_negociaition." src="/content/images/2025/05/ServerHelloNoALPN.png" /&gt;&lt;/p&gt;
&lt;p&gt;Les exemples ci-dessus sont en TLS1.2 et non TLS1.3 car la négociation
du protocol applicatif présent dans un &lt;tt class="docutils literal"&gt;Server Hello&lt;/tt&gt; en TLS1.3 est chiffré.&lt;/p&gt;
&lt;p&gt;Pour HTTP/2 la modification est donc assez simple, la décision d'utiliser HTTP/1.1
ou HTTP/2 se réalisant lors de l'handshake TLS, il faut indiquer à HAProxy de proposer l'extension
ALPN et les protocoles HTTP/2 (h2) et HTTP/1.1 La &lt;a class="reference external" href="https://docs.haproxy.org/2.8/configuration.html#alpn%20%28Bind%20options%29"&gt;documentation d'HAProxy sur les options de bind&lt;/a&gt;
aurait essaye de nous aider bien qu'elle fasse une fixette sur le frontend HTTPS.&lt;/p&gt;
&lt;p&gt;Donc on modifie le bind en ajoutant les directives suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;bind :443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
bind :::443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On teste pour valider que cela fonctionne en HTTP/2&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-I&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space
HTTP/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant vous savez mettre HTTP/2 sur un frontend TCP HAProxy et pourquoi :D&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Bon, après m'être pas mal creusé la tête pour essayer de vous l'expliquer, &lt;a class="reference external" href="https://lord.re/"&gt;Lord&lt;/a&gt; et &lt;a class="reference external" href="https://hacktivis.me/"&gt;Lanodan&lt;/a&gt; sont
venu⋅e⋅s à ma rescousse et m'ont parlé d'un autre modèle qu'OSI : TCP/IP.
Bien que le modèle OSI est utilisé dans &lt;cite&gt;la documentation officielle de HAProxy&lt;/cite&gt;, le modèle
TCP/IP est un peu plus &amp;quot;léger&amp;quot; et moins strict que le modèle OSI. Le TLS se trouve en couche
applicative (5) et HTTP aussi (5). Dans l'&lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Transport_Layer_Security#R%C3%A9seau"&gt;article sur le TLS dans Wikipedia&lt;/a&gt; SSL a le cul entre
deux chaises :&lt;/p&gt;
&lt;blockquote&gt;
Dans la pile de protocole TCP/IP, SSL se situe entre la couche application
(comme HTTP, FTP, SMTP, etc.) et la couche transport TCP.&lt;/blockquote&gt;
&lt;p&gt;Et en creusant un peu avec ce qu'on m'avait dit en tête, le modèle OSI n'est pas vraiment adapté
pour les applications TCP/IP. Le modèle OSI est un modèle que j'ai appris et qu'à chaque situation
un peu complexe j'utilise, principalement par habitude.&lt;/p&gt;
&lt;blockquote&gt;
Habituellement, les trois couches supérieures du modèle OSI (Application, Présentation et
Session) sont considérées comme une seule couche Application dans TCP/IP. Comme TCP/IP
n'a pas de couche session unifiée sur laquelle les couches plus élevées peuvent
s'appuyer, ces fonctions sont généralement remplies par chaque application (ou ignorées).&lt;/blockquote&gt;
&lt;p&gt;(Source : &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Suite_des_protocoles_Internet#Couches_TCP/IP"&gt;Suite des protocoles Internet &amp;gt; Couches TCP/IP&lt;/a&gt; sur Wikipedia)&lt;/p&gt;
&lt;p&gt;Tout ça pour dire que ma réflexion à base de modèle OSI au-dessus était un poil capillotracté
pour rien. (Et au passage je vous ai parlé d'un autre modèle 😋 )&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Vous savez donc mettre votre frontend en HTTP/2, c'est cool, mais vous communiquez avec votre
backend en HTTP/1.1 ce qui au final est dommage, car vous perdez quelques avantages d'HTTP/2.
En plus, nous avons vu plus haut que HTTP/2 fonctionne aussi bien avec que sans TLS et
HAProxy a &lt;a class="reference external" href="https://www.haproxy.com/documentation/haproxy-configuration-tutorials/protocol-support/http/#http%2F2-over-http-(h2c)-to-the-server"&gt;même documenté comment faire&lt;/a&gt;. En gros, nous allons devoir dire au backend de
contacter la destination en HTTP/2&lt;/p&gt;
&lt;p&gt;Dans la configuration de Victor (l'article source rappelez-vous) nous allons faire une
petite modification de son backend &lt;tt class="docutils literal"&gt;bk_local_https&lt;/tt&gt; vers lequel il renvoie le trafic
détecté comme étant de l'HTTP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;bk_local_https
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;add-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https
&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;httplocal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:80&lt;span class="w"&gt; &lt;/span&gt;send-proxy-v2&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;h2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On passe donc de ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9:58734&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:19:24.027&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tcpssl~&lt;span class="w"&gt; &lt;/span&gt;forward_http/loopback-http&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;29177&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;/1/8/8/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;dst:dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;http:1&lt;span class="w"&gt; &lt;/span&gt;ssh:PRI&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;H
2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;58734&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:19:24.027&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https-in&lt;span class="w"&gt; &lt;/span&gt;web-apache/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/0/1/1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21248&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;----&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;/25/7/6/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;X11&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;x86_64&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:138.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/20100101&lt;span class="w"&gt; &lt;/span&gt;Firefox/138.0&lt;span class="o"&gt;||&lt;/span&gt;dryusdan.space:35443&lt;span class="p"&gt;|&lt;/span&gt;012d511f1a9ab2570a9d57b5895837d6&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/-/-/&lt;span class="w"&gt; &lt;/span&gt;-/0&lt;span class="w"&gt; &lt;/span&gt;-/-/-
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;à ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9:35420&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:21:46.223&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tcpssl~&lt;span class="w"&gt; &lt;/span&gt;forward_http/loopback-http&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/15&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;118071&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;/1/0/0/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;dst:dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;http:1&lt;span class="w"&gt; &lt;/span&gt;ssh:PRI&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;H
2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;35420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:21:46.285&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https-in&lt;span class="w"&gt; &lt;/span&gt;web-apache/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/0/1/1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22922&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;----&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;/10/0/0/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;X11&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;x86_64&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:138.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/20100101&lt;span class="w"&gt; &lt;/span&gt;Firefox/138.0&lt;span class="o"&gt;||&lt;/span&gt;dryusdan.space:35443&lt;span class="p"&gt;|&lt;/span&gt;012d511f1a9ab2570a9d57b5895837d6&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET / HTTP/2.0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/-/-/&lt;span class="w"&gt; &lt;/span&gt;-/0&lt;span class="w"&gt; &lt;/span&gt;-/-/-
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le &lt;tt class="docutils literal"&gt;proto h2&lt;/tt&gt; vous avez sûrement compris c'est pour l'HTTP/2. La modification de l'option
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;send-proxy&lt;/span&gt;&lt;/tt&gt; par &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;send-proxy-v2&lt;/span&gt;&lt;/tt&gt; est plus pour des questions de performance, l'entête
&lt;tt class="docutils literal"&gt;PROXY&lt;/tt&gt; est lisible avec &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;send-proxy&lt;/span&gt;&lt;/tt&gt; alors qu'avec &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;send-proxy-v2&lt;/span&gt;&lt;/tt&gt; elle est encodée
en binaire. HAProxy décrit d'ailleurs leur &lt;a class="reference external" href="https://www.haproxy.org/download/2.8/doc/proxy-protocol.txt"&gt;protocole PROXY&lt;/a&gt;, le but et la technique.&lt;/p&gt;
&lt;p&gt;D'ailleurs si on retire le protocole &lt;tt class="docutils literal"&gt;PROXY&lt;/tt&gt; voici ce que ça donne dans nos logs :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9:33100&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:22:43.452&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tcpssl~&lt;span class="w"&gt; &lt;/span&gt;forward_http/loopback-http&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21424&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;/1/1/1/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;dst:dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;http:1&lt;span class="w"&gt; &lt;/span&gt;ssh:PRI&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;H
unix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;/May/2025:09:22:43.454&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https-in&lt;span class="w"&gt; &lt;/span&gt;web-apache/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0/0/13/26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;117892&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;----&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;/6/0/0/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;X11&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;x86_64&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:138.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/20100101&lt;span class="w"&gt; &lt;/span&gt;Firefox/138.0&lt;span class="o"&gt;||&lt;/span&gt;dryusdan.space:35443&lt;span class="p"&gt;|&lt;/span&gt;012d511f1a9ab2570a9d57b5895837d6&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET / HTTP/2.0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/-/-/&lt;span class="w"&gt; &lt;/span&gt;-/0&lt;span class="w"&gt; &lt;/span&gt;-/-/-
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Côté frontend il n'y a pas de modification à faire. En cherchant à savoir si le frontend à
besoin qu'on lui spécifie s'il doit utiliser HTTP/2 ou non, j'ai découvert que par défaut,
HAProxy sait gérer les deux. Spécifier &lt;tt class="docutils literal"&gt;proto h2&lt;/tt&gt; en option sur le bind revient à désactiver
le support de HTTP/1.1. Donc avec la bonne commande &lt;tt class="docutils literal"&gt;curl&lt;/tt&gt;, on peut taper sur mon site en HTTP/2
sans TLS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sI&lt;span class="w"&gt; &lt;/span&gt;--http2-prior-knowledge&lt;span class="w"&gt; &lt;/span&gt;http://dryusdan.space
HTTP/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;301&lt;/span&gt;
content-length:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
location:&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space/
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(Vous pensiez tout de même pas que mon site était accessible sans TLS ? Mais au moins il
répond un 301 en HTTP/2)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-abstracts-namespace"&gt;
&lt;h2&gt;Les abstracts namespace&lt;/h2&gt;
&lt;p&gt;Autre point d'amélioration remplacer le bind &lt;tt class="docutils literal"&gt;localhost:port&lt;/tt&gt; par un
&lt;tt class="docutils literal"&gt;abstract namespace&lt;/tt&gt;. Pourquoi des espaces de nom abstrait plutôt que des
sockets unix ? Au tout début parce qu'après l'avoir vu dans &lt;a class="reference external" href="https://github.com/hockeypuck/hockeypuck/blob/master/contrib/docker-compose/standalone/haproxy/etc/haproxy.d/80_be.cfg#L5"&gt;la configuration HAProxy
de Hockeypuck&lt;/a&gt; j'avais trouvé ça cool d'utiliser une fonction que je ne connaissais
pas.&lt;/p&gt;
&lt;p&gt;Avant de comprendre ce que c'est les &lt;tt class="docutils literal"&gt;abstract namespace&lt;/tt&gt; (que je vais appeler
&lt;tt class="docutils literal"&gt;abns&lt;/tt&gt; pour éviter la répétition) il faut décortiquer un peu chaque option qui
nous sont présenté ! Ici nous avons plusieurs options : un listener TCP ou UDP, un
Unix socket un &lt;tt class="docutils literal"&gt;abns&lt;/tt&gt; ou encore un &lt;tt class="docutils literal"&gt;file descriptor&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Pour les listeners TCP/UDP (ou plus généralement avec une IP et un port) il faut remonter
sur le modèle OSI que j'ai mentionné plus haut (oui oui, il est de retour)&lt;/p&gt;
&lt;p&gt;&lt;img alt="On apperçoit une sorte de tableau / liste qui mentionne les 7 couches du modèle OSI." src="/content/images/2025/05/OSI_Model_v1.svg.png" /&gt;&lt;/p&gt;
&lt;p&gt;Quand vous ou votre HAProxy effectue une requête vers un autre service vos paquets vont
descendre une à une les couches. En gros le contenu de la requête va être divisé en plein
de petits paquets qui vont être tous encapsuler dans d'autres paquets un poil plus gros
nommé TCP qui vont à leurs tours être encapsulés dans des paquets plus gros encore nommé IP
qui seront également encapsulés dans des paquets nommés ethernet et le récepteur va devoir
désencapsuler un à un chaque paquet. C'est lourd dit comme ça, c'est tout aussi lourd
pour le système. Excepté pour l'interface &lt;tt class="docutils literal"&gt;local&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;lo&lt;/tt&gt; qui est une interface virtuelle et
donc n'a pas besoin des couches 1 à 3 (donc évite 3 niveaux d'encapsulation) mais on
conserve toujours l'encapsulation des couches supérieures et donc la séparation en paquets
ainsi que l'ajout de contrôle (et donc de calcul) et le rituel de TCP avec ses SYN/ACK.&lt;/p&gt;
&lt;p&gt;Les sockets unix sont, quant à eux, une autre approche. Ceux utilisés par HAProxy (et en
fait par toutes les applications web) sont de type &lt;tt class="docutils literal"&gt;SOCK_STREAM&lt;/tt&gt; (comment ça j'ai regardé
sur internet ?). Étant donné que tout ce passe dans le système (kernel même) la complexité
des paquets est bien moindre. Il s'agit de stream continue donc aucune fragmentation de
paquet, aucun besoin de contrôle d'intégrité, de vérification d'ordre... Donc le nombre
d'encapsulation est ridiculement petit. L'exemple ci-dessous (récupéré avec &lt;a class="reference external" href="https://github.com/mechpen/sockdump"&gt;socketdump&lt;/a&gt;
d'un côté (il n'y a que 3 couches) et Wireshark de l'autre).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une capture d'écran de wireshark qui ouvre une capture de socket. On aperçoit un nombre d'encapsulation réduit ainsi que très peu de paquet de vérification contrairement à TCP." src="/content/images/2025/05/socketdump.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une capture d'écran de Wireshark après une requête HTTP. On y aperçoit un nombre très conséquent d'encapsulation ainsi que de paquet et d'aller/retour TCP" src="/content/images/2025/05/tcpdump-http.png" /&gt;&lt;/p&gt;
&lt;p&gt;Un socket se définit souvent par un fichier, comme tout sur Unix car &amp;quot;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Everything_is_a_file"&gt;tout est fichier&lt;/a&gt;&amp;quot;
mais présent sur le système de fichier ajoutant donc une couche de gestion et de droit à
gérer. Cette petite mention rajoute donc de la complexité et du calcul. Et c'est là que va
intervenir les &lt;tt class="docutils literal"&gt;abstract namespace&lt;/tt&gt; !&lt;/p&gt;
&lt;p&gt;J'ai, depuis ma première implémentation des abstract namespace dans ma config HAProxy,
fais un peu de recherche pour savoir ce qu'était un abstract namespace.
Il s'agit d'un système propre à Linux (désolé les utilisateurs de FreeBSD).
Les sources concordent (&lt;a class="reference external" href="https://man7.org/linux/man-pages/man7/unix.7.html"&gt;man 7 unix&lt;/a&gt;, &lt;a class="reference external" href="https://utcc.utoronto.ca/~cks/space/blog/linux/SocketAbstractNamespace"&gt;ChrisSiebenmann&lt;/a&gt;, &lt;a class="reference external" href="https://doc.rust-lang.org/stable/std/os/linux/net/trait.SocketAddrExt.html#required-methods"&gt;Rust lang&lt;/a&gt;, &lt;a class="reference external" href="https://unix.stackexchange.com/questions/206386/what-does-the-symbol-denote-in-the-beginning-of-a-unix-domain-socket-path-in-l"&gt;StackExchange&lt;/a&gt;)
sur le fait que c'est une sorte de socket qui ne crée pas de ressource sur
le système de fichier. Cela supprime la &amp;quot;complexité&amp;quot; de devoir gérer des fichiers, leurs
permissions, leurs suppressions... surtout si l'application est chrooté. Bon, ça veut
aussi dire que qui que ce soit connait le nom du namespace et est déjà sur la machine
peut interagir avec lui sans plus de limitation. Dans notre cas cet individu peut
faire des requêtes HTTP, niveau danger y a pire on va dire.&lt;/p&gt;
&lt;p&gt;On a donc les avantages du socket, plus rapide, plus efficace sans les inconvénients
et la lourdeur du système de fichier.&lt;/p&gt;
&lt;p&gt;Pendant mes recherches j'ai trouvé &lt;a class="reference external" href="https://github.com/mschwager/socket-speed?tab=readme-ov-file"&gt;un outil&lt;/a&gt; pour comparer les différentes méthodes
de communication inter-processus (IPC). Outil qui s'accompagne &lt;a class="reference external" href="https://blog.myhro.info/2017/01/how-fast-are-unix-domain-sockets"&gt;d'un article&lt;/a&gt; pour
expliquer la méthode utilisée.&lt;/p&gt;
&lt;p&gt;Ces tests ont été effectués sur un AMD Ryzen 5 5600X sur un NVME Corsair Force MP510&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;socket-speed&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;ip_client.py
Receiving&lt;span class="w"&gt; &lt;/span&gt;messages...
Received&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14222&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;messages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;second&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;.

&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;socket-speed&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;uds_client.py
Receiving&lt;span class="w"&gt; &lt;/span&gt;messages...
Received&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;51406&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;messages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;second&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;.

&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;socket-speed&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;ans_client.py
Receiving&lt;span class="w"&gt; &lt;/span&gt;messages...
Received&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;55511&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;messages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;second&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On observe bien une très grande différence entre TCP et les socket unix et une
plus légère entre les sockets et les abstract namespace.&lt;/p&gt;
&lt;p&gt;Pour revenir sur la configuration il va falloir modifier le backend et le frontend !&lt;/p&gt;
&lt;p&gt;Pour le backend en remplace &lt;tt class="docutils literal"&gt;127.0.0.1:80&lt;/tt&gt; par &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;abns&amp;#64;loopback-http-in&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;bk_local_https
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;add-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https
&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;httplocal&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;send-proxy-v2&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;h2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et le frontend&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend&lt;span class="w"&gt; &lt;/span&gt;http_in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Local frontend&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;accept-proxy
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous rechargez votre configuration et banco !&lt;/p&gt;
&lt;p&gt;Pour valider quand même que ces modifications sont un peu plus performantes, j'ai
lancé un benchmark avec &lt;a class="reference external" href="https://github.com/codesenberg/bombardier"&gt;bombardier&lt;/a&gt; et j'ai récupéré le temps de réponse moyen
de 100 requêtes effectuées avec 2 clients et ce au début et après chaque
modification :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="25%" /&gt;
&lt;col width="25%" /&gt;
&lt;col width="25%" /&gt;
&lt;col width="25%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Test n°&lt;/th&gt;
&lt;th class="head"&gt;fe https-in&lt;/th&gt;
&lt;th class="head"&gt;fe tcp &amp;gt; https-in via abstract namespace&lt;/th&gt;
&lt;th class="head"&gt;fe tcp &amp;gt; https-in via tcp request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10.34ms&lt;/td&gt;
&lt;td&gt;10.28ms&lt;/td&gt;
&lt;td&gt;12.75ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;11.12ms&lt;/td&gt;
&lt;td&gt;10.91ms&lt;/td&gt;
&lt;td&gt;12.52ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11.40ms&lt;/td&gt;
&lt;td&gt;11.36ms&lt;/td&gt;
&lt;td&gt;13.18ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Le défaut de ce test est que je n'ai fait que 3 run sur un serveur de production
qui est donc soumis à son trafic de base et sa propre charge qui peuvent fluctuer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="et-si-on-allait-plus-loin"&gt;
&lt;h2&gt;Et si on allait plus loin ?&lt;/h2&gt;
&lt;p&gt;Grâce à cet article j'ai compris pas mal de chose notamment le fonctionnement
d'HTTP/2 grâce à ALPN (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Application-Layer&lt;/span&gt; Protocol Negotiation&lt;/tt&gt;). Mais aussi
que cette extension TLS, qui est en clair lors du &lt;tt class="docutils literal"&gt;Client Hello&lt;/tt&gt; peut : soit
nous êtes utile lors du routage de la requête, soit nous desservir si le
pare-feu est très agressif (et intrusif) avec du Deep Packet Inspection un
peu énervé.&lt;/p&gt;
&lt;p&gt;Aujourd'hui les navigateurs utilisent tous ALPN mais la majorité des scripts non
(depuis la charge des scrappers j'ai 75% des requêtes en HTTP/1.1).&lt;/p&gt;
&lt;p&gt;&lt;img alt="On aperçoit ici 4 graphiques. Le premier est un timeserie qui affiche le trafic qui passe correctement, celui redirigé, celui bloqué ou en erreur. Le second est un camembeert avec                         les mêmes informations que le timeserie. Le 3ème est un camembert qui liste le protocol HTTP utilisé et le 4ème la version TLS + cipher utilisé." src="/content/images/2025/05/grafana-http2-vs-11.png" /&gt;&lt;/p&gt;
&lt;p&gt;Dans un environnement &amp;quot;&lt;em&gt;très sécurisé&lt;/em&gt;&amp;quot; (kof, bien sur) ne pas mettre d'ALPN peut
être suspect. Donc ne pas mettre d'ALPN ou en mettre un custom peut éventuellement
nous desservir (j'ai pas ce genre de pare-feu sous la main). Mais si ce n'est pas
le cas, pourquoi ne pas l'utiliser ? o:)&lt;/p&gt;
&lt;p&gt;La commande &lt;tt class="docutils literal"&gt;openssl s_client&lt;/tt&gt; possède un argument &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-alpn&lt;/span&gt;&lt;/tt&gt;
(&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;openssl-s_client(1)&lt;/span&gt;&lt;/tt&gt;) qui nous permet d'y mettre ce qu'on veut&lt;/p&gt;
&lt;p&gt;&lt;img alt="On aperçoit sur cette image les valeurs données à l'extension TLS ALPN : ssh.." src="/content/images/2025/05/openssl-alpn-ssh.png" /&gt;
&lt;img alt="openssh-alpn-ssh-h2" src="/content/images/2025/05/openssl-alpn-ssh-h2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Et côté HAProxy alors ? Il y a plusieurs moyens d'utiliser cette &amp;quot;variable&amp;quot;.&lt;/p&gt;
&lt;p&gt;La première serait d'utiliser la variable &lt;a class="reference external" href="https://docs.haproxy.org/2.6/configuration.html#7.3.5-req.ssl_alpn"&gt;req.ssl_alpn&lt;/a&gt; mais comme indiqué
dans la documentation :&lt;/p&gt;
&lt;blockquote&gt;
Note that this only applies to raw contents found in the
request buffer and not to the contents deciphered via an SSL data layer, so
this will not work with &amp;quot;bind&amp;quot; lines having the &amp;quot;ssl&amp;quot; option.&lt;/blockquote&gt;
&lt;p&gt;Il faudrait avoir un premier frontend en TCP pur qui forward vers un second
frontend pour désencapsuler SSH de TLS pour enfin accéder au backend&lt;/p&gt;
&lt;p&gt;En reprenant la configuration de Victor, on aurait rajouté une ACL pour lire la valeur
de l'extension ALPN&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;##############&lt;/span&gt;
&lt;span class="c1"&gt;### TCP IN ###&lt;/span&gt;
&lt;span class="c1"&gt;##############&lt;/span&gt;
frontend&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;-in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;YOUR_IP:443
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# On est en TCP ici et pas encore en http&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On verifie les types de trafics parmi tcp over ssl, http et SSH&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;inspect-delay&lt;span class="w"&gt; &lt;/span&gt;5s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Une connexion ssh peut être longuette à s&amp;#39;établir, on prends le temps d&amp;#39;inspecter le flux&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssl&lt;span class="w"&gt;       &lt;/span&gt;req.ssl_ver&lt;span class="w"&gt;    &lt;/span&gt;gt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_raw&lt;span class="w"&gt; &lt;/span&gt;req.payload&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,7&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;str&lt;span class="w"&gt; &lt;/span&gt;SSH-2.0

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On récupère la valeur d&amp;#39;ALPN dans le Client Hello&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_over_ssl&lt;span class="w"&gt; &lt;/span&gt;req.ssl_alpn&lt;span class="w"&gt; &lt;/span&gt;ssh

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si SSL on envoie au backend TCP pour dechiffrement&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;bk_tcpssl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssl
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si ssh direct on envoie au backend ssh&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;bk_ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_raw

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si c&amp;#39;est du SSH dans TLS on renvoie vers un autre backend&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;bk_sshssl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_over_ssl

frontend&lt;span class="w"&gt; &lt;/span&gt;ssh-over-tls-in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-ssh-over-tls
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/

&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;bk_ssh

backend&lt;span class="w"&gt; &lt;/span&gt;bk_sshssl
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp
&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-ssh-over-tls
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C'est plus lourd et bien plus complexe que la méthode suivante
que je vais vous proposer.&lt;/p&gt;
&lt;p&gt;J'vous ai dis au tout début de cet article que la directive &lt;tt class="docutils literal"&gt;alpn&lt;/tt&gt; dans
HAProxy (et en général) permet d'avoir une liste des protocoles que vous &amp;quot;proposez&amp;quot;.
En fait, si vous lisez le schéma de la &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7301"&gt;RFC 7301&lt;/a&gt; (ci-dessous) vous pouvez
apercevoir que le serveur ne propose rien mais sélectionne ce qui correspond entre
ce que le client propose et sa propre liste&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Client                                              Server

ClientHello                     --------&amp;gt;       ServerHello
  (ALPN extension &amp;amp;                               (ALPN extension &amp;amp;
   list of protocols)                              selected protocol)
                                                Certificate*
                                                ServerKeyExchange*
                                                CertificateRequest*
                                &amp;lt;--------       ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished                        --------&amp;gt;
                                                [ChangeCipherSpec]
                                &amp;lt;--------       Finished
Application Data                &amp;lt;-------&amp;gt;       Application Data
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'idée est donc d'ajouter &lt;tt class="docutils literal"&gt;ssh&lt;/tt&gt; à la liste des protocoles proposés dans ALPN
et de travailler avec ça !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend&lt;span class="w"&gt; &lt;/span&gt;tcpssl-alpn
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:::443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1,ssh
&lt;span class="w"&gt;    &lt;/span&gt;log-format&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts %ac/%fc/%bc/%sc/%rc %sq/%bq alpn:%[ssl_fc_alpn]&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh&lt;span class="w"&gt; &lt;/span&gt;ssl_fc_alpn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ssh&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;accept&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;forward_ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh
&lt;span class="w"&gt;    &lt;/span&gt;default_backend&lt;span class="w"&gt; &lt;/span&gt;forward_http
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et pouf !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9:56568 [04/May/2025:20:38:05.241] tcpssl-alpn~ forward_ssh/ssh_mul 9/0/260 4044 -- 75/1/0/0/0 0/0 alpn:ssh
2a01:e0a:21a:17a0:83bb:eb6b:e85a:99b9:37900 [04/May/2025:20:38:14.714] tcpssl-alpn~ tcpssl-alpn/&amp;lt;NOSRV&amp;gt; -1/-1/6167 0 PR 87/1/0/0/0 0/0 alpn:h2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt="Le server Hello retourne ssh à ALPN (vu qu'il l'a selectionné)" src="/content/images/2025/05/serverhello-alpn-ssh.png" /&gt;&lt;/p&gt;
&lt;p&gt;En plus en TLS1.3 une bonne partie du &lt;tt class="docutils literal"&gt;Server Hello&lt;/tt&gt; est chiffré, ça devient plus compliqué de voir
que le serveur en face répond à cette requête &amp;quot;bizarre&amp;quot;.&lt;/p&gt;
&lt;p&gt;Niveau performance, en reprenant le tableau plus haut j'ajoute le
frontend sans analyse du payload :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;caption&gt;:header-rows: 1&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Test n°&lt;/td&gt;
&lt;td&gt;fe https-in&lt;/td&gt;
&lt;td&gt;fe tcp &amp;gt; https-in via abstract namespace&lt;/td&gt;
&lt;td&gt;fe tcp &amp;gt; https-in via tcp request&lt;/td&gt;
&lt;td&gt;fe tcp &amp;gt; https-in via abns sans analyse du payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10.34ms&lt;/td&gt;
&lt;td&gt;10.28ms&lt;/td&gt;
&lt;td&gt;12.75ms&lt;/td&gt;
&lt;td&gt;11.25ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;11.12ms&lt;/td&gt;
&lt;td&gt;10.91ms&lt;/td&gt;
&lt;td&gt;12.52ms&lt;/td&gt;
&lt;td&gt;10.82ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11.40ms&lt;/td&gt;
&lt;td&gt;11.36ms&lt;/td&gt;
&lt;td&gt;13.18ms&lt;/td&gt;
&lt;td&gt;11.44ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On constate ni d'amélioration, ni de dégradation (c'est exactement
les mêmes conditions de test donc ce n'est pas non plus très fiable).&lt;/p&gt;
&lt;p&gt;Quels sont les inconvénients alors ? L'analyse du payload est
légèrement moins fiable si le client SSH innove sur sa version
(bon, j'y crois moyen) mais le module &amp;quot;beg&amp;quot; dans HAProxy permet
de très vite invalider le payload sans trop de calcul. De plus cette
version est plus discrète en cas de pare-feu agressif avec cette
commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ssh&lt;span class="w"&gt;  &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;openssl s_client -quiet -alpn h2,http/1.1 -connect IP_HAPROXY:443 -servername IP_A_SSH&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;USER&lt;span class="w"&gt; &lt;/span&gt;dummy.name
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tandis que l'autre utilise à fond ALPN, c'est donc légèrement
moins discret.&lt;/p&gt;
&lt;p&gt;Après, peut-être qu'il faudrait faire des vrais tests dans des conditions
optimales pour voir si le check du payload est plus gourmand que l'ALPN ou non.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="au-final"&gt;
&lt;h2&gt;Au final&lt;/h2&gt;
&lt;p&gt;La configuration a un peu évolué et la voici&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend&lt;span class="w"&gt; &lt;/span&gt;tcpssl
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1,ssh
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:::443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1,ssh
&lt;span class="w"&gt;    &lt;/span&gt;log-format&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts %ac/%fc/%bc/%sc/%rc %sq/%bq alpn:%[ssl_fc_alpn] dst:%[var(sess.dst)] http:%[var(sess.ishttp)] ssh:%[var(sess.isssh)]&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_alpn&lt;span class="w"&gt; &lt;/span&gt;ssl_fc_alpn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ssh&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh&lt;span class="w"&gt; &lt;/span&gt;req.payload&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,7&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;beg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SSH-2.0&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;inspect-delay&lt;span class="w"&gt; &lt;/span&gt;5s
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;set-var&lt;span class="o"&gt;(&lt;/span&gt;sess.dst&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc_sni
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;set-var&lt;span class="o"&gt;(&lt;/span&gt;sess.ishttp&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;req.proto_http
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;set-var&lt;span class="o"&gt;(&lt;/span&gt;sess.isssh&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;req.payload&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,7&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;accept&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Pour une raison que j&amp;#39;ignore il faut ceci pour l&amp;#39;ACL trafic_ssh, sinon l&amp;#39;autre fonctionne sans&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;forward_ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trafic_ssh_alpn
&lt;span class="w"&gt;    &lt;/span&gt;default_backend&lt;span class="w"&gt; &lt;/span&gt;forward_http&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Le default_backend est surtout là pour dire &amp;quot;Si y a pas de trafic spécifique, je suis un serveur web normal&lt;/span&gt;

frontend&lt;span class="w"&gt; &lt;/span&gt;https-in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;accept-proxy
&lt;span class="w"&gt;    &lt;/span&gt;log-format&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%ci %cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %[fc_err]/%[ssl_fc_err,hex]/%[ssl_c_err]/ %[ssl_c_ca_err]/%[ssl_fc_is_resumed] %[ssl_fc_sni]/%sslv/%sslc&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;#[...] vos ACL et règle de votre frontend&lt;/span&gt;

backend&lt;span class="w"&gt; &lt;/span&gt;forward_http
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;loopback-http&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;send-proxy-v2&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;h2

backend&lt;span class="w"&gt; &lt;/span&gt;forward_ssh
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp

&lt;span class="w"&gt;    &lt;/span&gt;timeout&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;1h
&lt;span class="w"&gt;    &lt;/span&gt;stick-table&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ipv6&lt;span class="w"&gt; &lt;/span&gt;size&lt;span class="w"&gt; &lt;/span&gt;1m&lt;span class="w"&gt; &lt;/span&gt;expire&lt;span class="w"&gt; &lt;/span&gt;12h&lt;span class="w"&gt; &lt;/span&gt;store&lt;span class="w"&gt; &lt;/span&gt;conn_rate&lt;span class="o"&gt;(&lt;/span&gt;30m&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;track-sc0&lt;span class="w"&gt; &lt;/span&gt;src
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;reject&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sc_conn_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;le&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;reject&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sc_conn_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;ssh_mul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:22
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Durant mes recherches, j'ai vu que les modifications de l'ALPN
est plutôt courant en fait, notamment avec Letsencrypt et son
&lt;a class="reference external" href="https://letsencrypt.org/fr/docs/challenge-types/#tls-alpn-01"&gt;challenge TLS-ALPN-01&lt;/a&gt; (&lt;a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc8737"&gt;RFC 8737&lt;/a&gt;) ou XMPP et &lt;a class="reference external" href="https://wiki.xmpp.org/web/Tech_pages/XEP-0368"&gt;sa XEP 0368&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien !&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;markos_mant"&gt;Markos Mant&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 08 May 2025 10:00:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-08:/https-et-ssh-sont-dans-un-bateau-nomme-haproxy</guid><category>Labs</category><category>Hébergement</category><category>Informatique</category><category>Linux</category><category>HAProxy</category></item><item><title>Protéger tous ses sites avec Anubis</title><link>https://dryusdan.space/proteger-tous-ses-sites-avec-anubis</link><description>&lt;p&gt;Depuis que Forgejo est protégé, le nombre de scrapper qui venait piller mon
infra a drastiquement baissé... Jusqu'à fin avril où, selon mes graphiques,
j'ai énormément de requêtes d'un coup sur des sites totalement aléatoire.
Puis, à grand coup de veille technique, je suis tombé sur cet article.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://jan.wildeboer.net/2025/04/Web-is-Broken-Botnet-Part-2/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Botnet Part 2: The Web is Broken&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;I guess you have all heard about the growing problem of AI companies trying to aggressively collect whatever data they can get their hands on to train their models. This has caused an explosive surge in web crawlers relentlessly hitting servers big and small. But who runs these crawlers? Turns out — it could be you!&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/5942a3fb6a6e387548373f03b72f1713.png" alt="Image of Botnet Part 2: The Web is Broken page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/5942a3fb6a6e387548373f03b72f1713.png" alt="Image of Botnet Part 2: The Web is Broken page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Pour faire court, Jan Wildeboer a mit en lumière un nouveau business model bien
dégueulasse : utiliser le terminal d'un utilisateur avec une application incorporant
un SDK qui va permettre à la société de scrapper une page web. Quelques-unes
(beaucoup) de ces sociétés se targuent de permettre de scrapper pour des IAs à partir
de millions de sources différentes.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Dans le milieu de la sécurité, on appelle ce SDK un malware et le terminal de
l'utilisateur un &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Machine_zombie"&gt;zombie&lt;/a&gt; ou bien un botnet. L'idée étant d'effectuer une action
à distance à l'insu de l'utilisateur⋅ice.&lt;/p&gt;
&lt;p&gt;C'est quand même dingue tout ce qu'on peut faire avec l'étiquette IA: voler des
œuvres littéraire, graphique, cinématographique sous licence, piller du contenu
web sous licence, impacter négativement des infrastructures web d'entreprise ou
bénévole... Bref, je m'égare.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Qui dit millions de source différentes, dit qu'il va être impossible de gérer des
restrictions ou des limitations simples. Les protections anti-dos classique ne vont
juste plus fonctionner vu qu'on va parler de millions d'IPs. Alors oui, les botnets
et les attaques DDoS existaient depuis des années, c'est pas nouveau, mais avant
c'était vendu sur le marché noir et c'était soit politique, soit parce que
t'avais énervé un gamin sur Minecraft. La maintenant c'est &amp;quot;&lt;em&gt;légal&lt;/em&gt;&amp;quot;, &amp;quot;publiquement
accessible&amp;quot; et toléré car y a le flag &lt;em&gt;IA&lt;/em&gt; qui se balade. Donc, si je résume, on
a des millions d'IPs différentes de dizaines de pays différent qui vont venir
impacter les infrastructures.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Un infecté (type claqueur) de la série The Last Of Us tiré de l'excellent jeu vidéo du même nom" src="/content/images/2025/05/infected.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Depuis que j'ai installé &lt;a class="reference external" href="/proteger-forgejo-avec-anubis"&gt;Anubis devant Forgejo&lt;/a&gt;
j'ai constaté que le nombre de requêtes ont considérablement baissée et surtout :
elles ne passent plus ! Donc la solution serait de mettre Anubis devant tout le
monde ? Alors oui mais... Non en réalité, on va essayer de mettre un peu d'eau dans
son vin. J'ai pas envie que tous mes sites ressemblent à &amp;quot;&lt;tt class="docutils literal"&gt;Anubis &amp;gt; Proof of work &amp;gt;
profitez du contenu&lt;/tt&gt;&amp;quot;. Déjà parce que l'expérience utilisateur est naze, mais aussi
parce que certaines personnes naviguent sans javascript (alors oui je sais, il
existe &lt;a class="reference external" href="https://git.gammaspectra.live/git/go-away"&gt;go-away&lt;/a&gt;) ou via des terminaux.&lt;/p&gt;
&lt;p&gt;L'idée ici serait de basculer le trafic derrière Anubis en cas de trafic
anormalement élevé détecté ! On utilisera ici quelques concepts d'HAProxy (forcément,
j'allais pas utiliser Nginx 😇) notamment les sticky-table et Anubis.&lt;/p&gt;
&lt;p&gt;Pour Anubis cela ne sera pas compliqué, notamment si vous suivez mon &lt;a class="reference external" href="/proteger-forgejo-avec-anubis"&gt;précédent
article&lt;/a&gt; à ce sujet. Pour HAProxy un peu plus cependant (en tout cas j'y ai passé
quelques heures à rechercher). On va d'abord mettre en place la pièce angulaire de
cette sécurité : la sticky table.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;host_sticky_table
&lt;span class="w"&gt;    &lt;/span&gt;stick-table&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;string&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;size&lt;span class="w"&gt; &lt;/span&gt;1m&lt;span class="w"&gt; &lt;/span&gt;expire&lt;span class="w"&gt; &lt;/span&gt;10m&lt;span class="w"&gt; &lt;/span&gt;store&lt;span class="w"&gt; &lt;/span&gt;gpc0_rate&lt;span class="o"&gt;(&lt;/span&gt;10m&lt;span class="o"&gt;)&lt;/span&gt;,gpc1_rate&lt;span class="o"&gt;(&lt;/span&gt;1s&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tout d'abord on crée un &amp;quot;dummy backend&amp;quot; pour pouvoir l'appeler facilement de partout,
puis on y ajoute une stick-table. Le but d'une stick-table c'est d'allouer un espace
mémoire pour HAProxy pour enregistrer certaines informations sur un seul nœud ou sur
un cluster, notamment le nombre de requête provenant d'une IP, le nombre de requête
sur une URL spécifique... Ils ont écrit un article d'ailleurs sur &lt;a class="reference external" href="https://www.haproxy.com/blog/bot-protection-with-haproxy"&gt;les protections
anti bot&lt;/a&gt;. Bref, ici on crée une stick-table qui va stocker deux compteurs et qui
auront comme index une chaine de caractère de 64 caractères maximum (à adapter, la
limite d'un domaine complet est de 253 caractères de toute façon). Le premier
compteur va stocker les entrées pendant 10 minutes tandis que le second pendant 1 seconde.
C’est-à-dire que les entrées plus vieilles de 10 minutes dans le premier compteur
seront automatiquement supprimés. Le but étant d'avoir un compteur qui permette
de constater un trafic anormal sur du &amp;quot;long terme&amp;quot; tandis que l'autre va réagir tout de
suite.&lt;/p&gt;
&lt;p&gt;Maintenant le frontend, il y a plusieurs spécificités. Déjà j'ai une liste d'IPs
autorisé, notamment pour éviter que le monitoring + un peu de trafic à côté
déclenche la sécurité. Cette liste est stockés dans &lt;tt class="docutils literal"&gt;/etc/haproxy/allowed.ips&lt;/tt&gt;.
Ensuite je fais en sorte d'incrémenter les compteurs quand la page renvoyée est en
HTML. Au début je vérifiais l'extension à la fin de l'URL (.css, .mp4, .avi...)
pour exclure ces requêtes des compteurs, mais ce n'est pas forcément fiable,
un peu compliqué et sur Peertube notamment ça déclenchait très facilement la
protection.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend&lt;span class="w"&gt; &lt;/span&gt;https-in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:::443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1

&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;dryusdan_space&lt;span class="w"&gt; &lt;/span&gt;hdr_beg&lt;span class="o"&gt;(&lt;/span&gt;host&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si HAProxy détecte un cookie nommé within.website-x-cmd-anubis-auth&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;has_anubis_cookie&lt;span class="w"&gt; &lt;/span&gt;req.cook&lt;span class="o"&gt;(&lt;/span&gt;within.website-x-cmd-anubis-auth&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;found
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si HAProxy détecte que le chemin demandé est la validation de Anubis&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;acl_anubis&lt;span class="w"&gt; &lt;/span&gt;path_beg&lt;span class="w"&gt; &lt;/span&gt;/.within.website/x/cmd/anubis

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si la limite sur le compteur de 10 minutes dépasse 150&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;exceeds_soft_limit&lt;span class="w"&gt; &lt;/span&gt;sc_gpc0_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si la limite sur le compteur de 1 seconde dépasse 10&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;exceeds_hard_limit&lt;span class="w"&gt; &lt;/span&gt;sc_gpc1_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si la réponse est en HTML&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;res.hdr&lt;span class="o"&gt;(&lt;/span&gt;Content-Type&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si l&amp;#39;IP est dans les IPs autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_allowed&lt;span class="w"&gt; &lt;/span&gt;src&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/allowed.ips

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Récupère l&amp;#39;entête HTTP Host&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;capture&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;header&lt;span class="w"&gt; &lt;/span&gt;Host&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Active le tracking de la connexion dans la stick-table défini dans le backend host_sticky_table&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;track-sc0&lt;span class="w"&gt; &lt;/span&gt;hdr&lt;span class="o"&gt;(&lt;/span&gt;Host&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;host_sticky_table

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Incremente les compteurs si la réponse est en HTML et ne vient pas d&amp;#39;une IP autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc0&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc1&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Utiliser le backend Anubis si l&amp;#39;URL détecté est l&amp;#39;URL de validation de Anubis&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;acl_anubis

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Utiliser le backend Anubis si la limite de 150 requêtes sur 10 minutes est dépassé et qu&amp;#39;il n&amp;#39;y a pas le cookie within.website-x-cmd-anubis-auth&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;exceeds_soft_limit&lt;span class="w"&gt; &lt;/span&gt;!has_anubis_cookie
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Utiliser le backend Anubis si la limite de 10 requêtes sur 1 seconde est dépassé et qu&amp;#39;il n&amp;#39;y a pas le cookie within.website-x-cmd-anubis-auth&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;exceeds_hard_limit&lt;span class="w"&gt; &lt;/span&gt;!has_anubis_cookie

&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;web-apache&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dryusdan_space
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous avez surement vu que j'ai joué aussi avec les cookies, pourquoi ?&lt;/p&gt;
&lt;p&gt;Dans le fonctionnement d'Anubis, lorsque votre navigateur a trouvé une
preuve de travail, il va la renvoyer à Anubis, mais si le nombre de requête
passe tout juste sous la limite, le backend utilisé est le backend normal
et on se retrouve donc avec une url type &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dryusdan.space/.within.website-x-cmd-anubis-auth/&lt;/span&gt;&lt;/tt&gt;
que mon site ne possède pas, car c'est utilisé que par Anubis en reverse proxy.
Pour permettre de finaliser la validation il faut simplement détecter l'URL et
rediriger vers le backend Anubis si on détecte cette URL.&lt;/p&gt;
&lt;p&gt;Autre point, Anubis va &amp;quot;simplement&amp;quot; boucler vers le frontend https-in quand le
POW sera résolu, sauf que si la limite est toujours élevée on rebascule vers
le backend Anubis et ça fini en boucle infini. Donc il faut un moyen de sortir
de cette boucle. Pour ça il faut valider si le cookie Anubis est présent. Il
s'agit ici d'un très gros trou dans la raquette mais j'en parle juste en dessous.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http

&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;forwardfor
&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;httpchk

&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;add-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;res.hdr&lt;span class="o"&gt;(&lt;/span&gt;Content-Type&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Scheme&lt;span class="w"&gt; &lt;/span&gt;https
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Host&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;[&lt;/span&gt;req.hdr&lt;span class="o"&gt;(&lt;/span&gt;Host&lt;span class="o"&gt;)]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Real-Ip&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;[&lt;/span&gt;src&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:13002
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voilà, vous avez une protection basique qui se déclenche quand le trafic
toute source confondu devient important sur un de vos sites web. Oui, car cela
ne se déclenche pas pour tous mais uniquement pour le site visé par l'attaque.&lt;/p&gt;
&lt;p&gt;Côté HAProxy d'ailleurs la sticky table ressemble à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;show table host_sticky_table&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;socat&lt;span class="w"&gt; &lt;/span&gt;stdio&lt;span class="w"&gt; &lt;/span&gt;UNIX-CONNECT:/var/run/haproxy/admin.sock
&lt;span class="c1"&gt;# table: host_sticky_table, type: string, size:1048576, used:45&lt;/span&gt;
0x55920bddead8:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;use&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;597902&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gpc0_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;600000&lt;/span&gt;&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;297&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gpc1_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En écrivant ces lignes, j'ai testé quand même d'outre passer cette limitation notamment
en faisant la requête avec les cookies &lt;tt class="docutils literal"&gt;DryCookie_Anubis&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;within.website-x-cmd-anubis-auth&lt;/span&gt;&lt;/tt&gt;
et malheureusement ça passe. Donc ça limite l'impact des bots assez stupide mais
c'est pas très optimal... Le mieux serait d'avoir plusieurs frontend, un frontend tcp
qui ensuite forward la requête soit vers https-in soit vers Anubis (qui lui va passer
ensuite vers https-in). Hé bien c'est ce qu'on va faire là, et en plus on retire le
trou béant détecté plus haut !&lt;/p&gt;
&lt;p&gt;On va garder le même backend &lt;tt class="docutils literal"&gt;host_sticky_table&lt;/tt&gt; créé plus haut. On va également
adapter les frontends sans changer grand-chose. Enfin un peu quand même. Le premier
frontend sera en TCP et écoutera sur le port 443 tandis que le second écoutera avec socket
unix special. On va également traquer le SNI et non plus l'entête Host.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;frontend&lt;span class="w"&gt; &lt;/span&gt;tcpssl
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1,ssh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#Oui, ssh ! C&amp;#39;est pour un autre article, oui je tease !&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:::443&lt;span class="w"&gt; &lt;/span&gt;ssl&lt;span class="w"&gt; &lt;/span&gt;crt&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/certs/&lt;span class="w"&gt; &lt;/span&gt;alpn&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1,ssh

&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;tcp

&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;inspect-delay&lt;span class="w"&gt; &lt;/span&gt;5s
&lt;span class="w"&gt;    &lt;/span&gt;tcp-request&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;track-sc0&lt;span class="w"&gt; &lt;/span&gt;ssl_fc_sni&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;host_sticky_table

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;exceeds_soft_limit&lt;span class="w"&gt; &lt;/span&gt;sc_gpc0_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;exceeds_hard_limit&lt;span class="w"&gt; &lt;/span&gt;sc_gpc1_rate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On passe sur anubis uniquement si on dépasse une limite&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;exceeds_soft_limit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;exceeds_hard_limit
&lt;span class="w"&gt;    &lt;/span&gt;default_backend&lt;span class="w"&gt; &lt;/span&gt;forward_http

frontend&lt;span class="w"&gt; &lt;/span&gt;https-in
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;accept-proxy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Pareil, petit teasing !&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Si HAProxy détecte que le chemin demandé est la validation de Anubis&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;acl_anubis&lt;span class="w"&gt; &lt;/span&gt;path_beg&lt;span class="w"&gt; &lt;/span&gt;/.within.website/x/cmd/anubis

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On rebascule sur le backend anubis si on a pas le cookie anubis mais notre cookie (ça veut dire qu&amp;#39;on est passé dans le backend anubis mais qu&amp;#39;il n&amp;#39;a pas pu finir son process)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;use_backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;acl_anubis
&lt;span class="w"&gt;    &lt;/span&gt;default_backend&lt;span class="w"&gt; &lt;/span&gt;web-apache
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pareil qu'avec la configuration précédente, il faut s'assurer qu'Anubis
puisse finir son travail, même si on est descendu en dessous de la limite.
C'est principalement pour éviter un 404 et donc éclater un peu l'expérience
utilisateur.
Autre point, on vérifie aussi si le user agent contient Mozilla ou Opera.
Dans le cas où la requête est autorisé par Anubis sans déposer un Cookie,
comme c'est le cas pour tous les clients non challengé (Mastodon, Kaji...)
on bouclait sur l'utilisation du backend main_anubis. Là on rajoute une
sécurité en plus pour éviter justement que les robots autorisés soient
coincé dans une boucle infini.&lt;/p&gt;
&lt;p&gt;Les backends, quant à eux, auront un peu plus d'intelligence&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;main_anubis
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;forwardfor
&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;httpchk

&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;add-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On réécrit l&amp;#39;entête host&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;Host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%[ssl_fc_sni]&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On vérifie que la réponse est de l&amp;#39;HTML&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;res.hdr&lt;span class="o"&gt;(&lt;/span&gt;Content-Type&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On vérifie que les IPs sont dans la liste des IPs autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_allowed&lt;span class="w"&gt; &lt;/span&gt;src&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/allowed.ips

&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Scheme&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Host&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;[&lt;/span&gt;req.hdr&lt;span class="o"&gt;(&lt;/span&gt;Host&lt;span class="o"&gt;)]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;X-Real-Ip&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;[&lt;/span&gt;src&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Incremente les compteurs si la réponse est en HTML et ne vient pas d&amp;#39;une IP autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc0&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc1&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On rajoute un cookie pour dire qu&amp;#39;on est passé par le backend.&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;anubis&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:13002

backend&lt;span class="w"&gt; &lt;/span&gt;forward_http
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http

&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;add-header&lt;span class="w"&gt; &lt;/span&gt;X-Forwarded-Proto&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssl_fc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On réécrit l&amp;#39;entête host&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;set-header&lt;span class="w"&gt; &lt;/span&gt;Host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%[ssl_fc_sni]&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On vérifie que la réponse est de l&amp;#39;HTML&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;res.hdr&lt;span class="o"&gt;(&lt;/span&gt;Content-Type&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# On vérifie que les IPs sont dans la liste des IPs autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is_allowed&lt;span class="w"&gt; &lt;/span&gt;src&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/allowed.ips

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Incremente les compteurs si la réponse est en HTML et ne vient pas d&amp;#39;une IP autorisé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc0&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed
&lt;span class="w"&gt;    &lt;/span&gt;http-response&lt;span class="w"&gt; &lt;/span&gt;sc-inc-gpc1&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is_html_response&lt;span class="w"&gt; &lt;/span&gt;!is_allowed

&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;loopback-http&lt;span class="w"&gt; &lt;/span&gt;abns@loopback-http-in&lt;span class="w"&gt; &lt;/span&gt;send-proxy-v2&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;h2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pourquoi réécrire l'entête Host ? Pour justement éviter que quelqu'un
indique la bonne entête Host mais avec le mauvais SNI. En faisant une
requête avec un SNI vers dryusdan.space mais en utilisant un entête
Host vers fittrackee, j'arrive sur Fittrackee. Or, dans notre cas,
cela va incrémenter le compteur pour dryusdan.space.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;--resolve&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space:443:192.168.1.254&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host: fittrackee.dryusdan.fr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space
*&lt;span class="w"&gt; &lt;/span&gt;ALPN:&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;offers&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Client&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;cipher,&lt;span class="w"&gt; &lt;/span&gt;Change&lt;span class="w"&gt; &lt;/span&gt;cipher&lt;span class="w"&gt; &lt;/span&gt;spec&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Encrypted&lt;span class="w"&gt; &lt;/span&gt;Extensions&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Certificate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;CERT&lt;span class="w"&gt; &lt;/span&gt;verify&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;cipher,&lt;span class="w"&gt; &lt;/span&gt;Change&lt;span class="w"&gt; &lt;/span&gt;cipher&lt;span class="w"&gt; &lt;/span&gt;spec&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;SSL&lt;span class="w"&gt; &lt;/span&gt;connection&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;TLS_AES_256_GCM_SHA384&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;x25519&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;id-ecPublicKey
*&lt;span class="w"&gt; &lt;/span&gt;ALPN:&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;accepted&lt;span class="w"&gt; &lt;/span&gt;h2
*&lt;span class="w"&gt; &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;certificate:
*&lt;span class="w"&gt;  &lt;/span&gt;subject:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dryusdan.space
*&lt;span class="w"&gt;  &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;date:&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;05&lt;/span&gt;:11:56&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GMT
*&lt;span class="w"&gt;  &lt;/span&gt;expire&lt;span class="w"&gt; &lt;/span&gt;date:&lt;span class="w"&gt; &lt;/span&gt;Jul&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;05&lt;/span&gt;:11:55&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GMT
*&lt;span class="w"&gt;  &lt;/span&gt;subjectAltName:&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dryusdan.space&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;matched&lt;span class="w"&gt; &lt;/span&gt;cert&lt;span class="s1"&gt;&amp;#39;s &amp;quot;dryusdan.space&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;*  issuer: C=US; O=Let&amp;#39;&lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;Encrypt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;E6
*&lt;span class="w"&gt; &lt;/span&gt;Connected&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.254&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;HTTP/2
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;OPENED&lt;span class="w"&gt; &lt;/span&gt;stream&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space/
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:method:&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:scheme:&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:authority:&lt;span class="w"&gt; &lt;/span&gt;fittrackee.dryusdan.fr&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:path:&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;user-agent:&lt;span class="w"&gt; &lt;/span&gt;curl/8.13.0&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;accept:&lt;span class="w"&gt; &lt;/span&gt;*/*&lt;span class="o"&gt;]&lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;HTTP/2
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Host:&lt;span class="w"&gt; &lt;/span&gt;fittrackee.dryusdan.fr
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;User-Agent:&lt;span class="w"&gt; &lt;/span&gt;curl/8.13.0
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Accept:&lt;span class="w"&gt; &lt;/span&gt;*/*
&amp;gt;
&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;HTTP/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;date:&lt;span class="w"&gt; &lt;/span&gt;Wed,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;May&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;:29:48&lt;span class="w"&gt; &lt;/span&gt;GMT
&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;content-type:&lt;span class="w"&gt; &lt;/span&gt;text/html&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
&amp;lt;!DOCTYPE&lt;span class="w"&gt; &lt;/span&gt;html&amp;gt;
&amp;lt;html&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&amp;gt;
&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;head&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;&amp;lt;title&amp;gt;FitTrackee&amp;lt;/title&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De ce simple fait, on peut utiliser plein de SNI différent pour
scrapper uen même cible et donc passer entre les mailles du filet.
À l'inverse, en redéfinissant l'entête HTTP Host avec la valeur
du SNI, on s'assure que le site affiché correspond bien à celui
du certificat et évite ce que je vous ai présenté juste avant.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;--resolve&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space:443:192.168.1.254&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host: fittrackee.dryusdan.fr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space
*&lt;span class="w"&gt; &lt;/span&gt;ALPN:&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;offers&lt;span class="w"&gt; &lt;/span&gt;h2,http/1.1
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Client&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;cipher,&lt;span class="w"&gt; &lt;/span&gt;Change&lt;span class="w"&gt; &lt;/span&gt;cipher&lt;span class="w"&gt; &lt;/span&gt;spec&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Encrypted&lt;span class="w"&gt; &lt;/span&gt;Extensions&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Certificate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;CERT&lt;span class="w"&gt; &lt;/span&gt;verify&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;cipher,&lt;span class="w"&gt; &lt;/span&gt;Change&lt;span class="w"&gt; &lt;/span&gt;cipher&lt;span class="w"&gt; &lt;/span&gt;spec&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;OUT&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;SSL&lt;span class="w"&gt; &lt;/span&gt;connection&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;TLS_AES_256_GCM_SHA384&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;x25519&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;id-ecPublicKey
*&lt;span class="w"&gt; &lt;/span&gt;ALPN:&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;accepted&lt;span class="w"&gt; &lt;/span&gt;h2
*&lt;span class="w"&gt; &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;certificate:
*&lt;span class="w"&gt;  &lt;/span&gt;subject:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dryusdan.space
*&lt;span class="w"&gt;  &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;date:&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;05&lt;/span&gt;:11:56&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GMT
*&lt;span class="w"&gt;  &lt;/span&gt;expire&lt;span class="w"&gt; &lt;/span&gt;date:&lt;span class="w"&gt; &lt;/span&gt;Jul&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;05&lt;/span&gt;:11:55&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GMT
*&lt;span class="w"&gt;  &lt;/span&gt;subjectAltName:&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dryusdan.space&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;matched&lt;span class="w"&gt; &lt;/span&gt;cert&lt;span class="s1"&gt;&amp;#39;s &amp;quot;dryusdan.space&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;*  issuer: C=US; O=Let&amp;#39;&lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;Encrypt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;E6
*&lt;span class="w"&gt;  &lt;/span&gt;SSL&lt;span class="w"&gt; &lt;/span&gt;certificate&lt;span class="w"&gt; &lt;/span&gt;verify&lt;span class="w"&gt; &lt;/span&gt;ok.
*&lt;span class="w"&gt; &lt;/span&gt;Connected&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.254&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;HTTP/2
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;OPENED&lt;span class="w"&gt; &lt;/span&gt;stream&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space/
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:method:&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:scheme:&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:authority:&lt;span class="w"&gt; &lt;/span&gt;fittrackee.dryusdan.fr&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;:path:&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;user-agent:&lt;span class="w"&gt; &lt;/span&gt;curl/8.13.0&lt;span class="o"&gt;]&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;HTTP/2&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;accept:&lt;span class="w"&gt; &lt;/span&gt;*/*&lt;span class="o"&gt;]&lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;HTTP/2
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Host:&lt;span class="w"&gt; &lt;/span&gt;fittrackee.dryusdan.fr
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;User-Agent:&lt;span class="w"&gt; &lt;/span&gt;curl/8.13.0
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Accept:&lt;span class="w"&gt; &lt;/span&gt;*/*
&amp;gt;
*&lt;span class="w"&gt; &lt;/span&gt;Request&lt;span class="w"&gt; &lt;/span&gt;completely&lt;span class="w"&gt; &lt;/span&gt;sent&lt;span class="w"&gt; &lt;/span&gt;off
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Newsession&lt;span class="w"&gt; &lt;/span&gt;Ticket&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
*&lt;span class="w"&gt; &lt;/span&gt;TLSv1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;IN&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;TLS&lt;span class="w"&gt; &lt;/span&gt;handshake,&lt;span class="w"&gt; &lt;/span&gt;Newsession&lt;span class="w"&gt; &lt;/span&gt;Ticket&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;HTTP/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;content-type:&lt;span class="w"&gt; &lt;/span&gt;text/html
&amp;lt;!DOCTYPE&lt;span class="w"&gt; &lt;/span&gt;html&amp;gt;

&amp;lt;html&lt;span class="w"&gt; &lt;/span&gt;data-theme&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fr&amp;quot;&lt;/span&gt;&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;&amp;lt;head&amp;gt;
&lt;span class="w"&gt;        &lt;/span&gt;&amp;lt;title&amp;gt;Dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;🚀&lt;span class="w"&gt; &lt;/span&gt;Voyagez&lt;span class="w"&gt; &lt;/span&gt;dans&lt;span class="w"&gt; &lt;/span&gt;mon&lt;span class="w"&gt; &lt;/span&gt;espace&amp;lt;/title&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous avez Anubis devant votre forge git et que vous ajoutez
Anubis devant tout ce petit monde, il faut reconfigurer ce dernier
très légèrement. Pour ça dans les deux configurations de Anubis
rajoutez la variable &lt;tt class="docutils literal"&gt;ED25519_PRIVATE_KEY_HEX&lt;/tt&gt; avec une &lt;a class="reference external" href="https://anubis.techaro.lol/docs/admin/installation#key-generation"&gt;clé
aléatoire&lt;/a&gt;, sinon le premier et le second Anubis vont mutuellement
bloquer leurs requêtes, car la réponse dans le cookie ne sera jamais
la bonne.&lt;/p&gt;
&lt;p&gt;Et vous voilà avec une protection basique rapide et efficace
contre les scrappers !&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien et à très bientôt ;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;joshdatsu"&gt;Joshua Tsu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;EDIT 15/06/2025 : Suite à quelques soucis rencontré j'ai
amélioré la redirection vers le backend Anubis quand on passe
par le frontend TCP. Le soucis semble être résolu, j'ai donc
corrigé l'article !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 07 May 2025 14:00:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-07:/proteger-tous-ses-sites-avec-anubis</guid><category>Labs</category><category>Labs</category><category>Informatique</category><category>HAProxy</category></item><item><title>Rétrospective de mars et avril 2025</title><link>https://dryusdan.space/notes/2025/04/retrospective-mars-avril-2025</link><description>&lt;p&gt;C'est parti pour la rétrospective de mars et avril. o/&lt;/p&gt;
&lt;p&gt;Oui, deux rétrospectives en une parce que mars c'était viiiiide
et avril plus intéressant tout de même.&lt;/p&gt;
&lt;p&gt;On commence par les chiffres du mois de mars.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;179&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;1947&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;10 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;12,85Go&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagé sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;391,50&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Et on va enchainer sur le mois d'avril :D&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;5233&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;29 minutes de lecture&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;41,32Go (oO)&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagé sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;249&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Un mois de mars relativement calme de mon côté, malgré plus d'une 20ène
d'entretien (mais comme je ne connais pas Terraform et Kubernetes mon profil
n'est jamais passé -.-&lt;/p&gt;
&lt;p&gt;Beaucoup de moment désagréable aussi à base de RH qui rabaissent mon niveau.
Il y a quand même quelques boites (3) en fait qui ont eu le mérite d'aller plus
loin, notamment en faisant des tests techniques. Ça m'a fait remonter mon estime
de moi 😊 (bon, c'est pas passé parce qu'il y avait meilleur que moi U_U).&lt;/p&gt;
&lt;p&gt;Mais bon, maintenant je suis un outil qu'on loue pour aller bosser sur un PC
Windows dans une boite très loin de mes valeurs...&lt;/p&gt;
&lt;p&gt;Bref, un mois de mars éreintant et un mois d'avril beaucoup plus libre comme
l'indique le nombre d'article. Il y a même eu un article à succès semblerait-il
(j'ai pas de stat exact :D) avec 11 000 visites pour &lt;a class="reference external" href="https://dryusdan.space/lia-et-forgejo"&gt;L'IA et Forgejo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un de mes sides project commence à décoller : &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/garmin-to-fittrackee"&gt;Garmin to Fittrackee&lt;/a&gt; (également
présent sur &lt;a class="reference external" href="https://github.com/Dryusdan/garmin-to-fittrackee"&gt;Github&lt;/a&gt;). Je l'ai donc également publié sur &lt;a class="reference external" href="https://pypi.org/project/garmin-to-fittrackee/"&gt;Pypi&lt;/a&gt; car &lt;a class="reference external" href="https://github.com/Thovi98"&gt;Thovi98&lt;/a&gt;
me l'a porté sur &lt;a class="reference external" href="https://apps.yunohost.org/app/garmin-to-fittrackee"&gt;YunoHost&lt;/a&gt;. Le but de cet outil : synchroniser vos activités Garmin
l'outil auto hébergé &amp;quot;fittrackee&amp;quot; !&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 03 May 2025 11:30:00 +0200</pubDate><guid>tag:dryusdan.space,2025-05-03:/notes/2025/04/retrospective-mars-avril-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Nouveau tattoo (again)</title><link>https://dryusdan.space/notes/2025/04/nouveau-tattoo-again</link><description>&lt;p&gt;Haha, une fois n’est pas coutume, un nouveau tattoo est apparu
sur mon avant bras !&lt;/p&gt;
&lt;p&gt;« Petite » référence à mon jeu vidéo préféré, mais également
à toute une période assez importante de ma vie à base de
remise en question et de changement… 😊&lt;/p&gt;
&lt;p&gt;&lt;img alt="tattoo" class="image-process-article-image" src="/content/images/2025/04/IMG_4699.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;je vous recommande très fortement &lt;a class="reference external" href="https://salehistoire.fr/tatoueurs-nantes/la-barbe"&gt;La Barbe Tatoo&lt;/a&gt;
(son &lt;a class="reference external" href="https://www.instagram.com/labarbetattoo/"&gt;Instagram&lt;/a&gt;. Je sais que
ça fonctionne beaucoup grâce à ça) !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 20 Apr 2025 10:51:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-20:/notes/2025/04/nouveau-tattoo-again</guid><category>notes</category></item><item><title>IRC, Minecraft, Bloguidien et Naopix... Mes petits side project</title><link>https://dryusdan.space/notes/2025/04/irc-minecraft-bloguidien-et-naopix-mes-petits-side-project</link><description>&lt;p&gt;En écrivant l'article sur &amp;quot;L'IA et Forgejo&amp;quot;, j'ai mentionné
DryIRC et quelques personnes sont venus 😊... En fait je n'ai
pas vraiment communiqué dessus. Enfin si, sur le &lt;a class="reference external" href="https://social.dryusdan.fr/&amp;#64;Dryusdan"&gt;fediverse&lt;/a&gt;,
mais on peut facilement le louper.&lt;/p&gt;
&lt;p&gt;J'ai donc modifié le menu du site pour avoir plus de place et
donc partagé deux trois projets.&lt;/p&gt;
&lt;div class="section" id="bloguidien"&gt;
&lt;h2&gt;Bloguidien&lt;/h2&gt;
&lt;p&gt;Un que vous avez surement dû entendre parler (car j'en ai &lt;a class="reference external" href="/notes/2024/10/bloguidienfr-pour-avoir-des-prompts-sympa"&gt;déjà
parlé&lt;/a&gt;), il a sa propre catégorie : &lt;a class="reference external" href="https://bloguidien.fr/"&gt;Bloguidien&lt;/a&gt;
(c'est la catégorie &lt;a class="reference external" href="/prompts"&gt;/prompts&lt;/a&gt;). Il est malheureusement
actuellement en attente de nouveau prompt à lui donner.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://bloguidien.fr/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Bloguidien Chaque jour un nouveau sujet pour votre blog&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Chaque jour un nouveau sujet pour votre blog&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Bloguidien Chaque jour un nouveau sujet pour votre blog page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Bloguidien Chaque jour un nouveau sujet pour votre blog page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Il s'agit d'un projet mené avec &lt;a class="reference external" href="https://lord.re"&gt;Lord&lt;/a&gt; ayant pour but
de donner un sujet par jour pour écrire sur un blog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="irc"&gt;
&lt;h2&gt;IRC&lt;/h2&gt;
&lt;p&gt;Lui j'en ai mal fait la promotion ! J'héberge mon propre
serveur IRC accessible à l'adresse &lt;a class="reference external" href="https://irc.dryusdan.net"&gt;irc.dryusdan.net&lt;/a&gt;. Il
s'agit d'un serveur Ergo supportant très bien IRCv3. Il intègre
les commandes qu'on a l'habitude de voir tel que ChanSrv, NickSrv
mais nativement. L'historique de chat est également supporté. Et
&lt;a class="reference external" href="https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md"&gt;la documentation&lt;/a&gt; est clairement très bien écrite (mais en anglais).
J'ai également mis un kiwi chat avec WebUI ^^&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://irc.dryusdan.net"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Kiwi IRC&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Kiwi IRC page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Kiwi IRC page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Petite précision, il y a le chan &lt;tt class="docutils literal"&gt;#global&lt;/tt&gt; quand
vous arrivez, mais il en existe hein &lt;tt class="docutils literal"&gt;#fediverse&lt;/tt&gt;
(si vous avez eu accès à cet article via le fediverse
hein o:) )&lt;/p&gt;
&lt;p&gt;Feel free pour passer dire bonjour ou rester hein 😉&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="minecraft"&gt;
&lt;h2&gt;Minecraft&lt;/h2&gt;
&lt;p&gt;Pareil qu'IRC, j'ai monté un petit serveur Minecraft communautaire depuis
quelques mois et pareil je n'en ai que très peu fait la promotion et exclusivement
sur le fediverse.&lt;/p&gt;
&lt;p&gt;Y a même un petit site et un wiki très léger&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://minecraft.dryusdan.fr/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Accueil&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Un petit serveur Minecraft&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/22a27812356f42936267a317bcb3fd6b.png" alt="Image of Accueil page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/22a27812356f42936267a317bcb3fd6b.png" alt="Image of Accueil page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div class="section" id="naopix"&gt;
&lt;h2&gt;Naopix&lt;/h2&gt;
&lt;p&gt;Lors de la dernière grosse migration Meta &amp;gt; Fediverse, j'ai monté une petite
instance Pixelfed : Naopix. J'en avais fait &lt;a class="reference external" href="https://dryusdan.space/notes/2025/01/naopix-l-instance-pixelfed-au-beurre-sale"&gt;un article&lt;/a&gt; dessus d'ailleurs
(contrairement à IRC et Minecraft). Je suis dessus, mais je partage que très
peu, c'est pas trop mon type de média ^^&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://naopix.fr/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;NaoPix&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Naopix est une plateforme de partage d'images, une alternative éthique aux plateformes centralisées.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/288332744aa7fb533524fd76f3a2a15c.png" alt="Image of NaoPix page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/288332744aa7fb533524fd76f3a2a15c.png" alt="Image of NaoPix page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 13 Apr 2025 15:56:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-13:/notes/2025/04/irc-minecraft-bloguidien-et-naopix-mes-petits-side-project</guid><category>notes</category><category>Hébergement</category><category>En vrac</category><category>Jeux vidéo</category></item><item><title>Renvoyer un code HTTP 402 ou 418 avec HAProxy</title><link>https://dryusdan.space/notes/2025/04/renvoyer-un-code-http-402-ou-418-avec-haproxy</link><description>&lt;p&gt;La semaine passé je cherchais à retourner un code de retour HTTP
&amp;quot;IA get out&amp;quot;. En réalité, un 403 ça suffit pleinement... Enfin à
l'heure où je vous écris le bot &lt;tt class="docutils literal"&gt;AliyunSecBot/Aliyun&lt;/tt&gt; s'est mangé
plus de 12 000 403 en 6h sans que ça ne le gêne...&lt;/p&gt;
&lt;p&gt;Dans les codes de retour HTTP, 2 m'amuse : &lt;tt class="docutils literal"&gt;402 payment required&lt;/tt&gt;
et &lt;tt class="docutils literal"&gt;418 I'm a teapot&lt;/tt&gt;. Code de retour qui ne sont pas gérés par
&lt;a class="reference external" href="https://docs.haproxy.org/2.6/configuration.html#3.8-errorfile"&gt;la directive errorfile&lt;/a&gt; de HAProxy. Je pense car très spécifique,
trop peu utilisé voir très libre à interprétation.&lt;/p&gt;
&lt;p&gt;Vous avez sûrement bien lu, c'est uniquement &lt;tt class="docutils literal"&gt;errorfile&lt;/tt&gt; qui nous
refuse ça... Mais on peut très bien renvoyer un 487 qui n'existe pas
si on veut 😁&lt;/p&gt;
&lt;p&gt;C'est une directive qui est très simple et totalement inspiré de mon
article :&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/empecher-les-ia-de-siphonner-votre-site-grace-a-haproxy"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Empêcher les IA de siphonner votre site grâce à HAproxy&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Vous le savez tous, les IA sont maintenant partout. C'est passé du web à votre ordinateur ou votre téléphone en moins de temps qu'il faut pour le dire. Pour les moins technique d'entre vous ou les startupnationpeur (surtout eux), vous ne savez peut être pas, mais une IA, pour devenir …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/f25b5da6157c0a5b805ead69433036f4.png" alt="Image of Empêcher les IA de siphonner votre site grâce à HAproxy page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/f25b5da6157c0a5b805ead69433036f4.png" alt="Image of Empêcher les IA de siphonner votre site grâce à HAproxy page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="na"&gt;acl is-bad_ua hdr_sub(user-agent) -i -f /etc/haproxy/bad_uas.txt&lt;/span&gt;
&lt;span class="na"&gt;http-request deny if is-bad_ua&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sauf qu'au lien de deny la request, on va retourner un code :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="na"&gt;http-request return status 402 content-type &amp;quot;text/html;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;utf-8&amp;quot; file /etc/haproxy/errors/402.html if is-bad_agent&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La principale différence entre errorfile et ce fichier, c'est qu'avec
errorfile on définit toutes les entêtes dans le fichier, là c'est
purement un fichier HTML. Cependant, &lt;a class="reference external" href="https://docs.haproxy.org/2.6/configuration.html#4.2-http-request%20return"&gt;selon la documentation&lt;/a&gt;,
on peut remplacer la directive &lt;tt class="docutils literal"&gt;file&lt;/tt&gt; par &lt;tt class="docutils literal"&gt;string&lt;/tt&gt; et ainsi ne
même pas avoir à gérer de fichier en plus !&lt;/p&gt;
&lt;p&gt;Point bonus, le 402 peut être remplacé par N'IMPORTE quel code, je viens
d'essayer 483 et ça fonctionne. Et autre point bonus, si on ne retourne
aucun contenu, ça fonctionne aussi :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;dryusdan@Nemp&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;User-agent: GPTBot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://dryusdan.space&lt;span class="w"&gt; &lt;/span&gt;-I
HTTP/2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;483&lt;/span&gt;
content-length:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="L'écran gris de firefox avec comme indication &amp;quot;Il semble y avoir un problème sur ce site. https://dryusdan.space/ a renvoyé une erreur. Code d’erreur : 483 &amp;quot;" src="/content/images/2025/04/firefox_custom_http_code_nocontent.png" /&gt;
&lt;p&gt;Je n'ai cependant pas vérifié si un return custom comme ça consomme
plus de ressource qu'un &lt;tt class="docutils literal"&gt;deny&lt;/tt&gt; nativement géré.&lt;/p&gt;
&lt;p&gt;Have fun !&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 13 Apr 2025 10:13:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-13:/notes/2025/04/renvoyer-un-code-http-402-ou-418-avec-haproxy</guid><category>notes</category><category>Labs</category><category>Informatique</category><category>Hébergement</category><category>HAProxy</category></item><item><title>Protéger Forgejo avec Anubis</title><link>https://dryusdan.space/proteger-forgejo-avec-anubis</link><description>&lt;p&gt;Ça fait un moment que je réfléchis à un moyen pour limiter les
bots et surtout les pilleurs de contenu nommé IA. Depuis
plus d'un an maintenant je vois le trafic vers ma forge logicielle
grimper de plus en plus. Bien que, jusqu'à là, le trafic était
principalement contenu avec des scrappers clairement identifiables
(de Facebook, ByteDance et AmazonBot) et peu destructeurs. Mais
ces derniers temps, tous les hébergeurs de forge logicielle
ont vu leurs trafics accroître.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/lia-et-forgejo"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;L'IA et Forgejo&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Tout comme Lord, je suis tombé sur un article défendant l'IA mais avec un argument accusateur : Laisser l'IA apprendre : une position éthique. Laisser l'IA apprendre : une position problèmatiqueJe suis tombé sur cet article de blog : Laisser l'IA apprendre : une position éthique et il m'a pas mal hérissé et donc …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/ff847a36d1e20e51762a615e73a59706.png" alt="Image of L'IA et Forgejo page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/ff847a36d1e20e51762a615e73a59706.png" alt="Image of L'IA et Forgejo page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;J'ai partagé avant-hier mon expérience sur le trafic jusqu'au DDoS
subit par ce qui ressemble largement à des scrappers pour entrainer
des IA et je ne suis clairement pas le seul, entre ceux qui m'ont
partagé les mêmes déboires, ceux qui ont constaté en effet que le
trafic a augmenté significativement sur leurs forges.&lt;/p&gt;
&lt;p&gt;Il fallait donc commencer à agir. Pour ça j'ai un peu réfléchi
à comment contrer un bot sans contrer un vrai internaute. J'ai
constaté que de plus en plus de sites se trouvaient protégés par
des bannières &amp;quot;anti robot&amp;quot;, je pense à Hetzner ou tous les
sites derrière du Cloudflare qui maintenant affiche une page
&amp;quot;vérifiez que vous n'êtes pas un robot&amp;quot; avec une case à cocher.
Hetzner a au moins l'avantage d'avoir une URL facile à lire : hray/pow.&lt;/p&gt;
&lt;p&gt;Ok, qu'est-ce que c'est que POW ? Hé bien POW c'est l'acronyme de
&lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Preuve_de_travail"&gt;Proof Of Work&lt;/a&gt; et c'est justement ça que je cherchais : Comment
s'assurer que le client en face est bien réel ? En lui demandant
d'effectuer une action ! Cloudflare par exemple affiche une petite
croix à cocher, Hetzner... Et bah je savais pas pour Hetzner mais avant
même d'avoir eu le temps de creuser, quelqu'un &lt;a class="reference external" href="https://gist.github.com/SoftCreatR/f9a7a90191d812d9ce700dedf5840d8a"&gt;l'a fait&lt;/a&gt;. Et là, un
monde s'est débloqué (non). En vrai j'ai continué à creuser, comme
j'ai partagé sur &lt;a class="reference external" href="https://dryusdan.link/shaare/hnnlNg"&gt;DryLink&lt;/a&gt; il y a quelques mois maintenant, de plus
en plus de personnes tentent de mettre en place des POW pour limiter en fait
les bots.&lt;/p&gt;
&lt;p&gt;Pour l'anecdote j'ai commencé à apprendre le LUA pour en faire un moi-même
avec HAProxy. Je ne mets pas cette idée au rebu pour autant ;)&lt;/p&gt;
&lt;p&gt;Mais entre la recherche d'idées, chopper la technique et développer tout
ça (ou le mettre en place), il fallait du temps... Et les DDoS sont
arrivés.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Un lapin dessiné qui court avec une montre" src="/content/images/2025/04/alice-in.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Selon les logs, j'ai reçu plusieurs dizaines de milliers de
connexions provenant d'autant d'adresses IPs avec des user-agent &lt;a class="footnote-reference" href="#f1" id="footnote-reference-1"&gt;[1]&lt;/a&gt; de
navigateur web. Bien sur, les adresses IPs n'étaient pas réutilisées
ensuite. J'ai eu de tout, du Google Cloud Plateform, de l'AWS,
du Starlink, du Cyber Internet Services Pakistan...
Donc bannir une IP ne sert à rien (comme tout bon DDoS au final).&lt;/p&gt;
&lt;p&gt;Je n'ai eu que très peu de choix qui s'offraient à moi :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Désactiver l'IPv4, car les attaques se sont fait en IPv4&lt;/li&gt;
&lt;li&gt;Bloquer des AS complets comme le fait &lt;a class="reference external" href="https://git.home.lithio.fr/doctor/nft-btg"&gt;Codimp&lt;/a&gt;,
mais c'est pas vraiment une technique que j'affectionne
et ça peut potentiellement plus gêner qu'autre chose&lt;/li&gt;
&lt;li&gt;Bloquer sur la base d'un regex les user-agent problématiques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai estimé que si on accède à Forgejo, on a au moins un Windows à jour
ou un Firefox ESR. Le reste j'ai bloqué. Je n'ai pas partagé mes regex
avant-hier, bien qu'on me les ait demandés, car l'impact est très important
(notamment j'ai bloqué l'intégralité des Windows sur Forgejo pour un .
en moins). Je vous le partage mais pour la forme, le plus intéressant
arrive ;)&lt;/p&gt;
&lt;p&gt;J'ai donc écrit un fichier &lt;tt class="docutils literal"&gt;/etc/haproxy/bad_bot.txt&lt;/tt&gt; contenant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="na"&gt;Android [1,2,3,4,5,6,7,8,9,10,11]&lt;/span&gt;
&lt;span class="na"&gt;MSIE&lt;/span&gt;
&lt;span class="na"&gt;Windows (95|98|CE)&lt;/span&gt;
&lt;span class="na"&gt;Windows NT [1,2,3,4,5,6]\.&lt;/span&gt;
&lt;span class="na"&gt;iPad OS&lt;/span&gt;
&lt;span class="na"&gt;iPhone OS (\d{1}|[0-7]{2})_&lt;/span&gt;
&lt;span class="na"&gt;Mac OS X 10_(\d{1}|[0-1]{2})_&lt;/span&gt;
&lt;span class="na"&gt;(Windows NT (10|11)|Linux x86_64).* (Firefox|Chrome)\/([1-9]|[1-9][0-9])\..&lt;/span&gt;
&lt;span class="na"&gt;Linux i686&lt;/span&gt;
&lt;span class="na"&gt;Presto\/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et dans HAProxy, au niveau de mon backend forgejo j'ai rajouté&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;backend&lt;span class="w"&gt; &lt;/span&gt;forgejo
&lt;span class="w"&gt;    &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;http
&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;forwardfor
&lt;span class="w"&gt;    &lt;/span&gt;option&lt;span class="w"&gt; &lt;/span&gt;httpchk

&lt;span class="w"&gt;    &lt;/span&gt;timeout&lt;span class="w"&gt; &lt;/span&gt;queue&lt;span class="w"&gt; &lt;/span&gt;5s
&lt;span class="w"&gt;    &lt;/span&gt;http-check&lt;span class="w"&gt; &lt;/span&gt;send&lt;span class="w"&gt; &lt;/span&gt;meth&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;uri&lt;span class="w"&gt; &lt;/span&gt;/api/healthz
&lt;span class="w"&gt;    &lt;/span&gt;http-check&lt;span class="w"&gt; &lt;/span&gt;expect&lt;span class="w"&gt; &lt;/span&gt;string&lt;span class="w"&gt; &lt;/span&gt;pass

&lt;span class="w"&gt;    &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;is-bad_agent&lt;span class="w"&gt; &lt;/span&gt;hdr&lt;span class="o"&gt;(&lt;/span&gt;user-agent&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sub&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;reg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/haproxy/bad_bot.txt
&lt;span class="w"&gt;    &lt;/span&gt;http-request&lt;span class="w"&gt; &lt;/span&gt;deny&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is-bad_agent

&lt;span class="w"&gt;    &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;forgejo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:3000&lt;span class="w"&gt; &lt;/span&gt;maxconn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;check&lt;span class="w"&gt; &lt;/span&gt;inter&lt;span class="w"&gt; &lt;/span&gt;10s&lt;span class="w"&gt; &lt;/span&gt;fall&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rise&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Du coup si une requête arrive avec un user agent qui contient
les lignes ci-dessus : BAM 403&lt;/p&gt;
&lt;p&gt;Mais, comme dit plus haut, c'est très risqué et il y a du
dégât collatéral. Mais une fois ça en place cependant, le
trafic s'est volatilisé et ne revient qu'à de très rares occasions.&lt;/p&gt;
&lt;p&gt;Mais ce n'est pas un POW. Ce n'est pas un mécanisme avec peu d'impact. Là
clairement il y en a !&lt;/p&gt;
&lt;p&gt;Et en vous partageant mon expérience, &lt;a class="reference external" href="https://blog.flozz.fr/"&gt;Flozz&lt;/a&gt; m'a parlé d'&lt;a class="reference external" href="https://github.com/TecharoHQ/anubis"&gt;Anubis&lt;/a&gt;, un
petit projet open-source qui semble avoir émergé en janvier dernier.
Petit projet open-source qui a commencé à prendre une  grande ampleur,
car même &lt;a class="reference external" href="https://discourse.gnome.org/t/anime-girl-on-gnome-gitlab/27689/2"&gt;Gnome Project&lt;/a&gt; l'a déployé à cause... D'un scrapping
(potentiellement d'IA) intensif qui a downtime leur Gitlab. Pareil
pour &lt;a class="reference external" href="https://status.sr.ht/issues/2025-03-17-git.sr.ht-llms/"&gt;SourceHut&lt;/a&gt; en réalité !&lt;/p&gt;
&lt;p&gt;&lt;img alt="La nouvelle mascotte du projet" src="/content/images/2025/04/anubis.webp" style="width: 30%;" /&gt;&lt;/p&gt;
&lt;p&gt;Bref, regardons &lt;a class="reference external" href="https://github.com/TecharoHQ/anubis"&gt;Anubis&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Anubis a été créé en réponse aux scrappers toujours plus
agressifs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Encore, ça fais beaucoup là non ?" src="/content/images/2025/04/encore.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Et Xe, l'auteur⋅ice explique sur &lt;a class="reference external" href="https://xeiaso.net/blog/2025/anubis/"&gt;son blog&lt;/a&gt; pourquoi iel a développé
ça et comment cela fonctionne. Basiquement, Anubis utilise le principe
de &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Hashcash"&gt;HashCash&lt;/a&gt; (pour les anglophones, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Hashcash"&gt;l'article en anglais&lt;/a&gt; est plus
complet). Pour résumer le principe, le serveur attend le résultat
d'une opération mathématique spécifique, il envoie l'opération à
effectuer par le client qui va devoir dépenser du temps et de l'énergie
pour calculer le hash d'une chaine de caractères avec X 0 au début.
Évidemment, les scrapper évitent de dépenser de l'énergie et donc changent
de cible.&lt;/p&gt;
&lt;p&gt;Dans l'implémentation actuelle d'Anubis, j'y vois quelques inconvénients
(et l'auteur⋅ice également et ça c'est cool de voir un projet qui parle
des limites). Anubis fonctionne comme un reverse proxy, de ce fait, il
en faut un par service, ça ajoute un risque de panne. Au passage, si
on veut ajouter plus de services protégés, on doit déployer plus d'Anubis
(ou alors un qui ensuite renvoie la requête au reverse proxy qui suit
le cheminement complet, mais je n'ai pas testé). Autre point négatif,
les utilisateurs avec de vieux navigateurs ou ceux qui ont désactivé le
Javascript (j'en connais, si si) seront bloqué à l'extérieur. Dernier
point, c'est le jeu du chat et de la souris, aujourd'hui les scrappers
n'embarque pas de JS ou de veilles versions, mais on est pas à l'abri
qu'à l'avenir il se comporte comme un navigateur normal (coucou
Chromium Headless).&lt;/p&gt;
&lt;p&gt;Ce n'est certes pas parfait, mais j'avoue que c'est quand même
mieux que juste bloquer tout un tas de navigateurs. Le mieux est
l'ennemie du bien comme on dit. Petit détail quand même, Anubis
consomme 6Mo de RAM par instance... Ça va !&lt;/p&gt;
&lt;p&gt;Bon, on va peut-être faire un peu de technique non ?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Trois hommes qui se jette des cartons de déménagement, cours dans tout les sens et casse des meubles" src="/content/images/2025/04/palmashow-demenagement.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Allez, installation time !&lt;/p&gt;
&lt;p&gt;L'idée ici va être de mettre en place de manière la plus
transparente possible Anubis sans toucher une demie seconde
à votre reverse proxy et sans Docker ! (si si, je vous assure).
Hier, les mainteneurs du projet ont ajouté les paquets Debian, RedHat
ou même un binaire basique à utiliser.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Pour les plus impatients, j'ai créé un role Ansible
qui supporte Debian et RedHat.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://git.dryusdan.fr/Ansible/anubis"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;anubis&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;anubis&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/4a0733851a5612a3c1b25b8721189184.png" alt="Image of anubis page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/4a0733851a5612a3c1b25b8721189184.png" alt="Image of anubis page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;hr class="docutils" /&gt;
&lt;p&gt;Tout d'abord vous téléchargez et installez votre paquet&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/TecharoHQ/anubis/releases/download/v1.16.0/anubis_1.16.0_amd64.deb&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;/tmp/anubis.deb
apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;/tmp/anubis.deb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, vous allez créer votre fichier de configuration dans &lt;tt class="docutils literal"&gt;/etc/anubis/forgejo.env&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="na"&gt;BIND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:3000&lt;/span&gt;
&lt;span class="na"&gt;BIND_NETWORK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;tcp&lt;/span&gt;
&lt;span class="na"&gt;METRICS_BIND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:9090&lt;/span&gt;
&lt;span class="na"&gt;METRICS_BIND_NETWORK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;tcp&lt;/span&gt;
&lt;span class="na"&gt;USE_REMOTE_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;unix:///var/run/forgejo/forgejo.sock&lt;/span&gt;
&lt;span class="na"&gt;COOKIE_PARTITIONED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;DIFFICULTY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#edit c&amp;#39;est la valeur par defaut&lt;/span&gt;
&lt;span class="na"&gt;SERVE_ROBOTS_TXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;OG_EXPIRY_TIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;24h&lt;/span&gt;
&lt;span class="na"&gt;OG_PASSTHROUGH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La configuration ici est relativement simple, on écoute sur le port 3000
en localhost et on redirige les requêtes vers le socket de Forgejo.
On ne redémarre rien, car ce n'est pas fini !&lt;/p&gt;
&lt;p&gt;Pour Forgejo, vous allez éditer le service&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;forgejo.service
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour y ajouter&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;RuntimeDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;forgejo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'avantage de &lt;tt class="docutils literal"&gt;systemctl edit&lt;/tt&gt; c'est que ça va automatiquement
trigger un daemon reload.&lt;/p&gt;
&lt;p&gt;Et là vous le voyez venir, on va modifier la configuration
de Forgejo pour écouter sur un socket et non plus en TCP !&lt;/p&gt;
&lt;p&gt;Remplacez les valeurs&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[server]&lt;/span&gt;
&lt;span class="na"&gt;PROTOCOL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;
&lt;span class="na"&gt;HTTP_ADDR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="na"&gt;HTTP_PORT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[server]&lt;/span&gt;
&lt;span class="na"&gt;PROTOCOL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http+unix&lt;/span&gt;
&lt;span class="na"&gt;HTTP_ADDR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/run/forgejo/forgejo.sock&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis redémarrez les services&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;forgejo
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;anubis@forgejo
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et pouf, vous êtes maintenant protégé !&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://anubis.techaro.lol/docs/admin/installation/"&gt;La documentation&lt;/a&gt; d'Anubis est très bien faite et complète.
Vous pouvez modifier comme bon vous semble la configuration de ce
dernier.&lt;/p&gt;
&lt;p&gt;Là j'ai glissé Forgejo derrière Anubis, car c'était vraiment l'outil
le plus sollicité, mais vous pouvez facilement y glisser d'autres applications !&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien, moi je vais aller faire une PR pour améliorer le botPolicies d'Anubis :D&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;benjaletzke"&gt;Benedikt  Jaletzke&lt;/a&gt;&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="f1" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Petite définition : un user-agent et un entête HTTP permettant d'identifier un programme
navigant sur le web. Vous pouvez le définir comme vous voulez, car il n'y a aucune vérification possible.
Je peux par exemple dire au programme &lt;tt class="docutils literal"&gt;curl&lt;/tt&gt; que c'est un Google Chrome sous Windows 11.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 10 Apr 2025 20:20:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-10:/proteger-forgejo-avec-anubis</guid><category>Labs</category><category>Hébergement</category><category>Informatique</category><category>Linux</category><category>featured</category></item><item><title>L'IA et Forgejo</title><link>https://dryusdan.space/lia-et-forgejo</link><description>&lt;p&gt;Tout comme &lt;a class="reference external" href="https://lord.re"&gt;Lord&lt;/a&gt;, je suis tombé sur un article défendant l'IA
mais avec un argument accusateur : &amp;quot;&lt;em&gt;Laisser l'IA apprendre : une position éthique&lt;/em&gt;&amp;quot;.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://lord.re/fast-posts/80-laisser-l-ia-apprendre--une-position-probl%C3%A8matique/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Laisser l'IA apprendre : une position problèmatique&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Je suis tombé sur cet article de blog : Laisser l'IA apprendre : une position éthique et il m'a pas mal hérissé et donc j'avais envie de répondre.
Je sors donc mon clavier et c'est parti !
Richard Dern, l'auteur du blog raconte comment il est passé de méfiant à utilisateur réfléchi (mais bon à le lire je dirai même convaincu).
On arrive donc à la partie 4 titrée « Pourquoi se pose-t-on cette question ? » ; la question étant « Comment bloquer l'accès de votre site aux scrapers d'IA ? ».
Il énonce 4 raisons couramment données :&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/f89f7f064e5613beeb780079e459ff49.png" alt="Image of Laisser l'IA apprendre : une position problèmatique page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/f89f7f064e5613beeb780079e459ff49.png" alt="Image of Laisser l'IA apprendre : une position problèmatique page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Je ne vais pas vraiment m'étendre sur le sujet, Lord en a parlé dans
son article et ma vision en reste très proche. Les commentaires m'ont
fait sourire, mais j'y reviendrais. Je vais plutôt parler technique et
surtout un retour d'expérience.&lt;/p&gt;
&lt;p&gt;Si vous trainez sur IRC (sur &lt;a class="reference external" href="https://geeknode.org/"&gt;Geeknode&lt;/a&gt; ou &lt;a class="reference external" href="https://hostux.network/fr/"&gt;Hostux&lt;/a&gt; voir même sur &lt;a class="reference external" href="https://irc.dryusdan.net/"&gt;DryIRC&lt;/a&gt;
(je m'aperçois que je n'en ai pas fait la promo :o)) vous avez sûrement dû me voir
pester TRÈS fortement sur des attaques DDoS et ce n'est pas un terme utilisé à la légère.&lt;/p&gt;
&lt;p&gt;Il va falloir un peu de remise en contexte. Depuis quasiment un an, je constate un TRÈS
fort trafic sur Forgejo (ma forge logicielle, d'ailleurs y a tout plein de playbook ansible
et d'application et même des plugins Pelican, servez-vous :D). Ce trafic provient de
Facebook, AWS selon les IPs (AS) et les User Agent. J'aperçois un peu de ByteDance (TikTok).
Ça tabasse Forgejo mais &amp;quot;&lt;em&gt;ça va&lt;/em&gt;&amp;quot;. Mais ça va un jour, deux jours, trois jours... Puis ça commence
à me gonfler, qu'est-ce que Facebook et ByteDance ont à foutre de mon code sérieux ? Et puis en
quoi c'est suffisamment important pour générer 50% de mon trafic web à eux deux ? L'impact est
&amp;quot;minime&amp;quot;, 50% de mon trafic web c'est 33 requêtes par secondes (1980 requêtes par minute, ça va
l'infrastructure le supporte). Enfin minime on parle de quelques centimes d'électricité chaque mois
parce que Forgejo chauffe un peu, 15% du CPU environs. Ça me soule, je dégomme ça directement dans HAProxy.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/empecher-les-ia-de-siphonner-votre-site-grace-a-haproxy"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Empêcher les IA de siphonner votre site grâce à HAproxy&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Vous le savez tous, les IA sont maintenant partout. C'est passé du web à votre ordinateur ou votre téléphone en moins de temps qu'il faut pour le dire. Pour les moins technique d'entre vous ou les startupnationpeur (surtout eux), vous ne savez peut être pas, mais une IA, pour devenir …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/f25b5da6157c0a5b805ead69433036f4.png" alt="Image of Empêcher les IA de siphonner votre site grâce à HAproxy page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/f25b5da6157c0a5b805ead69433036f4.png" alt="Image of Empêcher les IA de siphonner votre site grâce à HAproxy page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Tout redevient calme, ça me va. Quelques mois plus tard, ma supervision m'alerte
comme quoi un service est inaccessible pendant 5 minutes la nuit. Pièce centrale d'une bonne
partie de mes services (oui c'est un SPOF), mais n'ayant pas de temps disponible là tout de
suite et puis &amp;quot;&lt;em&gt;c'est que 5 minutes à 2h30 du mat pendant les sauvegardes ça va&lt;/em&gt;&amp;quot;, c'est arrivé
une fois... Je remise donc le diagnostic à plus tard. Les coupures sont de plus
en plus fréquentes, on passe d'une fois aléatoirement à deux fois par nuit très rapidement.
Je regarde brièvement mais sans trop chercher. Après tout c'est mon infra perso, ça arrive quand
personne ne l'utilise, tant pis. Mon serveur git est quand même premier sur mon &amp;quot;&lt;em&gt;Top requested domains&lt;/em&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;Sauf que bien sur, et ça je le savais pourtant par expérience, laisser un problème dans un coin
c'est le laisser pourrir et donc de le voir empirer. L'alerte devient de plus en plus fréquente.
Mais l'alerte n'est pas seule et pendant une mise à jour que j'effectuais sur le serveur BAM plus
d'accès à ma machine.&lt;/p&gt;
&lt;p&gt;&lt;img alt="what the fuck" src="/content/images/2025/04/bunnies-what.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Presque aussitôt un proche qui utilisait un service m'envoie un SMS &amp;quot;&lt;em&gt;Hey, c'est pété&lt;/em&gt;&amp;quot;. Bon, bah là
j'ai pas le choix.&lt;/p&gt;
&lt;p&gt;Un autre terminal ouvert aussi en SSH survit et je fais le diagnostic basique :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;uptime&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sar &lt;span class="pre"&gt;-u&lt;/span&gt; 1&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;top&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hum, j'ai un ffmpeg et Minecraft qui tourne, mesure d'urgence, ça dégage. Le serveur respire de nouveau.
Je sais que le problème ce n'était pas eux, mais j'ai plus de problème.&lt;/p&gt;
&lt;p&gt;Quelques minutes plus tard le serveur galère de nouveau avec une load normalisé à 112,5, plus rien ne répond.
Impossible de récupérer la main sur mon serveur. Ça timeout... Je laisse donc le serveur 20 minutes dans les choux,
de toute façon je ne peux rien faire. Ça va, c'est pas bien grave, c'est ma musique et la thèse de ma compagne qui
sont impactés par cette indisponibilité. Après 20 minutes j'arrive difficilement à accéder au serveur,
mais hormis constater avec Prometheus que lui-même était mort j'ai &lt;strong&gt;RIEN&lt;/strong&gt;. À vrai dire j'ai sysstat qui s'est lancé
et je découvre que le proc a été bouffé à 100% par un utilisateur. Bye bye la panne machine donc. Je vois aussi grâce
à Loki que ma forge logicielle semble ciblée. C'est curieux, forgejo est résistant pourtant et HAProxy en frontal est,
d'expérience, indestructible. Bon, je farfouille les logs et je découvre que Forgejo se fait dégommer, toutes les
requêtes qu'il subit sont faites vers des URL bizarres... Forgejo qui indique entre deux lignes de log qu'il n'arrive
plus à gérer le cache et que certaines connexions sont abandonnées avant qu'il ai le temps de répondre. Donc les 700
requêtes par secondes sur Forgejo curieusement il kiff pas (NO SHIT).
Petite configuration dans HAProxy, je limite le nombre de connexion vers Forgejo, je glisse le reste en &amp;quot;file d'attente&amp;quot; et
je timeout la file d'attente très rapidement. Oui, je m'impacte directement... Ça commence à me gonfler, mais au moins
je n'ai plus d'alerte pendant 1 semaine.&lt;/p&gt;
&lt;p&gt;Vous avez bien lu, 1 semaine de répit, &lt;strong&gt;YOUPI&lt;/strong&gt;. Je vous laisse deviner, ça a été l'apocalypse ensuite.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Avant de continuer, petite interrogation quand même : Pourquoi uniquement forgejo ? Et pourquoi je mentionne l'IA dans mon titre ?
C'est vrai, j'ai pas mal de ressource accessible, plutôt intéressante et bien écrit, je pense à &lt;a class="reference external" href="https://dryusdan.space"&gt;mon blog&lt;/a&gt; (😁) mais
également &lt;a class="reference external" href="https://open-freax.fr"&gt;open-freax&lt;/a&gt; ou encore &lt;a class="reference external" href="https://von.zone"&gt;Von&lt;/a&gt;, alors pourquoi tabasser ma forge logicielle ? Parce qu'il a été découvert
que pour affiner l'IA et ajouter une sorte de logique il faut du code !&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube-nocookie.com/embed/AfgAEIK9F8c?start=672" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;(Pour ceux qui n'arrive pas à lire la vidéo voici le liens : &lt;a class="reference external" href="https://www.youtube-nocookie.com/embed/AfgAEIK9F8c?start=672"&gt;https://www.youtube-nocookie.com/embed/AfgAEIK9F8c?start=672&lt;/a&gt; )&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;J'ai eu de plus en plus de forte charge. 700, 900, 1000 requêtes par secondes... Jusqu'à 4000 requêtes par secondes. Le serveur
s'écroule de nouveau bien sûr. J'arrive à voir ce qui coince : HAProxy et Crowdsec. Oui, j'ai branché HAProxy sur Crowdsec
et erreur courante je l'ai mis en live et non en stream donc chaque nouvelle IP équivalait à une requête vers Crowdsec.
Je tique, comment ça chaque nouvelle IP ? Genre j'ai 100&amp;nbsp;000 nouvelles IPs par minutes qui débarquent ?! Bingo...
En fait il y a deux choses, la stick-table n'est pas assez grande pour tout stocker ET j'ai bien 80&amp;nbsp;000 IPs différentes.
J'essaye de fixer mon mécanisme de protection et passer en stream mais rien n'a faire, à l'attaque suivante ça s'écroule. Je finis
par dégommer le lien Crowdsec — HAProxy à contrecœur et désactiver l'option captcha. Oui certains proches arrivaient à déclencher
le captcha et ça m'évitait donc de devoir les débloquer manuellement.&lt;/p&gt;
&lt;p&gt;Et ça a fonctionné, donc j'ai eu ENCORE plus de requête et donc l'infra c'est naturellement écroulé. Logique en même temps, j'ai
4 000 requêtes par secondes pendant quelques minutes, HAProxy collait les connexions en file d'attente, ça saturait ses pools et
vu les &amp;quot;maigres&amp;quot; ressource physique que j'ai à ma disposition et bien je ne peux pas supporter plus. J'ai donc plusieurs options qui
s'offre à moi :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Migrer mon code sur Framagit et coller ma forge derrière un SSO&lt;/li&gt;
&lt;li&gt;Mettre un CDN comme CloudFlare en frontal&lt;/li&gt;
&lt;li&gt;Bloquer comme je peux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour l'option 2 c'est hors de question, bien que je comprennes que pour se protéger de tout ça, un CDN avec un &amp;quot;Proof of Work&amp;quot; qui te
demande de cliquer fonctionne...&lt;/p&gt;
&lt;p&gt;L'option 1 non, mon instance forgejo c'est pour moi et aussi pour les autres. Tout déplacer sur Framagit c'est un taff monstrueux et ça
va venir me casser les pieds de devoir bypass le SSO en CLI.&lt;/p&gt;
&lt;p&gt;Donc il me reste plus que bloquer comme je peux. Mais comment ? Avec une allow list ? Une deny list ? Et sur quel critère ? Comment ?
Comme dit plus haut, j'ai 80 000 IPs en une minute, donc le blocage IP c'est inutile. Le user agent ? On peut mentir avec et puis ceux-là
ne me parle que de... Windows 95 avec Chromium ? Heuuuu... Et bah voilàààààà&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cv-RU&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.0.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/2918-07-10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;04&lt;/span&gt;:40:19.053303&lt;span class="w"&gt; &lt;/span&gt;Firefox/11.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cs-CZ&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/3588-01-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;:43:02.298790&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.6.14
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brx-IN&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.1.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/9696-01-11&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;:31:49.584930&lt;span class="w"&gt; &lt;/span&gt;Firefox/15.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bg-BG&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.0.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/8595-09-13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;:53:04.249512&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.6.8
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;az-AZ&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/6751-01-17&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;:30:55.867737&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.8
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ar-DZ&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/5519-07-23&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;09&lt;/span&gt;:07:44.640991&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.6.7
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/536.2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/63.0.886.0&lt;span class="w"&gt; &lt;/span&gt;Safari/536.2
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/536.2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/41.0.825.0&lt;span class="w"&gt; &lt;/span&gt;Safari/536.2
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/536.2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/38.0.823.0&lt;span class="w"&gt; &lt;/span&gt;Safari/536.2
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/536.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/58.0.858.0&lt;span class="w"&gt; &lt;/span&gt;Safari/536.1
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.2&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bg-BG&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/6144-04-13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;09&lt;/span&gt;:46:39.179108&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.8
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.2&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ar-BH&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/9990-07-19&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;08&lt;/span&gt;:59:31.454987&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.6.5
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/531.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/39.0.820.0&lt;span class="w"&gt; &lt;/span&gt;Safari/531.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/531.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/33.0.894.0&lt;span class="w"&gt; &lt;/span&gt;Safari/531.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/531.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/32.0.870.0&lt;span class="w"&gt; &lt;/span&gt;Safari/531.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/531.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/19.0.863.0&lt;span class="w"&gt; &lt;/span&gt;Safari/531.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/531.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/18.0.856.0&lt;span class="w"&gt; &lt;/span&gt;Safari/531.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xh-ZA&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.2.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/7467-01-26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;:00:37.052307&lt;span class="w"&gt; &lt;/span&gt;Firefox/9.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Windows&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.0&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi-VN&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rv:1.9.0.20&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gecko/6515-08-12&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;:33:35.702820&lt;span class="w"&gt; &lt;/span&gt;Firefox/3.6.12
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Linux&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Android&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.3.2&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/533.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/60.0.827.0&lt;span class="w"&gt; &lt;/span&gt;Safari/533.0
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mozilla/5.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Linux&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Android&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.3.2&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AppleWebKit/532.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;KHTML,&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;Gecko&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Chrome/45.0.864.0&lt;span class="w"&gt; &lt;/span&gt;Safari/532.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous aurez vite compris, je ne vous ai pas mis toutes les requêtes mais quelques-unes. Et de ça j'ai sorti un pattern pour bloquer les bots.
C'est pas parfait, un pote sous Windows 10 a été bloqué (c'est fixé) mais au moins ma forge respire.&lt;/p&gt;
&lt;p&gt;Juste après avoir bloqué tout ça dans HAProxy, j'ai vu passer de nouveau 2000 requêtes secondes puis plus rien. De temps en temps (comme
aujourd'hui) j'ai de nouveau des tentatives, mais comme HAProxy répond direct par un 403, je n'ai plus de saturation de mes pools de connexion.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;En résumé, j'ai perdu plusieurs jours à essayer de palier à des attaques incessantes (oui, dans mon métier, saturer un système au point de le rendre
indisponible à partir de multiple point ça s'appelle un DDoS (Attaque par déni de service)) d'entreprises souhaitant juste profiter de mes
&amp;quot;connaissances&amp;quot; et &amp;quot;créations&amp;quot;.  Ces entreprises ne respectent ni mes ressources matérielles, ni réseau, ne respecte pas la base du web et même
vont &lt;strong&gt;mentir&lt;/strong&gt; sur leurs noms. J'ai dû couper des services, réduire la simplicité d'utilisation et donc augmenter le &amp;quot;support&amp;quot; auprès de mes proches. J'ai également vu
une augmentation de ma facture électrique d'environs 1€ avec des pics à 150W alors que ma machine consomme entre 40W et 80W.&lt;/p&gt;
&lt;blockquote&gt;
Pour que quelqu'un d'autre se fasse du fric, j'ai dû perdre du temps, de l'argent et du confort pour moi et mes proches.&lt;/blockquote&gt;
&lt;p&gt;À quel moment on juge ça normal ? Demain vous avez Bernard Arnaud qui demande à venir dans votre voiture pour aller à l'autre bout de la
ville (là où vous n'allez pas) mais en dégageant tout le monde de votre voiture sauf vous, en chiant sur le fauteuil et en se barrant
sans rien dire vous trouveriez ça normal ?&lt;/p&gt;
&lt;p&gt;Je m'en contre fou de savoir si l'IA générative va être un avantage pour l'Humain. Aujourd'hui je paye en temps et en argent ce que des connards vont
monnayer ensuite sans que je touche un kopec.&lt;/p&gt;
&lt;p&gt;Google, comme il a été mis dans les commentaires de Lord, ne m'a jamais dégommé l'infra comme ça. Les scrappers qui cherchent des failles
non plus. J'ai bossé de nombreuse année dans l'hébergement web et j'ai JAMAIS vu le comportement décrit plus haut.&lt;/p&gt;
&lt;p&gt;L'humain je l'aperçois depuis 2016 sur mon blog, sur DryCat même, &lt;strong&gt;JAMAIS&lt;/strong&gt; il m'a mis à mal comme ça &lt;strong&gt;ET POURTANT&lt;/strong&gt; l'infra est là pour les servir,
partager et aider.&lt;/p&gt;
&lt;p&gt;Bref, l'IA pose des problèmes sociétaux très grave et autant des problèmes environnementaux. Le système dans lequel on vit n'est pas là pour arranger le tout.
Je ne cautionne pas l'IA, je suis même contre. Mais non content de constater que tout le monde s'en carre, je dois supporter en plus les couts de ces IA directement
chez moi ? Et si je ne suis pas content j'ai qu'à avoir une infrastructure professionnelle à plusieurs centaines d'euros ? &lt;strong&gt;Go fuck yourself&lt;/strong&gt; ! (Deep breath, calm down).&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://drewdevault.com/2025/03/17/2025-03-17-Stop-externalizing-your-costs-on-me.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Please stop externalizing your costs directly into my face&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Please stop externalizing your costs directly into my face page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Please stop externalizing your costs directly into my face page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Mon infra est designé par et pour des humains, pour un trafic raisonnable. Certes si demain l'intégralité du fediverse décide d'aller voir
mon blog ça risque de chauffer un peu (C'est déjà arrivé ^_^) mais c'est le risque et je l'accepte. Mais j'en tire une satisfaction
personnelle quand vous le lisez mon blog, quand vous laissez un petit mot sympa, partagez un article, posez une question...
Quand c'est englouti par du code, pour profiter à quelques entreprises j'en tire que dalle, ni visite, RIEN, juste un abus de consommation.
Ça sera vomi, plus tard, par du code ailleurs sans dire que j'ai mon infra et moi-même avons aidés.&lt;/p&gt;
&lt;p&gt;Je sais que c'est le jeu du chat et de la souris et qu'il va falloir trouver d'autres méthodes à l'avenir et franchement, pas merci.&lt;/p&gt;
&lt;p&gt;Allez, je vous laisse avec un petit article&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://ploum.net/2025-04-08-la-fin.html"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;La fin d’un monde ?&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;La fin d’un monde ? par Ploum - Lionel Dricot.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/db458fada899be73a35a77b73f05ec5a.png" alt="Image of La fin d’un monde ? page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/db458fada899be73a35a77b73f05ec5a.png" alt="Image of La fin d’un monde ? page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;(je découvre d'ailleurs que je ne suis pas sur planet-gemini.fr :( )&lt;/p&gt;
&lt;p&gt;EDIT: c'est bon j'y suis o:)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;cdr6934"&gt;Chris Ried&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 08 Apr 2025 14:56:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-08:/lia-et-forgejo</guid><category>Informatique</category><category>Hébergement</category></item><item><title>Désolé pour le spam dans vos lecteurs RSS</title><link>https://dryusdan.space/notes/2025/04/desole-pour-le-spam-dans-vos-lecteurs-rss</link><description>&lt;p&gt;Je viens de rencontrer un problème lors de la génération
automatique du site... 😅&lt;/p&gt;
&lt;p&gt;Pour faire court, j'ai ni fixé la version des dépendances à Pelican,
ni suivit les releases des dépendances (oups).&lt;/p&gt;
&lt;p&gt;Bref, désolé 😅&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 08 Apr 2025 13:40:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-08:/notes/2025/04/desole-pour-le-spam-dans-vos-lecteurs-rss</guid><category>notes</category></item><item><title>Visionnage : Novocaïne</title><link>https://dryusdan.space/visionage-novocaine</link><description>&lt;p&gt;Une fois n'est pas coutume, j'ai fait un tour au cinéma
(mon PEL aussi et il ne s'en est pas remis) pour aller
voir Novocaïne (interdit aux moins de 12 ans).&lt;/p&gt;
&lt;p&gt;Novocaïne c'est l'histoire d'un type qui ne ressent pas la douleur
et qui part sauver sa copine.&lt;/p&gt;
&lt;p&gt;Ouai, le scénario ne vend pas du rêve mais... C'est terriblement drôle.
Tout le concept du film repose sur du trash plutôt hardcore et sur un
humour très bien dosé. Ce n'était à aucun moment lourd ni gras. Il n'y a pas
8&amp;nbsp;000 explosions, pas de concours de testostérone, pas trop de sang
inutile (ouai si vous êtes hémophobique évitez). Vraiment ce côté
brut, héros mais pas super et encore moins héros j'aime bien.&lt;/p&gt;
&lt;p&gt;On est pas sur un scénario de l'année, ni sur une morale qui force une
remise en question, mais on ne s'est pas ennuyé une seule fois.&lt;/p&gt;
&lt;p&gt;Plus j'y repense, plus ça me fait penser à Deadpool, c'est un humour
totalement décalé, trash et en même temps très loin du super héros. Bien que
l'humour de Deadpool est parfois plus lourd que celui de Novocaïne.
C'est sympa à regarder, on rigole bien, on détourne le regard de temps
en temps. Franchement c'est le genre de film que je regarderai de nouveau.&lt;/p&gt;
&lt;p&gt;Je vous ai cherché la bande annonce &amp;quot;publicité&amp;quot; YouTube qui ne spoil
rien (et c'était pas évident).&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube-nocookie.com/embed/hKBxN5Fllhg" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;hr class="docutils" /&gt;
&lt;p&gt;Franchement j'suis pas fan de gore mais ça m'a bien fait marrer et si
vous pensez que c'est votre style, go for it hein, il y a de grande chance
que vous passiez un bon moment :D&lt;/p&gt;
&lt;p&gt;Sur ce, portez vous bien :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 07 Apr 2025 23:33:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-07:/visionage-novocaine</guid><category>Film</category><category>Œuvres culturelles</category></item><item><title>Daily prompts 01 avril 2025</title><link>https://dryusdan.space/prompts/2025/04/daily-prompt-2025-04-01</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
None&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-01-avril-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Null !&lt;/p&gt;
&lt;p&gt;Allez, plus sérieusement nous sommes à court de prompt ! N'hésitez pas
à nous aider : &lt;a class="reference external" href="https://semestriel.framapad.org/p/prompt-pour-blogger-aah5"&gt;https://semestriel.framapad.org/p/prompt-pour-blogger-aah5&lt;/a&gt; 😊&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 01 Apr 2025 13:37:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-01:/prompts/2025/04/daily-prompt-2025-04-01</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Créer son template de VM pour un cloud</title><link>https://dryusdan.space/notes/2025/04/creer-son-template-de-vm-pour-un-cloud</link><description>&lt;p&gt;Debian 12.10 est sorti, je n'ai pas de système de génération d'image automatique
(comme avec Packer) donc je dois regénérer une nouvelle image pour l'hyperviseur au boulot (Opennebula).&lt;/p&gt;
&lt;p&gt;Je l'avais fais à l'époque pour Proxmox mais je n'avais rien noté... Donc autant s'y atteler maintenant !&lt;/p&gt;
&lt;p&gt;Bon, en réalité j'ai tout noté dans mon wiki, il est prévu pour ça.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://wiki.dryusdan.fr/books/linux/page/creer-un-nouveau-template-proxmox-opennebula"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Créer un nouveau templ... | DryWIki&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Télécharger l'image
D'abord, nous téléchargons l'image cloud officielle.

Pour Debian : Debian Offic...&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Créer un nouveau templ... | DryWIki page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of Créer un nouveau templ... | DryWIki page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Mais j'ai quand même deux commandes à partager :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cloud-init&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;--logs
journalctl&lt;span class="w"&gt; &lt;/span&gt;--vacuum-time&lt;span class="o"&gt;=&lt;/span&gt;1s
rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/root/.ssh/authorized_keys&lt;span class="w"&gt; &lt;/span&gt;/home/debian/.ssh/authorized_keys&lt;span class="w"&gt; &lt;/span&gt;/home/ubuntu/.ssh/authorized_keys
&lt;span class="nb"&gt;history&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-c
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On indique à cloud-init qu'il ne s'est jamais lancé, on dégomme tous les journaux (apt, boot etc...)
et on vire l'historique et les clés SSH autorisées pour que ça fasse propre.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 01 Apr 2025 13:30:00 +0200</pubDate><guid>tag:dryusdan.space,2025-04-01:/notes/2025/04/creer-son-template-de-vm-pour-un-cloud</guid><category>notes</category><category>Labs</category></item><item><title>Petit plaisir du velotaff</title><link>https://dryusdan.space/notes/2025/03/petit-plaisir-du-velotaff</link><description>&lt;img alt="On est sur un pont. En premier plan on voit un vélo vert avec une sacoche jaune et un cintre route. Il est posé contre la barière du pont. A droite on voit des immeubles, à gauche quelques arbres et un quai (le quai de la fosse). En contre bas on voit la loire et en arrière plan un ciel or et ocre d'un soleil levant qui se reflete sur la loire" class="image-process-article-image" src="/content/images/2025/03/25-03-19.png" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 19 Mar 2025 08:23:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-19:/notes/2025/03/petit-plaisir-du-velotaff</guid><category>notes</category></item><item><title>Daily prompts 17 mars 2025</title><link>https://dryusdan.space/prompts/2025/03/daily-prompt-2025-03-17</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
As-tu déjà écrit sur d'autres plateformes de blogging ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-17-mars-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Yep, avant j'utilisais Ghost. En soi le rendu est cool, le moteur
de blog fonctionne bien et est bien efficace. La documentation de
développement de thème est complète.&lt;/p&gt;
&lt;p&gt;Mais entre les upgrades (très) fréquente et le fait que parfois,
aléatoirement certaines mises à jour ajoute des dépendances (genre portal)
qui apportent des dépendances externe et qui n'y a aucun moyen documenté pour
empêcher ça c'est un poil gonflant. (Il y a un paramètre dans le fichier de
configuration pour utiliser une version selfhost de portal).&lt;/p&gt;
&lt;p&gt;Mine de rien, Ghost c'était 200Mo de RAM constant, sans compter la
base de donnée. Et dans un esprit de lowtech, ça commençait à fortement m'agacer.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 17 Mar 2025 08:41:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-17:/prompts/2025/03/daily-prompt-2025-03-17</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 14 mars 2025</title><link>https://dryusdan.space/prompts/2025/03/daily-prompt-2025-03-14</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
C'est quoi ton vélo préféré ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-14-mars-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Heuuuu... J'hésite... Tous ? 😇&lt;/p&gt;
&lt;p&gt;Bon, à vrai dire mon fixie est mon préféré, je me le suis même fais tatouer sur le bras.&lt;/p&gt;
&lt;p&gt;En seconde place y a mon Bullit ^^&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 16 Mar 2025 17:25:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-16:/prompts/2025/03/daily-prompt-2025-03-14</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 15 mars 2025</title><link>https://dryusdan.space/prompts/2025/03/daily-prompt-2025-03-15</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Si tu as un blog, quelle plateforme utilises-tu pour gérer ton blog
et pourquoi l'as-tu choisie ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-15-mars-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J'utilise Pelican, un générateur de site statique. L'énorme avantage est
que je suis extrêmement libre sur tous ce que je veux faire. Par exemple
le listing de prompt ou de notes sont une catégorie normal mais j'ai pu
modifier le template pour que ces pages ai leurs aspects actuelle. Également,
c'est tellement modulable que j'ai pu rentre le blog accessible sur Gemini et Tor
(sans rien leak en dehors) sans grande modification&lt;/p&gt;
&lt;p&gt;Le moteur de rendu utilise Jinja2, qui est le moteur de template de Ansible
que j'utilise énormement.
Pelican est en Python donc je peux très aisément développer des plugins
dessus (comme le plugin jamming ou bookmarks).&lt;/p&gt;
&lt;p&gt;C'est vraiment un excellent moteur de blog !&lt;/p&gt;
&lt;p&gt;D'ailleurs tous est listé dans ma page &lt;a class="reference external" href="/colophon"&gt;/colophon&lt;/a&gt;&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/colophon"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;/colophon&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Note finale d'un ouvrage écrit, fournissant les références de cet ouvrage et donnant les indications relatives à son impression.

Yes, ça c'est du mot qu'on n'utilise pas souvent.

Dryusdan.space se repose sur le CMS open-source Ghost. Le thème utilisé est Casper, un thème HandlebarJS développé par l'équipe de Ghost&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/d8a185060691dd15fdcd2ea9345f3c02.png" alt="Image of /colophon page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/d8a185060691dd15fdcd2ea9345f3c02.png" alt="Image of /colophon page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 15 Mar 2025 10:08:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-15:/prompts/2025/03/daily-prompt-2025-03-15</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Les oubliés de la supervision : Le DNS</title><link>https://dryusdan.space/les-oublies-de-la-supervision-le-dns</link><description>&lt;p&gt;Quand on pense supervision, très souvent on pense à superviser l'état de
la machine, la RAM dispo, l'espace disque occupé. À la rigueur les
applications qui sont dessus voir même les sites web et dans un cas extrême
les certificats x509.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et le DNS alors ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le DNS (surtout le DNS faisant autorité), est un élément souvent très important
de nos infras, à peine moins important que le serveur lui-même et son réseau.
Pourtant il n'est que très faiblement supervisé. C'est vrai qu'une fois en
place et configuré, on y touche très peu et c'est stable (surtout si on
peut faire confiance à son prestataire).&lt;/p&gt;
&lt;p&gt;Mais le DNS ce n'est pas qu'un seul prestataire. Il y a le fournisseur de service
DNS faisant autorité, le bureau d'enregistrement et le registre. Vous avez donc au
minimum 2 prestataire de service. Et si vous faites les choses bien, vous en avez
un 3ème qui fournit des serveurs DNS secondaire, pour éviter que la panne d'un
prestataire vous impact (oui, le DNS est très résilient).&lt;/p&gt;
&lt;p&gt;Bref, à chaque brique un problème peut s'ajouter et parfois de manière pernicieuse.
Les enregistrements DS (&lt;a class="reference external" href="https://www.bortzmeyer.org/4033.html"&gt;DNSSEC&lt;/a&gt;) qui sont supprimés ne protégeant plus votre domaine
des DNS menteurs, votre DNS secondaire qui n'est pas mis à jour, le certificat poussé
n'est plus le même que celui renseigné dans votre enregistrement TLSA (&lt;a class="reference external" href="https://www.bortzmeyer.org/6698.html"&gt;DANE&lt;/a&gt;)...
Bien sûr j'avance pas ces idées avec des &amp;quot;Et si ?&amp;quot;, &amp;quot;C'est possible j'vous jure&amp;quot;,
avant de creuser la supervision de mes DNS j'ai essuyé quelques incidents avec un
prestataire.&lt;/p&gt;
&lt;div class="section" id="l-enregistrement-ds-disparu"&gt;
&lt;h2&gt;L'enregistrement DS disparu&lt;/h2&gt;
&lt;p&gt;Ça c'est le plus grand scandale que j'ai rencontré, j'ajoute un nouveau serveur DNS chez mon bureau
d'enregistrement qui envoie ça au registre, tout ce passe bien.
3 semaines plus tard je joue avec &lt;a class="reference external" href="https://zonemaster.net/fr/run-test"&gt;ZoneMaster&lt;/a&gt; et je découvre avec stupeur que la signature du domaine
n'est plus validé, car les enregistrements DS ont disparu de chez le registre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-serveur-secondaire-qui-vous-empoisonne"&gt;
&lt;h2&gt;Le serveur secondaire qui vous empoisonne&lt;/h2&gt;
&lt;p&gt;Celui-ci n'a pas été facile à trouver, j'ai changé une IP d'un de mes enregistrements
et pour une raison inconnue je voyais toujours l'ancienne. Je vide mon cache DNS, rebelote
j'ai la mauvaise IP. Je vérifie sur mon serveur DNS principal, c'est pourtant la bonne IP.
Je re nettoie mon cache DNS et POUF ça marche. Bon bah nickel, j'passe à autre chose... 2h
passe ET BOOM ça re-casse avec le même problème... Je passe donc manuellement sur CHAQUE
serveur DNS faisant autorité qui porte ma zone (principal et secondaire) et je découvre qu'un
de mes serveurs secondaires ne s'étaient pas mis à jour. Bon, une petite défaillance, je
relance un notify et ça passe. 3j plus tard je change une autre IP et je me fade le même problème.&lt;/p&gt;
&lt;p&gt;Vous l'aurez compris, le coup du serveur DNS secondaire qui ne se met pas à jour, il aurait
été monitoré je n'aurais pas cherché plus loin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-decomissionnement-partiel-d-un-serveur-dns"&gt;
&lt;h2&gt;Le décomissionnement partiel d'un serveur DNS&lt;/h2&gt;
&lt;p&gt;Un petit dernier pour la route, suite à ma précédente découverte, j'ai dégagé ce serveur
secondaire en retirant l'enregistrement &lt;tt class="docutils literal"&gt;NS&lt;/tt&gt; de ma zone en oubliant totalement d'avertir le
registre que je n'utilise plus ce serveur. Ça vous laisse quelques surprises aléatoires ensuite.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Mini-cours vite fait, pourquoi mon registre est censé connaitre mon enregistrement DS et
mes serveurs DNS ?&lt;/p&gt;
&lt;p&gt;C'est le fonctionnement de base du DNS, c'est récursif. Je vais prendre un exemple tout
simple : &lt;tt class="docutils literal"&gt;dryusdan.fr.&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Pour récupérer les données d'un enregistrement (&lt;tt class="docutils literal"&gt;TXT&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;OPENPGPKEYS&lt;/tt&gt;...) il faut
demander, mais à qui on demande ? C'est là que la récursivité rentre en compte. Comme je ne
sais pas qui porte &lt;tt class="docutils literal"&gt;dryusdan.fr&lt;/tt&gt;, je vais demander aux roots DNS (&lt;tt class="docutils literal"&gt;.&lt;/tt&gt;) &amp;quot;qui porte &lt;tt class="docutils literal"&gt;fr.&lt;/tt&gt; ?&amp;quot;.
Ils vont me répondre que c'est l'AFNIC. Je vais voir l'AFNIC et je lui demande &amp;quot;qui
porte &lt;tt class="docutils literal"&gt;dryusdan.fr.&lt;/tt&gt; ?&amp;quot;. L'AFNIC va donc me répondre que c'est mes 7 serveurs DNS. Au passage
l'AFNIC va me dire &amp;quot;la zone est signé par cette clé, donc si la signature (&lt;tt class="docutils literal"&gt;RRSIG&lt;/tt&gt;) que le
serveur va te répondre est invalide, tu considères que l'enregistrement n'est pas bon.
J'arrive sur mes serveurs DNS (admettons &lt;tt class="docutils literal"&gt;ns1.lecygnenoir.info.&lt;/tt&gt; histoire de vous épargner
l'histoire de la GLUE) qui va enfin me filer la réponse que j'ai demandée.&lt;/p&gt;
&lt;p&gt;Donc si là-dedans l'AFNIC connait un mauvais serveur DNS et que votre serveur récursif le
contact, ça peut faire des pétales de maïs soufflé au chocolat.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Vous l'aurez compris, il faut monitorer, mais pour ça il faut savoir ce qu'il faut monitorer.
J'ai noté tout ça :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;L'expiration du nom de domaine (c'est con mais ça arrive)&lt;/li&gt;
&lt;li&gt;La cohérence entre la liste des NS connu au niveau registre et dans notre domaine&lt;/li&gt;
&lt;li&gt;Le serial (présent dans le &lt;tt class="docutils literal"&gt;SOA&lt;/tt&gt;) identique sur chaque serveur autoritaire (pour éviter
le serial drifting)&lt;/li&gt;
&lt;li&gt;La validation du DNSSEC&lt;/li&gt;
&lt;li&gt;La cohérence entre vos enregistrements &lt;tt class="docutils literal"&gt;TLSA&lt;/tt&gt; et vos certificats (bah ouai, vaut mieux éviter de
péter les mails pour un oubli comme ça)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;D'ailleurs si vous chercher à mettre en place DANE (TLSA) je ne peux que vous recommander
l'article de &lt;a class="reference external" href="https://toutetrien.lithio.fr/article/mettre-en-place-dane-tlsa/"&gt;Codimp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L'avantage de Debian c'est qu'il existe des paquets déjà existant pour superviser vos enregistrements
TLSA et DNSSEC : &lt;tt class="docutils literal"&gt;dnsutils&lt;/tt&gt; qui nous fournit le binaire &lt;tt class="docutils literal"&gt;delv&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;hash-slinger&lt;/span&gt;&lt;/tt&gt; qui nous fourni
le binaire &lt;tt class="docutils literal"&gt;tlsa&lt;/tt&gt;. Il y a plus qu'à construire des scripts autour !&lt;/p&gt;
&lt;p&gt;Comme il s'agit de script orienté pour Zabbix, j'utilise des outputs 0 ou 1 mais vous pouvez facilement
modifier ça.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/zabbix-check-dnssec/src/branch/main/test-dnssec.sh"&gt;check-dnssec.sh&lt;/a&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c1"&gt;# Zabbix utility to check if domain is OK&lt;/span&gt;
delv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fully validated&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0&lt;/tt&gt; signifie que le domaine est correctement signé&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;1&lt;/tt&gt; signifie qu'il y a un problème&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/check_tlsa/src/branch/main/check_tlsa.sh"&gt;check-tlsa.sh&lt;/a&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c1"&gt;## author      : Dryusdan&lt;/span&gt;
&lt;span class="c1"&gt;## date        : 30/05/2024&lt;/span&gt;
&lt;span class="c1"&gt;## description : TLSA check&lt;/span&gt;
&lt;span class="c1"&gt;## usage       : ./check_tlsa example.tld&lt;/span&gt;

&lt;span class="nv"&gt;SUBDOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUBDOMAIN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Subdomain name must be defined&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.[].&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUBDOMAIN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;.ports[]&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/dane_tlsa.conf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s/_//g&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;tlsa&lt;span class="w"&gt; &lt;/span&gt;--verify&lt;span class="w"&gt; &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--protocol&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUBDOMAIN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;/dev/null
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lui il est un poil plus velu à mettre en place. Le script tout pareil renvoie 0 si c'est bon et 1 si y a un souci.
Mais le truc le plus important est le fichier &lt;tt class="docutils literal"&gt;/etc/dane_tlsa.conf&lt;/tt&gt;. De mon côté il est généré automatiquement via
Ansible (avec &lt;a class="reference external" href="https://git.dryusdan.fr/Ansible/reverseproxy-to-dane-config"&gt;ce playbook&lt;/a&gt;). Dans l'idée je récupère toute la liste des ACL &amp;quot;domain&amp;quot; géré par HAProxy et par Nginx
puis je combine les données avec la variable &lt;tt class="docutils literal"&gt;dane_custom_config&lt;/tt&gt; de cette manière:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;dane_custom_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;irc.dryusdan.net&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_443._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_6697._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;3600&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dryusdan.im&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_443._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_5223._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_5270._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_5349._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;3600&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour finir par générer un fichier comme ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;dryusdan.space&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;enabled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ports&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_443._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ttl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;irc.dryusdan.net&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;enabled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ports&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_443._tcp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_6697._tcp&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ttl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois ça fait, quand on lance &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;check-tlsa.sh&lt;/span&gt; dryusdan.space&lt;/tt&gt;, le
script récupère ce fichier et essaye chaque port tcp indiqué, et si un
échoue ça retourne &lt;tt class="docutils literal"&gt;1&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Pour récupérer la liste des sous domaine je lis ce fichier et récupère
toutes les clés (&lt;a class="reference external" href="https://git.dryusdan.fr/Ansible/zabbix-monitoring-extra/src/branch/main/tasks/main.yml#L53-L58"&gt;avec Ansible&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Pour vérifier l'expiration des domaines, initialement j'utilisais WHOIS...
Mais je suis tombé sur RDAP qui permet de simplifier tout ça... Pour les
registres qui le supporte (bien sûr, sinon ça serait trop facile). J'ai
donc pris &lt;a class="reference external" href="https://gitlab.rd.nic.fr/afnic/code-samples/-/blob/main/RDAP/Python/check_expiration.py"&gt;le code de l'AFNIC&lt;/a&gt; que j'ai un poil adapté pour Zabbix tout en
supportant whois en fallback. Il n'a aucune particularité autre que
retourner un exit code à &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; : &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/check_ns_whois/src/branch/main/domain_expire.py"&gt;domain_expire.py&lt;/a&gt;. Ça ne
fonctionne pas avec le &lt;cite&gt;.eu&lt;/cite&gt; qui a un whois très pauvre et ne supporte
pas le RDAP.&lt;/p&gt;
&lt;p&gt;De manière identique, le script &lt;a class="reference external" href="https://git.dryusdan.fr/Dryusdan/check_ns_whois/src/branch/main/check_ns_whois.py"&gt;check_ns_whois.py&lt;/a&gt; parsait le retour du whois
pour récupérer les serveurs. Au final j'ai réecrit ça grâce au script &lt;tt class="docutils literal"&gt;domain_expire&lt;/tt&gt;.
Je récupère les domaines grâce au RDAP et sinon je fallback sur le whois...
Avant de me rendre compte que je peux récupérer les NS que renvoie directement le serveur
DNS du TLD (et au final j'aurais pu éviter le rdap mais bon, c'est fait).&lt;/p&gt;
&lt;p&gt;Le serial est la dernière chose qu'il manque ici pour la liste des choses à monitorer.
Pour rappel, le serial est un élément d'un enregistrement de type &lt;tt class="docutils literal"&gt;SOA&lt;/tt&gt; (pour Start Of Autorithy).
Le fonctionnement est assez simple et l'outil ne dépend que de la librairie DNS python.
L'outil n'est pas de moi mais fonctionne très bien et est bien expliqué. Les sources sont
disponibles sur &lt;a class="reference external" href="https://github.com/shuque/check_serial.git"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour ceux qui utilisent Zabbix, j'utilise un playbook ansible pour le populer tout ça
mais ça veut dire que j'ai des userparams pour ça :)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.domains.discovery,data=$(echo {\&amp;quot;data\&amp;quot;:[]})&lt;/span&gt;&lt;span class="c1"&gt;;for domain in $(cat /etc/zabbix/check_config/domain_list.txt);{%- raw -%}do data=$(echo ${data} | jq &amp;#39;.data += [{&amp;quot;{#DOMAIN}&amp;quot;: &amp;quot;&amp;#39;${domain}&amp;#39;&amp;quot;}]&amp;#39;); done{%- endraw -%};echo &amp;quot;${data}&amp;quot; | jq -cr&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.subdomains.discovery,data=$(echo {\&amp;quot;data\&amp;quot;:[]})&lt;/span&gt;&lt;span class="c1"&gt;;for domain in $(cat /etc/zabbix/check_config/domain_list.txt /etc/zabbix/check_config/subdomain_list.txt | sort | uniq);{%- raw -%}do data=$(echo ${data} | jq &amp;#39;.data += [{&amp;quot;{#SUBDOMAIN}&amp;quot;: &amp;quot;&amp;#39;${domain}&amp;#39;&amp;quot;}]&amp;#39;); done{%- endraw -%};echo &amp;quot;${data}&amp;quot; | jq -cr&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.serial_drift[*],/usr/local/bin/check_serial/check_serial.py -t 1 -m mul.dryusdan.fr $1 &amp;gt;/dev/null&lt;/span&gt;&lt;span class="c1"&gt;; echo $?&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.ns_diff[*],/usr/local/bin/check_ns_whois/check_ns_whois.py $1 &amp;gt;/dev/null&lt;/span&gt;&lt;span class="c1"&gt;; echo $?&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.expire[*],/usr/local/bin/check_ns_whois/domain_expire.py --domain $1 2&amp;gt;/dev/null&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.check_dnssec[*],/usr/local/bin/check_dnssec/test-dnssec.sh $1 2&amp;gt;/dev/null&lt;/span&gt;
&lt;span class="na"&gt;UserParameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dns.tlsa[*],/usr/local/bin/check_tlsa/check_tlsa.sh $1 2&amp;gt;/dev/null&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien sur il faut &lt;a class="reference external" href="https://git.dryusdan.fr/Ansible/zabbix-config/src/branch/main/files/template_DNS_check.json"&gt;le template&lt;/a&gt; adapté (présent aussi sur mon git).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Aujourd'hui c'est un article moins fun. Il reste technique mais... Pas de la même
veine que d'autres de mes articles. Mais ça reste utile techniquement.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;ibrahimboran"&gt;Ibrahim Boran&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 10 Mar 2025 10:46:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-10:/les-oublies-de-la-supervision-le-dns</guid><category>Labs</category><category>Labs</category><category>Informatique</category></item><item><title>J’ai testé 12train</title><link>https://dryusdan.space/notes/2025/03/jai-teste-12train</link><description>&lt;p&gt;C’est toujours sympa de tester des nouvelles choses et aujourd’hui (enfin hier) c’était 12train.&lt;/p&gt;
&lt;p&gt;Ce que je vais retenir c’est que réserver un billet pour 3 personnes (enfin 3 billets du coup) à été plus rapide en enregistrant tout le monde à la main et en tapant la carte bleu (à grand coup de copier coller) sur 12train plutôt que de cliquer 5x sur
suivant puis payer avec Apple Pay sur sncf-connect.&lt;/p&gt;
&lt;p&gt;À voir si utiliser un autre navigateur que Firefox Focus permet d’avoir plus d’auto complétion ou avoir Apple Pay.&lt;/p&gt;
&lt;p&gt;J’avoue que si je devais raler, il manque juste l’enregistrement de profil pour faire de la sélection rapide mais ça c’est plus de la faute des amis avec des noms à rallonge et de la sncf qui impose les réservations des billets TER avec des identités
complètes.&lt;/p&gt;
&lt;p&gt;Sur ce, bonne journée o/&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 09 Mar 2025 10:51:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-09:/notes/2025/03/jai-teste-12train</guid><category>notes</category></item><item><title>Rétrospective de février 2025</title><link>https://dryusdan.space/notes/2025/02/retrospective-fevrier-2025</link><description>&lt;p&gt;C'est parti pour la retrospective de février. o/&lt;/p&gt;
&lt;p&gt;Comme la dernière fois, on commence par les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;325&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;334&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;2 minutes de lecture&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;11,23Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagé sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;303,27&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Je cherche un nouveau travail !&lt;/p&gt;
&lt;p&gt;Ha et j'ai une nouvelle année au compteur.&lt;/p&gt;
&lt;p&gt;J'ai pas grand chose à raconter ce mois ci ^^&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 07 Mar 2025 09:35:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-07:/notes/2025/02/retrospective-fevrier-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Daily prompts 04 mars 2025</title><link>https://dryusdan.space/prompts/2025/03/daily-prompt-2025-03-04</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
C'est quoi tes/les excursions urbex qui t'ont le plusse marqué ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-04-mars-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je n'en fais pas ! Mais j'ai découvert deux Youtubeur qui en fond et les photos
sont très impressionnantes. Il s'agit du duo Hit the Road ;)&lt;/p&gt;
&lt;p&gt;Je vous met une de leurs vidéos ici. Vraiment les images sont vraiment jolie et travaillé !&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube-nocookie.com/embed/tolVq0rHjI4" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 04 Mar 2025 07:40:00 +0100</pubDate><guid>tag:dryusdan.space,2025-03-04:/prompts/2025/03/daily-prompt-2025-03-04</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 27 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-27</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Là, comme ça, qu’est est le dernier jeu que t’as apprécié·e&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-27-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;ENCORE ?&lt;/p&gt;
&lt;p&gt;Cyberpunk 2077... Je vous ai dis que je le joue pour la 4ème fois en mode hardcore ?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Allez, j'vais trouver autre chose.&lt;/p&gt;
&lt;p&gt;Un jeu que j'avais beaucoup apprécié : Dust: An Elysian Tail.&lt;/p&gt;
&lt;p&gt;Un action RPG que j'ai trouvé vraiment sympa à jouer et là fin m'a un peu ému.
On est sur une recherche de son identité bien sûr (j'ai l'impression que c'est
ma ligne éditoriale).&lt;/p&gt;
&lt;p&gt;C'est dispo sur Linux, Mac, Windows, Switch et trouvable sur &lt;a class="reference external" href="https://www.gog.com/fr/game/dust_an_elysian_tail"&gt;Gog&lt;/a&gt; ou Steam :)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 27 Feb 2025 10:23:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-27:/prompts/2025/02/daily-prompt-2025-02-27</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 25 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-25</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Les cadeaux de Noël sont déjà en rayon. Tu vas craquer ou tu t'en
fous de Noël ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-25-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;C'est tôt cette année dit donc oO&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 25 Feb 2025 17:02:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-25:/prompts/2025/02/daily-prompt-2025-02-25</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 24 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-24</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Les jeux vidéos qui t'ont marqués à vie.&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-24-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Cyberpunk 2077 !&lt;/p&gt;
&lt;p&gt;Je suis à ma 4ème run, cette fois ci en hardcore et Cyberpunk 2077 arrive
toujours à autant me remuer.&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/instant-jeux-video-cyberpunk-2077"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Instant jeux vidéo : Cyberpunk 2077&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;⚠️ Attention, cet article contient des élements pouvant vous spoiler le jeu. S'il y a un jeu qui m'a beaucoup marqué ces dernières années, c'est Cyberpunk 2077. Un petit résumé pour ceux qui ont suivi de très loin le jeu, qui n'ont entendu parler que des bugs (dont j'ai été épargné …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/5abe23e9a2b6b9d596b09b3bc2030a92.png" alt="Image of Instant jeux vidéo : Cyberpunk 2077 page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/5abe23e9a2b6b9d596b09b3bc2030a92.png" alt="Image of Instant jeux vidéo : Cyberpunk 2077 page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 10:05:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-24</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 23 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-23</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quelle est la randonnée que tu as préféré faire ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-23-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Dans un tout premier temps je pensais à ma sortie avec des amis, du VTT
en étant ado pour faire Gétigné - Tiffauge. En vrai, on avait rien planifié,
on allait là où le chemin semblait intéressant ^^&lt;/p&gt;
&lt;p&gt;Puis je me suis souvenu à la marche autour de Camaret-sur-Mer, un moment sympa
avec ma compagne tout en profitant du paysage et de la nature qui reprend progressivement
ce qui lui a été retiré pendant la guerre.&lt;/p&gt;
&lt;p&gt;J'ai le début de mon épreuve d'ultra cyclisme qui était superbe... Mais je me suis blessé,
c'est donc pas ma préféré.&lt;/p&gt;
&lt;p&gt;Au final je vais mettre mon escapade de 2j en Bretagne ! Mais je vais vous mettre le lien
vers cet article ;)&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/mon-premier-voyage-a-velo-reussi"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Mon premier voyage à vélo réussi !&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;J'ai plusieurs fois (trois fois) tentés de voyager à vélo. Mais chaque voyage n'était pas réellement couronnés de succès. Je me fixais des objectifs atteignables mais compliqués, sans trop m'écouter. La première fois j'ai embarqué mon vélo et la remorque. Autant vous dire que la vélodyssée à vélo avec une …&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/47266e923bd5509f641b411faac4ab58.png" alt="Image of Mon premier voyage à vélo réussi ! page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/47266e923bd5509f641b411faac4ab58.png" alt="Image of Mon premier voyage à vélo réussi ! page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:58:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-23</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 22 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-22</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
C'est quoi ton sport préféré ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-22-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Le vélo !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:50:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-22</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 21 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-21</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quelle est la photo que tu as prises dont t'es ela plusse fier'e ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-21-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J'en ai fais un paquet, mais même si j'aime bien les compositions des photos du
musée &amp;quot;Stratt art&amp;quot;, la beauté de ces photos repose principalement sur l'oeuvre elle même.&lt;/p&gt;
&lt;p&gt;Alors je suis revenu sur les bateaux de Camaret-sur-Mer.&lt;/p&gt;
&lt;p&gt;Je n'arrive pas à me décider entre les deux l'une d'elle est cramé mais la couleur du bateau
est plus proche de la réalité. À l'inverse l'autre est plus petite et trop centré sur le bateau.&lt;/p&gt;
&lt;img alt="On apperçoit un bateau de peche rouillé, blanc et bleu. Un bateau de peche vert se trouve à gauche et on apperçoit juste une coque en bois. Loin en arrière plan on apperçoit une flotte de bateau de tourisme." class="image-process-article-image" src="/content/images/2025/02/IMG_20190904_203012.jpg" /&gt;
&lt;img alt="On apperçoit un bateau de peche rouillé, blanc et bleu." class="image-process-article-image" src="/content/images/2025/02/IMG_20190904_203016.jpg" /&gt;
&lt;p&gt;En écrivant un autre article je suis tombé sur celle ci aussi que j'aime beaucoup. Entre
Douardenez et le moment, je la trouve superbe&lt;/p&gt;
&lt;img alt="On est sur un pont. En bas se trouve un port, touristique mais aussi de peche. À droite on apperçoit les quais et le marché, a gauche les habitations. Le soleil se lève déposant une couleur doré dans le ciel." class="image-process-article-image" src="/content/images/2023/02/IMG_20230122_090140.jpg" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:29:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-21</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 19 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-19</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel album de quel artiste dont t'as aimé chaque morceau sans exception ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-19-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://davodkalv2t.bandcamp.com/album/proc-s-verbal"&gt;Procès verbal&lt;/a&gt; de Davodka.&lt;/p&gt;
&lt;p&gt;J'aime bien son style, ses musiques et on peut rajouter à ça une petite attention
à son album physique qui possède des musiques non disponible sur les plateformes
de streaming ;)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:17:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-19</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 16 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-16</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Dans quelle mesure pensez vous réduire vos déchets ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-16-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Houla heuuuu... On fait un effort considérable.&lt;/p&gt;
&lt;p&gt;Très peu de commande sur internet, peu de course alimentaire en dehors
de notre épicerie vrac locale.&lt;/p&gt;
&lt;p&gt;Ça aide pas mal... Après prendre une pizza surgelé ça remplis déjà la
poubelle en carton et plastique -.-&lt;/p&gt;
&lt;p&gt;Je vais dire &amp;quot;On fait au mieux mais peut mieux faire quand même&amp;quot;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:14:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-16</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 13 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-13</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel avantage non-officiel de votre boulot préferez-vous ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-13-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Le temps libre ! Je dois avoir environs 35h de temps libre sur 38h12 de
travail en présentiel par semaine.&lt;/p&gt;
&lt;p&gt;Sans déconner j'en peux plus, c'est pour ça que &lt;a class="reference external" href="https://social.dryusdan.fr/notice/ArHIqiB2vSr6GrqXmi"&gt;j'ai fais appel&lt;/a&gt; à vous...
Et puis je ne suis pas super bien payé non plus, donc même louer un serveur
ou acquerir du matos d'occas c'est 2 mois d'économies minimum... C'est compliqué
quand on veut jouer un peu avec sa passion ^^'&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 09:05:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-13</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 12 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-12</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Si tu pouvais être une créature de fiction, ce serait la-quelle ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-12-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Un chat ! Y en a toujours, dans les fictions ou pas d'ailleurs (ok, peut-être pas dans
Le Seigneur des Anneaux).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 08:59:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-12</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 11 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-11</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Là, comme ça, qu’est est le dernier film que t’as apprécié·e&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-11-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je vais tricher et parler d'un film que j'ai vu ce week-end et pas le
11 février&lt;/p&gt;
&lt;p&gt;The Wild Robot ! Nommé Le Robot sauvage en Français et Robot sauvage pour nos ami⋅es québécois⋅es.&lt;/p&gt;
&lt;p&gt;Je n'arriverai pas tant à vous le décrire là comme ça, et n'importe quel synopsis est dispo sur
Wikipedia. Mais j'ai trouvé la direction artistique magnifique et le film est très touchant (et quand
je dis très touchant il m'a arraché des larmes à plusieurs reprises è_é).&lt;/p&gt;
&lt;p&gt;Bref, foncez et regardez-le !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 08:56:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-11</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 08 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-08</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Là, comme ça, qu’est est la dernière musique que t’as apprécié·e&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-08-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Alors la dernière je sais plus trop, mais je vais dire &lt;a class="reference external" href="https://combine.fm/youtube/track/sVtD-o7wfJ4"&gt;Mirage de Yuston XIII&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J'aime bien le rythme et le style&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 24 Feb 2025 08:55:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-24:/prompts/2025/02/daily-prompt-2025-02-08</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Friendly reminder : faites des backups !</title><link>https://dryusdan.space/notes/2025/02/friendly-reminder-faites-des-backups</link><description>&lt;p&gt;Faites des backups !&lt;/p&gt;
&lt;p&gt;Vraiment !&lt;/p&gt;
&lt;p&gt;J'attends...&lt;/p&gt;
&lt;p&gt;... Allez ! Je rigole pas è_é&lt;/p&gt;
&lt;p&gt;Bon, plus sérieusement aujourd'hui elles viennent de sauver plus de 48h
d'heure d'audio et de retranscription pour une thèse. Une sombre histoire
de dossier que j'ai supprimé (oups) par mégarde.&lt;/p&gt;
&lt;p&gt;Mais alors, comment sont effectués mes sauvegardes ? Parce que dire
&amp;quot;oui, faites des sauvegardes !&amp;quot; ces mignons 5 minutes mais ça ne vous
aide pas à savoir comment faire.&lt;/p&gt;
&lt;p&gt;J'utilise &lt;a class="reference external" href="https://www.borgbackup.org/"&gt;Borg&lt;/a&gt;, il est simple, redoutablement efficace, peu
gourmand en espace disque et Borg apporte une couche de chiffrement.&lt;/p&gt;
&lt;p&gt;Alors oui c'est une CLI, mais si j'en parle c'est qu'il n'y a pas qu'une CLI !&lt;/p&gt;
&lt;p&gt;Il existe &lt;a class="reference external" href="https://torsion.org/borgmatic/"&gt;Borgmatic&lt;/a&gt; qui est une CLI aussi (oups).&lt;/p&gt;
&lt;p&gt;Bon, en vrai il existe &lt;a class="reference external" href="https://vorta.borgbase.com/"&gt;VortaBackup&lt;/a&gt; comme interface graphique pour sauvegarder ses données.
C'est compatible Linux et MacOS facilement sans bidouille et Windows en bricolant un peu.
Le site l'explique bien cependant.&lt;/p&gt;
&lt;p&gt;Comme c'est chiffré j'utilise &lt;a class="reference external" href="https://www.hetzner.com/storage/storage-box/"&gt;Hetzner storagebox&lt;/a&gt; qui ont même fait &lt;a class="reference external" href="https://community.hetzner.com/tutorials/install-and-configure-borgbackup"&gt;un tuto&lt;/a&gt;. Mais il y
a d'autres listés sur le &lt;a class="reference external" href="https://www.borgbackup.org/support/commercial.html"&gt;site de Borg&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vraiment c'est pas compliqué à mettre en place (enfin je trouve), c'est efficace et on l'oublie
assez rapidement jusqu'au moment où on en a besoin (et vraiment ça sauve) :D&lt;/p&gt;
&lt;p&gt;Sinon dans les autres options possible si vous êtes sous MacOS, si la box de votre FAI le supporte
(comme la FreeBox POP) vous y collez un disque dur externe, activez le support d'Apple dessus
et configurez TimeMachine sur votre PC et zou vous avez une sauvegarde par heure.&lt;/p&gt;
&lt;p&gt;Ha et si vous avez envie d'essayer le &amp;quot;cloud&amp;quot; d'Hetzner j'ai &lt;a class="reference external" href="https://hetzner.cloud/?ref=Ef54rEGw8Kj7"&gt;un referal link&lt;/a&gt; qui vous donne 20€ :)
(et je l'ai listé dans mon &lt;a class="reference external" href="/save"&gt;/save&lt;/a&gt;)&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://dryusdan.space/save"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;/save&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Une liste de liens de référence et de codes de réduction pour les produits que vous recommandez

/save sur slashpage

Une page excessivement vide dans mon cas. Mais j'ai quand même un lien.

Un referal link chez Hetzner qui vous offre 20€ de crédit sur leur gamme cloud. Et si&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/d8a185060691dd15fdcd2ea9345f3c02.png" alt="Image of /save page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/d8a185060691dd15fdcd2ea9345f3c02.png" alt="Image of /save page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 07 Feb 2025 17:35:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-07:/notes/2025/02/friendly-reminder-faites-des-backups</guid><category>notes</category><category>Hébergement</category><category>Informatique</category></item><item><title>Daily prompts 06 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-06</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel artiste musical souhaites-tu faire découvrir ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-06-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Hum... Un autre artiste ?&lt;/p&gt;
&lt;p&gt;Connaissez vous Deadi ? C'est un artiste que j'ai découvert dans un feat
de Euphonik et Davodka.
Il arrive à mixer pop-culture, hip-hop et rythme avec une aisance impressionnante.&lt;/p&gt;
&lt;p&gt;Franchement j'aime bien, ça s'écoute très facilement même sur à vélo (avec une
enceinte bien sur) :D&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube-nocookie.com/embed/NWpBYgtaUaU" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 06 Feb 2025 09:49:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-06:/prompts/2025/02/daily-prompt-2025-02-06</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 05 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-05</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
As-tu un·e artiste méconnu·e que tu aimerais partager ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-05-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J'ai beaucoup hésité à répondre à ce prompt. Je me disais qu'encore une fois
recommander des artistes musicaux booon...&lt;/p&gt;
&lt;p&gt;Mais un artiste ce n'est pas qu'un musicien en fait... Mais oui !&lt;/p&gt;
&lt;p&gt;Du coup je partage mon vélociste 😁 Il fait des sculptures avec
des vieilles pièces de vélo. C'est vraiment très beau&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://lepoupoupidou.fr/lart-cyclique-de-marko/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;L'Art Cyclique de Marko&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Aucune description n'a été trouvé pour ce site.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of L'Art Cyclique de Marko page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/default.svg" alt="Image of L'Art Cyclique de Marko page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Il a aussi un &lt;a class="reference external" href="https://www.instagram.com/marko.artcyclique/"&gt;Instagram&lt;/a&gt; (faut que je fasse du lobying pour naopix)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 06 Feb 2025 09:00:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-06:/prompts/2025/02/daily-prompt-2025-02-05</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Rétrospective de janvier 2025</title><link>https://dryusdan.space/notes/2025/01/retrospective-janvier-2025</link><description>&lt;p&gt;C'est parti pour la retrospective de janvier. o/&lt;/p&gt;
&lt;p&gt;Comme la dernière fois, on commence par les chiffres.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Données&lt;/th&gt;
&lt;th class="head"&gt;Valeurs&lt;/th&gt;
&lt;th class="head"&gt;Tendances&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Cafés bu&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Commit réalisés&lt;/td&gt;
&lt;td&gt;304&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CD acheté&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Article rédigé&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Articles et notes rédigés&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total de mots&lt;/td&gt;
&lt;td&gt;2218&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Temps de lecture (183 mots par minute)&lt;/td&gt;
&lt;td&gt;12 minutes de lecture&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Trafic généré&lt;/td&gt;
&lt;td&gt;12,63Go&lt;/td&gt;
&lt;td&gt;📉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Liens partagé sur &lt;a class="reference external" href="https://dryusdan.link"&gt;Dryusdan.link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kilomètres à vélo&lt;/td&gt;
&lt;td&gt;388,74&lt;/td&gt;
&lt;td&gt;📈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;J'ai un nouveau tatouage o/&lt;/p&gt;
&lt;p&gt;Ce mois-ci j'ai vu deux séries : &lt;em&gt;&amp;quot;Arcane&amp;quot;&lt;/em&gt; et &lt;em&gt;&amp;quot;Cyberpunk Edgerunner&lt;/em&gt;&amp;quot;.
Sans déconner, les deux arrivent à me remuer.&lt;/p&gt;
&lt;p&gt;Pour la musique, je commence à lentement sombrer dans l'achat de CD, je suis
parti pour me faire mon cloud musical à moi. C'est principalement motivé par
des choix politiques, déjà avec ce qui se passe aux US mais aussi pour aider
les artistes, surtout s'ils sont indépendants et pour finir arrêter avec ces
plateformes qui, du jour au lendemain, peuvent faire disparaitre un titre. Et
puis c'est sympa les disques, j'y découvre des goodies, des affiches, mais
aussi quelques chansons uniques introuvable sur le web. Franchement c'est une
petite attention qu'on oublie vite avec l'abondance des plateformes.&lt;/p&gt;
&lt;p&gt;Côté informatique j'ai commencé à patcher quelques libs public (3 patchs)
et j'ai reçu ma première issue sur un des outils que je développe o/
J'ai aussi report quelques bugs à Opennebula.&lt;/p&gt;
&lt;p&gt;J'apprends ci et là que pas mal de personne me lisent plus ou moins
régulièrement, je trouve ça cool, vraiment, de savoir que je
raconte suffisamment de truc intéressant pour que les gens s'abonnent !&lt;/p&gt;
&lt;p&gt;Je pense que je vais finir sur une note moins joyeuse. L'extrême droite est
de plus en plus présente et l'un des pays les plus puissants au monde a viré
au fascisme en moins de 8h menaçant ainsi des milliers de personnes. Sans
déconner ça va nous tomber dessus très rapidement. Oui on a déjà l'extrême
droite en France qui est particulièrement violente sur le fond comme sur
la forme, qui stigmatise et attaque les plus démunis ainsi que les femmes et
les personnes racisés. Oui la presse est déjà gangréné par l'extrême droite
et maintenant même les réseaux sociaux qui ont une très grande influence sur
notre société donnent les pleins pouvoir aux fachos. Les sites vitrine par
Facebook et Instagram, les horaires par Google, les communications officielles
des institutions par X ou Facebook.
Oui, notre société en est dépendante. Et cette dépendance couplée aux algorithmes
donne la pleine visibilité aux fachos qui se sentent plus représenté, plus nombreux
plus légitime et donc plus dangereux pour tous⋅tes. Avec ce qui se passe aux USA,
la phrase &amp;quot;je n'ai rien à cacher&amp;quot; résonnent amèrement aujourd'hui. On ne va pas y
échapper, mais on a moyen de s'en protéger aujourd'hui. Quitter les plateformes,
proclamer son indépendance en utilisant des outils libres (je pense à XMPP pour discuter),
rendre accessible tout un tas de ressource au travers du réseau TOR, archiver et partager
les connaissances via Bittorrent (comme &lt;a class="reference external" href="https://archive.org/details/20250128-cdc-datasets"&gt;les documents des USA&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;On peut commencer à switcher et à se prémunir contre les ingérences de gouvernement
étranger et contre l'extrême droite. Résister contre le fascisme en réduisant leurs
surfaces d'attaques et donc leur emprise éventuelle sur nous.&lt;/p&gt;
&lt;p&gt;Fin bref, c'est très alarmiste et je m'en excuse.&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien (et mangez du XMPP).
&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;dlerman6"&gt;Daniel Lerman&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 04 Feb 2025 15:41:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-04:/notes/2025/01/retrospective-janvier-2025</guid><category>notes</category><category>Retrospective</category><category>Blog</category><category>En vrac</category></item><item><title>Daily prompts 04 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-04</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quelle forme d'art te laisse 100% indifférent·e ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-04-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Bien que la peinture abstraite me laisse réellement indifférent,
je pense que ce qui m'indiffère à 100% est la sculpture.
Je n'arrive pas à y déceler les émotions, le but de l'œuvre ou
toute forme de beauté. C'est dommage, il y a surement quelque chose
de très bien dedans mais ce n'est pas pour moi.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 04 Feb 2025 09:24:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-04:/prompts/2025/02/daily-prompt-2025-02-04</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 01 février 2025</title><link>https://dryusdan.space/prompts/2025/02/daily-prompt-2025-02-01</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Là, comme ça, qu’est est le dernier livre que t’as apprécié·e&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-01-fevrier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Houla, je lis tellement peu maintenant... Faut que je m'y remette.&lt;/p&gt;
&lt;p&gt;Bref, comme d'hab, la saga de l'Épouvanteur. Certes c'est pour ado,
mais franchement ça arrive à me captiver et je peux pas m'en décrocher.
En vacance je t'en lis un en deux jours x).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 01 Feb 2025 10:47:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-01:/prompts/2025/02/daily-prompt-2025-02-01</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 31 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-31</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel instrument de musique voudriez-vous savoir jouer sans avoir à apprendre ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-31-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;La guitare électrique. J'ai beau adorer la batterie, j'aime bien la guitare aussi,
mais avec mes doigts carré c'est vraiment un instrument où je galère et c'est
rarement un plaisir à apprendre quand c'est échec sur échec. Donc savoir en
jouer sans avoir à apprendre clairement je signe !&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 01 Feb 2025 10:23:00 +0100</pubDate><guid>tag:dryusdan.space,2025-02-01:/prompts/2025/01/daily-prompt-2025-01-31</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Roh mince, j'ai loupé les 10 ans de Dryusdan.fr</title><link>https://dryusdan.space/notes/2025/01/roh-mince-j-ai-loupe-les-10-ans-de-dryusdan-fr</link><description>&lt;p&gt;En discutant aujourd'hui, j'ai découvert que dryusdan.fr
date de juin 2014. Je sais pas pourquoi je pensais
qu'il était de 2016 (comme le dit archive.org).&lt;/p&gt;
&lt;p&gt;Bon bah bon anniversaire loupé mon nom de domaine 😁&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 30 Jan 2025 20:00:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-30:/notes/2025/01/roh-mince-j-ai-loupe-les-10-ans-de-dryusdan-fr</guid><category>notes</category></item><item><title>Daily prompts 30 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-30</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
À quoi te fait penser le mot &amp;quot;Champignon&amp;quot; ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-30-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;img alt="" class="image-process-article-image" src="/content/images/2025/01/Champi_MK8.webp" /&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Thu, 30 Jan 2025 14:07:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-30:/prompts/2025/01/daily-prompt-2025-01-30</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 25 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-25</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel est ta météo/saison préférée et pourquoi ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-25-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J'hésite entre l'automne et l'hiver.&lt;/p&gt;
&lt;p&gt;L'hiver ! Il ne fait pas trop chaud, j'ai pas ces allergies aux
graminées.
Mais l'automne non plus et s'il fait beau je peux profiter du
Golden Hour qui reflète sur les arbres une couleur dorée. Allez,
j'vais partir sur l'automne.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 28 Jan 2025 10:01:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-28:/prompts/2025/01/daily-prompt-2025-01-25</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 24 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-24</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Aimes un plat ou une catégorie culinaire surprennent ou au potentiel insoupçonné ? Lequel ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-24-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Les sandwichs ! Même si on aperçoit de plus en plus, en ville du moins,
une diversité grandissante dans les sandwichs, pas mal de boulangerie
proposent des sandwichs classiques comme le complet poulet, thon ou jambon beurre.&lt;/p&gt;
&lt;p&gt;Pourtant, curieusement, les sandwichs tu peux en faire énormément !
Du plus basique au plus épicé en passant par les options végétariennes ou végans.
Il y en a pour tous les gouts.&lt;/p&gt;
&lt;p&gt;Allez, une recette facile à faire : vous faites revenir un peu de tofu fumé dans
une poêle, vous tapissez votre pain de pesto vert. Puis vous mettez votre tofu dedans,
rajoutez un peu de salade, une tomate séchée (ou deux) et BAM. Vous pouvez remplacer
votre tofu par de la coppa aussi.&lt;/p&gt;
&lt;p&gt;Vous voulez un truc un peu épicé ? Pain, Comté, Salade et piment mariné.&lt;/p&gt;
&lt;p&gt;Bref, on peut tous faire avec des sandwichs et c'est pas forcément plus compliqué
à faire 😃&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 28 Jan 2025 10:00:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-28:/prompts/2025/01/daily-prompt-2025-01-24</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 28 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-28</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
L'automne qui arrive, ça t'inspire quoi ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-28-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Qu'on est en hiver.&lt;/p&gt;
&lt;p&gt;Plus sérieusement, que les arbres vont arborer leurs robes dorées,
que les couchés de soleil seront de plus en plus tôt et que la
chaleur va peu à peu laisser place au froid hivernal.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 28 Jan 2025 09:58:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-28:/prompts/2025/01/daily-prompt-2025-01-28</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Petite séance au théâtre hier soir</title><link>https://dryusdan.space/notes/2025/01/petite-seance-au-theatre-hier-soir</link><description>&lt;p&gt;Hier soir, petite sortie pas du tout ordinaire (déjà il
a fallu me faire sortir de ma grotte) pour aller voir
une pièce de théâtre : &lt;em&gt;“Grains de beautés”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Entre un début assez... Explicite sur le corps humain qui
m'a rendu pas bien, pour enchainer sur des scènes tantôt
provocatrices, tantôt militantes le tout rythmé par des
intermèdes musicaux.&lt;/p&gt;
&lt;p&gt;Franchement j'ai beaucoup apprécié, et si vous êtes dans
le coin et qu'il reste une place, n'hésitez pas 😉&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 28 Jan 2025 09:15:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-28:/notes/2025/01/petite-seance-au-theatre-hier-soir</guid><category>notes</category><category>Théâtre</category></item><item><title>Daily prompts 22 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-22</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quelle œuvre aimerais-tu oublier pour la redécouvrir ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-22-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J'hésite entre Cyberpunk 2077 et Ghost in the Shell.&lt;/p&gt;
&lt;p&gt;Autant estomaqué et retourné par ces deux oeuvres.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 24 Jan 2025 15:30:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-24:/prompts/2025/01/daily-prompt-2025-01-22</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 23 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-23</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Tu peux faire un autre boulot pendant un mois : tu fais quoi ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-24-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Milliardaire ! Ha non c'est vrai que le travail ne rend pas riche.&lt;/p&gt;
&lt;p&gt;Alors franchement, je me tenterai bien au barman. Je sais pas pourquoi,
je déteste décevoir les gens, mais les gens sont plutôt chill dans un bar
et curieusement avec ma carrure t'as personne qui viendra me casser les pieds.&lt;/p&gt;
&lt;p&gt;Temporairement, pour tester, mais ça me brancherai bien.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 24 Jan 2025 15:22:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-24:/prompts/2025/01/daily-prompt-2025-01-23</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 21 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-21</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel est ton dernier achat compulsif ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-21-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Des CD de Davodka !&lt;/p&gt;
&lt;p&gt;Bon, je vais vous donner les titres, il y a les albums :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Héritage&lt;/li&gt;
&lt;li&gt;Procès verbal&lt;/li&gt;
&lt;li&gt;À juste titre&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Déçu qu'il n'y avait pas l'album &amp;quot;La mise au poing&amp;quot; disponible.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 21 Jan 2025 19:56:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-21:/prompts/2025/01/daily-prompt-2025-01-21</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>NaoPix : l'instance Pixelfed au beurre salé</title><link>https://dryusdan.space/notes/2025/01/naopix-l-instance-pixelfed-au-beurre-sale</link><description>&lt;p&gt;Vous n'avez même pas fini votre part de Kouign Amann des rois
que BAM je vous en remets une couche avec du beurre salé.&lt;/p&gt;
&lt;p&gt;Vous l'aurez de toute façon compris au titre, après que
l'extrême droite ait décidé d'écraser toute forme de
discours autre que haineux, au mieux en invisibilisant
le contenu bienveillant (vous ne pourrez pas dire qu'on
ne vous avait pas prévenu) il faut se bouger un tanti poil
le fion et battre le fer tant qu'il est encore chaud.&lt;/p&gt;
&lt;p&gt;J'ai donc décidé de monter une instance Pixelfed. J'ai pris
un nom localisable pour éviter de reproduire certains schémas
de monopole (coucou mastodon.social). Vous l'aurez compris,
Nao pour Naoned, le nom breton de Nantes et pix pour pixel :)&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://naopix.fr"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;NaoPix&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Naopix est une plateforme de partage d'images, une alternative éthique aux plateformes centralisées.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/288332744aa7fb533524fd76f3a2a15c.png" alt="Image of NaoPix page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/288332744aa7fb533524fd76f3a2a15c.png" alt="Image of NaoPix page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;C'est donc une instance pixelfed pour les habitants du bassin
nantais (plus ou moins, je n'irai pas vérifier).&lt;/p&gt;
&lt;p&gt;J'avais essayé d'héberger l'application il y a quelques années,
et je peux dire que Pixelfed a vraiment bien évolué depuis.
C'est stable, utilisable, il y a une application iOS et Android
et la connexion au fediverse est plutôt bien aboutie. Franchement
on peut profiter du fediverse facilement, c'est cool.
Si vous voulez me suivre d'ailleurs : &lt;a class="reference external" href="https://naopix.fr/dryusdan"&gt;&amp;#64;dryusdan&amp;#64;naopix.fr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oui, il reste les noms un peu à rallonge, mais c'est inhérent à
la décentralisation (comme les mails).&lt;/p&gt;
&lt;p&gt;Et si vous découvrez le fediverse avec cet article, je vous invite à lire
l'&lt;a class="reference external" href="https://alyve.be/blog/petit-guide-du-fediverse-2025/"&gt;article de Alyve&lt;/a&gt;&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://alyve.be/blog/petit-guide-du-fediverse-2025/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Petit guide du Fediverse 2025&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;Explication de ce qu’est le Fediverse, ses logiciels, les applications mobiles, ses instances et ses bonnes pratiques. Bref, tout ce qu’il faut savoir pour démarrer et choisir où poser ses valises.&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/5b55313f31ee08c17b3ceec458c52de2.png" alt="Image of Petit guide du Fediverse 2025 page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/5b55313f31ee08c17b3ceec458c52de2.png" alt="Image of Petit guide du Fediverse 2025 page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Tue, 21 Jan 2025 15:55:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-21:/notes/2025/01/naopix-l-instance-pixelfed-au-beurre-sale</guid><category>notes</category></item><item><title>Rattrapage des Daily prompts</title><link>https://dryusdan.space/prompts/2025/01/rattrapage-des-daily-prompts</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel est ta ou ton artiste préféré ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-19-janvier-2025"&gt;prompts du dimanche 19 janvier 2025&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Curieusement je n'ai pas d'artiste préféré :/&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quelle profession aurais-tu pu exercer ou souhaites-tu encore réaliser ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-15-janvier-2025"&gt;prompts du mercredi 15 janvier 2025&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je ne sais pas :D mais quand j'étais plus jeune, avant de comprendre
que j'étais naturellement bon en informatique (curieux) je voulais devenir garde forestier.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Qu'est ce que tu aimes dans la période de noël ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-10-janvier-2025"&gt;prompts du vendredi 10 janvier 2025&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Rien ? Vraiment j'aime pas&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quel est ton talent inutile ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-05-janvier-2025"&gt;prompts du dimanche 05 janvier 2025&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je suis capable de sauter 4-5 repas sans problème.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Dans quel pays souhaiterais vivre ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-01-janvier-2025"&gt;prompts du mercredi 01 janvier 2025&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Les Pays Bas. C'est un projet mais qui semble s'éloigner de plus en plus.
Mais j'apprécie énormement ce pays et la mentalité qui en découle, pourtant
y a l'extréme droite qui remonte bien chez eux aussi...&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Donnes nous ta fleur préféré, pourquoi ? À quoi te fait-elle penser ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-31-decembre-2024"&gt;prompts du mardi 31 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Le lotus. Mais-est ce que c'est parce que c'est une fleur proche de l'eau
(et j'adore l'eau) ou parce que c'est splendide ? Je ne saurais dire :/&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quel est votre premier souvenir avec un ordinateur ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-30-decembre-2024"&gt;prompts du lundi 30 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Houuuu, heuuuuuu... Le premier PC famillial était un Packard Bell iMedia 6007a.
Une bestiole avec 20Go d'espace disque, 128Mo de RAM, un AMD Athlon de 1,4GHz
en guise de CPU et une ATI Radeon VE. Ce fut ensuite mon premier PC perso en 2009
(qui s'est vu offrir 512Mo de RAM) car mes parents aimaient pas le temps que
je passais sur ma PSP. 2009, entre 2001 et 2009 l'informatique a énormément
évolué mine de rien :o.&lt;/p&gt;
&lt;p&gt;Bref, mon père avait récupéré un jeu de course de vaisseau spacial et m'a laissé faire
un course. J'ai rien compris ni réussi à faire, mais j'avais bien aimé quand même :D&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Tu peux te réincarner en n’importe quel animal. Lequel choisis-tu ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-28-decembre-2024"&gt;prompts du samedi 28 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Un chat !&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Évidences exceptées (clés, portefeuille, téléphone, etc) y a-t-il un objet dans ton sac de tous les jours que tu transportes toujours ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-26-decembre-2024"&gt;prompts du jeudi 26 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Une pince multi-tool et un multi tool vélo. Je peux couper pas mal de truc, revisser, régler un vélo et même réparer un crevaison tubeless alors que j'ai pas de tubeless :D (puis des décapsuleurs aussi)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quels sont tes plaisirs coupables ? 👀 Que ça soit alimentaire, film, musique ou autre…&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-25-decembre-2024"&gt;prompts du mercredi 25 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Un repas à base de sandwish, j'adore, mais surtout le sandwish à base de pain de mie, de
tranche de lerdamer, de salade, de jambon blanc (bon maintenant un substitue) et une Monster.
C'est naze, j'bouffe 1600kcal, mais j'adore ça x)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Est-ce que tu as un·e tatoueureuse à nous partager ? Pourquoi ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-23-decembre-2024"&gt;prompts du lundi 23 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://salehistoire.fr/tatoueurs-nantes/la-barbe"&gt;La Barbe&lt;/a&gt; Tattoo à nantes ! (le tout sur un site web).
Les couleurs sont top et il est très sympa !&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Dans quel lieu méconnu aimeriez-vous vous retrouver pour 1h ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-22-decembre-2024"&gt;prompts du dimanche 22 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je veux retourner sur la presqu'ile de Crozon. C'est tellement calme et appréciable.
Même 1h.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quelle est ta prochaine modification corporelle ? (tatouage, piercing,…)&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-19-decembre-2024"&gt;prompts du jeudi 19 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Un tatouage inspiré Cyberpunk 2077 ! Et un gros.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Où te vois-tu dans 10 ans?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-11-decembre-2024"&gt;prompts du mercredi 11 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je ne sais même pas ce que je vais faire demain, alors dans 10 ans...
Allez, je vais réver un peu. Je veux revenir proche de la nature, voir
les étoiles la nuit, le lever de soleil le jour. Pouvoir être à l'ombre sous
40 degrés, pouvoir faire pousser 3 carottes et 2 salades...
Mais bon, ma vie fait que ce genre de choix n'est pas envisageable car ce n'est
pas vivable à terme pour tous le monde :(&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quelle technologie obsolète/disparue regrettes-tu ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-07-decembre-2024"&gt;prompts du samedi 07 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;En ce moment j'ai une envie de cassette audio avec le lecteur
qui va bien avec. Je regrette ça en ce moment :D&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Et si je rangeais le smartphone un mois ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-06-decembre-2024"&gt;prompts du vendredi 06 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Heuuuuuuuuuuuuuuu, faudrait oui, que j'essaye mais c'est loin d'être
pleinement envisageable maintenant. J'en suis dépendant pour le côté pratique
(oui, j'ai pas de réseau social qui me doppe à la dopamine).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quel sentiment as tu ressenti lors de ton dernier trajet domicile – Travail. Explique ce qui a généré ce sentiment ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-jeudi-05-decembre-2024"&gt;prompts du jeudi 05 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;IL CAILLE ! Enfin ! Bon en vrai mes trajets c'est quasiment que de la ville, rien de fun,
c'est chiant.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Quelle sont les raisons qui te motivent à réaliser des choses.&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mercredi-04-decembre-2024"&gt;prompts du mercredi 04 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Le fun ! :D&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Pour toi, quels métiers nécessiteraient d'être récupérés (et protégés) par l'État ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-mardi-03-decembre-2024"&gt;prompts du mardi 03 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Toute la gestion des produits de première nécessité ! Les agriculateurs notamment.
Aujourd'hui manger dépend d'industriel qui essore les aggriculteurs et les acheteurs ?
Sans dec, pourquoi un produit de première nécessité n'a pas le même traitement que
l'eau des robinets ? Certes il y a un peu (mais vraiment) un peu de régulation de la part
de l'État mais bon...&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Un anime qui t’as marqué·e, retourné·e, ému·e et que tu souhaites absolument partager.&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-02-decembre-2024"&gt;prompts du lundi 02 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Ghost in the Shell ! C'est le seul nom qui me reviennent en tête. &amp;quot;&lt;em&gt;Qu'est ce que la vie ?&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Te souviens tu de ton premier Roman lu ? Peux-tu nous en parler ? Que t'évoque t'il ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-dimanche-01-decembre-2024"&gt;prompts du dimanche 01 décembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Peggy Sue et les Fantômes. Ça s'efface dans ma tête, mais tout ce que je me
souviens c'est que c'était de la fantaisy sympa à lire.&lt;/p&gt;
&lt;p&gt;Ça a été le déclencheur. Suite à ça je me suis mis à engloutir des livres.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
À quelle époque aimerais-tu vivre ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-30-novembre-2024"&gt;prompts du samedi 30 novembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Maintenant ! Les droits pour tous avance. Même si ça stagne un peu encore.
Donc c'est maintenant qu'il faut vivre et se battre pour éviter que la haine
et le fachisme gagne !&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;blockquote&gt;
Les choses que tu as faites dont tu es le plus fier !&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-vendredi-29-novembre-2024"&gt;prompts du vendredi 29 novembre 2024&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;DryCat ! Il m'arrive encore de regretter de l'avoir fermé :(&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;(Bon, maintenant j'ai un peu la flemme de remonter, faudrait que je script ça :D)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 20 Jan 2025 11:20:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-20:/prompts/2025/01/rattrapage-des-daily-prompts</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>Daily prompts 20 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-20</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Une série qui t’as marqué·e, retourné·e, ému·e et que tu souhaites
absolument partager.&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-20-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Hummmmm, j'en ai deux qui me viennent en tête là mais je vais respecter
le titre.&lt;/p&gt;
&lt;p&gt;La série ARCANE ! Sans dec, la saison 1 est à couper le souffle, la deux
est monstrueuse à en donner des frissons, la direction artistique,
la bande son, TOUT est UN TOTAL BANGER ! Je la recommande à 800% !&lt;/p&gt;
&lt;p&gt;&lt;img alt="pow" class="image-process-article-image" src="/content/images/2025/01/wallhaven-o5pqem.jpg" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 20 Jan 2025 10:40:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-20:/prompts/2025/01/daily-prompt-2025-01-20</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>J'ai laissé le loup entrer dans la bergerie, maintenant fait le sortir</title><link>https://dryusdan.space/notes/2025/01/j-ai-laisse-le-loup-entrer-dans-la-bergerie-maintenant-fait-le-sortir</link><description>&lt;p&gt;Petit coup de gueule, avec l'arrivée massive des
internautes provenant de Meta dans le fediverse
(et c'est cool) on a pu aussi tomber sur des politiciens
qui ont sauté le pas (tant mieux) et qui lâche un bon
oui mais facebook me coute rien pour prévenir mes
citoyens d'un imprévu et vous proposez pas de solution
autre que faire venir mes citoyens sur le fediverse pour
voir ces imprévus. Vous répondez à rien, c'est nul.&lt;/p&gt;
&lt;p&gt;Déjà, la &amp;quot;prévention&amp;quot; est déléguée à une plateforme
américaine qui a la fâcheuse tendance à foutre tellement
d'algorithme que le fait qu'elle soit lue tiens déjà
du miracle. Puis tu as obligé tes citoyens à venir sur
Facebook parce que &amp;quot;c'était simple&amp;quot; pour prévenir sans
tenir compte qu'il existe des gens, de plus en plus, qui
n'ont pas Facebook.&lt;/p&gt;
&lt;p&gt;Le foutage de gueule total, tout est géré par Facebook
maintenant, il faut trouver un autre moyen, mais vous les
libristes là vous êtes bien mignon à rien proposer alors
que ça fait 15 ans, voir même plus, que vous demandez à
ne pas tout centraliser sur Facebook pour justement
prévenir ce genre de situation !&lt;/p&gt;
&lt;p&gt;Donc non, la clairement ça passe pas.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 20 Jan 2025 10:06:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-20:/notes/2025/01/j-ai-laisse-le-loup-entrer-dans-la-bergerie-maintenant-fait-le-sortir</guid><category>notes</category><category>Coup de gueule</category></item><item><title>J’ai donné mon premier cour</title><link>https://dryusdan.space/notes/2025/01/jai-donne-mon-premier-cour</link><description>&lt;p&gt;Aujourd’hui j’ai donné mon premier cours (en anglais pour plus de fun) officiel.&lt;/p&gt;
&lt;p&gt;Après 3h de cours hier accompagné par deux profs j’ai sauté dans la baignoire ce vendredi&lt;/p&gt;
&lt;p&gt;Eh bien c’était cool ! (Mais les élèves qui utilisent l’IA ça ce voit à des kilomètres…)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Fri, 17 Jan 2025 19:24:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-17:/notes/2025/01/jai-donne-mon-premier-cour</guid><category>notes</category></item><item><title>Ouai ton taff ? Bah j'l'ai fais avec ChatGPT</title><link>https://dryusdan.space/notes/2025/01/ouai-ton-taff-bah-j-l-ai-fais-avec-chatgpt</link><description>&lt;p&gt;Ha, bah écoute, t'as donc pas besoin de moi, salut.&lt;/p&gt;
&lt;p&gt;En vrai, je suis mi-terrifié, mi-impressionné. En fait depuis 1 mois j'ai
tous les jours un laïus comme quoi l'IA c'est pas mal, tu peux tous
faire facilement, avoir des réponses facilement à des questions, développer
facilement (certains &lt;a class="reference external" href="https://mcorbin.fr/posts/2025-01-02-ai-assistant/"&gt;passes le pas&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Mais je me retrouve comme mon grand-père qui a lutté contre
l'implémentation de l'informatique dans les chantiers navals de Nantes.
Tu augmentes la productivité (selon je ne sais quel foutu critère m'enfin)
et donc tu réduis mécaniquement le nombre d'employé pour le même travail
effectué.&lt;/p&gt;
&lt;p&gt;C'est vrai qu'aujourd'hui se passer d'informatique devient compliqué et
hors norme. On est constamment joignable, notre temps de cerveau disponible est
aussitôt aspiré par notre téléphone, on a réduit le nombre d'humain pour une
interface web et précariser les emplois derrière. (Pourtant j'adore l'informatique
c'est ma grosse dissonance cognitive).&lt;/p&gt;
&lt;p&gt;L'IA générative est arrivée assez récemment et peut faire des choses
folles, avec un coût sociologique et environnemental énorme cependant.
Sauf qu'on commence à l'apercevoir, l'IA remplace peu à peu les
derniers emplois précaires du tertiaire (notamment le support
téléphonique, e-mail ou par chat) et ça commence à remplacer les
professions supérieures.&lt;/p&gt;
&lt;p&gt;Je ne peux pas voir un outil dans l'IA générative, non pas parce que ce n'est
pas ça, mais parce que dans notre société actuelle un outil n'est là que pour
rendre précaire d'autres personnes, non pas pour réduire le travail à effectuer
et partager les richesses produites par la machine.&lt;/p&gt;
&lt;p&gt;Aujourd'hui c'est mon travail qu'on m'a retiré pour laisser une IA le faire.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Wed, 15 Jan 2025 10:45:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-15:/notes/2025/01/ouai-ton-taff-bah-j-l-ai-fais-avec-chatgpt</guid><category>notes</category><category>IA</category></item><item><title>Daily prompts 13 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-13</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Quel est ton concert le plus marquant ?&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-lundi-13-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Hum 🤔&lt;/p&gt;
&lt;p&gt;Je n'ai pas été à beaucoup de concert, en réalité je suis allé dans quatre
festivals et deux concerts. Pour les festivals j'ai, pour la moitié été,
&amp;quot;&lt;a class="reference external" href="https://www.follejournee.fr/"&gt;À la folle journée&lt;/a&gt;&amp;quot; à Nantes et l'autre moitié au Hellfest.&lt;/p&gt;
&lt;p&gt;Bien que j'aie beaucoup apprécié les Folles Journées, j'ai aussi pas mal
aimé le concert de KISS au Hellfest.&lt;/p&gt;
&lt;p&gt;Sauf que la question parle de concert (et puis ça m'arrange :D) c'est donc
les concerts de Lindsey Stirling que j'adore. Entre la musique, les danseuses,
le spectacle tout court, le tout souvent un peu sur élevé histoire de voir
le concert même dans la fosse. Franchement c'est top de chez top. Seul regret,
elle ne vient que très peu en France (quoique le climat préfère).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Mon, 13 Jan 2025 09:52:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-13:/prompts/2025/01/daily-prompt-2025-01-13</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category></item><item><title>J’ai fini Arcane saison 2</title><link>https://dryusdan.space/notes/2025/01/jai-fini-arcane-saison-2</link><description>&lt;p&gt;J’ai fini Arcane saison 2…&lt;/p&gt;
&lt;p&gt;C’était tellement intense, vraiment un pur régal. Les graphismes, les voix, les sentiments, l’énergie même dans cette saison… Vraiment très prenant.&lt;/p&gt;
&lt;p&gt;(À ça d’acheter les éditions collectors DVD)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sun, 12 Jan 2025 23:18:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-12:/notes/2025/01/jai-fini-arcane-saison-2</guid><category>notes</category></item><item><title>Arcane ou l’histoire mélangée à l’actualité critiquée ?</title><link>https://dryusdan.space/notes/2025/01/arcane-ou-lhistoire-melange-a-lactualite-critique</link><description>&lt;p&gt;(Attention, cela peut spoiler un morceau d’Arcane saison 2. Allez voir la série avant de lire ce bout d’article)&lt;/p&gt;
&lt;p&gt;J’ai l’impression de voir dans la série Arcane une sorte de critique de la société actuelle. Une critique ancrée sur cette volonté qu’une
caste de la population chanceuse (d’être né du côté facile de la vie) laisse fomenter tous les problèmes.&lt;/p&gt;
&lt;p&gt;Et une fois que tous les problèmes ont bien pourri, on fait descendre les pacifieurs… la police pardon pour taper sur ceux qui espèrent, qui
croient en quelqu’un ou quelque chose. Juste envoyer les corps armés pour frapper, mutiler et détruire toutes traces d’espoirs, sans une seule seconde rechercher la source du problème et encore moins se remettre en question. Juste provoquer la peur et
déchaîner la violence pour détruire l’espoir et encore mieux asservir.&lt;/p&gt;
&lt;p&gt;L’histoire nous l’a pourtant appris, l’actualité nous le fait revivre, mais ça doit bien être profitable a quelques-uns.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 11 Jan 2025 21:57:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-11:/notes/2025/01/arcane-ou-lhistoire-melange-a-lactualite-critique</guid><category>notes</category></item><item><title>Daily prompts 11 janvier 2025</title><link>https://dryusdan.space/prompts/2025/01/daily-prompt-2025-01-11</link><description>&lt;!--  --&gt;
&lt;blockquote&gt;
Là, comme ça, qu’est est le dernier jeu vidéo que t’as apprécié·e&lt;/blockquote&gt;
&lt;p&gt;(&lt;a class="reference external" href="https://bloguidien.fr/bloguidien-du-samedi-11-janvier-2025"&gt;prompts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Je ne vais quand même pas reparler de &lt;a class="reference external" href="https://dryusdan.space/instant-jeux-video-cyberpunk-2077"&gt;Cyberpunk 2077&lt;/a&gt; bien que ce jeu
est un vrai régal.&lt;/p&gt;
&lt;p&gt;Non, aujourd'hui je vais vous parler d'un petit jeu que m'a fait découvrir
&lt;a class="reference external" href="https://piou.kolo.fr/&amp;#64;kolo"&gt;&amp;#64;kolo&amp;#64;piou.kolo.fr&lt;/a&gt; : Gatekeeper !&lt;/p&gt;
&lt;figure class="kg-card kg-bookmark-card"&gt;&lt;a class="kg-bookmark-container" href="https://www.gravitylagoon.com/"&gt;&lt;div class="kg-bookmark-content"&gt;&lt;div class="kg-bookmark-title"&gt;Gravity Lagoon&lt;/div&gt;&lt;div class="kg-bookmark-description"&gt;CREATING IMPRESSIONS&lt;/div&gt;&lt;div class="kg-bookmark-metadata"&gt;&lt;div class="kg-bookmark-icon"&gt;&lt;img src="/content/images/bookmarks/7a82cb113c7d11cb2e9fd2b83a7afea3.png" alt="Image of Gravity Lagoon page" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="kg-bookmark-thumbnail"&gt;&lt;img src="/content/images/bookmarks/7a82cb113c7d11cb2e9fd2b83a7afea3.png" alt="Image of Gravity Lagoon page" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Il s'agit d'un roguelike assez nerveux réalisé par un petit studio du
Kazakhstan. Le but, partir à la recherche du cœur de l'Universe et rasez...
Nettoyez toute trace d'éventuelle menace qui garde les portes de leurs planètes.&lt;/p&gt;
&lt;p&gt;Si j'ai bien compris le synopsis, à vrai dire la bande son et les graphismes
m'ont plus et c'est ce qui m'a importé le plus. L'histoire j'ai pas trop saisi,
j'ai tout cramé.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 11 Jan 2025 17:02:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-11:/prompts/2025/01/daily-prompt-2025-01-11</guid><category>prompts</category><category>Daily prompts</category><category>Écriture</category><category>Jeux vidéo</category></item><item><title>Installer Kresus sur Debian 12</title><link>https://dryusdan.space/installer-kresus-sur-debian-12</link><description>&lt;p&gt;&lt;a class="reference external" href="https://kresus.org/"&gt;Kresus&lt;/a&gt; est un gestionnaire de finance se reposant sur &lt;a class="reference external" href="https://woob.tech/"&gt;Woob&lt;/a&gt;. Comme vous
vous en doutez avec un gestionnaire de finance, ça permet de créer des budgets,
de trier, de renommer vos dépenses et surtout de recevoir un mail de l'état de vos
comptes (ce que j'utilise beaucoup 😁). Le gros avantage c'est que c'est opensource
et développé par des passionnés (Kresus comme Woob), il n'envoie pas ses données
dans une énième entreprise. Il y a par contre quelques inconvénients :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Toutes les banques n'y sont pas (je pense à Green-got par exemple)&lt;/li&gt;
&lt;li&gt;Quand une banque décide de changer son interface d'authentification, il est fort
probable que Woob ne puisse plus y accéder pendant quelques semaines.&lt;/li&gt;
&lt;li&gt;Kresus ne gère pas d'authentification, vous devez donc gérer l'authentification avec
votre proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aujourd'hui j'ai dû migrer mon instance sur une nouvelle machine suite à un souci de
carte SD, l'instance tournait depuis 6 ans environs sur mon raspberry PI 3B+. Quitte à
refaire une installation, autant la faire au propre. Malheureusement les liens vers les
tutoriels sont invalides ou un peu daté. Donc autant en faire un en même temps que
l'installation.&lt;/p&gt;
&lt;p&gt;Nous allons avoir besoin ici de 5 choses :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python avec virtualenv et pdfminer&lt;/li&gt;
&lt;li&gt;NodeJS (Debian ou LTS ça suffit)&lt;/li&gt;
&lt;li&gt;Debian (testé sur Debian 12)&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SystemD&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="l-installation"&gt;
&lt;h2&gt;L'installation&lt;/h2&gt;
&lt;p&gt;Tout d'abord nous allons installer les dépendances&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update
apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;python3-pdfminer&lt;span class="w"&gt; &lt;/span&gt;python3-virtualenv&lt;span class="w"&gt; &lt;/span&gt;python3-venv&lt;span class="w"&gt; &lt;/span&gt;nodejs&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;postgresql
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis nous créons l'utilisateur et les dossiers nécessaires&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/bin/false&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/home/kresus&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;kresus
mkdir&lt;span class="w"&gt; &lt;/span&gt;/opt/kresus
mkdir&lt;span class="w"&gt; &lt;/span&gt;/var/log/kresus
chown&lt;span class="w"&gt; &lt;/span&gt;kresus:&lt;span class="w"&gt; &lt;/span&gt;/opt/kresus
chown&lt;span class="w"&gt; &lt;/span&gt;kresus:&lt;span class="w"&gt; &lt;/span&gt;/var/log/kresus
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant nous accédons à l'utilisateur et nous installons Kresus et Woob&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;su&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;kresus&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/kresus
python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;woob-venv
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;woob-venv/bin/activate
pip3&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;woob
/usr/bin/npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="w"&gt; &lt;/span&gt;/opt/kresus/&lt;span class="w"&gt; &lt;/span&gt;kresus@latest
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà (nan, pas le groupe de rock), Kresus est installé avec Woob. Mais il manque la base
de donnée et la définition du service SystemD ainsi que le logrotate.&lt;/p&gt;
&lt;p&gt;Rendez-vous dans votre base de donnée&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;su&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;postgres
psql
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant nous allons créer l'utilisateur et sa base de donnée&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kresus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PASSWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Kr3sus_S3cr3t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kresus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OWNER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kresus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ENCODING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LC_COLLATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fr_FR.UTF-8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LC_CTYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fr_FR.UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Allez, il ne reste quasiment plus rien à faire avant le démarrage, nous allons mettre
en place le service SystemD&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Gestionnaire de finances personnelles&lt;/span&gt;
&lt;span class="na"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://kresus.org/doc.html&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target postgresql.service&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;kresus&lt;/span&gt;
&lt;span class="na"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/opt/kresus&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;NODE_ENV=production&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_WOOB_DIR=&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;PATH=/opt/kresus/woob-venv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;PORT=3000&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;HOST=127.0.0.1&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_SALT=S3cr3T&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_TRANSPORT=smtp&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_FROM=kresus@example.tld&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_HOST=127.0.0.1&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_PORT=465&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_USER=kresus@example.tld&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_EMAIL_PASSWORD=s3cre3t&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_DB_TYPE=postgres&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_DB_HOST=127.0.0.1&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_DB_USERNAME=kresus&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_DB_PASSWORD=Kr3sus_S3cr3t&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;KRESUS_DB_NAME=kresus&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/node /opt/kresus/node_modules/kresus/bin/kresus.js&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="na"&gt;StandardOutput&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;append:/var/log/kresus/kresus.log&lt;/span&gt;
&lt;span class="na"&gt;StandardError&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;inherit&lt;/span&gt;
&lt;span class="na"&gt;SyslogIdentifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;kresus&lt;/span&gt;

&lt;span class="c1"&gt;; Quelques directive pour limiter un peu Kresus&lt;/span&gt;
&lt;span class="na"&gt;PrivateTmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;ProtectHome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;ProtectSystem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;strict&lt;/span&gt;
&lt;span class="na"&gt;ProtectProc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;noaccess&lt;/span&gt;
&lt;span class="na"&gt;ProcSubset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pid&lt;/span&gt;
&lt;span class="na"&gt;ProtectHostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;ProtectClock&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;PrivateDevices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;PrivateUsers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;self&lt;/span&gt;
&lt;span class="na"&gt;PrivateIPC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;PrivatePIDs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;CapabilityBoundingSet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ReadWritePaths&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/opt/kresus&lt;/span&gt;
&lt;span class="na"&gt;NoNewPrivileges&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il y a tout un tas de variable d'environnement à utiliser documenté
dans le &lt;a class="reference external" href="https://framagit.org/kresusapp/kresus/raw/main/support/docker/config.example.ini"&gt;fichier de configuration&lt;/a&gt;. Les directives limitantes sont
toutes décrites dans la &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html"&gt;documentation de systemd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bien entendu tous les mots de passe sont à remplacer par ceux que
vous avez généré, n'utilisez pas ceux présents dans cet article.&lt;/p&gt;
&lt;p&gt;Il ne manque plus qu'à créer le logrotate ! Vous allez écrire le
fichier &lt;tt class="docutils literal"&gt;/etc/logrotate.d/kresus&lt;/tt&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/var/log/kresus/kresus.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;daily
&lt;span class="w"&gt;    &lt;/span&gt;missingok
&lt;span class="w"&gt;    &lt;/span&gt;rotate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;compress
&lt;span class="w"&gt;    &lt;/span&gt;delaycompress
&lt;span class="w"&gt;    &lt;/span&gt;notifempty
&lt;span class="w"&gt;    &lt;/span&gt;copytruncate
&lt;span class="w"&gt;    &lt;/span&gt;sharedscripts
&lt;span class="w"&gt;    &lt;/span&gt;prerotate
&lt;span class="w"&gt;    &lt;/span&gt;endscript
&lt;span class="w"&gt;    &lt;/span&gt;postrotate
&lt;span class="w"&gt;    &lt;/span&gt;endscript
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant vous n'avez plus qu'à démarrer kresus et à l'activer au
démarrage du système&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# systemctl version 220&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kresus.service

&lt;span class="c1"&gt;# systemctl &amp;lt; version 220&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kresus.service
systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;kresus
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez améliorer cette installation en remplaçant la
configuration SMTP actuelle par un &lt;a class="reference external" href="https://doc.ubuntu-fr.org/postfix_systeme_satellite"&gt;postfix satellite&lt;/a&gt;
(afin de gérer les delays, bounce...)&lt;/p&gt;
&lt;p&gt;Sur ce, portez-vous bien.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/content/images/2020/07/tenor-4.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Photo de &lt;a class="reference external" href="https://unsplash.com/fr/&amp;#64;christianw"&gt;Christian Wiediger&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dryusdan</dc:creator><pubDate>Sat, 11 Jan 2025 14:45:00 +0100</pubDate><guid>tag:dryusdan.space,2025-01-11:/installer-kresus-sur-debian-12</guid><category>Labs</category><category>Labs</category><category>Informatique</category></item></channel></rss>