<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home Lab | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/fr/category/home-lab/</link>
      <atom:link href="https://antoine.weill-duflos.fr/fr/category/home-lab/index.xml" rel="self" type="application/rss+xml" />
    <description>Home Lab</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Mon, 13 Apr 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>Home Lab</title>
      <link>https://antoine.weill-duflos.fr/fr/category/home-lab/</link>
    </image>
    
    <item>
      <title>GitOps auto-heberge a la maison : gerer 30&#43; services avec Komodo et un cluster Proxmox</title>
      <link>https://antoine.weill-duflos.fr/fr/post/komodo/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/komodo/</guid>
      <description>&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;Faire tourner une poignee de services auto-heberges, c&amp;rsquo;est facile. Un seul &lt;code&gt;docker-compose up&lt;/code&gt; et c&amp;rsquo;est regle. Mais a un moment, &amp;ldquo;une poignee&amp;rdquo; devient 30+ stacks repartis sur plusieurs serveurs, et la il faut une vraie solution pour tout gerer. C&amp;rsquo;est la ou j&amp;rsquo;en suis aujourd&amp;rsquo;hui, et la partie la plus interessante n&amp;rsquo;est pas un service en particulier, mais la couche d&amp;rsquo;orchestration qui relie tout ensemble.&lt;/p&gt;
&lt;h2 id=&#34;le-probleme&#34;&gt;Le probleme&lt;/h2&gt;
&lt;p&gt;Je fais tourner beaucoup de services chez moi. Gestion de photos, domotique, synchronisation de fichiers, NVR avec detection IA, un CRM personnel, lecteur RSS, gestion documentaire, gestionnaire de mots de passe, analytics, un serveur Matrix, inference LLM&amp;hellip; la liste continue. Chacun est un stack Docker Compose. Chacun doit etre deploye, mis a jour, surveille, et occasionnellement debogue.&lt;/p&gt;
&lt;p&gt;Pendant un moment, je gerais tout manuellement : SSH sur un serveur, &lt;code&gt;cd&lt;/code&gt; dans le bon repertoire, &lt;code&gt;docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt;, verifier les logs. Ca marche, mais ca ne passe pas a l&amp;rsquo;echelle. Quand on gere des services sur six hotes differents, on passe plus de temps sur la logistique que sur l&amp;rsquo;utilisation reelle des outils qu&amp;rsquo;on a construits.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais besoin d&amp;rsquo;un plan de controle.&lt;/p&gt;
&lt;h2 id=&#34;le-materiel--un-cluster-proxmox&#34;&gt;Le materiel : un cluster Proxmox&lt;/h2&gt;
&lt;p&gt;Tout tourne sur un cluster &lt;strong&gt;Proxmox VE&lt;/strong&gt; construit a partir de materiel d&amp;rsquo;entreprise recycle :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Noeud&lt;/th&gt;
          &lt;th&gt;CPU&lt;/th&gt;
          &lt;th&gt;RAM&lt;/th&gt;
          &lt;th&gt;Role&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Principal&lt;/td&gt;
          &lt;td&gt;Xeon E5-2640 (12 coeurs @ 2.5 GHz)&lt;/td&gt;
          &lt;td&gt;32 Go&lt;/td&gt;
          &lt;td&gt;Charges principales&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Secondaire&lt;/td&gt;
          &lt;td&gt;Xeon E5-2430 (12 coeurs @ 2.2 GHz)&lt;/td&gt;
          &lt;td&gt;24 Go&lt;/td&gt;
          &lt;td&gt;Charges secondaires&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ce sont de vieux serveurs, le genre qu&amp;rsquo;on trouve pour presque rien. Ils sont bruyants, consomment de l&amp;rsquo;electricite, et ont plus de puissance de calcul que je n&amp;rsquo;en aurai jamais besoin. Parfait pour un homelab.&lt;/p&gt;
&lt;p&gt;Le cluster fait tourner environ 40 conteneurs LXC. Les conteneurs LXC sont le vrai cheval de bataille : ils sont plus legers que des VMs, demarrent en quelques secondes, et offrent une isolation correcte sans le surcout de la virtualisation complete. La plupart de mes hotes Docker sont des conteneurs LXC avec quelques Go de RAM chacun.&lt;/p&gt;
&lt;h2 id=&#34;les-serveurs--qui-fait-quoi&#34;&gt;Les serveurs : qui fait quoi&lt;/h2&gt;
&lt;p&gt;Tous les conteneurs LXC ne font pas tourner Docker. Certains hebergent des services standalone (DNS, monitoring, reverse proxy, authentification). Mais les hotes Docker sont regroupes logiquement dans &lt;strong&gt;Komodo&lt;/strong&gt; comme &amp;ldquo;serveurs&amp;rdquo;, chacun etant un conteneur LXC leger dedie a un ensemble de stacks lies. Komodo voit six serveurs au total : quelques hotes Docker generalistes, une instance Home Assistant dediee, un hote de gestion de photos, un conteneur d&amp;rsquo;alertes, et le vault.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;vault&lt;/strong&gt; est le plus interessant. C&amp;rsquo;est en fait un NAS sous &lt;strong&gt;OpenMediaVault&lt;/strong&gt; avec un GPU &lt;strong&gt;Intel Arc B580&lt;/strong&gt; installe. Cette seule carte gere le decodage video materiel pour les flux cameras de Frigate, la detection d&amp;rsquo;objets par IA, &lt;em&gt;et&lt;/em&gt; l&amp;rsquo;inference LLM via Ollama, le tout en meme temps. J&amp;rsquo;ai ecrit sur le volet Frigate dans un &lt;a href=&#34;https://antoine.weill-duflos.fr/fr/post/frigate/&#34;&gt;article precedent&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;komodo-entre-en-scene&#34;&gt;Komodo entre en scene&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://komo.do/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Komodo&lt;/a&gt; est un gestionnaire de deploiement auto-heberge. Pensez-y comme une alternative legere a Portainer ou Coolify, mais axe sur la gestion de stacks Docker Compose a travers plusieurs serveurs. Pourquoi je l&amp;rsquo;ai choisi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gestion multi-serveur depuis un seul tableau de bord.&lt;/strong&gt; Une seule interface pour voir et controler chaque stack sur chaque serveur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploiements bases sur Git.&lt;/strong&gt; Les stacks peuvent tirer leurs fichiers compose depuis un depot Git. Poussez un changement, et Komodo le deploie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mises a jour declenchees par webhook.&lt;/strong&gt; Mon instance Gitea auto-hebergee envoie des webhooks a Komodo a chaque push. Le stack se redeploie automatiquement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mise a jour automatique des images.&lt;/strong&gt; Komodo peut verifier les nouvelles images et mettre a jour les conteneurs sans intervention manuelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion des variables d&amp;rsquo;environnement.&lt;/strong&gt; Les secrets et la config vivent dans Komodo, pas dans le depot Git.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;architecture est la suivante : une instance centrale &lt;strong&gt;Komodo Core&lt;/strong&gt; tourne sur un serveur, et un agent leger &lt;strong&gt;Komodo Periphery&lt;/strong&gt; tourne sur chaque hote distant. Le core communique avec les agents peripheriques pour deployer et gerer les stacks. C&amp;rsquo;est simple, fiable, et ne necessite pas Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;le-workflow-gitops&#34;&gt;Le workflow GitOps&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la que ca devient interessant. Environ la moitie de mes stacks sont geres via des depots Git sur mon instance &lt;strong&gt;Gitea&lt;/strong&gt; auto-hebergee. Le workflow :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Je modifie un &lt;code&gt;docker-compose.yml&lt;/code&gt; dans un depot Gitea&lt;/li&gt;
&lt;li&gt;Je pousse le changement&lt;/li&gt;
&lt;li&gt;Gitea envoie un webhook a Komodo&lt;/li&gt;
&lt;li&gt;Komodo tire le fichier compose mis a jour&lt;/li&gt;
&lt;li&gt;Komodo redeploie le stack sur le serveur cible&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour les stacks qui n&amp;rsquo;ont pas besoin de fichiers compose versiones (services plus simples), Komodo gere les fichiers directement sur l&amp;rsquo;hote. Je peux quand meme les modifier via l&amp;rsquo;interface Komodo, mais ils ne sont pas sauvegardes dans Git.&lt;/p&gt;
&lt;p&gt;La separation est intentionnelle. Les stacks complexes avec plusieurs services, des configs personnalisees, ou des changements frequents vivent dans Git. Les services simples a conteneur unique sont geres en ligne. Cela evite le surcout de Git pour ce qui n&amp;rsquo;en a pas besoin, tout en me donnant un historique complet et la possibilite de rollback pour ce qui en a besoin.&lt;/p&gt;
&lt;h3 id=&#34;home-assistant--un-cas-particulier&#34;&gt;Home Assistant : un cas particulier&lt;/h3&gt;
&lt;p&gt;Home Assistant merite une mention car il est gere differemment. Toute sa configuration est dans un depot Gitea, et Komodo le surveille avec du polling et des webhooks. Quand je pousse un changement de config, Home Assistant recoit la mise a jour automatiquement. Plus besoin de SSH pour editer &lt;code&gt;configuration.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;le-reseau--opnsense-et-vlans&#34;&gt;Le reseau : OPNsense et VLANs&lt;/h2&gt;
&lt;p&gt;Faire tourner des dizaines de services sur un reseau plat serait un cauchemar de securite. J&amp;rsquo;utilise &lt;strong&gt;OPNsense&lt;/strong&gt; comme pare-feu/routeur avec plusieurs VLANs :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Segment reseau&lt;/th&gt;
          &lt;th&gt;Fonction&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Principal&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Serveurs et appareils de confiance&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;IoT&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Appareils domotiques (cameras, capteurs, ESPHome)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Lab&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;VMs et conteneurs experimentaux&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;WireGuard&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Acces VPN depuis l&amp;rsquo;exterieur&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les appareils IoT ne peuvent pas communiquer entre eux ni avec le reseau principal directement : ils ne peuvent atteindre que les services dont ils ont besoin (Home Assistant, Frigate). Le reseau lab est isole pour les tests. WireGuard me donne un acces distant securise a tout.&lt;/p&gt;
&lt;h3 id=&#34;dns--unbound--technitium&#34;&gt;DNS : Unbound + Technitium&lt;/h3&gt;
&lt;p&gt;Le DNS est gere par deux couches qui travaillent ensemble :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unbound&lt;/strong&gt; tourne directement sur OPNsense comme resolveur recursif principal. Il gere la resolution DNS en amont avec validation DNSSEC, et il est rapide, car la plupart des requetes sont servies depuis le cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technitium DNS&lt;/strong&gt; (dans deux conteneurs LXC pour la redondance) gere les zones DNS internes, pour que je puisse atteindre les services par nom au lieu de memoriser des IPs. Il fournit aussi du split-horizon DNS pour les services qui ont besoin de reponses differentes en interne et en externe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ntp--temps-gps-avec-chrony&#34;&gt;NTP : temps GPS avec Chrony&lt;/h3&gt;
&lt;p&gt;Un detail dont je suis particulierement content : la source de temps du reseau est un &lt;strong&gt;recepteur GPS USB&lt;/strong&gt; (BN-808, chipset u-blox M8N) connecte a un conteneur LXC dedie faisant tourner &lt;strong&gt;Chrony&lt;/strong&gt;. Le GPS fournit un temps Stratum 1 a tout le reseau.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;installation n&amp;rsquo;est pas parfaite : le GPS USB ne supporte pas le PPS (Pulse Per Second), donc la precision est limitee a environ 40ms a cause de la latence USB. Chrony compense avec une correction manuelle d&amp;rsquo;offset et bascule sur des serveurs NTP internet (Cloudflare, pools publics) si necessaire. OPNsense distribue ensuite le temps a tous les clients du reseau.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est surdimensionne pour un homelab, mais il y a quelque chose de satisfaisant a avoir sa propre source de temps disciplinee par GPS plutot que de dependre entierement de pools NTP externes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authelia&lt;/strong&gt; fournit le single sign-on avec authentification a deux facteurs devant tous les services web, avec &lt;strong&gt;Traefik&lt;/strong&gt; comme reverse proxy.&lt;/p&gt;
&lt;h2 id=&#34;stockage--le-nas-vault&#34;&gt;Stockage : le NAS vault&lt;/h2&gt;
&lt;p&gt;Le serveur &amp;ldquo;vault&amp;rdquo; est un NAS &lt;strong&gt;OpenMediaVault&lt;/strong&gt; qui fait double emploi comme noeud de calcul. Il dispose de 8 disques (un NVMe pour l&amp;rsquo;OS et 7 HDD allant de 2 To a 16 To) :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Disque&lt;/th&gt;
          &lt;th&gt;Modele&lt;/th&gt;
          &lt;th&gt;Capacite&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;NVMe&lt;/td&gt;
          &lt;td&gt;WD BLACK SN770&lt;/td&gt;
          &lt;td&gt;500 Go (boot)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 1&lt;/td&gt;
          &lt;td&gt;Seagate IronWolf&lt;/td&gt;
          &lt;td&gt;10 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 2&lt;/td&gt;
          &lt;td&gt;WD&lt;/td&gt;
          &lt;td&gt;10 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 3&lt;/td&gt;
          &lt;td&gt;WD&lt;/td&gt;
          &lt;td&gt;12 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 4&lt;/td&gt;
          &lt;td&gt;WD Green&lt;/td&gt;
          &lt;td&gt;2 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 5&lt;/td&gt;
          &lt;td&gt;WD Red&lt;/td&gt;
          &lt;td&gt;2 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 6&lt;/td&gt;
          &lt;td&gt;Seagate IronWolf Pro&lt;/td&gt;
          &lt;td&gt;16 To&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HDD 7&lt;/td&gt;
          &lt;td&gt;HGST Deskstar NAS&lt;/td&gt;
          &lt;td&gt;6 To&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Un melange de disques achetes au fil du temps ou en promo. La beaute de mon architecture de stockage, c&amp;rsquo;est qu&amp;rsquo;elle se fiche de l&amp;rsquo;uniformite.&lt;/p&gt;
&lt;h3 id=&#34;larchitecture-mergerfs-imbriquee&#34;&gt;L&amp;rsquo;architecture mergerfs imbriquee&lt;/h3&gt;
&lt;p&gt;Le stockage est organise en couches avec des pools &lt;strong&gt;mergerfs&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un pool protege par parite&lt;/strong&gt; : un pool mergerfs combinant 3 disques formates en btrfs. Ces disques sont proteges par la parite &lt;strong&gt;SnapRAID&lt;/strong&gt; (le Seagate 16 To sert de disque de parite).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un pool principal&lt;/strong&gt; : un super-pool qui fusionne le pool protege par parite avec un disque supplementaire en un seul espace. C&amp;rsquo;est la qu&amp;rsquo;Immich stocke les photos, Kavita les livres, et Frigate les clips video.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un pool photos en lecture seule&lt;/strong&gt; : une vue mergerfs qui regroupe tous mes repertoires de photos (photos personnelles, imports DCIM) en un seul point de montage pour un acces facile.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SnapRAID effectue les syncs de parite de maniere programmee (pas en temps reel comme le RAID traditionnel), ce qui signifie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas de penalite en ecriture, car les ecritures vont directement sur les disques btrfs&lt;/li&gt;
&lt;li&gt;Si un disque tombe en panne, on peut recuperer son contenu grace a la parite + les disques restants&lt;/li&gt;
&lt;li&gt;Les disques peuvent etre de tailles differentes (et ils le sont largement)&lt;/li&gt;
&lt;li&gt;Chaque disque est un systeme de fichiers standard lisible individuellement en cas d&amp;rsquo;urgence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le compromis : les donnees ecrites entre deux syncs de parite ne sont pas protegees. Pour un homelab qui stocke des photos et des medias, c&amp;rsquo;est un risque acceptable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proxmox Backup Server&lt;/strong&gt; tourne aussi dans Docker sur ce meme NAS, assurant les sauvegardes de VMs et conteneurs depuis le cluster Proxmox. Les deux noeuds Proxmox montent le stockage PBS du vault directement.&lt;/p&gt;
&lt;h2 id=&#34;surveillance-et-alertes&#34;&gt;Surveillance et alertes&lt;/h2&gt;
&lt;p&gt;On ne peut pas gerer ce qu&amp;rsquo;on ne voit pas. La stack de monitoring :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Outil&lt;/th&gt;
          &lt;th&gt;Role&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Collecte de metriques&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Tableaux de bord et visualisation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Uptime Kuma&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Surveillance de disponibilite&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;cAdvisor&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Metriques de ressources des conteneurs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;NetAlertX&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Surveillance des appareils reseau&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;ntfy&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Notifications push sur mon telephone&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Komodo lui-meme s&amp;rsquo;integre avec &lt;strong&gt;ntfy&lt;/strong&gt; pour les alertes de deploiement. Si un stack echoue a se deployer ou qu&amp;rsquo;un conteneur devient unhealthy, je recois une notification push immediatement. Le stack ntfy-alerter fait correspondre la severite des alertes Komodo aux niveaux de priorite ntfy : une alerte critique obtient un push haute priorite qui passe outre le mode Ne Pas Deranger.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ensemble tourne 24h/24, se gere en grande partie tout seul, et ne coute rien au-dela de l&amp;rsquo;electricite et de l&amp;rsquo;investissement materiel initial. Quand quelque chose a besoin d&amp;rsquo;attention, Komodo et ntfy s&amp;rsquo;assurent que je le sais, et le workflow GitOps fait que je peux regler la plupart des choses avec un &lt;code&gt;git push&lt;/code&gt; depuis mon telephone.&lt;/p&gt;
&lt;p&gt;Si vous faites tourner plus qu&amp;rsquo;une poignee de services auto-heberges et que vous les gerez encore manuellement, jetez un oeil a &lt;a href=&#34;https://komo.do/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Komodo&lt;/a&gt;. Ca a transforme mon homelab d&amp;rsquo;une collection d&amp;rsquo;hotes Docker en une vraie plateforme geree.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adieu les caméras cloud : vidéosurveillance auto-hébergée avec Frigate, Tapo et un Intel Arc B580</title>
      <link>https://antoine.weill-duflos.fr/fr/post/frigate/</link>
      <pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/frigate/</guid>
      <description>&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;habite au Canada. À un moment j&amp;rsquo;ai commencé à remarquer des signes de passage dans mon jardin. Animal ? Personne ? Impossible à dire. Du coup j&amp;rsquo;ai décidé de mettre des caméras. Ce qui devait être un simple achat s&amp;rsquo;est transformé en un vrai setup auto-hébergé avec détection par IA. Voici l&amp;rsquo;histoire.&lt;/p&gt;
&lt;h2 id=&#34;le-point-de-départ--amazon-blink&#34;&gt;Le point de départ : Amazon Blink&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;ai commencé par des caméras &lt;strong&gt;Amazon Blink&lt;/strong&gt;. Pas cher, sur batterie, déclenchement par mouvement, et ça tient bien le climat canadien. Pas de câblage, pas de réseau à configurer. On les colle au mur et c&amp;rsquo;est parti.&lt;/p&gt;
&lt;p&gt;Le problème ? Les faux positifs. En permanence. Une branche qui bouge dans le vent, une ombre, de la neige qui tombe&amp;hellip; tout déclenche une alerte. Au bout de quelques semaines, soit on finit par ignorer toutes les notifications (ce qui rend les caméras inutiles), soit on perd du temps à regarder des clips de rien du tout. Pas idéal.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est là que j&amp;rsquo;ai commencé à lire sur &lt;strong&gt;Frigate&lt;/strong&gt; et les caméras RTSP, et les choses sont devenues intéressantes.&lt;/p&gt;
&lt;h2 id=&#34;le-nouveau-setup&#34;&gt;Le nouveau setup&lt;/h2&gt;
&lt;h3 id=&#34;caméras-tapo&#34;&gt;Caméras Tapo&lt;/h3&gt;
&lt;p&gt;J&amp;rsquo;ai remplacé les Blink par des caméras &lt;strong&gt;Tapo&lt;/strong&gt;. L&amp;rsquo;intérêt principal : elles supportent le &lt;strong&gt;streaming RTSP&lt;/strong&gt; nativement et ont un slot &lt;strong&gt;carte micro SD&lt;/strong&gt; pour l&amp;rsquo;enregistrement local. Concrètement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un backup local sur la carte SD même si le réseau tombe&lt;/li&gt;
&lt;li&gt;Un flux vidéo direct en WiFi vers le NVR, sans passer par le cloud&lt;/li&gt;
&lt;li&gt;Des caméras qui fonctionnent à 100% sur le réseau local, sans compte ni abonnement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;frigate&#34;&gt;Frigate&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://frigate.video/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Frigate&lt;/a&gt; est un NVR (enregistreur vidéo réseau) open source qui a vraiment beaucoup évolué. Il offre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un tableau de bord unique avec les vues en direct de toutes les caméras&lt;/li&gt;
&lt;li&gt;La détection de mouvement comme premier filtre&lt;/li&gt;
&lt;li&gt;La détection d&amp;rsquo;objets par IA qui identifie &lt;em&gt;ce qui&lt;/em&gt; a bougé (personne, animal, voiture&amp;hellip;)&lt;/li&gt;
&lt;li&gt;Des descriptions de scènes complètes qui expliquent ce qui se passe réellement dans le clip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est ce dernier point qui change tout. Au lieu de recevoir « mouvement détecté », on obtient quelque chose comme :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Une personne ramasse une roue de vélo&lt;/strong&gt;
Une personne entre dans le cadre par le bas à droite et marche vers le centre de la zone où une roue de vélo est posée au sol. La personne se penche, ramasse la roue de vélo et se relève en la tenant. L&amp;rsquo;individu se retourne ensuite et repart vers la caméra, sortant du cadre par le bas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Avec ce niveau de détail, je ne suis notifié que quand il se passe vraiment quelque chose.&lt;/p&gt;
&lt;h2 id=&#34;le-matériel--intel-arc-b580&#34;&gt;Le matériel : Intel Arc B580&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;ai ajouté une &lt;strong&gt;Intel Arc B580&lt;/strong&gt; (Battlemage) dans mon serveur. Cette carte fait le double travail :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Décodage vidéo&lt;/strong&gt; : décodage matériel accéléré de tous les flux RTSP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inférence IA&lt;/strong&gt; : exécution des modèles de détection et de description de scènes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le support de la B580 dans Frigate est franchement correct. Les deux charges tournent sur le GPU en même temps, ce qui laisse le CPU tranquille. Les descriptions ne sont pas toujours parfaites mais elles sont largement suffisantes pour filtrer le bruit et n&amp;rsquo;alerter que sur des événements réels.&lt;/p&gt;
&lt;p&gt;Une seule carte, une conso raisonnable, pas besoin d&amp;rsquo;une machine dédiée au ML. Ça fait le job.&lt;/p&gt;
&lt;h3 id=&#34;le-modele-de-description-de-scenes--llamacpp--vulkan&#34;&gt;Le modele de description de scenes : llama.cpp + Vulkan&lt;/h3&gt;
&lt;p&gt;Les descriptions IA ne viennent pas du cloud non plus. Je fais tourner un serveur LLM local avec &lt;a href=&#34;https://github.com/ggml-org/llama.cpp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;llama.cpp&lt;/a&gt; et le backend Vulkan sur la B580. Frigate lui envoie des captures via une API compatible OpenAI, et le modele renvoie des descriptions de scene.&lt;/p&gt;
&lt;p&gt;Voici le docker-compose du serveur d&amp;rsquo;inference :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;version: &amp;quot;3.9&amp;quot;
services:
  llama-server-intel:
    image: ghcr.io/ggml-org/llama.cpp:server-vulkan
    container_name: llama-server-intel
    restart: unless-stopped
    devices:
      - /dev/dri:/dev/dri
    volumes:
      - /var/models:/models
    ports:
      - 4040:8080
    environment:
      # Workaround pour un bug fp16 du driver Mesa ANV sur les iGPU Intel.
      # Sans risque sur les dGPU (B580), ignore si pas necessaire.
      - GGML_VK_DISABLE_F16=${GGML_VK_DISABLE_F16:-0}
    command: &amp;gt;
      --model /models/Qwen3.5-9B-UD-Q4_K_XL.gguf
      --mmproj /models/mmproj/mmproj9B-BF16.gguf
      --n-gpu-layers 99
      --ctx-size ${LLAMA_CTX_SIZE:-131072}
      --host 0.0.0.0
      --port 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le modele utilise est Qwen3.5-9B avec un projecteur de vision, quantifie pour tenir dans les 12 Go de VRAM de la B580. Vulkan est 30-60% plus rapide que SYCL sur les GPU Intel Arc, c&amp;rsquo;est donc le bon backend pour cette carte.&lt;/p&gt;
&lt;h2 id=&#34;docker-compose-pour-frigate&#34;&gt;Docker-compose pour Frigate&lt;/h2&gt;
&lt;p&gt;Voici la config docker-compose de Frigate :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;version: &amp;quot;3.9&amp;quot;
services:
  frigate:
    container_name: frigate
    privileged: true
    restart: unless-stopped
    image: ghcr.io/blakeblackshear/frigate:stable
    shm_size: 512mb
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./config:/config
      - ./model:/model
      - ./storage:/media/frigate
      - /dev/dri/renderD128:/dev/dri/renderD128
      - type: tmpfs
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - 5005:5000
      - 8971:8971
      - 8554:8554 # Flux RTSP
      - 8555:8555/tcp # WebRTC over tcp
      - 8555:8555/udp # WebRTC over udp
      - 1984:1984
    environment:
      PLUS_API_KEY: ${PLUS_API_KEY} # optionnel, pour Frigate+
      FRIGATE_RTSP_PASSWORD: ${FRIGATE_RTSP_PASSWORD}
      OPENAI_BASE_URL: http://llama-server-intel:8080/v1 # pointe vers le LLM local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quelques notes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/dev/dri/renderD128&lt;/code&gt; donne a Frigate l&amp;rsquo;acces a la B580 pour le decodage video materiel&lt;/li&gt;
&lt;li&gt;Le montage &lt;code&gt;tmpfs&lt;/code&gt; sert de cache rapide pour les clips en cours de traitement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shm_size&lt;/code&gt; depend du nombre de flux camera (512 Mo suffit pour quelques cameras)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt; pointe vers le serveur llama.cpp pour les descriptions de scenes. Frigate utilise l&amp;rsquo;API compatible OpenAI, donc n&amp;rsquo;importe quel serveur local qui parle ce protocole fonctionne&lt;/li&gt;
&lt;li&gt;Mettez vos secrets dans un fichier &lt;code&gt;.env&lt;/code&gt; a cote du docker-compose, pas dans le YAML&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;home-assistant&#34;&gt;Home Assistant&lt;/h2&gt;
&lt;p&gt;Tout se branche sur &lt;strong&gt;Home Assistant&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les flux caméra et les événements Frigate apparaissent sur le dashboard HA&lt;/li&gt;
&lt;li&gt;Les notifications passent par le moteur d&amp;rsquo;automatisation de HA&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;accès à distance se fait via la connexion sécurisée intégrée à HA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les caméras détectent, Frigate analyse, Home Assistant notifie. Tout en local.&lt;/p&gt;
&lt;h2 id=&#34;pourquoi-auto-héberger-ses-caméras-&#34;&gt;Pourquoi auto-héberger ses caméras ?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vos données restent chez vous.&lt;/strong&gt; Aucune image ne quitte votre réseau. Aucun fournisseur cloud ne stocke ou traite vos flux vidéo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pas d&amp;rsquo;abonnement.&lt;/strong&gt; Les caméras cloud adorent facturer au mois pour des fonctions &amp;ldquo;premium&amp;rdquo; comme la détection de personnes. Ici, zéro coût récurrent après le matériel&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beaucoup moins de faux positifs.&lt;/strong&gt; La détection IA vs. la simple détection de mouvement, c&amp;rsquo;est le jour et la nuit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des alertes vraiment utiles.&lt;/strong&gt; Vous savez ce qui s&amp;rsquo;est passé, pas juste qu&amp;rsquo;il y a eu du mouvement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionne hors ligne.&lt;/strong&gt; Le backup sur carte SD + NVR local fait que le système continue d&amp;rsquo;enregistrer même sans Internet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;résumé&#34;&gt;Résumé&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Composant&lt;/th&gt;
          &lt;th&gt;Ce qu&amp;rsquo;il fait&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Caméras Tapo&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Flux RTSP + enregistrement local sur carte SD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Frigate&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;NVR open source avec détection d&amp;rsquo;objets par IA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Intel Arc B580&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Décodage vidéo + inférence IA sur une seule carte&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Home Assistant&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Dashboard, notifications, accès distant&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Serveur local&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Fait tourner Frigate et Home Assistant&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;pour-conclure&#34;&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Ça m&amp;rsquo;a pris un peu de temps à mettre en place, mais je suis vraiment content du résultat. Plus de dépendance au cloud, pas d&amp;rsquo;abonnement, et le problème des faux positifs est réglé. Les descriptions IA sont étonnamment bonnes et la B580 gère tout sans broncher.&lt;/p&gt;
&lt;p&gt;Si vous en avez marre de recevoir des notifications pour des branches d&amp;rsquo;arbre, jetez un œil à Frigate. Le projet a beaucoup mûri et avec Home Assistant ça fait un système solide et fiable.&lt;/p&gt;
&lt;p&gt;Et surtout : je peux enfin arrêter de vérifier mon téléphone à chaque coup de vent.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
