<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>smea.tech</title>
	<atom:link href="https://smea.tech/feed/" rel="self" type="application/rss+xml" />
	<link>https://smea.tech</link>
	<description>Techno, actu et bidouilles</description>
	<lastBuildDate>Wed, 12 Aug 2026 20:35:04 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>CrowdSec : protéger vos sites et applications web</title>
		<link>https://smea.tech/crowdsec-proteger-sites-applications-web/</link>
					<comments>https://smea.tech/crowdsec-proteger-sites-applications-web/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Wed, 12 Aug 2026 20:35:04 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[crowdsec]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[securite]]></category>
		<category><![CDATA[waf]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=142</guid>

					<description><![CDATA[Je vous avais dit que Nginx Proxy Manager Plus pouvait avoir un WAF. Le voilà : CrowdSec, qui fait aussi IDS et IPS, et qui bannit tout seul.]]></description>
										<content:encoded><![CDATA[<p>Quand je vous ai parlé de <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager Plus</a>, je vous ai dit qu&rsquo;il pouvait avoir un WAF. Voilà, c&rsquo;est de ça qu&rsquo;on va parler. Et pas que.</p>
<h2>WAF, IDS, IPS : trois sigles, trois métiers</h2>
<p>Commençons par le début, parce que WAF, ça veut dire quoi au juste ?</p>
<p><strong>WAF</strong>, c&rsquo;est Web Application Firewall. Un pare-feu applicatif. Contrairement au pare-feu classique qui regarde des IP et des ports, lui il lit le contenu HTTP : l&rsquo;URL, les en-têtes, le corps de la requête, les cookies. Et il bloque ce qui ressemble à une attaque applicative : injection SQL, XSS, chemin d&rsquo;URL douteux, quelqu&rsquo;un qui vient renifler si tu n&rsquo;aurais pas laissé traîner un fichier <code>.env</code> à la racine.</p>
<p>Deux autres sigles vont avec, et ils reviennent tout le temps.</p>
<p><strong>IDS</strong>, Intrusion Detection System. Il détecte et il alerte, sans agir. C&rsquo;est un capteur.</p>
<p><strong>IPS</strong>, Intrusion Prevention System. Même chose, mais il agit : il coupe la connexion, il bannit l&rsquo;IP.</p>
<p>Et CrowdSec, lui, il est tout ça à la fois. Le moteur lit les logs, corrèle et décide : c&rsquo;est l&rsquo;IDS. Les bouncers appliquent la sanction là où ça compte, dans le reverse proxy par exemple : ça en fait un IPS. Et son composant AppSec inspecte les requêtes HTTP avant qu&rsquo;elles n&rsquo;atteignent ton appli : c&rsquo;est le WAF. Trois casquettes, un seul conteneur.</p>
<h2>Communautaire, ça veut dire quoi exactement</h2>
<p>C&rsquo;est le gros argument de CrowdSec, et c&rsquo;est celui qu&rsquo;on résume souvent mal. Alors voilà ce qui se passe vraiment.</p>
<p>Quand ton moteur repère une IP qui fait n&rsquo;importe quoi, il la signale à CrowdSec. Et il envoie <strong>seulement ça</strong> : l&rsquo;adresse, et ce qu&rsquo;elle a tenté. Tes logs ne bougent pas de chez toi.</p>
<p>En face, CrowdSec compare avec ce que remontent tous les autres. Une IP dénoncée par un seul serveur ne fait rien, ça évite les petits malins qui voudraient faire bannir 8.8.8.8 par la terre entière. Mais quand elle est signalée par plein de serveurs qui ne se connaissent pas, elle part dans la <strong>liste noire commune</strong>, et tout le monde la reçoit.</p>
<p>Résultat : tu bloques des IP malveillantes avant même qu&rsquo;elles t&rsquo;aient visé. C&rsquo;est ça le vrai gain. Un serveur seul apprend de ce qu&rsquo;il subit, un serveur branché sur CrowdSec apprend de ce que subissent les autres.</p>
<p>Deux nuances honnêtes quand même. D&rsquo;abord, l&rsquo;accès à la liste dépend de ta contribution : si tu envoies des signaux régulièrement, ton moteur est abonné automatiquement à la liste complète, sinon tu reçois une version allégée. Ensuite, le partage se désactive, ce n&rsquo;est pas imposé. Mais si tu le coupes, tu gardes seulement la détection locale et tu ne reçois plus la liste. Donnant-donnant.</p>
<p>Pour savoir où tu en es, une commande suffit :</p>
<pre><code>docker exec crowdsec cscli capi status</code></pre>
<pre><code>You can successfully interact with Central API (CAPI)
Sharing signals is enabled
Pulling community blocklist is enabled</code></pre>
<h2>L&rsquo;installer</h2>
<p>Comme d&rsquo;habitude je passe par <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>, je trouve que c&rsquo;est le mieux. Voilà mon compose, adapte les chemins à ta machine :</p>
<pre><code>services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: crowdsec
    restart: unless-stopped
    network_mode: host
    environment:
      GID: "1000"
      COLLECTIONS: "crowdsecurity/linux crowdsecurity/sshd crowdsecurity/http-cve crowdsecurity/base-http-scenarios crowdsecurity/nginx ZoeyVid/npmplus"
    volumes:
      - /path/de/ton/npmplus/data/nginx/logs:/var/log/npmplus:ro
      - /var/log:/var/log/host:ro
      - /home/ton-user/crowdsec/config:/etc/crowdsec
      - /home/ton-user/crowdsec/data:/var/lib/crowdsec/data
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"</code></pre>
<p>Les <code>COLLECTIONS</code>, ce sont les paquets de scénarios installés au démarrage. Là je prends le Linux de base, SSH, les CVE web connues, les scénarios HTTP génériques, nginx, et celui dédié à <a href="https://github.com/ZoeyVid/NPMplus">NPMplus</a>. Le <code>network_mode: host</code> est important : le moteur doit être joignable en local par le bouncer et par le WAF, sur les ports 8080 et 7422.</p>
<h2>Côté NPMplus, il y a quand même trois choses à faire</h2>
<p>Sur <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">mon reverse proxy</a>, je pensais qu&rsquo;il n&rsquo;y avait rien à toucher. En fait si, un peu. Rien de méchant, mais si tu sautes ces étapes tu auras un CrowdSec qui tourne dans le vide et qui ne bloquera jamais rien.</p>
<p><strong>Un.</strong> Créer la clé du bouncer côté CrowdSec :</p>
<pre><code>docker exec crowdsec cscli bouncers add npmplus</code></pre>
<p><strong>Deux.</strong> Coller cette clé dans <code>crowdsec.conf</code>, dans le dossier de données de NPMplus, et passer <code>ENABLED</code> à <code>true</code>. Pendant que tu y es, vérifie ces lignes, ce sont elles qui branchent le moteur et le WAF :</p>
<pre><code>ENABLED=true
API_URL=http://127.0.0.1:8080
APPSEC_URL=http://127.0.0.1:7422
APPSEC_FAILURE_ACTION=deny</code></pre>
<p><strong>Trois.</strong> Déclarer l&rsquo;acquisition côté CrowdSec, dans un fichier <code>acquis.d/npmplus.yaml</code>. Il y a deux sources : les fichiers de logs, et le WAF qui écoute en direct.</p>
<pre><code>filenames:
  - /var/log/npmplus/*.log
labels:
  type: npmplus
---
listen_addr: 0.0.0.0:7422
appsec_config: crowdsecurity/appsec-default
name: appsec
source: appsec
labels:
  type: appsec</code></pre>
<p>Et là, le piège dans lequel je suis tombé sans m&rsquo;en rendre compte : <strong>NPMplus n&rsquo;écrit pas ses logs d&rsquo;accès sur le disque par défaut</strong>. Il faut passer <code>LOGROTATE</code> à <code>true</code> dans son compose. Sinon le dossier reste désespérément vide, et la moitié « lecture de logs » de CrowdSec ne voit rien passer.</p>
<p>Je l&rsquo;ai découvert en regardant mes métriques, des mois après : mon dossier de logs est vide, et absolument tout mon trafic analysé est passé par AppSec. Ça marchait très bien, remarque, mais je me privais de la moitié des scénarios. Va vérifier chez toi, ça prend dix secondes :</p>
<pre><code>docker exec crowdsec cscli metrics show acquisition</code></pre>
<h2>Une interface web pour voir ce qui se passe</h2>
<p>Le moteur se pilote très bien en ligne de commande, mais j&rsquo;ai rajouté un petit projet qui donne une vraie vue sur ce qui se passe, et honnêtement je ne reviendrai pas en arrière : <a href="https://github.com/TheDuffman85/crowdsec-web-ui">CrowdSec Web UI</a>.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="758" decoding="async" src="https://smea.tech/img/u/2026/08/crowdsec-dashboard.png/_inside_1560__.webp" alt="Tableau de bord de CrowdSec Web UI : 1420 alertes totales, 2 décisions actives, l'historique d'activité sur sept jours en barres rouges et bleues, une carte du monde avec les États-Unis en rouge foncé, et les tops par pays, scénario et AS" /><figcaption>Les alertes, les bans en cours, d&rsquo;où ça vient et ce qui a été tenté. Tout sur un seul écran.</figcaption></figure>
<p>Il se branche sur l&rsquo;API locale avec un compte machine, à créer d&rsquo;abord côté CrowdSec, en choisissant son mot de passe :</p>
<pre><code>docker exec crowdsec cscli machines add crowdsec-web-ui --password 'ton-mot-de-passe'</code></pre>
<p>Puis le compose, avec ce même mot de passe :</p>
<pre><code>services:
  crowdsec-web-ui:
    image: ghcr.io/theduffman85/crowdsec-web-ui:latest
    container_name: crowdsec-web-ui
    restart: unless-stopped
    ports:
      - "127.0.0.1:3060:3060"
    volumes:
      - /home/ton-user/crowdsec-web-ui/data:/app/data
    environment:
      PORT: "3060"
      CROWDSEC_URL: http://host.docker.internal:8080
      CROWDSEC_USER: crowdsec-web-ui
      CROWDSEC_PASSWORD: "ton-mot-de-passe-genere"
      DB_DIR: /app/data
    extra_hosts:
      - "host.docker.internal:host-gateway"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"</code></pre>
<p>Note le <code>127.0.0.1:3060</code> devant le port : le conteneur n&rsquo;écoute que sur la machine elle-même, rien n&rsquo;est exposé au monde. C&rsquo;est le reverse proxy qui décidera qui a le droit d&rsquo;entrer.</p>
<p>Ensuite j&rsquo;ai fait ce que je fais toujours : un sous-domaine chez <a href="https://smea.tech/duckdns-acceder-homelab/">Duck DNS</a>, et un proxy host dans <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">NPMplus</a> pointé sur le port 3060. Et sur celui-là, mets une Access List, ou ton SSO si tu en as un. C&rsquo;est un tableau de bord de sécurité, ce serait dommage de le laisser en libre-service. Le SSO, j&rsquo;en parlerai la prochaine fois, promis.</p>
<h2>Et là, tous tes sites sont protégés</h2>
<p>C&rsquo;est ça le vrai truc. Une fois le bouncer branché, <strong>tout ce qui passe par NPMplus passe par CrowdSec</strong>. Tous tes domaines, d&rsquo;un coup, sans rien faire de plus. C&rsquo;est limite magique.</p>
<p>Et si un site fait des faux positifs, tu peux couper l&rsquo;inspection domaine par domaine, dans les options du proxy host :</p>
<figure>
  <img width="608" height="675" decoding="async" src="https://smea.tech/img/u/2026/08/crowdsec-option-npmplus.png/_inside_608__.webp" alt="Fenêtre Edit Proxy Host de NPMplus, onglet Details, avec l'option Disable Crowdsec Appsec encadrée en rouge parmi les autres interrupteurs" /><figcaption>Un interrupteur par domaine. Attention, il ne coupe que le WAF, pas le bannissement d&rsquo;IP.</figcaption></figure>
<p>La nuance vaut le coup d&rsquo;être dite : cet interrupteur désactive l&rsquo;inspection AppSec pour ce domaine, donc la partie WAF. Le bannissement des IP déjà connues, lui, continue de s&rsquo;appliquer. C&rsquo;est plutôt une bonne chose, tu lèves la contrainte gênante sans lever la protection.</p>
<p>Et si c&rsquo;est une IP précise qui se fait jeter à tort, la tienne au hasard, tu la sors du lot :</p>
<pre><code>docker exec crowdsec cscli allowlists create mes-ip -d "IP de confiance"
docker exec crowdsec cscli allowlists add mes-ip 203.0.113.42
docker exec crowdsec cscli decisions delete --ip 203.0.113.42</code></pre>
<p>Ou alors tu ne tapes rien du tout et tu passes par l&rsquo;interface web : la page Décisions liste les bans en cours et tu débannis en un clic. Elle sait aussi faire l&rsquo;inverse, bannir une IP à la main avec la durée que tu veux, si tu en croises une qui t&rsquo;agace.</p>
<h2>Ce que ça donne chez moi</h2>
<p>Des chiffres, tant qu&rsquo;à faire, parce que c&rsquo;est ça qui parle. Depuis que ça tourne : <strong>483 850 requêtes inspectées par le WAF, 10 110 bloquées</strong>. 1 420 alertes remontées. Et au moment où j&rsquo;écris, deux bans actifs seulement, parce qu&rsquo;un ban expire tout seul au bout de quelques heures.</p>
<p>Le scénario qui se déclenche le plus chez moi, et de loin, c&rsquo;est <code>vpatch-env-access</code> : des robots qui tournent en boucle en cherchant un fichier <code>.env</code> à télécharger, en espérant y trouver des mots de passe de base de données. Ils viennent en grande majorité de machines louées chez un gros hébergeur cloud. Ce ne sont pas des hackers dans une cave, ce sont des scanners industriels qui ratissent l&rsquo;Internet entier, en permanence, et qui tombent sur toi parce que tu existes.</p>
<p>Aucune de ces requêtes n&rsquo;a atteint mes applis. C&rsquo;est exactement le boulot.</p>
<h2>Franchement, c&rsquo;est devenu indispensable</h2>
<p>Je le recommande vraiment. C&rsquo;est une protection en plus, elle se pose en une soirée, et elle évite les mauvaises surprises. Le jour où une CVE sort sur un truc que tu héberges, le virtual patching est déjà en place avant que tu aies eu le temps de mettre à jour.</p>
<p>Et si vraiment ça te gêne quelque part, tu ajoutes une IP en liste blanche, ou tu désactives carrément le WAF sur un domaine. Tu gardes la main. Mais ça vaut le coup de le laisser travailler : après tout, il fait le tri pendant que tu dors.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/crowdsec-proteger-sites-applications-web/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/crowdsec-une.png/_inside_1024_683_.webp" length="1555751" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/crowdsec-une.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Auto Makefile : un Makefile cross projets automatisé</title>
		<link>https://smea.tech/auto-makefile-cross-projets/</link>
					<comments>https://smea.tech/auto-makefile-cross-projets/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Tue, 11 Aug 2026 20:18:14 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[outillage]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=131</guid>

					<description><![CDATA[Je trimballais le même Makefile de projet en projet sans savoir quelle version chacun abritait. Alors j'ai fait un Makefile qui télécharge les autres.]]></description>
										<content:encoded><![CDATA[<p>Auto Makefile, c&rsquo;est un Makefile capable d&rsquo;en télécharger un autre. Toutes mes commandes de dev, de build et de test passent par <code>make</code>, sur tous mes projets, et je trimballais le même fichier de l&rsquo;un à l&rsquo;autre depuis des années. J&rsquo;en avais assez : voilà l&rsquo;outil qui a réglé ça.</p>
<p>C&rsquo;est la première fois que je parle programmation sur ce blog, et pourtant je ne vais pas parler de code. Je vais parler de ce qu&rsquo;il y a autour : la façon dont on structure la stack d&rsquo;un projet. Parce qu&rsquo;un projet qui part bien, c&rsquo;est d&rsquo;abord un projet facile à lancer, à builder et à déployer. Le reste vient après.</p>
<h2>Le Makefile que je trimballais de projet en projet</h2>
<p>Que ce soit du JS, du PHP ou autre chose, tout passe chez moi par un Makefile. Les commandes de dev, le build, les tests, et même les environnements de recette et de production. Une seule porte d&rsquo;entrée, la même partout, quel que soit le langage derrière.</p>
<p>Le problème, c&rsquo;est que ce Makefile était un fichier que je copiais. Nouveau projet, copier-coller. Et le jour où j&rsquo;améliorais quelque chose dedans, il fallait répéter la modification projet par projet. Fastidieux, et surtout jamais fait jusqu&rsquo;au bout : au bout d&rsquo;un moment, je ne savais plus quel projet abritait quelle version, ni quelles commandes il connaissait. Deux projets côte à côte, deux comportements différents pour le même <code>make</code>.</p>
<p>D&rsquo;où <a href="https://github.com/Smeagolworms4/auto-makefile">Auto Makefile</a>. L&rsquo;idée tient en une phrase : garder dans le projet uniquement ce qui lui est propre, et aller chercher le générique ailleurs, au moment où on en a besoin.</p>
<h2>Un Makefile qui en charge un autre</h2>
<p>Concrètement, voilà à quoi ressemble le Makefile d&rsquo;un projet :</p>
<pre><code># configuration #

# external resource #
export MAKEFILE_URL=https://raw.githubusercontent.com/Smeagolworms4/auto-makefile/master
export IMPORT_MK=root.mk

# import #
$(shell [ ! -f .makefiles/index.mk ] &amp;&amp; mkdir -p .makefiles &amp;&amp; curl -L --silent -f $(MAKEFILE_URL)/$(IMPORT_MK) -o .makefiles/index.mk)
include .makefiles/index.mk

export CUSTOM_VAR  ## My custom variable 1
export CUSTOM_VAR2 ## My custom variable 2

##########
# Custom #
##########

## My custom rule
hello-world:
	echo Hello world</code></pre>
<p>Tu lui donnes une URL, il va chercher le fichier distant et le pose dans <code>.makefiles/</code>. C&rsquo;est là que tout se range, et c&rsquo;est un dossier à ignorer dans git : rien de ce qu&rsquo;il contient n&rsquo;a besoin d&rsquo;être versionné, tout se retélécharge.</p>
<p>La seule vraie condition, c&rsquo;est que le système ait <code>curl</code>. Il faut bien télécharger les fichiers distants un jour. Et justement, ce n&rsquo;est qu&rsquo;un jour : le test <code>[ ! -f .makefiles/index.mk ]</code> fait que le téléchargement n&rsquo;a lieu que si le fichier manque. Une fois le premier <code>make</code> passé, le projet fonctionne hors ligne comme n&rsquo;importe quel Makefile classique.</p>
<h2>make tout court, et tu as l&rsquo;aide</h2>
<p>La première chose que ça apporte, c&rsquo;est une commande <code>help</code> qui n&rsquo;est pas à écrire. <code>make</code> sans argument, ou <code>make help</code>, et tu obtiens ça :</p>
<figure>
  <img width="617" height="448" decoding="async" src="https://smea.tech/img/u/2026/08/auto-makefile-help.png/_inside_617__.webp" alt="Sortie de make help : la liste des variables documentées, puis les cibles regroupées par section" /><figcaption>L&rsquo;aide n&rsquo;est pas maintenue à la main : elle est reconstruite à chaque appel depuis les commentaires du Makefile.</figcaption></figure>
<p>Le mécanisme est bête et efficace. Un commentaire <code>##</code> juste au-dessus d&rsquo;une règle devient sa description. Un <code>##</code> à la fin d&rsquo;une ligne <code>export</code> documente la variable. Et les blocs de dièses encadrés servent de titres de section pour regrouper les règles :</p>
<pre><code>############
# Symfony  #
############

## Installe les dépendances
install:
	composer install</code></pre>
<p>Écrire la doc et écrire la règle, c&rsquo;est le même geste. Ce qui fait qu&rsquo;elle reste juste : personne n&rsquo;oublie de mettre à jour une aide qui se trouve sur la ligne d&rsquo;au-dessus.</p>
<h2>Les .env chargés dans le bon ordre</h2>
<p>Le fichier de base, <code>root.mk</code>, gère aussi les variables d&rsquo;environnement, et c&rsquo;est de loin ce dont je me sers le plus. Tu as un <code>.env</code>, il est chargé tout seul. Tu as un <code>.env.local</code>, il est chargé aussi, par-dessus. Et si tu lances <code>make ENV=prod</code> et qu&rsquo;il trouve un <code>.env.prod</code>, il le prend au passage.</p>
<p>Avec deux fichiers dans le projet et une règle qui se contente d&rsquo;afficher la variable, ça donne ça :</p>
<pre><code>$ cat .env
APP_SECRET=secret-de-dev

$ cat .env.prod
APP_SECRET=secret-de-prod

$ make debug
ENV=dev  APP_SECRET=secret-de-dev

$ make ENV=prod debug
ENV=prod APP_SECRET=secret-de-prod</code></pre>
<p>Il n&rsquo;y a rien à écrire dans ton Makefile pour ça, c&rsquo;est le comportement par défaut. Tu poses tes fichiers, ils sont pris.</p>
<h2>La variante Docker</h2>
<p>Et ça ne s&rsquo;arrête pas là. Le fichier que tu importes n&rsquo;est pas figé : il suffit de changer une ligne pour charger une autre variante de l&rsquo;outil.</p>
<pre><code>export IMPORT_MK=docker.mk</code></pre>
<p>Celle-ci ajoute les commandes Docker de base : <code>make list</code> pour voir les conteneurs, <code>make killall</code> pour repartir de zéro, <code>make clean-none</code> pour dégager les images sans nom. Des commandes qui ne sont liées à aucun projet en particulier, mais que je tape tous les jours.</p>
<p>Attention avec <code>killall</code> : il supprime tous les conteneurs de la machine, pas seulement ceux du projet courant, puis fait un <code>prune</code> des réseaux et des volumes. C&rsquo;est exactement ce que je veux sur mon poste de dev quand plus rien ne répond. C&rsquo;est aussi exactement ce qu&rsquo;il ne faut pas taper sur une machine qui héberge autre chose.</p>
<h2>docker-compose.mk, celui que j&rsquo;utilise vraiment</h2>
<p>La dernière variante est celle qui m&rsquo;intéresse le plus, parce que mes stacks sont full Docker :</p>
<pre><code>export IMPORT_MK=docker-compose.mk</code></pre>
<p>Elle ajoute <code>up</code>, <code>down</code>, <code>logs</code>, <code>docker-build</code> et <code>docker-pull</code>. Et surtout, elle choisit le fichier compose en fonction de l&rsquo;environnement.</p>
<p>Le principe, dans le détail. Par défaut, l&rsquo;outil cherche <code>docker/docker-compose.yml</code>. Quand tu lances <code>make ENV=prod up</code>, il regarde d&rsquo;abord si <code>docker/docker-compose.prod.yml</code> existe. S&rsquo;il le trouve, c&rsquo;est celui-là qu&rsquo;il utilise. Sinon il retombe sur le fichier de base, sans rien dire et sans planter.</p>
<pre><code>$ make debug
COMPOSE_PATH=/projet/docker/docker-compose.yml

$ make ENV=prod debug
COMPOSE_PATH=/projet/docker/docker-compose.prod.yml</code></pre>
<p>Le point important, et c&rsquo;est un choix de ma part : c&rsquo;est un <strong>remplacement</strong>, pas une superposition. Docker Compose sait empiler plusieurs fichiers avec <code>-f base.yml -f prod.yml</code>, où le second ne contient que les différences. Ici, non : le fichier de l&rsquo;environnement est utilisé <em>à la place</em> de l&rsquo;autre. Il doit donc être complet, et décrire toute la stack. C&rsquo;est plus verbeux, mais tu lis un seul fichier pour savoir ce qui tourne en prod, sans reconstituer mentalement une fusion de deux YAML.</p>
<p>Et comme les <code>.env</code> suivent la même variable <code>ENV</code>, une seule commande bascule tout ensemble : le bon fichier compose et les bonnes variables.</p>
<pre><code>make up            # docker-compose.yml   + .env
make ENV=prod up   # docker-compose.prod.yml + .env + .env.prod</code></pre>
<p>Autre détail commode : si tu définis <code>DOCKER_NAME</code>, il est passé en nom de projet à Compose. Deux stacks avec le même nom de dossier ne se marchent plus dessus.</p>
<p>À noter aussi, la mécanique s&#8217;empile toute seule. <code>docker-compose.mk</code> télécharge <code>docker.mk</code>, qui télécharge <code>root.mk</code>. Tu n&rsquo;écris qu&rsquo;un seul <code>curl</code> dans ton Makefile, et tu te retrouves avec les trois fichiers dans <code>.makefiles/</code> et toutes les commandes des trois niveaux.</p>
<h2>Tout se surcharge</h2>
<p>Aucune règle fournie n&rsquo;est verrouillée. Chaque commande est rangée dans une variable protégée par un <code>ifndef</code>, donc si tu la définis dans ton Makefile, c&rsquo;est la tienne qui gagne. Trois niveaux d&rsquo;intervention :</p>
<pre><code># remplacer complètement ce que fait la règle
export RULE_CMD_UP=$(COMPOSE) up -d --remove-orphans

# ajouter une dépendance : up construira les images avant
export RULE_DEP_UP=docker-build

# greffer une commande avant ou après
export RULE_CMD_UP_AFTER=$(COMPOSE) exec php composer install</code></pre>
<p>Dans les faits, c&rsquo;est ce que j&rsquo;utilise le plus : je garde la règle générique et je greffe le spécifique du projet autour. Un <code>make up</code> qui installe les dépendances et joue les migrations derrière, sans avoir réécrit la commande Docker.</p>
<h2>Mettre à jour, ou figer une version</h2>
<p>Puisque le fichier vient d&rsquo;ailleurs, il faut pouvoir le rafraîchir. C&rsquo;est la règle <code>update-makefile</code>, qui vide <code>.makefiles/</code> et relance <code>make</code> : au passage suivant, tout est retéléchargé.</p>
<pre><code>make update-makefile</code></pre>
<p>Et pour mon problème d&rsquo;origine, celui de ne jamais savoir quelle version un projet abritait, la réponse tient dans la ligne d&rsquo;URL. Le dépôt est étiqueté, donc rien n&rsquo;oblige à pointer sur <code>master</code> :</p>
<pre><code>export MAKEFILE_URL=https://raw.githubusercontent.com/Smeagolworms4/auto-makefile/v1.4.1</code></pre>
<p>Le projet dit alors noir sur blanc de quelle version il dépend, et il s&rsquo;y tient. Sur mes projets qui bougent, je reste sur <code>master</code> et je fais un <code>update-makefile</code> de temps en temps. Sur ceux qui doivent juste continuer à marcher, j&rsquo;épingle.</p>
<h2>Ce que ça vaut</h2>
<p>Ça reste un outil basique et très simple, et c&rsquo;est volontaire. Il ne compile rien, il ne devine rien de ton projet, il ne remplace pas ton gestionnaire de dépendances. Il fait juste en sorte que <code>make</code> réponde la même chose partout, que le projet soit en PHP, en JS ou en Java, et il est parfait sur une stack full Docker comme j&rsquo;aime les monter.</p>
<p>Le résultat que je cherchais est atteint : quand j&rsquo;arrive sur un projet, même vieux de deux ans, je tape <code>make</code> et il me dit ce qu&rsquo;il sait faire. Le Makefile du projet ne contient plus que ce qui est propre au projet, et il tient en vingt lignes.</p>
<p>Tout est sur <a href="https://github.com/Smeagolworms4/auto-makefile">le dépôt</a>, avec la doc complète. C&rsquo;est libre et ouvert, alors j&rsquo;attends vos retours, et vos suggestions si vous voyez ce qui manque.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/auto-makefile-cross-projets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/auto-makefile-une-2.png/_inside_1024_683_.webp" length="1525792" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/auto-makefile-une-2.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Komga : vos eBooks, mangas et comics à portée de clic</title>
		<link>https://smea.tech/komga-bibliotheque-ebooks-mangas-comics/</link>
					<comments>https://smea.tech/komga-bibliotheque-ebooks-mangas-comics/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 15:44:09 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[home-lab]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=123</guid>

					<description><![CDATA[On a déjà parlé films et musique avec Jellyfin. Pour les eBooks, mangas et comics, il vaut mieux un outil dédié : Komga, avec lecteur intégré et flux OPDS.]]></description>
										<content:encoded><![CDATA[<p>On a déjà parlé films et musique ici, avec <a href="https://smea.tech/jellyfin-netflix-homelab/">Jellyfin</a>. Il fait ça très bien, et il fait à peu près tout. Mais il y a un type de média où il vaut mieux sortir l&rsquo;outil dédié plutôt que de tout entasser au même endroit : le livre. eBooks, mangas, comics, ça se range autrement, ça se lit autrement, et surtout ça se lit ailleurs que sur une télé.</p>
<p>L&rsquo;outil que j&rsquo;utilise pour ça s&rsquo;appelle Komga.</p>
<h2>Pourquoi Komga et pas autre chose</h2>
<p>Parce qu&rsquo;il est autohébergé, libre, et qu&rsquo;il marche plutôt bien. Ça peut paraître court comme argument, mais dans le monde des gestionnaires de bibliothèque numérique, cocher les trois cases en même temps n&rsquo;est pas si courant.</p>
<p>Le seul reproche que je lui fais, et c&rsquo;est un avis perso : il est un peu lourd niveau RAM. Merci Java, les vrais valideront. Ceci dit, une fois l&rsquo;analyse de la bibliothèque passée, au repos ça tourne sans trop de problèmes. C&rsquo;est pas lui qui va faire tomber votre serveur.</p>
<h2>C&rsquo;est un gestionnaire de bibliothèque, rien de plus</h2>
<p>Ni plus ni moins que ça : il range vos livres, et il vous les sert. Je crois qu&rsquo;il a d&rsquo;abord été conçu pour les mangas et les comics, j&rsquo;avoue que j&rsquo;ai pas vérifié. Mais je m&rsquo;en sers aussi pour les eBooks, et c&rsquo;est super bien.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="770" decoding="async" src="https://smea.tech/img/u/2026/08/komga-accueil.png/_inside_1560__.webp" alt="Page d'accueil de Komga : le menu de gauche avec les bibliothèques Bande Dessinées, Comics, Livres et Manga, une reprise de lecture sur One Piece, puis les livres et les séries ajoutés récemment avec leurs couvertures" /><figcaption>L&rsquo;accueil : les bibliothèques à gauche, la lecture en cours en haut, et les derniers ajouts en dessous. Les couvertures, il est allé les chercher tout seul.</figcaption></figure>
<p>Il y a un lecteur intégré directement dans l&rsquo;interface. Pas d&rsquo;appli à installer pour commencer : on ouvre une page, on lit. Sur PC comme sur téléphone, et il reprend là où on s&rsquo;était arrêté.</p>
<p>Il permet de trier, de ranger, d&rsquo;organiser ses séries. Et il va chercher tout seul la description, la couverture et le reste des informations associées.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/komga-fiche-livre.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/komga-fiche-livre.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/komga-fiche-livre.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/komga-fiche-livre.png/_inside_1280__.webp 1280w" sizes="(max-width: 820px) 100vw, 780px" width="1378" height="680" decoding="async" src="https://smea.tech/img/u/2026/08/komga-fiche-livre.png/_inside_1378__.webp" alt="Fiche du livre Harry Potter à l'École des Sorciers dans Komga : la couverture, le résumé complet, le scénariste J.K. Rowling, la taille du fichier, le format EPUB, l'ISBN et les dates, avec les boutons Lire et Télécharger" /><figcaption>La fiche d&rsquo;un livre. Le résumé, la couverture, l&rsquo;auteur, l&rsquo;ISBN : je n&rsquo;ai rien tapé, il est allé tout chercher à partir du fichier.</figcaption></figure>
<p>Il sait aussi lire les métadonnées attachées à vos fichiers, et surtout les éditer pour que tout soit rangé précisément comme vous le voulez. Je vous avais dit que j&rsquo;étais monomaniaque de l&rsquo;ordre dans mes fichiers, mdr. Ben voilà, c&rsquo;est encore vrai ici.</p>
<h2>OPDS : brancher sa liseuse dessus</h2>
<p>Deuxième point important, et pour moi le vrai argument : Komga expose sa bibliothèque en <a href="https://komga.org/docs/guides/opds/">OPDS</a>. C&rsquo;est un protocole standard, fait exactement pour ça, et la doc de Komga en fait un très bon guide.</p>
<p>Dans les faits c&rsquo;est assez simple : l&rsquo;URL de votre serveur avec le bon chemin, votre identifiant, votre mot de passe, et c&rsquo;est bon. Votre chère liseuse accède à vos eBooks, directement, sans câble USB et sans copier des fichiers à la main. Ou bien Moon+ Reader sur Android, c&rsquo;est ce que j&rsquo;utilise pour lire mes eBooks.</p>
<h2>L&rsquo;installer, en Docker évidemment</h2>
<p>Pour l&rsquo;installer, très simple, on repart sur Docker et <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>. Le compose vient de <a href="https://komga.org/docs/installation/docker">la doc officielle</a> :</p>
<pre><code>services:
  komga:
    image: gotson/komga
    container_name: komga
    user: 1000:1000
    ports:
      - 25600:25600
    volumes:
      - /chemin/vers/config:/config
      - type: bind
        source: /chemin/vers/ma/bibliotheque
        target: /data
    environment:
      - TZ=Europe/Paris
    restart: unless-stopped</code></pre>
<p>Ensuite, toujours pareil : on branche un <a href="https://smea.tech/duckdns-acceder-homelab/">DNS</a> et un <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">reverse proxy</a> devant, et le service est joignable proprement de l&rsquo;extérieur. C&rsquo;est aussi ce qui vous permettra de donner une vraie adresse à votre liseuse plutôt qu&rsquo;une IP locale.</p>
<h2>Et voilà</h2>
<p>Tout fonctionne. Vous parcourez votre bibliothèque d&rsquo;eBooks, vous avez le service en ligne et autohébergé pour cette dernière, lecteur inclus. Et votre liseuse se sert toute seule.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/komga-bibliotheque-ebooks-mangas-comics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/komga-entete.png/_inside_1024_683_.webp" length="1928870" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/komga-entete.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>IP Info : géolocaliser une adresse IP</title>
		<link>https://smea.tech/geolocaliser-adresse-ip/</link>
					<comments>https://smea.tech/geolocaliser-adresse-ip/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Sun, 09 Aug 2026 21:34:20 +0000</pubDate>
				<category><![CDATA[Réalisations]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=119</guid>

					<description><![CDATA[Géolocaliser une IP sans quota ni API externe : mon service maison lit la base MaxMind chez toi, en Docker ou en Lambda.]]></description>
										<content:encoded><![CDATA[<p>Savoir d&rsquo;où vient une adresse IP, c&rsquo;est un besoin qui revient sur presque tous mes projets. Et c&rsquo;est à chaque fois le même casse-tête. J&rsquo;ai fini par écrire mon propre service : la base de données est chez moi, et il n&rsquo;y a plus de compteur.</p>
<h2>Le besoin revient, la solution jamais</h2>
<p>Ça fait des années que je tombe dessus. Sur ce blog, pour les statistiques : savoir de quel pays viennent les visiteurs, c&rsquo;est une des rares informations vraiment utiles quand tu ne veux poser aucun cookie. Sur <a href="https://teambudd.io">Teambudd.io</a>, mon jeu, dont je vous parlerai une autre fois. Et sur à peu près tout ce que j&rsquo;ai bricolé entre les deux.</p>
<p>À chaque fois, même réflexe : je cherche une API en ligne. Et à chaque fois, même mur. Ces services existent, ils marchent très bien, mais ils sont construits sur des quotas. Mille requêtes par jour, parfois moins, et au-delà tu passes à la caisse. Pour un site qui a un peu de trafic, mille requêtes c&rsquo;est une matinée. Sans compter le détail qui me gêne le plus : tu envoies l&rsquo;adresse de tes visiteurs à quelqu&rsquo;un d&rsquo;autre, et ce quelqu&rsquo;un d&rsquo;autre s&rsquo;en fait une idée assez précise de qui vient chez toi.</p>
<h2>Un seul appel externe, et il n&rsquo;a lieu qu&rsquo;une fois par jour</h2>
<p>Alors j&rsquo;ai fabriqué <a href="https://github.com/Smeagolworms4/ip-info">IP Info</a>. L&rsquo;idée tient dans une bascule toute simple : au lieu d&rsquo;interroger un service à chaque adresse, tu télécharges la base une fois et tu la lis toi-même.</p>
<p>La base, c&rsquo;est GeoLite2, publiée par <a href="https://www.maxmind.com/en/geolite2/signup">MaxMind</a>. Tu crées un compte, tu récupères une clé de licence, c&rsquo;est gratuit. Tu poses la clé dans une variable d&rsquo;environnement et le service fait le reste : il télécharge le fichier au démarrage, le range dans son volume, et va vérifier une fois par jour s&rsquo;il y a une version plus fraîche. C&rsquo;est ça, l&rsquo;unique dépendance externe. Tout le reste tourne chez toi.</p>
<p>Un fichier <code>.mmdb</code>, c&rsquo;est un arbre de recherche binaire. Le service le parcourt bit par bit et te répond en quelques microsecondes, sans serveur de base de données, sans réseau, sans rien. Autant dire que la notion de quota n&rsquo;a plus de sens : tu peux lui envoyer un million de requêtes, c&rsquo;est ta machine qui décide, pas une grille tarifaire.</p>
<h2>Ce qu&rsquo;il te répond</h2>
<p>Et il ne te rend pas que le pays. C&rsquo;est justement là que ça devient intéressant pour des statistiques :</p>
<pre><code>curl https://ip.exemple.fr/81.2.69.200</code></pre>
<pre><code>{
  "ip": "81.2.69.200",
  "version": 4,
  "type": "public",
  "hostname": null,
  "continent": "EU",
  "continent_name": "Europe",
  "country": "GB",
  "country_name": "Royaume-Uni",
  "country_is_eu": false,
  "region": "England",
  "region_code": "ENG",
  "city": "Londres",
  "postal": "OX1",
  "latitude": 51.5142,
  "longitude": -0.0931,
  "accuracy_radius": 10,
  "timezone": "Europe/London",
  "network": "81.2.69.192/26",
  "asn": 12345,
  "as_name": "Test ISP Ltd",
  "as_network": "81.2.69.0/24"
}</code></pre>
<p>Le pays, la région, la ville, le fuseau horaire, les coordonnées, et même l&rsquo;opérateur derrière l&rsquo;adresse. Tous les champs sont toujours présents : une valeur inconnue vaut <code>null</code>, jamais une clé qui disparaît. Ça évite d&rsquo;écrire du code défensif partout.</p>
<p>Quand tu n&rsquo;as besoin que d&rsquo;une seule information, tu la demandes seule et tu la reçois en texte brut. C&rsquo;est le mode que j&rsquo;utilise pour les statistiques du blog :</p>
<pre><code>curl https://ip.exemple.fr/8.8.8.8/country
# US

curl 'https://ip.exemple.fr/81.2.69.200?fields=country,city&amp;lang=fr'
# {"country":"GB","city":"Londres"}</code></pre>
<p>Deux champs méritent qu&rsquo;on s&rsquo;y arrête. <code>accuracy_radius</code> donne le rayon en kilomètres dans lequel MaxMind situe l&rsquo;adresse : sans lui, quatre décimales de latitude ressemblent à une adresse postale, ce qu&rsquo;elles ne sont absolument pas. Et <code>type</code> dit ce que l&rsquo;adresse raconte d&rsquo;elle-même, <code>public</code>, <code>private</code>, <code>loopback</code> et compagnie. Une adresse privée n&rsquo;est dans aucune base de géolocalisation, et le service te le dit au lieu de te rendre un objet vide à interpréter.</p>
<p>Une adresse toute seule, sans rien préciser, te renvoie celle de l&rsquo;appelant. Pratique pour un « quelle est mon IP » maison.</p>
<h2>Deux façons de le faire tourner</h2>
<p>Comme pour <a href="https://smea.tech/image-resizer-taille-sur-demande/">Image Resizer</a>, il y a deux chemins, et c&rsquo;est le même code derrière.</p>
<p>Le premier, c&rsquo;est une fonction Lambda serverless. Aucun serveur, aucune infra à surveiller, la facture suit strictement l&rsquo;usage. Chaque version publie une archive zip prête à déposer, et une seule fonction suffit : pas de seconde fonction pour tenir la base à jour, pas de tâche planifiée. Le démarrage à froid télécharge le fichier, et chaque invocation vérifie son âge au passage. Le <code>LAMBDA.md</code> du dépôt déroule la marche à suivre.</p>
<p>Le second, c&rsquo;est Docker, et donc <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>. La configuration tient en quelques lignes :</p>
<pre><code>services:
  ip-info:
    image: smeagolworms4/ip-info:latest
    restart: unless-stopped
    user: "${PUID:-1000}:${PGID:-1000}"
    environment:
      MAXMIND_LICENSE_KEY: "ta-clé-de-licence"
      TRUST_PROXY: "true"
      DEFAULT_LANGUAGE: "fr"
    ports:
      - "3000:3000"
    volumes:
      - ${DATA_DIR}/ip-info:/data
</code></pre>
<p>Le volume sur <code>/data</code> n&rsquo;est pas décoratif : c&rsquo;est là que les bases sont rangées. Sans lui, chaque redémarrage retélécharge 70 Mo, et MaxMind les décompte de ta clé.</p>
<p>Et si tu veux le joindre depuis l&rsquo;extérieur, c&rsquo;est le duo habituel : un nom de domaine avec <a href="https://smea.tech/duckdns-acceder-homelab/">Duck DNS</a>, et un <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">reverse proxy avec Nginx Proxy Manager</a> devant. Une seule chose à ne pas oublier dans ce cas : <code>TRUST_PROXY</code>. Sans elle, le service voit l&rsquo;adresse du proxy et te la renvoie à toi comme aux autres.</p>
<p>Les images couvrent <code>amd64</code>, <code>arm64</code> et <code>arm/v7</code>, donc le même tag marche sur ton PC, ton NAS ou ton Raspberry Pi.</p>
<h2>Une clé secrète, pour que les petits malins aillent voir ailleurs</h2>
<p>Le jour où ton service est exposé sur Internet, rien n&#8217;empêche quelqu&rsquo;un de s&rsquo;en servir gratuitement à ta place. Là encore c&rsquo;est le même mécanisme que sur Image Resizer : tu poses une clé secrète, et le service ne répond plus qu&rsquo;aux adresses correctement signées.</p>
<pre><code>SIGNATURE_KEY=ta-clé-secrète</code></pre>
<p>Une URL signée porte alors deux paramètres, un horodatage et un HMAC :</p>
<pre><code>/8.8.8.8?d=1770000000&amp;s=cc5849a839193e59</code></pre>
<p>La signature se génère côté serveur, évidemment, avec la clé secrète que tu es seul à connaître. La règle tient en une ligne :</p>
<pre><code>const s = createHmac('sha256', KEY).update(`8.8.8.8?d=${d}`).digest('hex').slice(0, 16);</code></pre>
<p>L&rsquo;horodatage fait partie de ce qui est signé, donc il ne peut pas être déplacé, et il borne la durée de vie de l&rsquo;adresse : une heure par défaut. C&rsquo;est toute la différence entre une URL qui a fuité par accident et une clé volée. Le <code>SIGNATURE.md</code> du dépôt contient la spécification complète, des valeurs de référence pour vérifier ton implémentation, et les mêmes trois lignes écrites en JavaScript, PHP, Python, C# et Java.</p>
<p>Et si tu sais ce que tu fais, réseau privé ou proxy déjà authentifié, tu laisses la clé vide : le service répond à tout le monde, et c&rsquo;est très bien comme ça.</p>
<h2>Ce que ça vaut vraiment</h2>
<p>Je ne vais pas te vendre ça comme indispensable. Si tu as besoin de dix géolocalisations par mois, une API externe toute faite te coûtera moins de temps que de monter un conteneur. Et il faut être honnête sur la précision : GeoLite2 est la version gratuite d&rsquo;une estimation. La ville affichée est souvent celle de l&rsquo;opérateur, pas celle du visiteur, et un VPN déplace la réponse dans un autre pays. Décider quoi que ce soit d&rsquo;important là-dessus, un paiement, un droit, une identité, c&rsquo;est une erreur, quelle que soit la base.</p>
<p>Mais pour ce à quoi ça sert vraiment, remplir la colonne « pays » de tes statistiques, adapter une langue par défaut, repérer d&rsquo;où arrive un pic de trafic, c&rsquo;est parfait. Pas de quota, pas de facture qui grimpe avec le trafic, et surtout l&rsquo;adresse de tes visiteurs qui ne sort jamais de ta machine. C&rsquo;est exactement pour ça que je m&rsquo;en sers ici.</p>
<p>Le tout est <a href="https://github.com/Smeagolworms4/ip-info">sur GitHub</a>, en licence MIT. Comme d&rsquo;habitude, je suis preneur de tout retour, et les pull requests sont les bienvenues.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/geolocaliser-adresse-ip/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/ip-info-geolocalisation-v2.png/_inside_1024_683_.webp" length="1408251" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/ip-info-geolocalisation-v2.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Beszel : supervisez vos serveurs Docker</title>
		<link>https://smea.tech/beszel-supervision-serveurs-docker/</link>
					<comments>https://smea.tech/beszel-supervision-serveurs-docker/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Sat, 08 Aug 2026 20:24:40 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[home-lab]]></category>
		<category><![CDATA[portainer]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=111</guid>

					<description><![CDATA[Un Homelab, ça se surveille. Beszel affiche en deux conteneurs le CPU, la RAM et les disques de tous mes serveurs, avec le détail conteneur par conteneur.]]></description>
										<content:encoded><![CDATA[<p>Après avoir monté toute cette infra, il reste une question bête : est-ce que ça va bien ? Beszel y répond en deux conteneurs, et surtout il découpe la consommation conteneur par conteneur.</p>
<h2>On ne sait jamais vraiment ce qui tourne</h2>
<p>Un Homelab, ça finit toujours pareil. Tu empiles les applis, tu ajoutes une machine, tu testes un truc que tu oublies d&rsquo;arrêter, et six mois plus tard tu ne sais plus ce qui tourne ni ce que ça coûte.</p>
<p>Et il y a les vraies questions, celles qui arrivent un soir sans prévenir. Pourquoi la machine rame ? Est-ce que j&rsquo;ai encore assez de RAM pour ajouter un service ? Est-ce que le disque va tenir jusqu&rsquo;à la fin du mois ? Et la meilleure de toutes : est-ce que quelqu&rsquo;un m&rsquo;a posé un cryptomineur sur le serveur ? Parce que ça m&rsquo;est arrivé, et je peux vous dire qu&rsquo;on aime bien avoir une courbe sous les yeux ce jour-là.</p>
<p>Bien sûr, vous pouvez toujours vous connecter en SSH et lancer <code>htop</code>, ou <code>docker stats</code>. Ça marche très bien. Mais c&rsquo;est un instantané : aucun historique, aucune vue d&rsquo;ensemble sur plusieurs machines, et rien qui vous prévienne pendant que vous dormez. Rien ne vaut un outil graphique.</p>
<p>Je vous présente Beszel. Un outil de supervision vraiment complet, très visuel, et qui ne consomme quasiment rien lui-même. Ce qui, pour un outil censé surveiller la consommation, est plutôt la moindre des politesses.</p>
<h2>Deux conteneurs qui se parlent</h2>
<p>Le découpage est ce qui rend l&rsquo;outil aussi simple. Il y a deux morceaux, tous les deux en conteneur :</p>
<ul>
<li><strong>le hub</strong>, c&rsquo;est l&rsquo;interface. Une seule instance, quelque part chez vous. C&rsquo;est elle que vous ouvrez dans le navigateur ;</li>
<li><strong>l&rsquo;agent</strong>, qu&rsquo;on pose sur chaque serveur qu&rsquo;on veut observer. Il mesure, il envoie, il ne fait rien d&rsquo;autre.</li>
</ul>
<p>Conséquence directe : ajouter une machine à la supervision, c&rsquo;est poser un conteneur dessus. Pas d&rsquo;installation système, pas de paquet à maintenir, rien à compiler.</p>
<h2>La liste, d&rsquo;abord</h2>
<p>Vous installez, vous ajoutez vos serveurs, et hop, tout est là.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="433" decoding="async" src="https://smea.tech/img/u/2026/08/beszel-liste-systemes.png/_inside_1560__.webp" alt="La liste des systèmes dans Beszel : une ligne par serveur avec CPU, mémoire, disque, GPU, charge moyenne, réseau, température et temps de fonctionnement" /><figcaption>Une ligne par serveur. En un coup d&rsquo;œil, tout ce qui va bien et tout ce qui ne va pas.</figcaption></figure>
<p>Le point vert, le CPU, la mémoire, le disque, le réseau, la température, l&rsquo;uptime. C&rsquo;est déjà 80 % de ce qu&rsquo;on regarde au quotidien, et c&rsquo;est sur un seul écran.</p>
<h2>Le détail, et surtout le détail par conteneur</h2>
<p>Ensuite vous cliquez sur un serveur, et là ça devient intéressant.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="883" decoding="async" src="https://smea.tech/img/u/2026/08/beszel-detail-systeme.png/_inside_1560__.webp" alt="La page de détail d'un serveur dans Beszel : à gauche l'utilisation CPU et mémoire de la machine, à droite les mêmes courbes empilées par conteneur Docker" /><figcaption>À gauche la machine, à droite les mêmes courbes découpées par conteneur. C&rsquo;est toute la valeur de l&rsquo;outil.</figcaption></figure>
<p>L&rsquo;état des disques, la RAM, le processeur, et les entrées/sorties disque, ce qui est hyper important et qu&rsquo;on oublie tout le temps de regarder. Une machine qui rame sans que le CPU bouge, neuf fois sur dix c&rsquo;est le disque qui sature.</p>
<p>Mais le vrai truc, c&rsquo;est la colonne de droite. Chaque courbe est <strong>séparée par conteneur</strong>. Vous ne voyez pas seulement que la RAM est à 4 Go, vous voyez lequel de vos conteneurs les prend. Et quand une bande rouge grimpe toute seule à deux heures du matin, vous savez immédiatement de qui il s&rsquo;agit.</p>
<p>C&rsquo;est parfait pour notre stack, vu que chez nous tout s&rsquo;installe dans Docker, et que Docker chez nous c&rsquo;est <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>. Une bande dans le graphe, une stack dans Portainer, c&rsquo;est le même objet.</p>
<h2>Installer le hub</h2>
<p>Comme toujours, un compose. Soit à la main, soit directement en stack dans Portainer, ce qui est ma méthode.</p>
<pre><code>services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    environment:
      APP_URL: http://mon-serveur:8090
    ports:
      - 8090:8090
    volumes:
      - ./beszel_data:/beszel_data
      - ./beszel_socket:/beszel_socket</code></pre>
<p>Vous lancez, vous ouvrez le port 8090, vous créez votre compte administrateur. Et là vous avez l&rsquo;interface. Mais elle est vide : aucun serveur n&rsquo;est branché dessus.</p>
<h2>Brancher un serveur</h2>
<p>Pour ça, direction l&rsquo;interface, bouton <strong>Ajouter Système</strong>.</p>
<figure>
  <img width="470" height="504" decoding="async" src="https://smea.tech/img/u/2026/08/beszel-ajouter-systeme.png/_inside_470__.webp" alt="La fenêtre Ajouter Système de Beszel : les champs Nom, Hôte/IP, Port 45876, une clé publique ssh-ed25519 et un token, avec le bouton Copier docker compose" /><figcaption>Le nom, l&rsquo;adresse, le port. La clé et le token sont déjà remplis, il n&rsquo;y a rien à inventer.</figcaption></figure>
<p>Vous donnez un nom, une adresse et un port. Si vous voulez surveiller la machine du hub elle-même, l&rsquo;adresse c&rsquo;est <code>127.0.0.1</code>, tout simplement. Le port par défaut est le 45876.</p>
<p>Ensuite vous cliquez sur <strong>Copier docker compose</strong>, puis sur <strong>Ajouter Système</strong>. Vous créez une nouvelle stack sur la machine à observer, vous y collez ce que vous venez de copier, vous lancez, et hop, elle apparaît dans l&rsquo;interface de Beszel. C&rsquo;est tout.</p>
<p>Le compose en question ressemble à ça, avec la clé et le token déjà remplis pour vous :</p>
<pre><code>services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./beszel_agent_data:/var/lib/beszel-agent
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      LISTEN: 45876
      KEY: "ssh-ed25519 AAAA..."
      TOKEN: "le-token-donne-par-le-hub"
      HUB_URL: "http://mon-serveur:8090"</code></pre>
<p>Les deux lignes à comprendre : <code>network_mode: host</code>, indispensable pour que l&rsquo;agent voie les statistiques réseau de la machine et pas seulement celles de son propre conteneur, et la socket Docker montée en lecture seule, qui est exactement ce qui lui permet de découper par conteneur.</p>
<h2>Y accéder de l&rsquo;extérieur</h2>
<p>Vous pouvez aussi lui monter un nom de domaine, avec <a href="https://smea.tech/duckdns-acceder-homelab/">Duck DNS</a> par exemple, et le brancher derrière <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager</a>. Là vous ouvrez votre supervision depuis le téléphone, en HTTPS, sans retenir un port.</p>
<p>Et surtout, ça vous permet d&rsquo;ajouter des serveurs qui ne sont pas sur votre réseau. Un VPS, la machine d&rsquo;un copain, un Raspberry chez vos parents : tout ça remonte dans la même interface. C&rsquo;est sécurisé par clés et chiffré, l&rsquo;agent n&rsquo;accepte que le hub qui détient la bonne clé, donc aucun souci de ce côté.</p>
<h2>Les alertes, parce qu&rsquo;on ne regarde pas l&rsquo;écran toute la journée</h2>
<p>Un outil de supervision qu&rsquo;il faut penser à ouvrir ne sert pas à grand-chose. Beszel sait donc envoyer des notifications, par mail si vous voulez, et il embarque toute la panoplie classique :</p>
<ul>
<li>un serveur qui ne répond plus ;</li>
<li>un processeur en surcharge <strong>trop longtemps</strong>, ce qui évite d&rsquo;être réveillé par le moindre pic de deux secondes ;</li>
<li>un disque qui se remplit ;</li>
<li>la mémoire, la température, la bande passante.</li>
</ul>
<p>C&rsquo;est le genre de réglage qu&rsquo;on fait une fois et qu&rsquo;on oublie, jusqu&rsquo;au jour où le mail arrive et vous évite une vraie panne.</p>
<h2>Ce que j&rsquo;en retiens</h2>
<p>Beszel est vraiment un super outil de supervision. Il y a sûrement plus complet ailleurs, du côté de Prometheus et Grafana notamment, mais c&rsquo;est aussi beaucoup plus lourd à monter et à maintenir. Lui, il est hyper adapté à Docker et à Portainer, il s&rsquo;installe en dix minutes et il ne coûte rien à faire tourner.</p>
<p>Autrement dit, il est parfait dans notre Homelab. Et depuis que je l&rsquo;ai posé, je ne me demande plus ce qui consomme : je le vois.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/beszel-supervision-serveurs-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/beszel-supervisez-vos-serveurs-docker.png/_inside_1024_683_.webp" length="1627475" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/beszel-supervisez-vos-serveurs-docker.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Image Resizer : la taille sur demande</title>
		<link>https://smea.tech/image-resizer-taille-sur-demande/</link>
					<comments>https://smea.tech/image-resizer-taille-sur-demande/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Fri, 07 Aug 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Réalisations]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nginx]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=106</guid>

					<description><![CDATA[Une image et toutes les tailles à la demande : j'ai écrit le service qui fabrique la variante depuis l'URL, en Docker ou en Lambda.]]></description>
										<content:encoded><![CDATA[<p>Depuis que je fais des applications web, j&rsquo;ai toujours le même caillou dans la chaussure : les variantes de taille des images. J&rsquo;ai fini par écrire l&rsquo;outil qui me manquait, et il tourne aussi bien dans un conteneur que sur une fonction Lambda.</p>
<h2>Le problème, ce n&rsquo;est jamais l&rsquo;image. C&rsquo;est ses variantes</h2>
<p>Le jour où tu veux un bon référencement et un site optimisé aux petits oignons, tu tombes toujours sur le même mur. Une image, ce n&rsquo;est pas une image : c&rsquo;est huit fichiers. Une version pour le mobile, une pour la tablette, une pour le grand écran, et chacune en double pour les écrans à forte densité. Le tout en WebP, parce que le JPEG coûte trois fois plus lourd pour le même rendu.</p>
<p>Et ça, c&rsquo;est la partie facile. La partie pénible, c&rsquo;est le contributeur. Il t&rsquo;envoie une photo de 30 Mo en HEIC sortie de son iPhone, et il s&rsquo;en fout complètement : il ne regarde même pas. Toi, derrière, tu voulais juste une vignette de 200 pixels de côté.</p>
<p>Il existe des services tout faits pour ça. Généralement payants, et pas forcément clé en main : il faut quand même leur mâcher le travail. Plus j&rsquo;avais ce problème en tête, plus je me disais qu&rsquo;il fallait trouver une solution. Et plus je cherchais, moins je la trouvais.</p>
<h2>« Allez, ça va prendre 10 lignes de JS »</h2>
<p>Bon, j&rsquo;avais un peu tort. Mais ça a donné <a href="https://github.com/Smeagolworms4/image-resizer">Image Resizer</a>, une petite application qui ne fait qu&rsquo;une chose : elle sert la variante que tu lui demandes, calculée au moment où tu la demandes.</p>
<p>C&rsquo;est du full JavaScript. Elle tourne dans un conteneur Docker, elle tourne très bien dans <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>, et elle tourne aussi sur une fonction Lambda serverless. Cette dernière option est celle que je trouve la plus marrante : tu as l&rsquo;outil pour presque zéro euro, sans serveur, sans rien à maintenir.</p>
<h2>L&rsquo;URL, c&rsquo;est la commande</h2>
<p>Un exemple vaut mieux que dix mots. Voici une image PNG du blog, celle de <a href="https://smea.tech/duckdns-acceder-homelab/">l&rsquo;article sur Duck DNS</a>, un canard de 1536 × 1024 pixels. Je lui demande un bandeau de 1024 × 100, en WebP, avec un recadrage <code>cover</code> :</p>
<pre><code>https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_cover_1024_100_.webp</code></pre>
<figure>
  <img fetchpriority="high" decoding="async" class="is-exact" src="https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_cover_1024_100_.webp" alt="Bandeau de 1024 sur 100 pixels : une bande horizontale découpée au centre de l'image du canard, qui remplit toute la largeur" width="1024" height="100" /><figcaption>Avec <code>cover</code>, la boîte est remplie et ce qui dépasse est coupé.</figcaption></figure>
<p>Même taille, même image, mais je change la mécanique de redimensionnement et je demande du JPEG :</p>
<pre><code>https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_contain_1024_100_.jpg</code></pre>
<figure>
  <img decoding="async" class="is-exact" src="https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_contain_1024_100_.jpg" alt="Bandeau de 1024 sur 100 pixels : l'image entière du canard réduite au centre, avec de larges bandes vides de chaque côté" width="1024" height="100" /><figcaption>Avec <code>contain</code>, l&rsquo;image entière rentre dans la boîte et le reste est comblé.</figcaption></figure>
<p>Rien d&rsquo;autre n&rsquo;a bougé que l&rsquo;adresse. La structure est toujours la même :</p>
<pre><code>/&lt;source&gt;/&lt;chemin/du/fichier&gt;/_&lt;fit&gt;_&lt;largeur&gt;_&lt;hauteur&gt;_&lt;qualité&gt;.&lt;format&gt;</code></pre>
<p>Les champs vides prennent la valeur par défaut, donc <code>/photo.jpg/_.webp</code> suffit à obtenir du WebP correctement dimensionné. Le <code>fit</code> prend les cinq modes de sharp : <code>cover</code>, <code>contain</code>, <code>fill</code>, <code>inside</code>, <code>outside</code>. En sortie, tu as du JPEG, du PNG, du WebP et de l&rsquo;AVIF. En entrée, il avale même le HEIC de l&rsquo;iPhone dont je parlais plus haut.</p>
<p>Le choix de tout mettre dans le chemin plutôt qu&rsquo;en paramètres d&rsquo;URL n&rsquo;est pas cosmétique. Chaque variante devient une adresse unique, et une adresse unique, les caches savent quoi en faire. Un <code>?w=320&amp;h=240</code>, beaucoup moins.</p>
<h2>Je m&rsquo;en sers sur ce blog</h2>
<p>WordPress fabrique une demi-douzaine de vignettes à chaque téléversement, les garde pour toujours, et n&rsquo;en sert jamais que deux ou trois. Le dossier des médias est le seul du site que je ne sais pas régénérer, donc le seul que je sauvegarde, et il grossissait de fichiers que personne ne regarde.</p>
<p>Maintenant je ne range qu&rsquo;un fichier : l&rsquo;original, en pleine résolution. Les variantes existent bien sur le disque elles aussi, mais dans le cache nginx, et ça change tout : ce dossier-là se jette et se refait tout seul. Toutes les images que tu vois sur ce blog, y compris celle en haut de cette page, sortent d&rsquo;ici. La configuration tient en quelques lignes :</p>
<pre><code>  images:
    image: smeagolworms4/image-resizer:latest
    restart: unless-stopped
    user: "${PUID:-1000}:${PGID:-1000}"
    environment:
      SOURCE_U: /uploads
      BASE_PATH: /img
      MAX_SIZE: "2560"
      DEFAULT_QUALITY: "82"
      ALLOWED_FORMATS: jpeg,png,webp,avif
    volumes:
      - ${DATA_DIR}/uploads:/uploads:ro
      - ${DATA_DIR}/img-cache:/cache
</code></pre>
<p>Le montage des médias est en lecture seule : le service n&rsquo;a aucune raison d&rsquo;écrire dans le dossier qui compte. Et <code>SOURCE_U: /uploads</code> déclare une source nommée <code>u</code>, ce qui explique le <code>/img/u/…</code> des adresses plus haut. C&rsquo;est important pour la suite : aucune URL ne peut faire requêter au service une source qui n&rsquo;a pas été déclarée.</p>
<p>Bénéfice inattendu, le jour où j&rsquo;ai changé la largeur de la colonne du thème, je n&rsquo;ai eu strictement rien à regénérer. Juste de nouvelles adresses.</p>
<h2>Le cache devant, ce n&rsquo;est pas une option</h2>
<p>Le seul vrai bémol, et il faut le dire tout de suite : c&rsquo;est un outil de redimensionnement, absolument pas un outil de cache. Il garde bien les originaux téléchargés et quelques conversions coûteuses sous le coude, mais chaque variante est calculée à la volée. Si tu ne mets rien devant, ton CPU va encaisser.</p>
<p>Donc tu mets un cache. nginx, Varnish, CloudFront, Cloudflare, ce que tu veux. Image Resizer est fait pour vivre derrière : il émet déjà les bons en-têtes, <code>Cache-Control</code> avec un <code>s-maxage</code> long, <code>ETag</code>, <code>stale-while-revalidate</code>. Chez moi c&rsquo;est nginx, et voilà l&rsquo;essentiel de la configuration :</p>
<pre><code>proxy_cache_path /var/cache/nginx/images levels=1:2 keys_zone=images:50m
                 max_size=20g inactive=90d use_temp_path=off;

location ^~ /img/ {
    proxy_pass http://images:3000;

    proxy_cache images;
    proxy_cache_valid 200 90d;
    proxy_cache_valid 400 404 1m;
    proxy_cache_lock on;
    proxy_cache_use_stale updating error timeout http_500 http_502 http_503;

    # Tout est dans le chemin : ignorer les paramètres évite qu'un lien
    # traînant un ?utm_source crée une seconde entrée pour la même image.
    proxy_cache_key $uri;
}
</code></pre>
<p>Les deux lignes qui font tout le travail sont <code>proxy_cache_lock</code> et <code>proxy_cache_use_stale</code>. La première garantit qu&rsquo;une rafale de requêtes sur une variante encore froide ne déclenche qu&rsquo;un seul calcul, et pas cinquante en parallèle : c&rsquo;est exactement ce genre de bousculade qui met un redimensionneur à genoux. La seconde fait qu&rsquo;une variante déjà servie continue de l&rsquo;être même si le service est arrêté.</p>
<h2>Sur Lambda, ça coûte à peu près rien</h2>
<p>C&rsquo;est le mode que je préfère pour un petit site. Tu n&rsquo;as ni serveur à louer, ni conteneur à surveiller, et la facture suit strictement l&rsquo;usage.</p>
<p>Chaque version publie une archive zip prête à déposer, une par architecture. Prends celle en <code>arm64</code> : sur Graviton, c&rsquo;est environ 20 % moins cher à l&rsquo;usage, et ça marche exactement pareil. L&rsquo;archive fait dans les 10 Mo compressés, on est très loin des limites d&rsquo;AWS.</p>
<p>La marche à suivre tient en quatre points :</p>
<ul>
<li>créer la fonction en <strong>Node.js 22</strong>, architecture <code>arm64</code>, et déposer le zip ;</li>
<li>mettre le handler sur <code>src/lambda.handler</code>, la mémoire à <strong>2048 Mo</strong> et le timeout à <strong>30 secondes</strong> ;</li>
<li>poser les variables d&rsquo;environnement : tes sources, plus <code>CACHE_DIR=/tmp/cache</code> parce que <code>/var/task</code> est en lecture seule, et <code>HEIC_ENABLED=false</code> puisque l&rsquo;outil de conversion n&rsquo;existe pas dans le runtime ;</li>
<li>activer une <strong>Function URL</strong> pour avoir une adresse publique, et c&rsquo;est emballé, c&rsquo;est pesé.</li>
</ul>
<p>N&rsquo;oublie surtout pas le CloudFront devant, avec la politique <em>CachingOptimized</em> et le transfert des paramètres d&rsquo;URL désactivé. Sans lui, la même vignette est recalculée <em>et facturée</em> à chaque affichage, et l&rsquo;intérêt de la manœuvre disparaît. Tout est détaillé dans le <code>LAMBDA.md</code> du dépôt.</p>
<p>Un piège dans lequel je suis tombé : si l&rsquo;architecture du zip ne correspond pas à celle de la fonction, tu récupères un <code>Could not load the sharp module</code> parfaitement opaque. Vérifie ce point avant de chercher ailleurs.</p>
<h2>Une clé secrète pour que personne ne s&rsquo;amuse</h2>
<p>Une adresse d&rsquo;image est publique par définition, et rien n&#8217;empêche un plaisantin de demander 10 000 variantes différentes juste pour voir. On peut fermer la porte en générant une clé secrète : le service signe alors chaque URL en HMAC, et une adresse fabriquée à la main est refusée.</p>
<pre><code>SIGNATURE_KEY=ta-clé-secrète
</code></pre>
<p>La signature se glisse dans le preset, avant l&rsquo;extension :</p>
<pre><code>/photos/beach.jpg/_cover_320_320_80_3dc222d73386b95c.webp</code></pre>
<p>Dans le même esprit, les métadonnées sont supprimées par défaut à la sortie. Les données GPS de la photo prise avec le téléphone ne finissent pas en ligne sans que personne ne l&rsquo;ait demandé.</p>
<h2>C&rsquo;est du MIT, et j&rsquo;attends vos retours</h2>
<p>C&rsquo;est un outil vraiment pratique pour un site web, même petit. Il tourne facilement, et même sans conteneur si le cœur t&rsquo;en dit. Les images publiées couvrent <code>amd64</code>, <code>arm64</code> et <code>arm/v7</code>, donc le même tag marche sur ton PC, ton NAS ou ton Raspberry Pi.</p>
<p>Le tout est <a href="https://github.com/Smeagolworms4/image-resizer">sur GitHub</a>, en licence MIT. Je suis bien sûr friand de tout retour, et les pull requests sont les bienvenues si vous voulez bosser avec ou dessus.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/image-resizer-taille-sur-demande/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/image-resizer-taille-sur-demande.png/_inside_1024_683_.webp" length="1671188" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/image-resizer-taille-sur-demande.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Vos fichiers sur le réseau : Open Media Vault</title>
		<link>https://smea.tech/openmediavault-nas-maison/</link>
					<comments>https://smea.tech/openmediavault-nas-maison/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Thu, 06 Aug 2026 21:38:53 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[home-lab]]></category>
		<category><![CDATA[nas]]></category>
		<category><![CDATA[raspberry-pi]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=88</guid>

					<description><![CDATA[Un NAS maison sur Raspberry Pi 5, des disques USB et Open Media Vault : mes films, mes séries et mes fichiers accessibles partout sur le réseau.]]></description>
										<content:encoded><![CDATA[<p>Quand je vous parle des piliers de mon Homelab, il y en a un qui revient tout le temps sans que je vous l&rsquo;aie jamais vraiment présenté : mon NAS. C&rsquo;est le dernier gros chantier, et le voilà.</p>
<h2>Un NAS, c&rsquo;est quoi au juste</h2>
<p>NAS, ça veut dire Network Attached Storage. En gros, un espace de stockage sur le réseau. Une machine allumée en permanence, avec des disques dedans, et tous tes autres appareils qui viennent lire et écrire dessus comme si c&rsquo;était un dossier local.</p>
<p>Tu en trouves des tout faits, clé en main, chez Synology par exemple. J&rsquo;en ai moi-même un vieux, mais il est là comme outil secondaire. Sauf que c&rsquo;est aussi possible de s&rsquo;en fabriquer un soi-même. Oui oui, avec un vieil ordi ou un Raspberry Pi.</p>
<h2>Le mien : un Raspberry Pi 5 et une pile de disques USB</h2>
<p>Moi j&rsquo;en ai fait un avec un Raspberry Pi 5 et des disques durs externes. On peut lui associer une carte RAID, ou brancher des disques SATA en direct sur une machine qui a ce qu&rsquo;il faut. Chez moi c&rsquo;est juste des disques durs branchés en USB 3 sur un hub USB 3.</p>
<p>Plusieurs disques, c&rsquo;est important. Par contre, pas de réplication. Je stocke des films, des séries, quelques données, des jeux. Rien d&rsquo;irrécupérable, rien d&rsquo;important. Pour ça j&rsquo;ai justement mon vieux Synology, et un duplicata en ligne (je vous parlerai de Duplicati un jour).</p>
<p>Le but, c&rsquo;est d&rsquo;avoir plein de place disque, de stocker de façon plutôt fiable sans se prendre la tête, et que tout ça soit accessible sur le réseau. Rien de plus.</p>
<h2>Et c&rsquo;est là qu&rsquo;arrive Open Media Vault</h2>
<p>C&rsquo;est l&rsquo;outil NAS open source, facile et ouvert. Oui, c&rsquo;est pas parfait. Des fois ça galère un peu. Mais ça marche, ça répond au besoin, et ça a une vraie interface web de gestion. C&rsquo;est plutôt cool.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="865" decoding="async" src="https://smea.tech/img/u/2026/08/omv-dashboard.png/_inside_1560__.webp" alt="Le tableau de bord d'Open Media Vault : charge du processeur à 84,6 %, mémoire, températures des sept disques et remplissage des systèmes de fichiers" /><figcaption>Un tableau de bord où on peut tout contrôler : la charge, la mémoire, la température de chaque disque et la place qu&rsquo;il reste.</figcaption></figure>
<p>On parlera après de comment on l&rsquo;installe sur un Raspberry Pi ou ailleurs. Mais en tout cas, une fois dedans, tu vois tes disques durs.</p>
<h2>Disque, partition, dossier partagé</h2>
<p>Tu formates tes disques comme il faut. Moi je les mets en ext4, mais je sais qu&rsquo;on peut faire du BTRFS et d&rsquo;autres choses. Ensuite tu montes tes partitions.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/omv-disques.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/omv-disques.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/omv-disques.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/omv-disques.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/omv-disques.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="646" decoding="async" src="https://smea.tech/img/u/2026/08/omv-disques.png/_inside_1560__.webp" alt="La liste des disques dans Open Media Vault : huit périphériques avec leur modèle, leur numéro de série, leur vendeur et leur capacité, de 59 Go à 10,91 To" /><figcaption>Huit entrées : la carte SD du Pi, et sept disques externes, de 931 Go à 10,91 To. Tout ce qui est branché apparaît ici, avec son modèle et son numéro de série.</figcaption></figure>
<p>Après tu peux créer des dossiers partagés. Mais attention, ça, c&rsquo;est juste pour les marquer prêts au partage pour les différents services. Le dossier partagé n&rsquo;est pas encore partagé, il est juste déclaré.</p>
<h2>Les services, c&rsquo;est eux qui partagent vraiment</h2>
<p>Et ces services, c&rsquo;est quoi ? Eh bien ce n&rsquo;est ni plus ni moins que Samba (<a href="https://www.youtube.com/watch?v=HAiHEQblKeQ&amp;list=RDHAiHEQblKeQ" target="_blank" rel="noopener">la lalala</a>) pour partager le dossier vers Windows, ou NFS pour tout ce qui est Linux ou Mac.</p>
<p>Mais aussi du FTP, que je ne vais pas forcément expliquer ici. Du Rsync pour synchroniser des données. Du SSH et du SFTP. Il y a des tonnes de services, et des plugins qu&rsquo;on peut rajouter par dessus.</p>
<p>Et hop, tu as ton dossier partagé.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/omv-partage.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/omv-partage.png/_inside_768__.webp 768w" sizes="(max-width: 820px) 100vw, 780px" width="1013" height="547" decoding="async" src="https://smea.tech/img/u/2026/08/omv-partage.png/_inside_1013__.webp" alt="Le partage du NAS ouvert dans l'explorateur de fichiers du poste de travail : les dossiers Media, SeriesTV, FilmsHD, Animes, eBooks, Audiobooks et SeedBox" /><figcaption>Vu depuis mon poste de travail, c&rsquo;est un dossier réseau comme un autre. Sauf qu&rsquo;il fait une quarantaine de téraoctets.</figcaption></figure>
<h2>Pas parfait mais ça marche et c&rsquo;est simple</h2>
<p>Alors oui, c&rsquo;est pas parfait, comme je disais. Je trouve parfois l&rsquo;interface pas super pratique : il faut valider chaque changement, à chaque fois. Et la chaîne disque, puis partition montée, puis dossier partagé, puis service qui utilise ce dossier, ça peut paraître un peu rebutant au début.</p>
<p>Mais ça marche. Et une fois que c&rsquo;est en place, à part rajouter un disque de temps en temps, on n&rsquo;y touche plus trop. Surtout que même si je ne m&rsquo;en sers pas, il y a du RAID physique ou logiciel, et plein d&rsquo;options que je n&rsquo;approche même pas. C&rsquo;est vraiment complet.</p>
<h2>L&rsquo;installer</h2>
<p>Sur une machine x86, il y a une image ISO toute faite. Tu la graves ou tu la mets sur une clé USB, tu démarres dessus, et c&rsquo;est un installeur classique. Là on ne passe pas par Portainer, c&rsquo;est trop intégré pour ça, mais on verra après qu&rsquo;on lui met un Portainer dedans.</p>
<p>Pour un Raspberry Pi (un Pi 5 chez moi), tu installes Raspberry Pi OS Lite avec Imager. Lite, pas la version bureau : le script d&rsquo;installation détecte l&rsquo;environnement graphique et refuse tout net de continuer. Tu branches un câble réseau, tu mets à jour, et c&rsquo;est parti :</p>
<pre><code>sudo apt-get update
sudo apt-get upgrade -y
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash
sudo reboot</code></pre>
<p>Puis, une fois redémarré, l&rsquo;installation elle-même :</p>
<pre><code>wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash</code></pre>
<p>Comptez jusqu&rsquo;à une demi-heure, le Pi redémarre tout seul à la fin, et c&rsquo;est bon sur <code>http://adresse.ip.du.serveur</code> avec <code>admin</code> / <code>openmediavault</code>. Pas très complexe.</p>
<p>Le <code>preinstall</code>, celui du premier bloc, ce n&rsquo;est pas l&rsquo;installeur, et il n&rsquo;est pas obligatoire : l&rsquo;installation passe très bien sans lui, le second script ne le réclame nulle part. Il fait deux choses. Il vire <code>cloud-init</code>, qui se bat avec Open Media Vault pour la configuration réseau. Et surtout il lit l&rsquo;adresse MAC de ta carte réseau et fige le nom de l&rsquo;interface sur <code>eth0</code>, une fois pour toutes.</p>
<p>C&rsquo;est ce deuxième point qui vaut les trente secondes. Sur une machine sans écran ni clavier, une interface qui change de nom au redémarrage, c&rsquo;est une machine que tu ne retrouves plus. Et tant qu&rsquo;on y est, dans le même esprit : ne préconfigure pas le wifi et ne touche pas à <code>raspi-config</code> avant l&rsquo;installation. Le câble réseau et rien d&rsquo;autre, le script se débrouille avec le reste.</p>
<h2>Pourquoi pas dans Docker, mais avec Portainer dedans</h2>
<p>Un dernier point important. Open Media Vault, je ne le mets pas dans Docker, parce que c&rsquo;est vraiment intégré à l&rsquo;OS. C&rsquo;est l&rsquo;OS lui-même, en vrai. En plus il n&rsquo;y a pas vraiment d&rsquo;image Docker d&rsquo;Open Media Vault, lol. Le script d&rsquo;installation refuse même de démarrer s&rsquo;il détecte qu&rsquo;il tourne dans un conteneur, il te sort <code>OMV does not work in Docker!</code> et il s&rsquo;arrête là. Comme <a href="https://smea.tech/home-assistant-pilier-domotique/">Home Assistant</a>, c&rsquo;est l&rsquo;autre exception à ma règle du tout-Portainer.</p>
<p>Mais ça ne veut pas dire qu&rsquo;on ne peut pas mettre Portainer dans Open Media Vault. D&rsquo;ailleurs c&rsquo;est exactement ce que je fais. J&rsquo;installe le module docker compose d&rsquo;Open Media Vault, je crée un dossier partagé pour les fichiers dont Docker a besoin, et le seul compose que je lance avec, c&rsquo;est <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>.</p>
<p>Après, je passe dans Portainer lui-même. Je branche mes <a href="https://smea.tech/duckdns-acceder-homelab/">DNS</a> avec <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager</a>, et c&rsquo;est tout.</p>
<p>Résultat : j&rsquo;ai une machine NAS qui gère mes fichiers à distance, avec Portainer par dessus pour les applis externalisées, et en plus les services de fichiers d&rsquo;Open Media Vault lui-même. Si ça vous intéresse, je vous parlerai de File Browser dans un autre article, celui-là permet de naviguer dans vos fichiers depuis une page web.</p>
<h2>Le dernier morceau du puzzle</h2>
<p>C&rsquo;est le dernier gros chantier de mon Homelab. Avec lui, la boucle est bouclée : le NAS pour les fichiers, <a href="https://smea.tech/jellyfin-netflix-homelab/">Jellyfin</a> pour les médias, les <a href="https://smea.tech/duckdns-acceder-homelab/">DNS</a> mappés avec <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager</a>, et <a href="https://smea.tech/ma-stack-portainer/">Portainer</a> pour structurer les applications et leurs versions.</p>
<p>Comme je disais, il n&rsquo;est pas parfait. Mais il fait vraiment bien le travail et il répond à tous les besoins.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/openmediavault-nas-maison/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/omv-login.png/_inside_1024_605_.webp" length="723251" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/omv-login.png/_inside_1024_605_.webp" medium="image" width="1024" height="605" type="image/png" />
	</item>
		<item>
		<title>Des domaines pour mes Apps : Nginx Proxy Manager</title>
		<link>https://smea.tech/domaines-apps-nginx-proxy-manager/</link>
					<comments>https://smea.tech/domaines-apps-nginx-proxy-manager/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 21:40:27 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[home-lab]]></category>
		<category><![CDATA[nginx]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=75</guid>

					<description><![CDATA[Le reverse proxy, dernière brique du homelab : une vraie URL et un certificat pour chaque appli, en deux champs à remplir. Nginx Proxy Manager Plus.]]></description>
										<content:encoded><![CDATA[<p>Allez, on attaque la dernière brique vraiment importante du homelab : le reverse proxy. Celui qui transforme une adresse IP et un numéro de port en une vraie URL, avec un vrai certificat.</p>
<p>Je dis pas que c&rsquo;est fini, hein. Le NAS aussi sera utile, et c&rsquo;est <a href="https://smea.tech/openmediavault-nas-maison/">l&rsquo;article suivant</a> parce que c&rsquo;est un gros morceau. Mais niveau plomberie, le reverse proxy c&rsquo;est le dernier maillon, ou plutôt le dernier tuyau ^^.</p>
<h2>Un reverse proxy, c&rsquo;est quoi</h2>
<p>C&rsquo;est simple. C&rsquo;est lui qui va te dire : tel domaine, genre <code>jellyfin.mon-homelab.duckdns.org</code>, c&rsquo;est telle appli, sur telle machine, sur tel port.</p>
<p>Parce que sans lui, ta vie ressemble à ça : tu retiens que Jellyfin c&rsquo;est le port 8096, que ton Portainer c&rsquo;est le 9443, que ton autre truc c&rsquo;est le 7575, et tu tapes des adresses IP à la main dans ton navigateur. Sur ton téléphone, à l&rsquo;extérieur, bon courage.</p>
<p>Avec un reverse proxy, tu tapes <code>jelly.mon-domaine.fr</code> et c&rsquo;est réglé. Ça marche. Pour peu que le domaine soit bien branché sur ton IP, et là on en revient à <a href="https://smea.tech/duckdns-acceder-homelab/">Duck DNS</a>, lol.</p>
<h2>Les trois briques qui vont ensemble</h2>
<p>Dans mon homelab, tout tient sur trois trucs, et ils marchent en équipe.</p>
<p><a href="https://smea.tech/ma-stack-portainer/">Portainer</a>, d&rsquo;abord : c&rsquo;est là que j&rsquo;héberge toutes mes applis. Ensuite les applis elles-mêmes, comme <a href="https://smea.tech/pop3-to-smtp-remplace-gmail/">mon relais POP3 vers SMTP</a> ou <a href="https://smea.tech/jellyfin-netflix-homelab/">Jellyfin</a>. Et enfin Nginx Proxy Manager, le reverse proxy, celui qui donne une vraie URL à tout ça.</p>
<p>Tu configures le tout sur <a href="https://www.duckdns.org/">Duck DNS</a> si tu veux du gratuit, ou sur un vrai domaine à toi avec autant de sous-domaines que tu veux. Le principe est identique.</p>
<h2>Pourquoi Nginx Proxy Manager Plus (et oui, le Plus est important)</h2>
<p>Parce qu&rsquo;en vrai il est hyper hyper simple. Voyez vous-même.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/npmplus-proxy-hosts.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/npmplus-proxy-hosts.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/npmplus-proxy-hosts.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/npmplus-proxy-hosts.png/_inside_1280__.webp 1280w" sizes="(max-width: 820px) 100vw, 780px" width="1345" height="907" decoding="async" src="https://smea.tech/img/u/2026/08/npmplus-proxy-hosts.png/_inside_1345__.webp" alt="Liste des proxy hosts dans NPMplus : chaque ligne montre un sous-domaine, sa destination en http vers une IP et un port, le certificat Certbot, l'accès public et le statut Online" /><figcaption>Un domaine, une destination, un certificat, un statut. C&rsquo;est toute l&rsquo;interface, et c&rsquo;est tout ce qu&rsquo;il y a à comprendre.</figcaption></figure>
<p>Là on a des domaines qui pointent vers tel port de ma machine. Jellyfin tourne dans Portainer sur le port 8096, sur telle machine : tu lui dis <code>jelly.mon-domaine.com</code>, tu remplis deux champs, et c&rsquo;est réglé.</p>
<p>Nginx Proxy Manager se veut hyper simple, mais il reste ultra configurable, avec des options avancées quand tu en as besoin. Il gère aussi les authentifications HTTP classiques, vous savez, quand le navigateur te demande un identifiant et un mot de passe avant même d&rsquo;afficher la page. Et le filtrage par IP. Bref, tout ce que vous voulez.</p>
<h2>Le Plus, c&rsquo;est quoi au juste</h2>
<p>Le Plus, c&rsquo;est juste un fork qui rajoute des options. <a href="https://github.com/ZoeyVid/NPMplus">NPMplus</a>, de son vrai nom. Grosso modo, voilà ce qu&rsquo;il ajoute par rapport à l&rsquo;original :</p>
<ul>
<li><strong>CrowdSec</strong> se branche beaucoup plus facilement dessus. C&rsquo;est un genre de fail2ban moderne et communautaire : il lit tes logs, repère les comportements pourris, et bannit. La différence, c&rsquo;est que les signalements sont partagés entre tous les utilisateurs, donc tu bloques des IP malveillantes avant même qu&rsquo;elles t&rsquo;aient visé.</li>
<li>Un <strong>SSO</strong>, c&rsquo;est-à-dire une authentification unifiée. Tu te connectes une fois, et tous tes services derrière le proxy te reconnaissent. Il sait causer OpenID Connect, et se brancher sur Authelia, Authentik, VoidAuth ou tinyauth.</li>
<li>Du <strong>HTTP/3</strong>, du Brotli et du Zstd, du mTLS, et une config TLS bien plus sévère par défaut.</li>
<li><strong>GoAccess</strong> intégré, pour avoir des stats de fréquentation lisibles sur tes logs nginx.</li>
</ul>
<p>Mais rien de tout ça n&rsquo;est obligatoire. Vraiment rien. Tu peux l&rsquo;installer et ne jamais toucher à ces options, il marchera exactement comme l&rsquo;original.</p>
<p>Parce que même Nginx Proxy Manager sans le Plus, c&rsquo;est une révolution. Avant, on utilisait Traefik, ou directement nginx. Et je vous assure que se taper les fichiers de config à la main, c&rsquo;était une plaie. Un <code>server</code>, un <code>location</code>, les en-têtes à recopier, le certificat à pointer, un rechargement, une virgule oubliée, on recommence. Maintenant c&rsquo;est quelques clics et c&rsquo;est fait.</p>
<h2>Le truc que tous les admins web détestent : le HTTPS</h2>
<p>J&rsquo;allais oublier, et c&rsquo;est peut-être le plus gros morceau. Il gère Let&rsquo;s Encrypt de façon quasi automatisée. Tu coches une case, tu mets ton adresse mail, et tu as ton certificat. Le renouvellement se fait tout seul.</p>
<p>Il sait même le faire en mode DNS si tu veux un certificat wildcard, du genre <code>*.mon-domaine.fr</code>, valable pour tous les sous-domaines d&rsquo;un coup. Perso je n&rsquo;en ai jamais eu besoin, lol, mais c&rsquo;est là.</p>
<p>Quand on se souvient du temps où obtenir et renouveler un certificat était une corvée trimestrielle, franchement, ça pique.</p>
<h2>L&rsquo;installer</h2>
<p>Tu passes par <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>, ou par un compose à la main. Mais bon, on a mis un super Portainer, pourquoi s&rsquo;en priver.</p>
<p>Attention, celui-ci c&rsquo;est bien le compose de NPMplus, pas celui de l&rsquo;original :</p>
<pre><code>name: npmplus
services:
  npmplus:
    restart: unless-stopped
    image: docker.io/zoeyvid/npmplus:latest
    network_mode: host
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
      - SETGID
    security_opt:
      - no-new-privileges:true
    volumes:
      - "/opt/npmplus:/data"
    environment:
      - "TZ=Europe/Paris"</code></pre>
<p>Le <code>network_mode: host</code> n&rsquo;est pas là par hasard : le conteneur doit écouter sur les ports 80 et 443 de la machine, c&rsquo;est lui la porte d&rsquo;entrée. L&rsquo;interface d&rsquo;administration, elle, arrive sur le port 81, en HTTPS. Au premier démarrage il te génère un mot de passe aléatoire et l&rsquo;écrit dans les logs du conteneur : va le chercher là, tu ne le trouveras nulle part ailleurs.</p>
<h2>Le proxy qui se sert lui-même</h2>
<p>Et là il y a un truc que je fais systématiquement : je rajoute <code>nginx.mon-homelab.com</code> dans NPM lui-même, pointé sur son propre port 81. Et ça marche vraiment.</p>
<p>Concrètement, tu ouvres l&rsquo;interface sur <code>https://ip-de-la-machine:81</code>, tu cliques sur « Add Proxy Host », et tu remplis quatre champs :</p>
<ul>
<li><strong>Domain Names</strong> : <code>nginx.mon-homelab.com</code></li>
<li><strong>Scheme</strong> : <code>https</code>, parce que l&rsquo;interface de NPMplus ne parle qu&rsquo;en HTTPS</li>
<li><strong>Forward Hostname / IP</strong> : <code>127.0.0.1</code>, la machine se parle à elle-même</li>
<li><strong>Forward Port</strong> : <code>81</code></li>
</ul>
<p>Puis tu passes sur l&rsquo;onglet SSL, tu choisis « Request a new SSL Certificate », tu coches « Force SSL », et tu enregistres. Le certificat est demandé dans la foulée.</p>
<p>À partir de là tu administres ton reverse proxy depuis <code>https://nginx.mon-homelab.com</code>, avec un vrai certificat reconnu. Fini l&rsquo;adresse IP et le numéro de port à retenir, fini l&rsquo;avertissement du navigateur sur le certificat auto-signé.</p>
<p>Un conseil quand même : sur celui-là, mets une Access List, ou un filtrage par IP, ou ton SSO. C&rsquo;est la porte d&rsquo;entrée de tout le reste, autant ne pas la laisser grande ouverte sur Internet.</p>
<h2>C&rsquo;est lui qui change tout</h2>
<p>Je vous le dis, c&rsquo;est vraiment le dernier maillon d&rsquo;une chaîne d&rsquo;outils qui vont ensemble. Il ne faut pas l&rsquo;oublier. Portainer héberge, les applis tournent, Duck DNS fait arriver le monde chez toi, mais c&rsquo;est le reverse proxy qui rend tout ça utilisable au quotidien.</p>
<p>Essayer, c&rsquo;est l&rsquo;adopter.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/domaines-apps-nginx-proxy-manager/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/npm-une-v2.png/_inside_1024_683_.webp" length="1536439" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/npm-une-v2.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Jellyfin, le Netflix du homelab</title>
		<link>https://smea.tech/jellyfin-netflix-homelab/</link>
					<comments>https://smea.tech/jellyfin-netflix-homelab/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Tue, 04 Aug 2026 21:15:23 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[home-lab]]></category>
		<guid isPermaLink="false">https://smea.tech/?p=67</guid>

					<description><![CDATA[Un Netflix perso avec mes séries, mes jaquettes et mes résumés, sans abonnement et sans cloud. Pourquoi Jellyfin a dépassé Plex, et sur quelle machine le faire tourner.]]></description>
										<content:encoded><![CDATA[<p>On a tous une petite collection de séries et d&rsquo;animés à la maison. Récupérée légalement bien sûr, sur des sites de téléchargement légaux, ou rippée soi-même à partir de ses propres disques ^^. Le souci c&rsquo;est pas de l&rsquo;avoir : c&rsquo;est de la regarder dans de bonnes conditions sur sa télé, avec une interface qui donne envie.</p>
<p>Parce qu&rsquo;on a tous pris l&rsquo;habitude avec Netflix. Un truc fluide, joli, où tu retrouves toutes tes séries et tes films au même endroit. Tu choisis, t&rsquo;as le résumé, la jaquette, les acteurs, parfois même la bande-annonce. C&rsquo;est vraiment bien fait. Et à l&rsquo;époque c&rsquo;était même pas cher.</p>
<p>Sauf qu&rsquo;il y a des gens qui ont voulu garder leur indépendance là-dessus. Ne pas payer dix abonnements différents pour retrouver le catalogue qu&rsquo;ils avaient déjà chez eux. C&rsquo;est comme ça que Plex est né.</p>
<h2>Plex, le roi qui doit tomber</h2>
<p>Alors pourquoi je vous parle de Plex dans un article sur Jellyfin ? Parce que dans les serveurs multimédia, Plex domine le marché. C&rsquo;est le premier, c&rsquo;est le roi. Mais le roi doit tomber, et il va forcément tomber.</p>
<p>Petit point d&rsquo;histoire. Plex est né pour répondre au besoin, et en face il avait un concurrent direct : Emby. Libre, mais piloté par une boîte, et qui avançait moins vite. Plex était gratuit mais fermé, Emby était libre avec quelques options payantes ou à compiler soi-même.</p>
<p>Et puis Plex a mis des prix. Un abonnement, puis un pass à vie. Et ce pass à vie, regardez le chemin qu&rsquo;il a fait :</p>
<table>
<thead>
<tr>
<th>Quand</th>
<th>Le pass à vie</th>
</tr>
</thead>
<tbody>
<tr>
<td>2012, au lancement</td>
<td>74,99 $</td>
</tr>
<tr>
<td>Les années d&rsquo;après</td>
<td>environ 120 $</td>
</tr>
<tr>
<td>Avril 2025</td>
<td>249,99 $</td>
</tr>
<tr>
<td>1<sup>er</sup> juillet 2026</td>
<td><strong>749,99 $</strong></td>
</tr>
</tbody>
</table>
<p>Fois dix. Oui oui, fois dix. Pour regarder des fichiers qui sont sur ton disque dur, chez toi. Ils ont même sorti un pass cinq ans à 249,99 $ dans la foulée, histoire de rattraper ceux que le prix à vie a fait fuir.</p>
<p>Emby, lui, a essayé de s&rsquo;en sortir mais n&rsquo;a jamais trouvé son modèle économique. Fin 2018, il a fermé son code. Et c&rsquo;est exactement là que Jellyfin est né : un fork d&rsquo;Emby, lancé en décembre 2018, à partir de la dernière version encore libre.</p>
<p>Aujourd&rsquo;hui, Jellyfin a largement dépassé Emby. Et selon moi il a aussi largement dépassé Plex. Plex garde son avance parce qu&rsquo;il est le plus ancien et que beaucoup de gens ont un pass à vie. Mais il est moins ouvert, moins simple à configurer, et je trouve qu&rsquo;il a finalement moins de fonctionnalités. Pendant ce temps Jellyfin évolue tellement plus vite que c&rsquo;est ouf.</p>
<blockquote><p>Plex, c&rsquo;est l&rsquo;Internet Explorer du serveur multimédia. Mdr.</p></blockquote>
<h2>Un serveur multimédia, c&rsquo;est quoi au juste</h2>
<p>C&rsquo;est un Netflix perso. Et pour l&rsquo;utiliser il te faut deux choses.</p>
<p>D&rsquo;abord un <strong>serveur</strong> : c&rsquo;est lui qui héberge tes médias, qui les range, les trie, les décrit, les détaille, et les prépare à être lus. Ensuite un <strong>client</strong> pour lire tout ça, à distance. À distance, oui, mais à distance ça peut très bien être ton serveur qui est à deux mètres dans le meuble d&rsquo;à côté.</p>
<p>Des clients, il y en a de toutes sortes. Sur TV LG, tu l&rsquo;installes directement (et si tu la rootes, il y a même des alternatives). Sur Android, il y a une pléiade d&rsquo;applis en plus de l&rsquo;officielle, qui marche déjà très bien. Sur certains Samsung et sur les autres télés, il faut juste tripatouiller un peu. Et bien sûr il y a le client web : tu ouvres une page, et ça marche.</p>
<p>Le <strong>serveur</strong>, c&rsquo;est ça la différence avec un lecteur comme VLC, ou même avec Kodi qui est très connu. Kodi, il est le client <em>et</em> le serveur à la fois. Tu dois limite avoir un Kodi par appareil. Alors qu&rsquo;avec Jellyfin, là tout de suite, mon fils regarde <em>Il était une fois la vie</em> sur sa tablette pendant que je regarde <em>House of the Dragon</em> sur la télé. Il est pas dans la même pièce que moi je vous rassure mdr.</p>
<h2>Ce que ça donne une fois rangé</h2>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/jellyfin-bibliotheque.jpg/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/jellyfin-bibliotheque.jpg/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/jellyfin-bibliotheque.jpg/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/jellyfin-bibliotheque.jpg/_inside_1280__.webp 1280w" sizes="(max-width: 820px) 100vw, 780px" width="1300" height="731" decoding="async" src="https://smea.tech/img/u/2026/08/jellyfin-bibliotheque.jpg/_inside_1300__.webp" alt="Bibliothèque de films Jellyfin : une grille de jaquettes avec le titre et l'année sous chacune, et un menu Films, Suggestions, Bandes-annonces, Favoris, Collections, Genres" /><figcaption>La bibliothèque : jaquettes, titres, années. Tout ça, il l&rsquo;a récupéré tout seul.</figcaption></figure>
<p>En face tu te retrouves avec la liste de tes médias préférés, rangée comme tu veux. Il détecte automatiquement le film, la jaquette, l&rsquo;épisode, les détails, la description, les vignettes, les chapitres, la bande-annonce. Tout.</p>
<p>Et tu peux aussi tout ajuster à la main pour bien ranger, si t&rsquo;es monomaniaque comme moi. Avoir tous les épisodes spéciaux, et même la petite vidéo bonus trouvable uniquement sur des sites de vidéo perdus au fin fond d&rsquo;internet.</p>
<p>Il y a aussi des plugins : sous-titres automatiques, webhooks, Trakt.tv. Par rapport aux concurrents, il est hyper facile à ranger, à éditer, à ajuster les métadonnées comme on veut. C&rsquo;est énorme et c&rsquo;est très bien fait.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="769" decoding="async" src="https://smea.tech/img/u/2026/08/jellyfin-fiche-serie.png/_inside_1560__.webp" alt="Fiche de la série Xena la guerrière dans Jellyfin : jaquette, résumé, années de diffusion, note, étiquettes, liens IMDb TheTVDB TMDB Trakt, prochain épisode à suivre et les six saisons avec leurs affiches" /><figcaption>La fiche de Xena, la guerrière (une super série au passage). Le résumé, la note, les étiquettes, les liens vers IMDb et Trakt, l&rsquo;épisode à reprendre, les six saisons : je n&rsquo;ai rien tapé, il est allé tout chercher.</figcaption></figure>
<h2>Le transcodage, le seul truc qui coûte cher</h2>
<p>Alors est-ce que tout est parfait ? Oui et non. Jellyfin peut être assez gourmand, et surtout sur une chose : le transcodage. Ce qui n&rsquo;est pas obligatoire, et c&rsquo;est pareil chez Plex ou Emby.</p>
<p>En gros, si le client est pas capable de lire le codec de la vidéo, ou s&rsquo;il veut une résolution plus faible parce qu&rsquo;il a un débit de merde, alors Jellyfin est capable de transcoder la vidéo à la volée. Il repasse le média dans le bon codec en temps réel, et le client y voit que du feu.</p>
<p>Sauf que transcoder, ça se paye en CPU. Sauf si tu laisses le boulot à une puce faite pour ça.</p>
<h2>Le matériel : pourquoi j&rsquo;ai pris un N100</h2>
<p>On va vous conseiller un PC correct avec une carte NVIDIA, parce qu&rsquo;elles sont assez balèzes pour faire ça. Et c&rsquo;est vrai, ça marche très bien.</p>
<p>Mais moi j&rsquo;ai visé une autre approche : un mini PC en <strong>N100</strong>, avec sa carte graphique intégrée. Elle décode de l&rsquo;AV1, du H.265 et bien sûr du H.264 (celui que réclament tous les clients ou presque) ultra rapidement. Et il y a un truc auquel tout le monde pense pas : il consomme entre 11 W et 30 W au pire des moments. C&rsquo;est minuscule.</p>
<p>Un Raspberry Pi 4 est vraiment limite, mais il a au moins un bloc de décodage et d&rsquo;encodage H.264. Pas hyper fiable, mais ça marchera. Par contre je déconseille énormément le Pi 5 : il n&rsquo;y a plus du tout d&rsquo;encodage H.264 dessus. Pour un serveur multimédia c&rsquo;est rédhibitoire.</p>
<p>Le N100 est limite fait pour ça. C&rsquo;est plutôt magique. C&rsquo;est d&rsquo;ailleurs la machine dont je vous parlais dans l&rsquo;article sur <a href="https://smea.tech/home-assistant-pilier-domotique/">Home Assistant</a> : je l&rsquo;ai gardée pour Jellyfin.</p>
<h2>L&rsquo;installer, en Docker évidemment</h2>
<p>Et bien sûr, <a href="https://smea.tech/ma-stack-portainer/">Portainer</a> c&rsquo;est l&rsquo;idéal, ou en Compose direct. Le compose de base tient en quelques lignes, il vient de <a href="https://jellyfin.org/docs/general/installation/container/">la doc officielle</a> :</p>
<pre><code>services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: 1000:1000
    ports:
      - 8096:8096/tcp
      - 7359:7359/udp
    devices:
      - /dev/dri:/dev/dri
    volumes:
      - /chemin/vers/config:/config
      - /chemin/vers/cache:/cache
      - type: bind
        source: /chemin/vers/mes/medias
        target: /media
    restart: unless-stopped</code></pre>
<p>La ligne <code>devices</code> avec <code>/dev/dri</code>, c&rsquo;est ce qui donne au conteneur l&rsquo;accès à la puce graphique. Sans elle, pas d&rsquo;accélération matérielle, et c&rsquo;est ton processeur qui va souffrir.</p>
<p>Chez moi, je monte les disques de <a href="https://smea.tech/openmediavault-nas-maison/">mon NAS</a> en NFS. Mais sinon un accès aux fichiers quelconque suffit. Attention par contre : Jellyfin ne gère pas les volumes distants tout seul. Il faut que le montage soit déjà fait côté machine. NFS ou CIFS, c&rsquo;est parfait.</p>
<p>Ensuite tu accèdes à <code>http://adresse-du-serveur:8096</code>, tu suis l&rsquo;assistant, tu pointes tes dossiers, et il fait le reste. Après ça tu peux connecter ton client sur ton téléphone, ta télé, ce que tu veux.</p>
<h2>Libre, gratuit, et vraiment</h2>
<p>C&rsquo;est libre, c&rsquo;est gratuit, sans option d&rsquo;abonnement caché (oui Plex, on te voit). Et ça marche vraiment bien.</p>
<p>Si vous avez une collection qui traîne sur un disque dur et que vous la regardez encore en branchant une clé USB sur la télé, essayez. Vous reviendrez pas en arrière.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/jellyfin-netflix-homelab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/jellyfin-cover.png/_inside_1024_683_.webp" length="1810676" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/jellyfin-cover.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Récupérez automatiquement vos jeux gratuits</title>
		<link>https://smea.tech/claim-auto-jeux-gratuits/</link>
					<comments>https://smea.tech/claim-auto-jeux-gratuits/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 12:40:38 +0000</pubDate>
				<category><![CDATA[Réalisations]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[jeux-video]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=59</guid>

					<description><![CDATA[Epic, Steam, GOG, Prime Gaming : j'en avais marre de cliquer partout. J'ai fait un outil Docker qui récupère les jeux gratuits tout seul, clés comprises.]]></description>
										<content:encoded><![CDATA[<p>Tous les mois, Epic, Steam, GOG et Prime Gaming offrent des jeux. Et tous les mois, j&rsquo;en oublie la moitié. J&rsquo;ai fini par écrire un truc qui va les chercher à ma place, les clés comprises.</p>
<h2>Ça a commencé par une news sur GOG</h2>
<p>Il y a quelque temps, j&rsquo;ai vu passer la news : GOG allait sortir une version native Linux de GOG Galaxy. J&rsquo;étais content, et dans ma tête ça cogite. Je me dis tiens, je vais aller voir les jeux gratos sur Prime Gaming.</p>
<p>Sauf que ça a changé de nom, c&rsquo;est rangé ailleurs, bref c&rsquo;est le bordel. Je ne retrouve plus mes jeux, j&rsquo;en ai marre.</p>
<p>Et là je commence à me demander combien de jeux Epic j&rsquo;ai loupés. Combien de jeux Prime aussi. Je me souviens que The Witcher a été offert un jour, un jeu que j&rsquo;ai toujours voulu faire. Enfin je suppose, en fait j&rsquo;en sais rien : je n&rsquo;y ai jamais joué, alors que j&rsquo;ai lu les bouquins.</p>
<h2>10 000 clics pour rien</h2>
<p>Récupérer ses jeux gratuits, c&rsquo;est une perte de temps. Quatre sites, quatre connexions, cliquer, valider, recommencer. C&rsquo;est long, c&rsquo;est pour rien, et de toute façon tu en oublies tout le temps.</p>
<p>Entre-temps, au taf, on m&rsquo;a fait faire les tests end to end de l&rsquo;appli. En gros, des tests où le navigateur se pilote tout seul pour vérifier que l&rsquo;interface marche. Et là, le déclic : ça suffit, on va automatiser tout ça.</p>
<h2>claim-auto : tu branches tes comptes, il fait le reste</h2>
<p>Ça a donné <a href="https://github.com/Smeagolworms4/claim-game-auto">claim-game-auto</a>. Tu connectes tes comptes Epic, Steam, GOG et Prime Gaming une bonne fois, il analyse les jeux gratuits du moment et les ajoute directement dans tes collections. Avec leur clé quand il y en a une. Zéro clic, ou presque.</p>
<p>Il tourne deux fois par jour par défaut, mais la planification se règle. Le reste du temps, tu ouvres la page quand tu veux voir ce qui est tombé.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="821" decoding="async" src="https://smea.tech/img/u/2026/08/claim-auto-interface.png/_inside_1560__.webp" alt="Interface de claim-auto : les quatre boutiques en haut avec leur état de connexion, la liste des clés récupérées, le journal en direct et l'historique" /><figcaption>L&rsquo;interface : ce qui est détecté, ce qui est déjà réclamé, et les clés archivées avec leur lien d&rsquo;activation.</figcaption></figure>
<h2>Le « ou presque », c&rsquo;est les captchas</h2>
<p>Pour en arriver là, j&rsquo;ai tranché deux choses.</p>
<p>La première : la connexion n&rsquo;est pas en full API. L&rsquo;outil lance de vrais navigateurs, dans des environnements virtuels cachés, et clique comme le ferait un humain. C&rsquo;est ce qui permet de couvrir quatre boutiques qui n&rsquo;ont aucune envie qu&rsquo;on automatise quoi que ce soit. Et forcément, à un moment, un anti-captcha se réveille.</p>
<p>La deuxième découle de la première : quand un captcha est détecté, l&rsquo;interface te propose d&rsquo;ouvrir une fenêtre VNC, du contrôle à distance, sur ce navigateur caché. Mais dans une page web. Oui, un navigateur dans ton navigateur, lol. Tu résous le truc à la main, tu cliques sur « J&rsquo;ai fini », le VNC se coupe et tout repasse en headless.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="766" decoding="async" src="https://smea.tech/img/u/2026/08/claim-auto-vnc-steam.png/_inside_1560__.webp" alt="La fenêtre VNC de claim-auto : le navigateur du conteneur affiche la page de Steam, avec un bouton J'ai fini en haut à droite" /><figcaption>La connexion à chaque boutique se fait comme ça : tu pilotes le navigateur du conteneur depuis le tien.</figcaption></figure>
<p>C&rsquo;est le même écran qui sert pour les connexions initiales, mot de passe et 2FA compris. Une fois le profil enregistré, tu n&rsquo;y reviens plus. Et il récupère même tes clés GOG et Legacy Games tout seul.</p>
<h2>Une notif quand il a besoin de toi</h2>
<p>Par-dessus ça, il peut te prévenir. Quand un captcha bloque, il t&rsquo;envoie une notification sur le canal que tu veux : Discord, Telegram, Slack, ntfy, un webhook maison, un mail, ou même un SMS si tu es chez Free. Tu cliques sur le lien reçu et ça t&rsquo;ouvre directement le contrôle à distance sur le navigateur coincé, celui de juste au-dessus. Tu règles le captcha, et la réclamation repart toute seule derrière.</p>
<p>Et si vraiment ça coince, l&rsquo;interface te donne les liens directs pour claim à la main, à l&rsquo;ancienne. Comme ça, même si un problème persiste, ça reste gérable. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2>L&rsquo;installation, c&rsquo;est un docker compose</h2>
<p>Rien à cloner, rien à compiler : l&rsquo;image est publiée sur Docker Hub. Tu fais un compose, ou tu le colles direct dans Portainer (<a href="https://smea.tech/ma-stack-portainer/">va voir l&rsquo;article</a>), tu verras c&rsquo;est hyper simple.</p>
<pre><code>services:
  claim-auto:
    image: smeagolworms4/claim-game-auto:latest
    container_name: claim-auto
    restart: unless-stopped
    stop_grace_period: 45s
    user: "${PUID:-1000}:${PGID:-1000}"
    env_file:
      - .env
    environment:
      HOME: /data/home
    ports:
      - "${WEB_PORT_HOST:-8080}:8080"
    volumes:
      - ./data:/data
    shm_size: "1gb"
</code></pre>
<p>Tu lances, tu ouvres <code>127.0.0.1:8080</code>, et tu connectes tes boutiques une par une. Il y a même une image pour Raspberry Pi.</p>
<h2>Si tu l&rsquo;exposes sur le web, mets un mot de passe</h2>
<p>Attention à ce point, il est important : cette interface donne accès à tes comptes de jeu. Quelqu&rsquo;un qui l&rsquo;ouvre est connecté à ton Steam et à ton Epic. Donc si tu la sors de chez toi, tu remplis <code>WEB_USER</code> et <code>WEB_PASSWORD</code>, et tu ne publies pas les ports 6080 et 5900 : le VNC passe déjà par l&rsquo;interface web, protégé par la même authentification.</p>
<p>Pour le nom de domaine, <a href="https://smea.tech/duckdns-acceder-homelab/">Duck DNS fait très bien l&rsquo;affaire</a>. Derrière, il te faut un reverse proxy pour gérer le certificat et l&rsquo;aiguillage. Chez moi c&rsquo;est <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager</a>, et voilà, l&rsquo;article est là.</p>
<h2>C&rsquo;est fait main, et j&rsquo;attends vos retours</h2>
<p>Je préfère être clair : c&rsquo;est fait main et peu testé, c&rsquo;est loin d&rsquo;être parfait. Les quatre boutiques changent leurs pages quand elles veulent et leurs protections aussi, et régler ce genre de chose est assez complexe. Claudio m&rsquo;a déjà bien aidé, mais il reste sûrement plein de cas que je n&rsquo;ai pas vus.</p>
<p>Donc n&rsquo;hésitez pas si vous avez des soucis, et surtout si vous avez des solutions. Les correctifs et les ajustements sont les bienvenus.</p>
<p>Moi, je voulais surtout tester. Pour le moment ça marche. Peut-être que ça passera plus dans six mois, on verra. Ça ne m&rsquo;a pas coûté trop de temps à faire, donc à voir. J&rsquo;attends vos retours.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/claim-auto-jeux-gratuits/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/claim-auto-jeux-gratuits.png/_inside_1024_683_.webp" length="1730479" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/claim-auto-jeux-gratuits.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Duck DNS : accéder à votre homelab</title>
		<link>https://smea.tech/duckdns-acceder-homelab/</link>
					<comments>https://smea.tech/duckdns-acceder-homelab/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Sun, 02 Aug 2026 00:06:32 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[home-lab]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=54</guid>

					<description><![CDATA[Le plus dur quand on héberge ses services chez soi, ce n'est pas de les faire tourner, c'est d'y accéder de l'extérieur. Duck DNS règle la moitié du problème, gratuitement.]]></description>
										<content:encoded><![CDATA[<p>Quand on héberge ses services soi-même, le plus gros souci n&rsquo;est pas de les faire tourner. C&rsquo;est d&rsquo;y accéder depuis l&rsquo;extérieur. Tant que tu restes chez toi, sur ton réseau, tout va bien. Le jour où tu veux ouvrir ton lecteur de comics depuis le boulot ou montrer un truc à un pote, ça se complique très vite.</p>
<h2>Pour faire ça bien, il faut deux choses</h2>
<p>Une IP fixe, et un nom de domaine. Si tu n&rsquo;as pas les deux, c&rsquo;est la galère. Pas impossible, mais la galère.</p>
<p>L&rsquo;IP fixe, c&rsquo;est ce qui garantit que l&rsquo;adresse de ta box aujourd&rsquo;hui sera la même demain. Le nom de domaine, c&rsquo;est ce qui t&rsquo;évite de la retenir. Les deux ensemble, tu tapes un nom dans le navigateur et tu tombes chez toi, point.</p>
<h2>Le cas de l&rsquo;IP partagée, on en reparlera</h2>
<p>Je ne vais pas te parler ici du cas où ton IP publique est mutualisée avec d&rsquo;autres abonnés. J&rsquo;ai Starlink, c&rsquo;est exactement ma situation, et je te le dis tout de suite : c&rsquo;est la merde. Tous tes ports ne sont pas disponibles, et ceux que tu obtiens ne sont jamais les mêmes. Ça mérite son propre article, je le ferai.</p>
<p>Là je pars du cas normal : une IP peut-être dynamique, mais au moins tu es seul dessus.</p>
<h2>Le nom de domaine, ce n&rsquo;est pas cher, mais c&rsquo;est mieux si c&rsquo;est 0</h2>
<p>Un nom de domaine, ça ne coûte pas grand-chose. Une dizaine d&rsquo;euros par an chez n&rsquo;importe quel registrar. Chez OVH il y a même du DNS dynamique. Mais c&rsquo;est pas 0, et pour du homelab tu as vite l&rsquo;impression de payer pour pas grand-chose.</p>
<p>Et c&rsquo;est là que <a href="https://www.duckdns.org/">Duck DNS</a> entre en jeu.</p>
<h2>Duck DNS, c&rsquo;est gratuit et ça suffit</h2>
<p>En gros, c&rsquo;est un DNS gratuit. Tu te connectes avec ton compte Google, GitHub, Reddit ou Twitter, tu choisis un nom, et tu récupères un jeton. C&rsquo;est tout.</p>
<p>Alors oui, il y a <code>duckdns.org</code> dedans. Ton domaine à toi ce sera <code>toto.duckdns.org</code>, pas <code>toto.fr</code>. Mais bon, c&rsquo;est gratuit, on ne râle pas. Tu associes une IP, et hop, tous les sous-domaines et les sous-sous-domaines que tu veux pointent chez toi. <code>nas.toto.duckdns.org</code>, <code>media.toto.duckdns.org</code>, ce que tu veux : tout arrive au même endroit, à toi de trier derrière avec un reverse proxy.</p>
<p>Au lieu de taper <code>88.33.55.99</code> dans ton navigateur, tu tapes <code>toto.duckdns.org</code> et tu es sur ta machine. Il faudra quand même router les ports sur ta box, mais si tu as configuré un client torrent un jour dans ta vie, tu sais faire, mdr.</p>
<h2>L&rsquo;IP dynamique, avant et maintenant</h2>
<p>Le vrai must de Duck DNS, c&rsquo;est qu&rsquo;il gère les IP dynamiques. Ton fournisseur te change d&rsquo;adresse en pleine nuit ? Le nom continue de pointer au bon endroit.</p>
<p>À mon époque, on faisait tourner ADSL Auto Connect avec No-IP par-dessus. Ceux de mon âge s&rsquo;en souviendront, avec le petit exécutable planqué dans la barre des tâches qui tombait une fois sur deux. Aujourd&rsquo;hui c&rsquo;est un petit compose Docker et c&rsquo;est réglé. Si tu ne vois pas de quoi je parle, va d&rsquo;abord jeter un œil à <a href="https://smea.tech/ma-stack-portainer/">l&rsquo;article sur Portainer et les conteneurs</a>, ça te remettra dans le bain.</p>
<pre><code>services:
  duckdns:
    image: lscr.io/linuxserver/duckdns:latest
    container_name: duckdns
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
      - SUBDOMAINS=toto
      - TOKEN=ton-jeton-duckdns
      - UPDATE_IP=ipv4
      - LOG_FILE=false
    volumes:
      - ./config:/config
    restart: unless-stopped
</code></pre>
<p>Trois lignes à changer et c&rsquo;est plié. <code>SUBDOMAINS</code>, c&rsquo;est juste la partie de gauche : si ton domaine est <code>toto.duckdns.org</code>, tu mets <code>toto</code>, pas le nom complet. Tu peux en mettre plusieurs, séparés par des virgules, sans espace. <code>TOKEN</code>, c&rsquo;est le jeton que Duck DNS t&rsquo;affiche sur ton compte. <code>UPDATE_IP</code> accepte <code>ipv4</code>, <code>ipv6</code> ou <code>both</code> selon ce que ta connexion sait faire.</p>
<p>Une fois lancé, le conteneur va contacter Duck DNS toutes les cinq minutes pour dire « voilà mon IP du moment ». Il ne fait que ça, il ne consomme rien, et tu l&rsquo;oublies. Si tu veux garder une trace des changements d&rsquo;adresse, tu passes <code>LOG_FILE</code> à <code>true</code> et tu le retrouves dans le volume <code>/config</code>.</p>
<h2>Un nom qui pointe chez toi, et c&rsquo;est déjà beaucoup</h2>
<p>Une fois que c&rsquo;est configuré, tu as un nom de domaine qui pointe vers ton IP, dynamique ou pas. C&rsquo;est la première brique, celle sans laquelle rien d&rsquo;autre n&rsquo;est accessible de l&rsquo;extérieur. Derrière, tu peux poser un reverse proxy, des certificats, de l&rsquo;authentification, mais il faut bien commencer par un nom qui arrive quelque part. Chez moi c&rsquo;est <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">Nginx Proxy Manager</a> qui s&rsquo;occupe de tout ça.</p>
<p>Et si par malheur ton IP est mutualisée, on en reparlera. C&rsquo;est moins cool, désolé.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/duckdns-acceder-homelab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_inside_1024_683_.webp" length="1912423" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/duckdns-canard-bouee.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Home Assistant : le pilier de ma maison connectée</title>
		<link>https://smea.tech/home-assistant-pilier-domotique/</link>
					<comments>https://smea.tech/home-assistant-pilier-domotique/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 19:38:10 +0000</pubDate>
				<category><![CDATA[Domotique]]></category>
		<category><![CDATA[home-assistant]]></category>
		<category><![CDATA[home-lab]]></category>
		<category><![CDATA[zigbee]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=46</guid>

					<description><![CDATA[Le cerveau de ma maison. Lumières, volets, piscine, conso électrique et même mes serveurs : tout passe par Home Assistant, et il tourne chez moi.]]></description>
										<content:encoded><![CDATA[<p>Après <a href="https://smea.tech/ma-stack-portainer/">Portainer</a>, voilà l&rsquo;autre pilier de la maison. Home Assistant, c&rsquo;est le truc par lequel tout passe chez moi : les lumières, les volets, la piscine, et même l&rsquo;état de mes serveurs. Et je peux pas vous parler de domotique sans commencer par lui.</p>
<h2>Home Assistant, c&rsquo;est quoi</h2>
<p>C&rsquo;est le cerveau de la maison. Un logiciel libre que tu fais tourner chez toi, sur ta machine, qui va parler à tous tes appareils connectés quelle que soit leur marque et leur techno, et te donner un seul endroit pour tout voir et tout piloter. Pas de cloud obligatoire, pas d&rsquo;abonnement, pas de service qui ferme dans deux ans en emportant tes ampoules avec lui.</p>
<p>Tu branches ta box, ton imprimante, tes prises, tes capteurs, ta voiture, et tout ça se retrouve au même endroit. Après, tu fais ce que tu veux avec : des tableaux de bord, des automatisations, des notifications.</p>
<h2>Le pilier, parce que tout passe par là</h2>
<p>J&rsquo;ai des Alexa à la maison (oui, je préférerais ne pas en avoir, mais compliqué d&rsquo;avoir mieux pour le moment). Elles communiquent avec Home Assistant. Et c&rsquo;est là qu&rsquo;est toute l&rsquo;astuce : <strong>je mets pas mes appareils sur Alexa, je mets Home Assistant sur Alexa</strong>. Une seule intégration, et tout ce que connaît Home Assistant devient pilotable à la voix. Le jour où je change d&rsquo;assistant vocal, je change une brique, pas cinquante appareils.</p>
<p>Pareil pour le reste. Je dois contrôler l&rsquo;état d&rsquo;un appareil, faire une action, ou même surveiller un de mes serveurs du home lab, c&rsquo;est Home Assistant qui gère. Il est au centre, et tout le reste se branche dessus.</p>
<h2>Grosso modo, mon install</h2>
<p>J&rsquo;ai des relais de différentes marques, du wifi et du Zigbee (si ça vous parle pas, j&rsquo;y reviendrai dans un billet dédié). Je vais pas vous détailler tout ce que j&rsquo;ai, sinon l&rsquo;article fera 200 pages lol, je garde pour la suite. Mais un petit exemple : je contrôle toutes mes lumières, mes volets, les températures. Et même ma piscine (je vis à la campagne, ça donne certains avantages <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ).</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="759" decoding="async" src="https://smea.tech/img/u/2026/08/home-assistant-tableau-de-bord.png/_inside_1560__.webp" alt="Tableau de bord Home Assistant : les lumières de chaque pièce, les volets, les températures intérieures et extérieures, et un bloc piscine avec température, pH, ORP et chlore libre" /><figcaption>Une seule page : les lumières, les volets, les températures, et la piscine avec son pH et son chlore.</figcaption></figure>
<p>On peut aussi gérer sa consommation électrique. Avec des appareils dédiés, ou sans : on peut remonter les infos Enedis directement (je vous en parlerai aussi, même si finalement je m&rsquo;en sers plus, j&rsquo;ai la donnée en direct).</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="762" decoding="async" src="https://smea.tech/img/u/2026/08/home-assistant-energie.png/_inside_1560__.webp" alt="Onglet Énergie de Home Assistant : consommation électrique de la journée, production solaire, distribution d'énergie et taux d'autosuffisance" /><figcaption>L&rsquo;onglet Énergie : ce que je consomme, ce que je produis, et ce que je renvoie au réseau.</figcaption></figure>
<h2>La domotique ne s&rsquo;arrête pas au physique</h2>
<p>C&rsquo;est là que je voulais en venir. Une ampoule connectée ou un volet, c&rsquo;est vrai que c&rsquo;est assez facile à imaginer. Mais tout ce qui est virtuel rentre dedans aussi.</p>
<p>L&rsquo;état d&rsquo;un serveur Minecraft. Ta télé connectée. Plex, Jellyfin. Ton imprimante. L&rsquo;état de ton PC, ou de ton home lab. Tous les services que renvoie internet. Moi je reçois un mail, et ça déclenche une action ailleurs dans la maison.</p>
<p>Le plus simple, c&rsquo;est d&rsquo;installer et de regarder ce qu&rsquo;il trouve tout seul sur votre réseau. Vous serez étonnés de découvrir la quantité de choses connectables que vous avez déjà, sans même le savoir. Il les trouve pour vous.</p>
<h2>Pourquoi Home Assistant et pas autre chose</h2>
<p>Parce qu&rsquo;il est simple, convivial et facile à prendre en main. Et parce qu&rsquo;il y a des milliers d&rsquo;intégrations. Une intégration, c&rsquo;est le module pour brancher un truc : ta Freebox, ton imprimante, un réseau Zigbee, ta voiture. Il fait toute la logique pour chaque appareil, tu as juste à remplir deux champs.</p>
<p>Rien que dans les intégrations officielles, on trouve son bonheur. Ensuite tu rajoutes les modules communautaires (je vous parlerai de HACS plus tard) et là, tu vois un truc qui existe, tu peux être sûr qu&rsquo;un mec l&rsquo;a branché mdr.</p>
<p>Et tu rajoutes encore ce qu&rsquo;ils appellent les apps : en gros des conteneurs Docker préconfigurés pour Home Assistant, qui ont eux aussi leurs propres modules communautaires. À ce stade, ton Home Assistant peut à peu près tout faire.</p>
<h2>Comment l&rsquo;installer : pas en Docker</h2>
<p>Alors même si tu peux le faire tourner en conteneur, je le déconseille. Pourquoi ? Parce que Home Assistant, c&rsquo;est pas juste une appli, c&rsquo;est un ensemble d&rsquo;outils. Et ils proposent Home Assistant OS, qui s&rsquo;installe facilement sur une machine monocarte (64 bits uniquement depuis peu), une VM, ou un vieux laptop ou PC qui traîne.</p>
<p>Une mini machine N100 serait parfaite. Un gros PC bien puissant juste pour Home Assistant, c&rsquo;est peut-être un peu trop, mais ça serait super : ça consomme tellement peu que tu peux mutualiser (le mien, je l&rsquo;ai gardé pour Jellyfin). Chez moi, c&rsquo;est Home Assistant OS sur un Raspberry Pi 4.</p>
<p>L&rsquo;intérêt de l&rsquo;OS, c&rsquo;est justement de proposer ces fameuses apps (on disait add-ons il y a encore quelques mois) qui permettent de centraliser tous les outils liés à la domotique sur la machine Home Assistant : un serveur MQTT, la passerelle Zigbee, ce genre de choses. J&rsquo;y reviendrai aussi.</p>
<p>Pour l&rsquo;installer, c&rsquo;est <a href="https://www.raspberrypi.com/software/">Raspberry Pi Imager</a>, tu choisis Home Assistant OS, et c&rsquo;est parti.</p>
<p>Et oui, je déroge à ma règle du tout-Portainer. Mais ici c&rsquo;est particulier, ça se justifie (le seul autre qui déroge, c&rsquo;est <a href="https://smea.tech/openmediavault-nas-maison/">mon NAS</a> lol).</p>
<h2>Essayez, même juste pour voir</h2>
<p>Je vous conseille fortement d&rsquo;essayer, même dans une VM VirtualBox, rien que pour découvrir ce qui est connectable chez vous. Et je sais qu&rsquo;il y en a forcément.</p>
<p>Après, vous aurez envie d&rsquo;avoir des lumières, des interrupteurs et tout le reste (promis, vous aurez un billet dédié aux relais). Et ça, ça va vous changer la vie.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/home-assistant-pilier-domotique/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/home-assistant-entete-v2.png/_inside_1024_683_.webp" length="1778820" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/home-assistant-entete-v2.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Ma stack : à la base de tout, il y a Portainer</title>
		<link>https://smea.tech/ma-stack-portainer/</link>
					<comments>https://smea.tech/ma-stack-portainer/#respond</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 11:48:16 +0000</pubDate>
				<category><![CDATA[Technos]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[home-lab]]></category>
		<category><![CDATA[portainer]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=37</guid>

					<description><![CDATA[Avant les outils sympas, il faut la machine qui les fait tourner. Chez moi : une petite bécane sous Linux, Docker, et Portainer par-dessus pour tout piloter.]]></description>
										<content:encoded><![CDATA[<p>Avant de vous présenter les outils sympas, il faut parler de ce qui les fait tourner. Chez moi c&rsquo;est une petite machine sous Linux, Docker dessus, et Portainer par-dessus pour tout piloter. Pas hyper sexy comme sujet, faut l&rsquo;avouer. Mais sans ça, rien ne marche.</p>
<h2>Il faut une machine qui tourne, pas forcément une grosse</h2>
<p>80 % des outils techniques que je vais vous présenter s&rsquo;exécutent sur un serveur. Souvent un tout petit : un Raspberry Pi (bon, ok, les vieux RPi 32 bits sont en fin de vie), une machine pourrie qui traîne, un vieux laptop. Un serveur dédié si vous y mettez le prix. Dans tous les cas il faut un truc qui tourne en permanence pour avoir un home lab.</p>
<p>Et je maintiens que garder son PC fixe ultra puissant allumé, avec toute sa config, juste pour faire tourner <a href="https://smea.tech/pop3-to-smtp-remplace-gmail/">un serveur de redirection de mail</a> ou un lecteur de comics et d&rsquo;ebooks, c&rsquo;est peut-être pas la meilleure des idées. Attention, je dis pas qu&rsquo;on peut pas. Mais bon.</p>
<p>On trouve des N100 (le petit processeur Intel), des RPi reconditionnés pas chers, des cartes monocarte pas trop chères, même si la crise de la RAM est passée par là. Et ça vaut vraiment le coup : pour pas grand-chose, t&rsquo;as un home lab de fou.</p>
<h2>Une distrib Linux, Docker, et rien d&rsquo;autre</h2>
<p>Un PC pour un home lab c&rsquo;est bien, mais tu mets quoi dessus pour avoir des services cool ? Allez, on va coller un bon gros Windows qui te bouffera 50 % de ta RAM juste pour exister. Je plaisante à moitié, y en a qui le font.</p>
<p>Moi c&rsquo;est simple : une mini distrib Linux. Debian, Ubuntu, Red Hat, ce que tu veux, à la limite on s&rsquo;en fout. Et Docker dessus, avec docker compose, le petit outil pour tout ranger. Rien d&rsquo;autre.</p>
<p>Je vais pas vous détailler dans cet article tout ce que fait Docker. En gros c&rsquo;est des containers, comme des VM, sauf que tu vires toute la couche matérielle, l&rsquo;émulation du proco et compagnie. Tu fais juste tourner un OS dans ton OS, au niveau machine. C&rsquo;est transparent, ça vit tout seul dans son coin.</p>
<h2>Administrer tout ça à la main, c&rsquo;est la merde</h2>
<p>Sauf que le jour où tu commences à empiler les conteneurs, les administrer, c&rsquo;est la merde. Et là on prend quoi ? Je te le fais dans le mille : comme le titre de l&rsquo;article le dit, on prend Portainer.</p>
<p>Alors première question, pourquoi Portainer et pas K8s ou un autre orchestrateur ultra balèze ? Et bien parce que je suis tout seul. C&rsquo;est assez simple, et même si j&rsquo;utilise même pas 50 % de ce qu&rsquo;il propose (tu vas me dire, on fait tous ça avec Word depuis des années et ça n&rsquo;a jamais dérangé personne), on s&rsquo;y retrouve, on contrôle ce qui se passe, et c&rsquo;est plutôt facile.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="740" decoding="async" src="https://smea.tech/img/u/2026/08/portainer-tableau-de-bord.png/_inside_1560__.webp" alt="Tableau de bord de Portainer : 22 stacks, 30 conteneurs dont 30 en fonctionnement, 47 images, 9 volumes, 18 réseaux" /><figcaption>Le tableau de bord : tout ce qui tourne sur la machine, sur un seul écran.</figcaption></figure>
<h2>Une stack par outil</h2>
<p>En gros tu fabriques une stack par outil. Une stack, c&rsquo;est quoi ? C&rsquo;est juste ce qui regroupe ton compose.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="615" decoding="async" src="https://smea.tech/img/u/2026/08/portainer-liste-des-stacks.png/_inside_1560__.webp" alt="Liste des stacks dans Portainer : audiobookshelf, filebrowser, ftp, immich, kavita, komga, music-assistant, musicbrainz" /><figcaption>Une ligne par outil, avec la date de déploiement et l&rsquo;état des images.</figcaption></figure>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="730" decoding="async" src="https://smea.tech/img/u/2026/08/portainer-editeur-compose.png/_inside_1560__.webp" alt="Éditeur de compose dans Portainer, avec le fichier YAML du service filebrowser" /><figcaption>Derrière chaque stack, l&rsquo;éditeur : c&rsquo;est ton docker-compose.yml, éditable dans le navigateur.</figcaption></figure>
<p>Tu récupères le compose dans la doc de l&rsquo;outil que tu veux monter, tu le colles, et ça démarre ou pas. Au pire, maintenant, tu te fais aider par Claudio (faudra que je parle de Claude un jour), il te fera très bien les choses. Ou son équivalent gratos, lol.</p>
<p>Et il te met tous les services dont t&rsquo;as besoin. Ton outil a besoin d&rsquo;une base de données dans telle version, c&rsquo;est bon. D&rsquo;un serveur web intégré, c&rsquo;est bon. De l&rsquo;outil lui-même, c&rsquo;est bon. Une petite redirection de port, un <a href="https://smea.tech/domaines-apps-nginx-proxy-manager/">serveur proxy pour taper dessus avec un nom de domaine</a>, et hop, t&rsquo;as ton outil. C&rsquo;est trop bien.</p>
<h2>La version entreprise, gratuite pour un usage perso</h2>
<p>Petit bonus : tu peux avoir la version Business gratos pour un usage perso. Comme ça tu vois les mises à jour d&rsquo;image et tout le reste. Sur la capture des stacks, la pastille orange au bout de chaque ligne, c&rsquo;est exactement ça : une image plus récente est dispo.</p>
<p>Bon, c&rsquo;est pas K8s, et je gère quand même pas mal de trucs à la main. Mais ça simplifie grandement la vie.</p>
<h2>Le seul compose que tu lanceras à la main</h2>
<p>Je vous file <a href="https://docs.portainer.io/start/install/server/docker/linux">la doc d&rsquo;installation</a>, et un compose tout simple. C&rsquo;est le seul que tu démarreras toi-même avec un <code>docker compose up</code> : tous les suivants passeront par l&rsquo;interface.</p>
<pre><code>services:
  portainer:
    image: portainer/portainer-ee:latest
    container_name: portainer
    restart: always
    ports:
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:
</code></pre>
<p>Attention à l&rsquo;image : <code>portainer/portainer-ee</code>, c&rsquo;est celle de la version Business, celle qui attend une clé de licence (la perso, gratuite, que tu demandes sur leur site). Si tu veux rester sur l&rsquo;édition communautaire, tu ne charges pas <code>ee</code>, tu prends l&rsquo;autre image, <code>portainer/portainer-ce:latest</code>. C&rsquo;est le même compose, juste cette ligne qui change.</p>
<p>Le volume <code>/var/run/docker.sock</code> n&rsquo;est pas un détail : c&rsquo;est par là que Portainer parle à Docker, donc c&rsquo;est ce qui lui donne la main sur toute la machine. À garder en tête avant d&rsquo;exposer l&rsquo;interface au grand large.</p>
<p>Après le <code>docker compose up -d</code>, tu ouvres <code>https://127.0.0.1:9443</code>, tu suis les consignes, emballé c&rsquo;est pesé.</p>
<h2>Sans cette base, le reste n&rsquo;a pas de sens</h2>
<p>Comme je le disais, c&rsquo;est pas hyper sexy comme article. Mais sans cette base, tout le reste qui devient sexy n&rsquo;a aucun sens. Ça sert à quoi que je te présente un outil si tu sais même pas comment le faire tourner ?</p>
<p>En tout cas bonne lecture à tous, et je reviens très vite avec des outils plus cool.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/ma-stack-portainer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/portainer-la-base-de-mon-home-lab.png/_inside_1024_683_.webp" length="1549113" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/portainer-la-base-de-mon-home-lab.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Pour Gmail, POP3 est mort. Vive POP3</title>
		<link>https://smea.tech/pop3-to-smtp-remplace-gmail/</link>
					<comments>https://smea.tech/pop3-to-smtp-remplace-gmail/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 20:55:00 +0000</pubDate>
				<category><![CDATA[Réalisations]]></category>
		<category><![CDATA[auto-hébergement]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[pop3]]></category>
		<category><![CDATA[smtp]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=30</guid>

					<description><![CDATA[Gmail ferme la relève POP3 des boîtes externes. J'ai fait un conteneur qui relève et réexpédie à ma place, avant de me retrouver le bec dans l'eau.]]></description>
										<content:encoded><![CDATA[<p>Gmail ferme la relève POP3 des boîtes externes. La configuration déjà en place tient encore, mais impossible d&rsquo;en ajouter une, et ça finira par sauter. Alors j&rsquo;ai fabriqué le remplaçant : un conteneur qui relève mes boîtes POP3 et réexpédie tout où je veux.</p>
<h2>« Protocole vieillissant et sécurité »</h2>
<p>L&rsquo;annonce est habillée comme il faut : Google retire POP3 de ses serveurs « pour des questions de protocole vieillissant et de sécurité ». Mettez les guillemets, ils comptent.</p>
<p>Franchement, c&rsquo;est surtout que ça leur coûte. Aller relever les boîtes des autres, c&rsquo;est des connexions sortantes à maintenir, des serveurs en face qui répondent mal, des erreurs à absorber. À l&rsquo;époque où il fallait arracher les gens à Free, Orange et compagnie, ça valait l&rsquo;investissement : on rapatriait tout son passé chez Gmail et on ne repartait plus. Maintenant qu&rsquo;ils ont le monopole, récupérer les mails des concurrents, ils s&rsquo;en contrefichent.</p>
<h2>Moi, j&rsquo;ai des tonnes de mails à rapatrier</h2>
<p>Mon cas n&rsquo;a rien d&rsquo;original : des adresses sur mes domaines OVH, du Free, et le reste, tout ça remonte dans Gmail depuis des années par la relève POP3. Ma configuration existante marche toujours. Mais pour en ajouter une nouvelle, c&rsquo;est mort. Et comme c&rsquo;est voué à disparaître, le jour où ils coupent pour de bon, je me retrouve le bec dans l&rsquo;eau avec des boîtes que plus personne ne relève.</p>
<p>Attendre ce jour-là pour chercher une solution, très peu pour moi. J&rsquo;ai donc écrit l&rsquo;outil : <a href="https://github.com/Smeagolworms4/pop3_to_smtp">pop3_to_smtp</a>.</p>
<h2>Ce que faisait Gmail, mais pas que vers Gmail</h2>
<p>Le principe tient en une phrase : ça relève un mail en POP3 et ça l&rsquo;envoie à une autre adresse, comme une redirection. Exactement le boulot que Gmail s&rsquo;apprête à arrêter de faire.</p>
<p>La différence, c&rsquo;est la destination : le serveur SMTP se configure, celui qu&rsquo;on veut. Gmail si on y tient, ou tout autre. Et le message part intact : expéditeur d&rsquo;origine, signature DKIM préservée, pièces jointes conservées. Ce n&rsquo;est pas un transfert qui réécrit tout au nom du relais, c&rsquo;est un relais.</p>
<figure>
  <img srcset="https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_480__.webp 480w, https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_768__.webp 768w, https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_1024__.webp 1024w, https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_1280__.webp 1280w, https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_1560__.webp 1560w" sizes="(max-width: 820px) 100vw, 780px" width="1560" height="775" decoding="async" src="https://smea.tech/img/u/2026/08/pop3-to-smtp-interface.png/_inside_1560__.webp" alt="Interface web de pop3_to_smtp : la liste des boîtes relevées à gauche, les destinations SMTP à droite" /><figcaption>L&rsquo;interface : les boîtes relevées d&rsquo;un côté, les destinations de l&rsquo;autre, et l&rsquo;historique de chaque relève.</figcaption></figure>
<p>Le reste se fait à la souris : ajouter une boîte, ajouter une destination, tester les réglages avant d&rsquo;enregistrer, forcer une relève tout de suite au lieu d&rsquo;attendre le prochain passage. Le bouton « Tester » m&rsquo;a évité pas mal d&rsquo;allers-retours. Un mot de passe d&rsquo;application refusé, on le voit sur place plutôt qu&rsquo;en fouillant des logs.</p>
<h2>Les notifications, le vrai confort</h2>
<p>Une redirection de mails qui tombe en panne sans rien dire, c&rsquo;est le pire scénario. On ne s&rsquo;aperçoit de rien pendant des semaines, jusqu&rsquo;au jour où on cherche un message qui n&rsquo;est jamais arrivé.</p>
<p>Du coup on peut recevoir des notifications sur son téléphone ou ailleurs quand ça foire : par mail, par ntfy, par webhook générique, ou par SMS avec l&rsquo;API Free Mobile. Par défaut, seules les défaillances déclenchent une alerte. On peut aussi se faire prévenir à chaque succès, mais on s&rsquo;en lasse vite.</p>
<h2>Ça se déploie en Docker, et ça tourne sur un Raspberry Pi</h2>
<p>Je ne vais pas vous dérouler la doc d&rsquo;installation ici, c&rsquo;est du Docker et on en reparlera une autre fois. Promis, je vous ferai un article sur Portainer, Docker et toute ma stack. En résumé : une image, un volume pour les données, un port pour l&rsquo;interface.</p>
<pre><code>docker run -d --name pop3_to_smtp \
  -p 8080:8080 \
  -v ./data:/data \
  -e WEB_USER=admin \
  -e WEB_PASSWORD=un_mot_de_passe_solide \
  smeagolworms4/pop3_to_smtp:latest</code></pre>
<p>L&rsquo;image est publiée pour amd64 et pour arm64, donc pour les petits RPi aussi : j&rsquo;essaie de penser à eux. Un relais de mails qui tourne toute la journée, c&rsquo;est typiquement le genre de service qui n&rsquo;a rien à faire sur une grosse machine.</p>
<p>Pensez quand même à sécuriser l&rsquo;accès. Il y a des variables pour ça, <code>WEB_USER</code> et <code>WEB_PASSWORD</code>, et ce n&rsquo;est pas optionnel : l&rsquo;interface contient les identifiants de toutes vos boîtes. Chez moi c&rsquo;est mon SSO qui fait le boulot en amont, mais tout le monde n&rsquo;a pas un SSO sous la main.</p>
<h2>Chez moi, les deux tournent en même temps</h2>
<p>Je n&rsquo;ai pas fait sauter ma configuration Gmail : tant qu&rsquo;elle tient, elle tient. Les deux font donc le même job en ce moment. Mais le jour où Gmail fera feu, moi je serai déjà bien caché à l&rsquo;abri.</p>
<p>Le code est ouvert et je suis ouvert aux suggestions. Il y a sûrement des cas d&rsquo;usage auxquels je n&rsquo;ai pas pensé, et des serveurs POP3 exotiques qui vont me sortir des surprises. Je vous laisse essayer.</p>
<p style="font-family:var(--font-mono);font-size:12px;color:var(--muted);">Image d&rsquo;en-tête générée par IA.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/pop3-to-smtp-remplace-gmail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/rip-pop3-gmail.png/_inside_1024_683_.webp" length="2363294" type="image/png" />
		<media:content url="https://smea.tech/img/u/2026/08/rip-pop3-gmail.png/_inside_1024_683_.webp" medium="image" width="1024" height="683" type="image/png" />
	</item>
		<item>
		<title>Bienvenue chez moi : 30 ans de tech, et enfin un endroit pour en parler</title>
		<link>https://smea.tech/bienvenue-presentation-blog/</link>
					<comments>https://smea.tech/bienvenue-presentation-blog/#comments</comments>
		
		<dc:creator><![CDATA[SmeagolWorms4]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 19:40:00 +0000</pubDate>
				<category><![CDATA[Actu]]></category>
		<category><![CDATA[amstrad]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[domotique]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[presentation]]></category>
		<guid isPermaLink="false">https://smeagol.info/?p=10</guid>

					<description><![CDATA[Ça fait des années que je cherche un endroit où poser tout ce que je fabrique. Voilà, c'est fait : ce blog est à moi, et je suis assez fier d'en arriver là. Petit tour du propriétaire, histoire que tu saches qui écrit et ce que tu vas trouver ici.]]></description>
										<content:encoded><![CDATA[<p>Sur le web, mon pseudo c&rsquo;est <strong>SmeagolWorms4</strong>. C&rsquo;est comme ça que je signe, toujours, partout — pas Smeagol tout court, parce que comme tu t&rsquo;en doutes, celui-là était déjà pris ^^. Ceci dit, la plupart des gens raccourcissent en <strong>Smea</strong> ^^.</p>
<h2>Basic 1.0 / Écran bleu et texte jaune</h2>
<p>J&rsquo;ai codé mon premier jeu vidéo à 8 ans, sur un Amstrad CPC 6128 — une machine qui avait déjà sûrement dix ans d&rsquo;existence à l&rsquo;époque, j&rsquo;avoue que je n&rsquo;ai pas compté. C&rsquo;était un morpion. Bête et tout simple, mais il marchait — fallait juste 30 secondes pour dessiner la croix, mdr.</p>
<p>Ça fait maintenant plus de 20 ans que je bosse dans la tech. Entre les deux, j&rsquo;ai touché à vraiment toutes les technos, sans distinction. J&rsquo;ai mes amours — le JS, j&rsquo;adore, et ça se verra ici — mais je n&rsquo;ai jamais été du genre à me ranger dans une seule chapelle. Un bon outil est un bon outil, peu importe le langage sur la boîte.</p>
<p>Quand je dis vraiment tout, c&rsquo;est vraiment tout. Du Java, en écrivant des mods Minecraft. Du PHP, où j&rsquo;ai bossé sur les tout premiers frameworks — avant même que le mot « framework » soit connu du commun des développeurs. Du Python, du .NET, de l&rsquo;assembleur. Et même du Lisp et du Cobol, j&rsquo;avoue que j&rsquo;ai un peu envie d&rsquo;oublier cette partie-là, lol.</p>
<h2>Pourquoi un blog, et pas ailleurs</h2>
<p>Le problème, c&rsquo;est que je n&rsquo;ai jamais eu d&rsquo;espace pour parler de tout ça. Sur Reddit, c&rsquo;est le bordel : le fil intéressant est noyé sous trois pages de bruit, et ce que tu écris a disparu le lendemain. Il y a bien de très bons Discord, mais aucun généraliste — chacun son sujet, sa techno, sa chapelle. Du coup c&rsquo;est un peu nul quand tu veux juste parler de ce que tu bricoles, quel que soit le sujet du jour.</p>
<p>Ici, ce sera ce que je veux et comme je veux. Pas de karma, pas d&rsquo;algo, pas de modérateur qui décide que mon post n&rsquo;est pas dans le bon salon.</p>
<h2>Ce que tu vas trouver ici</h2>
<p>Concrètement : mes bouts de code, mes libs, <a href="https://smea.tech/ma-stack-portainer/">mes outils</a>, les technos que je trouve bonnes et pourquoi. Le genre de question que je me pose tous les jours au boulot — pourquoi utiliser ce pattern-là plutôt qu&rsquo;un autre à cet endroit précis du code — et sur laquelle je n&rsquo;ai jamais trouvé de réponse satisfaisante en trois lignes sur Stack Overflow.</p>
<p>Il y aura aussi des manières d&rsquo;utiliser l&rsquo;informatique, des <a href="https://smea.tech/pop3-to-smtp-remplace-gmail/">trucs que j&rsquo;ai mis en place</a> et qui me servent tous les jours, et de l&rsquo;info tech pure quand le sujet le mérite. Et à chaque fois la même chose : ce que j&rsquo;ai essayé, ce qui a coincé, et ce que j&rsquo;en ai gardé.</p>
<h2>Toute ma maison est connectée (oui, toute)</h2>
<p>Je fais énormément de <a href="https://smea.tech/home-assistant-pilier-domotique/">domotique</a>. J&rsquo;ai eu la chance de faire construire, alors j&rsquo;en ai profité pour que la maison soit pensée connectée dès le départ : j&rsquo;ai pu poser directement le bon matériel au bon endroit, et réfléchir en amont pour que tout s&#8217;emboîte. Ça évite de bricoler des rustines une fois que tout est en place.</p>
<p>Résultat : j&rsquo;en suis au point où je demande à ChatGPT ce que je pourrais bien rajouter, parce que je n&rsquo;ai plus d&rsquo;idées. Je plaisante à moitié. J&rsquo;en parlerai sûrement dans un article, voire plusieurs — il y a de quoi faire.</p>
<h2>Le gros nerd barbu derrière le clavier</h2>
<p>Parce qu&rsquo;il n&rsquo;y a pas que le code : je suis un gros fan de SF, en séries TV comme en littérature. J&rsquo;adore les mangas, mais un peu à l&rsquo;ancienne, je l&rsquo;avoue. Ajoute les comics et la culture pop par-dessus et tu obtiens le gros nerd bien barbu par excellence — et maintenant j&rsquo;en ai assez pour le dire, mdr.</p>
<p>Ça débordera forcément sur le blog de temps en temps. Autant prévenir tout de suite.</p>
<h2>Les commentaires sont ouverts — gardons-les ouverts</h2>
<p>J&rsquo;ai ouvert les commentaires, mais je sais très bien que ça peut vite devenir le bordel, et je ne veux pas passer ma vie à modérer. Alors faut être respectueux, SVP. Ça m&#8217;embêterait vraiment qu&rsquo;il n&rsquo;y ait pas de lieu d&rsquo;échange sous mes articles : c&rsquo;est souvent là que se trouve la moitié la plus intéressante d&rsquo;un billet.</p>
<p>En tout cas, bienvenue sur mon blog, et j&rsquo;espère que ce que je vais vous publier va vous plaire. Encore merci de m&rsquo;avoir lu, et bienvenue à tous. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://smea.tech/bienvenue-presentation-blog/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
				<enclosure url="https://smea.tech/img/u/2026/08/0f3bcb3f6de5720a.jpg/_inside_888_499_.webp" length="130546" type="image/jpeg" />
		<media:content url="https://smea.tech/img/u/2026/08/0f3bcb3f6de5720a.jpg/_inside_888_499_.webp" medium="image" width="888" height="499" type="image/jpeg" />
	</item>
	</channel>
</rss>
