[{"content":"Introduction MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie pour la communication entre les périphériques IoT.\nIl est utilisé fréquemment en domotique pour centraliser et automatiser des périphériques hétérogènes.\nIl nous servira de base de communication pour des prochaines articles sur la Domotique et Docker. Pour cette installation j’utilise l’image qui est présente ici : Mosquitto\nLe fichier compose.yaml Voici le fichier compose.yaml à deposer dans le répertoire contenant vos piles (par exemple /opt/docker/projects/) ou à coller dans votre interface de gestion (autre que Arcane).\nservices: mosquitto: image: eclipse-mosquitto container_name: mosquitto restart: always volumes: - /opt/docker/data/mosquitto/config:/mosquitto/config:rw - /opt/docker/data/mosquitto/data:/mosquitto/data:rw - /opt/docker/data/mosquitto/log:/mosquitto/log:rw ports: - 8102:1883 #default mqtt port - 8103:9001 #default mqtt port for websockets environment: - PUID=1000 - PGID=1000 - TZ=Europe/Paris networks: - mqtt_network networks: mqtt_network: external: true name: mqtt_network Vous devrez adapter ce fichier en personnalisant les parametres suivants :\nports : J\u0026rsquo;utilise des ports alternatif en entrée : 1802 et 1803. networks : Je choisis le nom du réseau qui servira de lien à tous les autres images Docker relié au broker MQTT PUID/GUID : A adapter à l\u0026rsquo;utilisateur de lancement de l\u0026rsquo;image Docker volumes : la configuration doit être accessible depuis l\u0026rsquo;exterieur Je sauvegarde le fichier compose.yaml sans créer pour le moment le container.\nCreation de la configuration Il faut créer le fichier de configuration mosquitto.conf dans votre répertoire de configuration.\nSi on se refaire au ficher compose, il se trouve dans mon exemple dans \u0026ldquo;/opt/docker/data/mosquitto/config\u0026rdquo;\nSi le répertoire n\u0026rsquo;existe pas ; créer le et copier le contenu suivant dans le fichier mosquitto.conf.\nallow_anonymous false listener 8102 listener 8103 protocol websockets persistence true password_file /mosquitto/config/pwfile persistence_file mosquitto.db persistence_location /mosquitto/data J\u0026rsquo;ai repris les même ports que ceux du fichier compose. Je choisis un accés sécuriser au broker via un nom d\u0026rsquo;utilisateur et un mot de passe.\nRemarque : Si vous ne souhaitez pas sécuriser les accès au broker, changer la variable \u0026ldquo;allow_anonymous\u0026rdquo; à \u0026ldquo;true\u0026rdquo;. Dans ce cas vous pourrez sauter tous ce qui suit et lancer simplement le container.\nIl reste maintenant à créer un fichier pwfile vide via la commande touch opt/docker/data/mosquitto/config/pwfile (à adapter suivant votre fichier compose).\nLancement container et création utilisateur On déploi l\u0026rsquo;image soit en ligne de commande : sudo docker compose up -d ; soit via votre interface de gestion.\nIl faut maintenant créer un utilisateur, pour cela on lance un shell dans le container : docker exec -it \u0026lt;nom_image\u0026gt; /bin/sh\nOn tape ensuite la commande suivante : mosquitto_passwd -c /mosquitto/config/pwfile votre_utilisateur en remplacant \u0026ldquo;votre_utilisateur\u0026rdquo; pour le nom d\u0026rsquo;utilisateur que vous souhaitez créer.\nAprés avoir valider la commande ; il vous est demandé de rentrer un mot de passe pour cet utilisateur.\nC\u0026rsquo;est cet utilisateur et ce mot de passe qui vous sera nécessaire pour communiquer avec le broker MQTT.\n","date":"2026-07-27T00:00:00Z","image":"/p/installer-mosquitto/mos.png","permalink":"/p/installer-mosquitto/","title":"Installer Mosquitto"},{"content":"Introduction Parfois, il est necessaire d\u0026rsquo;arrêter certains services pour effectuer des travaux divers. Nous allons utiliser une image docker basique pour afficher une page de maintenance configurable dans un fichier compose.yaml.\nIl suffira dans NPM de rediriger votre domaine en maintenance vers cette page le temps de vos travaux.\nPour cette installation j’utilise cette image qui est présente ici : Simple maintenance page\nLe fichier compose.yaml Voici le fichier compose.yaml à deposer dans le répertoire contenant vos piles (par exemple /opt/docker/projects/) ou à coller dans votre interface de gestion (autre que Arcane).\nservices: maintenance: image: wickerlabs/maintenance container_name: maintenance environment: HEADLINE: \u0026#34;Maintenance serveur....\u0026#34; TEAM_NAME: \u0026#34;Yannick Informatik\u0026#34; TITLE: \u0026#34;Oops!\u0026#34; MAIL_ADDRESS: \u0026#34;contact@yannickinformatik.fr\u0026#34; LINK_COLOR: \u0026#34;#dc8100\u0026#34; THEME: \u0026#34;Light\u0026#34; PORT: 8080 RESPONSE_CODE: \u0026#34;503 Service Unavailable\u0026#34; MESSAGE: \u0026#34;16 Juillet 2026 - Travaux en cours : Changement d\u0026#39;architecture et de moteur de blog...\u0026#34; CONTACT_LINK: \u0026#34;contact@yannickinformatik.fr\u0026#34; ports: - 8100:8080 Vous devrez adapter ce fichier en personnalisant le message affiché et le code HHTP retourné par le serveur. Vous pouvez aussi ajuster le port d\u0026rsquo;entré (8100 chez moi pour éviter les conflits potentiels sur le port 8080).\nTest de la page de maintenance Sélectionner l\u0026rsquo;hôte proxy à modifier sur NPM et faite le pointer vers le nouvel hôte sur le port 8100.\nVous devriez tomber sur cette page :\n","date":"2026-07-26T00:00:00Z","image":"/p/page-de-maintenance-web/mnt.png","permalink":"/p/page-de-maintenance-web/","title":"Page de maintenance Web"},{"content":"Introduction Bien que NPM utilise Nginx ; il utilise son propre format de log ; ce qui le rend incompatible avec des outils tiers d\u0026rsquo;analyse de logs comme \u0026ldquo;fail2ban\u0026rdquo;\nLa personnalisation du format des logs n\u0026rsquo;est pas possible par l\u0026rsquo;interface de NPM ; il faudra donc les modifiers via un fichier de configuration accesible via un volume monté dans le fichier compose.yaml de NPM (voir Installation de Nginx Proxy Manager)\nAjout d\u0026rsquo;un template de log alternatif Le volume monté \u0026ldquo;/opt/docker/data/npm\u0026rdquo; rend accessible les répertoires de configurations de bases de NPM.\nNous allons créer un fichier \u0026lsquo;http_top.conf\u0026rsquo; dans le répertoire \u0026ldquo;nginx/custom\u0026rdquo; dont le contenu sera le suivant :\nlog_format nom_log \u0026#39;$remote_addr $remote_user [$time_local] \u0026#34;$request\u0026#34; $status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#34;$http_user_agent\u0026#34; $host\u0026#39;; Il faudra changer le paramètre \u0026ldquo;nom_log\u0026rdquo; à votre convenance. Le template est au format standard \u0026lsquo;Nginx\u0026rsquo; ; mais je lui rajoute le parametre \u0026lsquo;$host\u0026rsquo; en fin de ligne pour afficher l\u0026rsquo;URL demandée lors d\u0026rsquo;une requête au serveur proxy NPM.\nUtilisation du log alternatif dans vos hôtes proxy Pour chacun de vos hôtes proxy pour laquel vous souhaitez personnalisé les fichiers de log, il faudra allez dans la partie \u0026ldquo;Configuration Nginx personnalisé\u0026rdquo; et y ajouter la ligne suivante access_log /data/logs/dockerlab.log nom_log;\nRemarque : J\u0026rsquo;ai monté un volume \u0026ldquo;/data/logs\u0026rdquo; pour pouvoir générer mes logs en dehors du container Docker pour qu\u0026rsquo;ils puissent être analyser par dse outils tiers sur mon hôte docker.\nIl faut relancer votre container npm pour que les modifications soient prise en compte.\n","date":"2026-07-26T00:00:00Z","image":"/p/personnaliser-ses-logs-avec-nginx-proxy-manager/npm_log.png","permalink":"/p/personnaliser-ses-logs-avec-nginx-proxy-manager/","title":"Personnaliser ses logs avec Nginx Proxy Manager"},{"content":"Introduction Arcane est une interface web moderne pour gérer facilement vos images réseaux et containers Docker. Ils est multi hôte, grace à un systeme d\u0026rsquo;agent ou via la création d\u0026rsquo;uncluster Swarn. Pour cette installation j’utilise l’image officielle qui est présente ici : Arcane\nLe fichier compose.yaml Voici le fichier compose.yaml à deposer dans le répertoire contenant vos piles (par exemple /opt/docker/projects/) ou à coller dans votre interface de gestion (autre que Arcane).\nservices: arcane: image: ghcr.io/getarcaneapp/arcane:latest container_name: arcane ports: - 3552:3552 volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/docker/data/arcane:/app/data - /opt/docker/projects:/opt/docker/projects # doit être identique à gauche et à droite environment: - APP_URL=http://localhost:3552 - PROJECTS_DIRECTORY=/opt/docker/projects # doit être identique au volume monté - PUID=1000 - PGID=1000 - TZ=Europe/Paris - ENCRYPTION_KEY=secret_key - JWT_SECRET=secret_jwt restart: unless-stopped Vous devrez adapter ce fichier à votre environnement de travail Docker. J\u0026rsquo;utilise le chemin /opt/docker/data/mon_container pour tous mes containers docker. PROJECTS_DIRECTORY : Contient le chemin de vos piles dockers (doit être identique au volume monté si vous souhaiter déposer vos piles à la main dans le repertoire projet). ENCRYPTION_KEY : Votre clé secrête (voir plus bas). JWT_SECRET : Votre jeton secret (voir plus bas). PUID/GUID : L\u0026rsquo;utilisateur utilisé pour lancer le container. Pour créer la clé secrête et le jeton, ouvrez une ligne de commande et taper la commande openssl rand -base64 32 deux fois et recopier les valeurs obtenues.\nUne fois le fichier créer ; déployer l\u0026rsquo;image soit en ligne de commande : sudo docker compose up -d ; soit via votre interface de gestion. Vous pouvez maintenant accèder à l\u0026rsquo;interface de NPM : http://votreip:3552\nConfiguration 1er Lancement Il faut dans un premier temps créer un compte Administrateur :\nUne fois le compte créé, vous arrivez au niveau du tableau de Bord : L\u0026rsquo;onglet environnement contient les différents hôte géré par Arcane :\nAjour d\u0026rsquo;un hôte distant Arcane permet de gérer sur une même interface des hôtes locaux et distants.\nNous allons ajouter un hôte distant ; pour cela un click sur \u0026ldquo;Ajouter Environnement\u0026rdquo; :\nIl faut renseigner l\u0026rsquo;adresse IP de votre hôte distant. Une fois le formulaire rempli, cliquez sur \u0026ldquo;Générer la configuration de l\u0026rsquo;agent\u0026rdquo;\nIl vous proposera le fichier compose.yaml à déployer sur votre serveur distant. Je n\u0026rsquo;utilise pas celui proposé, mais noté bien par contre la clé API généré par Aracne.\nLe fichier compose de l\u0026rsquo;hôte distant J\u0026rsquo;ai constaté un problème de communication entre Arcane et son agent en utilisant l\u0026rsquo;image Docker proposé dans le fichier compose.yaml généré par l\u0026rsquo;interface Arcane. J\u0026rsquo;utilise un fichier compose légèrement différent, en selectionnant une image différente que celle proposée à l\u0026rsquo;étape précèdante.\nservices: arcane-agent: image: ghcr.io/getarcaneapp/arcane-headless:latest container_name: arcane-agent restart: unless-stopped environment: - AGENT_MODE=true - EDGE_TRANSPORT=poll - AGENT_TOKEN=votre-token-generer-precedamment - MANAGER_API_URL=http://IP_ARCANE:3552 - PROJECTS_DIRECTORY=/opt/docker/projects - PUID=1000 - PGID=1000 - TZ=Europe/Paris ports: - 3553:3553 volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/docker/data/arcane:/app/data - /opt/docker/projects:/opt/docker/projects Une fois le fichier créer ; déployer l\u0026rsquo;image soit en ligne de commande : sudo docker compose up -d ; soit via votre interface de gestion.\nRetourner sur l\u0026rsquo;interface d\u0026rsquo;Arcane et vous devriez voir votre hote passé de l\u0026rsquo;état \u0026ldquo;Pending\u0026rdquo; à \u0026ldquo;Online\u0026rdquo;\nPour des besoins d\u0026rsquo;illustrations ; sur mon interface, cet hôte se prénomme \u0026ldquo;Test Docker\u0026rdquo; :\nRecommencer la procédure autant de fois que vous avez d\u0026rsquo;hôtes distants.\n","date":"2026-07-25T00:00:00Z","image":"/p/installation-arcane/arcane.png","permalink":"/p/installation-arcane/","title":"Installation Arcane"},{"content":"Introduction NPM (Nginx Proxy Manager) propose par défaut une configuration minimale des en-têtes HTTP. En faisant un test de vulnérabilité en ligne sur https://securityheaders.com/ ; vos services web sortiront avec un mauvais score \u0026ldquo;D\u0026rdquo;. Nous allons donc utiliser un template global pour NPM afin de sécuriser l\u0026rsquo;ensemble de vos hôtes proxy.\nAjout d\u0026rsquo;un template HTST global pour NPM Modification de votre fichier compose.yaml Reprenons le fichier compose.yaml initial du précédant article Installation de Nginx Proxy Manager. Nous allons y ajouter un volume qui contiendra notre fichier de configurqtion _HTST opersonnalisé.\nservices: app: image: \u0026#39;docker.io/jc21/nginx-proxy-manager:latest\u0026#39; restart: unless-stopped container_name: npm environment: - TZ=Europe/Paris ports: - 80:80 - 81:81 - 443:443 volumes: - /opt/docker/data/npm:/data - /opt/docker/data/log:/data/logs - /opt/docker/data/npm/letsencrypt:/etc/letsencrypt - /opt/docker/data/npm/templates/_hsts.conf:/app/templates/_hsts.conf:ro # A rajouter Vous devrez adapter ce fichier à votre environnement de travail Docker. J\u0026rsquo;utilise le chemin /opt/docker/data/mon_container pour tous mes containers docker. Le fichier /opt/docker/data/npm/templates/_hsts.conf contient le templates global de modifications des en-têtes HTTP. Pour l\u0026rsquo;instant ne redemarrer pas votre container NPM.\nFichier template _htst.conf Le fichier template à rajouter est le suivant :\n{% if certificate and certificate_id \u0026gt; 0 -%} {% if ssl_forced == 1 or ssl_forced == true %} {% if hsts_enabled == 1 or hsts_enabled == true %} # HSTS (ngx_http_headers_module is required) (63072000 seconds = 2 years) add_header Strict-Transport-Security \u0026#34;max-age=63072000;{% if hsts_subdomains == 1 or hsts_subdomains == true -%} includeSubDomains;{% endif %} preload\u0026#34; always; add_header Referrer-Policy strict-origin-when-cross-origin; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34;; add_header X-Frame-Options SAMEORIGIN; add_header Content-Security-Policy upgrade-insecure-requests; add_header Permissions-Policy interest-cohort=(); add_header Expect-CT \u0026#39;enforce; max-age=604800\u0026#39;; more_set_headers \u0026#39;Server: Proxy\u0026#39;; more_clear_headers \u0026#39;X-Powered-By\u0026#39;; proxy_cookie_flags ~ Secure HttpOnly SameSite=Strict; {% endif %} {% endif %} {% endif %} Vous pouvez personnaliser la réponse du serveur via la ligne \u0026ldquo;more_set_headers \u0026lsquo;Server: Proxy\u0026rsquo;;\u0026rdquo; et remplacer \u0026ldquo;Proxy\u0026rdquo; par ce que vous souhaitez. Cette ligne permet de rendre la détection de la technonologie utilisée (NPM) plus difficile.\nUne fois ce fichier créé, vous pouvez relancer votre container NPM.\nVerification du template Vous pouvez maintenant refaire un test en ligne sur le site https://securityheaders.com/ :\nVous obtenez maintenant la note maximale \u0026ldquo;A+\u0026rdquo;.\nRemarque : Pour chaque hôte proxy il faut décocher puis recocher l\u0026rsquo;option HSTS :\n","date":"2026-07-25T00:00:00Z","image":"/p/security-headers-pour-nginx-proxy-manager/npm.png","permalink":"/p/security-headers-pour-nginx-proxy-manager/","title":"Security Headers pour Nginx Proxy Manager"},{"content":"Introduction NPM (Nginx Proxy Manager) est une image Docker contenant le proxy inverse \u0026lsquo;Nginx\u0026rsquo; et une interface WebUI permettant une configuration simple et convivial du serveur proxy. Il permet entre autres de gérer simplement les cerificats SSL via Let\u0026rsquo;s Encrypt. Pour cette installation j’utilise l’image officielle qui est présente ici : NginxProxyManager\nLe fichier compose.yaml Voici le fichier compose.yaml à deposer dans le répertoire contenant vos piles (par exemple /opt/docker/projects/) ou à coller dans votre interface de gestion (Arcane, Dockge, Portainer\u0026hellip;).\nservices: app: image: \u0026#39;docker.io/jc21/nginx-proxy-manager:latest\u0026#39; restart: unless-stopped container_name: npm environment: - TZ=Europe/Paris ports: - 80:80 # Vous pouvez spécifier l\u0026#39;IP de l\u0026#39;Hote ; Par défaut 0.0.0.0 - 81:81 # Port pour l\u0026#39;interface WebUI - 443:443 volumes: - /opt/docker/data/npm:/data - /opt/docker/data/log:/data/logs # Pour analyser les logs en dehors du container - /opt/docker/data/npm/letsencrypt:/etc/letsencrypt Vous devrez adapter ce fichier à votre environnement de travail Docker. J\u0026rsquo;utilise le chemin /opt/docker/data/mon_container pour tous mes containers docker. Le volume \u0026lsquo;/opt/docker/data/log\u0026rsquo; me permet de visualiser et d\u0026rsquo;externalyser les logs produits par NPM pour qu\u0026rsquo;ils puissent être analysés par des outils tiers (fail2ban, reaction\u0026hellip; etc). Remarque : Vous pouvez rajouter l\u0026rsquo;adresse IP de votre hôte au niveau des ports pour restreindre l\u0026rsquo;accès à votre seul hôte (exemple : 192.168.x.x:80:80). Une fois le fichier créer ; déployer l\u0026rsquo;image soit en ligne de commande : sudo docker compose up -d ; soit via votre interface de gestion. Vous pouvez maintenant accèder à l\u0026rsquo;interface de NPM : http://votreip:81\nConfiguration 1er Lancement Il faut dans un premier temps créer un compte Administrateur :\nUne fois le compte créé, vous arrivez au niveau du tableau de Bord : Création d\u0026rsquo;un certificat NPM gère la création de certificat via Let\u0026rsquo;s Encrypt. Nous utiliserons comme exemple la méthode via DNS avec l\u0026rsquo;hébergeur OVH.\nUne fois le choix sélectioné, nous arrivons sur l\u0026rsquo;écran de création du certificat pour votre domaine.\nJe choisi mon hébergeur (Provider DNS) et je choisi mon domaine.\nRemarque : J\u0026rsquo;utilise ici un wildcard \u0026lsquo;*\u0026rsquo; pour générer un certificat pour tous les sous/sous domaines de mon domaine \u0026lsquo;subdomain.domain.fr\u0026rsquo;. Le wildcard permet de cacher les services derriere le Proxy et seul les personnes connaissants le lien complet (service.subdomain.domain.fr par exemple) pourront traverser le proxy.\nChaque hébergeur à sa propre procédure de création de certificat et les informations demandées sur l\u0026rsquo;écran précédant seront différents.\nPour OVH, il faut vous connecter et aller à cette adresse : OVH Creation Token\nVous devez remplir le formulaire tel quel :\nIl faut utilisez pour chaque ligne le texte suivant : /domain/zone/*\nVous aurez en retour les 3 Tokens nécessaires à remplacer dans l\u0026rsquo;écran plus haut au niveau de la zone \u0026lsquo;Credentials File Content:\nApplication Key Application Secret Consumer Key Une fois cela fait, vous pourrez voir vos certificats au niveau du tableau de bord :\nCréation d\u0026rsquo;un hôte proxy Le hôte proxy permet d\u0026rsquo;exposer de facon sécurisé votre service interne avec le monde extérieur. Il fait le lien entre une URL externe publique et votre service privé situé derriere votre serveur proxy.\nNous allons créér un hôte proxy en prenant comme exmple le nom de domaine \u0026ldquo;exemple.subdomain.domain.fr\u0026rdquo; :\nIl vous faudra compléter la zone \u0026lsquo;Forward\u0026rsquo; de votre formulaire en ajoutant l\u0026rsquo;adresse IP de votres service interne, ainsi que son port.\nCocher aussi l\u0026rsquo;option \u0026ldquo;Block Common Exploits\u0026rdquo;\nOn passe maintenant à l\u0026rsquo;onglet \u0026lsquo;SSL\u0026rsquo; :\nSélectionner le certificat associé à votre domaine et cocher les 4 options.\nUne fois la validation du formulaire effectué ; votre service exposé apparaitra dans la liste des Hôtes proxy :\nPour aller plus loin Nous avons vus l\u0026rsquo;installation et la configuration de bases de NPM. Pour plus de sécurité et de personnalisations, il est nécessaire parfois de passer par l\u0026rsquo;édition manuelle des fichiers de configurations quand cela n\u0026rsquo;est pas possible par l\u0026rsquo;interface graphique (la personnalisation reste possible, mais est fortement limitée).\nNous verrons cela dans d\u0026rsquo;autres articles à paraitre sur le blog.\n","date":"2026-07-23T00:00:00Z","image":"/p/installation-de-nginx-proxy-manager/npm.png","permalink":"/p/installation-de-nginx-proxy-manager/","title":"Installation de Nginx Proxy Manager"}]