<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Mook’s Lab Chronicles</title><link>https://blog.homeblack.fr/tags/homelab/</link><description>Recent content in Homelab on Mook’s Lab Chronicles</description><generator>Hugo -- gohugo.io</generator><language>fr-FR</language><lastBuildDate>Sun, 16 Aug 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://blog.homeblack.fr/tags/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Je voulais juste mettre à jour mes OPNsense</title><link>https://blog.homeblack.fr/p/revision-cluster-opnsense/</link><pubDate>Sat, 15 Aug 2026 20:00:00 +0200</pubDate><guid>https://blog.homeblack.fr/p/revision-cluster-opnsense/</guid><description>&lt;img src="https://blog.homeblack.fr/p/revision-cluster-opnsense/cover.png" alt="Featured image of post Je voulais juste mettre à jour mes OPNsense" /&gt;&lt;p&gt;J’étais parti pour une petite révision tranquille de mes deux OPNsense. Une sauvegarde, une mise à jour du premier firewall, quelques contrôles, puis la même chose sur le second.&lt;/p&gt;
&lt;p&gt;Le premier venait de terminer. J’ai lancé la mise à jour du second, puis contrôlé l’état du cluster pendant qu’elle avançait.&lt;/p&gt;
&lt;h2 id="un-cluster-qui-fonctionnait-presque"&gt;Un cluster qui fonctionnait… presque
&lt;/h2&gt;&lt;p&gt;Mon réseau repose sur deux firewalls, &lt;code&gt;fw-core-p1&lt;/code&gt; et &lt;code&gt;fw-core-p2&lt;/code&gt;, avec neuf adresses IP virtuelles CARP. En temps normal, &lt;code&gt;p1&lt;/code&gt; porte les neuf VIP et &lt;code&gt;p2&lt;/code&gt; attend sagement en secours.&lt;/p&gt;
&lt;p&gt;Après la mise à jour du premier nœud, l’état était un peu plus créatif :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8 VIP : p1 BACKUP / p2 MASTER
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VIP LAN : p1 MASTER / p2 MASTER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Le réseau fonctionnait encore. Les interfaces répondaient, pfsync synchronisait toujours les connexions et rien ne semblait cassé à la maison. Mais la VIP du LAN était portée par les deux firewalls en même temps.&lt;/p&gt;
&lt;p&gt;C’était le genre de problème assez discret pour passer inaperçu, jusqu’au jour où il décide de ne plus l’être.&lt;/p&gt;
&lt;p&gt;Je n’ai rien tenté au milieu de l’opération. &lt;code&gt;p1&lt;/code&gt; a repris les neuf VIP avant le redémarrage du second, puis j’ai simplement surveillé le trafic jusqu’à son retour. Quelques minutes plus tard, les deux nœuds étaient bien en OPNsense &lt;code&gt;26.7.2_2&lt;/code&gt; sur FreeBSD 15.1 et tous les services répondaient.&lt;/p&gt;
&lt;p&gt;La mise à jour était terminée. Restait à comprendre ce petit double-MASTER.&lt;/p&gt;
&lt;h2 id="p2-discutait-avec-lui-même"&gt;P2 discutait avec lui-même
&lt;/h2&gt;&lt;p&gt;Le CARP du LAN utilisait l’unicast. Chaque firewall devait envoyer ses annonces directement à l’adresse réelle de l’autre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P1 devait cibler 10.0.0.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P2 devait cibler 10.0.0.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dans la configuration réelle, les deux ciblaient &lt;code&gt;10.0.0.3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour &lt;code&gt;p1&lt;/code&gt;, c’était correct. Pour &lt;code&gt;p2&lt;/code&gt;, beaucoup moins : il envoyait ses annonces CARP à sa propre adresse.&lt;/p&gt;
&lt;p&gt;Le plus amusant, c’est que la synchronisation HA faisait exactement ce que je lui demandais. &lt;code&gt;p1&lt;/code&gt; copiait sa configuration vers &lt;code&gt;p2&lt;/code&gt;, y compris ce pair unicast qui aurait justement dû être différent sur chaque machine. Corriger uniquement le second nœud n’aurait servi à rien : la synchronisation suivante aurait remis la mauvaise valeur.&lt;/p&gt;
&lt;p&gt;Mes huit autres VIP fonctionnaient déjà avec le multicast CARP classique. J’ai donc vérifié que les annonces envoyées vers &lt;code&gt;224.0.0.18&lt;/code&gt; traversaient bien le bridge Proxmox et arrivaient sur &lt;code&gt;p2&lt;/code&gt;. C’était le cas.&lt;/p&gt;
&lt;p&gt;J’ai supprimé le pair unicast du LAN et laissé CARP revenir à son fonctionnement normal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P1 ─┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 224.0.0.18
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P2 ─┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cette fois, les deux firewalls pouvaient partager exactement la même configuration sans que l’un d’eux finisse par se parler à lui-même.&lt;/p&gt;
&lt;h2 id="le-petit-test-qui-évite-les-grandes-suppositions"&gt;Le petit test qui évite les grandes suppositions
&lt;/h2&gt;&lt;p&gt;Une fois la correction appliquée, j’ai placé &lt;code&gt;p1&lt;/code&gt; en maintenance. &lt;code&gt;p2&lt;/code&gt; a repris les neuf VIP, le DNS a continué de répondre et mes routes applicatives sont restées accessibles. En quittant le mode maintenance, &lt;code&gt;p1&lt;/code&gt; est redevenu MASTER par préemption et &lt;code&gt;p2&lt;/code&gt; est retourné en BACKUP.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fw-core-p1 : MASTER 9/9
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fw-core-p2 : BACKUP 9/9
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;demotion : 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pfsync : synchronisé
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Au final, la mise à jour vers la &lt;a class="link" href="https://docs.opnsense.org/releases/CE_26.7.html" target="_blank" rel="noopener"
&gt;série OPNsense 26.7&lt;/a&gt; s’est passée sans incident. Elle m’a surtout donné une bonne excuse pour regarder un peu plus loin que le voyant vert.&lt;/p&gt;
&lt;p&gt;Je voulais faire une petite révision. J’ai retiré une adresse dans un champ, relancé un vrai failover et mon cluster est maintenant plus simple qu’avant.&lt;/p&gt;
&lt;p&gt;C’est déjà pas mal pour une matinée de maintenance.&lt;/p&gt;</description></item><item><title>Je reconstruisais tout. Je ne notais rien.</title><link>https://blog.homeblack.fr/p/post-presentation/</link><pubDate>Sat, 15 Feb 2025 10:00:00 +0100</pubDate><guid>https://blog.homeblack.fr/p/post-presentation/</guid><description>&lt;img src="https://blog.homeblack.fr/p/post-presentation/cover.png" alt="Featured image of post Je reconstruisais tout. Je ne notais rien." /&gt;&lt;p&gt;Je venais de refaire une bonne partie de mon homelab. La virtualisation, le stockage, le réseau, les sauvegardes : tout avait été repris, déplacé ou repensé.&lt;/p&gt;
&lt;p&gt;Quelques semaines plus tard, j’ai rouvert une configuration et je me suis posé une question assez simple :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pourquoi est-ce que j’avais fait ça comme ça ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je savais qu’il y avait une raison. J’avais probablement testé plusieurs solutions, rencontré un problème puis choisi celle qui s’adaptait le mieux à mon environnement. Le résultat fonctionnait toujours, mais le chemin pour y arriver avait déjà commencé à disparaître.&lt;/p&gt;
&lt;p&gt;Ce n’était pas la première fois.&lt;/p&gt;
&lt;h2 id="résoudre-passer-au-suivant-oublier"&gt;Résoudre, passer au suivant, oublier
&lt;/h2&gt;&lt;p&gt;J’ai longtemps travaillé de cette manière dans mon homelab. Une idée me trottait dans la tête, je montais un petit lab, je cassais quelques trucs et je finissais par obtenir quelque chose d’utilisable.&lt;/p&gt;
&lt;p&gt;Une fois le problème résolu, je passais au suivant.&lt;/p&gt;
&lt;p&gt;Le raisonnement restait quelque part entre ma mémoire, un historique de commandes et quelques fichiers dont le nom commençait parfois par &lt;code&gt;final&lt;/code&gt; et finissait par &lt;code&gt;v2&lt;/code&gt;. Autant dire que, six mois plus tard, la recherche archéologique était rarement brillante.&lt;/p&gt;
&lt;p&gt;Le plus frustrant n’était pas d’avoir oublié une commande. Une documentation constructeur pouvait souvent me la redonner. Ce que je perdais, c’était la raison du choix : pourquoi cet outil, pourquoi cette architecture et quelle mauvaise piste j’avais déjà éliminée.&lt;/p&gt;
&lt;h2 id="la-reconstruction-qui-a-servi-de-déclic"&gt;La reconstruction qui a servi de déclic
&lt;/h2&gt;&lt;p&gt;Cette remise à plat du homelab est arrivée pendant une période plus compliquée professionnellement, où je me suis retrouvé au chômage. J’avais davantage de temps pour reprendre les fondations, expérimenter et remettre de l’ordre dans ce que j’avais accumulé.&lt;/p&gt;
&lt;p&gt;En reconstruisant la virtualisation, le stockage, le réseau et les sauvegardes, j’ai compris que mon principal problème n’était pas technique.&lt;/p&gt;
&lt;p&gt;Je ne gardais aucune trace de ce que je faisais.&lt;/p&gt;
&lt;p&gt;Je pouvais passer plusieurs soirées à comprendre un comportement, trouver le bon compromis, vérifier que tout fonctionnait… puis ne laisser derrière moi que la configuration finale. Toute la partie intéressante disparaissait alors que c’était justement elle qui pouvait m’être utile plus tard.&lt;/p&gt;
&lt;h2 id="un-blog-plutôt-quun-dossier-de-notes-oublié"&gt;Un blog plutôt qu’un dossier de notes oublié
&lt;/h2&gt;&lt;p&gt;J’aurais pu ouvrir un dossier &lt;code&gt;documentation/&lt;/code&gt;, rédiger trois fichiers Markdown et oublier leur existence. Je me connais suffisamment pour savoir comment cette histoire se serait terminée.&lt;/p&gt;
&lt;p&gt;Le blog ajoutait une petite contrainte qui me manquait : pour publier un article, je devais remettre les événements dans l’ordre, expliquer le problème et vérifier que ce que j’écrivais correspondait encore à la réalité.&lt;/p&gt;
&lt;p&gt;Il ne s’agissait plus seulement de conserver une commande. Il fallait raconter pourquoi elle avait été nécessaire.&lt;/p&gt;
&lt;p&gt;C’est devenu la première mission de ce blog : servir de mémoire technique à mon homelab. Si un retour d’expérience peut ensuite faire gagner du temps à quelqu’un ou lui donner une idée à essayer, c’est un très bon bonus.&lt;/p&gt;
&lt;p&gt;Pour mon parcours et ce qui se cache derrière le pseudo, la page &lt;a class="link" href="https://blog.homeblack.fr/whoami/" &gt;mook &amp;ndash;about&lt;/a&gt; fait désormais bien mieux le travail qu’une longue présentation au milieu de cet article.&lt;/p&gt;
&lt;h2 id="ce-que-cette-mauvaise-habitude-a-fini-par-produire"&gt;Ce que cette mauvaise habitude a fini par produire
&lt;/h2&gt;&lt;p&gt;Depuis, les articles les plus intéressants sont justement ceux que je n’aurais probablement jamais documentés avant.&lt;/p&gt;
&lt;p&gt;La naissance de &lt;a class="link" href="https://blog.homeblack.fr/p/warpgatesh-synchroniser-acces-ssh-warpgate/" &gt;WarpgateSH&lt;/a&gt; aurait pu rester un script lancé à la main puis oublié. Les sauvegardes qui malmenaient &lt;a class="link" href="https://blog.homeblack.fr/p/ceph-backups-pbs/" &gt;mon cluster Ceph&lt;/a&gt; auraient pu se résumer à « j’ai décalé les horaires et ça va mieux ». Et ma petite &lt;a class="link" href="https://blog.homeblack.fr/p/revision-cluster-opnsense/" &gt;révision du cluster OPNsense&lt;/a&gt; aurait probablement laissé derrière elle une correction sans son raisonnement.&lt;/p&gt;
&lt;p&gt;Tout n’est pas documenté pour autant. Certains essais restent dans un terminal, certains projets attendent encore leur article et je continue parfois à comprendre trop tard que j’aurais dû prendre des notes plus tôt.&lt;/p&gt;
&lt;p&gt;Mais le réflexe a changé. Quand je termine quelque chose, je ne me demande plus seulement si ça fonctionne aujourd’hui. Je me demande aussi ce que j’aurai oublié le jour où je devrai y revenir.&lt;/p&gt;
&lt;p&gt;C’est généralement là qu’un nouvel article commence.&lt;/p&gt;</description></item></channel></rss>