<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on slash-root.fr</title><link>https://slash-root.fr/post/</link><description>Recent content in Posts on slash-root.fr</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Wed, 22 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://slash-root.fr/post/index.xml" rel="self" type="application/rss+xml"/><item><title>OPNsense : Serveur WireGuard et client KDE en split tunnel</title><link>https://slash-root.fr/opnsense-serveur-wireguard-et-client-kde-en-split-tunnel/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://slash-root.fr/opnsense-serveur-wireguard-et-client-kde-en-split-tunnel/</guid><description>&lt;img src="https://slash-root.fr/opnsense-serveur-wireguard-et-client-kde-en-split-tunnel/cover.png" alt="Featured image of post OPNsense : Serveur WireGuard et client KDE en split tunnel" /&gt;&lt;p&gt;L&amp;rsquo;objectif est simple : pouvoir depuis mon laptop KDE joindre les machines du LAN derrière un OPNsense via WireGuard, sans pour autant envoyer tout mon trafic internet dans le tunnel. Autrement dit, un split tunnel propre : seul le réseau derrière le pare-feu passe par le VPN, le reste reste sur ma connexion classique.&lt;/p&gt;
&lt;p&gt;Depuis OPNsense 24.1, WireGuard est intégré au core. Plus besoin de jouer avec le plugin &lt;code&gt;os-wireguard&lt;/code&gt;, c&amp;rsquo;est déjà ça de gagné. La procédure reste assez directe, mais quelques points de routage sont à surveiller pour ne pas finir avec tout le trafic déporté sur le VPN.&lt;/p&gt;
&lt;p&gt;Voici le plan utilisé dans cet article :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LAN derrière OPNsense&lt;/strong&gt; : &lt;code&gt;192.168.1.0/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réseau du tunnel&lt;/strong&gt; : &lt;code&gt;10.10.10.0/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OPNsense (interface WireGuard, IP au sein du tunnel VPN)&lt;/strong&gt; : &lt;code&gt;10.10.10.1/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client KDE (IP au sein du tunnel VPN)&lt;/strong&gt; : &lt;code&gt;10.10.10.2/32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port UDP&lt;/strong&gt; : &lt;code&gt;51820&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; cet article traite uniquement l&amp;rsquo;&lt;strong&gt;IPv4&lt;/strong&gt;. L&amp;rsquo;&lt;strong&gt;IPv6&lt;/strong&gt; n&amp;rsquo;est pas abordé ici.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s go !!!&lt;/p&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OPNsense accessible depuis Internet : IP publique sur son interface WAN, ou redirection du port UDP &lt;code&gt;51820&lt;/code&gt; depuis le routeur amont.&lt;/li&gt;
&lt;li&gt;Le client KDE dispose de &lt;code&gt;wireguard-tools&lt;/code&gt; et d&amp;rsquo;un NetworkManager gérant nativement WireGuard (à partir de la v1.16, ça marche out of the box sur la plupart des distros récentes).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="partie-1--opnsense-le-serveur-wireguard"&gt;&lt;a href="#partie-1--opnsense-le-serveur-wireguard" class="header-anchor"&gt;&lt;/a&gt;Partie 1 : OPNsense, le serveur WireGuard
&lt;/h2&gt;&lt;h3 id="création-de-linstance"&gt;&lt;a href="#cr%c3%a9ation-de-linstance" class="header-anchor"&gt;&lt;/a&gt;Création de l&amp;rsquo;instance
&lt;/h3&gt;&lt;p&gt;On commence par générer le serveur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aller dans &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Instances&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Remplir comme suit :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enabled : Coché
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name : HomeWireGuard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Public Key : Générer via la roue crantée
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Private Key : Générer en même temps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Listen Port : 51820
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MTU : 1420 (1412 si PPPoE)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Tunnel Address : 10.10.10.1/24
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Peers : Laisser vide pour l&amp;#39;instant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disable Routes : Décoché
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le MTU de &lt;code&gt;1420&lt;/code&gt; tient compte de l&amp;rsquo;overhead d&amp;rsquo;encapsulation WireGuard (en-têtes IP/UDP/WireGuard, soit environ 60 à 80 octets). Ainsi, le paquet final reste sous les 1500 octets d&amp;rsquo;un lien Ethernet standard. En PPPoE, le MTU physique est souvent 1492, d&amp;rsquo;où la valeur &lt;code&gt;1412&lt;/code&gt;.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; si on active le mode avancé, laissez le champ &lt;strong&gt;DNS Server&lt;/strong&gt; vide. Sinon WireGuard écrase la config DNS d&amp;rsquo;OPNsense et c&amp;rsquo;est la galère.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Sauvegarder, rouvrir l&amp;rsquo;instance et &lt;strong&gt;copier la clé publique&lt;/strong&gt; générée. Elle servira à configurer le client KDE.&lt;/p&gt;
&lt;h3 id="création-du-peer-client"&gt;&lt;a href="#cr%c3%a9ation-du-peer-client" class="header-anchor"&gt;&lt;/a&gt;Création du peer client
&lt;/h3&gt;&lt;p&gt;Il faut maintenant déclarer le client. Pour ça, il faut sa clé publique. On peut la générer directement sur le client KDE (voir partie 2) et la copier ici, ou utiliser le &lt;strong&gt;Peer Generator&lt;/strong&gt; intégré à OPNsense. Moi je préfère générer les clés sur le client pour ne pas stocker la privée ailleurs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aller dans &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Peers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;+&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enabled : Coché
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name : MonPC_KDE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Public Key : &amp;lt;clé publique du client KDE&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allowed IPs : 10.10.10.2/32
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Keepalive : 25
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;code&gt;Keepalive&lt;/code&gt; à 25 secondes, c&amp;rsquo;est utile quand le client est derrière un NAT ou un pare-feu qui ferme les states trop vite.&lt;/p&gt;
&lt;p&gt;Sauvegarder, puis retourner dans &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Instances&lt;/strong&gt;, éditer &lt;code&gt;HomeWireGuard&lt;/code&gt; et sélectionner le peer &lt;code&gt;MonPC_KDE&lt;/code&gt;. &lt;strong&gt;Apply&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="méthode-alternative--le-peer-generator"&gt;&lt;a href="#m%c3%a9thode-alternative--le-peer-generator" class="header-anchor"&gt;&lt;/a&gt;Méthode alternative : le Peer Generator
&lt;/h3&gt;&lt;p&gt;Si vous devez créer plusieurs clients, ou si vous voulez générer directement le fichier de config sans taper de clés à la main, OPNsense intègre un &lt;strong&gt;Peer Generator&lt;/strong&gt; sous &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Peer generator&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner l&amp;rsquo;instance &lt;code&gt;HomeWireGuard&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remplir les champs :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name : MonPC_KDE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Endpoint Address: &amp;lt;ip_publique_ou_domaine_opnsense&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Endpoint Port : 51820
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allowed IPs : 10.10.10.2/32
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DNS : laisser vide, ou 10.10.10.1 si vous voulez utiliser le DNS d&amp;#39;OPNsense
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Generate&lt;/strong&gt;. Le générateur crée :
&lt;ul&gt;
&lt;li&gt;la paire de clés du client&lt;/li&gt;
&lt;li&gt;le peer côté OPNsense (seule la clé publique est stockée)&lt;/li&gt;
&lt;li&gt;une config prête à copier/coller ou à scanner en QR code&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt; la config générée met souvent &lt;code&gt;AllowedIPs = 0.0.0.0/0, ::/0&lt;/code&gt; côté client. Si vous voulez du split tunnel, il faut remplacer cette ligne par &lt;code&gt;AllowedIPs = 10.10.10.0/24, 192.168.1.0/24&lt;/code&gt; dans le fichier récupéré avant de l&amp;rsquo;importer dans NetworkManager. Sinon tout le trafic partira dans le tunnel.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Store and generate next&lt;/strong&gt; pour valider le peer dans OPNsense, puis &lt;strong&gt;Apply&lt;/strong&gt; dans &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Peers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La clé privée n&amp;rsquo;est pas conservée sur le firewall : copiez-la dans &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; sur le client, ou scannez le QR code depuis un téléphone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est nettement plus rapide quand il y a plusieurs road warriors à déployer.&lt;/p&gt;
&lt;h3 id="activation-de-wireguard"&gt;&lt;a href="#activation-de-wireguard" class="header-anchor"&gt;&lt;/a&gt;Activation de WireGuard
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; General&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cocher &lt;strong&gt;Enable&lt;/strong&gt;, puis &lt;strong&gt;Apply&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Si besoin, redémarrer WireGuard en le décochant/re-cochant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="assigner-une-interface-recommandé"&gt;&lt;a href="#assigner-une-interface-recommand%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Assigner une interface (recommandé)
&lt;/h3&gt;&lt;p&gt;Ce n&amp;rsquo;est pas strictement obligatoire pour un split tunnel, mais ça simplifie les règles firewall et ça crée l&amp;rsquo;alias &lt;code&gt;HomeWireGuard net&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interfaces &amp;gt; Assignments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sélectionner le device &lt;code&gt;wg1&lt;/code&gt; (ou &lt;code&gt;wg0&lt;/code&gt; selon l&amp;rsquo;installation) et l&amp;rsquo;ajouter.&lt;/li&gt;
&lt;li&gt;Description : &lt;code&gt;HomeWireGuard&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Éditer l&amp;rsquo;interface :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enable : Coché
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : HomeWireGuard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IPv4 Configuration Type : None
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IPv6 Configuration Type : None
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Save&lt;/strong&gt; puis &lt;strong&gt;Apply changes&lt;/strong&gt;. Redémarrer WireGuard si l&amp;rsquo;interface ne remonte pas proprement.&lt;/p&gt;
&lt;h3 id="règles-firewall"&gt;&lt;a href="#r%c3%a8gles-firewall" class="header-anchor"&gt;&lt;/a&gt;Règles firewall
&lt;/h3&gt;&lt;h4 id="1-autoriser-les-connexions-entrantes-sur-le-wan"&gt;&lt;a href="#1-autoriser-les-connexions-entrantes-sur-le-wan" class="header-anchor"&gt;&lt;/a&gt;1. Autoriser les connexions entrantes sur le WAN
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall &amp;gt; Rules &amp;gt; WAN&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ajouter une règle :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Action : Pass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Quick : Coché
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Interface : WAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Direction : in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Protocol : UDP
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Source : any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Destination : WAN address
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Destination port: 51820
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-autoriser-le-trafic-depuis-le-tunnel-vers-le-lan"&gt;&lt;a href="#2-autoriser-le-trafic-depuis-le-tunnel-vers-le-lan" class="header-anchor"&gt;&lt;/a&gt;2. Autoriser le trafic depuis le tunnel vers le LAN
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall &amp;gt; Rules &amp;gt; HomeWireGuard&lt;/strong&gt; (ou &lt;code&gt;WireGuard&lt;/code&gt; si vous n&amp;rsquo;avez pas assigné d&amp;rsquo;interface).&lt;/li&gt;
&lt;li&gt;Ajouter une règle :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Action : Pass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Quick : Coché
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Interface : HomeWireGuard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Protocol : any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Source : HomeWireGuard net
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Destination : LAN net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est cette règle qui autorise le client KDE à joindre les machines du LAN.&lt;/p&gt;
&lt;h3 id="normalisation-mss-optionnel-mais-fortement-recommandé"&gt;&lt;a href="#normalisation-mss-optionnel-mais-fortement-recommand%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Normalisation MSS (optionnel mais fortement recommandé)
&lt;/h3&gt;&lt;p&gt;Le &lt;strong&gt;MSS&lt;/strong&gt; (Maximum Segment Size) est la taille maximale de la charge utile d&amp;rsquo;un segment TCP. Comme WireGuard encapsule les paquets (en-têtes UDP/IP/WireGuard), le MTU utile du tunnel est réduit. Les hôtes du LAN peuvent négocier un MSS basé sur l&amp;rsquo;interface locale (1500 octets), ce qui donnerait des paquets trop gros une fois encapsulés. Le &lt;strong&gt;MSS clamping&lt;/strong&gt; force la valeur négociée à &lt;code&gt;MTU_tunnel - 40&lt;/code&gt; pour IPv4, soit &lt;code&gt;1380&lt;/code&gt; avec un MTU de &lt;code&gt;1420&lt;/code&gt;. L&amp;rsquo;IPv6 n&amp;rsquo;est pas traité ici.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall &amp;gt; Settings &amp;gt; Normalization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ajouter une règle sur l&amp;rsquo;interface &lt;strong&gt;WireGuard (Group)&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Direction : Any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Protocol : any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Source : any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Destination : any
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : WireGuard MSS Clamping IPv4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Max mss : 1380
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nat-outbound"&gt;&lt;a href="#nat-outbound" class="header-anchor"&gt;&lt;/a&gt;NAT outbound
&lt;/h3&gt;&lt;p&gt;Pour un split tunnel pur, &lt;strong&gt;pas besoin de NAT outbound&lt;/strong&gt;. OPNsense sait router le trafic entre &lt;code&gt;HomeWireGuard&lt;/code&gt; et &lt;code&gt;LAN&lt;/code&gt; car les deux réseaux lui sont directement attachés. Si jamais OPNsense n&amp;rsquo;est pas la passerelle par défaut du LAN, alors il faudra activer le NAT outbound ou ajouter une route statique sur le routeur intermédiaire.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="partie-2--kde-le-client-wireguard"&gt;&lt;a href="#partie-2--kde-le-client-wireguard" class="header-anchor"&gt;&lt;/a&gt;Partie 2 : KDE, le client WireGuard
&lt;/h2&gt;&lt;h3 id="génération-des-clés"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-des-cl%c3%a9s" class="header-anchor"&gt;&lt;/a&gt;Génération des clés
&lt;/h3&gt;&lt;p&gt;Sur le poste KDE :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wg genkey | tee private.key | wg pubkey &amp;gt; public.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;public.key&lt;/code&gt; : à copier dans le peer OPNsense (étape &amp;ldquo;Création du peer client&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private.key&lt;/code&gt; : reste sur le client, ne jamais la balancer sur un chat.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fichier-de-configuration-wg0conf"&gt;&lt;a href="#fichier-de-configuration-wg0conf" class="header-anchor"&gt;&lt;/a&gt;Fichier de configuration &lt;code&gt;wg0.conf&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Créer &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Interface]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PrivateKey&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;lt;contenu de private.key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Address&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;10.10.10.2/32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# DNS optionnel, par exemple si vous voulez utiliser le DNS d&amp;#39;OPNsense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# DNS = 10.10.10.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Peer]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PublicKey&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;lt;clé publique d&amp;#39;OPNsense&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;AllowedIPs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;10.10.10.0/24, 192.168.1.0/24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Endpoint&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;lt;ip_publique_ou_domaine_opnsense&amp;gt;:51820&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PersistentKeepalive&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Le point crucial du split tunnel&lt;/strong&gt; : &lt;code&gt;AllowedIPs&lt;/code&gt; ne contient &lt;strong&gt;pas&lt;/strong&gt; &lt;code&gt;0.0.0.0/0&lt;/code&gt;. Seuls les réseaux à atteindre derrière OPNsense (&lt;code&gt;192.168.1.0/24&lt;/code&gt;) et le tunnel (&lt;code&gt;10.10.10.0/24&lt;/code&gt;) y figurent. Ainsi, seul ce trafic est routé vers &lt;code&gt;wg0&lt;/code&gt; ; le reste (internet) reste sur l&amp;rsquo;interface classique.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="import-dans-networkmanager"&gt;&lt;a href="#import-dans-networkmanager" class="header-anchor"&gt;&lt;/a&gt;Import dans NetworkManager
&lt;/h3&gt;&lt;h4 id="en-ligne-de-commande-plus-fiable"&gt;&lt;a href="#en-ligne-de-commande-plus-fiable" class="header-anchor"&gt;&lt;/a&gt;En ligne de commande (plus fiable)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nmcli connection import type wireguard file /etc/wireguard/wg0.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on s&amp;rsquo;assure que NetworkManager ne met pas cette connexion en passerelle par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nmcli connection modify wg0 ipv4.never-default yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="en-graphique-kde-plasma"&gt;&lt;a href="#en-graphique-kde-plasma" class="header-anchor"&gt;&lt;/a&gt;En graphique (KDE Plasma)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Ouvrir &lt;strong&gt;Paramètres système &amp;gt; Connexions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ajouter une connexion &amp;gt; WireGuard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Onglet &lt;strong&gt;WireGuard&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private key&lt;/strong&gt; : coller la clé privée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peers&lt;/strong&gt; : ajouter le peer avec la clé publique d&amp;rsquo;OPNsense, l&amp;rsquo;endpoint, et &lt;code&gt;Allowed IPs = 10.10.10.0/24, 192.168.1.0/24&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Onglet &lt;strong&gt;IPv4&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Méthode&lt;/strong&gt; : &lt;code&gt;Manuel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adresse&lt;/strong&gt; : &lt;code&gt;10.10.10.2/32&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Laisser la &lt;strong&gt;passerelle vide&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cocher &lt;strong&gt;Utiliser cette connexion uniquement pour les ressources de ce réseau&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sauvegarder et activer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si l&amp;rsquo;option WireGuard n&amp;rsquo;apparaît pas dans l&amp;rsquo;interface graphique, vérifier que &lt;code&gt;wireguard-tools&lt;/code&gt; est bien installé et que NetworkManager est assez récent.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="vérifications"&gt;&lt;a href="#v%c3%a9rifications" class="header-anchor"&gt;&lt;/a&gt;Vérifications
&lt;/h2&gt;&lt;p&gt;Sur le client KDE, une fois connecté :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip route show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On doit voir quelque chose comme :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;default via 192.168.0.1 dev eth0 proto dhcp metric 100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10.10.10.0/24 dev wg0 proto static scope link
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.0/24 dev wg0 proto static scope link
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;important : la route &lt;code&gt;default&lt;/code&gt; pointe toujours vers l&amp;rsquo;interface locale. Les routes &lt;code&gt;10.10.10.0/24&lt;/code&gt; et &lt;code&gt;192.168.1.0/24&lt;/code&gt; pointent vers &lt;code&gt;wg0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tests basiques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ping 10.10.10.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ping 192.168.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier que l&amp;rsquo;IP publique vue depuis le navigateur n&amp;rsquo;a pas changé (le trafic internet ne passe pas par le VPN) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -4 ifconfig.me
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Côté OPNsense, on peut surveiller l&amp;rsquo;état dans &lt;strong&gt;VPN &amp;gt; WireGuard &amp;gt; Status&lt;/strong&gt;. On doit voir le peer &lt;code&gt;MonPC_KDE&lt;/code&gt; avec un handshake récent et du trafic RX/TX.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OPNsense&lt;/strong&gt; : instance &lt;code&gt;HomeWireGuard&lt;/code&gt; (&lt;code&gt;10.10.10.1/24&lt;/code&gt;), peer &lt;code&gt;MonPC_KDE&lt;/code&gt; (&lt;code&gt;10.10.10.2/32&lt;/code&gt;), firewall WAN UDP &lt;code&gt;51820&lt;/code&gt; + règle &lt;code&gt;HomeWireGuard net → LAN net&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client KDE&lt;/strong&gt; : &lt;code&gt;AllowedIPs = 10.10.10.0/24, 192.168.1.0/24&lt;/code&gt;, &lt;code&gt;ipv4.never-default yes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Résultat&lt;/strong&gt; : les machines du LAN derrière OPNsense sont accessibles, mais internet continue de sortir par la connexion locale. Pas de fuites, pas de ralentissements inutiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et si un jour vous voulez forcer tout le trafic par le VPN, il suffit de remplacer &lt;code&gt;AllowedIPs&lt;/code&gt; par &lt;code&gt;0.0.0.0/0&lt;/code&gt; côté client et d&amp;rsquo;ajouter le NAT outbound sur OPNsense. Mais ce n&amp;rsquo;est pas le sujet d&amp;rsquo;aujourd&amp;rsquo;hui.&lt;/p&gt;</description></item><item><title>KDE : double-clic sur un ISO pour le monter</title><link>https://slash-root.fr/kde-double-clic-sur-un-iso-pour-le-monter/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://slash-root.fr/kde-double-clic-sur-un-iso-pour-le-monter/</guid><description>&lt;img src="https://slash-root.fr/kde-double-clic-sur-un-iso-pour-le-monter/cover.png" alt="Featured image of post KDE : double-clic sur un ISO pour le monter" /&gt;&lt;p&gt;Sous KDE, double-cliquer sur un &lt;code&gt;.iso&lt;/code&gt; ouvre Ark. C&amp;rsquo;est le comportement par défaut, et c&amp;rsquo;est chiant quand on veut juste monter l&amp;rsquo;image pour parcourir son contenu.&lt;/p&gt;
&lt;p&gt;Le problème vient de l&amp;rsquo;association MIME. On peut le confirmer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xdg-mime query default application/x-iso9660-image
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça retourne &lt;code&gt;org.kde.ark.desktop&lt;/code&gt;. Ark est déclaré handler par défaut au niveau système pour ce type MIME, et KDE suit ça à la lettre.&lt;/p&gt;
&lt;h2 id="la-solution"&gt;&lt;a href="#la-solution" class="header-anchor"&gt;&lt;/a&gt;La solution
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;idée, c&amp;rsquo;est de créer un &lt;code&gt;.desktop&lt;/code&gt; qui monte l&amp;rsquo;ISO via &lt;code&gt;udisksctl&lt;/code&gt; et ouvre Dolphin sur le point de montage, puis de l&amp;rsquo;enregistrer comme handler MIME. Avec &lt;code&gt;NoDisplay=true&lt;/code&gt;, il ne remonte pas dans le menu des applications, il n&amp;rsquo;existe que pour ça.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer : &lt;code&gt;~/.local/share/applications/iso-mount.desktop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Desktop Entry]
Type=Application
Name=Monter l&amp;#39;image ISO
Exec=bash -c &amp;#39;DEV=$(udisksctl loop-setup -f &amp;#34;%f&amp;#34; | grep -oP &amp;#34;/dev/loop\d+&amp;#34;); sleep 0.5; udisksctl mount -b &amp;#34;$DEV&amp;#34;; dolphin /run/media/$USER/&amp;#39;
Icon=media-optical
MimeType=application/x-iso9660-image;application/x-cd-image;
NoDisplay=true
Terminal=false
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Ensuite on enregistre l&amp;rsquo;association :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;update-desktop-database ~/.local/share/applications/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xdg-mime default iso-mount.desktop application/x-iso9660-image
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xdg-mime default iso-mount.desktop application/x-cd-image
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sous KDE 6, &lt;code&gt;xdg-mime&lt;/code&gt; peut cracher un &lt;code&gt;qtpaths: commande introuvable&lt;/code&gt;. C&amp;rsquo;est un bug connu, ça n&amp;rsquo;empêche pas l&amp;rsquo;association d&amp;rsquo;être écrite correctement dans &lt;code&gt;~/.config/mimeapps.list&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On vérifie :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -i iso ~/.config/mimeapps.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;application/x-iso9660-image=iso-mount.desktop
application/x-cd-image=iso-mount.desktop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;À partir de là, un double-clic sur un &lt;code&gt;.iso&lt;/code&gt; dans Dolphin monte l&amp;rsquo;image et ouvre le répertoire directement. Pour démonter, clic droit sur le périphérique dans le panneau latéral → &lt;em&gt;Démonter&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Aptly : mirroiter Debian proprement</title><link>https://slash-root.fr/aptly-mirroiter-debian-proprement/</link><pubDate>Fri, 13 Mar 2026 19:05:06 +0100</pubDate><guid>https://slash-root.fr/aptly-mirroiter-debian-proprement/</guid><description>&lt;img src="https://slash-root.fr/aptly-mirroiter-debian-proprement/cover.jpg" alt="Featured image of post Aptly : mirroiter Debian proprement" /&gt;&lt;p&gt;Quand on gère une flotte de serveurs Debian, on finit toujours par se poser la même question : comment maîtriser ce que mes machines vont installer ? Comment être sûr qu'un &lt;code&gt;apt update&lt;/code&gt; ne va pas me ramener une version de paquet qui casse tout ? Et surtout, comment faire pour que mes serveurs de prod ne dépendent pas d'un miroir externe qui peut tomber au pire moment ?&lt;/p&gt;
&lt;p&gt;La réponse classique, c'est de monter un miroir local. Sauf que mirrorer Debian avec les outils standards (&lt;code&gt;debmirror&lt;/code&gt;, &lt;code&gt;apt-mirror&lt;/code&gt;...), c'est lourd, c'est rigide, et ça ne répond qu'à la moitié du problème. On a une copie locale, d'accord, mais on n'a toujours aucun contrôle sur ce qui change d'un jour à l'autre.&lt;/p&gt;
&lt;p&gt;C'est là qu'aptly entre en jeu.&lt;/p&gt;
&lt;h2 id="ce-quaptly-fait-vraiment"&gt;&lt;a href="#ce-quaptly-fait-vraiment" class="header-anchor"&gt;&lt;/a&gt;Ce qu&amp;rsquo;aptly fait vraiment
&lt;/h2&gt;&lt;p&gt;aptly, c'est un gestionnaire de dépôts Debian écrit en Go. Il sait faire trois choses fondamentales :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mirrorer un dépôt distant&lt;/strong&gt; -- comme &lt;code&gt;apt-mirror&lt;/code&gt;, mais en mieux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Figer l'état d'un miroir dans un snapshot immuable&lt;/strong&gt; -- ça, c'est la vraie valeur ajoutée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publier ce snapshot&lt;/strong&gt; pour que vos machines puissent l'utiliser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le workflow de base, c'est ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror create → mirror update → snapshot create → publish snapshot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et quand il faut mettre à jour :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror update → snapshot create → publish switch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; bascule la publication d'un snapshot à un autre. Vos machines continuent de pointer sur la même URL, mais le contenu change de manière contrôlée. Si ça foire, vous rebasculez sur l'ancien snapshot. Pas de panique, pas de retélécharger quoi que ce soit.&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="via-les-paquets-debian"&gt;&lt;a href="#via-les-paquets-debian" class="header-anchor"&gt;&lt;/a&gt;Via les paquets Debian
&lt;/h3&gt;&lt;p&gt;C'est la méthode standard, celle qu'on va utiliser ici :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur Debian Trixie, ça installe la version 1.5.0. C'est pas la toute dernière (la 1.6.2 existe), mais c'est largement suffisant pour ce qu'on va faire.&lt;/p&gt;
&lt;p&gt;Vérification :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aptly version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly version: 1.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="lupstream-optionnel"&gt;&lt;a href="#lupstream-optionnel" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;upstream (optionnel)
&lt;/h3&gt;&lt;p&gt;Si vous voulez absolument la dernière version upstream, vous pouvez ajouter le dépôt officiel d'aptly. Mais franchement, pour un usage classique, la version Debian fait le job. Je mentionne juste l'option pour ceux qui en ont besoin :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/release trixie main&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais encore une fois, c'est optionnel. On va continuer avec la version des dépôts Debian.&lt;/p&gt;
&lt;h2 id="configuration-de-base"&gt;&lt;a href="#configuration-de-base" class="header-anchor"&gt;&lt;/a&gt;Configuration de base
&lt;/h2&gt;&lt;p&gt;aptly stocke tout dans &lt;code&gt;~/.aptly&lt;/code&gt; par défaut. En prod, on va plutôt utiliser &lt;code&gt;/var/aptly&lt;/code&gt;. On crée le répertoire et on configure aptly pour l'utiliser :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown $USER:$USER /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le fichier de config, c'est &lt;code&gt;~/.aptly.conf&lt;/code&gt; (ou &lt;code&gt;/etc/aptly.conf&lt;/code&gt; pour une config globale). On va en créer un minimal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; ~/.aptly.conf &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;rootDir&amp;#34;: &amp;#34;/var/aptly&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;architectures&amp;#34;: [&amp;#34;amd64&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On restreint à &lt;code&gt;amd64&lt;/code&gt; parce que c'est ce qu'on utilise. Pas la peine de télécharger du &lt;code&gt;i386&lt;/code&gt;, du &lt;code&gt;arm64&lt;/code&gt; ou du &lt;code&gt;armhf&lt;/code&gt; si on n'en a pas besoin.&lt;/p&gt;
&lt;p&gt;Le &lt;code&gt;rootDir&lt;/code&gt;, c'est la racine de tout. Dedans, aptly va créer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;db/&lt;/code&gt; -- sa base de données interne&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pool/&lt;/code&gt; -- les fichiers &lt;code&gt;.deb&lt;/code&gt; téléchargés&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt; -- les dépôts publiés, ceux qu'on va exposer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-les-clés-gpg"&gt;&lt;a href="#importer-les-cl%c3%a9s-gpg" class="header-anchor"&gt;&lt;/a&gt;Importer les clés GPG
&lt;/h2&gt;&lt;p&gt;Avant de créer un miroir, aptly a besoin des clés GPG pour vérifier les signatures des dépôts distants. Sur Debian, les clés d'archive sont déjà présentes dans &lt;code&gt;/usr/share/keyrings/&lt;/code&gt;. Il suffit de les importer dans le trousseau d'aptly :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring /usr/share/keyrings/debian-archive-keyring.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --export | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring trustedkeys.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --import
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça importe les clés dans &lt;code&gt;~/.gnupg/trustedkeys.gpg&lt;/code&gt;, le trousseau qu'aptly utilise par défaut.&lt;/p&gt;
&lt;h2 id="créer-un-miroir-de-debian-trixie"&gt;&lt;a href="#cr%c3%a9er-un-miroir-de-debian-trixie" class="header-anchor"&gt;&lt;/a&gt;Créer un miroir de Debian Trixie
&lt;/h2&gt;&lt;p&gt;On va mirrorer le dépôt officiel français (&lt;code&gt;ftp.fr.debian.org&lt;/code&gt;), avec les sections &lt;code&gt;main&lt;/code&gt; et &lt;code&gt;non-free-firmware&lt;/code&gt;. Pourquoi &lt;code&gt;non-free-firmware&lt;/code&gt; ? Parce que depuis Debian 12, les firmwares non-libres (wifi, GPU...) sont dans cette section, et on en a souvent besoin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror create &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -architectures&lt;span style="color:#f92672"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; debian-trixie &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques remarques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le flag &lt;code&gt;-architectures=amd64&lt;/code&gt; se place &lt;strong&gt;avant&lt;/strong&gt; la sous-commande &lt;code&gt;mirror&lt;/code&gt;. C'est un flag global. Si vous le mettez après, aptly va râler.&lt;/li&gt;
&lt;li&gt;Le nom du miroir (&lt;code&gt;debian-trixie&lt;/code&gt;), c'est vous qui le choisissez. Prenez un nom explicite.&lt;/li&gt;
&lt;li&gt;L'URL doit finir par un &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On spécifie la distribution (&lt;code&gt;trixie&lt;/code&gt;) et les composants (&lt;code&gt;main non-free-firmware&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La commande crée la définition du miroir, mais ne télécharge rien encore. Pour ça, il faut lancer un &lt;code&gt;mirror update&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="remplir-le-miroir"&gt;&lt;a href="#remplir-le-miroir" class="header-anchor"&gt;&lt;/a&gt;Remplir le miroir
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Là, ça télécharge. Et ça prend du temps. Un miroir complet de Debian main + non-free-firmware en amd64, c'est plusieurs dizaines de Go. Prévoyez du café.&lt;/p&gt;
&lt;p&gt;Vous pouvez suivre la progression dans le terminal. aptly affiche les paquets au fur et à mesure qu'il les télécharge.&lt;/p&gt;
&lt;p&gt;Une fois terminé, vous pouvez voir ce que contient le miroir :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror show debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça vous donne le nombre de paquets, la taille totale, la date de dernière mise à jour, etc.&lt;/p&gt;
&lt;h2 id="créer-un-snapshot"&gt;&lt;a href="#cr%c3%a9er-un-snapshot" class="header-anchor"&gt;&lt;/a&gt;Créer un snapshot
&lt;/h2&gt;&lt;p&gt;Le miroir est à jour. Maintenant, on va en faire un snapshot. Un snapshot, c'est une copie figée et immuable de l'état du miroir à un instant T. Une fois créé, il ne bouge plus, quoi qu'il arrive au miroir source.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'utilise la date dans le nom du snapshot. C'est une bonne pratique : ça permet de savoir immédiatement à quoi correspond chaque snapshot.&lt;/p&gt;
&lt;p&gt;Vous pouvez lister vos snapshots :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et voir le détail d'un snapshot :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot show trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="publier-le-snapshot"&gt;&lt;a href="#publier-le-snapshot" class="header-anchor"&gt;&lt;/a&gt;Publier le snapshot
&lt;/h2&gt;&lt;p&gt;Un snapshot qui n'est pas publié, ça ne sert à rien. La publication génère l'arborescence standard Debian (&lt;code&gt;dists/&lt;/code&gt;, &lt;code&gt;pool/&lt;/code&gt;, fichiers &lt;code&gt;Release&lt;/code&gt; signés...) dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish snapshot -distribution&lt;span style="color:#f92672"&gt;=&lt;/span&gt;trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-distribution=trixie&lt;/code&gt; indique quelle distribution utiliser dans les métadonnées du dépôt publié. C'est ce que vos machines verront dans leur &lt;code&gt;sources.list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;aptly va vous demander la passphrase de votre clé GPG pour signer le fichier &lt;code&gt;Release&lt;/code&gt;. Si vous n'avez pas encore de clé GPG, créez-en une :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --full-generate-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choisissez RSA 4096 bits, et renseignez un nom et un email.&lt;/p&gt;
&lt;p&gt;Une fois la publication terminée, vous avez un dépôt Debian complet dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;. Il ne reste plus qu'à l'exposer via un serveur web.&lt;/p&gt;
&lt;h2 id="limpact-des-hard-links"&gt;&lt;a href="#limpact-des-hard-links" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;impact des hard links
&lt;/h2&gt;&lt;p&gt;Un détail important : quand aptly publie un snapshot, il ne copie pas les fichiers &lt;code&gt;.deb&lt;/code&gt;. Il crée des &lt;strong&gt;hard links&lt;/strong&gt; depuis le pool vers le répertoire &lt;code&gt;public/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ça veut dire quoi concrètement ?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pas de duplication&lt;/strong&gt; -- un paquet présent dans plusieurs snapshots n'occupe qu'une seule fois la place sur le disque&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publication instantanée&lt;/strong&gt; -- créer un hard link, c'est quasi gratuit en temps et en espace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plusieurs snapshots publiés en même temps&lt;/strong&gt; -- vous pouvez avoir &lt;code&gt;trixie-20260313&lt;/code&gt; et &lt;code&gt;trixie-20260310&lt;/code&gt; publiés simultanément, ils partagent les fichiers communs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est pour ça que le &lt;code&gt;publish switch&lt;/code&gt; est si rapide. aptly ne déplace rien, il change juste les liens.&lt;/p&gt;
&lt;p&gt;Par contre, attention : si vous supprimez un snapshot publié avec &lt;code&gt;snapshot drop&lt;/code&gt;, aptly refuse tant que la publication existe. Il faut d'abord dépublier (&lt;code&gt;publish drop&lt;/code&gt;) ou basculer vers un autre snapshot (&lt;code&gt;publish switch&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="mettre-à-jour-le-miroir-et-basculer"&gt;&lt;a href="#mettre-%c3%a0-jour-le-miroir-et-basculer" class="header-anchor"&gt;&lt;/a&gt;Mettre à jour le miroir et basculer
&lt;/h2&gt;&lt;p&gt;Quelques jours passent. Le miroir Debian a évolué. Vous voulez mettre à jour votre dépôt local. Voilà le workflow complet :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. Mettre à jour le miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. Créer un nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. Basculer la publication vers le nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch trixie trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; fait tout le boulot :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il met à jour les métadonnées (&lt;code&gt;Release&lt;/code&gt;, &lt;code&gt;Packages&lt;/code&gt;, &lt;code&gt;Contents&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;Il ajuste les hard links dans &lt;code&gt;public/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il signe le nouveau &lt;code&gt;Release&lt;/code&gt; avec GPG&lt;/li&gt;
&lt;li&gt;Il nettoie les anciens liens qui ne servent plus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vos machines qui pointent sur ce dépôt voient le changement au prochain &lt;code&gt;apt update&lt;/code&gt;. Pas de coupure, pas de temps d'arrêt.&lt;/p&gt;
&lt;p&gt;Si le nouveau snapshot pose problème, vous rebasculez sur l'ancien :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C'est aussi rapide dans un sens que dans l'autre.&lt;/p&gt;
&lt;h2 id="les-dépôts-locaux-mention-rapide"&gt;&lt;a href="#les-d%c3%a9p%c3%b4ts-locaux-mention-rapide" class="header-anchor"&gt;&lt;/a&gt;Les dépôts locaux (mention rapide)
&lt;/h2&gt;&lt;p&gt;aptly sait aussi gérer des dépôts locaux, où vous poussez vos propres paquets &lt;code&gt;.deb&lt;/code&gt;. Le workflow est similaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Créer un dépôt local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo create mon-depot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Ajouter des paquets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo add mon-depot /chemin/vers/*.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create mon-depot-v1 from repo mon-depot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Publier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish snapshot mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je ne développe pas plus ici, parce que le cas d'usage principal d'aptly, c'est quand même le mirroring. Mais sachez que c'est possible.&lt;/p&gt;
&lt;h2 id="exposer-le-dépôt"&gt;&lt;a href="#exposer-le-d%c3%a9p%c3%b4t" class="header-anchor"&gt;&lt;/a&gt;Exposer le dépôt
&lt;/h2&gt;&lt;h3 id="le-serveur-embarqué-test-uniquement"&gt;&lt;a href="#le-serveur-embarqu%c3%a9-test-uniquement" class="header-anchor"&gt;&lt;/a&gt;Le serveur embarqué (test uniquement)
&lt;/h3&gt;&lt;p&gt;aptly a un petit serveur HTTP intégré. C'est pratique pour tester, mais la doc officielle est claire : &lt;strong&gt;not suitable for real production usage&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly serve -listen&lt;span style="color:#f92672"&gt;=&lt;/span&gt;:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez alors ajouter le dépôt sur une machine de test :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://votre-serveur:8080/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly-test.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nginx-production"&gt;&lt;a href="#nginx-production" class="header-anchor"&gt;&lt;/a&gt;nginx (production)
&lt;/h3&gt;&lt;p&gt;En prod, on utilise nginx. Je ne vais pas détailler ici parce que ça fera l'objet d'un second article si besoin, mais l'idée générale :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;repo.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/aptly/public&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;autoindex&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous activez le vhost, vous rechargez nginx, et c'est bon. Pour HTTPS, ajoutez Let's Encrypt avec &lt;code&gt;certbot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Côté client, vous ajoutez le dépôt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si le dépôt est signé (et il devrait l'être), distribuez votre clé GPG publique aux clients :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --armor --export VOTRE_KEY_ID &amp;gt; /var/aptly/public/repo-key.asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur les clients :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /etc/apt/keyrings/mon-repo.asc http://repo.example.com/repo-key.asc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/mon-repo.asc] http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="automatiser-avec-cron"&gt;&lt;a href="#automatiser-avec-cron" class="header-anchor"&gt;&lt;/a&gt;Automatiser avec cron
&lt;/h2&gt;&lt;p&gt;Un miroir, ça se met à jour régulièrement. Voici un script cron qui fait le job :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/cron.daily/aptly-update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MIRROR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;debian-trixie&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Mise à jour du miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; from mirror &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Basculer la publication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch -batch -gpg-key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;VOTRE_KEY_ID&amp;#34;&lt;/span&gt; trixie &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer les vieux snapshots (garder les 7 derniers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot list -raw | grep &lt;span style="color:#e6db74"&gt;&amp;#34;^trixie-&amp;#34;&lt;/span&gt; | sort | head -n -7 | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read snap; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; aptly snapshot drop &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$snap&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer la base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-batch&lt;/code&gt; est crucial : il permet à GPG de fonctionner sans terminal interactif. Sans ça, le script va bloquer en attendant que vous tapiez la passphrase.&lt;/p&gt;
&lt;p&gt;Pour éviter ça, vous pouvez aussi utiliser &lt;code&gt;gpg-agent&lt;/code&gt; avec un cache de passphrase, ou stocker la passphrase dans un fichier sécurisé et utiliser &lt;code&gt;-passphrase-file&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="nettoyage-et-maintenance"&gt;&lt;a href="#nettoyage-et-maintenance" class="header-anchor"&gt;&lt;/a&gt;Nettoyage et maintenance
&lt;/h2&gt;&lt;p&gt;aptly conserve tous les paquets téléchargés dans son pool, même ceux qui ne sont plus référencés par aucun snapshot. Pour faire le ménage :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça supprime les paquets orphelins. Si vous voulez voir ce qui va être supprimé avant de le faire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup -verbose -dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour sauvegarder votre installation aptly, c'est simple : sauvegardez &lt;code&gt;/var/aptly&lt;/code&gt; en entier. Tout est dedans.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -czf aptly-backup-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;.tar.gz /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quelques-astuces"&gt;&lt;a href="#quelques-astuces" class="header-anchor"&gt;&lt;/a&gt;Quelques astuces
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Filtrer les paquets lors du mirroring.&lt;/strong&gt; Si vous ne voulez mirrorer que certains paquets (par exemple, uniquement nginx et ses dépendances), vous pouvez utiliser des filtres :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror create -filter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt; -filter-with-deps &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx-only &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-filter-with-deps&lt;/code&gt; est important : sans lui, vous récupérez nginx mais pas ses dépendances, et ça ne servira à rien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparer deux snapshots.&lt;/strong&gt; Pour voir ce qui a changé entre deux snapshots :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot diff trixie-20260313 trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fusionner des snapshots.&lt;/strong&gt; Vous pouvez combiner plusieurs snapshots en un seul. Utile si vous avez un miroir Debian et un dépôt local, et que vous voulez les publier ensemble :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot merge trixie-complet trixie-20260315 mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;aptly résout un vrai problème : comment garder le contrôle sur ce que vos machines Debian vont installer. Les miroirs classiques vous donnent une copie locale, d'accord, mais ils ne vous donnent pas la maîtrise des changements. Avec aptly et ses snapshots, vous décidez quand et comment vos serveurs voient les mises à jour.&lt;/p&gt;
&lt;p&gt;Le workflow &lt;code&gt;mirror create&lt;/code&gt; → &lt;code&gt;mirror update&lt;/code&gt; → &lt;code&gt;snapshot create&lt;/code&gt; → &lt;code&gt;publish snapshot&lt;/code&gt; → &lt;code&gt;publish switch&lt;/code&gt; devient vite un réflexe. Et le jour où une mise à jour casse quelque chose, vous serez bien content de pouvoir rebascule sur le snapshot d'hier en une commande.&lt;/p&gt;
&lt;p&gt;Les hard links font que tout ça reste léger en espace disque et rapide en exécution. Vous pouvez avoir plusieurs snapshots publiés en parallèle, pour des environnements de test et de prod différents, sans exploser votre stockage.&lt;/p&gt;
&lt;p&gt;Bref, si vous gérez des serveurs Debian sérieusement, aptly mérite sa place dans votre boîte à outils.&lt;/p&gt;</description></item><item><title>awaSCII+ Web : Quand l’encodage devient un art de vivre</title><link>https://slash-root.fr/awascii-web-quand-lencodage-devient-un-art-de-vivre/</link><pubDate>Sun, 28 Sep 2025 03:55:27 +0200</pubDate><guid>https://slash-root.fr/awascii-web-quand-lencodage-devient-un-art-de-vivre/</guid><description>&lt;img src="https://slash-root.fr/awascii-web-quand-lencodage-devient-un-art-de-vivre/cover.png" alt="Featured image of post awaSCII+ Web : Quand l’encodage devient un art de vivre" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;p&gt;J'ai mis en ligne une interface web &lt;strong&gt;&lt;a href="https://awa.noobops.fr"&gt;awa.noobops.fr&lt;/a&gt;&lt;/strong&gt; pour le délicieux système d'encodage &lt;strong&gt;awaSCII+ v5.0.666&lt;/strong&gt; de Penthium2 BZHack. Parce que parfois, on a besoin de dire &amp;quot;Hello World!&amp;quot; avec classe.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; awa awa awa awawa awa awa awa , awa awa awa awawawawawa, awa awa awawa awa awa awa awa , awa awa awawa awa awa awa awa , awa awa awawa awa awawawa, awa awawawa awawa awa awa , awa awa awa awa awa awa awawa, awa awa awawa awa awawawa, awa awawa awawa awa awawa, awa awa awawa awa awa awa awa , awa awawa awa awawawa awa , awa awawawa awawawawa
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="le-projet-qui-fait-awa"&gt;&lt;a href="#le-projet-qui-fait-awa" class="header-anchor"&gt;&lt;/a&gt;Le projet qui fait &amp;quot;awa&amp;quot;
&lt;/h2&gt;&lt;p&gt;Pour ceux qui connaissent pas encore cette merveille, &lt;strong&gt;awaSCII+&lt;/strong&gt; c'est un système d'encodage qui transforme n'importe quel texte en variations de &amp;quot;awa&amp;quot; et &amp;quot;wa&amp;quot;. Développé par &lt;a href="https://github.com/penthium2/awaSCII_5.0.666"&gt;Penthium2 BZHack&lt;/a&gt;, c'est le genre de projet qui te fait comprendre que l'informatique, c'est avant tout de l'art.&lt;/p&gt;
&lt;h3 id="comment-ça-marche-"&gt;&lt;a href="#comment-%c3%a7a-marche-" class="header-anchor"&gt;&lt;/a&gt;Comment ça marche ?
&lt;/h3&gt;&lt;p&gt;L'algorithme est d'une beauté simple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Caractère&lt;/strong&gt; → &lt;strong&gt;Index dans une table de 97 caractères&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Index&lt;/strong&gt; → &lt;strong&gt;Binaire 8 bits&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; devient &lt;strong&gt;&amp;quot; awa &amp;quot;&lt;/strong&gt;, &lt;strong&gt;1&lt;/strong&gt; devient &lt;strong&gt;&amp;quot;wa&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magie&lt;/strong&gt; : espaces → 💩, tabs → 💨, retours à la ligne → 🍆&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Le projet est toujours en développement à l'heure actuelle.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="pourquoi-une-interface-web-"&gt;&lt;a href="#pourquoi-une-interface-web-" class="header-anchor"&gt;&lt;/a&gt;Pourquoi une interface web ?
&lt;/h2&gt;&lt;p&gt;Les scripts Bash originaux (&lt;code&gt;awacoder.sh&lt;/code&gt; / &lt;code&gt;awadecode.sh&lt;/code&gt;) c'est cool, mais parfois on veut juste encoder/décoder rapidement sans sortir du navigateur. Et puis, ça manquait cruellement d'un bouton &amp;quot;Écouter&amp;quot; avec l'API Web Speech Synthesis.&lt;/p&gt;
&lt;h3 id="features-qui-claquent"&gt;&lt;a href="#features-qui-claquent" class="header-anchor"&gt;&lt;/a&gt;Features qui claquent
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100% compatible&lt;/strong&gt; avec les scripts Bash originaux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design terminal rétro&lt;/strong&gt; qui fait plaisir aux yeux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raccourci &amp;quot;Ctrl+Entrée&amp;quot;&lt;/strong&gt; parce qu'on est des pros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boutons de copie&lt;/strong&gt; intégrés (fini le Ctrl+A/Ctrl+C)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lecture audio&lt;/strong&gt; du résultat (parce que entendre &amp;quot;awa awa awawawawa&amp;quot; c'est magique)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Statistiques temps réel&lt;/strong&gt; d'encodage/décodage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="le-mot-de-la-fin"&gt;&lt;a href="#le-mot-de-la-fin" class="header-anchor"&gt;&lt;/a&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;awaSCII+ Web c'est l'exemple parfait que l'informatique peut être fun, absurde et techniquement propre à la fois. C'est compatible avec l'original, ça marche sur mobile, et ça fait sourire.&lt;/p&gt;
&lt;p&gt;Alors la prochaine fois que vous voulez envoyer un message secret ou juste faire le malin, pensez awaSCII+ !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liens utiles :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interface web&lt;/strong&gt; : &lt;a href="https://awa.noobops.fr"&gt;awa.noobops.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source originale&lt;/strong&gt; : &lt;a href="https://github.com/penthium2/awaSCII_5.0.666"&gt;awaSCII_5.0.666&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;PS : Le site est aussi accessible via le menu de navigation. Parce qu'il faut bien que les gens puissent retrouver cette merveille technologique.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Zoxide : Une alternative intelligente à la commande cd</title><link>https://slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/</link><pubDate>Sun, 21 Sep 2025 00:00:10 +0200</pubDate><guid>https://slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/</guid><description>&lt;img src="https://slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/cover.png" alt="Featured image of post Zoxide : Une alternative intelligente à la commande cd" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Naviguer dans l'arborescence des fichiers en ligne de commande peut rapidement devenir fastidieux, surtout lorsque vous travaillez avec des projets complexes comportant de nombreux répertoires imbriqués. C'est là qu'intervient &lt;strong&gt;zoxide&lt;/strong&gt;, un outil révolutionnaire qui transforme votre expérience de navigation en shell.&lt;/p&gt;
&lt;p&gt;Zoxide est une alternative moderne et intelligente à la commande &lt;code&gt;cd&lt;/code&gt; traditionnelle. Inspiré par des outils comme &lt;code&gt;z&lt;/code&gt; et &lt;code&gt;autojump&lt;/code&gt;, il mémorise les répertoires que vous visitez le plus fréquemment et vous permet de &amp;quot;sauter&amp;quot; vers eux en quelques frappes seulement.&lt;/p&gt;
&lt;h2 id="quest-ce-que-zoxide-"&gt;&lt;a href="#quest-ce-que-zoxide-" class="header-anchor"&gt;&lt;/a&gt;Qu&amp;rsquo;est-ce que zoxide ?
&lt;/h2&gt;&lt;p&gt;Zoxide est un utilitaire de navigation rapide qui :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apprend de vos habitudes&lt;/strong&gt; : Il enregistre automatiquement les répertoires que vous visitez&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propose une navigation intelligente&lt;/strong&gt; : Plus vous visitez un répertoire, plus il devient facile d'y accéder&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporte tous les shells majeurs&lt;/strong&gt; : Bash, Zsh, Fish, PowerShell, Nushell, et plus encore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offre une sélection interactive&lt;/strong&gt; : Avec &lt;code&gt;zi&lt;/code&gt;, vous pouvez choisir parmi plusieurs options via &lt;code&gt;fzf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reste compatible&lt;/strong&gt; : Fonctionne comme un &lt;code&gt;cd&lt;/code&gt; classique quand nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-sur-debianubuntu-et-dérivés"&gt;&lt;a href="#installation-sur-debianubuntu-et-d%c3%a9riv%c3%a9s" class="header-anchor"&gt;&lt;/a&gt;Installation sur Debian/Ubuntu et dérivés
&lt;/h2&gt;&lt;h3 id="installation-via-les-dépôts-officiels"&gt;&lt;a href="#installation-via-les-d%c3%a9p%c3%b4ts-officiels" class="header-anchor"&gt;&lt;/a&gt;Installation via les dépôts officiels
&lt;/h3&gt;&lt;p&gt;La méthode la plus simple pour installer zoxide sur Debian 11+ et Ubuntu est d'utiliser les dépôts officiels :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="méthodes-alternatives-dinstallation"&gt;&lt;a href="#m%c3%a9thodes-alternatives-dinstallation" class="header-anchor"&gt;&lt;/a&gt;Méthodes alternatives d&amp;rsquo;installation
&lt;/h3&gt;&lt;p&gt;Si vous préférez une version plus récente ou si zoxide n'est pas disponible dans vos dépôts, vous pouvez utiliser :&lt;/p&gt;
&lt;h4 id="via-le-script-dinstallation-officiel"&gt;&lt;a href="#via-le-script-dinstallation-officiel" class="header-anchor"&gt;&lt;/a&gt;Via le script d&amp;rsquo;installation officiel
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Note de sécurité&lt;/strong&gt; : Il est recommandé de lire le contenu du script avant de l'exécuter. Vous pouvez d'abord le télécharger avec &lt;code&gt;curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh&lt;/code&gt; pour l'examiner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="via-cargo-si-rust-est-installé"&gt;&lt;a href="#via-cargo-si-rust-est-install%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Via Cargo (si Rust est installé)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install zoxide --locked
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="via-homebrew-sur-linux"&gt;&lt;a href="#via-homebrew-sur-linux" class="header-anchor"&gt;&lt;/a&gt;Via Homebrew sur Linux
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="prérequis-recommandé--fzf"&gt;&lt;a href="#pr%c3%a9requis-recommand%c3%a9--fzf" class="header-anchor"&gt;&lt;/a&gt;Prérequis recommandé : fzf
&lt;/h3&gt;&lt;p&gt;Pour profiter pleinement de zoxide, notamment de la commande interactive &lt;code&gt;zi&lt;/code&gt;, il est recommandé d'installer &lt;code&gt;fzf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install fzf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-avec-zoxide-init"&gt;&lt;a href="#configuration-avec-zoxide-init" class="header-anchor"&gt;&lt;/a&gt;Configuration avec &lt;code&gt;zoxide init&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Une fois zoxide installé, vous devez l'initialiser dans votre shell. Cette étape est cruciale car elle intègre zoxide à votre environnement shell.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : La commande &lt;code&gt;zoxide init&lt;/code&gt; génère la configuration à ajouter à votre profil shell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="configuration-pour-bash"&gt;&lt;a href="#configuration-pour-bash" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Bash
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.bashrc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-pour-zsh"&gt;&lt;a href="#configuration-pour-zsh" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Zsh
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.zshrc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init zsh&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-pour-fish"&gt;&lt;a href="#configuration-pour-fish" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Fish
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.config/fish/config.fish&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide init fish | source
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="rechargement-de-la-configuration"&gt;&lt;a href="#rechargement-de-la-configuration" class="header-anchor"&gt;&lt;/a&gt;Rechargement de la configuration
&lt;/h3&gt;&lt;p&gt;Après avoir modifié votre fichier de configuration, rechargez-le suivant le shell utilisé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.config/fish/config.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation-de-base"&gt;&lt;a href="#utilisation-de-base" class="header-anchor"&gt;&lt;/a&gt;Utilisation de base
&lt;/h2&gt;&lt;p&gt;Une fois configuré, zoxide vous donne accès à plusieurs commandes puissantes :&lt;/p&gt;
&lt;h3 id="la-commande-z"&gt;&lt;a href="#la-commande-z" class="header-anchor"&gt;&lt;/a&gt;La commande &lt;code&gt;z&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo bar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z ~/Documents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z ..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="la-commande-zi-navigation-interactive"&gt;&lt;a href="#la-commande-zi-navigation-interactive" class="header-anchor"&gt;&lt;/a&gt;La commande &lt;code&gt;zi&lt;/code&gt; (navigation interactive)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zi foo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette commande ouvre une interface interactive où vous pouvez choisir parmi plusieurs répertoires correspondants.&lt;/p&gt;
&lt;h3 id="autocomplétion"&gt;&lt;a href="#autocompl%c3%a9tion" class="header-anchor"&gt;&lt;/a&gt;Autocomplétion
&lt;/h3&gt;&lt;p&gt;Sur les shells compatibles (Bash 4.4+, Fish, Zsh), vous pouvez utiliser l'autocomplétion :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo&amp;lt;SPACE&amp;gt;&amp;lt;TAB&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bonus--alias-cd039z039"&gt;&lt;a href="#bonus--alias-cd039z039" class="header-anchor"&gt;&lt;/a&gt;Bonus : Alias &lt;code&gt;cd='z'&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Pour une intégration encore plus transparente, vous pouvez créer un alias qui remplace complètement &lt;code&gt;cd&lt;/code&gt; par &lt;code&gt;z&lt;/code&gt; :&lt;/p&gt;
&lt;h3 id="méthode-recommandée--configuration-automatique-via-zoxide-init"&gt;&lt;a href="#m%c3%a9thode-recommand%c3%a9e--configuration-automatique-via-zoxide-init" class="header-anchor"&gt;&lt;/a&gt;Méthode recommandée : Configuration automatique via zoxide init
&lt;/h3&gt;&lt;p&gt;La meilleure approche est d'utiliser l'option &lt;code&gt;--cmd cd&lt;/code&gt; lors de l'initialisation :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init zsh --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Avec cette configuration, la commande &lt;code&gt;cd&lt;/code&gt; sera automatiquement remplacée par &lt;code&gt;z&lt;/code&gt;, tout en conservant la compatibilité avec l'utilisation classique de &lt;code&gt;cd&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="alternative--alias-manuel"&gt;&lt;a href="#alternative--alias-manuel" class="header-anchor"&gt;&lt;/a&gt;Alternative : Alias manuel
&lt;/h3&gt;&lt;p&gt;Si vous préférez ne pas modifier votre configuration &lt;code&gt;zoxide init&lt;/code&gt; existante, vous pouvez simplement ajouter un alias :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias cd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette méthode produit le même résultat que &lt;code&gt;--cmd cd&lt;/code&gt;, mais la méthode automatique avec &lt;code&gt;--cmd cd&lt;/code&gt; est plus propre et évite les conflits potentiels.&lt;/p&gt;
&lt;h2 id="options-de-configuration-avancées"&gt;&lt;a href="#options-de-configuration-avanc%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Options de configuration avancées
&lt;/h2&gt;&lt;h3 id="personnalisation-du-préfixe-des-commandes"&gt;&lt;a href="#personnalisation-du-pr%c3%a9fixe-des-commandes" class="header-anchor"&gt;&lt;/a&gt;Personnalisation du préfixe des commandes
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd j&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="contrôle-de-la-fréquence-denregistrement"&gt;&lt;a href="#contr%c3%b4le-de-la-fr%c3%a9quence-denregistrement" class="header-anchor"&gt;&lt;/a&gt;Contrôle de la fréquence d&amp;rsquo;enregistrement
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook pwd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook prompt&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook none&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="exemples-pratiques-dutilisation"&gt;&lt;a href="#exemples-pratiques-dutilisation" class="header-anchor"&gt;&lt;/a&gt;Exemples pratiques d&amp;rsquo;utilisation
&lt;/h2&gt;&lt;h3 id="scénario-1--développement-web"&gt;&lt;a href="#sc%c3%a9nario-1--d%c3%a9veloppement-web" class="header-anchor"&gt;&lt;/a&gt;Scénario 1 : Développement web
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/projets/mon-site-web/src/components/header
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z header
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="scénario-2--administration-système"&gt;&lt;a href="#sc%c3%a9nario-2--administration-syst%c3%a8me" class="header-anchor"&gt;&lt;/a&gt;Scénario 2 : Administration système
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z logs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="scénario-3--projets-multiples"&gt;&lt;a href="#sc%c3%a9nario-3--projets-multiples" class="header-anchor"&gt;&lt;/a&gt;Scénario 3 : Projets multiples
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet2 backend
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet3 frontend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="commandes-utiles"&gt;&lt;a href="#commandes-utiles" class="header-anchor"&gt;&lt;/a&gt;Commandes utiles
&lt;/h2&gt;&lt;h3 id="gestion-de-la-base-de-données-zoxide"&gt;&lt;a href="#gestion-de-la-base-de-donn%c3%a9es-zoxide" class="header-anchor"&gt;&lt;/a&gt;Gestion de la base de données zoxide
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide query --list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide add /chemin/vers/repertoire
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide remove /chemin/vers/repertoire
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer les répertoires inexistants&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide query --list | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read -r line; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; ! -d &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; zoxide remove &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avantages-par-rapport-aux-alternatives"&gt;&lt;a href="#avantages-par-rapport-aux-alternatives" class="header-anchor"&gt;&lt;/a&gt;Avantages par rapport aux alternatives
&lt;/h2&gt;&lt;h3 id="comparaison-avec-autojump"&gt;&lt;a href="#comparaison-avec-autojump" class="header-anchor"&gt;&lt;/a&gt;Comparaison avec &lt;code&gt;autojump&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt; : &lt;a href="https://github.com/wting/autojump"&gt;https://github.com/wting/autojump&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt; : zoxide est écrit en Rust, plus rapide que autojump (Python)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt; : Projet activement maintenu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilité&lt;/strong&gt; : Support natif de plus de shells&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="comparaison-avec-zsh"&gt;&lt;a href="#comparaison-avec-zsh" class="header-anchor"&gt;&lt;/a&gt;Comparaison avec &lt;code&gt;z.sh&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt; : &lt;a href="https://github.com/rupa/z"&gt;https://github.com/rupa/z&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Algorithme&lt;/strong&gt; : Meilleur algorithme de classement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités&lt;/strong&gt; : Mode interactif avec &lt;code&gt;zi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robustesse&lt;/strong&gt; : Gestion d'erreurs améliorée&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="intégrations-et-outils-complémentaires"&gt;&lt;a href="#int%c3%a9grations-et-outils-compl%c3%a9mentaires" class="header-anchor"&gt;&lt;/a&gt;Intégrations et outils complémentaires
&lt;/h2&gt;&lt;h3 id="avec-votre-éditeur"&gt;&lt;a href="#avec-votre-%c3%a9diteur" class="header-anchor"&gt;&lt;/a&gt;Avec votre éditeur
&lt;/h3&gt;&lt;p&gt;Vous pouvez créer des fonctions personnalisées pour ouvrir directement des projets :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fonction pour ouvrir un projet avec Neovim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; nvim-project&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide query &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cd &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvim .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Projet non trouvé : &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fonction pour ouvrir un projet avec VS Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; code-project&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide query &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Projet non trouvé : &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker : Metrics port 9323</title><link>https://slash-root.fr/docker-metrics-port-9323/</link><pubDate>Sun, 15 Jun 2025 18:55:14 +0200</pubDate><guid>https://slash-root.fr/docker-metrics-port-9323/</guid><description>&lt;img src="https://slash-root.fr/docker-metrics-port-9323/cover.png" alt="Featured image of post Docker : Metrics port 9323" /&gt;&lt;p&gt;L'option &lt;code&gt;metrics-addr&lt;/code&gt; est une configuration importante du daemon Docker qui permet d'exposer les métriques de performance et d'utilisation des ressources via un endpoint HTTP. Cette fonctionnalité, combinée avec le port par défaut 9323, vous donne accès à une mine d'informations sur votre environnement Docker.&lt;/p&gt;
&lt;h2 id="comprendre-loption-metrics-addr"&gt;&lt;a href="#comprendre-loption-metrics-addr" class="header-anchor"&gt;&lt;/a&gt;Comprendre l&amp;rsquo;option metrics-addr
&lt;/h2&gt;&lt;p&gt;L'option &lt;code&gt;metrics-addr&lt;/code&gt; configure l'adresse IP et le port sur lesquels le daemon Docker expose ses métriques. Par défaut, quand cette option est activée, Docker utilise le port 9323.&lt;/p&gt;
&lt;h3 id="pourquoi-le-port-9323-"&gt;&lt;a href="#pourquoi-le-port-9323-" class="header-anchor"&gt;&lt;/a&gt;Pourquoi le port 9323 ?
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;C'est un port non-privilégié (supérieur à 1024)&lt;/li&gt;
&lt;li&gt;Il est officiellement alloué à Docker par l'IANA pour cette fonctionnalité&lt;/li&gt;
&lt;li&gt;Il est peu susceptible d'entrer en conflit avec d'autres services courants&lt;/li&gt;
&lt;li&gt;Il suit la convention de Prometheus pour les ports d'exportation de métriques (9xxx)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ce-que-vous-obtenez-avec-metrics-addr"&gt;&lt;a href="#ce-que-vous-obtenez-avec-metrics-addr" class="header-anchor"&gt;&lt;/a&gt;Ce que vous obtenez avec metrics-addr
&lt;/h2&gt;&lt;p&gt;Activer l'option &lt;code&gt;metrics-addr&lt;/code&gt; dans le daemon.json vous donne accès à de nombreuses métriques Docker formatées nativement pour Prometheus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Métriques système&lt;/strong&gt; : Utilisation CPU, mémoire, disque et réseau par conteneur&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Métriques du daemon&lt;/strong&gt; : État du daemon, nombre d'objets gérés (conteneurs, images, volumes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Métriques d'utilisation&lt;/strong&gt; : Temps de démarrage des conteneurs, opérations réseau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Métriques de performance&lt;/strong&gt; : Latences des opérations de build et de déploiement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Toutes ces métriques sont disponibles au format Prometheus, ce qui les rend facilement intégrables dans un système de monitoring existant.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Point technique&lt;/strong&gt; : Le format Prometheus utilise des &amp;quot;labels&amp;quot; qui permettent de filtrer et d'agréger les métriques de manière flexible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cas-dutilisation-pour-metrics-addr"&gt;&lt;a href="#cas-dutilisation-pour-metrics-addr" class="header-anchor"&gt;&lt;/a&gt;Cas d&amp;rsquo;utilisation pour metrics-addr
&lt;/h2&gt;&lt;p&gt;L'activation de &lt;code&gt;metrics-addr&lt;/code&gt; est particulièrement utile dans les scénarios suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supervision d'infrastructure&lt;/strong&gt; : Intégration avec Prometheus pour surveiller l'ensemble de votre environnement Docker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerting automatisé&lt;/strong&gt; : Déclencher des alertes basées sur des seuils de métriques spécifiques&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashboarding&lt;/strong&gt; : Création de tableaux de bord Grafana pour visualiser les performances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyse de tendance&lt;/strong&gt; : Collecter des données sur de longues périodes pour identifier les tendances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Détection d'anomalies&lt;/strong&gt; : Repérer les comportements anormaux dans vos conteneurs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-de-metrics-addr"&gt;&lt;a href="#configuration-de-metrics-addr" class="header-anchor"&gt;&lt;/a&gt;Configuration de metrics-addr
&lt;/h2&gt;&lt;h3 id="configuration-via-daemonjson"&gt;&lt;a href="#configuration-via-daemonjson" class="header-anchor"&gt;&lt;/a&gt;Configuration via daemon.json
&lt;/h3&gt;&lt;p&gt;La méthode recommandée pour activer les métriques Docker est de modifier le fichier de configuration du daemon :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Éditez le fichier de configuration Docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajoutez la configuration pour activer l'API de métriques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;metrics-addr&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;127.0.0.1:9323&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;experimental&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; L'adresse &lt;code&gt;127.0.0.1&lt;/code&gt; limite l'accès à la machine locale. Pour exposer les métriques au réseau, utilisez &lt;code&gt;0.0.0.0:9323&lt;/code&gt; (avec précaution).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrez Docker pour appliquer les changements :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifiez que les métriques sont disponibles :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://localhost:9323/metrics
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous devriez voir une sortie avec de nombreuses métriques au format Prometheus.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="visualisation-simple-avec-docker-stats"&gt;&lt;a href="#visualisation-simple-avec-docker-stats" class="header-anchor"&gt;&lt;/a&gt;Visualisation simple avec Docker Stats
&lt;/h3&gt;&lt;p&gt;Pour un aperçu rapide des performances de vos conteneurs sans configuration supplémentaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela affiche en temps réel les statistiques d'utilisation des ressources pour tous les conteneurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU% : Pourcentage d'utilisation du CPU&lt;/li&gt;
&lt;li&gt;MEM% : Pourcentage d'utilisation de la mémoire&lt;/li&gt;
&lt;li&gt;NET I/O : Transfert réseau entrant/sortant&lt;/li&gt;
&lt;li&gt;BLOCK I/O : Lectures/écritures sur disque&lt;/li&gt;
&lt;li&gt;PIDS : Nombre de processus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour cibler des conteneurs spécifiques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats container1 container2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Pour des solutions plus avancées comme Prometheus+Grafana ou cAdvisor, voir la section &amp;quot;Solutions avancées&amp;quot; en fin d'article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-limites-à-connaître"&gt;&lt;a href="#les-limites-%c3%a0-conna%c3%aetre" class="header-anchor"&gt;&lt;/a&gt;Les limites à connaître
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limites des métriques natives&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas de persistance des données historiques&lt;/li&gt;
&lt;li&gt;Interface de visualisation minimale&lt;/li&gt;
&lt;li&gt;Absence d'alertes automatiques&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Considérations de performance&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'activation des métriques consomme des ressources supplémentaires&lt;/li&gt;
&lt;li&gt;L'exposition sur le réseau nécessite des précautions de sécurité&lt;/li&gt;
&lt;li&gt;Le port 9323 doit être protégé par un pare-feu ou limité à localhost&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limites de fonctionnalités&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les métriques Docker ne couvrent pas les métriques applicatives&lt;/li&gt;
&lt;li&gt;Pas d'information sur la santé des applications à l'intérieur des conteneurs&lt;/li&gt;
&lt;li&gt;Nécessite des outils complémentaires pour une vision complète&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bonnes-pratiques"&gt;&lt;a href="#bonnes-pratiques" class="header-anchor"&gt;&lt;/a&gt;Bonnes pratiques
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commencez simplement&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identifiez les métriques critiques pour votre cas d'usage&lt;/li&gt;
&lt;li&gt;Augmentez progressivement la complexité&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatisez les alertes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configurez des alertes sur les seuils critiques&lt;/li&gt;
&lt;li&gt;Évitez les alertes trop sensibles qui causeraient de la fatigue d'alarme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Corrélation de métriques&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combinez les métriques Docker avec des métriques système et applicatives&lt;/li&gt;
&lt;li&gt;Utilisez des dashboards qui montrent des corrélations entre métriques&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conservation des données&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Définissez une politique de rétention adaptée à vos besoins&lt;/li&gt;
&lt;li&gt;Agrégez les données anciennes pour économiser de l'espace&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="en-résumé"&gt;&lt;a href="#en-r%c3%a9sum%c3%a9" class="header-anchor"&gt;&lt;/a&gt;En résumé
&lt;/h2&gt;&lt;p&gt;Les métriques Docker sont essentielles pour une gestion efficace des conteneurs en production. La configuration via daemon.json offre un moyen simple d'exposer ces données pour votre monitoring, vous donnant une première couche de visibilité sur vos conteneurs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Astuce&lt;/strong&gt; : Commencez par les métriques natives et docker stats pour comprendre vos besoins, puis évaluez si vous avez besoin de solutions plus avancées.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="solutions-avancées-annexe"&gt;&lt;a href="#solutions-avanc%c3%a9es-annexe" class="header-anchor"&gt;&lt;/a&gt;Solutions avancées (Annexe)
&lt;/h2&gt;&lt;h3 id="1-intégration-avec-prometheus"&gt;&lt;a href="#1-int%c3%a9gration-avec-prometheus" class="header-anchor"&gt;&lt;/a&gt;1. Intégration avec Prometheus
&lt;/h3&gt;&lt;p&gt;Les métriques exposées via daemon.json sont déjà au format Prometheus. Pour les collecter :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# prometheus.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;scrape_configs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;job_name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;static_configs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;targets&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;127.0.0.1:9323&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-utilisation-de-cadvisor"&gt;&lt;a href="#2-utilisation-de-cadvisor" class="header-anchor"&gt;&lt;/a&gt;2. Utilisation de cAdvisor
&lt;/h3&gt;&lt;p&gt;Pour une solution prête à l'emploi avec interface web :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --volume&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/:/rootfs:ro &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --volume&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/run:/var/run:ro &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --volume&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/sys:/sys:ro &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --volume&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/docker/:/var/lib/docker:ro &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --publish&lt;span style="color:#f92672"&gt;=&lt;/span&gt;8080:8080 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --detach&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cadvisor &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gcr.io/cadvisor/cadvisor:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Interface disponible sur &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Docker : live-restore, c’est quoi ?</title><link>https://slash-root.fr/docker-live-restore-cest-quoi/</link><pubDate>Sun, 15 Jun 2025 18:06:04 +0200</pubDate><guid>https://slash-root.fr/docker-live-restore-cest-quoi/</guid><description>&lt;img src="https://slash-root.fr/docker-live-restore-cest-quoi/cover.png" alt="Featured image of post Docker : live-restore, c’est quoi ?" /&gt;&lt;p&gt;&lt;code&gt;live-restore&lt;/code&gt; est une fonctionnalité de Docker qui permet aux conteneurs de continuer à fonctionner normalement pendant que le daemon Docker redémarre. En activant cette option, vous évitez l'arrêt intempestif de vos applications lors des mises à jour ou des modifications de configuration du daemon Docker.&lt;/p&gt;
&lt;h2 id="le-problème--sans-live-restore"&gt;&lt;a href="#le-probl%c3%a8me--sans-live-restore" class="header-anchor"&gt;&lt;/a&gt;Le problème : Sans live-restore
&lt;/h2&gt;&lt;p&gt;Par défaut, quand vous exécutez &lt;code&gt;systemctl restart docker&lt;/code&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tous les conteneurs en cours d'exécution s'arrêtent immédiatement&lt;/li&gt;
&lt;li&gt;Les applications deviennent inaccessibles&lt;/li&gt;
&lt;li&gt;Les connexions réseau sont brutalement coupées&lt;/li&gt;
&lt;li&gt;Les données en mémoire non sauvegardées peuvent être perdues&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est comme couper l'électricité d'un bâtiment entier pour changer une ampoule !&lt;/p&gt;
&lt;h2 id="la-solution--comment-fonctionne-live-restore-"&gt;&lt;a href="#la-solution--comment-fonctionne-live-restore-" class="header-anchor"&gt;&lt;/a&gt;La solution : Comment fonctionne live-restore ?
&lt;/h2&gt;&lt;p&gt;Quand vous activez &lt;code&gt;live-restore&lt;/code&gt;, Docker modifie son comportement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Découplage&lt;/strong&gt; : Les conteneurs sont détachés du cycle de vie du daemon&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintien en vie&lt;/strong&gt; : Les processus continuent de s'exécuter sous la supervision du noyau Linux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reprise&lt;/strong&gt; : Le daemon Docker reprend le contrôle des conteneurs après son redémarrage&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Important&lt;/strong&gt; : Cela ne protège que contre les redémarrages du daemon Docker, pas contre les arrêts du système d'exploitation ou les pannes matérielles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="quand-utiliser-live-restore-"&gt;&lt;a href="#quand-utiliser-live-restore-" class="header-anchor"&gt;&lt;/a&gt;Quand utiliser live-restore ?
&lt;/h2&gt;&lt;p&gt;Cette fonctionnalité est particulièrement utile pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mises à jour de sécurité&lt;/strong&gt; : Appliquer des correctifs sans interruption de service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance planifiée&lt;/strong&gt; : Modifier la configuration Docker sans impacter les applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environnements critiques&lt;/strong&gt; : Où la disponibilité est essentielle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiements complexes&lt;/strong&gt; : Avec de nombreuses dépendances entre conteneurs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="comment-lactiver-"&gt;&lt;a href="#comment-lactiver-" class="header-anchor"&gt;&lt;/a&gt;Comment l&amp;rsquo;activer ?
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Éditez le fichier de configuration Docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajoutez ou modifiez la configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;live-restore&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrez Docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifiez l'activation :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker info | grep -i live
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous devriez voir : &lt;code&gt;Live Restore Enabled: true&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="les-limites-à-connaître"&gt;&lt;a href="#les-limites-%c3%a0-conna%c3%aetre" class="header-anchor"&gt;&lt;/a&gt;Les limites à connaître
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pas de protection contre&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les redémarrages du système d'exploitation&lt;/li&gt;
&lt;li&gt;Les pannes matérielles&lt;/li&gt;
&lt;li&gt;Les arrêts intempestifs du système&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fonctionnalités limitées&lt;/strong&gt; pendant le redémarrage :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La CLI Docker est indisponible&lt;/li&gt;
&lt;li&gt;Pas de création/suppression de conteneurs&lt;/li&gt;
&lt;li&gt;Gestion réseau et stockage limitée&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compatibilité&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Certains drivers de stockage peuvent poser problème&lt;/li&gt;
&lt;li&gt;Les fonctionnalités expérimentales ne sont pas toujours supportées&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bonnes-pratiques"&gt;&lt;a href="#bonnes-pratiques" class="header-anchor"&gt;&lt;/a&gt;Bonnes pratiques
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Testez d'abord en préproduction&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surveillez les métriques&lt;/strong&gt; système pendant les redémarrages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentez&lt;/strong&gt; la procédure pour votre équipe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ayez un plan de secours&lt;/strong&gt; en cas de problème&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="en-résumé"&gt;&lt;a href="#en-r%c3%a9sum%c3%a9" class="header-anchor"&gt;&lt;/a&gt;En résumé
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;live-restore&lt;/code&gt; est un outil précieux pour maintenir la disponibilité de vos conteneurs lors des opérations de maintenance du daemon Docker. Bien qu'il ne soit pas une solution miracle, il peut vous aider à réduire considérablement les temps d'arrêt non planifiés.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Astuce&lt;/strong&gt; : Pour une haute disponibilité complète, combinez &lt;code&gt;live-restore&lt;/code&gt; avec d'autres stratégies comme l'orchestration de conteneurs (Swarm, Kubernetes) et la répartition de charge.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Docker : Configuration et gestion des logs</title><link>https://slash-root.fr/docker-configuration-et-gestion-des-logs/</link><pubDate>Sun, 15 Jun 2025 17:33:44 +0200</pubDate><guid>https://slash-root.fr/docker-configuration-et-gestion-des-logs/</guid><description>&lt;img src="https://slash-root.fr/docker-configuration-et-gestion-des-logs/cover.png" alt="Featured image of post Docker : Configuration et gestion des logs" /&gt;&lt;p&gt;Salut les admins sys et autres dompteurs de conteneurs ! Aujourd'hui, plongeons dans l'univers des logs Docker. Comme on dit dans notre jargon : &amp;quot;Sans logs, c'est comme chercher une erreur dans un datacenter éteint - théoriquement possible, mais pas vraiment efficace.&amp;quot;&lt;/p&gt;
&lt;h2 id="comprendre-les-logs-dans-docker"&gt;&lt;a href="#comprendre-les-logs-dans-docker" class="header-anchor"&gt;&lt;/a&gt;Comprendre les logs dans Docker
&lt;/h2&gt;&lt;p&gt;Docker propose plusieurs pilotes de journalisation pour gérer les logs de vos conteneurs. Par défaut, tous vos messages sont acheminés vers le pilote &lt;code&gt;json-file&lt;/code&gt;, qui stocke les logs sous forme de fichiers JSON dans &lt;code&gt;/var/lib/docker/containers/[container-id]/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le problème ? Ces fichiers peuvent grossir... grossir... et encore grossir, jusqu'à dévorer tout l'espace disque de votre serveur. Une véritable histoire d'horreur pour tout admin système qui se respecte.&lt;/p&gt;
&lt;h2 id="configuration-du-pilote-de-logs-par-défaut"&gt;&lt;a href="#configuration-du-pilote-de-logs-par-d%c3%a9faut" class="header-anchor"&gt;&lt;/a&gt;Configuration du pilote de logs par défaut
&lt;/h2&gt;&lt;p&gt;La configuration des logs se fait dans le fichier &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;. Voici comment éviter le scénario catastrophe du disque plein :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;log-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;json-file&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;log-opts&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;max-size&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;10m&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;max-file&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Cette configuration limite la taille de chaque fichier de log à 10 Mo et permet une rotation sur 3 fichiers maximum.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Après cette modification, un petit redémarrage s'impose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="les-différents-pilotes-de-logs"&gt;&lt;a href="#les-diff%c3%a9rents-pilotes-de-logs" class="header-anchor"&gt;&lt;/a&gt;Les différents pilotes de logs
&lt;/h2&gt;&lt;p&gt;Docker ne se limite pas au format JSON. Voici les principaux pilotes disponibles, chacun avec ses forces et ses faiblesses :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;json-file&lt;/strong&gt; : Le pilote par défaut&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stocke les logs dans des fichiers JSON&lt;/li&gt;
&lt;li&gt;Accessible via &lt;code&gt;docker logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Exemple de configuration personnalisée :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;json-file &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt max-size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;10m &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt max-file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt labels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;app_name &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Parfait pour le développement et les petits déploiements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;local&lt;/strong&gt; : Le petit frère optimisé&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Format binaire plus compact que JSON&lt;/li&gt;
&lt;li&gt;Toujours accessible via &lt;code&gt;docker logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Exemple d'utilisation :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt max-size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;10m &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt max-file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt compress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Idéal pour les environnements de production avec espace disque limité&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;syslog&lt;/strong&gt; : L'option du barbu expérimenté&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Envoie les logs au service syslog de l'hôte&lt;/li&gt;
&lt;li&gt;Configuration type avec rotation via logrotate :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Dans /etc/docker/daemon.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;log-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;syslog&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;log-opts&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;syslog-address&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;udp://192.168.1.100:514&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{.ImageName}}/{{.Name}}/{{.ID}}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;syslog-facility&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;local7&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Configuration équivalente dans docker-compose :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;logging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;options&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;syslog-address&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;udp://192.168.1.100:514&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tag&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{.ImageName}}/{{.Name}}/{{.ID}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Petit prix à payer : &lt;code&gt;docker logs&lt;/code&gt; ne fonctionne plus directement&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;journald&lt;/strong&gt; : L'ami des systèmes modernes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parfait pour les systèmes basés sur systemd&lt;/li&gt;
&lt;li&gt;Exemple de configuration :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Activer journald dans /etc/docker/daemon.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;log-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;journald&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;log-opts&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{.ImageName}}/{{.Name}}/{{.ID}}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;app_name,environment&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour consulter les logs :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Voir les logs d&amp;#39;un conteneur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl CONTAINER_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mon_conteneur
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Suivre les logs en temps réel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -f CONTAINER_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mon_conteneur
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Filtrer par priorité&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -p err CONTAINER_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mon_conteneur
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Le choix évident si vous utilisez déjà systemd pour tout le reste&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Les poids lourds&lt;/strong&gt; : pour les environnements critiques&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Splunk&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;splunk &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt splunk-token&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YOUR_TOKEN &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt splunk-url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://your-splunk:8088 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt tag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{.ImageName}}/{{.Name}}/{{.ID}}&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;AWS CloudWatch Logs&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;awslogs &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt awslogs-region&lt;span style="color:#f92672"&gt;=&lt;/span&gt;eu-west-1 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt awslogs-group&lt;span style="color:#f92672"&gt;=&lt;/span&gt;my-log-group &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt awslogs-stream&lt;span style="color:#f92672"&gt;=&lt;/span&gt;my-stream &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fluentd&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# docker-compose.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;logging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;fluentd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;options&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;fluentd-address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;localhost:24224&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tag&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;docker.{{.Name}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;fluentd&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fluent/fluentd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./fluentd/conf:/fluentd/etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;24224:24224&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;GELF&lt;/strong&gt; (Graylog Extended Log Format) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;gelf &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt gelf-address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;udp://graylog:12201 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --log-opt tag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{.ImageName}}/{{.Name}}&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ces solutions sont idéales pour les environnements de production à grande échelle nécessitant une analyse avancée des logs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="configuration-par-conteneur"&gt;&lt;a href="#configuration-par-conteneur" class="header-anchor"&gt;&lt;/a&gt;Configuration par conteneur
&lt;/h2&gt;&lt;p&gt;Parfois, un conteneur mérite un traitement spécial. Vous pouvez configurer le pilote de logs individuellement, comme un couturier qui ajuste un costume sur mesure :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --log-driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;journald --log-opt labels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;app_id --name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mon-app nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ou dans un fichier docker-compose.yml :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mon_service&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mon_image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;logging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;json-file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;options&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max-size&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;10m&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Taille maximale d&amp;#39;un fichier de log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max-file&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Nombre maximum de fichiers de rotation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bonnes-pratiques-pour-la-gestion-des-logs"&gt;&lt;a href="#bonnes-pratiques-pour-la-gestion-des-logs" class="header-anchor"&gt;&lt;/a&gt;Bonnes pratiques pour la gestion des logs
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;La rotation, c'est la vie&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configurez toujours &lt;code&gt;max-size&lt;/code&gt; et &lt;code&gt;max-file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Évitez les fichiers de logs de 42 Go qui font pleurer les disques durs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Étiquetez, c'est gagné&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilisez des tags personnalisés pour chaque conteneur&lt;/li&gt;
&lt;li&gt;Ajoutez des labels pour plus de contexte&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Les logs, c'est comme le bon vin : ça se conserve&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Centralisez avec ELK, Graylog ou Loki&lt;/li&gt;
&lt;li&gt;Pensez à la rétention et à l'archivage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;La surveillance, c'est comme le café du matin : indispensable&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Surveillez l'espace disque utilisé par les logs&lt;/li&gt;
&lt;li&gt;Configurez des alertes pour les cas critiques, surtout en production&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Structurez vos logs&lt;/strong&gt; : encouragez vos développeurs à générer des logs au format JSON pour faciliter leur analyse&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Les logs, c'est un peu comme le journal intime de vos conteneurs. Une bonne configuration peut transformer une enquête policière en simple coup d'œil. Ou l'inverse.&lt;/p&gt;
&lt;p&gt;Comme dirait un vieux barbu de l'IT : &amp;quot;Les logs, c'est comme le papier toilette - on ne réalise leur importance que quand on en a plus.&amp;quot; Alors, à vos fichiers de configuration, et que la force des logs soit avec vous !&lt;/p&gt;
&lt;p&gt;Et souvenez-vous : dans un monde de conteneurs éphémères, seuls les logs racontent l'histoire complète (du moins jusqu'à ce qu'ils soient eux aussi supprimés par rotation).&lt;/p&gt;</description></item><item><title>Docker : Configuration et gestion du stockage</title><link>https://slash-root.fr/docker-configuration-et-gestion-du-stockage/</link><pubDate>Sun, 15 Jun 2025 16:56:25 +0200</pubDate><guid>https://slash-root.fr/docker-configuration-et-gestion-du-stockage/</guid><description>&lt;img src="https://slash-root.fr/docker-configuration-et-gestion-du-stockage/cover.png" alt="Featured image of post Docker : Configuration et gestion du stockage" /&gt;&lt;p&gt;Salut les admins sys et autres dompteurs de conteneurs ! Aujourd'hui, plongeons dans les profondeurs du stockage Docker. Comme on dit dans notre jargon : &amp;quot;Un disque mal configuré est à un admin système ce que Kryptonite est à Superman - une faiblesse qui peut tout paralyser.&amp;quot;&lt;/p&gt;
&lt;h2 id="comprendre-le-stockage-dans-docker"&gt;&lt;a href="#comprendre-le-stockage-dans-docker" class="header-anchor"&gt;&lt;/a&gt;Comprendre le stockage dans Docker
&lt;/h2&gt;&lt;p&gt;Docker utilise un système de stockage en couches qui peut être à la fois génial et déroutant. Chaque instruction dans un Dockerfile crée une nouvelle couche en lecture seule, et seul le conteneur en fonctionnement dispose d'une couche supérieure en lecture-écriture.&lt;/p&gt;
&lt;p&gt;Par défaut, Docker stocke toutes ses données (images, conteneurs, volumes) dans &lt;code&gt;/var/lib/docker&lt;/code&gt;. Sur un serveur de production, cette partition peut rapidement devenir le goulot d'étranglement de votre système.&lt;/p&gt;
&lt;h3 id="configuration-du-pilote-de-stockage"&gt;&lt;a href="#configuration-du-pilote-de-stockage" class="header-anchor"&gt;&lt;/a&gt;Configuration du pilote de stockage
&lt;/h3&gt;&lt;p&gt;Docker propose plusieurs pilotes de stockage, chacun avec ses avantages et inconvénients. Vous pouvez configurer le pilote à utiliser dans le fichier &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;storage-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;overlay2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; &lt;code&gt;overlay2&lt;/code&gt; est généralement le pilote recommandé pour les distributions Linux modernes, offrant le meilleur équilibre entre performance et fonctionnalités.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Après cette modification, un redémarrage du service Docker est nécessaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="les-différents-pilotes-de-stockage"&gt;&lt;a href="#les-diff%c3%a9rents-pilotes-de-stockage" class="header-anchor"&gt;&lt;/a&gt;Les différents pilotes de stockage
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;overlay2&lt;/strong&gt; : Le pilote recommandé pour la plupart des cas d'usage&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avantages : Bonnes performances, compatibilité&lt;/li&gt;
&lt;li&gt;Prérequis : Noyau Linux 4.0+ et systèmes de fichiers modernes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le pilote overlay2 repose sur la fonctionnalité OverlayFS du noyau Linux, qui permet de superposer plusieurs systèmes de fichiers. Il fonctionne avec la plupart des systèmes de fichiers courants (ext4, xfs) et offre de bien meilleures performances que l'ancien pilote overlay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;devicemapper&lt;/strong&gt; : Utilisé principalement sur les anciennes versions de CentOS/RHEL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour la production, configurez-le en mode &lt;code&gt;direct-lvm&lt;/code&gt; plutôt qu'en mode loop-lvm par défaut&lt;/li&gt;
&lt;li&gt;Permet d'utiliser un périphérique de bloc dédié pour les données Docker, offrant de meilleures performances&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;storage-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;devicemapper&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;storage-opts&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;dm.directlvm_device=/dev/xvdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Systèmes de fichiers avancés et distribués&lt;/strong&gt; : Pour aller plus loin&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les systèmes comme &lt;strong&gt;btrfs&lt;/strong&gt; et &lt;strong&gt;zfs&lt;/strong&gt; offrent des fonctionnalités avancées comme les snapshots&lt;/li&gt;
&lt;li&gt;Les systèmes de fichiers distribués comme &lt;strong&gt;Ceph&lt;/strong&gt; ou &lt;strong&gt;GlusterFS&lt;/strong&gt; permettent de créer une infrastructure de stockage Docker hautement disponible et évolutive&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt; : Pour tirer pleinement profit de ces systèmes distribués, utilisez la technique du &amp;quot;volume bind déguisé&amp;quot; qui permet de créer un volume Docker qui pointe vers un point de montage réseau&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="déplacer-le-répertoire-de-données-docker"&gt;&lt;a href="#d%c3%a9placer-le-r%c3%a9pertoire-de-donn%c3%a9es-docker" class="header-anchor"&gt;&lt;/a&gt;Déplacer le répertoire de données Docker
&lt;/h2&gt;&lt;p&gt;Si votre partition &lt;code&gt;/var&lt;/code&gt; est trop petite, vous pouvez déplacer le répertoire de données Docker vers un autre emplacement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;data-root&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/docker-data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt; Ne modifiez jamais ce paramètre sur une installation Docker existante sans migrer correctement les données !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour migrer les données d'une installation existante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Arrêter Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl stop docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Créer le nouveau répertoire&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /mnt/docker-data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Copier les données existantes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rsync -aP /var/lib/docker/ /mnt/docker-data/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Configurer le nouveau chemin dans daemon.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Puis redémarrer Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="volumes-bind-déguisés--la-technique-du-ninja-du-stockage"&gt;&lt;a href="#volumes-bind-d%c3%a9guis%c3%a9s--la-technique-du-ninja-du-stockage" class="header-anchor"&gt;&lt;/a&gt;Volumes bind déguisés : la technique du ninja du stockage
&lt;/h2&gt;&lt;p&gt;Une des techniques les plus astucieuses dans l'arsenal de l'admin Docker est celle du &amp;quot;volume bind déguisé&amp;quot; - ou comment faire passer un bind mount pour un volume Docker respectable, tout en gardant le contrôle sur l'emplacement physique des données.&lt;/p&gt;
&lt;p&gt;Imaginez pouvoir dire à vos conteneurs : &amp;quot;Voici un volume Docker standard&amp;quot; alors qu'en coulisses, vous stockez les données sur votre cluster Ceph soigneusement configuré. C'est comme servir un plat végétarien à vos invités sans qu'ils ne remarquent l'absence de viande - l'élégance à l'état pur.&lt;/p&gt;
&lt;p&gt;Cette technique est particulièrement précieuse quand vous travaillez avec :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des systèmes de stockage distribués (Ceph, GlusterFS)&lt;/li&gt;
&lt;li&gt;Des montages NFS pour un stockage partagé&lt;/li&gt;
&lt;li&gt;Des volumes qui doivent survivre à la migration de vos conteneurs&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pour les détails d'implémentation&lt;/strong&gt;, consultez mon article dédié : &lt;a href="https://slash-root.fr/docker-volume-bind-deguise/"&gt;Docker : Volume bind déguisé&lt;/a&gt; qui vous explique pas à pas comment mettre en place cette technique.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="nettoyage-de-lespace-disque"&gt;&lt;a href="#nettoyage-de-lespace-disque" class="header-anchor"&gt;&lt;/a&gt;Nettoyage de l&amp;rsquo;espace disque
&lt;/h2&gt;&lt;p&gt;Docker a tendance à accumuler des données inutilisées. Voici quelques commandes pour faire le ménage :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Supprimer les conteneurs arrêtés, réseaux non utilisés, images dangling et cache de build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker system prune
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Pour être encore plus agressif et supprimer aussi les images non utilisées&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker system prune -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Pour récupérer de l&amp;#39;espace sur les volumes non utilisés&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker volume prune
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bonnes-pratiques-pour-la-gestion-du-stockage"&gt;&lt;a href="#bonnes-pratiques-pour-la-gestion-du-stockage" class="header-anchor"&gt;&lt;/a&gt;Bonnes pratiques pour la gestion du stockage
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utilisez des images légères&lt;/strong&gt; : Préférez les images basées sur Alpine quand c'est possible&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optimisez vos Dockerfiles&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combinez les commandes RUN pour réduire le nombre de couches&lt;/li&gt;
&lt;li&gt;Nettoyez les caches de paquets dans la même instruction qui les installe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package1 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package2 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt clean &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /var/lib/apt/lists/*&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utilisez .dockerignore&lt;/strong&gt; pour exclure les fichiers inutiles du contexte de build&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surveillez régulièrement&lt;/strong&gt; l'espace disque utilisé par Docker avec &lt;code&gt;docker system df&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurez un cron job&lt;/strong&gt; pour nettoyer périodiquement les ressources inutilisées&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;La gestion du stockage Docker ressemble parfois à un jeu de Tetris où les blocs seraient des gigaoctets - il faut savoir optimiser l'espace pour éviter le game over.&lt;/p&gt;
&lt;p&gt;En configurant correctement votre pilote de stockage et en adoptant de bonnes pratiques de nettoyage, vous pourrez éviter ce moment gênant où vous devez expliquer pourquoi le serveur de production s'est arrêté juste parce qu'il y avait trop d'images &amp;quot;hello-world&amp;quot; qui traînaient.&lt;/p&gt;
&lt;p&gt;Et souvenez-vous : dans un monde de conteneurs éphémères, les données persistantes méritent toujours une réflexion approfondie (et un bon volume Docker).&lt;/p&gt;</description></item><item><title>Docker : Configuration des réseaux par défaut</title><link>https://slash-root.fr/docker-configuration-des-reseaux-par-defaut/</link><pubDate>Sun, 15 Jun 2025 16:17:21 +0200</pubDate><guid>https://slash-root.fr/docker-configuration-des-reseaux-par-defaut/</guid><description>&lt;img src="https://slash-root.fr/docker-configuration-des-reseaux-par-defaut/cover.png" alt="Featured image of post Docker : Configuration des réseaux par défaut" /&gt;&lt;p&gt;Salut les admins sys et autres dompteurs de conteneurs ! Aujourd'hui, plongeons dans le fascinant (et parfois frustrant) monde des réseaux Docker. Comme on dit dans notre jargon : &amp;quot;Un conteneur sans réseau, c'est comme un pingouin sans banquise - techniquement possible, mais pas vraiment utile.&amp;quot;&lt;/p&gt;
&lt;h2 id="les-réseaux-docker-par-défaut"&gt;&lt;a href="#les-r%c3%a9seaux-docker-par-d%c3%a9faut" class="header-anchor"&gt;&lt;/a&gt;Les réseaux Docker par défaut
&lt;/h2&gt;&lt;p&gt;Docker, cet invité un peu sans-gêne, s'installe et crée directement trois réseaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bridge&lt;/code&gt; : Le réseau par défaut où tous vos conteneurs font la fête (172.17.0.0/16)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;host&lt;/code&gt; : Pour quand vos conteneurs veulent se sentir comme à la maison&lt;/li&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; : Pour les conteneurs asociaux qui préfèrent rester dans leur coin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le réseau &lt;code&gt;bridge&lt;/code&gt; s'approprie allègrement la plage 172.17.0.0/16. Mais que se passe-t-il quand cette plage est déjà occupée par votre infrastructure existante ? Eh bien, c'est un peu comme deux familles qui réservent le même bungalow pour les vacances - ça crée des tensions.&lt;/p&gt;
&lt;h3 id="résolution-des-conflits-avec-le-réseau-par-défaut"&gt;&lt;a href="#r%c3%a9solution-des-conflits-avec-le-r%c3%a9seau-par-d%c3%a9faut" class="header-anchor"&gt;&lt;/a&gt;Résolution des conflits avec le réseau par défaut
&lt;/h3&gt;&lt;p&gt;Pour modifier la plage d'adresses que Docker utilise par défaut, éditez le fichier &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; (si le fichier n'existe pas, créez-le avec la même joie que lorsque vous créez un nouveau répertoire &lt;code&gt;batman&lt;/code&gt;) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;default-address-pools&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;base&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;192.168.66.0/24&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après cette modification, un petit redémarrage s'impose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="incrémentation-automatique-des-réseaux-docker"&gt;&lt;a href="#incr%c3%a9mentation-automatique-des-r%c3%a9seaux-docker" class="header-anchor"&gt;&lt;/a&gt;Incrémentation automatique des réseaux Docker
&lt;/h2&gt;&lt;p&gt;Quand vous créez de nouveaux réseaux Docker avec &lt;code&gt;docker network create&lt;/code&gt;, Docker fait preuve d'une logique implacable pour l'allocation des sous-réseaux. En fonction de votre configuration &lt;code&gt;default-address-pools&lt;/code&gt;, Docker va attribuer automatiquement des plages d'adresses IP qui s'incrémentent à chaque nouveau réseau :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create mon-super-reseau
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour cette commande, Docker utilisera automatiquement la première plage disponible: 192.168.66.0/24&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create mon-autre-reseau
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour ce deuxième réseau, Docker passera à la plage suivante: 192.168.67.0/24&lt;/p&gt;
&lt;p&gt;C'est comme distribuer des tranches de gâteau - mais en version IP.&lt;/p&gt;
&lt;p&gt;Si vous préférez choisir votre part vous-même :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create --subnet&lt;span style="color:#f92672"&gt;=&lt;/span&gt;192.168.42.0/24 mon-reseau-avec-le-nombre-de-la-vie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="les-différents-types-de-réseaux-docker"&gt;&lt;a href="#les-diff%c3%a9rents-types-de-r%c3%a9seaux-docker" class="header-anchor"&gt;&lt;/a&gt;Les différents types de réseaux Docker
&lt;/h2&gt;&lt;h3 id="dans-un-docker-engine-standalone"&gt;&lt;a href="#dans-un-docker-engine-standalone" class="header-anchor"&gt;&lt;/a&gt;Dans un Docker Engine standalone
&lt;/h3&gt;&lt;p&gt;Un Docker Engine standard (non-Swarm) propose plusieurs types de réseaux pour répondre à des besoins distincts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bridge&lt;/code&gt; : Le réseau par défaut utilisé par les conteneurs. C'est un réseau virtuel interne qui permet aux conteneurs de communiquer entre eux et avec l'hôte.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;host&lt;/code&gt; : Supprime l'isolation réseau entre le conteneur et l'hôte. Le conteneur utilise directement la pile réseau de l'hôte. Utile pour les performances mais réduit l'isolation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;none&lt;/code&gt; : Désactive complètement le réseau. Le conteneur n'a aucun accès réseau externe. Utile pour les traitements isolés ne nécessitant pas de communication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;macvlan&lt;/code&gt; : Attribue une adresse MAC physique aux conteneurs, les faisant apparaître comme des périphériques physiques sur le réseau. Idéal pour migrer des applications legacy qui dépendent d'IPs spécifiques.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Créer un réseau bridge personnalisé (recommandé au lieu du bridge par défaut)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create --driver bridge mon-reseau-bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dans-un-cluster-docker-swarm"&gt;&lt;a href="#dans-un-cluster-docker-swarm" class="header-anchor"&gt;&lt;/a&gt;Dans un cluster Docker Swarm
&lt;/h3&gt;&lt;p&gt;Docker Swarm, c'est comme une colocation de conteneurs répartis sur plusieurs serveurs. La communication entre nœuds nécessite des réseaux spéciaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;overlay&lt;/code&gt; : Permet aux conteneurs de différents nœuds de communiquer comme s'ils étaient sur le même hôte. Crée un réseau virtual &amp;quot;au-dessus&amp;quot; de l'infrastructure physique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ingress&lt;/code&gt; : Un réseau overlay spécial qui facilite le routage du trafic entrant vers les services appropriés, indépendamment du nœud qui héberge le conteneur. Gère également l'équilibrage de charge interne.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Créer un réseau overlay pour les services Swarm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create --driver overlay --attachable mon-reseau-multi-hote
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tous ces réseaux peuvent coexister sur le même hote ou cluster, permettant ainsi une architecture réseau flexible et adaptée à chaque cas d'usage.&lt;/p&gt;
&lt;h3 id="le-réseau-ingress-et-la-plage-100008"&gt;&lt;a href="#le-r%c3%a9seau-ingress-et-la-plage-100008" class="header-anchor"&gt;&lt;/a&gt;Le réseau Ingress et la plage 10.0.0.0/8
&lt;/h3&gt;&lt;p&gt;Par défaut, ce cher réseau &lt;code&gt;ingress&lt;/code&gt; s'installe confortablement dans la plage 10.0.0.0/8. Si vous utilisez déjà cette plage, les symptômes sont clairs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker vous lance des erreurs cryptiques avec &amp;quot;network overlap&amp;quot;&lt;/li&gt;
&lt;li&gt;Vos conteneurs deviennent subitement muets&lt;/li&gt;
&lt;li&gt;Vous commencez à douter de vos choix de carrière&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reconfiguration-du-réseau-ingress"&gt;&lt;a href="#reconfiguration-du-r%c3%a9seau-ingress" class="header-anchor"&gt;&lt;/a&gt;Reconfiguration du réseau Ingress
&lt;/h3&gt;&lt;p&gt;Contrairement à ce qu'on pourrait croire, &lt;strong&gt;pas besoin de quitter le swarm&lt;/strong&gt; pour résoudre ce problème ! Une approche beaucoup plus civilisée consiste à :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Supprimer poliment le réseau ingress existant :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network rm ingress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Créer un nouveau réseau ingress avec votre propre plage :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker network create &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --driver overlay &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --ingress &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --subnet&lt;span style="color:#f92672"&gt;=&lt;/span&gt;172.30.0.0/16 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --gateway&lt;span style="color:#f92672"&gt;=&lt;/span&gt;172.30.0.1 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ingress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voilà qui est beaucoup moins traumatisant pour votre swarm que de tout démolir et reconstruire !&lt;/p&gt;
&lt;h2 id="bonnes-pratiques-pour-la-gestion-des-réseaux-docker"&gt;&lt;a href="#bonnes-pratiques-pour-la-gestion-des-r%c3%a9seaux-docker" class="header-anchor"&gt;&lt;/a&gt;Bonnes pratiques pour la gestion des réseaux Docker
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Planifiez votre allocation d'adresses IP&lt;/strong&gt; : Un schéma bien pensé vaut mieux qu'une nuit blanche de débogage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choisissez le bon type de réseau&lt;/strong&gt; : Ne vous limitez pas au &lt;code&gt;bridge&lt;/code&gt; par défaut.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bridge personnalisé&lt;/strong&gt; (&lt;code&gt;docker network create my_bridge&lt;/code&gt;) : Résolution DNS entre conteneurs, isolation, idéal pour les applications sur un seul hôte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlay&lt;/strong&gt; (&lt;code&gt;docker network create -d overlay my_overlay&lt;/code&gt;) : Communication entre hôtes dans Swarm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Macvlan&lt;/strong&gt; (&lt;code&gt;docker network create -d macvlan --subnet=192.168.40.0/24 --gateway=192.168.40.1 -o parent=eth0 my_macvlan&lt;/code&gt;) : Intégration au réseau physique&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurisez votre infrastructure&lt;/strong&gt; : &lt;strong&gt;Évitez d'exposer les ports de base de données&lt;/strong&gt; (comme MySQL, PostgreSQL, MongoDB) sur votre réseau hôte. C'est une faille de sécurité courante et totalement évitable. Dans les réseaux Docker Compose ou Swarm, la communication inter-services se fait nativement via le nom du service. En pratique, votre service d'application peut simplement utiliser &lt;code&gt;db:3306&lt;/code&gt; comme adresse de connexion, sans jamais avoir à publier le port 3306 sur l'interface de l'hôte. Dans Swarm, cette communication fonctionne même entre des conteneurs déployés sur différents nœuds physiques via les réseaux overlay&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adoptez une nomenclature claire&lt;/strong&gt; : Préférez &lt;code&gt;project_frontend_net&lt;/code&gt; ou &lt;code&gt;prod_db_network&lt;/code&gt; à des noms génériques comme &lt;code&gt;net1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Documentez votre architecture réseau&lt;/strong&gt; : Votre futur vous (ou votre remplaçant après votre burnout) vous remerciera&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;La gestion des réseaux Docker ressemble parfois à un jeu de Tetris avec des blocs CIDR - challenging mais satisfaisant une fois maîtrisé. En comprenant comment Docker assigne et gère les adresses IP, vous pourrez éviter ces moments où, tard dans la nuit, vous fixez votre écran en murmurant &amp;quot;mais pourquoi ça ne communique pas ?&amp;quot;.&lt;/p&gt;
&lt;p&gt;Une bonne configuration réseau vous permettra de dormir tranquille, sachant que vos conteneurs peuvent socialiser entre eux sans créer d'incident diplomatique sur votre infrastructure.&lt;/p&gt;
&lt;p&gt;Et souvenez-vous : dans un monde de conteneurs éphémères, seule une bonne configuration réseau est éternelle (ou du moins, jusqu'au prochain &lt;code&gt;docker-compose down&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Debian : Configuration complète d’unattended-upgrades pour une sécurité sans effort</title><link>https://slash-root.fr/debian-configuration-complete-dunattended-upgrades-pour-une-securite-sans-effort/</link><pubDate>Thu, 08 May 2025 14:03:19 +0200</pubDate><guid>https://slash-root.fr/debian-configuration-complete-dunattended-upgrades-pour-une-securite-sans-effort/</guid><description>&lt;img src="https://slash-root.fr/debian-configuration-complete-dunattended-upgrades-pour-une-securite-sans-effort/cover.jpg" alt="Featured image of post Debian : Configuration complète d’unattended-upgrades pour une sécurité sans effort" /&gt;&lt;h2 id="1-introduction-ou-pourquoi-il-est-temps-darrêter-de-faire-semblant"&gt;&lt;a href="#1-introduction-ou-pourquoi-il-est-temps-darr%c3%aater-de-faire-semblant" class="header-anchor"&gt;&lt;/a&gt;1. Introduction, ou pourquoi il est temps d&amp;rsquo;arrêter de faire semblant
&lt;/h2&gt;&lt;p&gt;Laissez-moi deviner : vous êtes du genre à vous vanter d'être un administrateur système compétent, mais vous ne vous souvenez pas de la dernière fois que vous avez tapé &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt; sur vos serveurs en production ? Pas étonnant que vos systèmes ressemblent à un gruyère numérique avec plus de trous que de fromage. Un bon sysadmin met à jour ses systèmes - un &lt;em&gt;vrai&lt;/em&gt; sysadmin automatise ça et passe à autre chose.&lt;/p&gt;
&lt;p&gt;Heureusement, les créateurs de Debian n'ont pas supposé que vous étiez tous des héros de la ligne de commande avec une mémoire infaillible et un agenda aussi vide que &lt;code&gt;/dev/null&lt;/code&gt;. Ils nous ont gratifiés d'&lt;strong&gt;unattended-upgrades&lt;/strong&gt;, ce petit bijou d'automatisation que seuls les vrais barbus savent configurer correctement. Bien sûr, vous pourriez continuer à mettre à jour manuellement, de la même manière que vous pourriez continuer à croire que vi est plus difficile qu'Emacs.&lt;/p&gt;
&lt;h2 id="2-unattended-upgrades--le-sysadmin-silencieux-qui-ne-prend-jamais-de-pause-café"&gt;&lt;a href="#2-unattended-upgrades--le-sysadmin-silencieux-qui-ne-prend-jamais-de-pause-caf%c3%a9" class="header-anchor"&gt;&lt;/a&gt;2. Unattended-upgrades : le sysadmin silencieux qui ne prend jamais de pause café
&lt;/h2&gt;&lt;p&gt;Contrairement à votre stagiaire qui croit que &amp;quot;mise à jour de sécurité&amp;quot; signifie &amp;quot;changer son mot de passe de 'password123' à 'password1234'&amp;quot;, unattended-upgrades est un service qui prend son travail au sérieux. Cette petite merveille d'ingénierie fonctionne pendant que vous dormez profondément, rêvant probablement de clusters Kubernetes parfaitement orchestrés (on sait tous que ça n'arrive que dans les rêves).&lt;/p&gt;
&lt;p&gt;Techniquement parlant (et les vrais barbus aiment parler techniquement), c'est un démon qui s'exécute via systemd timers pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chercher les mises à jour que vous auriez dû installer il y a des semaines&lt;/li&gt;
&lt;li&gt;Filtrer celles qui empêcheront votre système de se faire pwner par un script kiddie&lt;/li&gt;
&lt;li&gt;Les installer sans vous demander votre avis (parce qu'on sait tous que vous diriez &amp;quot;plus tard&amp;quot;)&lt;/li&gt;
&lt;li&gt;Redémarrer votre serveur au milieu de la nuit quand personne ne regardera vos graphs de monitoring chuter momentanément&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce paquet fonctionne sur n'importe quelle version de Debian (de l'antique Buster à la fraichement sortie Bookworm) et même sur ces ersatz de Debian comme Ubuntu, si vous vous abaissez à utiliser de telles distributions.&lt;/p&gt;
&lt;h2 id="3-installation-pour-ceux-qui-savent-encore-taper-sur-un-clavier"&gt;&lt;a href="#3-installation-pour-ceux-qui-savent-encore-taper-sur-un-clavier" class="header-anchor"&gt;&lt;/a&gt;3. Installation pour ceux qui savent encore taper sur un clavier
&lt;/h2&gt;&lt;h3 id="31-les-bases-même-votre-stagiaire-pourrait-le-faire"&gt;&lt;a href="#31-les-bases-m%c3%aame-votre-stagiaire-pourrait-le-faire" class="header-anchor"&gt;&lt;/a&gt;3.1 Les bases (même votre stagiaire pourrait le faire)
&lt;/h3&gt;&lt;p&gt;Ouvrez votre terminal noir (parce que bien sûr, vous utilisez un fond noir avec des polices vertes, comme tout vrai barbu qui se respecte) et tapez ces incantations magiques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install unattended-upgrades apt-listchanges
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Ce que vous venez de conjurer :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unattended-upgrades&lt;/code&gt; : le véritable héros silencieux qui fera le travail que vous procrastinez habituellement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apt-listchanges&lt;/code&gt; : pour recevoir des emails détaillés que vous prétendrez lire avant de les archiver automatiquement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-activation-pour-les-admins-qui-ont-peur-de-modifier-les-fichiers-de-configuration-à-la-main"&gt;&lt;a href="#32-activation-pour-les-admins-qui-ont-peur-de-modifier-les-fichiers-de-configuration-%c3%a0-la-main" class="header-anchor"&gt;&lt;/a&gt;3.2 Activation pour les admins qui ont peur de modifier les fichiers de configuration à la main
&lt;/h3&gt;&lt;p&gt;Si vous préférez l'approche &amp;quot;clique-bouton&amp;quot; (aucun jugement, enfin peut-être un peu), Debian vous offre un assistant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg-reconfigure --priority&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low unattended-upgrades
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Astuce de vrai barbu :&lt;/strong&gt; L'argument &lt;code&gt;--priority=low&lt;/code&gt; force l'affichage de &lt;strong&gt;toutes&lt;/strong&gt; les options possibles, parce que les vrais barbus veulent tout contrôler. Les autres priorités sont pour ceux qui pensent qu'utiliser une souris sous Linux est une bonne idée.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un menu pseudo-graphique va apparaître dans votre terminal. Sélectionnez &amp;quot;Oui&amp;quot; (comme si vous aviez réellement le choix). Cette étape crée le fichier &lt;code&gt;/etc/apt/apt.conf.d/20auto-upgrades&lt;/code&gt; avec une configuration basique pour les âmes simples.&lt;/p&gt;
&lt;h2 id="4-configuration-pour-les-vrais-barbus-ceux-qui-nutilisent-pas-de-gui"&gt;&lt;a href="#4-configuration-pour-les-vrais-barbus-ceux-qui-nutilisent-pas-de-gui" class="header-anchor"&gt;&lt;/a&gt;4. Configuration pour les vrais barbus (ceux qui n&amp;rsquo;utilisent pas de GUI)
&lt;/h2&gt;&lt;p&gt;La configuration d'unattended-upgrades se fait dans deux fichiers de configuration. Si vous ne savez pas ce qu'est un fichier de configuration, fermez cet article et retournez installer Windows :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/apt/apt.conf.d/50unattended-upgrades&lt;/code&gt; - Où la vraie magie se passe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/apt/apt.conf.d/20auto-upgrades&lt;/code&gt; - Pour dire à votre système à quelle fréquence il doit se sauver lui-même&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="41-sélection-des-dépôts-ou-comment-distinguer-les-mises-à-jour-importantes-des-futilités"&gt;&lt;a href="#41-s%c3%a9lection-des-d%c3%a9p%c3%b4ts-ou-comment-distinguer-les-mises-%c3%a0-jour-importantes-des-futilit%c3%a9s" class="header-anchor"&gt;&lt;/a&gt;4.1 Sélection des dépôts (ou comment distinguer les mises à jour importantes des futilités)
&lt;/h3&gt;&lt;p&gt;Éditez &lt;code&gt;/etc/apt/apt.conf.d/50unattended-upgrades&lt;/code&gt; (avec vi, bien sûr, pas avec cette abomination qu'est nano). La section &lt;code&gt;Origins-Pattern&lt;/code&gt; est comme le filtre de Tinder de votre système - elle décide quelles mises à jour méritent son attention :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;Unattended-Upgrade::Origins-Pattern {
 &amp;#34;origin=Debian,codename=${distro_codename}-security&amp;#34;;

 // &amp;#34;origin=Debian,codename=${distro_codename}-updates&amp;#34;;

 // &amp;#34;origin=Debian,codename=${distro_codename}-proposed-updates&amp;#34;;

 // &amp;#34;origin=Debian,codename=${distro_codename}-backports&amp;#34;;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Guide de traduction du jargon Debian pour mortels :&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de dépôt&lt;/th&gt;
&lt;th&gt;Ce que Debian dit&lt;/th&gt;
&lt;th&gt;Ce que ça signifie vraiment&lt;/th&gt;
&lt;th&gt;À activer si...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Correctifs de sécurité critiques&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Colmate les trous que les script kiddies utilisent déjà&amp;quot;&lt;/td&gt;
&lt;td&gt;Vous avez un minimum d'instinct de survie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-updates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Corrections importantes non sécuritaires&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Bugs suffisamment gênants pour qu'on daigne les corriger&amp;quot;&lt;/td&gt;
&lt;td&gt;Vous en avez assez que vos services plantent mystérieusement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-proposed-updates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Candidats en attente de validation&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Quelqu'un a bricolé ça, ça semble marcher, mais on n'est pas sûr&amp;quot;&lt;/td&gt;
&lt;td&gt;Vous aimez vivre dangereusement (ou avez un environnement de test)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-backports&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Nouvelles versions portées vers stable&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Du code récent greffé sur un OS dinosaure&amp;quot;&lt;/td&gt;
&lt;td&gt;Un fonctionnalité VRAIMENT nécessaire vous manque&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🐑 Conseil de troupeau :&lt;/strong&gt; La plupart des moutons n'activent que &lt;code&gt;-security&lt;/code&gt;. Les vrais barbus activent tout puis blâment systemd quand ça casse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="42-planification-des-mises-à-jour-ou-quand-laisser-votre-système-jouer-au-docteur"&gt;&lt;a href="#42-planification-des-mises-%c3%a0-jour-ou-quand-laisser-votre-syst%c3%a8me-jouer-au-docteur" class="header-anchor"&gt;&lt;/a&gt;4.2 Planification des mises à jour (ou quand laisser votre système jouer au docteur)
&lt;/h3&gt;&lt;p&gt;Modifiez &lt;code&gt;/etc/apt/apt.conf.d/20auto-upgrades&lt;/code&gt; pour définir quand votre système se soignera tout seul :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;APT::Periodic::Update-Package-Lists &amp;#34;1&amp;#34;;
APT::Periodic::Unattended-Upgrade &amp;#34;1&amp;#34;;
APT::Periodic::Unattended-Upgrade-Time &amp;#34;3&amp;#34;;
APT::Periodic::RandomSleep &amp;#34;60&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Explication pour ceux qui n'ont jamais lu le man :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update-Package-Lists&lt;/strong&gt; : À quelle fréquence votre système recherche de nouvelles mises à jour.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;1&amp;quot;&lt;/code&gt; = tous les jours (pour les paranoïaques)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;7&amp;quot;&lt;/code&gt; = une fois par semaine (pour les décontractés)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; = jamais (pour ceux qui aiment jouer à la roulette russe avec les exploits)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unattended-Upgrade&lt;/strong&gt; : Quand appliquer réellement ces mises à jour.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;1&amp;quot;&lt;/code&gt; = quotidiennement (recommandé par tous ceux qui ont déjà dû nettoyer un serveur compromis)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;7&amp;quot;&lt;/code&gt; = hebdomadaire (un compromis pour les téméraires)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; = jamais (alors pourquoi lire cet article ?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unattended-Upgrade-Time&lt;/strong&gt; : L'heure à laquelle lancer le processus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;3&amp;quot;&lt;/code&gt; = 3h du matin, quand même les administrateurs système devraient dormir&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RandomSleep&lt;/strong&gt; : Le délai aléatoire pour éviter d'être comme tout le monde.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;60&amp;quot;&lt;/code&gt; = entre 0 et 60 minutes de décalage (pour ne pas faire tomber les miroirs Debian quand tout le monde se rue dessus à 3h00 pile)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🐔 Pour les insomniaques :&lt;/strong&gt; Sur Debian 11+, &lt;code&gt;RandomSleep&lt;/code&gt; est en minutes. Sur Debian 10 et avant, c'est en secondes. Pourquoi ? Parce que la cohérence, c'est surfait quand on peut introduire des bugs subtils dans votre configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="43-gestion-du-reboot-automatique-ou-comment-faire-pleurer-vos-utilisateurs"&gt;&lt;a href="#43-gestion-du-reboot-automatique-ou-comment-faire-pleurer-vos-utilisateurs" class="header-anchor"&gt;&lt;/a&gt;4.3 Gestion du reboot automatique (ou comment faire pleurer vos utilisateurs)
&lt;/h3&gt;&lt;p&gt;Les mises à jour du noyau sont comme les légumes - elles ne font effet que si vous redémarrez. Configurez le comportement dans &lt;code&gt;/etc/apt/apt.conf.d/50unattended-upgrades&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;Unattended-Upgrade::Automatic-Reboot &amp;#34;true&amp;#34;;
Unattended-Upgrade::Automatic-Reboot-Time &amp;#34;04:30&amp;#34;;
Unattended-Upgrade::Automatic-Reboot-WithUsers &amp;#34;false&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Ce que ces options signifient vraiment :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic-Reboot&lt;/strong&gt; : Le grand interrupteur de la terreur nocturne.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt; = &amp;quot;J'aime vivre dangereusement et mes backups sont à jour&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt; = &amp;quot;Je préfère avoir un noyau vulnérable mais au moins je sais quand mon serveur redémarre&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic-Reboot-Time&lt;/strong&gt; : L'heure du crime parfait.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Format : &lt;code&gt;&amp;quot;HH:MM&amp;quot;&lt;/code&gt; (choisir une heure où personne ne remarquera que tout est tombé)&lt;/li&gt;
&lt;li&gt;Conseil de barbu : planifiez-le toujours APRÈS les mises à jour, pas pendant&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic-Reboot-WithUsers&lt;/strong&gt; : Le dilemme éthique.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt; = &amp;quot;Les sessions des utilisateurs importent moins que la sécurité&amp;quot; (approche soviétique)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt; = &amp;quot;Les humains d'abord&amp;quot; (approche diplomatique)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 Histoire vraie :&lt;/strong&gt; J'ai vu un administrateur configurer un redémarrage automatique à 14h sur un serveur de production. Il a ensuite passé trois semaines à se demander pourquoi les utilisateurs lui envoyaient des messages haineux tous les jours.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="44-notifications-pour-prétendre-que-vous-surveillez-vos-serveurs"&gt;&lt;a href="#44-notifications-pour-pr%c3%a9tendre-que-vous-surveillez-vos-serveurs" class="header-anchor"&gt;&lt;/a&gt;4.4 Notifications pour prétendre que vous surveillez vos serveurs
&lt;/h3&gt;&lt;p&gt;Les emails de notification sont là pour vous donner l'illusion que vous savez ce qui se passe sur vos serveurs. Configurez-les dans &lt;code&gt;/etc/apt/apt.conf.d/50unattended-upgrades&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;Unattended-Upgrade::Mail &amp;#34;admin@domaine.fr&amp;#34;;
Unattended-Upgrade::MailReport &amp;#34;on-change&amp;#34;;

//Unattended-Upgrade::Mail-Server &amp;#34;smtp.example.com&amp;#34;;
//Unattended-Upgrade::Mail-Server-Port &amp;#34;587&amp;#34;;
//Unattended-Upgrade::Mail-Server-Login &amp;#34;votre_login&amp;#34;;
//Unattended-Upgrade::Mail-Server-Password &amp;#34;votre_motdepasse&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Options pour votre spam personnel :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mail&lt;/strong&gt; : Qui recevra les rapports que personne ne lit.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mettez votre email perso si vous aimez être réveillé à 3h du matin par des notifications&lt;/li&gt;
&lt;li&gt;Ou créez un filtre qui les envoie directement dans un dossier que vous n'ouvrirez jamais&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MailReport&lt;/strong&gt; : La fréquence de spam.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;always&amp;quot;&lt;/code&gt; = pour ceux qui aiment leur boîte mail bien remplie&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;on-change&amp;quot;&lt;/code&gt; = le choix des gens raisonnables&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;only-on-error&amp;quot;&lt;/code&gt; = pour ceux qui adhèrent à la philosophie &amp;quot;pas de nouvelles, bonnes nouvelles&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📣 Rappel essentiel :&lt;/strong&gt; Ces mails ne serviront à rien si vous n'avez pas un MTA fonctionnel. Installez-en un ou tous ces paramètres ne seront que des vœux pieux :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install postfix
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# OU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install msmtp msmtp-mta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id="5-dompter-les-mises-à-jour-majeures-ou-lart-déviter-la-crise-cardiaque-à-3h-du-matin"&gt;&lt;a href="#5-dompter-les-mises-%c3%a0-jour-majeures-ou-lart-d%c3%a9viter-la-crise-cardiaque-%c3%a0-3h-du-matin" class="header-anchor"&gt;&lt;/a&gt;5. Dompter les mises à jour majeures (ou l&amp;rsquo;art d&amp;rsquo;éviter la crise cardiaque à 3h du matin)
&lt;/h2&gt;&lt;p&gt;Les mises à jour de sécurité, c'est bien, mais les mises à jour majeures, c'est comme laisser un enfant de 5 ans conduire votre voiture - ça peut aller très mal, très vite. Particulièrement avec ces paquets qui utilisent le système d'alternatives de Debian, cette brillante invention qui garantit votre future migraine.&lt;/p&gt;
&lt;h3 id="51-le-piège-des-alternatives-ou-comment-se-tirer-une-balle-dans-le-pied-automatiquement"&gt;&lt;a href="#51-le-pi%c3%a8ge-des-alternatives-ou-comment-se-tirer-une-balle-dans-le-pied-automatiquement" class="header-anchor"&gt;&lt;/a&gt;5.1 Le piège des alternatives (ou comment se tirer une balle dans le pied automatiquement)
&lt;/h3&gt;&lt;p&gt;Les langages comme PHP, Python ou Java utilisent ce merveilleux système d'alternatives, qui permet à plusieurs versions de coexister (comme vos ex, mais en plus utile). Malheureusement, ce système a été conçu par quelqu'un qui n'a manifestement jamais entendu parler de l'automatisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le drame en 4 actes :&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Acte&lt;/th&gt;
&lt;th&gt;Tragédie&lt;/th&gt;
&lt;th&gt;Résultat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Votre système découvre PHP 8.3 et pense &amp;quot;oh, quelle belle mise à jour !&amp;quot;&lt;/td&gt;
&lt;td&gt;Installation lancée à 3h17 du matin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Le script demande poliment : &amp;quot;Voulez-vous faire de cette nouvelle version la version par défaut ?&amp;quot;&lt;/td&gt;
&lt;td&gt;Votre serveur fige, attendant une réponse qui ne viendra jamais&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Vous dormez paisiblement pendant que votre installation reste suspendue&lt;/td&gt;
&lt;td&gt;Configuration en état zombie (&lt;code&gt;sudo dpkg --configure -a&lt;/code&gt; sera votre mantra du matin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Votre système de mise à jour automatique est lui-même bloqué&lt;/td&gt;
&lt;td&gt;Félicitations, vous venez de désactiver votre sécurité automatique&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-solutions-pour-barbus-confirmés-et-amateurs-de-nuits-tranquilles"&gt;&lt;a href="#52-solutions-pour-barbus-confirm%c3%a9s-et-amateurs-de-nuits-tranquilles" class="header-anchor"&gt;&lt;/a&gt;5.2 Solutions pour barbus confirmés (et amateurs de nuits tranquilles)
&lt;/h3&gt;&lt;h4 id="521-entraîner-debconf-à-ne-pas-vous-demander-votre-avis"&gt;&lt;a href="#521-entra%c3%aener-debconf-%c3%a0-ne-pas-vous-demander-votre-avis" class="header-anchor"&gt;&lt;/a&gt;5.2.1 Entraîner debconf à ne pas vous demander votre avis
&lt;/h4&gt;&lt;p&gt;Ce code est l'équivalent de mettre un bâillon sur debconf pour qu'il arrête de poser des questions stupides :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo echo &lt;span style="color:#e6db74"&gt;&amp;#34;php8.3 php8.3/common/default_for_install boolean false&amp;#34;&lt;/span&gt; | sudo debconf-set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo echo &lt;span style="color:#e6db74"&gt;&amp;#34;php8.2 php8.2/common/default_for_install boolean true&amp;#34;&lt;/span&gt; | sudo debconf-set-selections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Quand l'utiliser&lt;/strong&gt; : Lorsque vous êtes un admin responsable qui teste d'abord les nouvelles versions avant de les infliger à votre production. Concept alien pour certains, je sais.&lt;/p&gt;
&lt;h4 id="522-expliquer-à-debian-ce-quest-une-priorité-comme-à-votre-chef-de-projet"&gt;&lt;a href="#522-expliquer-%c3%a0-debian-ce-quest-une-priorit%c3%a9-comme-%c3%a0-votre-chef-de-projet" class="header-anchor"&gt;&lt;/a&gt;5.2.2 Expliquer à Debian ce qu&amp;rsquo;est une priorité (comme à votre chef de projet)
&lt;/h4&gt;&lt;p&gt;Le système de priorité d'alternatives est l'équivalent technique d'une hiérarchie féodale - celui avec le plus grand nombre gagne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 &lt;span style="color:#ae81ff"&gt;82&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --slave /usr/bin/phar phar /usr/bin/phar8.2 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --slave /usr/bin/phpdbg phpdbg /usr/bin/phpdbg8.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.3 &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --slave /usr/bin/phar phar /usr/bin/phar8.3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --slave /usr/bin/phpdbg phpdbg /usr/bin/phpdbg8.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Astuce de vrai barbu :&lt;/strong&gt; La valeur numérique est juste une préférence, pas une garantie. Utilisez des nombres significativement différents si vous ne voulez pas être surpris. J'ai déjà vu des administrateurs utiliser 10 et 11, puis se plaindre que leur choix n'était pas respecté - niveau amateur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="523-le-coup-du-hook-post-installation-ou-comment-avoir-le-dernier-mot"&gt;&lt;a href="#523-le-coup-du-hook-post-installation-ou-comment-avoir-le-dernier-mot" class="header-anchor"&gt;&lt;/a&gt;5.2.3 Le coup du hook post-installation (ou comment avoir le dernier mot)
&lt;/h4&gt;&lt;p&gt;Quand vous en avez assez que Debian ignore vos préférences, créez un hook qui aura le dernier mot après chaque mise à jour :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/apt/apt.conf.d/99post-upgrade-hook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajoutez ce code vindicatif dans le fichier :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;DPkg::Post-Invoke {
 &amp;#34;if [ -f /usr/bin/php8.2 ] &amp;amp;&amp;amp; [ -f /usr/bin/php8.3 ]; then update-alternatives --set php /usr/bin/php8.2; fi&amp;#34;;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Pourquoi c'est brillant&lt;/strong&gt; : Cette approche passive-agressive rétablit votre version préférée après CHAQUE opération APT, même si un paquet tente sournoisement de changer la version par défaut. C'est l'équivalent de dire &amp;quot;Merci pour ton opinion, maintenant on va faire à ma façon quand même&amp;quot;.&lt;/p&gt;
&lt;h4 id="524-mettre-un-gilet-pare-balles-contre-les-versions-majeures"&gt;&lt;a href="#524-mettre-un-gilet-pare-balles-contre-les-versions-majeures" class="header-anchor"&gt;&lt;/a&gt;5.2.4 Mettre un gilet pare-balles contre les versions majeures
&lt;/h4&gt;&lt;p&gt;Ajoutez à &lt;code&gt;/etc/apt/apt.conf.d/50unattended-upgrades&lt;/code&gt; ce code défensif :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;Unattended-Upgrade::MinimalSteps &amp;#34;true&amp;#34;;
Unattended-Upgrade::Allow-downgrade &amp;#34;false&amp;#34;;
Unattended-Upgrade::Allow-APT-Mark-Fallback &amp;#34;false&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Décryptage des incantations de protection :&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Ce qu'elle fait vraiment&lt;/th&gt;
&lt;th&gt;Traduction en langage barbu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MinimalSteps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Change en mode &amp;quot;un paquet à la fois&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Je préfère que mon système plante sur UN paquet plutôt que sur TOUS&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allow-downgrade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Empêche les retours en arrière&lt;/td&gt;
&lt;td&gt;&amp;quot;Non, on ne revient pas à PHP 5 juste parce que tu as peur du changement&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allow-APT-Mark-Fallback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Désactive l'auto-sélection de nouvelles versions&lt;/td&gt;
&lt;td&gt;&amp;quot;Touche pas à mes versions majeures, animal ! &amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="525-la-liste-noire-de-la-honte-ou-comment-bannir-les-paquets-problématiques"&gt;&lt;a href="#525-la-liste-noire-de-la-honte-ou-comment-bannir-les-paquets-probl%c3%a9matiques" class="header-anchor"&gt;&lt;/a&gt;5.2.5 La liste noire de la honte (ou comment bannir les paquets problématiques)
&lt;/h4&gt;&lt;p&gt;Placez vos paquets critiques sur la liste des indésirables avec cette configuration :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-aptconf" data-lang="aptconf"&gt;Unattended-Upgrade::Blacklist {
 &amp;#34;php*&amp;#34;;
 &amp;#34;mariadb-server&amp;#34;;
 &amp;#34;postgresql*&amp;#34;;
 &amp;#34;nginx&amp;#34;;
 &amp;#34;apache2&amp;#34;;
};
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="53-le-plan-de-bataille-pour-les-vrais-professionnels"&gt;&lt;a href="#53-le-plan-de-bataille-pour-les-vrais-professionnels" class="header-anchor"&gt;&lt;/a&gt;5.3 Le plan de bataille pour les vrais professionnels
&lt;/h3&gt;&lt;p&gt;📌 &lt;strong&gt;Stratégie de survie en environnement de production&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bloquez les versions majeures&lt;/strong&gt; avec la configuration 5.2.4, à moins que vous n'aimiez les appels nocturnes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blacklistez impitoyablement&lt;/strong&gt; tout ce qui fait tourner votre business avec l'option 5.2.5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construisez un environnement de test&lt;/strong&gt; identique - les vrais barbus testent AVANT, pas en production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planifiez vos mises à jour majeures&lt;/strong&gt; comme des opérations militaires, avec des plans de repli&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faites des backups complets&lt;/strong&gt; avant toute mise à jour majeure, ou préparez votre CV&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Alerte rouge&lt;/strong&gt; : Les mises à jour majeures automatiques sur des composants critiques, c'est comme jouer à la roulette russe avec le serveur de production - vous pourriez vous en sortir, mais est-ce vraiment un risque que vous voulez prendre ? Pour tout ce qui fait tourner votre business (PHP, bases de données, serveurs web), planifiez, testez, puis priez avant de mettre à jour.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="6-entrer-dans-la-matrice--surveillance-et-déblocage-des-catastrophes-nocturnes"&gt;&lt;a href="#6-entrer-dans-la-matrice--surveillance-et-d%c3%a9blocage-des-catastrophes-nocturnes" class="header-anchor"&gt;&lt;/a&gt;6. Entrer dans la matrice : surveillance et déblocage des catastrophes nocturnes
&lt;/h2&gt;&lt;h3 id="61-les-logs-que-personne-ne-lit-jamais-jusquà-ce-que-tout-explose"&gt;&lt;a href="#61-les-logs-que-personne-ne-lit-jamais-jusqu%c3%a0-ce-que-tout-explose" class="header-anchor"&gt;&lt;/a&gt;6.1 Les logs que personne ne lit jamais (jusqu&amp;rsquo;à ce que tout explose)
&lt;/h3&gt;&lt;p&gt;Même avec l'automatisation, il faut surveiller ce que fait cette bête sauvage qu'est unattended-upgrades. Sinon, c'est comme laisser votre adolescent seul à la maison pendant le week-end - tôt ou tard, vous le regretterez. Voici les fichiers que vous prétendrez consulter régulièrement :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier log&lt;/th&gt;
&lt;th&gt;Ce qu'il contient réellement&lt;/th&gt;
&lt;th&gt;Quand le lire (soyons honnêtes)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/unattended-upgrades/unattended-upgrades.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Le journal de bord du capitaine automatique&lt;/td&gt;
&lt;td&gt;Quand votre patron demande &amp;quot;que s'est-il passé ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/unattended-upgrades/unattended-upgrades-dpkg.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ce que dpkg marmonne dans sa barbe&lt;/td&gt;
&lt;td&gt;Quand le premier log ne vous dit pas pourquoi tout a explosé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apt/history.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;La preuve que quelqu'un a fait quelque chose&lt;/td&gt;
&lt;td&gt;Pour savoir QUI blâmer (spoiler : c'est toujours systemd)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apt/term.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Les mêmes informations qu'avant, mais en plus verbeux&lt;/td&gt;
&lt;td&gt;Pour les masochistes qui aiment lire 5000 lignes de texte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/dpkg.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chaque respiration de dpkg&lt;/td&gt;
&lt;td&gt;Pour les vrais barbus qui lisent les logs comme d'autres lisent Game of Thrones&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les logs sont automagiquement comprimés et rotatés (&lt;code&gt;.1&lt;/code&gt;, &lt;code&gt;.2.gz&lt;/code&gt;, etc.). Voici comment faire semblant de les surveiller régulièrement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tail -n &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; /var/log/unattended-upgrades/unattended-upgrades.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo grep -i &lt;span style="color:#e6db74"&gt;&amp;#34;error\|fail\|warning&amp;#34;&lt;/span&gt; /var/log/unattended-upgrades/unattended-upgrades.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="62-déclencher-manuellement-les-mises-à-jour-pour-le-plaisir-de-voir-quelque-chose-se-casser-en-temps-réel"&gt;&lt;a href="#62-d%c3%a9clencher-manuellement-les-mises-%c3%a0-jour-pour-le-plaisir-de-voir-quelque-chose-se-casser-en-temps-r%c3%a9el" class="header-anchor"&gt;&lt;/a&gt;6.2 Déclencher manuellement les mises à jour (pour le plaisir de voir quelque chose se casser en temps réel)
&lt;/h3&gt;&lt;p&gt;Pour voir unattended-upgrades en action, comme si vous regardiez un documentaire animalier sur un prédateur dans son habitat naturel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo unattended-upgrade --dry-run --debug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo unattended-upgrade --debug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo unattended-upgrade -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧪 Preuve d'expertise technique&lt;/strong&gt; : Utilisez &lt;code&gt;--dry-run&lt;/code&gt; lors des démos pour vos collègues. Si ça fonctionne, prenez un air suffisant. Si ça plante, dites nonchalamment : &amp;quot;C'est exactement pourquoi j'utilise dry-run, voyez-vous&amp;quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="63-techniques-de-réanimation-pour-système-bloqué-ou-comment-sauver-votre-journée"&gt;&lt;a href="#63-techniques-de-r%c3%a9animation-pour-syst%c3%a8me-bloqu%c3%a9-ou-comment-sauver-votre-journ%c3%a9e" class="header-anchor"&gt;&lt;/a&gt;6.3 Techniques de réanimation pour système bloqué (ou comment sauver votre journée)
&lt;/h3&gt;&lt;p&gt;Quand votre système de mise à jour automatique s'arrête en position fœtale, voici la trousse d'urgence du barbu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg --audit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg --configure --pending
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get -f install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-mark showhold
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si votre système est bloqué par une question existentielle comme &amp;quot;Voulez-vous que PHP 8.3 devienne le nouveau PHP par défaut ?&amp;quot;, il est temps d'intervenir manuellement (comme arracher la manette des mains d'un enfant) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg --configure -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg-reconfigure php8.3-common
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OPNsense : Configuration du NAT Reflection</title><link>https://slash-root.fr/opnsense-configuration-du-nat-reflection/</link><pubDate>Sat, 08 Feb 2025 16:23:40 +0100</pubDate><guid>https://slash-root.fr/opnsense-configuration-du-nat-reflection/</guid><description>&lt;img src="https://slash-root.fr/opnsense-configuration-du-nat-reflection/cover.jpg" alt="Featured image of post OPNsense : Configuration du NAT Reflection" /&gt;&lt;p&gt;Lors de la mise en place de services web ou d'applications sur son réseau local, on se retrouve souvent confronté à un problème courant : comment accéder à ces services depuis l'intérieur du réseau en utilisant la même adresse que les utilisateurs externes ? C'est là qu'intervient le NAT Reflection dans OPNsense, une fonctionnalité puissante mais parfois mal comprise.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous allons voir comment configurer correctement les options du NAT Reflection pour permettre un accès transparent à vos services, que ce soit depuis l'extérieur ou l'intérieur de votre réseau.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="configuration-des-options-du-nat-reflection"&gt;&lt;a href="#configuration-des-options-du-nat-reflection" class="header-anchor"&gt;&lt;/a&gt;Configuration des options du NAT Reflection
&lt;/h2&gt;&lt;p&gt;Pour configurer le NAT Reflection dans OPNsense, suivez ces étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;code&gt;Firewall&lt;/code&gt; (1), &lt;code&gt;Settings&lt;/code&gt; (2), puis &lt;code&gt;Advanced&lt;/code&gt; (3)&lt;/li&gt;
&lt;li&gt;Faire défiler jusqu'à la section &lt;code&gt;Network Address Translation&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Deux options importantes sont à configurer :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Reflection for port forwards&lt;/code&gt; : Cette option permet aux clients du réseau local d'accéder aux services redirigés via l'adresse IP publique du pare-feu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Automatic outbound NAT for Reflection&lt;/code&gt; : Cette option configure automatiquement les règles NAT sortantes nécessaires pour le NAT Reflection.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="cas-dutilisation"&gt;&lt;a href="#cas-dutilisation" class="header-anchor"&gt;&lt;/a&gt;Cas d&amp;rsquo;utilisation
&lt;/h2&gt;&lt;p&gt;Le NAT Reflection est particulièrement utile dans plusieurs scénarios :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hébergement d'un serveur web accessible via un nom de domaine&lt;/li&gt;
&lt;li&gt;Services internes nécessitant une URL cohérente (interne/externe)&lt;/li&gt;
&lt;li&gt;Applications utilisant des redirections de ports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par exemple, si vous hébergez un site web &lt;code&gt;monsite.com&lt;/code&gt; qui pointe vers votre IP publique, le NAT Reflection permettra aux utilisateurs internes d'accéder au site via &lt;code&gt;monsite.com&lt;/code&gt; au lieu d'utiliser une adresse IP locale.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="points-dattention"&gt;&lt;a href="#points-dattention" class="header-anchor"&gt;&lt;/a&gt;Points d&amp;rsquo;attention
&lt;/h2&gt;&lt;p&gt;Quelques points importants à garder à l'esprit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le NAT Reflection peut légèrement impacter les performances du pare-feu&lt;/li&gt;
&lt;li&gt;Activez ces options uniquement si nécessaire&lt;/li&gt;
&lt;li&gt;Vérifiez régulièrement les logs pour détecter d'éventuelles anomalies&lt;/li&gt;
&lt;li&gt;Utilisez des règles de pare-feu strictes pour contrôler l'accès&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="application-des-changements"&gt;&lt;a href="#application-des-changements" class="header-anchor"&gt;&lt;/a&gt;Application des changements
&lt;/h2&gt;&lt;p&gt;Une fois les options configurées :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cliquer sur &lt;code&gt;Save&lt;/code&gt; en bas de la page&lt;/li&gt;
&lt;li&gt;Appliquer les changements en cliquant sur &lt;code&gt;Apply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tester l'accès à vos services depuis le réseau local&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Le NAT Reflection est une fonctionnalité essentielle d'OPNsense qui, une fois correctement configurée, permet une gestion transparente des services hébergés. Les deux options présentées ici simplifient grandement sa mise en œuvre tout en maintenant la sécurité du réseau.&lt;/p&gt;
&lt;p&gt;N'hésitez pas à activer ces options si vous avez besoin d'accéder à vos services hébergés via l'adresse IP publique depuis votre réseau local. Cependant, gardez toujours à l'esprit l'impact potentiel sur la sécurité et surveillez régulièrement votre configuration.&lt;/p&gt;</description></item><item><title>Déployer une application sur Kubernetes</title><link>https://slash-root.fr/deployer-une-application-sur-kubernetes/</link><pubDate>Thu, 06 Feb 2025 08:30:54 +0100</pubDate><guid>https://slash-root.fr/deployer-une-application-sur-kubernetes/</guid><description>&lt;img src="https://slash-root.fr/deployer-une-application-sur-kubernetes/cover.png" alt="Featured image of post Déployer une application sur Kubernetes" /&gt;&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Aujourd'hui, je vous embarque à bord de mon voyage, ce voyage consiste à progressivement remplacer mes conteneurs Docker par des services Kubernetes dans mon homelab.&lt;/p&gt;
&lt;p&gt;Pourquoi ce changement ?&lt;br /&gt;
Car étant encore étudiant et en plein dans le sujet, quoi de mieux que de mettre les mains dans le camboui ?&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Préparation&lt;/h1&gt;
&lt;h2 id="la-cible"&gt;&lt;a href="#la-cible" class="header-anchor"&gt;&lt;/a&gt;La cible
&lt;/h2&gt;&lt;p&gt;Parmi la liste des applications que je dois migrer, j'ai dû en choisir une, et Mealie a été l'heureuse gagnante.&lt;br /&gt;
&lt;a href="https://mealie.io/"&gt;C'est quoi Mealie ?&lt;/a&gt; Mealie est un gestionnaire de recettes de cuisine accessible via navigateur, entièrement self hosté.&lt;/p&gt;
&lt;h2 id="lexistant"&gt;&lt;a href="#lexistant" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;existant
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mealie&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ghcr.io/mealie-recipes/mealie:latest &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mealie-front-01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;reverse-proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.mealie-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.mealie-https.rule=Host(`mealie.homelab.domain.fr`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-vol:/app/data/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env_file&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/opt/docker/apps/mealie/stack.env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;reverse-proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mealie-network&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mealie-vol&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ci-haut, vous pouvez voir le yaml docker-compose ayant servi à créer mon conteneur Mealie.&lt;/p&gt;
&lt;p&gt;Nous pouvons y observer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une image en tag latest (on ne juge pas !).&lt;/li&gt;
&lt;li&gt;2 Réseaux alloués
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mealie-network&lt;/code&gt; étant le réseau propre de cette stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse-proxy&lt;/code&gt; permettant de relier le conteneur au conteneur Reverse Proxy traefik, permettant d'exposer Mealie et de lui attribuer un Certificat Let's Encrypt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Des labels:
&lt;ul&gt;
&lt;li&gt;Des middlewares classiques pour sécuriser l'accès au service Mealie.&lt;/li&gt;
&lt;li&gt;Deux routeurs, un &lt;code&gt;https&lt;/code&gt; pour forcer le port d'entrée sur le 443 et un routeur pour attribuer un hostname au conteneur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Un volume Docker monté sur le chemin &lt;code&gt;/app/data&lt;/code&gt; du conteneur&lt;/li&gt;
&lt;li&gt;Un fichier d'environnement contenant toutes les clés-valeurs requises pour que Mealie fonctionne.&lt;/li&gt;
&lt;li&gt;Le port d'exposition du Conteneur dans le pod (ici, 9000)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-migration"&gt;&lt;a href="#la-migration" class="header-anchor"&gt;&lt;/a&gt;La migration
&lt;/h2&gt;&lt;p&gt;Maintenant que nous avons décortiqué les éléments présents, il va falloir les traduire en manifests Kubernetes.&lt;br /&gt;
Les manifests Kubernetes sont des fichiers yaml déclaratif qui vont dire à Kubernetes &lt;strong&gt;comment&lt;/strong&gt; on veut que notre application soit déployée.&lt;/p&gt;
&lt;p&gt;Il est important de noter que mes volumes sont provisonnés sur mon TrueNAS Scale grâce à une StorageClass via le protocole NFS, contrairement à Docker, où les volumes étaient stockés en local.&lt;br /&gt;
Mealie étant une application tournant sur du LiteSQL, le site de l'application ne recommande pas de faire du LiteSQL avec du NFS, j'ai donc dû opter pour une PostgreSQL dédiée.&lt;/p&gt;
&lt;p&gt;(Petite information, il existe un binaire nommé &lt;code&gt;kompose&lt;/code&gt; qui permet de faire une traduction d'un fichier docker-compose en manifests yaml, mais ça s'appelle enlever le fun de la découverte.)&lt;/p&gt;
&lt;p&gt;Reprenons notre liste à puce de la partie précédente.&lt;br /&gt;
Il nous faut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Il nous faut un objet de type &lt;a href="https://kubernetes.io/fr/docs/concepts/workloads/controllers/deployment/"&gt;Deployment&lt;/a&gt;, il va servir à déployer les &lt;a href="https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/"&gt;Pods&lt;/a&gt; avec des configuration que j'aurais définie.&lt;br /&gt;
Ce manifest yaml contiendra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'image Docker de Mealie (On enlève le tag latest, c'est risqué de pointer sur un tag d'image en mouvement perpétuel).&lt;/li&gt;
&lt;li&gt;Le nombre de Replicas du pod (Un replica est une copie d'un pod, si l'un tombe l'autre prend la relève, sert aussi de loadbalancing en cas de workload important).&lt;/li&gt;
&lt;li&gt;Un appel à des clés-valeurs d'une Configmap, qui est un objet contenant ici mes variables d'environnement.&lt;/li&gt;
&lt;li&gt;Un appel a des clés-valeurs d'un Secret, qui est un objet qui contient ici les mots de passe de la base de donnée PostgreSQL.&lt;/li&gt;
&lt;li&gt;Un appel à un PersistentVolumeClaim, qui lui même est lié à un PersistentVolume qui sera monté sur &lt;code&gt;app/data&lt;/code&gt; nous reviendrons plus tard dessus, mais retenez que c'est le volume.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un objet de type &lt;a href="https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/"&gt;StatefulSet&lt;/a&gt; pour déployer la base de donnée.&lt;br /&gt;
Le StatefulSet fonctionne presque exactement comme un Deployment, mais il est fait pour les services type stateful, les pods sont identifiés et non-interchangeable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensuite, on va avoir besoin de créer les objets &lt;a href="https://kubernetes.io/docs/concepts/configuration/configmap/"&gt;Configmap&lt;/a&gt; et &lt;a href="https://kubernetes.io/fr/docs/concepts/configuration/secret/"&gt;Secret&lt;/a&gt;.&lt;br /&gt;
Ces objets permettent de stocker sous forme de clé-valeur des informations, que ce soit des variables d'environnement, des arguments de commande, etc.., ils peuvent ensuite être consommés par des pods.&lt;br /&gt;
La différence entre un Secret et une Configmap réside dans le fait que les Secrets sont encodés en base64, et sont fait pour contenir des données sensibles.&lt;br /&gt;
Exemple d'une configmap:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mealie-configmap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mealie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ALLOW_SIGNUP&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;TZ&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Europe/Paris&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_ENGINE&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour que les pods puissent communiquer entre eux ET que le pod du front web soit disponible dehors, il nous faut des objets de type &lt;a href="https://kubernetes.io/fr/docs/concepts/services-networking/service/"&gt;Services&lt;/a&gt;.&lt;br /&gt;
Les Services permettent d'exposer un ou plusieurs pods, car les pods de nature sont amenés à être détruits et recréés, et leur IP changent également.&lt;br /&gt;
La logique d'un service fonctionne donc comme ça:&lt;br /&gt;
Les Pods ont des labels sous forme de clé valeur --&amp;gt; Les Services qui ont une IP statique visent ces labels, et sont donc attribués à ces pods, le service peut même faire du LoadBalancing entre les pods qu'il expose.&lt;br /&gt;
Un service au minimum demande:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le protocole du port qu'on va exposer (TCP ou UDP).&lt;/li&gt;
&lt;li&gt;Le port que le Service expose (donc son propre port).&lt;/li&gt;
&lt;li&gt;Le port du conteneur que le Service va viser.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour nos besoins, il faudra créer un service pour exposer la base de donnée et un service pour exposer le front.&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;Pour les volumes, il faut faire une introduction aux &lt;a href="https://kubernetes.io/fr/docs/concepts/storage/persistent-volumes/"&gt;PersistentVolumes&lt;/a&gt; (PV) et aux PersistentVolumeClaims (PVC).&lt;br /&gt;
Un PV est un volume de stockage défini provisionné manuellement ou dynamiquement (via une &lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes/"&gt;StorageClass&lt;/a&gt;).&lt;br /&gt;
Le PVC quant à lui est une requête pour consommer un PV.&lt;br /&gt;
Dans mon cas à moi, j'utilise une StorageClass qui est issue du CSI (Container Storage Interface) &lt;a href="https://github.com/democratic-csi/democratic-csi"&gt;DemocraticCSI&lt;/a&gt;, ça me permet de créer un CSIDriver spécifiquement fait pour interagir avec l'API de TrueNAS, afin de provisionner des PV stockés sur un Dataset ZFS via le protocole NFS.&lt;br /&gt;
Il nous faut donc 2 volumes:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Le premier sera monté sur le &lt;code&gt;app/data&lt;/code&gt; du front de Mealie, il stockera les Metadata du front, et fera 1Gi.&lt;/li&gt;
&lt;li&gt;Le deuxième sera le volume de la base de donnée PostgreSQL, ce dernier ne sera pas défini dans son propre manifest yaml mais directement dans le manifest du StatefulSet.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="6"&gt;
&lt;li&gt;Nous en avons terminé avec les objets qui constituent l'application en elle-même, pour finir il nous faut un objet de type &lt;a href="https://kubernetes.io/fr/docs/concepts/services-networking/ingress/"&gt;Ingress&lt;/a&gt;.&lt;br /&gt;
Un Ingress c'est un objet créé par un &lt;a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"&gt;IngressController&lt;/a&gt;, vous connaissez surement quelques noms connus d'IngressController: Nginx, Traefik, HAProxy, par exemple, pour ma part, j'utilise Traefik car je m'en servais déjà sur Docker.&lt;br /&gt;
Un Ingress est un Reverse Proxy et LoadBalancer de couche 7, il agit comme un point d'entrée pour des routes HTTP et HTTPS et redirige les requêtes selon les règles qu'il contient, par exemple, il peut rediriger une requête vers un objet de type service précis, lui même redirigeant à un pod , dépendant de l'URL (machin.fr/app qui redirige au service app).&lt;br /&gt;
Il peut également gérer plusieurs noms de domaine, utiliser des headers de sécurité et implémenter un certificat SSL/TLS.&lt;br /&gt;
Normalement, il faudrait créer un objet de type certificat contenu dans un Secret Kubernetes et appeler ce secret dans le manifest de l'Ingress, mais comme j'utilise Cert-Manager qui est relié à mon domaine dans Cloudflare, je n'ai qu'à rajouter une annotation dans l'objet pour faire une requête de Certificat Let's Encrypt.&lt;br /&gt;
Je ne rentrerais pas en détail dans le sujet de Cert-Manager, cependant, &lt;a href="https://cert-manager.io/"&gt;voici la documentation officielle du projet&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Construction&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;└── base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── kustomization.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-configmap.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-db-service.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-deployment.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-pvc.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-secret.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-statefulset.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;├── mealie-ingressroute.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;└── mealie-web-service.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bon, appliquer tous ces fichiers yaml à la main, ça serait VRAIMENT pénible.&lt;br /&gt;
Comment faire pour tout faire d'un coup ?&lt;br /&gt;
Avec la commande CLI builtin et les manifests Kustomize.&lt;/p&gt;
&lt;p&gt;Voici un exemple d'un manifest kustomize:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;kustomize.config.k8s.io/v1beta1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Kustomization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;resources&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-deployment.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-statefulset.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-secret.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-web-service.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-db-service.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-ingressroute.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-configmap.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mealie-pvc.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour appliquer ce fichier il faut lancer la commande &lt;code&gt;kubectl apply -k ./base&lt;/code&gt;, le &lt;code&gt;-k&lt;/code&gt; spécifie qu'on vise un manifest kustomize.&lt;br /&gt;
Kustomize va donc appeler chaque manifest yaml de la liste définie dans &lt;code&gt;resources&lt;/code&gt; et les appliquer un à un dans Kubernetes.&lt;br /&gt;
On peut faire des choses très utiles avec Kustomize, mais ce n'est pas le but de l'article. Néamoins, &lt;a href="https://dev.to/mxglt/quest-ce-kustomize--dai"&gt;Voici un article en parlant.&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Et voilà ! À table !&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="216" width="300" decoding="async" src="Mealie.png" alt="" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Au final si jamais vous vous posez la question, est-ce que vous devez utiliser Kubernetes ou Docker dans votre homelab, sachez une chose.&lt;/p&gt;
&lt;p&gt;Utiliser Docker est vraiment vraiment plus simple dans un petit environnement, quel intérêt d'utiliser Kubernetes ?&lt;br /&gt;
Apprendre et évoluer ! Bien sûr c'est suffisant d'utiliser Docker, mais Kubernetes apporte son lot d'avantage, de satisfaction, (de soirée perdues).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Libérez votre swap !</title><link>https://slash-root.fr/liberez-votre-swap/</link><pubDate>Sun, 01 Dec 2024 06:09:15 +0100</pubDate><guid>https://slash-root.fr/liberez-votre-swap/</guid><description>&lt;img src="https://slash-root.fr/liberez-votre-swap/cover.png" alt="Featured image of post Libérez votre swap !" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;p&gt;Envie de libérer Britney ? Ou plutôt... votre swap ? 🎵&lt;/p&gt;
&lt;p&gt;Si vous cherchez à optimiser l'utilisation de votre mémoire virtuelle sur une machine Debian, vous êtes au bon endroit !&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id="le-swappiness-cest-quoi-"&gt;&lt;a href="#le-swappiness-cest-quoi-" class="header-anchor"&gt;&lt;/a&gt;Le &lt;code&gt;swappiness&lt;/code&gt;, c&amp;rsquo;est quoi ?
&lt;/h3&gt;&lt;p&gt;Le &lt;code&gt;swappiness&lt;/code&gt; est un paramètre du kernel Linux qui contrôle la &amp;quot;proportion&amp;quot; du système à utiliser le swap. Une valeur faible favorise l'utilisation de la RAM, tandis qu'une valeur élevée incite à swapper rapidement sur le disque.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="quelques-commandes-essentielles"&gt;&lt;a href="#quelques-commandes-essentielles" class="header-anchor"&gt;&lt;/a&gt;Quelques commandes essentielles
&lt;/h2&gt;&lt;h3 id="1-vérifier-la-valeur-actuelle-du-swappiness"&gt;&lt;a href="#1-v%c3%a9rifier-la-valeur-actuelle-du-swappiness" class="header-anchor"&gt;&lt;/a&gt;1. Vérifier la valeur actuelle du &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /proc/sys/vm/swappiness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-modifier-dynamiquement-le-swappiness"&gt;&lt;a href="#2-modifier-dynamiquement-le-swappiness" class="header-anchor"&gt;&lt;/a&gt;2. Modifier dynamiquement le &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sysctl vm.swappiness&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Cette modification n'est pas persistante et sera perdue au redémarrage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="3-rendre-la-configuration-persistante"&gt;&lt;a href="#3-rendre-la-configuration-persistante" class="header-anchor"&gt;&lt;/a&gt;3. Rendre la configuration persistante
&lt;/h3&gt;&lt;p&gt;Ajoutez ou modifiez la ligne suivante dans &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;vm.swappiness&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Appliquez ensuite la configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-comprendre-les-valeurs-du-swappiness"&gt;&lt;a href="#4-comprendre-les-valeurs-du-swappiness" class="header-anchor"&gt;&lt;/a&gt;4. Comprendre les valeurs du &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100&lt;/strong&gt; : Le système swap intensément.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; : Swap uniquement en cas de RAM complètement saturée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Défaut&lt;/strong&gt; : Généralement &lt;strong&gt;60&lt;/strong&gt; sur Debian.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-désactiver-et-réactiver-le-swap"&gt;&lt;a href="#5-d%c3%a9sactiver-et-r%c3%a9activer-le-swap" class="header-anchor"&gt;&lt;/a&gt;5. Désactiver et réactiver le swap
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo swapoff -a &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo swapon -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Assurez-vous que la RAM disponible est suffisante pour accueillir les données du swap avant de désactiver ce dernier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="6-identifier-les-processus-utilisant-le-swap"&gt;&lt;a href="#6-identifier-les-processus-utilisant-le-swap" class="header-anchor"&gt;&lt;/a&gt;6. Identifier les processus utilisant le swap
&lt;/h3&gt;&lt;p&gt;Pour examiner les processus gourmands en swap, utilisez cette commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; file in /proc/*/status ; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; awk &lt;span style="color:#e6db74"&gt;&amp;#39;/VmSwap|Name/{printf $2 &amp;#34; &amp;#34; $3}END{ print &amp;#34;&amp;#34;}&amp;#39;&lt;/span&gt; $file; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -k &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; -n -r | less
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="automatisation-avec-un-script-bash"&gt;&lt;a href="#automatisation-avec-un-script-bash" class="header-anchor"&gt;&lt;/a&gt;Automatisation avec un script Bash
&lt;/h2&gt;&lt;p&gt;Pour simplifier la gestion du swap, voici un script bash prêt à l'emploi :&lt;/p&gt;
&lt;h3 id="script--free-swapsh"&gt;&lt;a href="#script--free-swapsh" class="header-anchor"&gt;&lt;/a&gt;Script : &lt;code&gt;free-swap.sh&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check_command&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $? -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Erreur lors de l&amp;#39;exécution de la commande: &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free_data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;free&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check_command &lt;span style="color:#e6db74"&gt;&amp;#34;free&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mem_data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Mem:&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free_mem&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $4}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;buffers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $6}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cache&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $7}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total_free&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;free_mem &lt;span style="color:#f92672"&gt;+&lt;/span&gt; buffers &lt;span style="color:#f92672"&gt;+&lt;/span&gt; cache&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep -q &lt;span style="color:#e6db74"&gt;&amp;#39;Échange:&amp;#39;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; used_swap&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Échange:&amp;#39;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; used_swap&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Swap:&amp;#39;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;Free memory:\t&lt;/span&gt;$total_free&lt;span style="color:#e6db74"&gt; kB (&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;total_free &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt; MB)\nUsed swap:\t&lt;/span&gt;$used_swap&lt;span style="color:#e6db74"&gt; kB (&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;used_swap &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt; MB)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $used_swap -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Félicitations ! Aucun swap n&amp;#39;est utilisé.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $used_swap -lt $total_free &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Libération du swap...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_command &lt;span style="color:#e6db74"&gt;&amp;#34;swapoff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo swapon -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_command &lt;span style="color:#e6db74"&gt;&amp;#34;swapon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Pas assez de mémoire libre pour libérer le swap. Arrêt.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="instructions-"&gt;&lt;a href="#instructions-" class="header-anchor"&gt;&lt;/a&gt;Instructions :
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Enregistrez le script dans un fichier, par exemple : &lt;code&gt;free-swap.sh&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rendez-le exécutable :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod u+x free-swap.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Exécutez-le :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./free-swap.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Ne pas utiliser ce script si &lt;strong&gt;ZRAM&lt;/strong&gt; est activé sur votre système, car cela pourrait entraîner des comportements inattendus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Vous venez de découvrir comment optimiser la gestion du swap sous Debian. Que ce soit via des commandes ou un script Bash, vous êtes désormais armé pour reprendre le contrôle de votre mémoire virtuelle.&lt;/p&gt;
&lt;p&gt;Et surtout, souvenez-vous : le swap, c'est bien... mais la RAM, c'est mieux ! 😉&lt;/p&gt;</description></item><item><title>Restic ou l’Importance des Sauvegardes de Données</title><link>https://slash-root.fr/restic-ou-limportance-des-sauvegardes-de-donnees/</link><pubDate>Mon, 11 Nov 2024 13:55:45 +0100</pubDate><guid>https://slash-root.fr/restic-ou-limportance-des-sauvegardes-de-donnees/</guid><description>&lt;img src="https://slash-root.fr/restic-ou-limportance-des-sauvegardes-de-donnees/cover.png" alt="Featured image of post Restic ou l’Importance des Sauvegardes de Données" /&gt;&lt;p&gt;Dans un monde où les pertes de données peuvent avoir des conséquences catastrophiques, que ce soit pour des entreprises, des gouvernements, ou des individus, il devient impératif de prendre des mesures pour sécuriser ses informations. Une perte de données peut entraîner des interruptions de services, voire des pertes financières importantes.&lt;/p&gt;
&lt;p&gt;Face à cette réalité, la mise en place d’une stratégie de sauvegarde robuste devient essentielle. Dans cet article, nous allons explorer une solution pratique et accessible à tous : Restic. Cet outil, à la fois rapide, fiable et facile à configurer, permet de créer des sauvegardes cryptées et décentralisées, tout en offrant la possibilité de gérer facilement les anciennes versions de fichiers et d'automatiser le processus.&lt;/p&gt;
&lt;p&gt;Voyons maintenant comment mettre en place un script de sauvegarde avec Restic, en tenant compte de quelques bonnes pratiques essentielles pour une gestion sécurisée et automatisée des données.&lt;/p&gt;
&lt;p&gt;Je commence par définir les variables essentielles de son script, qui permettront de personnaliser la sauvegarde en fonction de mes besoins spécifiques.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export RESTIC_PASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ZZZZZZZZZZZZ&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export RESTIC_REPO&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/mnt/restic&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export BACKUP_TARGET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export BACKUP_SOURCE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/mnt/shared/nas&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NUM_KEEP_SNAPSHOTS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;RESTIC_PASSWORD&lt;/strong&gt; : Cette variable contient le mot de passe nécessaire à l'accès au dépôt Restic. Ce mot de passe est utilisé pour chiffrer et déchiffrer les données sauvegardées.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RESTIC_REPO&lt;/strong&gt; : Le répertoire où les sauvegardes seront stockées. Cela peut être un stockage local ou distant (par exemple, un serveur S3 ou un serveur FTP).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BACKUP_TARGET&lt;/strong&gt; : La destination de la sauvegarde.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BACKUP_SOURCE&lt;/strong&gt; : La source des fichiers à sauvegarder, ici /mnt/shared/nas, qui est un répertoire contenant des fichiers critiques.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NUM_KEEP_SNAPSHOTS&lt;/strong&gt; : Le nombre de sauvegardes à conserver. Ce paramètre est essentiel pour éviter l'accumulation excessive de données, ce qui pourrait entraîner un encombrement du système.&lt;/p&gt;
&lt;p&gt;L'une des premières étapes de mon script consiste à sauvegarder les bases de données. Étant donné que les bases de données peuvent contenir des informations sensibles et cruciales, il est primordial de m'assurer qu'elles sont bien incluses dans mes sauvegardes.&lt;/p&gt;
&lt;p&gt;Cependant, je sais que mes bases de données ne sont enrichies que les jours de semaine, c'est-à-dire du lundi au vendredi. Il n'a donc pas de sens de créer un dump de la base de données pendant le week-end, lorsque les données ne sont pas mises à jour. C'est pourquoi j'ai décidé de ne créer un dump de la base de données que durant les jours ouvrés, afin d'éviter une sauvegarde inutile et de préserver des ressources.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DB_HOST&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DB_PORT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DB_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;estx50&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DB_DUMP_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/shared/nas/Trading/all_databases_backup.sql&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PGPASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;XXXXXXXXXXXXXX&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DAY_OF_WEEK&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%u&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DAY_OF_WEEK&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -ge &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DAY_OF_WEEK&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -le &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Jour de semaine - Création du dump de la base de données.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pg_dumpall -h &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DB_HOST&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -p &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DB_PORT&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -U &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DB_USER&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$DB_DUMP_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Aujourd&amp;#39;hui est le week-end, aucun dump de la base de données ne sera créé.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois la base de données sauvegardée, je me tourne vers la sauvegarde de mes fichiers. Restic permet de sauvegarder facilement des répertoires et d'exclure certains fichiers ou dossiers.&lt;/p&gt;
&lt;p&gt;J'ai décidé d'exclure certains répertoires spécifiques, comme récupération_Oscar et Trading/data, car ils contiennent des données que je ne souhaite pas inclure dans la sauvegarde, parce qu'elles ne sont pas pertinentes pour mes besoins de sauvegarde.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$BACKUP_SOURCE&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; restic -r &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$RESTIC_REPO&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; backup --exclude &lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/shared/nas/récupération_Oscar&amp;#34;&lt;/span&gt; --exclude &lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/shared/nas/Trading/data&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$BACKUP_TARGET&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; --skip-if-unchanged &lt;span style="color:#f92672"&gt;||&lt;/span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Remarque importante&lt;br /&gt;
&lt;strong&gt;Vous noterez que les exclude requièrent le chemin absolu.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;skip-if-unchanged&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;Cette option permet à Restic de vérifier si les fichiers ont changé avant de créer un nouveau snapshot. Si un fichier n'a pas été modifié depuis la dernière sauvegarde, Restic évite de le sauvegarder à nouveau. Cela permet de réduire le volume des données sauvegardées et d'économiser de l'espace disque.&lt;/p&gt;
&lt;p&gt;Une fois les sauvegardes effectuées, je dois gérer les anciens snapshots pour éviter que mon dépôt de sauvegarde ne devienne trop encombré. Pour cela, j'utilise la commande forget, qui permet de supprimer les snapshots anciens et inutiles. J'ai choisi de conserver un nombre limité de snapshots récents — ici, 15 — afin de m'assurer que je dispose toujours d'un historique suffisant, sans accumuler trop de données obsolètes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;restic -r &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$RESTIC_REPO&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; forget --keep-last &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$NUM_KEEP_SNAPSHOTS&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; --keep-tag preserve --prune &lt;span style="color:#f92672"&gt;||&lt;/span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--keep-last $NUM_KEEP_SNAPSHOTS&lt;/code&gt; : Cette option permet de définir le nombre de snapshots récents à conserver. Par exemple, si vous gardez 15 snapshots, seuls les 15 derniers seront conservés.&lt;/p&gt;
&lt;p&gt;J'utilise également l'option &lt;code&gt;--prune&lt;/code&gt; pour nettoyer les points de sauvegarde qui ne sont plus nécessaires, ce qui permet de récupérer de l'espace disque et de garder le dépôt de sauvegarde bien organisé.&lt;/p&gt;
&lt;p&gt;Enfin dernier point à noter : j'ai utilisé l'option &lt;code&gt;--keep-tag preserve&lt;/code&gt; dans ma commande de nettoyage. En effet, il y a un point de sauvegarde que je ne veux en aucun cas voir supprimé lors des nettoyages. Pour cela, j'ai préalablement tagué ce snapshot avec la commande &lt;code&gt;restic tag&lt;/code&gt;, ce qui me permet de l'identifier spécifiquement.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;restic -r &lt;span style="color:#f92672"&gt;[&lt;/span&gt;RESTIC_REPO&lt;span style="color:#f92672"&gt;]&lt;/span&gt; tag &lt;span style="color:#f92672"&gt;[&lt;/span&gt;ID_SNAPSHOT&lt;span style="color:#f92672"&gt;]&lt;/span&gt; preserve
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La commande restic tag permet d'ajouter un tag personnalisé à un snapshot (dans mon cas je l'ai apppelé preserve), ce qui peut être très utile pour marquer des sauvegardes importantes ou spécifiques. Ainsi, le snapshot marqué avec le tag &lt;code&gt;preserve&lt;/code&gt; restera dans le dépôt, grâce à &lt;code&gt;--keep-tag preserve&lt;/code&gt; même lorsque je lance le nettoyage avec l'option &lt;code&gt;--prune&lt;/code&gt;, qui supprimera tout autre snapshot plus ancien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt; : Un Outil de Sauvegarde Puissant&lt;/p&gt;
&lt;p&gt;En appliquant ces pratiques, j'ai réussi à mettre en place une solution de sauvegarde fiable, efficace et parfaitement adaptée à mes besoins. L'automatisation de la sauvegarde de mes fichiers et bases de données, combinée à une gestion rigoureuse des anciens snapshots, me permet de garantir une protection optimale de mes données.&lt;/p&gt;
&lt;p&gt;Dans le prochain épisode, je me pencherai sur l'utilisation de Restic pour stocker mes sauvegardes sur un espace S3 Amazon. Ce choix m'offrira encore plus de sécurité et de flexibilité pour mes sauvegardes, tout en ajoutant une couche de fiabilité supplémentaire.&lt;/p&gt;</description></item><item><title>Git : How to smudge and clean ?</title><link>https://slash-root.fr/git-how-to-smudge-and-clean/</link><pubDate>Sun, 27 Oct 2024 23:36:07 +0100</pubDate><guid>https://slash-root.fr/git-how-to-smudge-and-clean/</guid><description>&lt;img src="https://slash-root.fr/git-how-to-smudge-and-clean/cover.png" alt="Featured image of post Git : How to smudge and clean ?" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;p&gt;Il était une fois, dans le royaume du développement, un développeur nommé John. En plein milieu d'un projet complexe, qui impliquait des fichiers de configuration .env et .yaml pour se connecter à une API tournant dans un conteneur Docker, John a commis l'impensable : il a ouvert un dépôt contenant une clé API Mailgun en clair dans un fichier .env utilisé pour la configuration du docker compose.&lt;/p&gt;
&lt;p&gt;À peine avait-il réalisé son erreur qu'un désastre s'annonçait. Non seulement sa clé d'API avait été compromise, mais son compte Mailgun avait également été coupé, le plongeant dans un tourbillon de préoccupations. Une procédure rigoureuse devait être suivie pour le réactiver, impliquant la réinitialisation des mots de passe et des clés d'API. Une perte de temps énorme qui plongea notre petit John dans une énorme tristesse.&lt;/p&gt;
&lt;p&gt;Face à l'urgence de partager son code Python avec un autre développeur pour résoudre un problème pressant, John a décidé d'agir. Bien que la meilleure solution aurait été de monter un vault sécurisé, le temps pressait. Il a donc opté pour un mécanisme de nettoyage et de restauration connu sous le nom de &amp;quot;smudge and clean&amp;quot;.&lt;/p&gt;
&lt;h2 id="les-faits"&gt;&lt;a href="#les-faits" class="header-anchor"&gt;&lt;/a&gt;Les faits
&lt;/h2&gt;&lt;p&gt;Il a ajouté dans le fichier &lt;code&gt;.git/config&lt;/code&gt; de son projet, les lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;filter &lt;span style="color:#e6db74"&gt;&amp;#34;secrets&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; clean &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ../scripts/filter-secrets.sh clean
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; smudge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ../scripts/filter-secrets.sh smudge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ces lignes indiquaient à Git d'utiliser son script de filtrage chaque fois qu'il &lt;code&gt;push&lt;/code&gt; ou &lt;code&gt;pull&lt;/code&gt; des &lt;code&gt;commits&lt;/code&gt;. Dans ce script, il a employé &lt;code&gt;sed&lt;/code&gt; pour remplacer sa clé API par une phrase humoristique, de sorte qu'elle ne soit jamais exposée dans le dépôt.&lt;/p&gt;
&lt;h2 id="filter-secrets"&gt;&lt;a href="#filter-secrets" class="header-anchor"&gt;&lt;/a&gt;Filter secrets
&lt;/h2&gt;&lt;p&gt;Le script de filtrage &lt;code&gt;filter-secrets.sh&lt;/code&gt; en question ressemblait à cela : &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Clean (replace sensitive data with placeholders)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sed -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/XXXXXXXXX/{API_KEY_PLACEHOLDER}/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/YYYYYYYYY/{SENDING_API_KEY_PLACEHOLDER}/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/ZZZZZZZZZ/{SMTP_PASSWORD_PLACEHOLDER}/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/AAAAAAAAA/{POSTGRES_PASSWORD_PLACEHOLDER}/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/BBBBBBBBB/{TWS_USERID_PLACEHOLDER}/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/CCCCCCCCCC/{TWS_PASSWORD_PLACEHOLDER}/g&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Si une erreur se produit avec sed, renvoyer un code d&amp;#39;erreur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Erreur lors de l&amp;#39;exécution du clean&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;smudge&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Smudge (replace placeholders with sensitive data)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sed -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{API_KEY_PLACEHOLDER}/XXXXXXXXX/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{SENDING_API_KEY_PLACEHOLDER}/YYYYYYYYY/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{SMTP_PASSWORD_PLACEHOLDER}/ZZZZZZZZZ/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{POSTGRES_PASSWORD_PLACEHOLDER}/AAAAAAAAA/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{TWS_USERID_PLACEHOLDER}/BBBBBBBBB/g&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/{TWS_PASSWORD_PLACEHOLDER}/CCCCCCCCCC/g&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Erreur lors de l&amp;#39;exécution du smudge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="les-attributs"&gt;&lt;a href="#les-attributs" class="header-anchor"&gt;&lt;/a&gt;Les attributs
&lt;/h2&gt;&lt;p&gt;Pour finaliser le tout, il a modifié un fichier &lt;code&gt;.git/info/attributes&lt;/code&gt; où il a défini quels fichiers de configuration devaient passer par ce filtre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;config.yaml filter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;secrets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.env filter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;secrets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Grâce à son ingéniosité, John a pu collaborer sur son projet sans craindre pour la sécurité de ses informations sensibles en se donnant le temps de monter proprement un Vault. À la fin de la journée, il avait non seulement corrigé son erreur, mais aussi appris à jongler avec la sécurité dans le monde des dépôts Git. Et c'est ainsi qu'il a vécu heureux, protégé de la menace des fuites de secrets, et avec un compte Mailgun réactivé, prêt à affronter de nouveaux défis.&lt;/p&gt;</description></item><item><title>CrowdSec : Avoid a Duplicate Decision / Notification</title><link>https://slash-root.fr/crowdsec-avoid-a-duplicate-decision-notification/</link><pubDate>Wed, 07 Aug 2024 10:52:44 +0200</pubDate><guid>https://slash-root.fr/crowdsec-avoid-a-duplicate-decision-notification/</guid><description>&lt;img src="https://slash-root.fr/crowdsec-avoid-a-duplicate-decision-notification/cover.png" alt="Featured image of post CrowdSec : Avoid a Duplicate Decision / Notification" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Prenons le cas de l'utilisation de CrowdSec pour protéger des applications web en analysant les logs du reverse-proxy.&lt;/p&gt;
&lt;p&gt;Suivant le scénario qui se déclenchera, CrowdSec prendra une décision concernant l'adresse IP concernée. Par exemple, renvoyer un code HTTP 403. Dans ce cas de figure, si l'acteur malveillant persiste, une décision sera prise à chaque fois. Si des notifications sont envoyées à chaque prise de décision, cela peut vite devenir du spam ! C'est le comportement normal puisque le profil par défaut de CrowdSec prend une décision à chaque déclenchement de scénario.&lt;/p&gt;
&lt;p&gt;Nous allons voir comment modifier la prise de décision pour vérifier au préalable si une décision identique n'a pas été prise récemment.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;CrowdSec installé (voir ici : &lt;a href="https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/"&gt;Installation de CrowdSec&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Toutes les commandes / manipulations présentées ci-dessous seront à exécuter en tant que &lt;code&gt;root&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="modification-de-la-remediation"&gt;&lt;a href="#modification-de-la-remediation" class="header-anchor"&gt;&lt;/a&gt;Modification de la Remediation
&lt;/h2&gt;&lt;p&gt;Tout va se passer dans un seul fichier : &lt;code&gt;/etc/crowdsec/profiles.yaml&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voici un fichier classique qui &lt;strong&gt;ban&lt;/strong&gt; pendant 4h l'adresse IP qui déclenche un scénario :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#/etc/crowdsec/profiles.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;default_ip_remediation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;filters&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;Alert.Remediation == true &amp;amp;&amp;amp; Alert.GetScope() == &amp;#34;Ip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;decisions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;duration&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#duration_expr: &amp;#34;Sprintf(&amp;#39;%dh&amp;#39;, (GetDecisionsCount(Alert.GetValue()) + 1) * 4)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on_success&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nous allons modifier le filtre pour vérifier si une décision n'a pas été prise il y a moins de 2h pour l'adresse IP concernée.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voici le fichier modifié :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#/etc/crowdsec/profiles.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;default_ip_remediation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;filters&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;Alert.Remediation == true &amp;amp;&amp;amp; Alert.GetScope() == &amp;#34;Ip&amp;#34; &amp;amp;&amp;amp; GetDecisionsSinceCount(Alert.GetValue(), &amp;#34;2h&amp;#34;) &amp;lt; 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;decisions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;duration&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#duration_expr: &amp;#34;Sprintf(&amp;#39;%dh&amp;#39;, (GetDecisionsCount(Alert.GetValue()) + 1) * 4)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on_success&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour valider la modification, redémarrez le service :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="intérêt"&gt;&lt;a href="#int%c3%a9r%c3%aat" class="header-anchor"&gt;&lt;/a&gt;Intérêt
&lt;/h2&gt;&lt;p&gt;On peut se dire : Mais pourquoi faire ça ?&lt;/p&gt;
&lt;p&gt;A chaque fois que CrowdSec prendra une décision, si les notifications sont configurées, cela en déclenchera une systématiquement.&lt;/p&gt;
&lt;p&gt;Dans mon cas, cela concernait les scans multi-ports et j'en avais marre de recevoir du spam de notification... (Effet JO 2024 ???).&lt;/p&gt;
&lt;p&gt;Voici l'output que cela donnait en moins d'une minute :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="image-20240807104724911" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Maintenant, CrowdSec prendra une décision concernant l'adresse IP qui déclenchera un scénario et qui n'a pas été &lt;strong&gt;ban&lt;/strong&gt; il y a moins de 2h. Si celle-ci revient au bout de 3h et redéclenche un scénario, ça sera reparti pour 4h, etc.&lt;/p&gt;</description></item><item><title>CrowdSec : Protéger l’authentification Gitlab</title><link>https://slash-root.fr/crowdsec-proteger-lauthentification-gitlab/</link><pubDate>Fri, 19 Jul 2024 11:06:58 +0200</pubDate><guid>https://slash-root.fr/crowdsec-proteger-lauthentification-gitlab/</guid><description>&lt;img src="https://slash-root.fr/crowdsec-proteger-lauthentification-gitlab/cover.png" alt="Featured image of post CrowdSec : Protéger l’authentification Gitlab" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Ce guide explique comment protéger l'authentification sur Gitlab contre les attaques de Bruteforce à l'aide de CrowdSec. Il est essentiel de sécuriser un portail d'authentification web. Une nouvelle collection crowdsec, comprenant 1 parser et 1 scénario, sera installée.&lt;/p&gt;
&lt;p&gt;Ce guide se base sur une installation de Gitlab sur Debian 12. La version Gitlab utilisée est la dernière en date (17.2.0).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Une machine Debian 12 avec un accès root ou sudo. Toutes les commandes présentées ci-dessous seront à exécuter en tant que &lt;code&gt;root&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Une connexion internet active.&lt;/li&gt;
&lt;li&gt;Gitlab CE ou EE installé&lt;/li&gt;
&lt;li&gt;CrowdSec installé (voir ici : &lt;a href="https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/"&gt;Installation de CrowdSec&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="modification-du-port-de-lapi-crowdsec"&gt;&lt;a href="#modification-du-port-de-lapi-crowdsec" class="header-anchor"&gt;&lt;/a&gt;Modification du port de l&amp;rsquo;API CrowdSec
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Très important !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avec une installation standard de Gitlab, le serveur PUMA (serveur web ruby faisant partie de gitlab) écoute sur le port TCP 8080. Il est donc impératif de modifier le port d'écoute de l'API de CrowdSec pour éviter tout conflit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Procédure décrite &lt;a href="https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/#toc-10"&gt;[ici]&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifiez bien que vos services crowdsec fonctionnent correctement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -u crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -u crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="installation-de-la-collection-pour-gitlab"&gt;&lt;a href="#installation-de-la-collection-pour-gitlab" class="header-anchor"&gt;&lt;/a&gt;Installation de la collection pour gitlab
&lt;/h2&gt;&lt;p&gt;En navigant sur le hub de CrowdSec, une collection pour gitlab est disponible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer la collection :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli collections install timokoessler/gitlab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceci a pour effet d'installer 1 parser et 1 scénario.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Lister les parsers :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli parsers list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# timokoessler/gitlab-logs ✔️ enabled 0.1 /etc/crowdsec/parsers/s01-parse/gitlab-logs.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lister les sénarios :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli scenario list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# timokoessler/gitlab-bf ✔️ enabled 0.2 /etc/crowdsec/scenarios/gitlab-bf.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="création-du-fichier-dacquisition"&gt;&lt;a href="#cr%c3%a9ation-du-fichier-dacquisition" class="header-anchor"&gt;&lt;/a&gt;Création du fichier d&amp;rsquo;acquisition
&lt;/h2&gt;&lt;p&gt;Afin que le parser Gitlab puisse être utilisé, il faut définir la méthode d'acquisition.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez le fichier &lt;strong&gt;/etc/crowdsec/acquis.d/gitlab.yaml&lt;/strong&gt; avec le contenu suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;filenames&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/log/gitlab/gitlab-rails/production_json.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gitlab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="redémarrage-du-service"&gt;&lt;a href="#red%c3%a9marrage-du-service" class="header-anchor"&gt;&lt;/a&gt;Redémarrage du service
&lt;/h2&gt;&lt;p&gt;A présent, le service crowdsec peut être rechargé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl reload crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;Nous allons vérifier le fonctionnement du parser et du nouveau scénario dédié à gitlab.&lt;/p&gt;
&lt;p&gt;Pour cela, spammez la page de login de Gitlab, puis vérifiez les résultats :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alertes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli alerts list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2 │ Ip:66.66.66.66 │ timokoessler/gitlab-bf │ │ │ ban:1 │ 2024-07-19 07:56:48.649063483 +0000 UTC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Décisions :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli decisions list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 15001 │ crowdsec │ Ip:66.66.66.66 │ timokoessler/gitlab-bf │ ban │ │ │ 6 │ 3h59m43.261827214s │ 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;En suivant ce guide, vous avez sécurisé l'authentification de votre Gitlab contre les attaques de Bruteforce grâce à CrowdSec. &lt;/p&gt;</description></item><item><title>CrowdSec : Protéger l’authentification Proxmox</title><link>https://slash-root.fr/crowdsec-proteger-lauthentification-proxmox/</link><pubDate>Thu, 18 Jul 2024 14:50:45 +0200</pubDate><guid>https://slash-root.fr/crowdsec-proteger-lauthentification-proxmox/</guid><description>&lt;img src="https://slash-root.fr/crowdsec-proteger-lauthentification-proxmox/cover.png" alt="Featured image of post CrowdSec : Protéger l’authentification Proxmox" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Ce guide explique comment protéger l'authentification sur Proxmox contre les attaques de Bruteforce à l'aide de CrowdSec. Suite aux dernières actualités de VMware, de nombreux utilisateurs ont migré vers Proxmox. Il est donc essentiel de sécuriser le portail d'authentification, exposé par défaut sur le port TCP 8006.&lt;/p&gt;
&lt;p&gt;Ce guide se base sur une installation de Proxmox sur Debian 12. Par défaut, &lt;code&gt;rsyslog&lt;/code&gt; n'est plus installé sur Debian 12. Nous verrons comment configurer cela avec &lt;code&gt;journald&lt;/code&gt; mais également avec &lt;code&gt;rsyslog&lt;/code&gt; si besoin.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Une machine Debian 12 avec un accès root ou sudo. Toutes les commandes présentées ci-dessous seront à exécuter en tant que &lt;code&gt;root&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Une connexion internet active.&lt;/li&gt;
&lt;li&gt;Proxmox installé&lt;/li&gt;
&lt;li&gt;CrowdSec installé (voir ici : &lt;a href="https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/"&gt;Installation de CrowdSec&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="installation-de-la-collection-pour-proxmox"&gt;&lt;a href="#installation-de-la-collection-pour-proxmox" class="header-anchor"&gt;&lt;/a&gt;Installation de la collection pour proxmox
&lt;/h2&gt;&lt;p&gt;En navigant sur le hub de CrowdSec, une collection pour proxmox est disponible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer la collection :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli collections install fulljackz/proxmox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceci a pour effet d'installer 2 parsers et 1 scénario.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Lister les parsers :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli parsers list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# crowdsecurity/syslog-logs ✔️ enabled 0.8 /etc/crowdsec/parsers/s00-raw/syslog-logs.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# fulljackz/proxmox-logs ✔️ enabled 0.2 /etc/crowdsec/parsers/s01-parse/proxmox-logs.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lister les sénarios :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli scenario list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# fulljackz/proxmox-bf ✔️ enabled 0.2 /etc/crowdsec/scenarios/proxmox-bf.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour que ceux-ci soient pris en compte, le service CrowdSec doit être rechargé. Nous le ferons après quelques modifications.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="modification-du-parser-proxmox"&gt;&lt;a href="#modification-du-parser-proxmox" class="header-anchor"&gt;&lt;/a&gt;Modification du parser proxmox
&lt;/h2&gt;&lt;p&gt;Le parser spécifique à proxmox se situe ici : &lt;strong&gt;/etc/crowdsec/parsers/s01-parse/proxmox-logs.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour qu'il soit compatible avec la dernière version de Proxmox, nous allons l'éditer et apporter les modifications suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;pattern_syntax&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PVE_AUTH_FAIL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;authentication failure; rhost=::ffff:%{IP:client_ip} user=%{USERNAME:source_user}@%{WORD:realm} msg=&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajout : &lt;code&gt;::ffff:&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="création-du-fichier-dacquisition"&gt;&lt;a href="#cr%c3%a9ation-du-fichier-dacquisition" class="header-anchor"&gt;&lt;/a&gt;Création du fichier d&amp;rsquo;acquisition
&lt;/h2&gt;&lt;p&gt;Afin que le parser Proxmox puisse être utilisé, il faut définir la méthode d'acquisition.&lt;/p&gt;
&lt;h3 id="utilisation-avec-journald"&gt;&lt;a href="#utilisation-avec-journald" class="header-anchor"&gt;&lt;/a&gt;Utilisation avec journald
&lt;/h3&gt;&lt;p&gt;Pour utiliser le parser avec journald :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez le fichier &lt;strong&gt;/etc/crowdsec/acquis.d/proxmox.yaml&lt;/strong&gt; avec le contenu suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;journalctl_filter&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;_SYSTEMD_UNIT=pvedaemon.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="utilisation-avec-rsyslog"&gt;&lt;a href="#utilisation-avec-rsyslog" class="header-anchor"&gt;&lt;/a&gt;Utilisation avec rsyslog
&lt;/h3&gt;&lt;p&gt;Si vous préférez utiliser rsyslog avec le fichier de log &lt;code&gt;/var/log/syslog&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installez &lt;code&gt;rsyslog&lt;/code&gt; si ce n'est pas déjà fait :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créez le fichier &lt;strong&gt;/etc/crowdsec/acquis.d/proxmox.yaml&lt;/strong&gt; avec le contenu suivant :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;filenames&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/log/syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pvedaemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="redémarrage-du-service"&gt;&lt;a href="#red%c3%a9marrage-du-service" class="header-anchor"&gt;&lt;/a&gt;Redémarrage du service
&lt;/h2&gt;&lt;p&gt;A présent, le service crowdsec peut être rechargé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl reload crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;Nous allons vérifier le fonctionnement des parsers et du nouveau scénario dédié à proxmox.&lt;/p&gt;
&lt;p&gt;Pour cela, spammez la page de login de Proxmox, puis vérifiez les résultats :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alertes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli alerts list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# | 2 │ Ip:66.66.66.66 │ fulljackz/proxmox-bf │ │ │ ban:1 │ 2024-07-18 12:13:37.498899667 +0000 UTC &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Décisions :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli decisions list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 15001 │ crowdsec │ Ip:66.66.66.66 │ fulljackz/proxmox-bf │ ban │ │ │ 7 │ 3h59m51.44622068s │ 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;En suivant ce guide, vous avez sécurisé l'authentification de votre Proxmox contre les attaques de Bruteforce grâce à CrowdSec. &lt;/p&gt;</description></item><item><title>CrowdSec : Installation avec Bouncer Iptables sur Debian 12</title><link>https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/</link><pubDate>Thu, 18 Jul 2024 10:28:12 +0200</pubDate><guid>https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/</guid><description>&lt;img src="https://slash-root.fr/crowdsec-installation-avec-bouncer-iptables-sur-debian-12/cover.png" alt="Featured image of post CrowdSec : Installation avec Bouncer Iptables sur Debian 12" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;CrowdSec est un système de cybersécurité collaboratif qui utilise des mécanismes de détection et de prévention pour protéger votre infrastructure. Ce guide vous guidera à travers l'installation de CrowdSec ainsi que de son bouncer iptables sur une machine Debian 12, avec la complétion de la commande &lt;code&gt;cscli&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Une machine Debian 12 avec un accès root ou sudo. Toutes les commandes présentées ci-dessous seront à exécuter en tant que &lt;code&gt;root&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Une connexion internet active.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="étape-1--mise-à-jour-du-système"&gt;&lt;a href="#%c3%a9tape-1--mise-%c3%a0-jour-du-syst%c3%a8me" class="header-anchor"&gt;&lt;/a&gt;Étape 1 : Mise à jour du système
&lt;/h2&gt;&lt;p&gt;Avant de commencer l'installation, assurez-vous que votre système est à jour.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt -y upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="étape-2--installation-de-crowdsec"&gt;&lt;a href="#%c3%a9tape-2--installation-de-crowdsec" class="header-anchor"&gt;&lt;/a&gt;Étape 2 : Installation de CrowdSec
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ajouter le dépôt CrowdSec&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Téléchargez et ajoutez la clé GPG pour vérifier l'intégrité du dépôt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installer CrowdSec&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Installez le package CrowdSec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vérifier l'installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assurez-vous que CrowdSec est correctement installé et en cours d'exécution :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="étape-3--installation-du-bouncer-iptables"&gt;&lt;a href="#%c3%a9tape-3--installation-du-bouncer-iptables" class="header-anchor"&gt;&lt;/a&gt;Étape 3 : Installation du Bouncer Iptables
&lt;/h2&gt;&lt;p&gt;Le bouncer iptables permet à CrowdSec de bloquer les adresses IP malveillantes directement au niveau du pare-feu. C'est lui qui applique les décisions prises par crowdsec.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Télécharger et installer le bouncer iptables&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y crowdsec-firewall-bouncer-iptables
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurer le bouncer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'installation crée un fichier de configuration par défaut à &lt;code&gt;/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml&lt;/code&gt;. Vous pouvez vérifier et modifier ce fichier selon vos besoins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Démarrer et activer le bouncer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assurez-vous que le bouncer est activé au démarrage et qu'il est en cours d'exécution :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl start crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vérifier le bouncer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vérifiez que le bouncer est correctement installé et en cours d'exécution :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="étape-4--activer-la-complétion-de-la-commande-cscli"&gt;&lt;a href="#%c3%a9tape-4--activer-la-compl%c3%a9tion-de-la-commande-cscli" class="header-anchor"&gt;&lt;/a&gt;Étape 4 : Activer la complétion de la commande &lt;code&gt;cscli&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;La complétion de commande rend l'utilisation de &lt;code&gt;cscli&lt;/code&gt; plus efficace en permettant l'auto-complétion des commandes et options disponibles.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installer les scripts de complétion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour &lt;code&gt;bash&lt;/code&gt;, vous pouvez utiliser le script de complétion fourni par CrowdSec. Tout d'abord, assurez-vous que &lt;code&gt;bash-completion&lt;/code&gt; est installé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y bash-completion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Activer la complétion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Installez le script de complétion pour &lt;code&gt;cscli&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli completion bash &amp;gt; /etc/bash_completion.d/cscli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recharger la configuration de bash&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rechargez votre configuration de bash pour que la complétion soit prise en compte :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /etc/bash_completion.d/cscli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vérifier la complétion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Testez la complétion automatique en tapant &lt;code&gt;cscli&lt;/code&gt; suivi de &lt;code&gt;Tab&lt;/code&gt; pour voir les options disponibles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="étape-5--vérification-de-lintégration"&gt;&lt;a href="#%c3%a9tape-5--v%c3%a9rification-de-lint%c3%a9gration" class="header-anchor"&gt;&lt;/a&gt;Étape 5 : Vérification de l&amp;rsquo;intégration
&lt;/h2&gt;&lt;p&gt;Pour vérifier que tout fonctionne correctement, vous pouvez consulter les journaux de CrowdSec et du bouncer iptables :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -u crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -u crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="étape-6-option--configuration-bantime"&gt;&lt;a href="#%c3%a9tape-6-option--configuration-bantime" class="header-anchor"&gt;&lt;/a&gt;Étape 6 (Option) : Configuration bantime
&lt;/h2&gt;&lt;p&gt;Par défaut, la décision qui est appliqué par le bouncer iptables est un ban de 4h. Bien évidement, il est possible de modifier ce comportement. Exemple pour passer cette durée à 24h :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Editez le fichier /etc/crowdsec/profiles.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;decisions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;duration&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recharger le service crowdsec&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl reload crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="étape-7-option--enrôlement-de-la-console"&gt;&lt;a href="#%c3%a9tape-7-option--enr%c3%b4lement-de-la-console" class="header-anchor"&gt;&lt;/a&gt;Étape 7 (Option) : Enrôlement de la console
&lt;/h2&gt;&lt;p&gt;Il est possible d'enrôler CrowdSec sur &lt;a href="https://app.crowdsec.net/"&gt;https://app.crowdsec.net/&lt;/a&gt; pour avoir un jolie tableau de bord et une visualisation globale. L'autre intérêt, va être la possibilité d'ajouter des listes d'IP malveillantes maintenues par CrowdSec à nos instances. Coucou la liste disponible pour les JO 2024 🙂&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer un compte sur &lt;a href="https://app.crowdsec.net/"&gt;https://app.crowdsec.net/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Validez votre compte en vous authentifiant sur la plateforme&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rendez vous dans le menu &amp;quot;Security Engines&amp;quot; &amp;gt; &amp;quot;Engines&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cliquez sur &amp;quot;Add Security Engine&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exécutez la commande d'enrôlement sur votre serveur&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli console enroll -e context YOUR-ENROLL-KEY
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans un contexte d'automatisation, il est possible de spécifier le nom d'hôte :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cscli console enroll --name &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;hostname&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; YOUR-ENROLL-KEY
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici l'aide de la commande : &lt;a href="https://docs.crowdsec.net/docs/next/cscli/cscli_console_enroll/"&gt;https://docs.crowdsec.net/docs/next/cscli/cscli_console_enroll/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acceptez l'enrôlement sur la plateforme web de CrowdSec&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Redémarrez le service crowdsec sur le serveur&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="modification-du-port-de-lapi"&gt;&lt;a href="#modification-du-port-de-lapi" class="header-anchor"&gt;&lt;/a&gt;Modification du port de l&amp;rsquo;API
&lt;/h2&gt;&lt;p&gt;Par défaut CrowdSec utilise le port TCP 8080 pour accéder à son API. Si ce port est déjà utilisé sur votre serveur, il est important de modifier la configuration de CrowdSec pour que l'API en utilise un autre.&lt;/p&gt;
&lt;p&gt;Exemple pour utiliser le port TCP 6660 à la place du TCP 8080 :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modifiez le fichier /etc/crowdsec/config.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;api&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;client&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#ae81ff"&gt;...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#ae81ff"&gt;...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen_uri&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;127.0.0.1&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;6660&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modifiez le fichier /etc/crowdsec/local_api_credentials.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;http://127.0.0.1:6660&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modifier le fichier /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;api_url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;http://127.0.0.1:6660/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Redémarrez les services crowdsec&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart crowdsec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart crowdsec-firewall-bouncer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Vous avez maintenant installé et configuré CrowdSec avec le bouncer iptables sur votre machine Debian 12, et activé la complétion de la commande &lt;code&gt;cscli&lt;/code&gt;. Ce système devrait maintenant aider à protéger votre infrastructure contre les adresses IP malveillantes. Assurez-vous de consulter régulièrement les journaux et de maintenir votre système à jour pour garantir une protection optimale.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="ressources-supplémentaires"&gt;&lt;a href="#ressources-suppl%c3%a9mentaires" class="header-anchor"&gt;&lt;/a&gt;Ressources supplémentaires
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.crowdsec.net/"&gt;Documentation officielle de CrowdSec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/crowdsecurity/crowdsec"&gt;Dépot GitHub de CrowdSec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discourse.crowdsec.net/"&gt;Communauté CrowdSec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Compression Multithreading : pigz (gzip) &amp; pbzip2 (bzip2)</title><link>https://slash-root.fr/compression-multithreading-pigz-gzip-pbzip2-bzip2/</link><pubDate>Mon, 08 Jul 2024 15:05:42 +0200</pubDate><guid>https://slash-root.fr/compression-multithreading-pigz-gzip-pbzip2-bzip2/</guid><description>&lt;img src="https://slash-root.fr/compression-multithreading-pigz-gzip-pbzip2-bzip2/cover.jpg" alt="Featured image of post Compression Multithreading : pigz (gzip) &amp; pbzip2 (bzip2)" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;p&gt;Dans le monde de la gestion des fichiers et des données, l'efficacité des outils de compression est essentielle, surtout à l'ère des volumes de données croissants. Les formats de compression classiques, &lt;code&gt;gzip&lt;/code&gt; et &lt;code&gt;bzip2&lt;/code&gt;, bien que robustes et largement utilisés, peuvent devenir des goulets d'étranglement sur des systèmes modernes où la puissance de traitement parallèle est sous-exploitée. C'est dans ce contexte que les outils &lt;code&gt;pigz&lt;/code&gt; (Parallel Implementation of gzip) et &lt;code&gt;pbzip2&lt;/code&gt; (Parallel bzip2) apportent une révolution significative en offrant une compression multithreading.&lt;/p&gt;
&lt;p&gt;Cet article explore ces deux outils puissants, en les comparant aux utilitaires classiques, et en démontrant leur utilisation efficace avec &lt;code&gt;tar&lt;/code&gt;, grâce à son option &lt;code&gt;-I&lt;/code&gt; qui permet de spécifier un programme de compression externe. J’aborderai les avantages du multithreading pour la compression des données, présenterai des exemples pratiques d'utilisation, et fournirai des conseils pour optimiser vos flux de travail de gestion des fichiers en tirant parti de la parallélisation.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="introduction-à-la-compression-multithreading"&gt;&lt;a href="#introduction-%c3%a0-la-compression-multithreading" class="header-anchor"&gt;&lt;/a&gt;Introduction à la compression multithreading
&lt;/h2&gt;&lt;h3 id="contexte-et-importance-de-la-compression-des-fichiers"&gt;&lt;a href="#contexte-et-importance-de-la-compression-des-fichiers" class="header-anchor"&gt;&lt;/a&gt;Contexte et importance de la compression des fichiers
&lt;/h3&gt;&lt;p&gt;La compression des fichiers est cruciale pour économiser l'espace de stockage et réduire la bande passante lors des transferts de fichiers. Les outils classiques comme &lt;code&gt;gzip&lt;/code&gt; et &lt;code&gt;bzip2&lt;/code&gt; sont largement utilisés pour leur efficacité en termes de taux de compression et de compatibilité. Toutefois, sur des systèmes multicœurs modernes, ces outils ne tirent pas parti de la puissance disponible car ils ne fonctionnent que sur un seul thread.&lt;/p&gt;
&lt;h3 id="limites-des-outils-traditionnels-gzip-et-bzip2"&gt;&lt;a href="#limites-des-outils-traditionnels-gzip-et-bzip2" class="header-anchor"&gt;&lt;/a&gt;Limites des outils traditionnels gzip et bzip2
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single-threaded&lt;/strong&gt; : &lt;code&gt;gzip&lt;/code&gt; et &lt;code&gt;bzip2&lt;/code&gt; ne peuvent exploiter qu'un seul cœur, ce qui limite leur vitesse de compression sur les systèmes modernes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt; : Bien que &lt;code&gt;gzip&lt;/code&gt; soit rapide pour la compression simple, il ne compresse pas autant que &lt;code&gt;bzip2&lt;/code&gt;. &lt;code&gt;bzip2&lt;/code&gt;, quant à lui, offre une meilleure compression mais à une vitesse plus lente.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="présentation-de-pigz"&gt;&lt;a href="#pr%c3%a9sentation-de-pigz" class="header-anchor"&gt;&lt;/a&gt;Présentation de pigz
&lt;/h2&gt;&lt;h3 id="fonctionnalités-et-avantages"&gt;&lt;a href="#fonctionnalit%c3%a9s-et-avantages" class="header-anchor"&gt;&lt;/a&gt;Fonctionnalités et avantages
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;pigz&lt;/code&gt; (Parallel Implementation of gzip) est une version multi-thread de &lt;code&gt;gzip&lt;/code&gt;. Il utilise plusieurs cœurs pour accélérer la compression et la décompression tout en maintenant la compatibilité avec le format &lt;code&gt;gzip&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multithreading&lt;/strong&gt; : Exploite plusieurs cœurs pour améliorer la vitesse de compression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilité&lt;/strong&gt; : Produit des fichiers compatibles avec &lt;code&gt;gzip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options de compression&lt;/strong&gt; : Offre des options pour ajuster le nombre de threads, le niveau de compression, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installation-et-configuration"&gt;&lt;a href="#installation-et-configuration" class="header-anchor"&gt;&lt;/a&gt;Installation et configuration
&lt;/h3&gt;&lt;p&gt;Sur une distribution Linux (ex. Debian) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install pigz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="exemples-dutilisation-avec-tar-et-loption--i"&gt;&lt;a href="#exemples-dutilisation-avec-tar-et-loption--i" class="header-anchor"&gt;&lt;/a&gt;Exemples d&amp;rsquo;utilisation avec tar et l&amp;rsquo;option &lt;code&gt;-I&lt;/code&gt;
&lt;/h3&gt;&lt;h4 id="compression"&gt;&lt;a href="#compression" class="header-anchor"&gt;&lt;/a&gt;Compression
&lt;/h4&gt;&lt;p&gt;Pour compresser une archive &lt;code&gt;tar&lt;/code&gt; avec &lt;code&gt;pigz&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -cvI pigz -f archive.tar.gz dossier/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="décompression"&gt;&lt;a href="#d%c3%a9compression" class="header-anchor"&gt;&lt;/a&gt;Décompression
&lt;/h4&gt;&lt;p&gt;Pour décompresser une archive &lt;code&gt;tar.gz&lt;/code&gt; avec &lt;code&gt;pigz&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -xvI pigz -f archive.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="présentation-de-pbzip2"&gt;&lt;a href="#pr%c3%a9sentation-de-pbzip2" class="header-anchor"&gt;&lt;/a&gt;Présentation de pbzip2
&lt;/h2&gt;&lt;h3 id="fonctionnalités-et-avantages-1"&gt;&lt;a href="#fonctionnalit%c3%a9s-et-avantages-1" class="header-anchor"&gt;&lt;/a&gt;Fonctionnalités et avantages
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;pbzip2&lt;/code&gt; (Parallel bzip2) est une version multi-thread de &lt;code&gt;bzip2&lt;/code&gt; qui utilise plusieurs cœurs pour accélérer la compression et la décompression. Il produit des fichiers compatibles avec le format &lt;code&gt;bzip2&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multithreading&lt;/strong&gt; : Exploite plusieurs cœurs pour améliorer la vitesse de compression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilité&lt;/strong&gt; : Produit des fichiers compatibles avec &lt;code&gt;bzip2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficacité de compression&lt;/strong&gt; : Offre généralement une meilleure compression que &lt;code&gt;gzip&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installation-et-configuration-1"&gt;&lt;a href="#installation-et-configuration-1" class="header-anchor"&gt;&lt;/a&gt;Installation et configuration
&lt;/h3&gt;&lt;p&gt;Sur une distribution Linux (ex. Debian) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install pbzip2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="exemples-dutilisation-avec-tar-et-loption--i-1"&gt;&lt;a href="#exemples-dutilisation-avec-tar-et-loption--i-1" class="header-anchor"&gt;&lt;/a&gt;Exemples d&amp;rsquo;utilisation avec tar et l&amp;rsquo;option &lt;code&gt;-I&lt;/code&gt;
&lt;/h3&gt;&lt;h4 id="compression-1"&gt;&lt;a href="#compression-1" class="header-anchor"&gt;&lt;/a&gt;Compression
&lt;/h4&gt;&lt;p&gt;Pour compresser une archive &lt;code&gt;tar&lt;/code&gt; avec &lt;code&gt;pbzip2&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -cvI pbzip2 -f archive.tar.bz2 dossier/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="décompression-1"&gt;&lt;a href="#d%c3%a9compression-1" class="header-anchor"&gt;&lt;/a&gt;Décompression
&lt;/h4&gt;&lt;p&gt;Pour décompresser une archive &lt;code&gt;tar.bz2&lt;/code&gt; avec &lt;code&gt;pbzip2&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -xvI pbzip2 -f archive.tar.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="comparaison-des-performances"&gt;&lt;a href="#comparaison-des-performances" class="header-anchor"&gt;&lt;/a&gt;Comparaison des performances
&lt;/h2&gt;&lt;h3 id="test-de-performance--gzip-vs-pigz-bzip2-vs-pbzip2"&gt;&lt;a href="#test-de-performance--gzip-vs-pigz-bzip2-vs-pbzip2" class="header-anchor"&gt;&lt;/a&gt;Test de performance : gzip vs pigz, bzip2 vs pbzip2
&lt;/h3&gt;&lt;p&gt;Pour évaluer les performances, j’ai compressé et décompressé un dossier de 10 Go de fichiers aléatoires avec &lt;code&gt;gzip&lt;/code&gt;, &lt;code&gt;pigz&lt;/code&gt;, &lt;code&gt;bzip2&lt;/code&gt;, et &lt;code&gt;pbzip2&lt;/code&gt;. Ces tests ont été réalisés sur une machine équipée d’un processeur AMD Ryzen 7 7700X @ 5.573GHz avec 16 threads.&lt;/p&gt;
&lt;h4 id="résultats"&gt;&lt;a href="#r%c3%a9sultats" class="header-anchor"&gt;&lt;/a&gt;Résultats
&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Temps de Compression&lt;/th&gt;
&lt;th&gt;Temps de Décompression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gzip&lt;/td&gt;
&lt;td&gt;170 sec&lt;/td&gt;
&lt;td&gt;25 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pigz&lt;/td&gt;
&lt;td&gt;18 sec&lt;/td&gt;
&lt;td&gt;9 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bzip2&lt;/td&gt;
&lt;td&gt;565 sec&lt;/td&gt;
&lt;td&gt;308 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pbzip2&lt;/td&gt;
&lt;td&gt;68 sec&lt;/td&gt;
&lt;td&gt;30 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="analyse-des-résultats-et-recommandations"&gt;&lt;a href="#analyse-des-r%c3%a9sultats-et-recommandations" class="header-anchor"&gt;&lt;/a&gt;Analyse des résultats et recommandations
&lt;/h3&gt;&lt;p&gt;Les outils multithreading &lt;code&gt;pigz&lt;/code&gt; et &lt;code&gt;pbzip2&lt;/code&gt; montrent une nette amélioration par rapport à leurs homologues single-threaded, surtout sur des systèmes avec plusieurs cœurs disponibles. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pour une compression rapide&lt;/strong&gt; : Utilisez &lt;code&gt;pigz&lt;/code&gt; si la vitesse est prioritaire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pour une compression plus efficace&lt;/strong&gt; : Utilisez &lt;code&gt;pbzip2&lt;/code&gt; si un meilleur taux de compression est nécessaire, tout en profitant d'une vitesse accrue par rapport à &lt;code&gt;bzip2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="optimisations"&gt;&lt;a href="#optimisations" class="header-anchor"&gt;&lt;/a&gt;Optimisations
&lt;/h2&gt;&lt;h3 id="conseils-pour-optimiser-les-opérations-de-compression"&gt;&lt;a href="#conseils-pour-optimiser-les-op%c3%a9rations-de-compression" class="header-anchor"&gt;&lt;/a&gt;Conseils pour optimiser les opérations de compression
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ajuster le Nombre de Threads&lt;/strong&gt; : Utilisez les options &lt;code&gt;-p&lt;/code&gt; de &lt;code&gt;pigz&lt;/code&gt; et &lt;code&gt;-p&lt;/code&gt; de &lt;code&gt;pbzip2&lt;/code&gt; pour ajuster le nombre de threads en fonction du nombre de cœurs disponibles.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pigz -p &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; -c fichier &amp;gt; fichier.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pbzip2 -p8 fichier
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Combinaison avec tar&lt;/strong&gt; : Utilisez l'option &lt;code&gt;-I&lt;/code&gt; de &lt;code&gt;tar&lt;/code&gt; pour spécifier le programme de compression, simplifiant ainsi les commandes complexes.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -cvI &lt;span style="color:#e6db74"&gt;&amp;#34;pigz -p 4&amp;#34;&lt;/span&gt; -f archive.tar.gz dossier/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surveiller l'Utilisation des Ressources&lt;/strong&gt; : Utilisez des outils comme &lt;code&gt;htop&lt;/code&gt; ou &lt;code&gt;top&lt;/code&gt; pour surveiller l'utilisation des ressources et ajuster les paramètres de compression en conséquence.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;La compression multithreading, grâce à des outils comme &lt;code&gt;pigz&lt;/code&gt; et &lt;code&gt;pbzip2&lt;/code&gt;, représente une avancée significative par rapport aux méthodes traditionnelles. En exploitant les capacités des systèmes multicœurs, ces outils offrent des performances de compression et de décompression bien supérieures. Que vous ayez besoin de rapidité avec &lt;code&gt;pigz&lt;/code&gt; ou d'une compression plus efficace avec &lt;code&gt;pbzip2&lt;/code&gt;, intégrer ces outils dans vos flux de travail peut transformer la gestion des fichiers et des archives, rendant vos processus plus efficaces et adaptés aux environnements modernes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="références"&gt;&lt;a href="#r%c3%a9f%c3%a9rences" class="header-anchor"&gt;&lt;/a&gt;Références
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zlib.net/pigz/"&gt;Documentation de pigz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://compression.ca/pbzip2/"&gt;Documentation de pbzip2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/tar/manual/tar.html"&gt;Documentation GNU tar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker-Compose : Mise à jour manuelle des images</title><link>https://slash-root.fr/docker-compose-mise-a-jour-manuelle-des-images/</link><pubDate>Mon, 01 Jul 2024 11:15:09 +0200</pubDate><guid>https://slash-root.fr/docker-compose-mise-a-jour-manuelle-des-images/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-mise-a-jour-manuelle-des-images/cover.png" alt="Featured image of post Docker-Compose : Mise à jour manuelle des images" /&gt;&lt;h2 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h2&gt;&lt;p&gt;Assurez-vous de vous placer dans le répertoire contenant le fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; avant de suivre les étapes ci-dessous.&lt;/p&gt;
&lt;h2 id="étapes-pour-la-mise-à-jour"&gt;&lt;a href="#%c3%a9tapes-pour-la-mise-%c3%a0-jour" class="header-anchor"&gt;&lt;/a&gt;Étapes pour la mise à jour
&lt;/h2&gt;&lt;h3 id="télécharger-les-images-mises-à-jour"&gt;&lt;a href="#t%c3%a9l%c3%a9charger-les-images-mises-%c3%a0-jour" class="header-anchor"&gt;&lt;/a&gt;Télécharger les images mises à jour
&lt;/h3&gt;&lt;p&gt;Utilisez la commande suivante pour télécharger les dernières versions des images spécifiées dans le fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="redémarrer-les-conteneurs-avec-les-nouvelles-images"&gt;&lt;a href="#red%c3%a9marrer-les-conteneurs-avec-les-nouvelles-images" class="header-anchor"&gt;&lt;/a&gt;Redémarrer les conteneurs avec les nouvelles images
&lt;/h3&gt;&lt;p&gt;Redémarrez les conteneurs pour appliquer les mises à jour. Utilisez l'option &lt;code&gt;-d&lt;/code&gt; pour détacher le processus et &lt;code&gt;--remove-orphans&lt;/code&gt; pour supprimer les conteneurs qui ne sont plus définis dans le fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d --remove-orphans
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nettoyer-les-images-obsolètes"&gt;&lt;a href="#nettoyer-les-images-obsol%c3%a8tes" class="header-anchor"&gt;&lt;/a&gt;Nettoyer les images obsolètes
&lt;/h3&gt;&lt;p&gt;Pour libérer de l'espace disque, supprimez les images qui ne sont plus utilisées par aucun conteneur actif :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker image prune
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>MySQL : Réinitialisation du mot de passe root dans un conteneur Docker</title><link>https://slash-root.fr/mysql-reinitialisation-du-mot-de-passe-root-dans-un-conteneur-docker/</link><pubDate>Mon, 17 Jun 2024 15:57:47 +0200</pubDate><guid>https://slash-root.fr/mysql-reinitialisation-du-mot-de-passe-root-dans-un-conteneur-docker/</guid><description>&lt;img src="https://slash-root.fr/mysql-reinitialisation-du-mot-de-passe-root-dans-un-conteneur-docker/cover.jpg" alt="Featured image of post MySQL : Réinitialisation du mot de passe root dans un conteneur Docker" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Dans certains cas, vous pouvez perdre ou oublier le mot de passe root de votre base de données MySQL, rendant ainsi difficile l'exécution de tâches administratives essentielles. Cela peut se produire si le mot de passe a été généré automatiquement lors de l'initialisation du conteneur et non enregistré. Ce guide explique comment réinitialiser le mot de passe root de MySQL dans un environnement Docker.&lt;/p&gt;
&lt;h2 id="préparation"&gt;&lt;a href="#pr%c3%a9paration" class="header-anchor"&gt;&lt;/a&gt;Préparation
&lt;/h2&gt;&lt;h3 id="1-créer-le-fichier-de-réinitialisation"&gt;&lt;a href="#1-cr%c3%a9er-le-fichier-de-r%c3%a9initialisation" class="header-anchor"&gt;&lt;/a&gt;1. Créer le fichier de réinitialisation
&lt;/h3&gt;&lt;p&gt;Commencez par créer un fichier &lt;code&gt;mysql-init.sql&lt;/code&gt; dans le même répertoire que votre fichier &lt;code&gt;docker-compose.yml&lt;/code&gt;. Ce fichier contiendra une requête SQL pour réinitialiser le mot de passe root.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;USE mysql;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; IDENTIFIED &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;NEWPASSWORD&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FLUSH &lt;span style="color:#66d9ef"&gt;PRIVILEGES&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remplacez &lt;code&gt;NEWPASSWORD&lt;/code&gt; par le nouveau mot de passe souhaité.&lt;/p&gt;
&lt;h3 id="2-modifier-docker-composeyml"&gt;&lt;a href="#2-modifier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;2. Modifier &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Pour utiliser le fichier de réinitialisation avec Docker, vous devez monter ce fichier dans le conteneur MySQL.&lt;/p&gt;
&lt;p&gt;Ajoutez ou modifiez la section &lt;code&gt;volumes&lt;/code&gt; pour inclure le montage du fichier &lt;code&gt;mysql-init.sql&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mysql&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Autres configurations de service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Autres volumes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./mysql-init.sql:/tmp/mysql-init.sql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="processus-de-réinitialisation"&gt;&lt;a href="#processus-de-r%c3%a9initialisation" class="header-anchor"&gt;&lt;/a&gt;Processus de Réinitialisation
&lt;/h2&gt;&lt;h3 id="1-arrêter-le-conteneur-mysql"&gt;&lt;a href="#1-arr%c3%aater-le-conteneur-mysql" class="header-anchor"&gt;&lt;/a&gt;1. Arrêter le conteneur MySQL
&lt;/h3&gt;&lt;p&gt;Avant de réinitialiser le mot de passe, assurez-vous d'arrêter le conteneur MySQL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose stop mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-accéder-au-conteneur"&gt;&lt;a href="#2-acc%c3%a9der-au-conteneur" class="header-anchor"&gt;&lt;/a&gt;2. Accéder au conteneur
&lt;/h3&gt;&lt;p&gt;Lancez le conteneur MySQL sans démarrer le service pour obtenir un shell bash :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose run mysql bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-exécuter-le-script-de-réinitialisation"&gt;&lt;a href="#3-ex%c3%a9cuter-le-script-de-r%c3%a9initialisation" class="header-anchor"&gt;&lt;/a&gt;3. Exécuter le script de réinitialisation
&lt;/h3&gt;&lt;p&gt;Dans le conteneur, lancez MySQL avec le fichier de réinitialisation :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysqld --init-file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/tmp/mysql-init.sql &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Attendez quelques instants que le processus se termine. Vous pouvez vérifier si le mot de passe a été réinitialisé en tentant une connexion à MySQL.&lt;/p&gt;
&lt;h3 id="4-nettoyer-et-relancer-le-service"&gt;&lt;a href="#4-nettoyer-et-relancer-le-service" class="header-anchor"&gt;&lt;/a&gt;4. Nettoyer et relancer le service
&lt;/h3&gt;&lt;p&gt;Quittez le conteneur et supprimez le montage du fichier SQL dans &lt;code&gt;docker-compose.yml&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supprimez ou commentez la ligne &lt;code&gt;- ./mysql-init.sql:/tmp/mysql-init.sql&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite, arrêtez complètement la stack Docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relancez la stack :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;Pour vérifier que le nouveau mot de passe fonctionne, essayez de vous connecter à MySQL en utilisant le nouveau mot de passe :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it &amp;lt;CONTENEUR_MYSQL&amp;gt; mysql -u root -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remplacez &lt;code&gt;&amp;lt;CONTENEUR_MYSQL&amp;gt;&lt;/code&gt; par l'ID ou le nom du conteneur MySQL.&lt;/p&gt;</description></item><item><title>WordPress : Augmenter la taille d’upload des fichiers (Docker)</title><link>https://slash-root.fr/wordpress-augmenter-la-taille-dupload-des-fichiers-docker/</link><pubDate>Sat, 15 Jun 2024 12:05:28 +0200</pubDate><guid>https://slash-root.fr/wordpress-augmenter-la-taille-dupload-des-fichiers-docker/</guid><description>&lt;img src="https://slash-root.fr/wordpress-augmenter-la-taille-dupload-des-fichiers-docker/cover.jpg" alt="Featured image of post WordPress : Augmenter la taille d’upload des fichiers (Docker)" /&gt;&lt;h2 id="base"&gt;&lt;a href="#base" class="header-anchor"&gt;&lt;/a&gt;Base
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://slash-root.fr/docker-compose-wordpress-mariadb/"&gt;/docker-compose-wordpress-mariadb/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-uploadsini"&gt;&lt;a href="#fichier-uploadsini" class="header-anchor"&gt;&lt;/a&gt;Fichier uploads.ini
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Créer un fichier &lt;code&gt;uploads.ini&lt;/code&gt; à côté du &lt;code&gt;docker-compose.yml&lt;/code&gt; avec le contenu suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;file_uploads&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;On&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;memory_limit&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;50M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;upload_max_filesize&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;50M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;post_max_size&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;50M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;max_execution_time&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fichier-docker-composeyml"&gt;&lt;a href="#fichier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;Fichier docker-compose.yml
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Modifier la section &lt;strong&gt;volumes&lt;/strong&gt; du service &lt;code&gt;wordpress&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./wordpress:/var/www/html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Ajouter la ligne suivante :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="redémarrer-wordpress"&gt;&lt;a href="#red%c3%a9marrer-wordpress" class="header-anchor"&gt;&lt;/a&gt;Redémarrer WordPress
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : WordPress (MariaDB)</title><link>https://slash-root.fr/docker-compose-wordpress-mariadb/</link><pubDate>Sat, 15 Jun 2024 11:53:16 +0200</pubDate><guid>https://slash-root.fr/docker-compose-wordpress-mariadb/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-wordpress-mariadb/cover.png" alt="Featured image of post Docker-Compose : WordPress (MariaDB)" /&gt;&lt;h2 id="le-fichier-docker-composeyml"&gt;&lt;a href="#le-fichier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;Le fichier docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;wordpress&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wordpress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8080:80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;WORDPRESS_DB_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;WORDPRESS_DB_USER&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress_db_password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;WORDPRESS_DB_NAME&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wordpress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./wordpress:/var/www/html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress-db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_RANDOM_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wordpress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_USER&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_PASSWORD&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;wordpress_db_password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./db:/var/lib/mysql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;network&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="directory"&gt;&lt;a href="#directory" class="header-anchor"&gt;&lt;/a&gt;Directory
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir &lt;span style="color:#f92672"&gt;{&lt;/span&gt;wordpress,db&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod &lt;span style="color:#ae81ff"&gt;750&lt;/span&gt; wordpress db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown 999:root db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown 33:33 wordpress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="execution"&gt;&lt;a href="#execution" class="header-anchor"&gt;&lt;/a&gt;Execution
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Fail2ban : Installation et configuration (Debian 12)</title><link>https://slash-root.fr/fail2ban-installation-et-configuration/</link><pubDate>Sat, 15 Jun 2024 10:20:35 +0200</pubDate><guid>https://slash-root.fr/fail2ban-installation-et-configuration/</guid><description>&lt;img src="https://slash-root.fr/fail2ban-installation-et-configuration/cover.png" alt="Featured image of post Fail2ban : Installation et configuration (Debian 12)" /&gt;&lt;ul&gt;
&lt;li&gt;15/06/2024 : Mise à jour pour Debian 12 (rsyslog, systemd)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Le service Fail2ban va permettre de protéger un serveur Linux des attaques de brute-force automatiquement en surveillant les logs. Des que les conditions sont réunies (nombres de tentative dans un intervalle de temps), l'adresse IP suspecte est bannie durant un temps déterminé. Le ban est réalisé à l'aide du système de parefeu &lt;code&gt;iptables&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cet article traite de l'installation ainsi que la configuration de fail2ban sur une Debian 12. Le service SSHD servira d'exemple. Des commandes pour interagir avec le service fail2ban sont également présentées.&lt;/p&gt;
&lt;p&gt;Sous Debian 12, le paquet &lt;code&gt;rsyslog&lt;/code&gt; n'est plus installé par défaut. Celui-ci est nécessaire au bon fonctionnement sans modification de la configuration de fail2ban. Cependant, il est tout de même préférable de configurer celui-ci pour fonctionner avec &lt;code&gt;systemd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Les 2 méthodes sont présentées ici. Let's go !&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Fail2ban est présent dans les dépôts de Debian 12 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Si &lt;code&gt;iptables&lt;/code&gt; n'est pas installé, le faire :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y iptables
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;h3 id="création-des-fichiers-de-configuration"&gt;&lt;a href="#cr%c3%a9ation-des-fichiers-de-configuration" class="header-anchor"&gt;&lt;/a&gt;Création des fichiers de configuration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Par défaut fail2ban est installé avec 2 fichiers de configuration : &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; et &lt;code&gt;/etc/fail2ban/jail.d/defaults-debian.conf&lt;/code&gt; .&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ces fichiers ne doivent pas être modifié. Ils seront écrasés à la prochaine mise à jour de fail2ban.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fail2ban lit les fichiers de configurations dans cet ordre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les fichiers &lt;code&gt;.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les fichiers &lt;code&gt;.local&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Chaque directive définit dans le fichier de configuration &lt;code&gt;.local&lt;/code&gt;, écrase la directive contenue dans son homologue &lt;code&gt;.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce fichier de configuration &lt;code&gt;.local&lt;/code&gt; peut uniquement contenir les directives nécessaires pour compléter et/ou écraser de celles définies dans le fichier &lt;code&gt;.conf&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer les fichiers de configuration adéquat en se basant sur ceux présents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp /etc/fail2ban/jail.&lt;span style="color:#f92672"&gt;{&lt;/span&gt;conf,local&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editer le fichier &lt;code&gt;jail.local&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/fail2ban/jail.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="backend"&gt;&lt;a href="#backend" class="header-anchor"&gt;&lt;/a&gt;Backend
&lt;/h3&gt;&lt;h4 id="rsyslog"&gt;&lt;a href="#rsyslog" class="header-anchor"&gt;&lt;/a&gt;&lt;u&gt;rsyslog&lt;/u&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Par défaut dans la configuration de fail2ban, il est indiqué :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;backend&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Cela implique d'avoir &lt;code&gt;rsyslog&lt;/code&gt; d'installer. Celui-ci fournira les logs dans &lt;code&gt;/var/log/&lt;/code&gt; comme le &lt;strong&gt;auth.log&lt;/strong&gt; servant pour SSH. Dans Debian 12, ce paquet n'est plus installer par défaut. Il faut donc l'installer :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="systemd"&gt;&lt;a href="#systemd" class="header-anchor"&gt;&lt;/a&gt;&lt;u&gt;systemd&lt;/u&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Pour que fail2ban puisse se baser sur &lt;code&gt;systemd&lt;/code&gt;, le backend doit être modifié dans la configuration de fail2ban :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;backend&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;systemd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Rsyslog ne sera pas nécessaire dans ce cas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="paramétrage"&gt;&lt;a href="#param%c3%a9trage" class="header-anchor"&gt;&lt;/a&gt;Paramétrage
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Il est utile d'indiquer des IPs en liste blanche pour éviter de s'auto-ban lors d'un retour de vacance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Décommenter la ligne commençant par &lt;code&gt;ignoreip&lt;/code&gt; et ajouter les adresses IPs séparées d'un espace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ignoreip&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;127.0.0.1/8 ::1 123.123.123.123 192.168.1.0/24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il y a 3 directives importantes à connaitre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bantime&lt;/code&gt; : La durée de ban d'une adresse IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Par défaut si aucun suffixe n'est spécifié, la durée est exprimée en secondes. Pour un ban permanent, indiquer un nombre négatif.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;findtime&lt;/code&gt; : La durée pour comptabiliser le nombre de tentatives maximales (maxretry) avant de déclencher un ban.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;maxretry&lt;/code&gt; : Le nombre de tentative durant la période indiquée dans findtime avant de ban une ip.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;bantime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;findtime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;10m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;maxretry&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Si 5 échecs d'authentification sont détectés dans un intervalle de 10 minutes, l'adresse IP sera ban pendant 24h.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour être notifié par email, modifier la ligne commençant par &lt;code&gt;action&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;action&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;%(action_mw)s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour avoir les logs dans l'email, indiquer &lt;code&gt;%(action_mwl)s&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un serveur SMTP doit être installé sur le serveur (non abordé).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier l'adresse de destinataire et d'expéditeur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;destemail&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;admin@linuxize.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sender&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;root@linuxize.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="service"&gt;&lt;a href="#service" class="header-anchor"&gt;&lt;/a&gt;Service
&lt;/h3&gt;&lt;p&gt;Après toute modification de la configuration et/ou l'installation de &lt;code&gt;rsyslog&lt;/code&gt;, il est important de redémarrer le service fail2ban pour que les changements soient pris en compte :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Vérification :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="les-jails"&gt;&lt;a href="#les-jails" class="header-anchor"&gt;&lt;/a&gt;Les jails
&lt;/h2&gt;&lt;p&gt;Fail2ban utilise un concept de jails (prisons). Une jail décrit un service et comprend des notions de filtres ainsi que d'action. Lorsque les données sont écrites dans les logs, fail2ban va compter les patterns recherchés du service à surveiller pour y appliquer une action quand ça match.&lt;/p&gt;
&lt;p&gt;Fail2ban est fournit avec plusieurs jails pour différents services. Une jail peut être définie manuellement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour activer une jail, il faut ajouter la directive &lt;code&gt;enabled = true&lt;/code&gt; juste après le titre.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exemple pour le service sshd (toujours dans le fichier &lt;code&gt;jail.local&lt;/code&gt;) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[sshd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;maxretry&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;findtime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;bantime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;4w&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ignoreip&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;127.0.0.1/8 192.168.1.0/24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Les adresses IP 127.x.x.x et 192.168.1.x sont en liste blanche.&lt;/li&gt;
&lt;li&gt;Toutes autres adresses IP sera ban, en cas de 3 échecs d'authentification au service ssh dans un laps de temps de 24h, pour une durée de 4 semaines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resume"&gt;&lt;a href="#resume" class="header-anchor"&gt;&lt;/a&gt;Resume
&lt;/h2&gt;&lt;h3 id="installation-avec-backend-systemd"&gt;&lt;a href="#installation-avec-backend-systemd" class="header-anchor"&gt;&lt;/a&gt;Installation avec backend systemd
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y fail2ban iptables
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp /etc/fail2ban/jail.&lt;span style="color:#f92672"&gt;{&lt;/span&gt;conf,local&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sed -i &lt;span style="color:#e6db74"&gt;&amp;#39;s/backend = auto/backend = systemd/&amp;#39;&lt;/span&gt; /etc/fail2ban/jail.local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client status sshd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installation-avec-service-rsyslog"&gt;&lt;a href="#installation-avec-service-rsyslog" class="header-anchor"&gt;&lt;/a&gt;Installation avec service rsyslog
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y fail2ban iptables rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp /etc/fail2ban/jail.&lt;span style="color:#f92672"&gt;{&lt;/span&gt;conf,local&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client status sshd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fail2ban-client"&gt;&lt;a href="#fail2ban-client" class="header-anchor"&gt;&lt;/a&gt;Fail2ban client
&lt;/h2&gt;&lt;p&gt;Fail2ban est fournit avec un outil en ligne de commande : &lt;code&gt;fail2ban-client&lt;/code&gt;. Celui va permettre d'interagir avec le service fail2ban.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour voir toutes les options disponibles :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fail2ban-client -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voici quelques exemples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connaitre le status du service :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Vérifier le status de la jail sshd :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client status sshd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Unban une adresse IP :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client set sshd unbanip 11.22.33.44
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ban une adresse IP :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client set sshd banip 11.22.33.44
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Proxmox : Template Oraclelinux9 avec Cloud-Init</title><link>https://slash-root.fr/proxmox-template-oraclelinux9-avec-cloud-init/</link><pubDate>Fri, 31 May 2024 22:46:12 +0200</pubDate><guid>https://slash-root.fr/proxmox-template-oraclelinux9-avec-cloud-init/</guid><description>&lt;img src="https://slash-root.fr/proxmox-template-oraclelinux9-avec-cloud-init/cover.png" alt="Featured image of post Proxmox : Template Oraclelinux9 avec Cloud-Init" /&gt;&lt;p&gt;Cette procédure va permettre de créer un template de VM Oraclelinux 9 pour Proxmox avec Cloud-Init.&lt;/p&gt;
&lt;p&gt;L'intérêt sera de cloner ce template, puis de pouvoir se connecter directement en ssh au 1er démarrage de la VM. Le nom d'hôte, l'adressage ip, la(es) clef(s) ssh seront configurés à l'initialisation de la VM grâce à cloud-init.&lt;/p&gt;
&lt;p&gt;Ce template pourra éventuellement être utilisé par la suite avec une solution telle que Terraform / OpenTofu.&lt;/p&gt;
&lt;h2 id="création-du-template"&gt;&lt;a href="#cr%c3%a9ation-du-template" class="header-anchor"&gt;&lt;/a&gt;Création du template
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter sur un shell &lt;code&gt;root&lt;/code&gt; de l'hôte Proxmox &lt;code&gt;pvehost&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@pvehost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Télécharger la dernière image cloud d'Oracle Linux :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://yum.oracle.com/templates/OracleLinux/OL9/u4/x86_64/OL9U4_x86_64-kvm-b234.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer &lt;code&gt;libguestfs-tools&lt;/code&gt; si nécessaire et ajouter &lt;code&gt;qemu-guest-agent&lt;/code&gt; à l'image cloud précédemment téléchargée :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y libguestfs-tools
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;virt-customize -a OL9U4_x86_64-kvm-b234.qcow2 --install qemu-guest-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Créer une VM avec l'ID 666 qui sera le template :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm create &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --name oraclelinux9-cloudinit --net0 virtio,bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;vmbr1 --scsihw virtio-scsi-single
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;
&lt;code&gt;virtio-scsi-single&lt;/code&gt; va permettre d'activer le paramètre &amp;quot;iothread&amp;quot; pour une meilleure gestion des inputs ouputs dans ce cas.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Elle sera nommée &lt;code&gt;oraclelinux9-cloudinit&lt;/code&gt; et la 1ère carte réseau sera rattachée au &lt;code&gt;vmbr1&lt;/code&gt; du serveur Proxmox.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter un nouveau disque dur importé depuis l'image cloud :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --scsi0 local:0,iothread&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1,backup&lt;span style="color:#f92672"&gt;=&lt;/span&gt;off,format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;qcow2,import-from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/root/OL9U4_x86_64-kvm-b234.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Définir le disque dur en 1er boot sur la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --boot order&lt;span style="color:#f92672"&gt;=&lt;/span&gt;scsi0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Définir le nombre de coeurs et la mémoire RAM de la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --cpu host --cores &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; --memory &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Attacher un disque Cloud-Init à la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --ide2 local:cloudinit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --agent enabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajuster les paramètres dans les options &lt;code&gt;Cloud-Init&lt;/code&gt; qui figureront dans le template (si nécessaire) :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="1.png" alt="image-20240531214220236" /&gt;&lt;/p&gt;
&lt;p&gt;Ces options sont disponibles dans la WebUI du serveur Proxmox au niveau de la VM.&lt;/p&gt;
&lt;p&gt;Plus de détails ici &lt;a href="https://pve.proxmox.com/wiki/Cloud-Init_Support"&gt;&lt;a href="https://pve.proxmox.com/wiki/Cloud-Init_Support"&gt;https://pve.proxmox.com/wiki/Cloud-Init_Support&lt;/a&gt;&lt;/a&gt; sur les différents paramétrages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Convertir la VM en template :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm template &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation-du-template"&gt;&lt;a href="#utilisation-du-template" class="header-anchor"&gt;&lt;/a&gt;Utilisation du template
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Cloner entièrement le template en VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="2.png" alt="image-20240531214417948" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Ajuster les paramètres &lt;code&gt;Cloud-Init&lt;/code&gt; de la VM si nécessaire.
&lt;/li&gt;
&lt;li&gt;
Démarrer la VM et récupérer l'IP (si nécessaire) :
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="3.png" alt="image-20240531222714404" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se connecter en SSH sur la VM avec la clef ssh renseignée dans cloud-init :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;julien@mypc:~$ ssh -i .ssh/demo admin@172.16.20.23
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;admin@ol9-cloudinit ~&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ sudo -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Matching Defaults entries &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; admin on ol9-cloudinit:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;COLORS DISPLAY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; HOSTNAME HISTSIZE KDEDIR LS_COLORS&amp;#34;&lt;/span&gt;, env_keep&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; env_keep&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES&amp;#34;&lt;/span&gt;, env_keep&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LC_MONETARY LC_NAME LC_NUMERIC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; LC_PAPER LC_TELEPHONE&amp;#34;&lt;/span&gt;, env_keep&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secure_path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/sbin&lt;span style="color:#ae81ff"&gt;\:&lt;/span&gt;/bin&lt;span style="color:#ae81ff"&gt;\:&lt;/span&gt;/usr/sbin&lt;span style="color:#ae81ff"&gt;\:&lt;/span&gt;/usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User admin may run the following commands on ol9-cloudinit:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;ALL&lt;span style="color:#f92672"&gt;)&lt;/span&gt; NOPASSWD: ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OPNsense : Block malicious IPs</title><link>https://slash-root.fr/opnsense-block-malicious-ips/</link><pubDate>Thu, 21 Mar 2024 10:08:02 +0100</pubDate><guid>https://slash-root.fr/opnsense-block-malicious-ips/</guid><description>&lt;img src="https://slash-root.fr/opnsense-block-malicious-ips/cover.jpg" alt="Featured image of post OPNsense : Block malicious IPs" /&gt;&lt;p&gt;Un jour, j'ai décidé d'ajouter des blocklists à mes instances Crowdsec. Tout fier, j'en informe mon copain BoB sur Discord. C'est à ce moment là, qu'il me répond : &amp;quot;Hey, rajoute cette liste comportant + de 200k IP !&amp;quot;&lt;/p&gt;
&lt;p&gt;Cette fameuse liste est disponible sur ce dépôt git : &lt;a href="https://github.com/duggytuxy/Intelligence_IPv4_Blocklist"&gt;https://github.com/duggytuxy/Intelligence_IPv4_Blocklist&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En complément : Un clin dœil à Romain Marcoux pour ses travaux open source liés autour de la CTI : &lt;a href="https://github.com/romainmarcoux"&gt;https://github.com/romainmarcoux&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La communauté BE.CYBER a même découpé cette liste pour bypass la limitation des équipements Fortinet. Pour ici, pas besoin de la découper puisque je vais présenter comment la mettre en place sur OPNsense et la mettre à jour automatiquement.&lt;/p&gt;
&lt;p&gt;Allez, c'est parti !&lt;/p&gt;
&lt;h2 id="mise-en-place-dun-alias"&gt;&lt;a href="#mise-en-place-dun-alias" class="header-anchor"&gt;&lt;/a&gt;Mise en place d&amp;rsquo;un alias
&lt;/h2&gt;&lt;p&gt;Pour la mise en place de la liste, il faudra créer un alias. C'est également grâce à cet alias qua liste se mettra à jour automatiquement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tout d'abord, se rendre dans &lt;code&gt;Firewall&lt;/code&gt; (1), &lt;code&gt;Aliases&lt;/code&gt; (2). Puis, ajouter un nouvel alias (3).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_01.png" alt="image-20240321091150291" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 champs à remplir :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt; (1) : Le nom qui permettra d'utiliser cet alias dans les règles du firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt; (2) : Sélectionner &lt;code&gt;URL Table (IPs)&lt;/code&gt;. Cela va permettre d'indiquer une fréquence de mise à jour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refresh Frequency&lt;/strong&gt; (3) : Indiquer la fréquence de mise à jour de la liste. Ici, tous les jours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content&lt;/strong&gt; (4) : La fameuse liste au format raw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; (5) : Le nom de ce champs parle de lui-même.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_02.png" alt="image-20240321091835085" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lien de la liste : [Update 13/09/2025] &lt;a href="https://raw.githubusercontent.com/duggytuxy/Data-Shield_IPv4_Blocklist/refs/heads/main/prod_data-shield_ipv4_blocklist.txt"&gt;https://raw.githubusercontent.com/duggytuxy/Data-Shield_IPv4_Blocklist/refs/heads/main/prod_data-shield_ipv4_blocklist.txt&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Valider en cliquant sur &lt;code&gt;Save&lt;/code&gt;, puis &lt;code&gt;Apply&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La liste est mise en place avec &lt;strong&gt;8309&lt;/strong&gt; entrées à ce jour (1) à travers ce nouvel alias. De plus, on peut constater que le firewall d'OPNsense peut comporter jusqu'à 1 millions d'entrées par défaut (2).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_07.png" alt="image-20240321091835066" /&gt;&lt;/p&gt;
&lt;h2 id="augmenter-le-nombre-dentrées"&gt;&lt;a href="#augmenter-le-nombre-dentr%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Augmenter le nombre d&amp;rsquo;entrées
&lt;/h2&gt;&lt;p&gt;Si cette limite d'un million d'entrées dans le système n'est pas suffisante, il est possible de l'augmenter.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;code&gt;Firewall&lt;/code&gt; (1), &lt;code&gt;Settings&lt;/code&gt; (2), &lt;code&gt;Advanced&lt;/code&gt; (3), et indiquer le nombre désiré (4).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_03.png" alt="image-20240321093750139" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valider en cliquant sur &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-des-règles-du-firewall"&gt;&lt;a href="#configuration-des-r%c3%a8gles-du-firewall" class="header-anchor"&gt;&lt;/a&gt;Configuration des règles du firewall
&lt;/h2&gt;&lt;p&gt;Pour bloquer ces IPs malicieuses en entrées comme en sorties du firewall, il est nécessaire de créer 2 nouvelles règles. Pour réaliser ça, les définir dans &lt;strong&gt;Floating&lt;/strong&gt; est intéressant. Ainsi ces règles vont s'appliquer sur toutes les interfaces en priorité.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;code&gt;Firewall&lt;/code&gt; (1), &lt;code&gt;Rules&lt;/code&gt; (2), &lt;code&gt;Floating&lt;/code&gt; (3). Puis ajouter une nouvelle règle (4).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_04.png" alt="image-20240321094221058" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 champs importants :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt; (1) : Par défaut, ce champs sera sur Pass. Le modifier pour &lt;code&gt;Block&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direction&lt;/strong&gt; (2) : Peu importe la direction, on bloque ! Donc, &lt;code&gt;any&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt; (3) : Sélectionner l'alias créé précédemment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination&lt;/strong&gt; (4) : Peu importe la destination ! Donc, &lt;code&gt;any&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_05.png" alt="image-20240321095026838" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valider en cliquant sur &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Créer une seconde règle identique à la première mais en inversant &lt;code&gt;Source&lt;/code&gt; et &lt;code&gt;Destination&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ne pas oublier de cliquer sur &lt;code&gt;Apply&lt;/code&gt; pour valider l'ajout de ces 2 règles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="opnsense_malicious_06.png" alt="image-20240321095749005" /&gt;&lt;/p&gt;
&lt;p&gt;Voilà, c'est mis en place !&lt;/p&gt;
&lt;p&gt;Bien évidemment, il est possible d'activer les logs sur ces 2 règles afin d'en mesurer l'impact et/ou pouvoir les remonter dans un SIEM par exemple.&lt;/p&gt;</description></item><item><title>Proxmox : ACME Certificate</title><link>https://slash-root.fr/proxmox-acme-certificate/</link><pubDate>Mon, 22 Jan 2024 21:13:13 +0100</pubDate><guid>https://slash-root.fr/proxmox-acme-certificate/</guid><description>&lt;img src="https://slash-root.fr/proxmox-acme-certificate/cover.png" alt="Featured image of post Proxmox : ACME Certificate" /&gt;&lt;p&gt;J'ai du mettre en place un certificat proxmox pour un serveur accessible publiquement.&lt;br /&gt;
Donc voici une procédure pour la mise en place de certificat avec l'aide de ACME.&lt;/p&gt;
&lt;p&gt;Nous allons générer un certificat pour notre serveur proxmox avec l'aide de la technologie ACME.&lt;/p&gt;
&lt;p&gt;Pour cela on va passer par la methode présente dans la configuration graphique de proxmox.&lt;/p&gt;
&lt;p&gt;Dans un premier temps on va avoir besoin de créer un compte ACME qui va être utilisé pour la génération du certificat.&lt;/p&gt;
&lt;p&gt;Il faut se rendre dans &lt;code&gt;Datacenter&lt;/code&gt; &amp;gt; &lt;code&gt;ACME&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Puis il suffit d'ajouter un compte comme dans le screen présent ci dessous :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="379" width="696" decoding="async" src="01-acme_prox.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois que le compte a été créé nous devons faire la demande de certificat.&lt;/p&gt;
&lt;p&gt;Pour cela il faut se rendre dans la catégorie :&lt;br /&gt;
&lt;code&gt;Datacenter&lt;/code&gt; &amp;gt; &lt;code&gt;pve&lt;/code&gt; &amp;gt; &lt;code&gt;System&lt;/code&gt; &amp;gt; &lt;code&gt;Certificates&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Nous allons utiliser la partie HTTP.&lt;br /&gt;
Pour cela il faut juste renseigner le FQDN de votre serveur :&lt;br /&gt;
&lt;code&gt;pve.domaine.fr&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="352" width="696" decoding="async" src="02-acme_prox.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois que le domaine a été renseigné il suffit de générer la requette avec l'aide de l'utilitaire.&lt;br /&gt;
Il suffit de cliquer sur son &lt;code&gt;certificat&lt;/code&gt; &amp;gt; &lt;code&gt;(choisir son profile)&lt;/code&gt; &amp;gt; &lt;code&gt;Order certificate Now&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03-1-acme_prox.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Il vous suffira d'attendre que le certificat soit généré.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04-1-acme_prox.png" alt="" /&gt;&lt;br /&gt;
Une fois que le certificat est généré, il vous suffira de recharger votre page et votre certificat sera mis à jour.&lt;/p&gt;
&lt;h3 id="erreur-rencontrée"&gt;&lt;a href="#erreur-rencontr%c3%a9e" class="header-anchor"&gt;&lt;/a&gt;Erreur rencontrée
&lt;/h3&gt;&lt;p&gt;J'ai eu une erreur au moment de la génération.&lt;br /&gt;
L'erreur rencontrée était qu'il manquait l'utilisateur &amp;quot;default&amp;quot; dans les comptes ACME.&lt;br /&gt;
J'ai donc créer un compte &amp;quot;default&amp;quot; avec un mail bidon. Et après j'ai pu effectuer la demande de certificat sans problème.&lt;/p&gt;</description></item><item><title>Proxmox : Template Debian12 avec Cloud-Init</title><link>https://slash-root.fr/proxmox-template-debian12-avec-cloud-init/</link><pubDate>Thu, 09 Nov 2023 14:23:19 +0100</pubDate><guid>https://slash-root.fr/proxmox-template-debian12-avec-cloud-init/</guid><description>&lt;img src="https://slash-root.fr/proxmox-template-debian12-avec-cloud-init/cover.png" alt="Featured image of post Proxmox : Template Debian12 avec Cloud-Init" /&gt;&lt;p&gt;Cette procédure va permettre de créer un template de VM Debian 12 pour Proxmox avec Cloud-Init.&lt;/p&gt;
&lt;p&gt;L'intérêt sera de cloner ce template, puis de pouvoir se connecter directement en ssh au 1er démarrage de la VM. Le nom d'hôte, l'adressage ip, la(es) clef(s) ssh seront configurés à l'initialisation de la VM grâce à cloud-init.&lt;/p&gt;
&lt;p&gt;Ce template pourra éventuellement être utilisé par la suite avec une solution telle que Terraform / OpenTofu.&lt;/p&gt;
&lt;h2 id="création-du-template"&gt;&lt;a href="#cr%c3%a9ation-du-template" class="header-anchor"&gt;&lt;/a&gt;Création du template
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter sur un shell &lt;code&gt;root&lt;/code&gt; de l'hôte Proxmox &lt;code&gt;pvehost&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@pvehost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Télécharger la dernière image cloud de Debian 12 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer &lt;code&gt;libguestfs-tools&lt;/code&gt; si nécessaire et ajouter &lt;code&gt;qemu-guest-agent&lt;/code&gt; à l'image cloud précédemment téléchargée :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y libguestfs-tools
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;virt-customize -a debian-12-generic-amd64.qcow2 --install qemu-guest-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Créer une VM avec l'ID 666 qui sera le template :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm create &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --name debian12-cloudinit --net0 virtio,bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;vmbr1 --scsihw virtio-scsi-single
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Elle sera nommée &lt;code&gt;debian12-cloudinit&lt;/code&gt; et la 1ère carte réseau sera rattachée au &lt;code&gt;vmbr1&lt;/code&gt; du serveur Proxmox.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter un nouveau disque dur, importé depuis l'image cloud, de 20 G à la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --scsi0 local:0,iothread&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1,backup&lt;span style="color:#f92672"&gt;=&lt;/span&gt;off,format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;qcow2,import-from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/root/debian-12-generic-amd64.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm disk resize &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; scsi0 20G
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Définir le disque dur en 1er boot sur la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --boot order&lt;span style="color:#f92672"&gt;=&lt;/span&gt;scsi0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Définir le nombre de coeurs et la mémoire RAM de la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --cpu host --cores &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; --memory &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Attacher un disque Cloud-Init à la VM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --ide2 local:cloudinit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm set &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --agent enabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajuster les paramètres dans les options &lt;code&gt;Cloud-Init&lt;/code&gt; qui figureront dans le template (si nécessaire) :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01-cloudinit.png" alt="cloudinit" /&gt;&lt;/p&gt;
&lt;p&gt;Ces options sont disponibles dans la WebUI du serveur Proxmox au niveau de la VM.&lt;/p&gt;
&lt;p&gt;Plus de détails ici &lt;a href="https://pve.proxmox.com/wiki/Cloud-Init_Support"&gt;https://pve.proxmox.com/wiki/Cloud-Init_Support&lt;/a&gt; sur les différents paramétrages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Convertir la VM en template :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm template &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation-du-template"&gt;&lt;a href="#utilisation-du-template" class="header-anchor"&gt;&lt;/a&gt;Utilisation du template
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Cloner entièrement le template en VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02-clone.png" alt="clone" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ajuster les paramètres &lt;code&gt;Cloud-Init&lt;/code&gt; de la VM si nécessaire.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Démarrer la VM et récupérer l'IP (si nécessaire) :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03-ip.png" alt="ip" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se connecter en SSH sur la VM avec la clef ssh renseignée dans cloud-init :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;julien@mypc:~$ ssh -i .ssh/demo admin@172.16.20.15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Are you sure you want to &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt; connecting &lt;span style="color:#f92672"&gt;(&lt;/span&gt;yes/no/&lt;span style="color:#f92672"&gt;[&lt;/span&gt;fingerprint&lt;span style="color:#f92672"&gt;])&lt;/span&gt;? yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Warning: Permanently added &lt;span style="color:#e6db74"&gt;&amp;#39;172.16.20.15&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;ED25519&lt;span style="color:#f92672"&gt;)&lt;/span&gt; to the list of known hosts.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Linux vm-deb12-01 6.1.0-13-amd64 &lt;span style="color:#75715e"&gt;#1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29) x86_64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;admin@vm-deb12-01:~$ sudo -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User admin may run the following commands on vm-deb12-01:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;ALL : ALL&lt;span style="color:#f92672"&gt;)&lt;/span&gt; ALL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;ALL&lt;span style="color:#f92672"&gt;)&lt;/span&gt; NOPASSWD: ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Par défaut l'utilisateur définit par cloud-init appartient au groupe &lt;code&gt;sudo&lt;/code&gt; et peut exécuter absolument tout sans saisir son mot de passe.&lt;/p&gt;</description></item><item><title>Docker : Volume bind déguisé</title><link>https://slash-root.fr/docker-volume-bind-deguise/</link><pubDate>Wed, 11 Oct 2023 11:25:12 +0200</pubDate><guid>https://slash-root.fr/docker-volume-bind-deguise/</guid><description>&lt;img src="https://slash-root.fr/docker-volume-bind-deguise/cover.png" alt="Featured image of post Docker : Volume bind déguisé" /&gt;&lt;p&gt;Avec Docker, il y a principalement 2 types de volumes qui sont utilisés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Les volumes &amp;quot;volume&amp;quot;&lt;/strong&gt; : Permet de stocker un répertoire du conteneur dans un volume docker stocké sur l'host (/var/lib/docker/volumes).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les volumes &amp;quot;bind&amp;quot;&lt;/strong&gt; : Permet de monter un répertoire présent sur l'host dans un conteneur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, j'utilise la plupart du temps des volumes de type &amp;quot;bind&amp;quot; afin d'avoir de la persistence pour certaines données d'un conteneur. Par exemple, une base de donnée.&lt;/p&gt;
&lt;p&gt;Le problème que je recontre parfois est la gestion des utilisateurs/groupes propriétaires et des permissions sur les données stockées dans ce type de volume &amp;quot;bind&amp;quot;.&lt;/p&gt;
&lt;p&gt;Avec un volume &amp;quot;volume&amp;quot;, l'avantage est que tout est géré par docker. Par contre, je ne souhaite pas forcément stocker ce volume docker dans /var/lib/docker/volumes de l'host.&lt;/p&gt;
&lt;p&gt;Alors, nous allons voir comment utilisé un volume docker mais qui en faites sera un volume de type bind. Ce que je nomme &lt;u&gt;un volume bind déguisé en volume docker&lt;/u&gt; 🙂&lt;/p&gt;
&lt;h2 id="création-du-volume-docker"&gt;&lt;a href="#cr%c3%a9ation-du-volume-docker" class="header-anchor"&gt;&lt;/a&gt;Création du volume docker
&lt;/h2&gt;&lt;p&gt;Tout d'abord, créer un répertoire local sur l'host qui stockera les données :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -m &lt;span style="color:#ae81ff"&gt;775&lt;/span&gt; -p /srv/docker/volumes/data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, changer l'utilisateur et groupe propriétaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R $USER:docker /srv/docker/volumes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enfin, créer le volume docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker volume create --driver local &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;none &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/srv/docker/volumes/data &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt o&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bind vol_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;--driver local&lt;/strong&gt; : Définit le driver docker à utiliser à local (par défaut).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt type=none&lt;/strong&gt; : Il est important de bien définir le type à none.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt device=&lt;/strong&gt;&lt;HOST_PATH&gt; : Où seront stocké les données du volume sur l'host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt o=bind&lt;/strong&gt; &lt;VOL_NAME&gt;: C'est avec cette option que le volume docker sera en faites un volume bind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vérifier la création du volume :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker volume list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DRIVER VOLUME NAME
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local vol_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier les propriétés du volume :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker inspect vol_data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CreatedAt&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2023-10-11T11:15:38+02:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Labels&amp;#34;&lt;/span&gt;: null,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Mountpoint&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/var/lib/docker/volumes/vol_data/_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;vol_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Options&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;device&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/srv/docker/volumes/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;bind&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Scope&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un volume nommé &lt;code&gt;vol_data&lt;/code&gt; est à présent disponible pour un conteneur.&lt;/p&gt;
&lt;h3 id="utilisation-du-volume-docker"&gt;&lt;a href="#utilisation-du-volume-docker" class="header-anchor"&gt;&lt;/a&gt;Utilisation du volume docker
&lt;/h3&gt;&lt;h4 id="avec-docker-run"&gt;&lt;a href="#avec-docker-run" class="header-anchor"&gt;&lt;/a&gt;Avec docker run
&lt;/h4&gt;&lt;p&gt;Pour utiliser ce volume docker avec &lt;code&gt;docker run&lt;/code&gt; , comme avec un volume docker &amp;quot;classique&amp;quot;, utiliser l'option &lt;code&gt;--volume vol_data:/data&lt;/code&gt;. Cela montera le volume docker &amp;quot;vol_data&amp;quot; précédement créé dans le point de montage &amp;quot;/data&amp;quot; du conteneur.&lt;/p&gt;
&lt;h4 id="avec-docker-compose"&gt;&lt;a href="#avec-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Avec docker compose
&lt;/h4&gt;&lt;p&gt;Pour utiliser ce volume docker dans un &lt;code&gt;docker-compose.yml&lt;/code&gt;, c'est comme un volume classique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vol_data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vol_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="portainer"&gt;&lt;a href="#portainer" class="header-anchor"&gt;&lt;/a&gt;Portainer
&lt;/h4&gt;&lt;p&gt;Si portainer est utilisé pour gérer l'hôte docker, le volume apparaitra dans la section &amp;quot;Volumes&amp;quot; de l'interface web. Si vous créez vos conteneurs, services, stacks swarm sur Portainer, vous pourrez l'utiliser sans problème.&lt;/p&gt;
&lt;p&gt;Toutefois, il est impossible de créer ce genre de volume via l'interface web de portainer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention cependant au nom du volume que vous lui donner lors de sa création.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Par exemple, je souhaite utiliser un volume docker (qui finalement sera de type bind) dans une stack swarm qui s'appelle &amp;quot;webapp&amp;quot;. Lors de la création du volume, je le nommerai &amp;quot;webapp_vol_data&amp;quot; et dans mon fichier yaml de la stack, j'appelerai ce volume uniquement &amp;quot;vol_data&amp;quot;.&lt;/p&gt;
&lt;p&gt;Si le volume utilisé dans un docker-compose n'est pas bien définit au niveau du nommage, un volume docker &amp;quot;standard&amp;quot; sera alors automatiquement créer à la place et celui-ci sera dans /var/lib/docker/volumes.&lt;/p&gt;
&lt;p&gt;Donc bien penser à vérifier que les données soient au bon endroit sur l'host. Surtout si les données doivent être stockées sur un volume réseau !&lt;/p&gt;</description></item><item><title>Debian : Optimisez votre distribution avec Tuned</title><link>https://slash-root.fr/debian-optimisez-votre-distribution-avec-tuned/</link><pubDate>Thu, 07 Sep 2023 00:56:00 +0200</pubDate><guid>https://slash-root.fr/debian-optimisez-votre-distribution-avec-tuned/</guid><description>&lt;img src="https://slash-root.fr/debian-optimisez-votre-distribution-avec-tuned/cover.png" alt="Featured image of post Debian : Optimisez votre distribution avec Tuned" /&gt;&lt;p&gt;Lorsque vous exécutez des applications exigeantes en termes de performances sur votre serveur Debian, il est essentiel de maximiser l'efficacité de votre matériel pour obtenir les meilleures performances possibles. L'utilitaire Tuned est un outil puissant qui vous permet de personnaliser les réglages du système en fonction de différents profils de performances, ce qui peut vous aider à optimiser votre serveur en fonction de vos besoins spécifiques.&lt;/p&gt;
&lt;h2 id="installation-de-tuned"&gt;&lt;a href="#installation-de-tuned" class="header-anchor"&gt;&lt;/a&gt;Installation de Tuned
&lt;/h2&gt;&lt;p&gt;Avant de commencer à utiliser Tuned, vous devez d'abord l'installer sur votre système Debian. Vous pouvez le faire en utilisant la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install tuned
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois l'installation terminée, vous pouvez activer et configurer Tuned.&lt;/p&gt;
&lt;h2 id="service"&gt;&lt;a href="#service" class="header-anchor"&gt;&lt;/a&gt;Service
&lt;/h2&gt;&lt;p&gt;Tuned déploie son propre service. Pour en consulter son status, exécutez la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl status tuned.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le service est activé par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● tuned.service - Dynamic System Tuning Daemon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Loaded: loaded &lt;span style="color:#f92672"&gt;(&lt;/span&gt;/lib/systemd/system/tuned.service; enabled; vendor preset: enabled&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Active: active &lt;span style="color:#f92672"&gt;(&lt;/span&gt;running&lt;span style="color:#f92672"&gt;)&lt;/span&gt; since Wed 2023-09-06 20:17:21 CEST; 8min ago
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Docs: man:tuned&lt;span style="color:#f92672"&gt;(&lt;/span&gt;8&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; man:tuned.conf&lt;span style="color:#f92672"&gt;(&lt;/span&gt;5&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; man:tuned-adm&lt;span style="color:#f92672"&gt;(&lt;/span&gt;8&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Main PID: &lt;span style="color:#ae81ff"&gt;12013&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;tuned&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Tasks: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;limit: 2276&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Memory: 15.9M
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPU: 1.202s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGroup: /system.slice/tuned.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─12013 /usr/bin/python3 -Es /usr/sbin/tuned -l -P
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sept. &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt; 20:17:21 debian systemd&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: Starting Dynamic System Tuning Daemon...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sept. &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt; 20:17:21 debian systemd&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: Started Dynamic System Tuning Daemon.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="activation-de-tuned"&gt;&lt;a href="#activation-de-tuned" class="header-anchor"&gt;&lt;/a&gt;Activation de Tuned
&lt;/h2&gt;&lt;p&gt;Tuned est conçu pour fonctionner avec des profils de performances prédéfinis. Vous pouvez les afficher en exécutant la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tuned-adm list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les profils disponibles seront :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Available profiles:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- atomic-guest - Optimize virtual guests based on the Atomic variant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- atomic-host - Optimize bare metal systems running the Atomic variant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- balanced - General non-specialized tuned profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- cpu-partitioning - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; CPU partitioning
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- default - Legacy default tuned profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- desktop - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the desktop use-case
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- desktop-powersave - Optmize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the desktop use-case with power saving
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- enterprise-storage - Legacy profile &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; RHEL6, &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; RHEL7, please use throughput-performance profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- hpc-compute - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; HPC compute workloads
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- intel-sst - Configure &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; Intel Speed Select Base Frequency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- laptop-ac-powersave - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; laptop with power savings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- laptop-battery-powersave - Optimize laptop profile with more aggressive power saving
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- latency-performance - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; deterministic performance at the cost of increased power consumption
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- mssql - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; MS SQL Server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- network-latency - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; deterministic performance at the cost of increased power consumption, focused on low latency network performance
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- network-throughput - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; streaming network throughput, generally only necessary on older CPUs or 40G+ networks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- optimize-serial-console - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; serial console use.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- oracle - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; Oracle RDBMS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- postgresql - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; PostgreSQL server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- powersave - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; low power consumption
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- realtime - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; realtime workloads
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- realtime-virtual-guest - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; realtime workloads running within a KVM guest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- realtime-virtual-host - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; KVM guests running realtime workloads
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- sap-hana - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; SAP HANA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- sap-netweaver - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; SAP NetWeaver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- server-powersave - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; server power savings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- spectrumscale-ece - Optimized &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; Spectrum Scale Erasure Code Edition Servers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- spindown-disk - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; power saving by spinning-down rotational disks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- virtual-guest - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; running inside a virtual guest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- virtual-host - Optimize &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; running KVM guests
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez ensuite activer le profil de performance de votre choix en utilisant la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tuned-adm profile &amp;lt;nom-du-profil&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remplacez &lt;code&gt;&amp;lt;nom-du-profil&amp;gt;&lt;/code&gt; par le nom du profil que vous souhaitez utiliser. Par exemple, si vous souhaitez activer le profil &amp;quot;throughput-performance&amp;quot;, exécutez la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tuned-adm profile throughput-performance
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez obtenir le profil recommandé par l'application avec la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tuned-adm recommend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-personnalisée"&gt;&lt;a href="#configuration-personnalis%c3%a9e" class="header-anchor"&gt;&lt;/a&gt;Configuration personnalisée
&lt;/h2&gt;&lt;p&gt;Tuned permet également la création de profils de performance personnalisés. Pour ce faire, vous devez éditer le fichier de configuration de Tuned. Le fichier de configuration principal est situé dans le répertoire &lt;code&gt;/etc/tuned/&lt;/code&gt;. Par exemple, pour créer un profil personnalisé nommé &amp;quot;mon-profil&amp;quot;, vous pouvez créer un fichier de configuration &lt;code&gt;/etc/tuned/mon-profil/tuned.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Voici un exemple de fichier de configuration Tuned pour un profil personnalisé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[main]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;include&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;throughput-performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[cpu]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;governor&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[sysctl]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;vm.dirty_ratio&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce fichier de configuration active d'abord le profil &amp;quot;throughput-performance&amp;quot; en utilisant l'instruction &lt;code&gt;include&lt;/code&gt;. Ensuite, il définit le gouverneur du CPU sur &amp;quot;performance&amp;quot; pour maximiser les performances du processeur. Enfin, il ajuste un paramètre de sysctl pour contrôler la gestion de la mémoire.&lt;/p&gt;
&lt;p&gt;Après avoir créé votre profil personnalisé, vous pouvez l'activer de la même manière que les profils prédéfinis à l'aide de &lt;code&gt;tuned-adm&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;L'utilitaire Tuned est un outil précieux pour optimiser les performances de votre serveur Debian en fonction de vos besoins spécifiques. En utilisant les profils prédéfinis ou en créant des profils personnalisés, vous pouvez tirer le meilleur parti de votre matériel tout en garantissant une utilisation efficace des ressources système.&lt;/p&gt;
&lt;p&gt;N'hésitez pas à explorer davantage les possibilités de Tuned et à l'adapter à vos besoins pour obtenir des performances optimales sur votre serveur Debian.&lt;/p&gt;</description></item><item><title>Watch Tower : Auto update docker images</title><link>https://slash-root.fr/docker-update-auto-images/</link><pubDate>Tue, 11 Apr 2023 08:04:46 +0200</pubDate><guid>https://slash-root.fr/docker-update-auto-images/</guid><description>&lt;img src="https://slash-root.fr/docker-update-auto-images/cover.png" alt="Featured image of post Watch Tower : Auto update docker images" /&gt;&lt;h2 id="présentation"&gt;&lt;a href="#pr%c3%a9sentation" class="header-anchor"&gt;&lt;/a&gt;Présentation
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Watch Tower&lt;/strong&gt; permet de mettre à jour les images docker utilisées de façon automatique. Il va permettre de télécharger la nouvelle image, supprimer proprement le conteneur l'utilisant et le relancer avec les mêmes options. Par défaut, cela utilise le Docker Hub, mais il est possible de paramétrer un registry privé en spécifiant des credentials.&lt;/p&gt;
&lt;p&gt;La documentation complète peut être accessible ici : &lt;a href="https://containrrr.dev/watchtower/"&gt;https://containrrr.dev/watchtower/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;p&gt;L'installation est très simple car &lt;strong&gt;Watch Tower&lt;/strong&gt; va tourner lui-même en conteneur.&lt;/p&gt;
&lt;p&gt;Je vais utiliser un fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; pour exécuter l'application :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;watchtower&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;containrrr/watchtower:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;watchtower&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: --&lt;span style="color:#ae81ff"&gt;schedule &amp;#34;0 0 4 * * *&amp;#34; --cleanup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;docker.sock&lt;/strong&gt; : Indispensable pour avoir accès au socket docker de l'hôte dans le conteneur afin de surveiller tous les autres conteneurs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schedule&lt;/strong&gt; : Permet de préciser quand vérifier les mises à jour sous un format à 6 colonnes (contrairement à crontab). La 1ère colonne correspond aux secondes. Ici, 4h tous les jours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cleanup&lt;/strong&gt; : Permet de supprimer les anciennes images docker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par défaut toutes les images de tous les conteneurs sont surveillées. Il est possible d'affiner ce comportement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;D'autres options sont disponibles (Se référer à la documentation précisée en introduction).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="exécution"&gt;&lt;a href="#ex%c3%a9cution" class="header-anchor"&gt;&lt;/a&gt;Exécution
&lt;/h2&gt;&lt;p&gt;Lancer simplement le &lt;code&gt;docker-compose.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Network : Désactiver l’IPv6 sur Debian</title><link>https://slash-root.fr/network-desactiver-lipv6-sur-debian/</link><pubDate>Fri, 03 Feb 2023 14:40:24 +0100</pubDate><guid>https://slash-root.fr/network-desactiver-lipv6-sur-debian/</guid><description>&lt;img src="https://slash-root.fr/network-desactiver-lipv6-sur-debian/cover.jpg" alt="Featured image of post Network : Désactiver l’IPv6 sur Debian" /&gt;&lt;h2 id="non-persistance"&gt;&lt;a href="#non-persistance" class="header-anchor"&gt;&lt;/a&gt;Non-Persistance
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -w net.ipv6.conf.all.disable_ipv6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -w net.ipv6.conf.default.disable_ipv6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -w net.ipv6.conf.lo.disable_ipv6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -w net.ipv6.conf.all.autoconf&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -w net.ipv6.conf.default.autoconf&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="persistance"&gt;&lt;a href="#persistance" class="header-anchor"&gt;&lt;/a&gt;Persistance
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Dans &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv6.conf.all.disable_ipv6&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv6.conf.default.disable_ipv6&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv6.conf.lo.disable_ipv6&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv6.conf.all.autoconf&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv6.conf.default.autoconf&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Exécuter la commande suivante pour la prise en compte :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Scripting bash : Couleurs / Styles texte</title><link>https://slash-root.fr/scripting-bash-couleurs-styles-texte/</link><pubDate>Tue, 06 Dec 2022 18:13:55 +0100</pubDate><guid>https://slash-root.fr/scripting-bash-couleurs-styles-texte/</guid><description>&lt;img src="https://slash-root.fr/scripting-bash-couleurs-styles-texte/cover.jpg" alt="Featured image of post Scripting bash : Couleurs / Styles texte" /&gt;&lt;h2 id="couleurs"&gt;&lt;a href="#couleurs" class="header-anchor"&gt;&lt;/a&gt;Couleurs
&lt;/h2&gt;&lt;h3 id="variables"&gt;&lt;a href="#variables" class="header-anchor"&gt;&lt;/a&gt;Variables
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;neutre&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;noir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;30m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gris&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;30m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rougefonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rose&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vertfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vertclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;orange&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jaune&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bleufonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;34m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bleuclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;34m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;violetfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;35m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;violetclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;35m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cyanfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;36m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cyanclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;36m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grisclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;37m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blanc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;37m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="utilisation"&gt;&lt;a href="#utilisation" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;rougefonce&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Hello&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;neutre&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;jaune&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;World&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;neutre&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;-e&lt;/strong&gt; : enable interpretation of backslash escapes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="styles"&gt;&lt;a href="#styles" class="header-anchor"&gt;&lt;/a&gt;Styles
&lt;/h2&gt;&lt;h3 id="variables-1"&gt;&lt;a href="#variables-1" class="header-anchor"&gt;&lt;/a&gt;Variables
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;normal&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gras&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[1m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[2m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;italic&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[3m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;souligne&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[4m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flash&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[5m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inverse&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[7m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;invisible&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[8m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="utilisation-1"&gt;&lt;a href="#utilisation-1" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;gras&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Hello&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;normal&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;flash&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;World&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;normal&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;-e&lt;/strong&gt; : enable interpretation of backslash escapes&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>OPNsense : Déploiement d’une instance sur OVHcloud [Partie 2/2]</title><link>https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-2-2/</link><pubDate>Fri, 18 Nov 2022 15:17:42 +0100</pubDate><guid>https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-2-2/</guid><description>&lt;img src="https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-2-2/cover.png" alt="Featured image of post OPNsense : Déploiement d’une instance sur OVHcloud [Partie 2/2]" /&gt;&lt;p&gt;Cet article fait suite à mon précédent &lt;a href="https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-1-2/" title="**OPNsense : Déploiement d&amp;#039;une instance sur OVHcloud [Partie 1/2]**"&gt;&lt;strong&gt;OPNsense : Déploiement d'une instance sur OVHcloud [Partie 1/2]&lt;/strong&gt;&lt;/a&gt; afin d'avoir un routeur opensource exploitable.&lt;/p&gt;
&lt;h2 id="configuration-ip"&gt;&lt;a href="#configuration-ip" class="header-anchor"&gt;&lt;/a&gt;Configuration IP
&lt;/h2&gt;&lt;h3 id="1er-démarrage"&gt;&lt;a href="#1er-d%c3%a9marrage" class="header-anchor"&gt;&lt;/a&gt;1er démarrage
&lt;/h3&gt;&lt;p&gt;Lors du 1er démarrage de l'instance OPNsense, un écran similaire à celui-ci est affiché :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111601.png" alt="image-20221116152115304" /&gt;&lt;/p&gt;
&lt;p&gt;L'adressage IP des différentes interfaces réseaux est à paramétrer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention à la dénomination de LAN et de WAN. A ce stade, l'attribution du LAN et du WAN fait par l'installateur est incorrect. En réalite :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vtnet0&lt;/code&gt; = Adresse IP publique soit le &lt;code&gt;WAN&lt;/code&gt; pour l'instance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vtnet1&lt;/code&gt; = Adresse IP du vRack soit le &lt;code&gt;LAN&lt;/code&gt; pour l'instance&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id="se-connecter"&gt;&lt;a href="#se-connecter" class="header-anchor"&gt;&lt;/a&gt;Se connecter
&lt;/h3&gt;&lt;p&gt;Pour réaliser la configuration IP nécessaire, il faut tout d'abord se connecter dans la console.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login : root&lt;/li&gt;
&lt;li&gt;Password : opnsense&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le menu d'administration de la console est maintenant disponible :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111602.png" alt="image-20221116153145030" /&gt;&lt;/p&gt;
&lt;h3 id="assignation-des-interfaces"&gt;&lt;a href="#assignation-des-interfaces" class="header-anchor"&gt;&lt;/a&gt;Assignation des interfaces
&lt;/h3&gt;&lt;p&gt;Comme évoqué précédemment, l'attribution des interfaces faites par l'installeur est erronée. Il faut donc refaire l'assignation des 2 interfaces.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faire le choix 1 : &lt;strong&gt;Assign interfaces&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Do you want to configure LAGGS now ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do you want to configure VLANs now ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the WAN interface name : &lt;strong&gt;vtnet0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the LAN interface name : &lt;strong&gt;vtnet1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the Optional interface 1 name : &lt;strong&gt;Press Enter&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le récapitulatif suivant doit être affiché :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The interfaces will be assigned as follows :
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WAN -&amp;gt; vtnet0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAN -&amp;gt; vtnet1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Appliquer les modifications
&lt;ul&gt;
&lt;li&gt;Do you want to proceed ? : &lt;strong&gt;Y&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A présent, les interfaces sont correctement assignées. L'adresse IP publique est récupérée par le DHCP d'OVH sur l'interface WAN.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111603.png" alt="image-20221116161807533" /&gt;&lt;/p&gt;
&lt;h3 id="paramétrage-ip"&gt;&lt;a href="#param%c3%a9trage-ip" class="header-anchor"&gt;&lt;/a&gt;Paramétrage IP
&lt;/h3&gt;&lt;p&gt;Avant d'aller plus loin, il va falloir récupérer quelques informations sur l'instance :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'adresse IP publique et sa passerelle : Ces informations sont disponibles dans le tableau de bord de l'instance.&lt;/li&gt;
&lt;li&gt;L'adresse IP sur le vRack : Cette information est disponible dans la liste des instances (colonne IP privée).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention au masque de sous-réseau :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP publique = Masque de sous-réseau en 32 bits&lt;/li&gt;
&lt;li&gt;IP privée vRack = Masque de sous-réseau en 16 bits&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Puis passer au paramétrage des adresses IP sur OPNsense dans la console VNC :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faire le choix 2 : &lt;strong&gt;Set interface IP address&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Available interfaces :
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; - LAN &lt;span style="color:#f92672"&gt;(&lt;/span&gt;vtnet1 - static, track6&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; - WAN &lt;span style="color:#f92672"&gt;(&lt;/span&gt;vtnet0 - dhcp, dhcp6&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Paramétrer d'abord l'interface WAN
&lt;ul&gt;
&lt;li&gt;Enter the number of the interface to configure : &lt;strong&gt;2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Configure IPv4 address WAN interface via DHCP ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new WAN IPv4 address : &lt;strong&gt;Adresse IP publique&lt;/strong&gt; relevée précédement&lt;/li&gt;
&lt;li&gt;Enter the new WAN IPv4 subnet bit count : &lt;strong&gt;32&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new WAN IPv4 upstream gateway address : &lt;strong&gt;Adresse passerelle / gateway&lt;/strong&gt; relevé précédement&lt;/li&gt;
&lt;li&gt;Do you want to use the gateway as the IPv4 name server, too ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the IPv4 name server : &lt;strong&gt;213.186.33.99&lt;/strong&gt; (DNS OVH)&lt;/li&gt;
&lt;li&gt;Configure IPv6 address WAN interface via DHCP6 ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new WAN IPv6 address : &lt;strong&gt;Press Enter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do you want to change the web GUI protocol from HTTPS to HTTP ? : &lt;strong&gt;N&lt;/strong&gt; (Un certificat SSL Let's Encrypt sera appliqué plus bas)&lt;/li&gt;
&lt;li&gt;Do you want to generate a new self-signed web GUI certificate ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Restore web GUI access defaults ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'interface WAN est paramétrée.&lt;/p&gt;
&lt;p&gt;Maintenant, passer au paramétrage de l'interface LAN:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refaire le choix 2 : &lt;strong&gt;Set interface IP address&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Enter the number of the interface to configure : &lt;strong&gt;1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Configure IPv4 address LAN interface via DHCP ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new LAN IPv4 address : &lt;strong&gt;Adresse IP privée&lt;/strong&gt; du vRack relevée précédement&lt;/li&gt;
&lt;li&gt;Enter the new LAN IPv4 subnet bit count : &lt;strong&gt;16&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new LAN IPv4 upstream gateway address : &lt;strong&gt;Press Enter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Configure IPv6 address LAN interface via DHCP6 ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the new LAN IPv6 address : &lt;strong&gt;Press Enter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do you want to enable the DHCP server on LAN ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do you want to change the web GUI protocol from HTTPS to HTTP ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do you want to generate a new self-signed web GUI certificate ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Restore web GUI access defaults ? : &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'interface LAN est paramétrée.&lt;/p&gt;
&lt;h2 id="interface-web"&gt;&lt;a href="#interface-web" class="header-anchor"&gt;&lt;/a&gt;Interface web
&lt;/h2&gt;&lt;h3 id="1ère-connexion"&gt;&lt;a href="#1%c3%a8re-connexion" class="header-anchor"&gt;&lt;/a&gt;1ère connexion
&lt;/h3&gt;&lt;p&gt;Par défaut, pour se connecter à l'interface web d'administration de la solution OPNsense, il faut s'y connecter à travers l'interface LAN.&lt;/p&gt;
&lt;p&gt;Dans le cas présent, il n'y a pas d'autre machine présente sur ce contexte réseau. Il faut donc s'y connecter à travers l'interface WAN.&lt;/p&gt;
&lt;p&gt;Pour se faire, dans la console VNC de l'instance :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faire le choix 8 : &lt;strong&gt;Shell&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Désactiver le pare-feu :&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pfctl -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Attention, à chaque rechargement de la configuration d'OPNsense, le pare-feu sera réactivé. Une règle autorisant l'administration à distance par le WAN sera définie plus bas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est maintenant possible de se connecter à l'interface web d'administration d'OPNsense à travers l'interface WAN.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre sur l'adresse &lt;a href="https://IP_PUBLIC"&gt;https://IP_PUBLIC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Accepter le certificat auto-signé&lt;/li&gt;
&lt;li&gt;Renseigner les credentials
&lt;ul&gt;
&lt;li&gt;Username : &lt;strong&gt;root&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Password : &lt;strong&gt;opnsense&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un assistant de configuration est proposé lors de la 1ère connexion, celui-ci peut être by-passé en cliquant sur le logo OPNsense en haut à gauche.&lt;/p&gt;
&lt;h3 id="filtrage"&gt;&lt;a href="#filtrage" class="header-anchor"&gt;&lt;/a&gt;Filtrage
&lt;/h3&gt;&lt;p&gt;Pour accéder à la page d'administration d'OPNsense, le pare-feu a été désactivé pour effectuer la 1ère connexion.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rappel : A chaque rechargement de configuration, le pare-feu sera réactivé automatiquement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Idéalement, il faut définir une seule adresse IP (ou plusieurs) qui sera autorisée à y accéder.&lt;/p&gt;
&lt;p&gt;Tout d'abord, créer un alias afin de mieux identifier l'hôte qui sera autorisé à se connecter à l'interface web d'administration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Firewall&lt;/strong&gt; (1), &lt;strong&gt;Aliases&lt;/strong&gt; (2)&lt;/li&gt;
&lt;li&gt;Ajouter un nouvel alias (3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111604.png" alt="image-20221117094409367" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple d'alias pour une adresse IP donnée. Bien penser à valider le &lt;code&gt;Content&lt;/code&gt; en appuyant sur &lt;strong&gt;Enter&lt;/strong&gt;, puis &lt;strong&gt;Save&lt;/strong&gt; en bas à droite :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111605.png" alt="image-20221117095214277" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ne pas valider tout de suite les modifications avec le bouton &lt;strong&gt;Apply&lt;/strong&gt; figurant en bas sur la page des &lt;strong&gt;Aliases&lt;/strong&gt;. Sinon, le pare-feu se réactivera et la connexion sera perdue. Si cela se produit, revenir dans la console VNC de l'instance et refaire la commande &lt;code&gt;pfcl -d&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ensuite, ajouter une règle sur l'interface WAN du pare-feu.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Firewall&lt;/strong&gt; (1), &lt;strong&gt;Rules&lt;/strong&gt; (2), &lt;strong&gt;WAN&lt;/strong&gt; (3)&lt;/li&gt;
&lt;li&gt;Ajouter une nouvelle règle (4)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111606.png" alt="image-20221117095952062" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La partie &lt;strong&gt;Source&lt;/strong&gt; de la règle :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111607.png" alt="image-20221117100419056" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La partie &lt;strong&gt;Destination&lt;/strong&gt; de la règle :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111608.png" alt="image-20221117100630410" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enregistrer avec le bouton &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Valider toutes les modifications de configuration en cliquant sur &lt;strong&gt;Apply changes&lt;/strong&gt; en haut à droite de la page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'alias créé ainsi que la règle ajoutée dans l'interface WAN du pare-feu vont être appliqué. Le pare-feu sera également réactivé automatiquement.&lt;/p&gt;
&lt;p&gt;Pour être sûr et certain que le pare-feu soit bien actif :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans la console VNC de l'instance et exécuter la commande :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pfctl -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le shell doit renvoyer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pfctl: pf already enabled
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mot-de-passe-root"&gt;&lt;a href="#mot-de-passe-root" class="header-anchor"&gt;&lt;/a&gt;Mot de passe root
&lt;/h3&gt;&lt;p&gt;Maintenant que l'accès externe à l'interface web d'administration est filtré, il est important de changer le mot de passe &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Lobby&lt;/strong&gt; (1), &lt;strong&gt;Password&lt;/strong&gt; (2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111609.png" alt="image-20221117102407840" /&gt;&lt;/p&gt;
&lt;p&gt;La modification de ce mot passe entraine également la modification du mot de passe dans la console VNC et/ou par SSH si cet accès est activé.&lt;/p&gt;
&lt;h3 id="hostname-timezone"&gt;&lt;a href="#hostname-timezone" class="header-anchor"&gt;&lt;/a&gt;Hostname, Timezone&amp;hellip;
&lt;/h3&gt;&lt;p&gt;Il peut être intéressant de modifier le nom d'hôte, le domaine, ou bien la timezone d'OPNsense.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Settings&lt;/strong&gt; (2), &lt;strong&gt;General&lt;/strong&gt; (3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111610.png" alt="image-20221117110546934" /&gt;&lt;/p&gt;
&lt;h2 id="sécurité"&gt;&lt;a href="#s%c3%a9curit%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Sécurité
&lt;/h2&gt;&lt;p&gt;Sujet très vaste !&lt;/p&gt;
&lt;p&gt;Je vais m'attarder sur 2 points principaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La mise à jour d'OPNsense&lt;/li&gt;
&lt;li&gt;La mise en place d'un certificat SSL avec Let's Encrypt&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mise-à-jour"&gt;&lt;a href="#mise-%c3%a0-jour" class="header-anchor"&gt;&lt;/a&gt;Mise à jour
&lt;/h3&gt;&lt;p&gt;Il est important de mettre régulièrement à jour la solution.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Firmware&lt;/strong&gt; (2), &lt;strong&gt;Status&lt;/strong&gt; (3)&lt;/li&gt;
&lt;li&gt;Puis &lt;strong&gt;Check for updates&lt;/strong&gt; (4)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111611.png" alt="image-20221117111519117" /&gt;&lt;/p&gt;
&lt;p&gt;Si des mises à jour sont disponibles, la liste des packages concernés sera affichée dans l'onglet &lt;strong&gt;Updates&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En bas de cette page, un bouton &lt;strong&gt;Update&lt;/strong&gt; sera disponible. Il sera également indiqué si un redémarrage d'OPNsense est requis.&lt;/p&gt;
&lt;h3 id="certificat-ssl-lets-encrypt"&gt;&lt;a href="#certificat-ssl-lets-encrypt" class="header-anchor"&gt;&lt;/a&gt;Certificat SSL Let&amp;rsquo;s Encrypt
&lt;/h3&gt;&lt;h4 id="installation-du-client"&gt;&lt;a href="#installation-du-client" class="header-anchor"&gt;&lt;/a&gt;Installation du client
&lt;/h4&gt;&lt;p&gt;La 1ère étape à réaliser est l'installation du client &lt;code&gt;acme&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Firmware&lt;/strong&gt; (2), &lt;strong&gt;Plugins&lt;/strong&gt; (3)&lt;/li&gt;
&lt;li&gt;Installer le client acme (4)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111612.png" alt="image-20221117113041918" /&gt;&lt;/p&gt;
&lt;h4 id="activation-du-plugin"&gt;&lt;a href="#activation-du-plugin" class="header-anchor"&gt;&lt;/a&gt;Activation du plugin
&lt;/h4&gt;&lt;p&gt;Une fois ce plugin installé, forcer un rafraichissement de l'interface web (CTRL+SHiFT+R) pour avoir le service &lt;strong&gt;ACME Client&lt;/strong&gt; de disponible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Services&lt;/strong&gt; (1), &lt;strong&gt;ACME Client&lt;/strong&gt; (2), &lt;strong&gt;Settings&lt;/strong&gt; (3)&lt;/li&gt;
&lt;li&gt;Activer le plugin (4)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111613.png" alt="image-20221117114033923" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valider avec le bouton &lt;strong&gt;Apply&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une tâche cron est générée afin de renouveler automatiquement le certificat. Celle-ci est définie dans l'onglet &lt;strong&gt;Update Schedule&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="création-du-compte-lets-encrypt"&gt;&lt;a href="#cr%c3%a9ation-du-compte-lets-encrypt" class="header-anchor"&gt;&lt;/a&gt;Création du compte Let&amp;rsquo;s Encrypt
&lt;/h4&gt;&lt;p&gt;Ensuite, un compte doit être créé et enregistré pour la génération du certificat chez Let's Encrypt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Accounts&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;Créer un compte (2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111614.png" alt="image-20221117114800382" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compléter les champs requis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111615.png" alt="image-20221117115032672" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valider avec le bouton &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enregistrer le compte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111616.png" alt="image-20221117115229266" /&gt;&lt;/p&gt;
&lt;p&gt;Le status du compte passe en &lt;strong&gt;OK (registred)&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="enregistrement-dns"&gt;&lt;a href="#enregistrement-dns" class="header-anchor"&gt;&lt;/a&gt;Enregistrement DNS
&lt;/h4&gt;&lt;p&gt;Avant de passer à la suite, il est impératif de créer un enregistrement de type A dans la zone DNS publique adéquate pointant vers l'adresse IP publique d'OPNsense.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;opnsense-demo.example.com. IN A xxx.xxx.xxx.237
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;xxx.xxx.xxx.237 = IP publique de l'interface WAN d'OPNsense&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bien vérifier que cet enregistrement a été répercuté sur les serveurs DNS de Google (Let's Encrypt s'appuie dessus).&lt;/p&gt;
&lt;p&gt;Dans votre terminal GNU/Linux :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dig opnsense-demo.example.com @8.8.8.8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il est également est possible de vérifier l'enregistrement à cette adresse : &lt;a href="https://dns.google"&gt;https://dns.google&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="paramétrage-du-challenge"&gt;&lt;a href="#param%c3%a9trage-du-challenge" class="header-anchor"&gt;&lt;/a&gt;Paramétrage du challenge
&lt;/h4&gt;&lt;p&gt;Une fois cet enregistrement fait et vérifié, paramétrer un type de challenge :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Challenge Types&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;Créer un nouveau type de challenge (2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111617.png" alt="image-20221117120932240" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choisir un challenge de type &lt;strong&gt;HTTP-01&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111618.png" alt="image-20221117131431018" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans le champ &lt;strong&gt;IP Addresses&lt;/strong&gt; bien valider l'adresse IP publique de l'interface WAN en appuyant sur &lt;strong&gt;Enter&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Valider avec le bouton &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="automatisation"&gt;&lt;a href="#automatisation" class="header-anchor"&gt;&lt;/a&gt;Automatisation
&lt;/h4&gt;&lt;p&gt;Avant de passer à la génération du certificat, il est recommandé d'ajouter une tâche d'automatisation. Celle-ci sera effectuée à chaque fois que le certificat sera renouvelé.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Automations&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;Créer une tâche d'automatisation (2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111620.png" alt="image-20221117132141537" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner la tâche de redémarrage de la Web UI d'OPNsense&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111621.png" alt="image-20221117132445945" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cette partie d'automatisation est optionelle mais recommandée.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="génération-du-certificat"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-du-certificat" class="header-anchor"&gt;&lt;/a&gt;Génération du certificat
&lt;/h4&gt;&lt;p&gt;Maintenant, un certificat peut être généré :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Certificates&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;Créer un nouveau certificat (2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111619.png" alt="image-20221117131804782" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans le champ &lt;strong&gt;Common Name&lt;/strong&gt;, bien renseigner l'URL d'accès qui permettra d'accéder à l'interface web d'administration d'OPNsense en correspondance avec l'enregistrement de type A faites dans la zone DNS au préalable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111622.png" alt="image-20221117133011468" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bien spécifier la tâche d'automatisation dans le champ &lt;strong&gt;Automations&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Valider avec le bouton &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Générer le certificat avec le bouton &lt;strong&gt;Issue/Renew All Certificates&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Vérifier l'ajout de l'autorité de certification :
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Trust&lt;/strong&gt; (2), &lt;strong&gt;Authorities&lt;/strong&gt; (3)&lt;/li&gt;
&lt;li&gt;L'authorité de certification Let's Encrypt doit être présente&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111623.png" alt="image-20221117134012138" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier la présence du certificat préalablement généré :
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;Certificates&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;Le certificat préalablement généré doit être présent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111624.png" alt="image-20221117134232914" /&gt;&lt;/p&gt;
&lt;h4 id="application-du-certificat"&gt;&lt;a href="#application-du-certificat" class="header-anchor"&gt;&lt;/a&gt;Application du certificat
&lt;/h4&gt;&lt;p&gt;A ce stade, ce nouveau certificat Let's Encrypt peut être appliqué pour la connexion à l'interface d'administration d'OPNsense (en lieu et place du certificat auto-signé).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Settings&lt;/strong&gt; (2), &lt;strong&gt;Administration&lt;/strong&gt; (3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22111625.png" alt="image-20221117134906644" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je recommande de modifier le port d'administration HTTPS et d'adapter la règle de filtrage (vu dans le chapitre &lt;strong&gt;Interface web / Filtrage&lt;/strong&gt; de cet article).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Valider avec le bouton &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voilà !&lt;/p&gt;
&lt;p&gt;Il est désormais possible d'accéder de façon sécurisée à l'admimistration d'un OPNsense hébergé chez OVHcloud avec un certificat SSL reconnu.&lt;/p&gt;
&lt;p&gt;En suivant l'exemple donné ici, l'accès se fera sur l'URL : &lt;a href="https://opnsense-demo.example.com"&gt;https://opnsense-demo.example.com&lt;/a&gt; (Adresse fictive pour l'article !).&lt;/p&gt;</description></item><item><title>Rocket.Chat : Installation standalone</title><link>https://slash-root.fr/rocket-chat-installation-standalone/</link><pubDate>Tue, 04 Oct 2022 18:08:56 +0200</pubDate><guid>https://slash-root.fr/rocket-chat-installation-standalone/</guid><description>&lt;img src="https://slash-root.fr/rocket-chat-installation-standalone/cover.png" alt="Featured image of post Rocket.Chat : Installation standalone" /&gt;&lt;blockquote&gt;
&lt;p&gt;Installation d'un Rocket.Chat en mode standalone sur Debian 11.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Très important ! MongoDB 5.0 demande que le jeu d'instruction AVX soit géré par le CPU du serveur.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier que AVX soit traité par le CPU :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /proc/cpuinfo | grep avx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si rien ne s'affiche, cela ne sert à rien d'aller plus loin.&lt;/p&gt;
&lt;p&gt;Pour mes essais, j'utilise un serveur Proxmox pour la virtualisation. J'ai dû passer le CPU de la machine virtuelle sur &lt;code&gt;host&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="mongodb-community-edition"&gt;&lt;a href="#mongodb-community-edition" class="header-anchor"&gt;&lt;/a&gt;MongoDB Community Edition
&lt;/h2&gt;&lt;h3 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h3&gt;&lt;p&gt;Le paquet &lt;code&gt;mongodb&lt;/code&gt; fournit par les dépôts Debian n'est pas maintenue par MongoDB Inc. Celui-ci rentre en conflit avec le paquet officiel &lt;code&gt;mongodb-org&lt;/code&gt;. Si le paquet &lt;code&gt;mongodb&lt;/code&gt; provenant des dépôts Debian est installé, il faudra au préalable le désinstaller.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installer les pré-requis :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install dirmngr gnupg apt-transport-https software-properties-common ca-certificates curl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Importer la clef publique PGP nécessaire :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo wget -O- https://www.mongodb.org/static/pgp/server-5.0.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mongodb.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter le dépôt de MongoDB Inc. pour Debian 11 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;deb [signed-by=/usr/share/keyrings/mongodb.gpg] http://repo.mongodb.org/apt/debian buster/mongodb-org/5.0 main&amp;#39;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Actuellement, Rocket.Chat demande une version 5.0 de MongoDB. Il est indiqué Buster mais c'est bon aussi pour Bullseye.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Mettre à jour le cache des paquets :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer la version 5.0.13 de MongoDB :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install mongodb-org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Optionnel) Afin de prévenir une mise à jour non désirée de MongoDB par &lt;code&gt;apt&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-org hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-org-database hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-org-server hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-mongosh hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-org-mongos hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb-org-tools hold&amp;#34;&lt;/span&gt; | sudo dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Editer le fichier de configuration &lt;code&gt;/etc/mongod.conf&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/mongod.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Attention, c'est un format YAML.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Définir le type de stockage sur &lt;code&gt;wiredTiger&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;storage&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;engine&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wiredTiger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activer et nommer la réplication :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;replication&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;replSetName&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rs01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le fichier de configuration doit ressembler à quelques choses de similaire à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;storage&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dbPath&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/var/lib/mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;journal&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;engine&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wiredTiger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;systemLog&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;destination&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;logAppend&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/var/log/mongodb/mongod.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;net&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;port&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;bindIp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;processManagement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;fork&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;timeZoneInfo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/usr/share/zoneinfo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;replication&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;replSetName&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rs01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="exécution"&gt;&lt;a href="#ex%c3%a9cution" class="header-anchor"&gt;&lt;/a&gt;Exécution
&lt;/h3&gt;&lt;p&gt;Par défaut, MongoDB stocke les données dans &lt;code&gt;/var/lib/mongodb&lt;/code&gt; et les logs dans &lt;code&gt;/var/log/mongodb&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Démarrer MongoDB :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start mongod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si une erreur indique que &lt;code&gt;mongod.service&lt;/code&gt; est introuvable :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Vérifier que le service est bien démarré :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl status mongod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Activer le démarrage du service au boot du système :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable mongod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Créer le replicaset :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mongo --eval &lt;span style="color:#e6db74"&gt;&amp;#34;printjson(rs.initiate())&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nodejs"&gt;&lt;a href="#nodejs" class="header-anchor"&gt;&lt;/a&gt;Node.js
&lt;/h2&gt;&lt;h3 id="installation-1"&gt;&lt;a href="#installation-1" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Passer root :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Récupérer et exécuter le script suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer Node.js v14 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install nodejs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Actuellement, Rocket.Chat demande une version 14 pour Node.js.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Se déconnecter de root.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rocketchat"&gt;&lt;a href="#rocketchat" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat
&lt;/h2&gt;&lt;h3 id="installation-2"&gt;&lt;a href="#installation-2" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Mettre à jour le système :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer les pré-requis :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install curl build-essential graphicsmagick
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Télécharger la dernière version de Rocket.Chat :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Extraire l'archive :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar xzf /tmp/rocket.chat.tgz -C /tmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer toutes les dépendances :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;cd /tmp/bundle/programs/server; npm i&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Déplacer le bundle pour Rocket.Chat dans &lt;code&gt;opt&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mv /tmp/bundle /opt/Rocket.Chat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-1"&gt;&lt;a href="#configuration-1" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ajout de l'utilisateur &lt;code&gt;rocketchat&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo useradd -M rocketchat &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo usermod -L rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Modification des permissions sur le dossier de Rocket.Chat :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R rocketchat:rocketchat /opt/Rocket.Chat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Sauvegarde le chemin vers le binaire de Node.js dans une variable :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NODE_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;which node&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Créer le fichier du service systemd :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF |sudo tee -a /lib/systemd/system/rocketchat.service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Description=The Rocket.Chat server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;After=network.target remote-fs.target nss-lookup.target nginx.service mongod.service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ExecStart=$NODE_PATH /opt/Rocket.Chat/main.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;StandardOutput=syslog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;StandardError=syslog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;SyslogIdentifier=rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;User=rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Editer le service &lt;code&gt;rocketchat&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl edit rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Définir les variables d'environnement :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ROOT_URL=http://localhost:3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;PORT=3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Sauvegarder et enregistrer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="exécution-1"&gt;&lt;a href="#ex%c3%a9cution-1" class="header-anchor"&gt;&lt;/a&gt;Exécution
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Activer le démarrage du service au boot du système :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Démarrer le service &lt;code&gt;rocketchat&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="accès-web"&gt;&lt;a href="#acc%c3%a8s-web" class="header-anchor"&gt;&lt;/a&gt;Accès Web
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ouvrir un navigateur web.&lt;/li&gt;
&lt;li&gt;Accéder à l'adresse du service Rocket.Chat définit avec la variable d'environnement &lt;code&gt;ROOT_URL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Suivre les instructions pour définir un compte admin et les informations du serveur Rocket.Chat.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nextcloud : Add-in Outlook pour l’envoi de gros fichiers par mail sans effort</title><link>https://slash-root.fr/nextcloud-add-in-outlook-pour-lenvoi-de-gros-fichiers-par-mail-sans-effort/</link><pubDate>Thu, 29 Sep 2022 08:00:31 +0200</pubDate><guid>https://slash-root.fr/nextcloud-add-in-outlook-pour-lenvoi-de-gros-fichiers-par-mail-sans-effort/</guid><description>&lt;img src="https://slash-root.fr/nextcloud-add-in-outlook-pour-lenvoi-de-gros-fichiers-par-mail-sans-effort/cover.png" alt="Featured image of post Nextcloud : Add-in Outlook pour l’envoi de gros fichiers par mail sans effort" /&gt;&lt;h2 id="presentation"&gt;&lt;a href="#presentation" class="header-anchor"&gt;&lt;/a&gt;Presentation
&lt;/h2&gt;&lt;p&gt;Il est possible d'installer un add-in au client lourd Microsoft Office 2019 pour y intégrer de nouvelles fonctionnalités avec Nextcloud.&lt;/p&gt;
&lt;p&gt;Cet add-in permet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D'upload automatiquement les fichiers vers Nextcloud et de générer un lien pour les destinataires dans le mail. Cela permet de pouvoir envoyer de très gros fichiers par mail sans les placer en pièce jointe.&lt;/li&gt;
&lt;li&gt;De créer et partager un espace publique avec les destinataires pour qu'ils puissent y uploader des fichiers au lieu de les envoyer par pièce jointe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sur ces 2 fonctionnalités, il est possible de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Définir une date d'expiration du lien.&lt;/li&gt;
&lt;li&gt;Protéger les liens publiques par mot de passe.&lt;/li&gt;
&lt;li&gt;Regrouper un ensemble de fichiers pour un même lien.&lt;/li&gt;
&lt;li&gt;Personnaliser les messages qui seront inclus automatiquement dans le mail.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pre-requis"&gt;&lt;a href="#pre-requis" class="header-anchor"&gt;&lt;/a&gt;Pre-requis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Un compte sur un serveur Nextcloud (Testé avec un Nextcloud 24.0.5).&lt;/li&gt;
&lt;li&gt;Un client lourd Outlook 2019 sous Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="add-in"&gt;&lt;a href="#add-in" class="header-anchor"&gt;&lt;/a&gt;Add-in
&lt;/h2&gt;&lt;h3 id="information"&gt;&lt;a href="#information" class="header-anchor"&gt;&lt;/a&gt;Information
&lt;/h3&gt;&lt;p&gt;Il existe plusieurs versions de cet add-in :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Basic&lt;/li&gt;
&lt;li&gt;Professional&lt;/li&gt;
&lt;li&gt;Premium&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Détails des différentes versions : &lt;a href="https://nextcloud.com/outlook/"&gt;https://nextcloud.com/outlook/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ici, je vais utiliser la version Free. Cette version est limité à 50 utilisateurs.&lt;/p&gt;
&lt;h3 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h3&gt;&lt;p&gt;Côté Nextcloud, il n'y a rien à faire 🙂&lt;/p&gt;
&lt;p&gt;Sur le poste Windows, avec le client lourd Outlook 2019, télécharger l'add-in puis lancer son installation. Celle-ci est vraiment très brève.&lt;/p&gt;
&lt;p&gt;Lien vers les add-ins : &lt;a href="https://download.nextcloud.com/outlook/"&gt;https://download.nextcloud.com/outlook/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sur un Windows 10 64 bits, j'ai pris celui-ci : &lt;a href="https://download.nextcloud.com/outlook/20190410/Setup_23117_x64_free.msi"&gt;https://download.nextcloud.com/outlook/20190410/Setup_23117_x64_free.msi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_01.png" alt="image-20220928170044894" /&gt;&lt;/p&gt;
&lt;h3 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h3&gt;&lt;p&gt;Au 1er lancement d'Outlook, il est demandé de renseigner les paramètres du compte Nextcloud à lié au client de messagerie.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renseigner l'URL du serveur Nextcloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Ne surtout pas cliquer sur &lt;strong&gt;Connect&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cliquer sur &lt;code&gt;Manual login&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_02.png" alt="image-20220928195551493" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renseigner les credentials du compte Nextcloud de l'utilisateur et &lt;code&gt;Connect&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_03.png" alt="image-20220928195924547" /&gt;&lt;/p&gt;
&lt;p&gt;Maintenant, lors de la création d'un nouveau mail, un onglet &lt;strong&gt;Nextcloud&lt;/strong&gt; est disponible. Celui-ci permet d'accéder aux fonctionnalités de l'add-in.&lt;/p&gt;
&lt;p&gt;Ici dans la version &lt;code&gt;Free&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'envoi de fichier volumineux par mail avec génération d'un lien publique.&lt;/li&gt;
&lt;li&gt;La création d'un espace partagé avec génération d'un lien publique.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_04.png" alt="image-20220928201559434" /&gt;&lt;/p&gt;
&lt;p&gt;Dans le menu &lt;code&gt;Settings&lt;/code&gt;, il est possible de paramétrer l'add-in.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'activation ou non de la génération d'un mot de passe pour protéger l'URL.&lt;/li&gt;
&lt;li&gt;La personnalisation du message généré dans le corps du mail qui sera ajouté automatiquement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_05.png" alt="image-20220928202128014" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Appliquer pour valider les modifications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="utilisation"&gt;&lt;a href="#utilisation" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h3&gt;&lt;h4 id="fichiers-volumineux"&gt;&lt;a href="#fichiers-volumineux" class="header-anchor"&gt;&lt;/a&gt;Fichiers volumineux
&lt;/h4&gt;&lt;p&gt;Pour la 1ère fonctionnalité qui permet de partager un ou des fichiers volumineux sans les mettre en pièces jointes (en générant automatiquement un lien publique par le biais de Nextcloud) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lors de la rédaction d'un nouveau mail, sélectionner &lt;code&gt;Upload files&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_06.png" alt="image-20220928203214120" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner le ou les fichiers à partager.&lt;/li&gt;
&lt;li&gt;(Recommandé) : Définir une date d'expiration du lien.&lt;/li&gt;
&lt;li&gt;Valider avec le bouton &lt;code&gt;Upload files&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un message, dans le corps du mail, s'ajoute automatiquement pour indiquer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le lien publique pour accéder aux données.&lt;/li&gt;
&lt;li&gt;Le mot de passe (si activé) pour accéder à la ressource.&lt;/li&gt;
&lt;li&gt;La date d'expiration du lien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_06b.png" alt="image-20220928204524277" /&gt;&lt;/p&gt;
&lt;h4 id="espace-partagé"&gt;&lt;a href="#espace-partag%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Espace partagé
&lt;/h4&gt;&lt;p&gt;Pour la 2nde fonctionnalité qui permet la création d'un espace partagé avec les destinataires et en leurs donnant la possibilité d'upload leurs fichiers sans les joindre en retour par mail (en générant automatiquement un lien publique par le biais de Nextcloud) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lors de la rédaction d'un nouveau mail, sélectionner &lt;code&gt;Share public folder&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_07.png" alt="image-20220928204241957" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Recommandé) : Définir une date d'expiration du lien.&lt;/li&gt;
&lt;li&gt;Valider avec le bouton &lt;code&gt;Public share&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout comme pour l'envoi de fichiers volumineux, un message s'insère dans le corps du mail en indiquant les informations nécessaires pour les destinataires.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next_out_08.png" alt="image-20220928204434304" /&gt;&lt;/p&gt;
&lt;h2 id="recommandation"&gt;&lt;a href="#recommandation" class="header-anchor"&gt;&lt;/a&gt;Recommandation
&lt;/h2&gt;&lt;p&gt;Une utilisation abusive, avec de très gros fichiers, peut provoquer une surcharge au point de vue stockage sur le serveur Nextcloud.&lt;/p&gt;
&lt;p&gt;De ce fait, il est important de définir une purge régulière des fichiers envoyés.&lt;/p&gt;
&lt;p&gt;Du point de vue serveur, les données sont organisées ce cette façon :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;www-data@9938e68f8acd:/var/www/html/data/julien/files# tree -d -L &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|-- Documents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|-- Outlook
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| |-- Public-Share
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| | &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;-- &lt;span style="color:#ae81ff"&gt;20220928&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;-- Upload-Files
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;-- &lt;span style="color:#ae81ff"&gt;20220928&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|-- Photos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;-- Templates
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; directories
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Attention à préserver les répertoires suivant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outlook&lt;/li&gt;
&lt;li&gt;Public-Share&lt;/li&gt;
&lt;li&gt;Upload-Files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut constater qu'un sous-répertoire est créé automatiquement avec la date du jour suivant la fonctionnalité employée. Ces dossiers datés peuvent être supprimés directement sur le serveur par le biais de script, crontab, etc...&lt;/p&gt;
&lt;p&gt;Si cette méthode est employé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Réindexer les fichiers dans la BDD de Nextcloud :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;www-data@9938e68f8acd:/var/www/html# php occ files:scan --all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting scan &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; user &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; out of &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;admin&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting scan &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; user &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; out of &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;julien&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+---------+-------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Folders | Files | Elapsed time |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+---------+-------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;67&lt;/span&gt; | 00:00:00 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+---------+-------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OPNsense : Déploiement d’une instance sur OVHcloud [Partie 1/2]</title><link>https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-1-2/</link><pubDate>Fri, 23 Sep 2022 08:00:46 +0200</pubDate><guid>https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-1-2/</guid><description>&lt;img src="https://slash-root.fr/opnsense-deploiement-dune-instance-sur-ovhcloud-partie-1-2/cover.png" alt="Featured image of post OPNsense : Déploiement d’une instance sur OVHcloud [Partie 1/2]" /&gt;&lt;p&gt;Dans cet article je vais décrire comment installer une instance sous OPNsense au sein d'OVHcloud.&lt;/p&gt;
&lt;p&gt;Par défaut, il n'est pas possible de déployer une image OPNsense lors de la commande d'une instance sur OVHcloud.&lt;/p&gt;
&lt;p&gt;En effet les distributions disponibles sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AlmaLinux&lt;/li&gt;
&lt;li&gt;RockyLinux&lt;/li&gt;
&lt;li&gt;CentOS&lt;/li&gt;
&lt;li&gt;Debian&lt;/li&gt;
&lt;li&gt;Fedora&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pourtant, on peut très bien déployer un système complet OPNsense (FreeBSD) nativement sur une instance OVHcloud.&lt;/p&gt;
&lt;p&gt;Un vRack sera déployé pour la partie LAN d'OPNsense.&lt;/p&gt;
&lt;h2 id="préparation-de-linstance-ovhcloud"&gt;&lt;a href="#pr%c3%a9paration-de-linstance-ovhcloud" class="header-anchor"&gt;&lt;/a&gt;Préparation de l&amp;rsquo;instance OVHcloud
&lt;/h2&gt;&lt;h3 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h3&gt;&lt;p&gt;Voici un schéma simplifié du contexte de déploiement de l'OPNsense :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01-1.png" alt="infra" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'instance qui hébergera OPNsense utilisera l'offre Discovery à 4.99€ HT/mois avec 1 vCPU, 2 Go de RAM, et 25GB de disque SSD.&lt;/li&gt;
&lt;li&gt;Un vRack sera déployé pour relier d'autres instances futures derrière l'OPNsense. Par exemple pour héberger un cluster swarm.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="création-dun-vrack"&gt;&lt;a href="#cr%c3%a9ation-dun-vrack" class="header-anchor"&gt;&lt;/a&gt;Création d&amp;rsquo;un vRack
&lt;/h3&gt;&lt;p&gt;En tout premier, il faut créer le vRack auquel sera rataché la future instance OPNsense. Cette opération se réalise dans le panel d'administration (OVH Manager) de vos services &lt;code&gt;Public Cloud&lt;/code&gt; chez OVH.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la catégorie &lt;code&gt;Network&lt;/code&gt;, se rendre dans la partie &lt;code&gt;Private Network&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Créer un réseau privé.&lt;/li&gt;
&lt;li&gt;Définir un ID de VLAN (Recommandé)&lt;/li&gt;
&lt;li&gt;Choisir le mode de distribution des adresses (Statique recommandé).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02-1.png" alt="image-20220916163541456" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Localisation&lt;/code&gt;, il est possible de définir à quelle région sera rattaché ce vRack. Pour cet article tout ce passera à Gravelines.&lt;/li&gt;
&lt;li&gt;Définir un nom pour ce vRack (ClusterSwarm dans cet article).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Cela peut prendre un peu de temps à être déployé la 1ère fois. Patience...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois déployé et disponible, ce vRack apparait dans la liste des réseaux privés disponible avec la plage d'adresse attribuée.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03-1.png" alt="image-20220916164200412" /&gt;&lt;/p&gt;
&lt;h3 id="création-de-linstance"&gt;&lt;a href="#cr%c3%a9ation-de-linstance" class="header-anchor"&gt;&lt;/a&gt;Création de l&amp;rsquo;instance
&lt;/h3&gt;&lt;p&gt;Maintenant que le vRack est déployé, une nouvelle instance peut être créée.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Instances&lt;/code&gt;, créer une nouvelle instance.&lt;/li&gt;
&lt;li&gt;Choisir un modèle (Instance &lt;code&gt;D2-2&lt;/code&gt; amplement suffisante).&lt;/li&gt;
&lt;li&gt;Choisir une localistation (&lt;code&gt;Gravelines&lt;/code&gt; par exemple).&lt;/li&gt;
&lt;li&gt;Sélectionner une image. Ici, je suis parti sur une Debian 11 mais peut importe le choix car l'installation d'OPNsense se fera à travers une image rescue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04-1.png" alt="image-20220920105548183" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter sa clef SSH publique de type RSA ou ECDSA (Les clefs de type ED25519 ne sont pas pris en charge).&lt;/li&gt;
&lt;li&gt;Définir un nom pour cette instance (hostname).&lt;/li&gt;
&lt;li&gt;Sélectionner le réseau privé à attacher à cette instance (Le vRack préalablement créé doit être disponible).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05.png" alt="image-20220920110707870" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner une période facturation (Mensuel ou horaire).&lt;/li&gt;
&lt;li&gt;Créer l'instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette instance est maintenant disponible. Son adresse IP publique et son IP privée y sont indiquées.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06.png" alt="image-20220920202939791" /&gt;&lt;/p&gt;
&lt;h2 id="installation-opnsense"&gt;&lt;a href="#installation-opnsense" class="header-anchor"&gt;&lt;/a&gt;Installation OPNsense
&lt;/h2&gt;&lt;h3 id="démarrage-en-mode-rescue"&gt;&lt;a href="#d%c3%a9marrage-en-mode-rescue" class="header-anchor"&gt;&lt;/a&gt;Démarrage en mode rescue
&lt;/h3&gt;&lt;p&gt;Pour pouvoir installer OPNsense, il est nécessaire de démarrer en mode rescue l'instance préalablement créée.&lt;/p&gt;
&lt;p&gt;En mode rescue, le disque principal sera disponible mais non monté. Le système rescue sera chargé en RAM (soit 2 Go avec une instance D2-2).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L'ISO d'OPNsense fait 1,3 Go&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est donc impératif de sélectionner une image rescue qui prend très d'espace afin d'y loger également l'iso d'OPNsense.&lt;/p&gt;
&lt;p&gt;De celle que j'ai testé, c'est la &lt;code&gt;Debian 9&lt;/code&gt; qui est la plus approprié pour la suite des manipulations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans les détails de l'instance, redémarrer en mode rescue.&lt;/li&gt;
&lt;li&gt;Sélectionner l'image &lt;code&gt;Debian 9&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="07.png" alt="image-20220920114318303" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois le redémarrage effectué en mode rescue en Debian 9, il est possible de s'y connecter avec la clef SSH qui a été définie lors de la création de l'instance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se connecter en SSH à l'instance :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -i ~/.ssh/ma_clef_privee debian@&lt;span style="color:#f92672"&gt;[&lt;/span&gt;IP_PUBLIC_INSTANCE&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Adapter selon l'emplacement et le nom de la privée.&lt;/li&gt;
&lt;li&gt;[IP_PUBLIC_INSTANCE] = IP publique de l'instance OVHcloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id="récupération-de-liso-dopnsense"&gt;&lt;a href="#r%c3%a9cup%c3%a9ration-de-liso-dopnsense" class="header-anchor"&gt;&lt;/a&gt;Récupération de l&amp;rsquo;ISO d&amp;rsquo;OPNsense
&lt;/h3&gt;&lt;p&gt;Une fois connecté en SSH à l'instance en mode rescue Debian 9, il est important de controler qu'il y aura assez d'espace disque afin de récupérer et décompresser l'ISO d'OPNsense.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier l'espace disque disponible (Le rescue mode est chargé en RAM) :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h | grep -v ^tmpfs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L'espace restant disponible est de 1,9G. Cela sera suffisant pour récupéré l'ISO compressé et la décompresser :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Filesystem Size Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;udev 968M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 968M 0% /dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1 3.0G 954M 1.9G 34% /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Télécharger la dernière ISO disponible d'OPNsense :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -P /tmp https://mirror.vraphim.com/opnsense/releases/22.7/OPNsense-22.7-OpenSSL-dvd-amd64.iso.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Installer &lt;code&gt;bzip2&lt;/code&gt; (Si celui-ci n'est pas disponible) :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install bzip2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Extraire et supprimer l'archive :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bzip2 -dk OPNsense-22.7-OpenSSL-dvd-amd64.iso.bz2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm OPNsense-22.7-OpenSSL-dvd-amd64.iso.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mise-en-place-qemuvnc"&gt;&lt;a href="#mise-en-place-qemuvnc" class="header-anchor"&gt;&lt;/a&gt;Mise en place QEMU/VNC
&lt;/h3&gt;&lt;p&gt;Afin de pouvoir déclencher l'installation en mode console d'OPNsense à partir de l'ISO récupérée, VNC sera utilisé à travers QEMU. &lt;/p&gt;
&lt;p&gt;Afin de pouvoir prendre réaliser cela, il est nécessaire de relancer la connexion SSH à l'instance à l'aide d'un tunnel SSH afin de mapper le port distant 5900 vers un port local.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se reconnecter à la session SSH de l'instance en rescue :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -i ~/.ssh/ma_clef_privee debian@&lt;span style="color:#f92672"&gt;[&lt;/span&gt;IP_PUBLIC_INSTANCE&lt;span style="color:#f92672"&gt;]&lt;/span&gt; -L 5900:localhost:5900
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Télécharger le package :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -qO- /tmp /vkvm.tar.gz | tar xvz -C /tmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Démarrer QEMU/VNC :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /tmp/qemu-system-x86_64 -net nic -net user,hostfwd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;tcp::80-:80,hostfwd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;tcp::443-:443 -m 1024M -localtime -enable-kvm -hda /dev/sda -hdb /dev/sdb -vnc 127.0.0.1:0 -cdrom /tmp/OPNsense-22.7-OpenSSL-dvd-amd64.iso -boot d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;En mode rescue, &lt;code&gt;/dev/sda&lt;/code&gt; correspond à la racine (volume monté en RAM), et &lt;code&gt;/dev/sdb&lt;/code&gt; dorrespond au disque principal de votre instance (disponible mais non monté).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="démarrage-de-linstallation-dopnsense"&gt;&lt;a href="#d%c3%a9marrage-de-linstallation-dopnsense" class="header-anchor"&gt;&lt;/a&gt;Démarrage de l&amp;rsquo;installation d&amp;rsquo;OPNsense
&lt;/h3&gt;&lt;p&gt;A partir de maintenant, il est maintenant possible de se connecter en VNC sur &lt;code&gt;127.0.0.1:5900&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;2 possibilités sont offertes lors du démarrage :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boot en mode live : Se connecter en &lt;code&gt;root&lt;/code&gt; avec le mot de passe &lt;code&gt;opnsense&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lancement de l'installation : Se connecter en &lt;code&gt;installer&lt;/code&gt; avec le mot de passe &lt;code&gt;opnsense&lt;/code&gt; .&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Le boot en mode live ne présente aucun intérêt dans ce cas de figure. Le compte &lt;code&gt;installer&lt;/code&gt; est donc à utiliser pour déclencher l'installation de la solution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner le bon disque pour l'installation (ada1 25GB car instance d2-2) :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="08.png" alt="image-20220921164909736" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;vtnet0 = Interface publique&lt;/li&gt;
&lt;li&gt;vtnet1 = IP vRack&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois l'installation terminée, dans les détails de l'instance sur le manager OVH, sortir du mode rescue :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09.png" alt="image-20220921171239516" /&gt;&lt;/p&gt;
&lt;p&gt;Après quelques instants votre instance démarrera normalement sur son disque principal avec le chargement d'OPNsense.&lt;/p&gt;
&lt;h3 id="configuration-opnsense"&gt;&lt;a href="#configuration-opnsense" class="header-anchor"&gt;&lt;/a&gt;Configuration OPNsense
&lt;/h3&gt;&lt;p&gt;Pour procéder à la 1ère configuration de la solution OPNsense :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre dans les détails de l'instance.&lt;/li&gt;
&lt;li&gt;Puis console VNC dans le 2nd onglet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10-1.png" alt="image-20220921172853667" /&gt;&lt;/p&gt;
&lt;p&gt;Dans un prochain article, je traiterai de la configuration des interfaces avec une IP FailOver, la mise en place d'un certificat SSL avec Let's Encrypt.&lt;/p&gt;</description></item><item><title>YubiKey : Paramétrage authentification Linux</title><link>https://slash-root.fr/yubikey-parametrage-authentification-linux/</link><pubDate>Fri, 16 Sep 2022 04:28:23 +0200</pubDate><guid>https://slash-root.fr/yubikey-parametrage-authentification-linux/</guid><description>&lt;img src="https://slash-root.fr/yubikey-parametrage-authentification-linux/cover.png" alt="Featured image of post YubiKey : Paramétrage authentification Linux" /&gt;&lt;p&gt;Configuration d'une clef YubiKey Bio (FIDO Edition) sous Pop!_Os 22.04 pour l'authentification :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En mode graphique (Gnome)&lt;/li&gt;
&lt;li&gt;En mode console&lt;/li&gt;
&lt;li&gt;Avec sudo&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Product : &lt;a href="https://www.yubico.com/fr/product/yubikey-bio/"&gt;https://www.yubico.com/fr/product/yubikey-bio/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L'intérêt est de ne plus à avoir à saisir de mot de passe de plus en plus long au quotidien et de rapidement pouvoir d'authentifier avec une empreinte digitale posée sur la clef.&lt;/p&gt;
&lt;p&gt;Si la clef n'est pas présente / détectée ou que la reconnaissance de l'empreinte échoue, le mot de passe sera demandé.&lt;/p&gt;
&lt;p&gt;Il est possible de rendre obligatoire la présence de la clef. Dans ce cas, il est &lt;strong&gt;fortement&lt;/strong&gt; recommandée de posséder une seconde YubiKey en backup (de secours).&lt;/p&gt;
&lt;h2 id="configuration-des-empreintes-digitales"&gt;&lt;a href="#configuration-des-empreintes-digitales" class="header-anchor"&gt;&lt;/a&gt;Configuration des empreintes digitales
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Télécharger l'application pour Linux :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://developers.yubico.com/yubioath-desktop/Beta/yubioath-desktop-6.0.0-beta.1-linux.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Extraire l'archive compressée :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir yubiauth
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar xzvf yubioath-desktop-6.0.0-beta.1-linux.tar.gz -C yubiauth/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Lancer l'application :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd yubiauth
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./authenticator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Insérer la YubiKey quand l'application le demande.&lt;/li&gt;
&lt;li&gt;Définir un code PIN pour la YubiKey.&lt;/li&gt;
&lt;li&gt;Ajouter une empreinte :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="image-20220916020851831" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Poser son empreinte plusieurs fois pour bien la définir et saisir un nom :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02.png" alt="image-20220916021312224" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Depuis le menu &lt;code&gt;Options&lt;/code&gt;, il est possible de modifier le code PIN et de ré-initialiser la YubiKey :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03.png" alt="image-20220916025407905" /&gt;&lt;/p&gt;
&lt;h2 id="configuration-de-lauthentification"&gt;&lt;a href="#configuration-de-lauthentification" class="header-anchor"&gt;&lt;/a&gt;Configuration de l&amp;rsquo;authentification
&lt;/h2&gt;&lt;h3 id="module-u2f-pour-pam"&gt;&lt;a href="#module-u2f-pour-pam" class="header-anchor"&gt;&lt;/a&gt;Module U2F pour PAM
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Installer le module U2F pour PAM et son outil de configuration :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install libpam-u2f pamu2fcfg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Génération de la configuration de PAM pour l'utilisateur courant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pamu2fcfg -u &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;whoami&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; -opam://&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;hostname&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; -ipam://&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;hostname&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Au moment de la validation de la commande, la YubiKey se mettra à clignoter en vert. Il faudra saisir une des empreintes digitales enregistrées précédement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copier le résultat :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Le résultat à récupérer sera sous cette forme (... = raccourci)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;julien:ehi46df...QBGFSsdf+q...70Z3A&lt;span style="color:#f92672"&gt;==&lt;/span&gt;,nbWH7...nRGyfSpJ3GS+UFkaf...YssmeKD/uiefF5...2W/RvMb8oNwA&lt;span style="color:#f92672"&gt;==&lt;/span&gt;,es256,+presence
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Coller le résultat dans le fichier &lt;code&gt;/etc/u2f_mappings&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/u2f_mappings
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Je déconseille fortement de vouloir piper / rediriger le résultat de la commande &lt;code&gt;pamu2cfg&lt;/code&gt; directement dans le fichier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/etc/pam.d/common-auth&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/pam.d/common-auth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter la ligne suivante (remplacer $HOSTNAME par le nom de la machine) en haut du fichier :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth sufficient pam_u2f.so origin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME appid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME authfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/u2f_mappings cue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Avec cette configuration, il sera toujours possible de s'authentifier avec un mot de passe. Pour rendre l'utilisation obligatoire de la YubiKey, remplacer &lt;code&gt;sufficient&lt;/code&gt; par &lt;code&gt;required&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Mettre à jour PAM :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pam-auth-update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Avant la mise à jour du fonctionnement de PAM, je recommande &lt;strong&gt;fortement&lt;/strong&gt; de garder un shell ouvert à côté sous l'identité de root avec &lt;code&gt;sudo -i&lt;/code&gt;. Cela permettra de rétablir la configuration initiale en cas d'erreur de manipulation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="authentification-en-mode-graphique"&gt;&lt;a href="#authentification-en-mode-graphique" class="header-anchor"&gt;&lt;/a&gt;Authentification en mode graphique
&lt;/h3&gt;&lt;p&gt;Pour permettre l'utilisation de la YubiKey pour s'authentifier à l'environnement graphique (Gnome).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/etc/pam.d/gdm-password&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/pam.d/gdm-password
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter la ligne suivante (remplacer $HOSTNAME par le nom de la machine) juste après la ligne &lt;code&gt;@include common-auth&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth sufficient pam_u2f.so origin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME appid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME authfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/u2f_mappings cue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="authentification-en-mode-console"&gt;&lt;a href="#authentification-en-mode-console" class="header-anchor"&gt;&lt;/a&gt;Authentification en mode console
&lt;/h3&gt;&lt;p&gt;Pour permettre l'utilisation de la YubiKey pour s'authentifier en mode console.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/etc/pam.d/login&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/pam.d/login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter la ligne suivante (remplacer $HOSTNAME par le nom de la machine) en haut du fichier :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth sufficient pam_u2f.so origin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME appid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME authfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/u2f_mappings cue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="authentification-avec-sudo"&gt;&lt;a href="#authentification-avec-sudo" class="header-anchor"&gt;&lt;/a&gt;Authentification avec sudo
&lt;/h3&gt;&lt;p&gt;Pour permettre l'utilisation de la YubiKey pour s'authentifier avec la commande &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/pam.d/sudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter la ligne suivante (remplacer $HOSTNAME par le nom de la machine) en haut du fichier :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth sufficient pam_u2f.so origin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME appid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pam://$HOSTNAME authfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/u2f_mappings cue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;La YubiKey clignote en vert lorsqu'une empreinte doit être saisie :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04.png" alt="image-20220916035107054" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si la YubiKey n'est pas connectée ou bien que l'empreinte n'est pas reconnue, le mot de passe habituel sera demandé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par défaut, &lt;code&gt;sudo&lt;/code&gt; ne redemande pas d'authentification avant 15 min. Avec &lt;code&gt;sudo -k&lt;/code&gt;, il est possible de forcer l'expiration de ce temps. Pour rendre ce comportement persistent, la configuration de sudo doit être modifiée.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/etc/sudoers&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo visudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Modifier comme suit :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Avant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Defaults env_reset&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Après&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Defaults env_reset,timestamp_timeout&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant, à chaque fois que &lt;code&gt;sudo&lt;/code&gt; sera invoqué, une demande d'authentification sera effectuée.&lt;/p&gt;</description></item><item><title>Docker-Compose : Drawio</title><link>https://slash-root.fr/docker-compose-drawio/</link><pubDate>Mon, 12 Sep 2022 07:24:05 +0200</pubDate><guid>https://slash-root.fr/docker-compose-drawio/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-drawio/cover.png" alt="Featured image of post Docker-Compose : Drawio" /&gt;&lt;h2 id="le-fichier-docker-composeyml"&gt;&lt;a href="#le-fichier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;Le fichier docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;drawio&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jgraph/drawio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;drawio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# http://localhost:8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# https://localhost:8443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8443&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;8443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="execution"&gt;&lt;a href="#execution" class="header-anchor"&gt;&lt;/a&gt;Execution
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack Drawio</title><link>https://slash-root.fr/docker-swarm-stack-drawio/</link><pubDate>Mon, 12 Sep 2022 07:21:23 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-drawio/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-drawio/cover.png" alt="Featured image of post Docker Swarm : Stack Drawio" /&gt;&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Avoir réalisé l'enregistrement DNS adéquat pour url.application.com&lt;/li&gt;
&lt;li&gt;Nécéssite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;drawio&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jgraph/drawio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL d&amp;#39;accès à l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-http.rule=Host(&amp;lt;code&amp;gt;url.application.com&amp;lt;/code&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL d&amp;#39;accès à l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-https.rule=Host(&amp;lt;code&amp;gt;url.application.com&amp;lt;/code&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsSeconds=315360000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsPreload=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsIncludeSubdomains=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.customFrameOptionsValue=SAMEORIGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.sslRedirect=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.forceSTSHeader=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.referrerPolicy=same-origin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.drawio-https.middlewares=hsts-headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.drawio.loadbalancer.server.port=8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml drawio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="accès"&gt;&lt;a href="#acc%c3%a8s" class="header-anchor"&gt;&lt;/a&gt;Accès
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://url.application.com"&gt;https://url.application.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker-Compose : OpenVAS</title><link>https://slash-root.fr/docker-compose-openvas/</link><pubDate>Sun, 04 Sep 2022 22:36:59 +0200</pubDate><guid>https://slash-root.fr/docker-compose-openvas/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-openvas/cover.png" alt="Featured image of post Docker-Compose : OpenVAS" /&gt;&lt;h2 id="le-fichier-docker-composeyml"&gt;&lt;a href="#le-fichier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;Le fichier docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.7&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;openvas&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;immauss/openvas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;openvas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer un MotDePasseTresSecure or play with env&amp;#39;s file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;9392&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;9392&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="execution"&gt;&lt;a href="#execution" class="header-anchor"&gt;&lt;/a&gt;Execution
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack OpenVAS</title><link>https://slash-root.fr/docker-swarm-stack-openvas/</link><pubDate>Sun, 04 Sep 2022 12:16:16 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-openvas/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-openvas/cover.png" alt="Featured image of post Docker Swarm : Stack OpenVAS" /&gt;&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Nécéssite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;immauss/openvas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer un mot de passe pour le compte admin de l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer les volumes à monter. Si le volume est inexistant, il sera créé automatiquement. Attention si contexte de cluster (swarm), penser à placer une contrainte de label.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indispensable pour communiquer avec traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.openvas_data == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Activation de traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL de l&amp;#39;application (openvas.example.com)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-http.rule=Host(`openvas.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL de l&amp;#39;application (openvas.example.com)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-https.rule=Host(`openvas.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le nomagentapplication pour les headers à travers traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsSeconds=315360000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsPreload=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsIncludeSubdomains=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.customFrameOptionsValue=SAMEORIGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.sslRedirect=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.forceSTSHeader=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.referrerPolicy=same-origin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.openvas-https.middlewares=hsts-headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.openvas.loadbalancer.server.port=9392&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml openvas
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : OpenProject</title><link>https://slash-root.fr/docker-compose-openproject/</link><pubDate>Thu, 25 Aug 2022 11:55:11 +0200</pubDate><guid>https://slash-root.fr/docker-compose-openproject/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-openproject/cover.png" alt="Featured image of post Docker-Compose : OpenProject" /&gt;&lt;h2 id="changelog"&gt;&lt;a href="#changelog" class="header-anchor"&gt;&lt;/a&gt;Changelog
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;04/09/2022 : Fix environnement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Tous les services tournent dans un seul conteneur.&lt;/li&gt;
&lt;li&gt;Le compte par défaut est &lt;strong&gt;admin&lt;/strong&gt; avec le mot de passe &lt;strong&gt;admin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;URL d'accès : &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Par défaut des connexions anonymes sont autorisées. Dans le menu Administration / Authentification, il est possible de modifier ce comportement :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="image-1661420855287.png" alt="file" /&gt;&lt;/p&gt;
&lt;h2 id="fichier-docker-composeyml"&gt;&lt;a href="#fichier-docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;Fichier docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;openproject&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;openproject/community:12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OPENPROJECT_HOST__NAME&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;localhost:8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OPENPROJECT_HTTPS&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo &amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OPENPROJECT_SECRET_KEY_BASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;A_GENERER_AVEC_LA_CMD_CI-DESSUS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pgdata:/var/openproject/pgdata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;assets:/var/openproject/assets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;pgdata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;assets&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="execution"&gt;&lt;a href="#execution" class="header-anchor"&gt;&lt;/a&gt;Execution
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Keycloak : Federation d’un annuaire LDAPS (Active Directory)</title><link>https://slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/</link><pubDate>Tue, 23 Aug 2022 15:10:58 +0200</pubDate><guid>https://slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/</guid><description>&lt;img src="https://slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/cover.png" alt="Featured image of post Keycloak : Federation d’un annuaire LDAPS (Active Directory)" /&gt;&lt;p&gt;Cet article a pour but de décrire la mise en place de la fédération d'un annuaire LDAPS (Active Directory) au sein d'un royaume Keycloak.&lt;/p&gt;
&lt;p&gt;Testé avec un domaine Active Directory On-Premises et avec Azure Active Directory.&lt;/p&gt;
&lt;h2 id="contexte-de-linfrastructure"&gt;&lt;a href="#contexte-de-linfrastructure" class="header-anchor"&gt;&lt;/a&gt;Contexte de l&amp;rsquo;infrastructure
&lt;/h2&gt;&lt;p&gt;L'infrastructure sur laquelle je vais m'appuyer est la suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 contrôleur de domaine Active Directory (AD DS) avec sa PKI (AD CS) sous Windows Serveur 2019 Standard
&lt;ul&gt;
&lt;li&gt;Domaine : aukfood.lan&lt;/li&gt;
&lt;li&gt;FQDN du contrôleur de domaine : dc01.aukfood.lan&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 serveur Keycloak en version 19.0.1
&lt;ul&gt;
&lt;li&gt;Déployé dans docker swarm avec ce stack : &lt;a href="https://slash-root.fr/docker-swarm-stack-keycloak-v19-latest/"&gt;/docker-swarm-stack-keycloak-v19-latest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;URL : keycloak.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="certificat-tls"&gt;&lt;a href="#certificat-tls" class="header-anchor"&gt;&lt;/a&gt;Certificat TLS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note : Les commandes de ce chapitre sont réalisées depuis le serveur hébergeant le conteneur keycloak.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="récupération-du-certificat"&gt;&lt;a href="#r%c3%a9cup%c3%a9ration-du-certificat" class="header-anchor"&gt;&lt;/a&gt;Récupération du certificat
&lt;/h3&gt;&lt;p&gt;Pour commencer, il va falloir récupérer le certificat TLS utilisé pour la liaison LDAPS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;LDAP = Port 389 TCP&lt;/li&gt;
&lt;li&gt;LDAPS = Port 636 TCP&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Avec l'utilitaire &lt;code&gt;openssl&lt;/code&gt;, il est possible de tester que la liaison LDAPS est fonctionelle ainsi que de récupérer différentes informations (dont le certificat du serveur) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl s_client -connect dc01.aukfood.lan:636
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici le retour pour cette infra :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Certificate chain
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; s:CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i:DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lan, DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood, CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood-DC01-CA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Server certificate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----BEGIN CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MIIHLzCCBRegAwIBAgITTAAAAAczDQgCtUWEjAAAAAAABzANBgkqhkiG9w0BAQsF
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AniSQdTOnACZrX//9tDg73RV9w&lt;span style="color:#f92672"&gt;==&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----END CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;subject&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;issuer&lt;span style="color:#f92672"&gt;=&lt;/span&gt;DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lan, DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood, CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood-DC01-CA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copier le &lt;code&gt;Server certificate&lt;/code&gt; commençant par &lt;code&gt;-----BEGIN CERTIFICATE-----&lt;/code&gt; et se terminant par &lt;code&gt;-----END CERTIFICATE-----&lt;/code&gt; dans un fichier &lt;code&gt;server-ldaps.cer&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt;EOF &amp;gt; server-ldaps.cer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;-----BEGIN CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;MIIHLzCCBRegAwIBAgITTAAAAAczDQgCtUWEjAAAAAAABzANBgkqhkiG9w0BAQsF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;AniSQdTOnACZrX//9tDg73RV9w==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;-----END CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="création-du-keystore"&gt;&lt;a href="#cr%c3%a9ation-du-keystore" class="header-anchor"&gt;&lt;/a&gt;Création du keystore
&lt;/h3&gt;&lt;p&gt;Maintenant que le certificat TLS du contrôleur de domaine a été récupéré, il va falloir l'importer dans un keystore.&lt;/p&gt;
&lt;p&gt;Tout d'abord, installer &lt;code&gt;openjdk-11-jre&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install openjdk-11-jre
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis importer le certificat &lt;code&gt;server-ldaps.cer&lt;/code&gt; dans un keystore nommé &lt;code&gt;keystore.jks&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keytool -import -trustcacerts -alias dc01.aukfood.lan-CA -file server-ldaps.cer -keystore keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Saisir un mot de passe à appliquer au keystore :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Entrez le mot de passe du fichier de clés : 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ressaisissez le nouveau mot de passe : 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier la présence du certificat dans le keystore généré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keytool -list -keystore keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après avoir entrer le mot de passe du keystore, le certificat est bien présent :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Entrez le mot de passe du fichier de clés : 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type de fichier de clés : PKCS12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fournisseur de fichier de clés : SUN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Votre fichier de clés d&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;accès contient &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; entrée
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dc01.aukfood.lan-ca, &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; août 2022, trustedCertEntry, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Empreinte du certificat &lt;span style="color:#f92672"&gt;(&lt;/span&gt;SHA-256&lt;span style="color:#f92672"&gt;)&lt;/span&gt; : 61:EA:83:97:92:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:B5:59:EE:2C:8A:2D:EA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="déclaration-du-keystore"&gt;&lt;a href="#d%c3%a9claration-du-keystore" class="header-anchor"&gt;&lt;/a&gt;Déclaration du keystore
&lt;/h3&gt;&lt;p&gt;Maintenant que le keystore a été généré avec le certificat TLS du contrôleur de domaine, il va falloir le déclarer au sein de Keycloakpour qu'il puisse être exploité.&lt;/p&gt;
&lt;p&gt;Dans la stack keycloak (voir lien en début d'article), un volume &lt;code&gt;conf&lt;/code&gt; est monté pour la persistance des données du répertoire &lt;code&gt;/opt/keycloak/conf&lt;/code&gt; dans le conteneur.&lt;/p&gt;
&lt;p&gt;Envoyer le keystore précédement généré dans le conteneur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker cp ./keystore.jks &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;docker ps -qf name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;keycloak&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;:/opt/keycloak/conf/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis ajouter les variables suivantes sur la stack de keycloak :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe du keystore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; KC_SPI_TRUSTSTORE_FILE_FILE: /opt/keycloak/conf/keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; KC_SPI_TRUSTSTORE_FILE_PASSWORD: MotDePasseTresSecure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le &lt;code&gt;MotDePasseTresSecure&lt;/code&gt; est celui qui a été indiqué lors de la création du keystore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lister les stacks dans docker swarm :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identifier l'ID du service docker exécutant&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME SERVICES ORCHESTRATOR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keycloak &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nextcloud &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;portainer &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rocketchat &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;swarmpit &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traefik &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;La stack faisant tourner le keycloack en v19 est nommé &lt;strong&gt;keycloak&lt;/strong&gt; dans ce cluster docker.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Supprimer la stack keycloak :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack rm keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis relancer la stack kycloak pour prendre en compte les nouvelles variables d'environnement concernant le truststore :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c ./keycloak/stack.yml keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le fichier &lt;code&gt;stack.yml&lt;/code&gt; est stocké dans un répertoire nommé &lt;code&gt;keycloak&lt;/code&gt; de mon répertoire courant. A adapter suivant son emplaccement dans le FHS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="logs"&gt;&lt;a href="#logs" class="header-anchor"&gt;&lt;/a&gt;Logs
&lt;/h2&gt;&lt;p&gt;Avant de passer à la configuration de la fédération de l'annuaire Active Directory via LDAPS à Keycloak, il est important de vérifier et de de s'assurer du bon redémarrage du conteneur.&lt;/p&gt;
&lt;p&gt;Pour cela, lister les services en cours au sein du cluster docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identifier le service adéquat (ici : &lt;strong&gt;keycloak_app&lt;/strong&gt;) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2degmsl8r3se dashy replicated 0/0 lissy93/dashy:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7jq3dje5b0t8 keycloak_app replicated 1/1 quay.io/keycloak/keycloak:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubq1dvhwv0st nextcloud_app replicated 1/1 nextcloud:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arz4ca4gvfgv nextcloud_mariadb replicated 1/1 mariadb:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vr2c7ptq6a8k portainer_agent global 5/5 portainer/agent:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h6h5merxg9a2 portainer_portainer replicated 1/1 portainer/portainer-ce:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mzsq3uof6c1r rocketchat_mongodb replicated 1/1 bitnami/mongodb:4.4 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmu3kz5n7xq9 rocketchat_rocketchat replicated 1/1 registry.rocket.chat/rocketchat/rocket.chat:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kos1zg1wowxi swarmpit_agent global 5/5 swarmpit/agent:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gtjs3mikbtaf swarmpit_app replicated 1/1 swarmpit/swarmpit:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nx6s2mt19bzx swarmpit_db replicated 1/1 couchdb:2.3.0 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n5oq9gx05bnd swarmpit_influxdb replicated 1/1 influxdb:1.7 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;u7b8rsym5lzp traefik_traefik replicated 1/1 traefik:latest 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier la bonne exécution du service en gardant un shell ouvert avec la lecture des logs en temps réel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker service logs -f keycloak_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-de-la-fédération-ldaps"&gt;&lt;a href="#configuration-de-la-f%c3%a9d%c3%a9ration-ldaps" class="header-anchor"&gt;&lt;/a&gt;Configuration de la fédération LDAPS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note : A partir de maintenant, la configuration est à effectuer à travers la console web d'administration du service Keycloak.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="user-federation"&gt;&lt;a href="#user-federation" class="header-anchor"&gt;&lt;/a&gt;User federation
&lt;/h3&gt;&lt;p&gt;Sélectionner le royaume adéquat ou en créer un nouveau (1), puis se rendre sur &lt;strong&gt;User federation&lt;/strong&gt; (2) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="image-20220822202717217" /&gt;&lt;/p&gt;
&lt;p&gt;Ajouter un fournisseur LDAP :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02.png" alt="image-20220822202902853" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note : Pour les explications des différents champs, leurs fonctions, leurs utilités, etc... qui vont suivre, se référer à cet article que j'ai écris en 2021 sur l'intégration d'un annuaire LDAP (OpenLDAP, huhu) : &lt;a href="https://slash-root.fr/keycloak-integration-ldap-externe/"&gt;/keycloak-integration-ldap-externe/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tous les paramètres de synchronisation y sont traités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion du stockage des utilisateurs&lt;/li&gt;
&lt;li&gt;L'influence du mode &lt;code&gt;Import Users&lt;/code&gt; sur les requêtes LDAP (LDAPS, même combat)&lt;/li&gt;
&lt;li&gt;L'&lt;code&gt;Edit Mode&lt;/code&gt; et ses différents paramètres&lt;/li&gt;
&lt;li&gt;Les types de &lt;code&gt;Vendor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les différents champs &lt;code&gt;Users DN&lt;/code&gt; ou &lt;code&gt;Bind DN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les configurations possibles pour la synchronisation ainsi que leurs périodicités&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="general-options"&gt;&lt;a href="#general-options" class="header-anchor"&gt;&lt;/a&gt;General options
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(1) Console display name&lt;/strong&gt; : Entrer un nom afin d'identifier cette fédération d'utilisateurs au sein de Keycloak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(2) Vendor&lt;/strong&gt; : Indiquer le type d'annuaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03.png" alt="image-20220823052653616" /&gt;&lt;/p&gt;
&lt;h3 id="connection-and-authentication-settings"&gt;&lt;a href="#connection-and-authentication-settings" class="header-anchor"&gt;&lt;/a&gt;Connection and authentication settings
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;(1) Connection URL&lt;/strong&gt; : Renseigner l'URL de connexion à l'annuaire LDAPS sous la forme &lt;code&gt;ldaps://FQDN_DC:636&lt;/code&gt;. Cette URL doit correspondre au &amp;quot;Common Name&amp;quot; du certificat. Celui-ci peut être identifié lors de l'utilisation de la commande &lt;code&gt;openssl&lt;/code&gt; au début de cet article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2) Use Truststore SPI&lt;/strong&gt; : Indiquer l'utilisation du truststore javax.net.ssl.trustStore (pour le keystore.jks) uniquement pour ldaps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(3) Bind DN&lt;/strong&gt; : Indiquer le DistinguishedName de l'utilisateur de l'annuaire qui sera utilisé par Keycloak. Pour le récupérer facilement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-ADUser UTILISATEUR_AD | FT DistinguishedName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;(4) Bind credentials&lt;/strong&gt; : Mettre le mot de passe de l'utilisateur indiqué au point précédent.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04.png" alt="image-20220823062809118" /&gt;&lt;/p&gt;
&lt;p&gt;A noter que pour le moment, il manque des informations dans le paramétrage de la liaison LDAPS. De ce fait, le &amp;quot;Test connection&amp;quot; et le &amp;quot;Test authentication&amp;quot; ne sont pas encore réalisables (Une des différences avec les versions de Keycloak sous Wildfly en version 16 et inférieure).&lt;/p&gt;
&lt;h3 id="ldap-searching-and-updating"&gt;&lt;a href="#ldap-searching-and-updating" class="header-anchor"&gt;&lt;/a&gt;LDAP searching and updating
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;(1) Edit mode&lt;/strong&gt; : Définir le mode d'édition de l'annuaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2) Users DN&lt;/strong&gt; : Indiquer le DistinguishedName de l'OU contenant les utilisateurs à fédérer.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05.png" alt="image-20220823112241929" /&gt;&lt;/p&gt;
&lt;h2 id="tests-et-import-utilisateurs"&gt;&lt;a href="#tests-et-import-utilisateurs" class="header-anchor"&gt;&lt;/a&gt;Tests et import utilisateurs
&lt;/h2&gt;&lt;p&gt;Il est maintenant possible de tester la connexion LDAPS et l'authenfication.&lt;/p&gt;
&lt;p&gt;Ces 2 tests doivent aboutir :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06.png" alt="image-20220823113054627" /&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, en haut à droite de la page, bien s'assurer que cette fédération soit &lt;strong&gt;enabled&lt;/strong&gt;. Puis dans &lt;strong&gt;action (1)&lt;/strong&gt;, déclencher la &lt;strong&gt;synchronisation (2)&lt;/strong&gt; de tous les utilisateurs :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="07.png" alt="image-20220823113544319" /&gt;&lt;/p&gt;
&lt;p&gt;L'importation des utilisateurs aboutie :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09.png" alt="image-20220823113707564" /&gt;&lt;/p&gt;
&lt;p&gt;Dans les utilisateurs du royaume Keycloak, je retrouve bien les utilisateurs contenus dans l'OU définit dans la fédération.&lt;/p&gt;
&lt;h2 id="mappers"&gt;&lt;a href="#mappers" class="header-anchor"&gt;&lt;/a&gt;Mappers
&lt;/h2&gt;&lt;p&gt;Dans ce contexte, l'utilisateur &amp;quot;Julien LOUIS&amp;quot;, se retrouve avec un &lt;strong&gt;username&lt;/strong&gt; contenant des espaces. Cela est dû au faites que l'attribut &lt;strong&gt;cn&lt;/strong&gt; de l'annuaire a été mappé vers l'attribut &lt;strong&gt;username&lt;/strong&gt; de Keycloak.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09b.png" alt="image-20220823120151055" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour voir tous les utilisateurs du royaume keycloak (fédération incluse), rechercher ***** comme utilisateur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;De plus, pour l'utilisateur final, cela ne correspondra pas au login auquel il est habitué d'utiliser.&lt;/p&gt;
&lt;p&gt;Pour modifier ce comportement, il faut mapper l'attribut &lt;strong&gt;sAMAccountName&lt;/strong&gt; de l'anuaire Active Directory vers l'attribut &lt;strong&gt;username&lt;/strong&gt; de Keycloak.&lt;/p&gt;
&lt;p&gt;Se rendre sur les paramétrages de la fédération précédement réalisée, puis dans l'onglet &lt;strong&gt;Mappers (1)&lt;/strong&gt;, éditer le mapper &lt;strong&gt;username (2)&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10.png" alt="image-20220823114704603" /&gt;&lt;/p&gt;
&lt;p&gt;Modifier le champ &lt;strong&gt;LDAP Attribute&lt;/strong&gt; pour y inscrire &lt;strong&gt;sAMAccountName&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11.png" alt="image-20220823115150552" /&gt;&lt;/p&gt;
&lt;p&gt;Puis, enregistrer la modification en bas de page.&lt;/p&gt;
&lt;p&gt;Ensuite, dans l'onglet &lt;strong&gt;Settings&lt;/strong&gt;, modifier l'&lt;strong&gt;Username LDAP attribute&lt;/strong&gt; en y inscrivant &lt;strong&gt;sAMAccountName&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12.png" alt="image-20220823115607818" /&gt;&lt;/p&gt;
&lt;p&gt;Puis, enregistrer la modification en bas de page.&lt;/p&gt;
&lt;p&gt;En relançant la synchronisation de tous les utilisateurs de l'annuaire vers Keycloak, les utilisateurs sont mis à jour :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="13.png" alt="image-20220823115739535" /&gt;&lt;/p&gt;
&lt;p&gt;A présent, le login des utilisateurs importés dans Keycloak est correctement paramétré.&lt;/p&gt;</description></item><item><title>Docker Swarm : Stack Keycloak (v19 latest)</title><link>https://slash-root.fr/docker-swarm-stack-keycloak-v19-latest/</link><pubDate>Mon, 22 Aug 2022 10:39:09 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-keycloak-v19-latest/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-keycloak-v19-latest/cover.png" alt="Featured image of post Docker Swarm : Stack Keycloak (v19 latest)" /&gt;&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Nécéssite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cette stack est faites pour du développement (avec persistance des données) et non de la production&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;quay.io/keycloak/keycloak:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;security_opt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#66d9ef"&gt;no&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;new-privileges:true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;start-dev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PROXY_ADDRESS_FORWARDING&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KC_FEATURES&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;token-exchange&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KC_PROXY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;passthrough&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_ADMIN&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer un mot de passe pour le compte admin sur l&amp;#39;application keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer les volumes à monter. Si le volume est inexistant, il sera créé automatiquement. Attention si contexte de cluster (swarm), penser à placer une contrainte de label.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;conf:/opt/keycloak/conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;data:/opt/keycloak/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;providers:/opt/keycloak/providers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;themes:/opt/keycloak/themes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indispensable pour communiquer avec traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.keycloak_quay-io_conf == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.keycloak_quay-io_data == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.keycloak_quay-io_providers == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.keycloak_quay-io_themes == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Activation de traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL de l&amp;#39;application (keycloak.example.com)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-http.rule=Host(`keycloak.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer l&amp;#39;URL de l&amp;#39;application (keycloak.example.com)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-https.rule=Host(`keycloak.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsSeconds=315360000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsPreload=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsIncludeSubdomains=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.customFrameOptionsValue=SAMEORIGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.sslRedirect=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.forceSTSHeader=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.referrerPolicy=same-origin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak_quay-io-https.middlewares=hsts-headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.keycloak_quay-io.loadbalancer.server.port=8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;conf&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;providers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;themes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack Nextcloud</title><link>https://slash-root.fr/docker-swarm-stack-nextcloud/</link><pubDate>Thu, 18 Aug 2022 13:00:13 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-nextcloud/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-nextcloud/cover.png" alt="Featured image of post Docker Swarm : Stack Nextcloud" /&gt;&lt;h2 id="changelog"&gt;&lt;a href="#changelog" class="header-anchor"&gt;&lt;/a&gt;Changelog
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;22/08/2022 : Fix traefik headers as same origin, trusted proxy, redirectregex&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Nécéssite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mariadb&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: --&lt;span style="color:#ae81ff"&gt;transaction-isolation=READ-COMMITTED --binlog-format=ROW --skip-innodb-read-only-compressed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer les mots de passe souhaités&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer les volumes à monter. Si le volume est inexistant, il sera créé automatiquement. Attention si contexte de cluster (swarm), penser à placer une contrainte de label.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mariadb:/var/lib/mysql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#- node.role == worker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.nextcloud_mariadb == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe inscrit précédement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;TRUSTED_PROXIES&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le domaine souhaité de l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OVERWRITEHOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OVERWRITEPROTOCOL&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer les volumes à monter. Si le volume est inexistant, il sera créé automatiquement. Attention si contexte de cluster (swarm), penser à placer une contrainte de label.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;nextcloud:/var/www/html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indispensable pour communiquer avec traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#- node.role == worker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.nextcloud_nextcloud == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Activation de traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le domaine souhaité pour l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-http.rule=Host(`nextcloud.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le domaine souhaité pour l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-https.rule=Host(`nextcloud.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Middleware pour nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.permanent=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.regex=https://(.*)/.well-known/(card|cal)dav&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.replacement=https://$${1}/remote.php/dav/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsSeconds=315360000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsPreload=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.stsIncludeSubdomains=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.customFrameOptionsValue=SAMEORIGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.sslRedirect=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.forceSTSHeader=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.hsts-headers.headers.referrerPolicy=same-origin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.nextcloud-https.middlewares=hsts-headers,nextcloud-redirectregex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le port utiliser de l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.nextcloud.loadbalancer.server.port=80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;net&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;overlay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;attachable&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mariadb&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;nextcloud&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml nextcloud
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack Keycloak (v16 depreciated)</title><link>https://slash-root.fr/docker-swarm-stack-keycloak/</link><pubDate>Thu, 18 Aug 2022 11:47:44 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-keycloak/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-keycloak/cover.png" alt="Featured image of post Docker Swarm : Stack Keycloak (v16 depreciated)" /&gt;&lt;h2 id="changelog"&gt;&lt;a href="#changelog" class="header-anchor"&gt;&lt;/a&gt;Changelog
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;22/08/2022 : Ajout information &lt;strong&gt;depreciated&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Nécessite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Ce stack utilise une image docker provenant de jboss qui est un keycloak en v16. La dernière version actuelle est la v19. Stack disponible ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-keycloak-v19-latest/"&gt;/docker-swarm-stack-keycloak-v19-latest/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;postgres&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe souhaité&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Label à appliquer au noeud (A retirer si utilisation de glusterfs / ceph)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.keycloak_postgres_data == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;keycloak&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jboss/keycloak:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PROXY_ADDRESS_FORWARDING&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_VENDOR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;POSTGRES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_ADDR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe inscrit dans le service postgre&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe souhaité&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MotDePasseTresSecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Réseau utilisé par le conteneur traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Activation de traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Modifier le domaine de l&amp;#39;application keyclaok&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-http.rule=Host(`keycloak.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-https.rule=Host(`keycloak.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.keycloak-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le port utiliser de l&amp;#39;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.keycloak.loadbalancer.server.port=8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;net&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;overlay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;attachable&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;postgres_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack Rocket.Chat</title><link>https://slash-root.fr/docker-swarm-stack-rocket-chat/</link><pubDate>Thu, 18 Aug 2022 11:34:33 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-rocket-chat/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-rocket-chat/cover.png" alt="Featured image of post Docker Swarm : Stack Rocket.Chat" /&gt;&lt;h2 id="informations-importantes"&gt;&lt;a href="#informations-importantes" class="header-anchor"&gt;&lt;/a&gt;Informations importantes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Nécéssite le stack pour traefik voir ici : &lt;a href="https://slash-root.fr/docker-swarm-stack-traefik/"&gt;/docker-swarm-stack-traefik/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bien modifier ce qu'il faut dans le stack (voir commentaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rocketchat&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;registry.rocket.chat/rocketchat/rocket.chat:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGO_URL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb://mongodb:27017/rocketchat?replicaSet=rs0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGO_OPLOG_URL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;mongodb://mongodb:27017/local?replicaSet=rs0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Modifier l&amp;#39;URL d&amp;#39;accès à l&amp;#39;application RocketChat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ROOT_URL&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://rocketchat.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PORT&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;uploads:/app/uploads&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Réseau utilisé par le conteneur traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Label à appliquer au noeud (A retirer si utilisation de glusterfs / ceph)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.rocketchat_uploads == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Activation de traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Modifier le domaine de l&amp;#39;application RocketChat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-http.rule=Host(`rocketchat.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Modifier le domaine de l&amp;#39;application RocketChat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-https.rule=Host(`rocketchat.example.com`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.rocketchat-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.rocketchat.loadbalancer.server.port=3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mongodb&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;docker.io/bitnami/mongodb:4.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_REPLICA_SET_MODE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;primary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_REPLICA_SET_NAME&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rs0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_PORT_NUMBER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_INITIAL_PRIMARY_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_INITIAL_PRIMARY_PORT_NUMBER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_ADVERTISED_HOSTNAME&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_ENABLE_JOURNAL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ALLOW_EMPTY_PASSWORD&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mongodb_data:/bitnami/mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#resources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#limits:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 1024M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#reservations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#cpus: &amp;#39;0.25&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#memory: 512M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Label à appliquer au noeud (A retirer si utilisation de glusterfs / ceph)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.rocketchat_mongodb_data == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;net&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;overlay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;attachable&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Réseau utilisé par le conteneur traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mongodb_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uploads&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="deploiement"&gt;&lt;a href="#deploiement" class="header-anchor"&gt;&lt;/a&gt;Deploiement
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker Swarm : Stack Traefik</title><link>https://slash-root.fr/docker-swarm-stack-traefik/</link><pubDate>Thu, 18 Aug 2022 11:28:10 +0200</pubDate><guid>https://slash-root.fr/docker-swarm-stack-traefik/</guid><description>&lt;img src="https://slash-root.fr/docker-swarm-stack-traefik/cover.png" alt="Featured image of post Docker Swarm : Stack Traefik" /&gt;&lt;h2 id="export-variables"&gt;&lt;a href="#export-variables" class="header-anchor"&gt;&lt;/a&gt;Export variables
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export EMAIL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mon@email.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export DOMAIN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;traefik.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export USERNAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;MotDePasseTresSecure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export HASHED_PASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;openssl passwd -apr1 &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PASSWORD&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fichier-stackyml"&gt;&lt;a href="#fichier-stackyml" class="header-anchor"&gt;&lt;/a&gt;Fichier stack.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the latest Traefik image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;traefik:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Listen on port 80, default for HTTP, necessary to redirect to HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;target&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;published&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Listen on port 443, default for HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;target&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;published&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;placement&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;constraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Make the traefik service run only on the node with this label&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# as the node with it has the volume for the certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;node.labels.traefik-public.traefik-public-certificates == true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable Traefik for this service, to make it available in the public network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.enable=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the traefik-public network (declared below)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.docker.network=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the custom label &amp;#34;traefik.constraint-label=traefik-public&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# This public Traefik will only use services with this label&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# That way you can add other internal Traefik instances per stack if needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.constraint-label=traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# admin-auth middleware with HTTP Basic auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Using the environment variables USERNAME and HASHED_PASSWORD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.admin-auth.basicauth.users=${USERNAME?Variable not set}:${HASHED_PASSWORD?Variable not set}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# https-redirect middleware to redirect HTTP to HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# It can be re-used by other stacks in other Docker Compose files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.https-redirect.redirectscheme.scheme=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.middlewares.https-redirect.redirectscheme.permanent=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# traefik-http set up only to use the middleware to redirect to https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Uses the environment variable DOMAIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-http.rule=Host(`${DOMAIN?Variable not set}`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-http.entrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-http.middlewares=https-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# traefik-https the actual router using HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Uses the environment variable DOMAIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.rule=Host(`${DOMAIN?Variable not set}`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.entrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.tls=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the special Traefik service api@internal with the web UI/Dashboard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.service=api@internal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the &amp;#34;le&amp;#34; (Let&amp;#39;s Encrypt) resolver created below&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.tls.certresolver=le&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable HTTP Basic auth, using the middleware created above&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.routers.traefik-public-https.middlewares=admin-auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Define the port inside of the Docker service to use&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik.http.services.traefik-public.loadbalancer.server.port=8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Add Docker as a mounted volume, so that Traefik can read the labels of other services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Mount the volume to store the certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public-certificates:/certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable Docker in Traefik, so that it reads labels from Docker services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;providers.docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Add a constraint to only use services with the label &amp;#34;traefik.constraint-label=traefik-public&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;providers.docker.constraints=Label(`traefik.constraint-label`, `traefik-public`)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Do not expose all Docker services, only the ones explicitly exposed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;providers.docker.exposedbydefault=false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable Docker Swarm mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;providers.docker.swarmmode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Create an entrypoint &amp;#34;http&amp;#34; listening on address 80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;entrypoints.http.address=:80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Create an entrypoint &amp;#34;https&amp;#34; listening on address 443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;entrypoints.https.address=:443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Create the certificate resolver &amp;#34;le&amp;#34; for Let&amp;#39;s Encrypt, uses the environment variable EMAIL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;certificatesresolvers.le.acme.email=${EMAIL?Variable not set}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Store the Let&amp;#39;s Encrypt certificates in the mounted volume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;certificatesresolvers.le.acme.storage=/certificates/acme.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the TLS Challenge for Let&amp;#39;s Encrypt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;certificatesresolvers.le.acme.tlschallenge=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable the access log, with HTTP requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;accesslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable the Traefik log, for configurations and errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enable the Dashboard and API&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - --&lt;span style="color:#ae81ff"&gt;api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Set CA Server fir Let&amp;#39;s Encrypt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - --certificatesresolvers.le.acme.caServer=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the public network created to be shared between Traefik and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# any other service that needs to be publicly available with HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;traefik-public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Create a volume to store the certificates, there is a constraint to make sure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Traefik is always deployed to the same Docker node with the same volume containing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# the HTTPS certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public-certificates&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use the previously created public network &amp;#34;traefik-public&amp;#34;, shared with other&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# services that need to be publicly available via this Traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;traefik-public&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;external&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="déploiement"&gt;&lt;a href="#d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Déploiement
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c stack.yml traefik
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Portainer Agent</title><link>https://slash-root.fr/docker-compose-portainer-agent/</link><pubDate>Mon, 15 Aug 2022 16:55:25 +0200</pubDate><guid>https://slash-root.fr/docker-compose-portainer-agent/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-portainer-agent/cover.png" alt="Featured image of post Docker-Compose : Portainer Agent" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;agent&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;portainer/agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;portainer_agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;security_opt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#66d9ef"&gt;no&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;new-privileges:true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/lib/docker/volumes:/var/lib/docker/volumes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;9001&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;9001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Terminal: Fix broadcast command twice in Terminator</title><link>https://slash-root.fr/terminal-fix-broadcast-command-twice-in-terminator/</link><pubDate>Mon, 15 Aug 2022 16:46:56 +0200</pubDate><guid>https://slash-root.fr/terminal-fix-broadcast-command-twice-in-terminator/</guid><description>&lt;img src="https://slash-root.fr/terminal-fix-broadcast-command-twice-in-terminator/cover.png" alt="Featured image of post Terminal: Fix broadcast command twice in Terminator" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Avec le logiciel terminator, il peut arriver que le broadcast de commande double les caractères tappés sur le clavier.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="image-1660573995709.png" alt="terminator_broadcast_twice" /&gt;&lt;/p&gt;
&lt;p&gt;Dans mon contexte, je suis avec la version de terminator 2.1.1 fournit par les dépôts de Pop_OS 22.04.&lt;/p&gt;
&lt;h2 id="fix-terminator"&gt;&lt;a href="#fix-terminator" class="header-anchor"&gt;&lt;/a&gt;Fix terminator
&lt;/h2&gt;&lt;p&gt;Pour corriger ce phénomène, j'ai édité le script de terminator.&lt;/p&gt;
&lt;p&gt;Tout d'abord :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Où est terminator ?&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;whereis terminator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# terminator: /usr/bin/terminator /usr/share/terminator /usr/share/man/man1/terminator.1.gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Editer le script de lancement :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /usr/bin/terminator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter ceci juste après les imports en début de fichier :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#34;&amp;#34;&amp;#34;Modifi broadcast twice&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;os.environ[&amp;#39;DBUS_SESSION_BUS_ADDRESS&amp;#39;]&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#34;&amp;#34;&amp;#34;End of modify broadcast twice&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Enregistrer les modifications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relancer terminator&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;Le broadcast de commande dans terminator est maintenant pleinement fonctionnel 🙂&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="image-1660574620280.png" alt="terminator_broadcast_ok" /&gt;&lt;/p&gt;</description></item><item><title>Docker-Compose : Portainer Server</title><link>https://slash-root.fr/docker-compose-portainer/</link><pubDate>Sat, 13 Aug 2022 17:53:08 +0200</pubDate><guid>https://slash-root.fr/docker-compose-portainer/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-portainer/cover.png" alt="Featured image of post Docker-Compose : Portainer Server" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;portainer&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;portainer/portainer-ce:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;portainer_server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;security_opt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#66d9ef"&gt;no&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;new-privileges:true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./portainer-data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Only to http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - 9000:9000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Only to Edge Agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - 8000:8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Only to https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;9443&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;9443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Pop!_OS 22.04 : Fix apt</title><link>https://slash-root.fr/pop_os-22-04-fix-apt/</link><pubDate>Tue, 02 Aug 2022 10:10:08 +0200</pubDate><guid>https://slash-root.fr/pop_os-22-04-fix-apt/</guid><description>&lt;img src="https://slash-root.fr/pop_os-22-04-fix-apt/cover.png" alt="Featured image of post Pop!_OS 22.04 : Fix apt" /&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# purge old apt configuration files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /var/lib/apt/lists/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt clean; sudo apt autoclean
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# get fresh configuration files, resolve package conflicts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg --configure -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt --fix-broken install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# and finally resume the upgrade&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OPNsense : Configuration d’un VPN SSL Road Warrior avec PKI</title><link>https://slash-root.fr/opnsense-configuration-dun-vpn-ssl-road-warrior-avec-pki/</link><pubDate>Tue, 12 Jul 2022 23:21:48 +0200</pubDate><guid>https://slash-root.fr/opnsense-configuration-dun-vpn-ssl-road-warrior-avec-pki/</guid><description>&lt;img src="https://slash-root.fr/opnsense-configuration-dun-vpn-ssl-road-warrior-avec-pki/cover.jpg" alt="Featured image of post OPNsense : Configuration d’un VPN SSL Road Warrior avec PKI" /&gt;&lt;p&gt;Le but de cette documentation va être de configurer un serveur VPN dit SSL Road Warrior sur OPNsense (Un PFsense en mieux et totalement opensource :P). Les clients VPN pourront accéder à des ressources sur le réseau LAN distant de façon sécurisé.&lt;/p&gt;
&lt;p&gt;Le serveur VPN sera OpenVPN et celui-ci sera configuré de façon à accepter les connexions sur le port HTTPS (TCP 443). De cette façon, l'accès pourra se faire de n'importe où car ce port n'est pas (ou très très très rarement) filtré sur une connexion standard à Internet.&lt;/p&gt;
&lt;p&gt;Une autorité de certification sera créé pour délivrer un certificat afin de sécuriser les échanges.&lt;/p&gt;
&lt;p&gt;Un exemple de configuration d'un client sous Windows 10 est traité à la fin.&lt;/p&gt;
&lt;p&gt;Let's go !!!&lt;/p&gt;
&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Voici la version utilisée d'OPNsense :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OPNsense 22.1.2_2-amd64&lt;/li&gt;
&lt;li&gt;FreeBSD 13.0-STABLE&lt;/li&gt;
&lt;li&gt;OpenSSL 1.1.1m 14 Dec 2021&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au niveau des interfaces de paramétrées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LAN = 192.168.56.254/24&lt;/li&gt;
&lt;li&gt;WAN = IP_PUBLIC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aucune configuration particulière à été apportée après l'installation d'OPNsense à part l'adressage IP des interfaces WAN et LAN.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tout le paramétrage sera à réaliser à travers l'interface web d'administration d'OPNsense.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="pki"&gt;&lt;a href="#pki" class="header-anchor"&gt;&lt;/a&gt;PKI
&lt;/h2&gt;&lt;h3 id="création-de-lauthorité-de-certification"&gt;&lt;a href="#cr%c3%a9ation-de-lauthorit%c3%a9-de-certification" class="header-anchor"&gt;&lt;/a&gt;Création de l&amp;rsquo;authorité de certification
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Trust&lt;/strong&gt; (2), &lt;strong&gt;Authorities&lt;/strong&gt; (3), cliquer sur &lt;strong&gt;+&lt;/strong&gt; (4) pour ajouter une authorité de certification :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="image-20220712200137330" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner &lt;strong&gt;Create an internal Certificate Authority&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02.png" alt="image-20220712200934152" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Je ne vais pas traiter la partie algorithme ni de type ou de longueur de clef. Je laisse les paramètres par défaut mais dans un contexte de production, il sera important de modifier ces différents paramètres.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Entrer une &lt;strong&gt;Descriptive name&lt;/strong&gt; ainsi que le &lt;strong&gt;Common Name&lt;/strong&gt; et les informations désirées.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enregistrer la nouvelle authorité de certification :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03.png" alt="image-20220712201557684" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="génération-du-certificat-serveur"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-du-certificat-serveur" class="header-anchor"&gt;&lt;/a&gt;Génération du certificat serveur
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;Certificates&lt;/strong&gt; (1), cliquer sur &lt;strong&gt;+&lt;/strong&gt; (2) pour ajouter un nouveau certificat :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04.png" alt="image-20220712202909916" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner &lt;strong&gt;Create an internal Certificate&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04a.png" alt="image-20220712212614382" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Même remarque que précédement concernant la partie algorithme, clef...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Entrer une &lt;strong&gt;Descriptive name&lt;/strong&gt;. Sélectionner le bon &lt;strong&gt;Certificate authority&lt;/strong&gt; et le type &lt;strong&gt;Server Certificate&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les informations provenant de l'authorité de certification doivent être pré-remplies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renseigner le &lt;strong&gt;Common Name&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04b.png" alt="image-20220712204003467" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enregistrer le nouveau certificat :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04c.png" alt="image-20220712204333253" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="openvpn"&gt;&lt;a href="#openvpn" class="header-anchor"&gt;&lt;/a&gt;OpenVPN
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;VPN&lt;/strong&gt; (1), &lt;strong&gt;OpenVPN&lt;/strong&gt; (2), &lt;strong&gt;Servers&lt;/strong&gt; (3), cliquer sur l'icône du &lt;strong&gt;Wizard&lt;/strong&gt; (4) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05.png" alt="image-20220712202051739" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;En passant par le wizard, il y aura la possibilité de créer automatiquement les 2 règles nécessaires pour autoriser le flux provenant des clients VPN.Sinon, il faudra les ajouter à la main, ça fonctionne très bien aussi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type de serveur d'authentification : &lt;strong&gt;Local User Access&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authorité de certification : &lt;strong&gt;OPNsense-CA&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Certificat : &lt;strong&gt;OPNsense-VPN-Cert&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la partie &lt;strong&gt;General OpenVPN Server Information&lt;/strong&gt;, renseigner les paramètres suivants :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06.png" alt="image-20220712205028162" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les clients se connecteront sur l'interface &lt;strong&gt;WAN&lt;/strong&gt; d'OPNsense par le protocol &lt;strong&gt;TCP&lt;/strong&gt; sur le port &lt;strong&gt;443&lt;/strong&gt;. Par défaut OpenVPN écoute sur le port 1194 en UDP. Pour que la connexion soit possible depuis n'importe quel réseau Internet, il faut bien modifier ce paramètre. C'est quasiment indétectablement par les pare-feux pour faire la différence avec du flux HTTPS (du stateful inspection permet de faire la différence).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la partie &lt;strong&gt;Tunnel Settings&lt;/strong&gt;, renseigner les paramètres suivants :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="07.png" alt="image-20220712205937919" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;IPv4 Tunnel Network&lt;/strong&gt;, entrer le réseau virtuel qui sera attribué aux clients VPN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;IPv4 Local Network&lt;/strong&gt;, entrer le réseau LAN qui doit être accessible aux clients VPN.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Le reste des paramètres sont laissés par défaut. Ils pourront être définis si besoin mais ne seront pas traités dans cet article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Passer à la prochaine étape en cliquant sur &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cocher &lt;strong&gt;Firewall Rule&lt;/strong&gt; et &lt;strong&gt;OpenVPN Rule&lt;/strong&gt; pour générer les 2 règles adéquats dans le pare-feu :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="08.png" alt="image-20220712210924817" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Valider en cliquant sur &lt;strong&gt;Next&lt;/strong&gt; puis &lt;strong&gt;Finish&lt;/strong&gt; pour terminer le paramétrage du serveur VPN.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="utilisateur"&gt;&lt;a href="#utilisateur" class="header-anchor"&gt;&lt;/a&gt;Utilisateur
&lt;/h2&gt;&lt;h3 id="création-dun-utilisateur"&gt;&lt;a href="#cr%c3%a9ation-dun-utilisateur" class="header-anchor"&gt;&lt;/a&gt;Création d&amp;rsquo;un utilisateur
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;System&lt;/strong&gt; (1), &lt;strong&gt;Access&lt;/strong&gt; (2), &lt;strong&gt;Users&lt;/strong&gt; (3), cliquer sur &lt;strong&gt;+&lt;/strong&gt; (4) pour ajouter un nouveau utilisateur :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09.png" alt="image-20220712211520676" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renseigner un &lt;strong&gt;Username&lt;/strong&gt; et un &lt;strong&gt;Password&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10.png" alt="image-20220712211947305" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plus bas, cocher &lt;strong&gt;Click to create a user certificate&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11.png" alt="image-20220712212137535" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terminer en cliquant sur &lt;strong&gt;Save&lt;/strong&gt;. Cela déclenche la génération d'un certificat.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="génération-du-certificat-utilisateur"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-du-certificat-utilisateur" class="header-anchor"&gt;&lt;/a&gt;Génération du certificat utilisateur
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner &lt;strong&gt;Create an internal Certificate&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12.png" alt="image-20220712212728988" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Entrer une &lt;strong&gt;Descriptive name&lt;/strong&gt;. Sélectionner le bon &lt;strong&gt;Certificate authority&lt;/strong&gt; et le type &lt;strong&gt;Client Certificate&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les informations provenant de l'authorité de certification doivent être pré-remplies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renseigner le &lt;strong&gt;Common Name&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enregistrer le nouveau certificat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le certificat est maintenant associé à l'utilisateur :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="13.png" alt="image-20220712213220067" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terminer en cliquant sur &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="client-windows"&gt;&lt;a href="#client-windows" class="header-anchor"&gt;&lt;/a&gt;Client Windows
&lt;/h2&gt;&lt;h3 id="exportation-de-la-configuration-client"&gt;&lt;a href="#exportation-de-la-configuration-client" class="header-anchor"&gt;&lt;/a&gt;Exportation de la configuration client
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;VPN&lt;/strong&gt; (1), &lt;strong&gt;OpenVPN&lt;/strong&gt; (2), &lt;strong&gt;Client Export&lt;/strong&gt; (3), télécharger l'archive contenant la confirmation client d'OpenVPN avec le certificat utilisateur correspondant :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="14.png" alt="image-20220712222650837" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;En cochant &lt;strong&gt;Windows Certificate System Store&lt;/strong&gt;, un certificat &lt;code&gt;.crt&lt;/code&gt; est récupéré. Malgré le faites de l'inscrire (ou d'inscrire le CA) dans le magasin (des certificats de l'ordinateur) des autorités de certification racines de confiance, celui-ci ne sera pas approuvé.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Le contenu de l'archive récupérée contient les éléments suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OPNsense_VPN_Server_batman_vpn-tls.key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OPNsense_VPN_Server_batman_vpn.ovpn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OPNsense_VPN_Server_batman_vpn.p12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installation-du-client"&gt;&lt;a href="#installation-du-client" class="header-anchor"&gt;&lt;/a&gt;Installation du client
&lt;/h3&gt;&lt;p&gt;Sur le poste client en Windows 10 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Télécharger le client OpenVPN Community : &lt;a href="https://swupdate.openvpn.org/community/releases/OpenVPN-2.5.7-I602-amd64.msi"&gt;https://swupdate.openvpn.org/community/releases/OpenVPN-2.5.7-I602-amd64.msi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer le client OpenVPN (Attention, il faudra des droits d'administrateur sur le poste Windows).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un message d'avertissement indique qu'il n'y a aucun profil de connexion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier le contenu de l'archive préalablement exporter dans le répertoire &lt;code&gt;%USERPROFILE%\OpenVPN\config&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="15.png" alt="image-20220712225016759" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se connecter :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="16.png" alt="image-20220712225229212" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un message peut survenir indiquant que l'utilisateur Windows doit faire partie du groupe local de la machine &lt;code&gt;OpenVPN Administrators&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="17.png" alt="image-20220712225549618" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Si contexte de domaine, une GPO peut appliquer ce paramètre automatiquement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;S'identifier avec le compte utilisateur créé précédement dans OPNsense :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="18.png" alt="image-20220712225737892" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La connexion VPN est établie :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="19.png" alt="image-20220712230430443" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nextcloud : Intégration d’une authentification SSO avec AD FS</title><link>https://slash-root.fr/nextcloud-integration-dune-authentification-sso-avec-ad-fs/</link><pubDate>Fri, 08 Jul 2022 12:00:33 +0200</pubDate><guid>https://slash-root.fr/nextcloud-integration-dune-authentification-sso-avec-ad-fs/</guid><description>&lt;img src="https://slash-root.fr/nextcloud-integration-dune-authentification-sso-avec-ad-fs/cover.png" alt="Featured image of post Nextcloud : Intégration d’une authentification SSO avec AD FS" /&gt;&lt;p&gt;Cet article fait office de PoC (Proof of Concept) sur la mise en place d'une authentification SSO (Single-Sign-On) à travers le service ADFS (Active Directory Federation Services) de Microsoft et l'application Open Source Nextcloud.&lt;/p&gt;
&lt;p&gt;Cela va permettre aux utilisateurs de la plateforme Nextcloud de s'authentifier avec leur compte Active Directory en utilisant le protocole SAML dans des contextes réseaux totalement différents.&lt;/p&gt;
&lt;h2 id="environnement"&gt;&lt;a href="#environnement" class="header-anchor"&gt;&lt;/a&gt;Environnement
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Environnements déjà déployés :
&lt;ul&gt;
&lt;li&gt;Nextcloud v24.0.2&lt;/li&gt;
&lt;li&gt;Contrôleur de domaine Windows Serveur 2019&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Informations :
&lt;ul&gt;
&lt;li&gt;Domaine AD : aukfood.lan&lt;/li&gt;
&lt;li&gt;Nom serveur AD : adfs-dev&lt;/li&gt;
&lt;li&gt;Domaine publique utilisé : example.com (remplace les parties floutées dans les captures d'écrans)&lt;/li&gt;
&lt;li&gt;URL Nextcloud : &lt;a href="https://nc-dev.example.com"&gt;https://nc-dev.example.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enregistrement DNS pour l'ADFS : adfs2-dev.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="génération-du-certificat-lets-encrypt"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-du-certificat-lets-encrypt" class="header-anchor"&gt;&lt;/a&gt;Génération du certificat Let&amp;rsquo;s Encrypt
&lt;/h2&gt;&lt;p&gt;A effectuer sur le serveur Windows (Tous les services seront déployés sur le contrôleur de domaine) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installation de IIS en Powershell :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Install-WindowsFeature -name Web-Server -IncludeManagementTools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faire un enregistrement de type A dans une zone DNS publique pour le serveur IIS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;adfs2-dev IN A xxx.xxx.xxx.xxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Dans ce PoC, le domaine publique utilisé sera &lt;em&gt;example.com&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer la racine du site web pour résoudre le challenge :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir c:&lt;span style="color:#ae81ff"&gt;\i&lt;/span&gt;netpub&lt;span style="color:#ae81ff"&gt;\a&lt;/span&gt;dfs2-dev.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un fichier &lt;code&gt;index.html&lt;/code&gt; dans la racine du site web :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;notepad c:&lt;span style="color:#ae81ff"&gt;\i&lt;/span&gt;netpub&lt;span style="color:#ae81ff"&gt;\a&lt;/span&gt;dfs2-dev.example.com&lt;span style="color:#ae81ff"&gt;\i&lt;/span&gt;ndex.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insérer le contenu suivant puis enregistrer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ouvrir la console de &lt;code&gt;Gestionnaire des services Internet (IIS)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supprimer le site web par défaut.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter un nouveau site web :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="website_iis.png" alt="image-20220629173936647" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Télécharger le client ACME pour Let's Encrypt ici : &lt;a href="https://www.win-acme.com/"&gt;https://www.win-acme.com/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A l'heure actuelle, la dernière version : &lt;a href="https://github.com/win-acme/win-acme/releases/download/v2.1.22.1267/win-acme.v2.1.22.1267.x64.pluggable.zip"&gt;https://github.com/win-acme/win-acme/releases/download/v2.1.22.1267/win-acme.v2.1.22.1267.x64.pluggable.zip&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Décompresser l'archive et déplacer le fichier &lt;code&gt;Web_Config.xml&lt;/code&gt; à la racine du site web.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer le site web.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lancer une ligne de commandes et se positionner dans le répertoire préalablement extrait.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécuter &lt;code&gt;wacs.exe&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs.png" alt="image-20220629172217587" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un nouveau certificat (Choix &lt;strong&gt;N&lt;/strong&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner le site ajouté au préalable dans IIS :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs-N.png" alt="image-20220629174215379" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Peu importe si le certificat est de type wildcard ou non.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le certificat est généré avec une tâche planifiée qui va renouveller le certificat automatiquement :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs-C.png" alt="image-20220629174528336" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une liaison &lt;strong&gt;https&lt;/strong&gt; (vhost) a été automatiquement générée pour le site web :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs-vhost.png" alt="image-20220629175250793" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ce certificat est celui qui sera exploité par le service &lt;code&gt;AD FS&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exportation-du-certificat-au-format-pfx"&gt;&lt;a href="#exportation-du-certificat-au-format-pfx" class="header-anchor"&gt;&lt;/a&gt;Exportation du certificat au format pfx
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Re-lancer l'outil &lt;code&gt;wacs.exe&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faire le choix &lt;strong&gt;A&lt;/strong&gt; (Manage renewals) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs-A.png" alt="image-20220629182842875" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Afficher les détails avec &lt;strong&gt;D&lt;/strong&gt;, puis noter le &lt;code&gt;.pfx password&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="wacs-D.png" alt="image-20220629183139844" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ouvrir le dossier des certificats Let's Encrypt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;explorer C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\Certificates\
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner le certificat &lt;code&gt;.pfx&lt;/code&gt; correspondant puis démarrer l'assistant d'importation du certificat au niveau de l'ordinateur local (Pour rappel : c'est le DC) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="pfx-export.png" alt="image-20220629184339453" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saisir le mot de passe de la clé privée (&lt;code&gt;.pfx password&lt;/code&gt; noté au préalable) et cocher &lt;code&gt;Marquer cette clé comme exportable&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="pfx-password.png" alt="image-20220630082547704" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner automatiquement le magasin de certificats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terminer l'assistant d'importation du certificat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ouvrir la gestion des certificats de l'ordinateur local :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;certlm.msc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans &amp;quot;Personnel\Certificats&amp;quot; (1), sélectionner le certificat préalablement importé (2). Dans &amp;quot;Toutes les tâches&amp;quot; (3), sélectionner &amp;quot;Exporter&amp;quot; (4) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="cert-export.png" alt="image-20220630083328159" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il est maintenant possible d'exporter la clé privée du certificat :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="privkey-export.png" alt="image-20220630083457141" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exporter toutes les propriétés étendues :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="export-all.png" alt="image-20220630083627092" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saisir un mot de passe pour protéger la clé privée :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="protect-privkey.png" alt="image-20220630083813883" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spécifier le nom du fichier à exporter au format &lt;code&gt;pfx&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terminer l'assistant d'exportation du certificat.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-ad-fs"&gt;&lt;a href="#installation-ad-fs" class="header-anchor"&gt;&lt;/a&gt;Installation AD FS
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer le service &lt;code&gt;ADFS-Federation&lt;/code&gt; en Powershell :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Install-WindowsFeature -name ADFS-Federation -IncludeManagementTools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer la clé racine du service de distribution de clés en Powershell :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(&lt;span style="color:#ae81ff"&gt;-10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La configuration du service se fera en mode graphique à travers le gestionnaire de serveur &lt;code&gt;servermanager.exe&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-config.png" alt="image-20220630114920640" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer le premier serveur de fédération dans une batterie de serveurs de fédération.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Importer le certificat préalablement exporté au format &lt;code&gt;.pfx&lt;/code&gt; (1). Puis, entrer un nom pour le service FS (2) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="cert-adfs.png" alt="image-20220630133612131" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spécifier un compte de service :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-service.png" alt="image-20220630134121333" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une base de données SQL Server peut être exploitée. Dans ce PoC, une base de données interne Windows est utilisée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Après examen des options, la configuration peut être lancée :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-install.png" alt="image-20220630134402869" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer le serveur Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activer la page de login de l'ADFS en Powershell :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Set-AdfsProperties -EnableIdpInitiatedSignonPage $true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tester la connexion : &lt;a href="https://adfs2-dev.example.com/adfs/ls/IdpInitiatedSignon.aspx"&gt;https://adfs2-dev.example.com/adfs/ls/IdpInitiatedSignon.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="test-adfs.png" alt="image-20220630141116182" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="paramétrage-nextcloud"&gt;&lt;a href="#param%c3%a9trage-nextcloud" class="header-anchor"&gt;&lt;/a&gt;Paramétrage Nextcloud
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en SSH sur le serveur Nextcloud et se positionner à la racine du projet web :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /var/www/nc-dev.example.com/www/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer l'application &lt;code&gt;user_saml&lt;/code&gt; avec &lt;code&gt;occ&lt;/code&gt; (A adapter selon le propriétaire du projet web) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -u nextcloud php8.0 occ app:install user_saml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# user_saml 5.0.2 installed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# user_saml enabled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se connecter à l'interface web du Nextcloud en &lt;code&gt;admin&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se rendre dans &amp;quot;Paramètres&amp;quot; (1) / &amp;quot;Authentification SSO &amp;amp; SAML&amp;quot; (2). Puis &amp;quot;Utiliser l'authentification SAML intégrée&amp;quot; (3) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-samlon.png" alt="image-20220630140157898" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la partie &amp;quot;Général&amp;quot;, entrer l'&lt;strong&gt;Attribut pour relier l'UID&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;C'est l'UPN du compte de l'utilisateur dans l'AD qui fera office de nom d'utilisateur au sein de l'instance Nextcloud.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-upn.png" alt="image-20220630140651305" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer les options IdP :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Identifiant de l'entité IdP&lt;/strong&gt; : &lt;a href="http://adfs2-dev.example.com/adfs/services/trust"&gt;http://adfs2-dev.example.com/adfs/services/trust&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL cible du fournisseur d'identités à qui le fournisseur de service enverra la requête d'authentification&lt;/strong&gt; : &lt;a href="https://adfs2-dev.example.com/adfs/ls"&gt;https://adfs2-dev.example.com/adfs/ls&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-optionsidp.png" alt="image-20220630141706164" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquer sur &amp;quot;Hide optional Identity Provider settings&amp;quot; pour accéder au champ &lt;strong&gt;Certificat public X.509 de l'IdP&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sur le serveur Windows, ouvrir la console de gestion de l'ADFS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;windir%\ADFS\Microsoft.IdentityServer.msc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans &amp;quot;Service&amp;quot; / &amp;quot;Certificats&amp;quot; (1), Afficher le certificat (2) utilisé pour la signature de jetons :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-certpub.png" alt="image-20220630142847703" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans l'onglet &amp;quot;Détails&amp;quot;, copier dans un fichier :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="cert-copier.png" alt="image-20220630143034704" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exporter au format : *&lt;em&gt;X.509 encodé en base 64 (&lt;/em&gt;.cer)**&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spécifier un nom de fichier pour l'export.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier le contenu de ce fichier exporté au format &lt;code&gt;.cer&lt;/code&gt; et le coller dans le champ &lt;strong&gt;Certificat public X.509 de l'IdP&lt;/strong&gt; dans Nextcloud :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-certpub.png" alt="image-20220630143523748" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mapper les attributs suivants au minimum :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attribut pour relier le nom d'utilisateur&lt;/strong&gt; : &lt;a href="http://schemas.microsoft.com/identity/claims/displayname"&gt;http://schemas.microsoft.com/identity/claims/displayname&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribut pour relier l'adresse mail&lt;/strong&gt; : &lt;a href="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"&gt;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-map.png" alt="image-20220630143833948" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Télécharger le fichier &lt;code&gt;metadata.xml&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-metadata.png" alt="image-20220630144006856" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour avoir la possibilité de garder l'authentification avec la base utilisateur interne de Nextcloud, cocher &lt;strong&gt;Autoriser l'utilisation de plusieurs systèmes d'authentification&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-manyauth.png" alt="image-20220630144234576" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bien vérifier l'enregistrement du paramétrage en quittant le menu &amp;quot;Authentification SSO &amp;amp; SAML&amp;quot; et en y revenant (Surtout sur le paramétrage du point précédent).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="paramétrage-ad-fs"&gt;&lt;a href="#param%c3%a9trage-ad-fs" class="header-anchor"&gt;&lt;/a&gt;Paramétrage AD FS
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sur le serveur Windows, ouvrir la console de gestion de l'AD FS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;windir%\ADFS\Microsoft.IdentityServer.msc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter une approbation de partie de confiance :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-trusted.png" alt="image-20220630151040792" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prendre en charge les revendications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Importer les données concernant la partie de confiance à partir du fichier &lt;code&gt;metadata.xml&lt;/code&gt; téléchargé préalablement :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-metadata.png" alt="image-20220630151343201" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saisir un nom pour cette approbation et éventuellement des notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner une stratégie de contrôle d'accès. Dans ce PoC, tout le monde sera autorisé :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-policy.png" alt="image-20220630151559318" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La partie de confiance a été configurée à l'aide du fichier &lt;code&gt;metadata.xml&lt;/code&gt; fourni.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editer la stratégie d'émission de revendication :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-revendication.png" alt="image-20220630151802258" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 règles de revendication de transformations sont à ajouter au minimum :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;userPrincipalName&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le modèle de régle de revendication à suivre est : &lt;strong&gt;Envoyer les attributs LDAP en tant que revendications&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Règle &lt;strong&gt;userPrincipalName&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-upn.png" alt="image-20220630152456345" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Règle &lt;strong&gt;Email&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-email.png" alt="image-20220630152543102" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appliquer les 2 règles ajoutées.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vérification-de-lauthentification"&gt;&lt;a href="#v%c3%a9rification-de-lauthentification" class="header-anchor"&gt;&lt;/a&gt;Vérification de l&amp;rsquo;authentification
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter à Nextcloud, et choisir de s'authentifier au travers une &lt;strong&gt;Connection SSO &amp;amp; SAML&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="next-adfs.png" alt="image-20220630152933665" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Utiliser un compte de l'Active Directory autoriser à se connecter à travers l'AD FS :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-test.png" alt="image-20220630153048587" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Congratulations !&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="adfs-next.png" alt="image-20220630153150780" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ressources-en-vrac"&gt;&lt;a href="#ressources-en-vrac" class="header-anchor"&gt;&lt;/a&gt;Ressources en vrac
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blog.kveer.fr/login-nextcloud-saml-adfs/"&gt;https://blog.kveer.fr/login-nextcloud-saml-adfs/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.virtualease.fr/nextcloud-authentication-active-directory-sso-via-adfs-saml/"&gt;https://www.virtualease.fr/nextcloud-authentication-active-directory-sso-via-adfs-saml/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://os-zenia.blogspot.com/2021/01/nextcloud-sso-adfs.html"&gt;http://os-zenia.blogspot.com/2021/01/nextcloud-sso-adfs.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://rephlex.de/blog/2018/04/05/how-to-connect-nextcloud-to-active-directory-using-ad-fs-without-losing-your-mind/"&gt;https://rephlex.de/blog/2018/04/05/how-to-connect-nextcloud-to-active-directory-using-ad-fs-without-losing-your-mind/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.myworkdrive.com/fr/support/adfs-single-sign-sso-integration-guide/"&gt;https://www.myworkdrive.com/fr/support/adfs-single-sign-sso-integration-guide/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.infotechram.com/wp-content/uploads/2020/07/Installing-Active-Directory-Federation-Services.pdf"&gt;https://www.infotechram.com/wp-content/uploads/2020/07/Installing-Active-Directory-Federation-Services.pdf&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.alitajran.com/export-lets-encrypt-certificate-in-windows-server/"&gt;https://www.alitajran.com/export-lets-encrypt-certificate-in-windows-server/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.rcfed.com/SAMLWSFed/CommonClaimtypelist"&gt;https://www.rcfed.com/SAMLWSFed/CommonClaimtypelist&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/fr-fr/dotnet/api/system.security.claims.claimtypes?view=net-6.0"&gt;https://docs.microsoft.com/fr-fr/dotnet/api/system.security.claims.claimtypes?view=net-6.0&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/fr-fr/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon"&gt;https://docs.microsoft.com/fr-fr/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://help.mulesoft.com/s/article/Configuring-ADFS-SLO-endpoint"&gt;https://help.mulesoft.com/s/article/Configuring-ADFS-SLO-endpoint&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://pitstop.manageengine.com/portal/en/kb/articles/saml-auto-login-with-adfs"&gt;https://pitstop.manageengine.com/portal/en/kb/articles/saml-auto-login-with-adfs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nextcloud : Importer ses données de Google</title><link>https://slash-root.fr/nextcloud-importer-ses-donnees-de-google/</link><pubDate>Thu, 16 Jun 2022 08:00:16 +0200</pubDate><guid>https://slash-root.fr/nextcloud-importer-ses-donnees-de-google/</guid><description>&lt;img src="https://slash-root.fr/nextcloud-importer-ses-donnees-de-google/cover.png" alt="Featured image of post Nextcloud : Importer ses données de Google" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Il est possible de donner aux utilisateurs, un moyen de pouvoir importer plusieurs données de leur compte Google au sein de leur compte Nextcloud comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les agendas&lt;/li&gt;
&lt;li&gt;Les contacts&lt;/li&gt;
&lt;li&gt;Les photos&lt;/li&gt;
&lt;li&gt;Les fichiers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour se faire, plusieurs APIs Google vont être exploitées.&lt;/p&gt;
&lt;h2 id="google-integration"&gt;&lt;a href="#google-integration" class="header-anchor"&gt;&lt;/a&gt;Google integration
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en &lt;code&gt;admin&lt;/code&gt; sur l'interface web du Nextcloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rechercher, télécharger, installer l'application &lt;strong&gt;Google integration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01_nextcloud_appli.png" alt="image-20220531121350423" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans les &lt;strong&gt;Paramètres&lt;/strong&gt; d'&lt;strong&gt;Administration&lt;/strong&gt;, se rendre dans &lt;strong&gt;Comptes connectés&lt;/strong&gt; (1). C'est à cet endroit qu'il va falloir renseigner l'&lt;code&gt;ID Client&lt;/code&gt; et le &lt;code&gt;Secret client&lt;/code&gt; (2) afin de pouvoir autoriser les utilisateurs à s'authentifier plus tard sur leur compte Google afin de procéder à l'importation de leur données dans leur espace Nextcloud.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02_nextcloud_integration.png" alt="image-20220531122516097" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquer sur &lt;strong&gt;Paramètres de l'API Google&lt;/strong&gt; (3) afin de créer une application OAuth Google et de récupérer les informations à renseigner (2) pour finaliser l'intégration de Google.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S'identifier avec un compte Google sur la Google Cloud Platform.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ce compte Google sera exploité uniquement pour l'API Google.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="google-cloud-platform"&gt;&lt;a href="#google-cloud-platform" class="header-anchor"&gt;&lt;/a&gt;Google Cloud Platform
&lt;/h2&gt;&lt;h3 id="projet"&gt;&lt;a href="#projet" class="header-anchor"&gt;&lt;/a&gt;Projet
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer un nouveau &lt;strong&gt;Projet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03_google_projet.png" alt="image-20220531123313059" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nommer le projet (1). Puis, valider (2).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04_google_create.png" alt="image-20220531123743578" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="consentement"&gt;&lt;a href="#consentement" class="header-anchor"&gt;&lt;/a&gt;Consentement
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;strong&gt;Ecran de consentement OAuth&lt;/strong&gt; (1), définir le type d'utilisateur (2). Puis, valider (3).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05_google_consent.png" alt="image-20220531124403709" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Entrer le nom de l'application demandant l'autorisation (1) ainsi que l'adresse mail d'assistance (2).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06_google_infosappli.png" alt="image-20220531140813609" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il est possible de spécifier un logo qui apparaitra sur la page de consentement lorsque l'utilisateur saisira ces informations de compte Google.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tout en bas de la page, indiquer vos coordonnées de développeur. Puis &lt;strong&gt;Enregistrer et continuer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="07_google_coordonnees.png" alt="image-20220531141303868" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sur l'écran suivant, &lt;strong&gt;Enregistrer et continuer&lt;/strong&gt; tout en bas de la page.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="08_google_suite.png" alt="image-20220531141803639" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A ce stade le projet a un status de publication à l'état de &lt;strong&gt;Test&lt;/strong&gt;. Il est nécessaire d'ajouter (1) les comptes Google (2) que les utilisateurs utiliseront pour les autoriser à utiliser ce projet. Puis, &lt;strong&gt;Enregistrer et continuer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09_google_users.png" alt="image-20220531142515869" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un résumé de l'écran de consentement paramétré est afficher.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="identifiants"&gt;&lt;a href="#identifiants" class="header-anchor"&gt;&lt;/a&gt;Identifiants
&lt;/h3&gt;&lt;p&gt;Maintenant, il faut générer des identifiants de type OAuth dans le projet Google Cloud Platform créé. Ceux-ci seront à renseigner par la suite dans le paramétrage de Nextcloud.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans le menu &lt;strong&gt;API et services&lt;/strong&gt; à gauche, se rendre dans &lt;strong&gt;Identifiants&lt;/strong&gt; (1). &lt;strong&gt;Créer des identifiants&lt;/strong&gt; (2) de type &lt;strong&gt;ID client OAuth&lt;/strong&gt; (3).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10_google_idoauth.png" alt="image-20220531143328943" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renseigner le &lt;strong&gt;Type d'application&lt;/strong&gt; (1). Indiquer un &lt;strong&gt;Nom&lt;/strong&gt; (2) pour identifier le client dans la console Google Cloup Platform. Indiquer l'&lt;strong&gt;URI de redirection&lt;/strong&gt; (3) autorisés. Cette URI est disponible dans l'interface Nextcloud vu précédemment, dans la parti Intégration de Google. Puis, &lt;strong&gt;Créer&lt;/strong&gt; (4).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11_google_idcreate.png" alt="image-20220531144518928" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;l'ID client et le code secret du client sont disponible.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12_google_idclient.png" alt="image-20220531144957398" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Retourner sur l'interface web de Nextcloud dans la partie &lt;strong&gt;Intégration de Google&lt;/strong&gt;. Puis, indiquer l'&lt;strong&gt;ID client&lt;/strong&gt; (1) et le &lt;strong&gt;Secret client&lt;/strong&gt; (2).&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="13_nextcloud_idclient.png" alt="image-20220531145659731" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="api"&gt;&lt;a href="#api" class="header-anchor"&gt;&lt;/a&gt;API
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Toujours sur Google Cloud Platform, dans API et services, se rendre dans &lt;strong&gt;Bibliothèque&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Rechercher et activer les API suivantes :
&lt;ul&gt;
&lt;li&gt;Google Drive API&lt;/li&gt;
&lt;li&gt;Google Calendar API&lt;/li&gt;
&lt;li&gt;Google People API&lt;/li&gt;
&lt;li&gt;Photos Library API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nextcloud"&gt;&lt;a href="#nextcloud" class="header-anchor"&gt;&lt;/a&gt;Nextcloud
&lt;/h2&gt;&lt;p&gt;Dorénavant, lorsqu'un utilisateur se connectera sur l'interface web de son Nextcloud, une section &lt;strong&gt;Migration de données&lt;/strong&gt; (1) est disponible dans ses paramètres. Cela va permettre à l'utilisateur de connecter son compte Google (2) afin de migrer les données voulues vers son compte Nextcloud.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="14_nextcloud_usermig.png" alt="image-20220531153823988" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois que l'utilisateur a connecté son compte Google et autorisé l'accès aux données à migrer, il suffit de sélectionner les éléments à importer.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="15_nextcloud_import.png" alt="image-20220531155030647" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Si aucune données n'est présente dans une des fonctionnalités Google, celle-ci ne sera pas proposée à l'import.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>SSH : SSHS, une interface utilisateur pour SSH dans le terminal</title><link>https://slash-root.fr/ssh-sshs-une-interface-utilisateur-pour-ssh-dans-le-terminal/</link><pubDate>Wed, 15 Jun 2022 10:21:30 +0200</pubDate><guid>https://slash-root.fr/ssh-sshs-une-interface-utilisateur-pour-ssh-dans-le-terminal/</guid><description>&lt;img src="https://slash-root.fr/ssh-sshs-une-interface-utilisateur-pour-ssh-dans-le-terminal/cover.jpg" alt="Featured image of post SSH : SSHS, une interface utilisateur pour SSH dans le terminal" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Je suis tombé par hasard sur ce projet : &lt;a href="https://github.com/quantumsheep/sshs"&gt;https://github.com/quantumsheep/sshs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Celui-ci permet d'avoir une interface utilisateur pour SSH dans un terminal.&lt;/p&gt;
&lt;p&gt;Il y a également la possibilité d'effectuer des recherches.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sshs-blade15.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;p&gt;Il est possible d'avoir SSHS sous Windows, Mac, Linux.&lt;/p&gt;
&lt;p&gt;Dans mon cas, je travaille sous Pop!_OS, j'ai réalisé l'installation à partir des sources.&lt;/p&gt;
&lt;p&gt;Avant tout chose, il faut installer le compilateur pour Go pour Golang.&lt;/p&gt;
&lt;p&gt;Pour ma part, je l'ai faites avec snap :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;snap install go --classic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, j'ai cloné le projet avec git :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/quantumsheep/sshs.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, j'ai compilé les sources et installé SSHS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd sshs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Réaliser l'installation avec &lt;code&gt;make install&lt;/code&gt; en tant que root.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est maintenant possible de lancer le programme avec la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sshs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation"&gt;&lt;a href="#utilisation" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h2&gt;&lt;p&gt;Il n'y a pas de manuel avec la commande &lt;code&gt;sshs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sans auncun argument, SSHS va charger le fichier &lt;code&gt;~/.ssh/config&lt;/code&gt; (et éventuellement les &lt;code&gt;Include&lt;/code&gt; dedans).&lt;/p&gt;
&lt;p&gt;Cependant, il y a quelques options possibles que l'on peut obtenir avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sshs --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici le retour de l'aide succinte :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh clients manager
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sshs &lt;span style="color:#f92672"&gt;[&lt;/span&gt;flags&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Flags:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c, --config string SSH config file &lt;span style="color:#f92672"&gt;(&lt;/span&gt;default &lt;span style="color:#e6db74"&gt;&amp;#34;~/.ssh/config&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help help &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; sshs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p, --proxy Display full ProxyCommand
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s, --search string Host search filter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --sort Sort hosts by name &lt;span style="color:#f92672"&gt;(&lt;/span&gt;default true&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -v, --version version &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; sshs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Nextcloud : Ajouter un calendrier Google privé (Sans credentials)</title><link>https://slash-root.fr/nextcloud-ajouter-un-calendrier-google-prive-sans-credentials/</link><pubDate>Thu, 09 Jun 2022 08:00:00 +0200</pubDate><guid>https://slash-root.fr/nextcloud-ajouter-un-calendrier-google-prive-sans-credentials/</guid><description>&lt;img src="https://slash-root.fr/nextcloud-ajouter-un-calendrier-google-prive-sans-credentials/cover.png" alt="Featured image of post Nextcloud : Ajouter un calendrier Google privé (Sans credentials)" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Le but est d'ajouter un calendrier Google (Google Agenda) dans les calendriers d'un utilisateur Nextcloud.&lt;/p&gt;
&lt;p&gt;Le calendrier Google restera privé et ne passera donc pas en publique.&lt;/p&gt;
&lt;p&gt;De plus, il ne sera accessible qu'en lecture. C'est comme ça...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention : L'accès au calendrier ne se fera pas avec les credentials du compte mais à l'aide d'une URL secrète (A ne surtout pas diffuser).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="côté-google"&gt;&lt;a href="#c%c3%b4t%c3%a9-google" class="header-anchor"&gt;&lt;/a&gt;Côté Google
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter au compte Google à ajouter dans Nextcloud.&lt;/li&gt;
&lt;li&gt;Dans la partie gauche de l'interface web, cliquer sur les 3 petits points à droite du calendrier à intégrer dans Nextcloud (1). Puis sélectionner &lt;code&gt;Paramètres et partage&lt;/code&gt; (2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01_google_agenda.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faire défiler jusqu'à la partie &lt;code&gt;Intégrer l&amp;#039;agenda&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;L'adresse secrète au format iCal est disponible (1). Afin de mettre cette adresse dans le presse-papier, cliquer sur l'icône &amp;quot;Copier&amp;quot; en bout de ligne (2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02_google_integration.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En utilisant cette adresse secrète, il n'est pas obligatoire de rendre l'agenda publique. De ce fait, le calendrier Google restera privé. Attention toutefois, son accès se fait sans credentials mais uniquement en lecture seule.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="côté-nextcloud"&gt;&lt;a href="#c%c3%b4t%c3%a9-nextcloud" class="header-anchor"&gt;&lt;/a&gt;Côté Nextcloud
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter sur le compte Nextcloud qui doit bénificer de l'agenda Google et se rendre dans la section &lt;code&gt;Agenda&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ajouter un nouvel agenda (1). Puis, créer un nouvel abonnement par lien (2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03_nextcloud_agenda.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coller l'adresse secrète récupérée précédemment. Puis, valider.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04_nextcloud_basics.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un nouveau calendrier &lt;code&gt;calendar.google.com&lt;/code&gt; a été ajouté en lecture seule. Il est possible de la renommer pour lui donner un nom plus explicite.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05_nextcloud_rename.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="taux-de-rafraîchissement"&gt;&lt;a href="#taux-de-rafra%c3%aechissement" class="header-anchor"&gt;&lt;/a&gt;Taux de rafraîchissement
&lt;/h2&gt;&lt;p&gt;Le taux de rafraîchissement (refresh rate), d'une souscription à un calendrier dans Nextcloud, est d'une fois toutes les semaines par défaut.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.nextcloud.com/server/19/user_manual/pim/calendar.html"&gt;https://docs.nextcloud.com/server/19/user_manual/pim/calendar.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Subscriptions are refreshed every week by default. Your admin may have changed this setting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Modifier le taux de rafraîchissement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter avec un terminal en &lt;code&gt;root&lt;/code&gt; à l'instance Nextcloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se positionner à la racine du site Nextcloud.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /var/www/nextcloud.example.com/www/ &lt;span style="color:#75715e"&gt;# Par exemple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Obtenir le propriétaire du fichier &lt;code&gt;config.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l config/config.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.rw-r----- nextcloud nextcloud 1.5 KB Wed May &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt; 10:17:35 &lt;span style="color:#ae81ff"&gt;2022&lt;/span&gt; config/config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier la valeur de l'option &lt;code&gt;calendarSubscriptionRefreshRate&lt;/code&gt; de l'application calendrier de Nextcloud à 5 minutes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -u nextcloud php8.0 occ config:app:set dav calendarSubscriptionRefreshRate --value &lt;span style="color:#e6db74"&gt;&amp;#34;PT5M&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Résultat :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Config value calendarSubscriptionRefreshRate for app dav set to PT5M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser l'utilisateur étant propriétaire du fichier config .php avec la commande sudo.&lt;/li&gt;
&lt;li&gt;Utiliser le binaire php correspondant à la version du Nextcloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier la prise en compte.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -u nextcloud php8.0 occ config:list | grep -i calendar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Résultat :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# &amp;#34;calendar&amp;#34;: {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# &amp;#34;calendarSubscriptionRefreshRate&amp;#34;: &amp;#34;PT5M&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="crontab"&gt;&lt;a href="#crontab" class="header-anchor"&gt;&lt;/a&gt;Crontab
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Editer la crontab de l'utilisateur étant propriétaire du fichier config.php vu précédemment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -u nextcloud crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter une tâche toutes les 5 minutes exécutant le script php situé à la racine du site Nextcloud.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*/5 * * * * php8.0 -f /var/www/nextcloud.example.com/www/cron.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Utiliser le binaire php correspondant à la version du Nextcloud.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en &lt;code&gt;admin&lt;/code&gt; sur l'interface web de Nextcloud. Puis se rendre dans &lt;strong&gt;Paramètres&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la section &lt;strong&gt;Administration&lt;/strong&gt; en bas à gauche, se rendre dans &lt;strong&gt;Paramètres de base&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S'assurer que les &lt;strong&gt;Tâches de fond&lt;/strong&gt; soient configurées avec &lt;code&gt;Cron&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06_nextcloud_cron.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sources"&gt;&lt;a href="#sources" class="header-anchor"&gt;&lt;/a&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nextcloud.com/server/19/user_manual/pim/calendar.html"&gt;https://docs.nextcloud.com/server/19/user_manual/pim/calendar.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nextcloud.com/server/latest/admin_manual/groupware/calendar.html#refresh-rate"&gt;https://docs.nextcloud.com/server/latest/admin_manual/groupware/calendar.html#refresh-rate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/manual/fr/dateinterval.construct.php"&gt;https://www.php.net/manual/fr/dateinterval.construct.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WordPress : Fix WP-Optimize (VPO_Page-Cache not found)</title><link>https://slash-root.fr/wordpress-fix-wp-optimize-vpo_page-cache-not-found/</link><pubDate>Sat, 04 Jun 2022 13:34:42 +0200</pubDate><guid>https://slash-root.fr/wordpress-fix-wp-optimize-vpo_page-cache-not-found/</guid><description>&lt;img src="https://slash-root.fr/wordpress-fix-wp-optimize-vpo_page-cache-not-found/cover.jpg" alt="Featured image of post WordPress : Fix WP-Optimize (VPO_Page-Cache not found)" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;WordPress 6.0&lt;/li&gt;
&lt;li&gt;WP-Optimize 3.2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec le module &lt;strong&gt;WP-Optimize&lt;/strong&gt;, il peut se produire l'erreur suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Fri Jan &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt; 15:48:12.414615 666&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;proxy_fcgi:error&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;pid 5281:tid 140595150419712&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;client 156.251.145.63:37469&lt;span style="color:#f92672"&gt;]&lt;/span&gt; AH01071: Got error &lt;span style="color:#e6db74"&gt;&amp;#39;PHP message: PHP Fatal error: Uncaught Error: Class &amp;#34;WPO_Page_Cache&amp;#34; not found in /var/www/blog.example.com/wp-content/plugins/wp-optimize/cache/file-based-page-cache-functions.php:813\nStack trace:\n#0 /var/www/blog.example.com/wp-content/plugins/wp-optimize/cache/file-based-page-cache-functions.php(889): wpo_get_conditional_tags_exceptions()\n#1 /var/www/blog.example.com/wp-content/plugins/wp-optimize/cache/file-based-page-cache.php(31): wpo_url_in_conditional_tags_exceptions()\n#2 /var/www/blog.example.com/wp-content/advanced-cache.php(58): include_once(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#3 /var/www/blog.example.com/www/wp-settings.php(95): include(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#4 /var/www/blog.example.com/www/wp-config.php(81): require_once(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#5 /var/www/blog.example.com/www/wp-load.php(50): require_once(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#6 /var/www/blog.example.com/www/wp-blog-header.php(13): require_once(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#7 /var/www/blog.example.com/www/index.php(17): require(&amp;#39;&lt;/span&gt;...&lt;span style="color:#e6db74"&gt;&amp;#39;)\n#8 {main}\n thrown in /var/www/blog.example.com/wp-content/plugins/wp-optimize/cache/file-based-page-cac...&amp;#39;&lt;/span&gt;, referer: https://blog.example.com/blablablabla...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela peut se produire lors de l'installation ou bien lors d'une mise à jour manuelle / automatique.&lt;/p&gt;
&lt;h2 id="fix"&gt;&lt;a href="#fix" class="header-anchor"&gt;&lt;/a&gt;Fix
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter sur le serveur hébergeant le site.&lt;/li&gt;
&lt;li&gt;Supprimer le plugin &lt;code&gt;wp-optimize&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -r /var/www/blog.example.com/wp-content/plugins/wp-optimize
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Modifier le fichier &lt;code&gt;wp-config.php&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /var/www/blog.example.com/wp-config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Supprimer la ligne suivante :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;define&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;WP_CACHE&amp;#39;&lt;/span&gt;, true&lt;span style="color:#f92672"&gt;)&lt;/span&gt;; // WP-Optimize Cache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="re-install"&gt;&lt;a href="#re-install" class="header-anchor"&gt;&lt;/a&gt;Re-Install
&lt;/h2&gt;&lt;p&gt;Le module &lt;strong&gt;WP-Optimize&lt;/strong&gt; peut être réinstallé dans les extensions du site WordPress.&lt;/p&gt;</description></item><item><title>Nextcloud : Group Folders</title><link>https://slash-root.fr/nextcloud-group-folders/</link><pubDate>Thu, 05 May 2022 08:00:20 +0200</pubDate><guid>https://slash-root.fr/nextcloud-group-folders/</guid><description>&lt;img src="https://slash-root.fr/nextcloud-group-folders/cover.png" alt="Featured image of post Nextcloud : Group Folders" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Nextcloud est orienté utilisateurs.&lt;/p&gt;
&lt;p&gt;C'est à dire que si l'on souhaite partager des données à d'autres utilisateurs et/ou groupes d'utilisateurs, ces partages se retrouveront à la racine (par défaut) de chaque espace de travail des utilisateurs sans conserver toute l'arborescence.&lt;/p&gt;
&lt;p&gt;Un exemple concret :&lt;/p&gt;
&lt;p&gt;Un utilisateur nommé &amp;quot;Jean-Jacques&amp;quot; possède une arborescence comme suit :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ce dossier partagé se retrouvera à la racine (par défaut) du Nextcloud des destinataires concernés.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;L'arborescence complète ne sera pas visible.&lt;/p&gt;
&lt;p&gt;Cela n'est pas adapté si l'on souhaite partager toute une arborescence avec des droits spécifiques et diverses en son sein.&lt;/p&gt;
&lt;p&gt;C'est la que l'application &lt;code&gt;Group Folders&lt;/code&gt; intervient.&lt;/p&gt;
&lt;h2 id="group-folders"&gt;&lt;a href="#group-folders" class="header-anchor"&gt;&lt;/a&gt;Group Folders
&lt;/h2&gt;&lt;h3 id="présentation"&gt;&lt;a href="#pr%c3%a9sentation" class="header-anchor"&gt;&lt;/a&gt;Présentation
&lt;/h3&gt;&lt;p&gt;Group Folders est une application que l'on va pouvoir greffer à Nextcloud.&lt;/p&gt;
&lt;p&gt;Cette application va permettre de configurer des dossiers partagés à un / des groupe(s) d'utilisateurs.&lt;/p&gt;
&lt;p&gt;Ensuite, l'administrateur va pouvoir configurer finement des droits spécifiques (lecture / écriture / partage / quota) sur ces dossiers partagés.&lt;/p&gt;
&lt;p&gt;De plus l'intérêt est qu'avec cette application, les données ne seront plus dépendantes d'un utilisateur. Par exemple si Jean-Jacques est supprimé, toutes ces données seront supprimmées ainsi que les partages qu'il a pu faire.&lt;/p&gt;
&lt;p&gt;Lien vers le projet : &lt;a href="https://github.com/nextcloud/groupfolders"&gt;https://github.com/nextcloud/groupfolders&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="exemple"&gt;&lt;a href="#exemple" class="header-anchor"&gt;&lt;/a&gt;Exemple
&lt;/h3&gt;&lt;p&gt;Dans mon Nextcloud, je possède plusieurs utilisateurs repartis dans les groupes suivant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comptabilité&lt;/li&gt;
&lt;li&gt;Direction&lt;/li&gt;
&lt;li&gt;Technique&lt;/li&gt;
&lt;li&gt;Invité&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je souhaite déployer une arborescence de ce type au sein de mon Nextcloud :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── compta &lt;span style="color:#75715e"&gt;# Accessible en écriture au groupe comptabilité et en lecture au groupe direction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── note_de_frais
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── salaires
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── direction &lt;span style="color:#75715e"&gt;# Accessible en écriture au groupe direction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── courriers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── projets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── public &lt;span style="color:#75715e"&gt;# Accessible en écriture à tous les groupes sauf au groupe invité qui sera en lecture seule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── documents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── entreprise
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── technique &lt;span style="color:#75715e"&gt;# Accessible en écriture au groupe technique et en lecture au groupe direction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── manuels
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── procedures
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h3&gt;&lt;p&gt;Pour installer Group Folders, il faut se connecter en tant qu'&lt;code&gt;admin&lt;/code&gt; sur la plateforme Nextcloud puis se rendre dans les &lt;code&gt;Applications&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite, rechercher &lt;code&gt;Group Folders&lt;/code&gt; puis &lt;code&gt;Télécharger et activer&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="3.png" alt="image-20220422122832933" /&gt;&lt;/p&gt;
&lt;h3 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h3&gt;&lt;p&gt;Toujours en tant qu'&lt;code&gt;admin&lt;/code&gt;, se rendre dans les &lt;code&gt;Paramètres&lt;/code&gt; d'&lt;code&gt;Administration&lt;/code&gt; puis &lt;code&gt;Dossiers du groupe&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="4.png" alt="image-20220423111910824" /&gt;&lt;/p&gt;
&lt;p&gt;Créer dans un 1er temps les dossiers qui figureront à la racine des utilisateurs :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="5.png" alt="image-20220423112429345" /&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, y associer les groupes d'utilisateurs désirés avec les permissions adéquates :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="6.png" alt="image-20220423112646312" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ici pour le dossier &lt;code&gt;compta&lt;/code&gt;, le groupe &lt;code&gt;Comptabilité&lt;/code&gt; pourra lire et écrire et le groupe &lt;code&gt;Direction&lt;/code&gt; aura simplement un droit de lecture. Naturellement, je refuse que ces données soient partageables par les utilisateurs qui y auront accès.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est possible d'y définir un quota maximal :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="7.png" alt="image-20220423113054906" /&gt;&lt;/p&gt;
&lt;p&gt;Puis, définir qui pourra gérer les droits de ce dossier :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="8.png" alt="image-20220423113327341" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il faut que ce soit un utlisateur / groupe qui ait accès au dossier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Configurer l'intégralité des autorisations souhaitées comme suit :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="9.png" alt="image-20220423113730955" /&gt;&lt;/p&gt;
&lt;p&gt;Bien entendu, il faut ensuite créer les sous-dossiers dans chaque &lt;code&gt;Group Folders&lt;/code&gt; dans l'espace &lt;code&gt;Fichiers&lt;/code&gt; de Nextcloud.&lt;/p&gt;
&lt;p&gt;Maintenant, les utilisateurs verront uniquement ce à quoi ils doivent avoir accès à la racine de leur Nextcloud.&lt;/p&gt;
&lt;p&gt;Par exemple, pour mon utilisateur Pierre qui fait partie du groupe Comptabilité :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10.png" alt="image-20220423114901387" /&gt;&lt;/p&gt;
&lt;h3 id="autorisation-avancée"&gt;&lt;a href="#autorisation-avanc%c3%a9e" class="header-anchor"&gt;&lt;/a&gt;Autorisation avancée
&lt;/h3&gt;&lt;p&gt;Il est possible d'aller encore plus loin dans les autorisations.&lt;/p&gt;
&lt;p&gt;Je pourrais souhaiter qu'un utilisateur qui fait partie d'un groupe (ayant des autorisations d'écriture) ait finalement q'un droit de lecture (un stagiaire par exemple). Pour cela dans les détails d'un dossier, des règles d'autorisations avancées peuvent être appliquées :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11.png" alt="image-20220423115612503" /&gt;&lt;/p&gt;
&lt;p&gt;Ici, je dis que Pierre du groupe Comptabilité peut finalement que lire et non modifier ce qui se trouve dans ce dossier :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12.png" alt="image-20220423115750654" /&gt;&lt;/p&gt;
&lt;h2 id="ligne-de-commande"&gt;&lt;a href="#ligne-de-commande" class="header-anchor"&gt;&lt;/a&gt;Ligne de commande
&lt;/h2&gt;&lt;p&gt;L'intégralité de la configuration peut être réalisé en ligne de commande via &lt;code&gt;occ&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:create &amp;lt;name&amp;gt;&lt;/code&gt; → create a group folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:delete &amp;lt;folder_id&amp;gt; [-f|--force]&lt;/code&gt; → delete a group folder and all its contents&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:expire&lt;/code&gt; → trigger file version and trashbin expiration (see &lt;a href="https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/file_versioning.html"&gt;Nextcloud docs for versionning&lt;/a&gt; and &lt;a href="https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/trashbin_configuration.html"&gt;Nextcloud docs for the trash bin&lt;/a&gt; for details)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:group &amp;lt;folder_id&amp;gt; &amp;lt;group_id&amp;gt; [-d|--delete] [write|share|delete]&lt;/code&gt; → assign groups and their rights to a group folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:list&lt;/code&gt; → list configured group folders&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:permissions&lt;/code&gt; → configure advanced permissions (see below for details)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:quota &amp;lt;folder_id&amp;gt; [&amp;lt;quota&amp;gt;|unlimited]&lt;/code&gt; → set a quota for a group folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:rename &amp;lt;folder_id&amp;gt; &amp;lt;name&amp;gt;&lt;/code&gt; → rename a group folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:scan &amp;lt;folder_id&amp;gt;&lt;/code&gt; → trigger a filescan for a group folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;occ groupfolders:trashbin:cleanup &lt;/code&gt; → empty the trashbin of all group folders&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Group Folders permet d'aller beaucoup plus loin dans la gestion des droits que peut le faire naturellement Nextcloud.&lt;/p&gt;
&lt;p&gt;Et surtout, ces données ne sont pas dépendante d'un utilisateur.&lt;/p&gt;
&lt;p&gt;Bien entendu, cela est synchronisable avec les clients desktop Nextcloud Windows, Mac, Linux.&lt;/p&gt;</description></item><item><title>Pop!_OS 21.10 : Fix login on multiples monitors</title><link>https://slash-root.fr/pop_os-21-10-fix-login-on-multiples-monitors/</link><pubDate>Tue, 05 Apr 2022 11:05:22 +0200</pubDate><guid>https://slash-root.fr/pop_os-21-10-fix-login-on-multiples-monitors/</guid><description>&lt;img src="https://slash-root.fr/pop_os-21-10-fix-login-on-multiples-monitors/cover.png" alt="Featured image of post Pop!_OS 21.10 : Fix login on multiples monitors" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Lors de l'utilisation de plusieurs moniteurs, j'ai été confronté à un problème assez pénible.&lt;/p&gt;
&lt;p&gt;En effet, au démarrage de mon système la disposition de mes différents moniteurs s'appliquent &lt;strong&gt;après&lt;/strong&gt; l'ouverture de ma session.&lt;/p&gt;
&lt;p&gt;C'est à dire que je me suis retrouvé avec la saisie de mon login/password sur un moniteur qui n'est pas du tout mon écran principal.&lt;/p&gt;
&lt;p&gt;J'ai donc appliqué la méthode suivante...&lt;/p&gt;
&lt;h2 id="méthode"&gt;&lt;a href="#m%c3%a9thode" class="header-anchor"&gt;&lt;/a&gt;Méthode
&lt;/h2&gt;&lt;p&gt;Tout d'abord, j'ai effectué le réglage de mes moniteurs dans &lt;code&gt;Paramètres -&amp;gt; Ecrans&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="settings_monitors.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois cela fait, j'ai exporté cette configuration pour l'appliquer à &lt;code&gt;GDM&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp ~/.config/monitors.xml ~gdm/.config/monitors.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, j'ai modifié l'appartenance du fichier &lt;code&gt;monitors.xml&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown gdm:gdm ~gdm/.config/monitors.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant, mon invite de login, s'affiche bien sur mon écran principal.&lt;/p&gt;</description></item><item><title>GPO: Disable web search from taskbar</title><link>https://slash-root.fr/gpo-disable-web-search-from-taskbar/</link><pubDate>Thu, 24 Mar 2022 22:49:53 +0100</pubDate><guid>https://slash-root.fr/gpo-disable-web-search-from-taskbar/</guid><description>&lt;img src="https://slash-root.fr/gpo-disable-web-search-from-taskbar/cover.png" alt="Featured image of post GPO: Disable web search from taskbar" /&gt;&lt;h2 id="présentation"&gt;&lt;a href="#pr%c3%a9sentation" class="header-anchor"&gt;&lt;/a&gt;Présentation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Une machine Windows Server 2019 contrôleur de domaine.&lt;/li&gt;
&lt;li&gt;Une machine client sous Windows 10 Professionnel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Le but est de ne plus avoir l'onglet Web ni la mention &lt;em&gt;Rechercher sur le Web&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="159" width="300" decoding="async" src="image-20220310190211323.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="première-solution"&gt;&lt;a href="#premi%c3%a8re-solution" class="header-anchor"&gt;&lt;/a&gt;Première solution
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Dans le &lt;strong&gt;Gestionnaire du serveur / Outils / Gestion des stratégies de groupe&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="233" width="300" decoding="async" src="image-20220312210233691.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans &lt;strong&gt;Objets de stratégie de groupe / Clic droit -&amp;gt; Nouveau&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;Nommez votre stratégie et faites un &lt;strong&gt;clic droit / Modifier&lt;/strong&gt; sur votre nouvelle GPO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette fenêtre apparait :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="248" width="300" decoding="async" src="image-20220312202028603.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez une stratégie &lt;strong&gt;Configuration &lt;em&gt;Ordinateur / Modèles d'administration / Composants Windows / Rechercher&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activez les trois paramètres suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ne pas autoriser la recherche Web&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ne pas effectuer des recherches sur le Web ou afficher des résultats Web dans Search&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ne pas effectuer des recherches sur le Web ou afficher des résultats Web dans Search via des connexions limitées&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="75" width="300" decoding="async" src="image-20220312201045231.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pensez à positionnez votre nouvelle GPO sur l'unité organisationnelle concernée&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appliquez la GPO à l'aide de la commande &lt;strong&gt;gpudate /force&lt;/strong&gt; dans l'invite de commande&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpupdate /force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="deuxième-solution"&gt;&lt;a href="#deuxi%c3%a8me-solution" class="header-anchor"&gt;&lt;/a&gt;Deuxième solution
&lt;/h2&gt;&lt;p&gt;Il est possible que la première solution ne fonctionne pas, dans ce cas il faudra créer une GPO qui modifiera le registre.&lt;/p&gt;
&lt;p&gt;Toujours dans l'éditeur de gestion des stratégies de groupe, après avoir créé une nouvelle GPO :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionnez une stratégie &lt;strong&gt;Configuration utilisateur / Préférences / Paramètres Windows&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Effectuez un clic droit sur &lt;strong&gt;Registre / Nouveau / Élément Registre&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La fenetre suivante apparait :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="300" width="262" decoding="async" src="image-20220312203851972.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Remplissez cette fenêtre comme suit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Action : &lt;strong&gt;Créer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ruche : &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Chemin d'accès de la clé : &lt;strong&gt;Software\Policies\Microsoft\Windows\Explorer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nom de la valeur : &lt;strong&gt;DisableSearchBoxSuggestions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Type de valeur : &lt;strong&gt;REG_DWORD&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Données de valeur : &lt;strong&gt;1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="300" width="260" decoding="async" src="image-20220312204300470.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;L'élément de registre a bien été ajouté :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="36" width="300" decoding="async" src="image-20220312204631856.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pensez à positionnez votre nouvelle GPO sur l'unité organisationnelle concernée&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appliquez la GPO à l'aide de la commande &lt;strong&gt;gpudate /force&lt;/strong&gt; dans l'invite de commande&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpupdate /force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;L'onglet Web ainsi que la mention &lt;em&gt;Rechercher sur le web&lt;/em&gt; ont bien été désactivés :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="212" width="300" decoding="async" src="image-20220312205059110.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>Terminal: Le prompt avec Powerline sous LSD</title><link>https://slash-root.fr/terminal-le-prompt-avec-powerline/</link><pubDate>Sun, 20 Mar 2022 19:56:57 +0100</pubDate><guid>https://slash-root.fr/terminal-le-prompt-avec-powerline/</guid><description>&lt;img src="https://slash-root.fr/terminal-le-prompt-avec-powerline/cover.png" alt="Featured image of post Terminal: Le prompt avec Powerline sous LSD" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Je cherchais à améliorer mon prompt bash dans mon terminal afin d'améliorer mon expérience.&lt;/p&gt;
&lt;p&gt;Le résultat me satisfait pleinement. Il est épuré et agréable. De plus, cela m'a permis d'avoir une indication de la branche git sur laquelle je travaille ainsi que les codes erreurs de retour.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="git.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="error.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La personnalisation peut être plus avancée (se référer aux sources en bas de page).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="paramétrage"&gt;&lt;a href="#param%c3%a9trage" class="header-anchor"&gt;&lt;/a&gt;Paramétrage
&lt;/h2&gt;&lt;p&gt;Editer son fichier &lt;code&gt;.bashrc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajouter les lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;export POWERLINE_SEGMENTS&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;hostname pwd git git_sync status&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source ~/.powerline.bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Télécharger le fichier &lt;code&gt;powerline.bash&lt;/code&gt; et le déplacer dans sa home directory :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://gitlab.com/bersace/powerline.bash/-/raw/master/powerline.bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv powerline.bash ~/.powerline.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Télécharger le package de polices nécessaire &lt;code&gt;Hack Nerd Font&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/Hack.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si le dossier &lt;code&gt;~/.fonts&lt;/code&gt; n'existe pas, le créer !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir ~/.fonts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Décompresser l'archive des polices dans son dossier &lt;code&gt;~/.fonts&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unzip -d ~/.fonts Hack.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Supprimer l'archive &lt;code&gt;Hack.zip&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm Hack.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mettre à jour le cache des polices :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fc-cache -vf ~/.fonts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sélectionner la police &lt;code&gt;Hack Nerd Font&lt;/code&gt; pour son terminal :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="font.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il peut être utile de redémarrer son terminal pour avoir le choix des nouvelles polices installées 🙂&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maintenant, à l'ouverture de son terminal ce prompt apparait :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="prompt.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="lsd"&gt;&lt;a href="#lsd" class="header-anchor"&gt;&lt;/a&gt;LSD
&lt;/h2&gt;&lt;p&gt;Dans mes recherches, je suis également tombé sur un projet nommé &lt;code&gt;lsd&lt;/code&gt; (se référer aux sources en bas de page).&lt;/p&gt;
&lt;p&gt;Celui-ci permet d'afficher des icônes sympa en fonction du type de fichiers.&lt;/p&gt;
&lt;p&gt;Télécharger la dernière release dispo ici : &lt;a href="https://github.com/Peltoche/lsd/releases"&gt;https://github.com/Peltoche/lsd/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A l'heure où j'écris ces lignes c'est la version 0.21.0, donc pour ma Pop!_Os en 64 bits :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://github.com/Peltoche/lsd/releases/download/0.21.0/lsd_0.21.0_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Installer le paquet :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg -i lsd_0.21.0_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et voilà !&lt;/p&gt;
&lt;p&gt;Il suffit de remplacer la commande &lt;code&gt;ls&lt;/code&gt; par &lt;code&gt;lsd&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="lsd.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ces quelques alias peuvent être très agréables :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;alias ls&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;lsd&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;alias ll&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ls -lh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;alias la&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ls -ah&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;alias lla&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ls -lah&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;alias lt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ls --tree&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sources"&gt;&lt;a href="#sources" class="header-anchor"&gt;&lt;/a&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/powerline.bash"&gt;https://gitlab.com/bersace/powerline.bash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nerdfonts.com"&gt;https://www.nerdfonts.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Peltoche/lsd"&gt;https://github.com/Peltoche/lsd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Apache2 : Installation serveur web de base + SSL</title><link>https://slash-root.fr/apache2-installation-serveur-web-de-base-ssl/</link><pubDate>Tue, 08 Mar 2022 21:13:57 +0100</pubDate><guid>https://slash-root.fr/apache2-installation-serveur-web-de-base-ssl/</guid><description>&lt;img src="https://slash-root.fr/apache2-installation-serveur-web-de-base-ssl/cover.png" alt="Featured image of post Apache2 : Installation serveur web de base + SSL" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Cet article à pour but de servir de base pour l'installation d'un serveur web sous Apache2 avec un certificat SSL.&lt;/p&gt;
&lt;p&gt;Let's Encrypt est utilisé et la résolution du challenge se fera sur le port 666 (donc sans interruption de service).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Réalisé sous Debian 11&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="installation-apache2"&gt;&lt;a href="#installation-apache2" class="header-anchor"&gt;&lt;/a&gt;Installation Apache2
&lt;/h2&gt;&lt;p&gt;Installation du serveur web apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Modification du fichier &lt;code&gt;/etc/apache2/apache2.conf&lt;/code&gt; comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Les variables d&amp;#39;environnement sont définies dans /etc/apache2/envvars&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DefaultRuntimeDir ${APACHE_RUN_DIR}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PidFile ${APACHE_PID_FILE}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Timeout 300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;KeepAlive On&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MaxKeepAliveRequests 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;KeepAliveTimeout 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;User ${APACHE_RUN_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Group ${APACHE_RUN_GROUP}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;HostnameLookups Off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ErrorLog ${APACHE_LOG_DIR}/error.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogLevel warn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IncludeOptional mods-enabled/*.load&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IncludeOptional mods-enabled/*.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Include ports.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;Directory /&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Pas de suivi des liens symboliques&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Options -FollowSymLinks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;AllowOverride None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Require all denied&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;Directory /usr/share&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;AllowOverride None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Require all granted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;Directory /var/www/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Pas de listage des fichiers du site mais ok pour le suivi des liens symboliques&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Options -Indexes +FollowSymLinks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;AllowOverride None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Require all granted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;AccessFileName .htaccess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;FilesMatch &amp;#34;^\.ht&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Require all denied&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogFormat &amp;#34;%v:%p %h %l %u %t \&amp;#34;%r\&amp;#34; %&amp;gt;s %O \&amp;#34;%{Referer}i\&amp;#34; \&amp;#34;%{User-Agent}i\&amp;#34;&amp;#34; vhost_combined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogFormat &amp;#34;%h %l %u %t \&amp;#34;%r\&amp;#34; %&amp;gt;s %O \&amp;#34;%{Referer}i\&amp;#34; \&amp;#34;%{User-Agent}i\&amp;#34;&amp;#34; combined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogFormat &amp;#34;%h %l %u %t \&amp;#34;%r\&amp;#34; %&amp;gt;s %O&amp;#34; common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogFormat &amp;#34;%{Referer}i -&amp;gt; %U&amp;#34; referer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;LogFormat &amp;#34;%{User-agent}i&amp;#34; agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IncludeOptional conf-enabled/*.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IncludeOptional sites-enabled/*.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Modification du fichier &lt;code&gt;/etc/apache2/ports.conf&lt;/code&gt; comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Ecoute sur le port 80 et 443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Listen 80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Listen 443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Modification du fichier &lt;code&gt;/etc/apache2/conf-available/security.conf&lt;/code&gt; comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Definit les informations du serveur retourné par l&amp;#39;en-tête HTTP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ServerTokens Prod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Serveur version et nom du vhost désactivés&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ServerSignature Off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TraceEnable Off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activation des modules de bases :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2enmod rewrite actions headers expires ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activation du site par défaut en SSL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite default-ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Redémarrage du serveur web apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A ce stade, le serveur web doit être accessible : &lt;a href="http://ip_srv_web/"&gt;http://ip_srv_web/&lt;/a&gt; et &lt;a href="https://ip_srv_web/"&gt;https://ip_srv_web/&lt;/a&gt; (erreur de certificat)&lt;/p&gt;
&lt;p&gt;Une fois cette vérification faites, désactivation des sites par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2dissite 000-default default-ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis rechargement de la configuration du serveur web :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl reload apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="certificat-ssl"&gt;&lt;a href="#certificat-ssl" class="header-anchor"&gt;&lt;/a&gt;Certificat SSL
&lt;/h2&gt;&lt;p&gt;Installation de Let's Encrypt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install letsencrypt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Modification du fichier &lt;code&gt;/etc/apache2/mods-available/proxy.conf&lt;/code&gt; comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Permet d&amp;#39;effectuer les challenges acme sur le port 666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;IfModule mod_proxy.c&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ProxyPass &amp;#34;/.well-known/acme-challenge/&amp;#34; &amp;#34;http://127.0.0.1:666/.well-known/acme-challenge/&amp;#34; retry&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ProxyPassReverse &amp;#34;/.well-known/acme-challenge/&amp;#34; &amp;#34;http://127.0.0.1:666/.well-known/acme-challenge/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;lt;Location &amp;#34;/.well-known/acme-challenge/&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ProxyPreserveHost On
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Order allow,deny
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Allow from all
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Require all granted
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;lt;/Location&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activation des modules nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2enmod proxy proxy_http ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Redémarrer le serveur web apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edition de la crontab pour le renouvellement automatique du certificat :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Indiquer un renouvellement tous les dimanche à 5h00 du matin :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Autorenew let&amp;#39;s encrypt cert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;00 05 * * 0 letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port 666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Générer le certificat :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo letsencrypt certonly -d &lt;span style="color:#e6db74"&gt;&amp;#34;monsite.example.org&amp;#34;&lt;/span&gt; --standalone --preferred-challenges http-01 --http-01-port &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; -m monadresse@email.org --agree-tos -n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Au préalable, un enregistrement DNS correspondant à mon site.example.org a été fait dans la zone DNS example.org.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuration-vhost"&gt;&lt;a href="#configuration-vhost" class="header-anchor"&gt;&lt;/a&gt;Configuration vhost
&lt;/h2&gt;&lt;p&gt;Création du fichier &lt;code&gt;/etc/apache2/sites-available/monsite.example.org.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example pour le site : monsite.example.org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# DirectoryRoot : /var/www/monsite.example.org/www/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Les logs seront dans /var/log/apache2/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ServerName monsite.example.org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Redirect Permanent / https://monsite.example.org/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;VirtualHost *:443&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ServerName monsite.example.org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;LogLevel warn &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ErrorLog &amp;#34;|/usr/bin/rotatelogs -lc /var/log/apache2/error.monsite.example.org.%Y.%m.%d 86400&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;CustomLog &amp;#34;|/usr/bin/rotatelogs -lc /var/log/apache2/access.monsite.example.org.%Y.%m.%d 86400&amp;#34; combined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SSLEngine on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SSLCertificateFile /etc/letsencrypt/live/monsite.example.org/cert.pem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SSLCertificateKeyFile /etc/letsencrypt/live/monsite.example.org/privkey.pem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SSLCertificateChainFile /etc/letsencrypt/live/monsite.example.org/chain.pem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;DocumentRoot /var/www/monsite.example.org/www&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;&amp;lt;Directory /var/www/monsite.example.org/www/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Require all granted &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;AllowOverride All&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;DirectoryIndex index.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SSLProtocol -all +TLSv1.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SSLCipherSuite +HIGH:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305-D:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SSLHonorCipherOrder on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SSLCompression off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SSLSessionTickets off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Création de l'arborescence du site :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /var/www/monsite.example.org/www/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Déplacer le fichier &lt;code&gt;index.html&lt;/code&gt; de base à des fins de test :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mv /var/www/html/index.html /var/www/monsite.example.org/www/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Attribuer les droits pour &lt;code&gt;www-data&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R www-data:www-data /var/www/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activation du site &lt;code&gt;monsite.example.org&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite monsite.example.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recharger le serveur web apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl reload apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérification"&gt;&lt;a href="#v%c3%a9rification" class="header-anchor"&gt;&lt;/a&gt;Vérification
&lt;/h2&gt;&lt;p&gt;Si tout c'est bien passé, le site &lt;code&gt;monsite.example.org&lt;/code&gt; doit être accessible à l'adresse &lt;a href="https://monsite.example.org"&gt;https://monsite.example.org&lt;/a&gt; sans erreur de certificat.&lt;/p&gt;
&lt;p&gt;L'URL &lt;a href="http://monsite.example.org"&gt;http://monsite.example.org&lt;/a&gt; doit rediriger vers &lt;a href="https://monsite.example.org"&gt;https://monsite.example.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour tester le renouvellement du certificat SSL sur le port 666 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port &lt;span style="color:#ae81ff"&gt;666&lt;/span&gt; --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="sujet-non-abordé"&gt;&lt;a href="#sujet-non-abord%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Sujet non abordé
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Les règles de pare-feu&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Network-Manager : Configuration d’un réseau bridgé pour QEMU/KVM</title><link>https://slash-root.fr/network-manager-configuration-dun-reseau-bridge-pour-qemu-kvm/</link><pubDate>Tue, 08 Mar 2022 20:27:38 +0100</pubDate><guid>https://slash-root.fr/network-manager-configuration-dun-reseau-bridge-pour-qemu-kvm/</guid><description>&lt;img src="https://slash-root.fr/network-manager-configuration-dun-reseau-bridge-pour-qemu-kvm/cover.png" alt="Featured image of post Network-Manager : Configuration d’un réseau bridgé pour QEMU/KVM" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;J'utilise virt-manager pour gérer mes VMs sous QEMU/KVM et je suis sous Pop!_OS 21.10.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Voir &lt;a href="https://slash-root.fr/2022/01/31/virt-manager-installation/"&gt;/2022/01/31/virt-manager-installation/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le réseau de ma machine hôte est prise en charge par &lt;strong&gt;Network-Manager&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;J'ai eu le besoin de créer des VMs avec un réseau bridgé sur mon LAN.&lt;/p&gt;
&lt;p&gt;Pour se faire je suis passé par l'interface graphique de ma Pop!_OS 21.10.&lt;/p&gt;
&lt;p&gt;Cet article me fait office de mémo.&lt;/p&gt;
&lt;h2 id="création-dun-pont"&gt;&lt;a href="#cr%c3%a9ation-dun-pont" class="header-anchor"&gt;&lt;/a&gt;Création d&amp;rsquo;un pont
&lt;/h2&gt;&lt;p&gt;Lancer la configuration avancée du réseau :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nm-connection-editor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Créer un &lt;code&gt;Pont&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="create_bridge.png" alt="create_bridge" /&gt;&lt;/p&gt;
&lt;p&gt;Ajouter un pont vers une interface réseau :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="add_nic.png" alt="add_nic" /&gt;&lt;/p&gt;
&lt;p&gt;Sélectionner l'interface réseau à lié au pont :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="link_nic.png" alt="link_nic" /&gt;&lt;/p&gt;
&lt;p&gt;Configurer l'adressage IP souhaité :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="config_ip.png" alt="config_ip" /&gt;&lt;/p&gt;
&lt;p&gt;Supprimer la connexion liée au pont précédement créé :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="del_nic.png" alt="del_nic" /&gt;&lt;/p&gt;
&lt;p&gt;Redémarrer le service Network-Manager :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart NetworkManager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier la configuration avec la commande &lt;code&gt;ip a&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="check_ip.png" alt="check_ip" /&gt;&lt;/p&gt;
&lt;h2 id="configuration-réseau-vm"&gt;&lt;a href="#configuration-r%c3%a9seau-vm" class="header-anchor"&gt;&lt;/a&gt;Configuration réseau VM
&lt;/h2&gt;&lt;p&gt;Dans les propriétés réseau de la VM, passer la configuration réseau en &lt;code&gt;Bridge&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="vm_bridge.png" alt="vm_bridge" /&gt;&lt;/p&gt;
&lt;p&gt;La VM sera maintenant visible comme une machine à part entière sur le LAN de mon hôte.&lt;/p&gt;</description></item><item><title>Pop!_OS 21.10 : Modifier CAPS LOCK pour les chiffres</title><link>https://slash-root.fr/pop_os-21-10-modifier-caps-lock-pour-les-chiffres/</link><pubDate>Tue, 01 Feb 2022 10:04:54 +0100</pubDate><guid>https://slash-root.fr/pop_os-21-10-modifier-caps-lock-pour-les-chiffres/</guid><description>&lt;img src="https://slash-root.fr/pop_os-21-10-modifier-caps-lock-pour-les-chiffres/cover.png" alt="Featured image of post Pop!_OS 21.10 : Modifier CAPS LOCK pour les chiffres" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Lors de l'installation de Pop!_OS sur certaines machines, la touche &lt;code&gt;CAPS LOCK&lt;/code&gt; permet d'écrire les majuscules accentuées mais pas les chiffres.&lt;/p&gt;
&lt;p&gt;Il est possible de changer ce comportement. Par contre, il ne sera plus possible d'utiliser cette touche pour les majuscules accentuées.&lt;/p&gt;
&lt;p&gt;Dans mon cas de figure, j'ai la disposition du clavier en français standard et ma touche &lt;code&gt;CAPS LOCK&lt;/code&gt; ne me permet pas d'écrire les chiffres (Je n'ai aucun besoin des majuscules accentuées).&lt;/p&gt;
&lt;p&gt;J'ai donc appliqué la méthode suivante...&lt;/p&gt;
&lt;h2 id="méthode"&gt;&lt;a href="#m%c3%a9thode" class="header-anchor"&gt;&lt;/a&gt;Méthode
&lt;/h2&gt;&lt;p&gt;Editer le fichier &lt;strong&gt;/usr/share/X11/xkb/symbols/fr&lt;/strong&gt; en tant que root :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /usr/share/X11/xkb/symbols/fr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Repérer la ligne suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;include &lt;span style="color:#e6db74"&gt;&amp;#34;latin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et juste en-dessous, insérer ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;include &lt;span style="color:#e6db74"&gt;&amp;#34;mswindows-capslock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, créer le fichier &lt;strong&gt;/usr/share/X11/xkb/symbols/mswindows-capslock&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /usr/share/X11/xkb/symbols/mswindows-capslock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Insérer les lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;// Replicate a &amp;#34;feature&amp;#34; of MS Windows on AZERTY keyboards &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;// where Caps Lock also acts as a Shift Lock on number keys.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;// Include keys &amp;lt;AE01&amp;gt; to &amp;lt;AE10&amp;gt; in the FOUR_LEVEL_ALPHABETIC key type.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;partial alphanumeric_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xkb_symbols &amp;#34;basic&amp;#34; {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;key &amp;lt;AE01&amp;gt; { type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ ampersand, 1, bar, exclamdown ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE02&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ eacute, 2, at, oneeighth ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE03&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ quotedbl, 3, numbersign, sterling ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE04&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [apostrophe, 4, onequarter, dollar ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE05&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ parenleft, 5, onehalf, threeeighths ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE06&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ section, 6, asciicircum, fiveeighths ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE07&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ egrave, 7, braceleft, seveneighths ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE08&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ exclam, 8, bracketleft, trademark ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE09&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ ccedilla, 9, braceleft, plusminus ] };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key &amp;lt;AE10&amp;gt; { type= &amp;#34;FOUR_LEVEL_ALPHABETIC&amp;#34;, [ agrave, 0, braceright, degree ] };&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enregistrer et redémarrer la machine.&lt;/p&gt;</description></item><item><title>Pop!_OS 21.10 : Fix transparent Firefox with Integrated Graphics</title><link>https://slash-root.fr/pop_os-21-10-fix-transparent-firefox-with-integrated-graphics/</link><pubDate>Tue, 01 Feb 2022 08:29:34 +0100</pubDate><guid>https://slash-root.fr/pop_os-21-10-fix-transparent-firefox-with-integrated-graphics/</guid><description>&lt;img src="https://slash-root.fr/pop_os-21-10-fix-transparent-firefox-with-integrated-graphics/cover.png" alt="Featured image of post Pop!_OS 21.10 : Fix transparent Firefox with Integrated Graphics" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Mon laptop sous Pop!_OS 21.10 possède 2 GPUs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 dédié NVIDIA&lt;/li&gt;
&lt;li&gt;1 intégré INTEL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lorsque je suis en mode graphique &lt;code&gt;Nvidia&lt;/code&gt; ou &lt;code&gt;Hybrid&lt;/code&gt;, mon navigateur Firefox se lance correctement.&lt;/p&gt;
&lt;p&gt;Par contre, lorsque je suis en mode graphique &lt;code&gt;Integrated&lt;/code&gt; (donc avec exclusivement mon GPU Intel), Firefox se lance 2 fois sur 3 avec une fenètre transparente :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="firefox_transparent.png" alt="firefox_transparent" /&gt;&lt;/p&gt;
&lt;h2 id="cause"&gt;&lt;a href="#cause" class="header-anchor"&gt;&lt;/a&gt;Cause
&lt;/h2&gt;&lt;p&gt;Cela est dû au non chargement des librairies ICD nécessaires pour l'IGPU.&lt;/p&gt;
&lt;h2 id="correctif"&gt;&lt;a href="#correctif" class="header-anchor"&gt;&lt;/a&gt;Correctif
&lt;/h2&gt;&lt;p&gt;Pour corriger cela, j'ai ajouté les lignes suivantes dans mon fichier &lt;code&gt;~/.profile&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# fix firefox in integrated graphics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ! grep -w -q nvidia &amp;lt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;lsmod&lt;span style="color:#f92672"&gt;)&lt;/span&gt; ; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; export __EGL_VENDOR_LIBRARY_FILENAMES&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/share/glvnd/egl_vendor.d/50_mesa.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, j'ai déconnecté et reconnecté mon utilisateur.&lt;/p&gt;
&lt;p&gt;Maintenant, le problème est corrigé. Firefox se lance désormais correctement lorsque mon laptop fonctionne uniquement sur l'iGPU.&lt;/p&gt;</description></item><item><title>Virt-Manager : Installation</title><link>https://slash-root.fr/virt-manager-installation/</link><pubDate>Mon, 31 Jan 2022 18:01:43 +0100</pubDate><guid>https://slash-root.fr/virt-manager-installation/</guid><description>&lt;img src="https://slash-root.fr/virt-manager-installation/cover.png" alt="Featured image of post Virt-Manager : Installation" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Le contexte est simple. Je souhaitais avoir de meilleures performances sur mes machines virtuelles Linux qu'avec l'excellent VirtualBox.&lt;/p&gt;
&lt;p&gt;J'ai donc entrepris l'installation de l'outil virt-manager.&lt;/p&gt;
&lt;p&gt;Virt-manager permet de gérer graphiquement les machines virtuelles sur le module KVM qui fait partie du noyau Linux.&lt;/p&gt;
&lt;p&gt;Cet article me fait office de mémo. J'ai réalisé cette installation sous Pop!_OS 21.10.&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;p&gt;Tout d'abord, l'installation des paquets indispensables :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install qemu qemu-kvm libvirt-daemon-system python3-docutils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install python3-distutils gir1.2-libvirt-glib-1.0 libosinfo-1.0-dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install python3-libvirt python3-libxml2 gir1.2-gtk-vnc-2.0 gir1.2-spiceclientgtk-3.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, l'installation de virt-manager :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install virt-manager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant l'outil est exécutable avec la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;virt-manager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;La connexion à l'hyperviseur se verra refusée car celle-ci nécessite, à ce stade, de se faire en tant que &lt;code&gt;root&lt;/code&gt;. Voir la section &lt;strong&gt;Permission&lt;/strong&gt; de cet article pour une exécution avec un compte utilisateur standard. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="permission"&gt;&lt;a href="#permission" class="header-anchor"&gt;&lt;/a&gt;Permission
&lt;/h2&gt;&lt;p&gt;A ce stade, l'utilisation de virt-manager est possible mais la connexion à l'hyperviseur QEMU/KVM n'est possible qu'avec l'utilisateur root.&lt;/p&gt;
&lt;p&gt;Afin de pouvoir me connecter à mon hyperviseur avec mon compte utilisateur, j'ai d'abord vérifié que je faisais bien partie du groupe &lt;code&gt;libvirt&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo getent group | grep libvirt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans mon cas présent, cela était déjà effectif mais dans le cas contraire, il faut créer le groupe et ajouter l'utilisateur en cours :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo groupadd --system libvirt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -a -G libvirt &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;whoami&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;newgrp libvirt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L'appartenance au groupe pour l'utilisateur en cours peut être vérifiée :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;whoami&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, j'ai édité le fichier &lt;code&gt;libvirtd.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/libvirt/libvirtd.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'ai modifié ces 2 lignes comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;unix_sock_group&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;libvirt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;unix_sock_rw_perms&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0770&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, j'ai redémarré le service &lt;code&gt;libvirtd.service&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart libvirtd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A présent, l'outil &lt;code&gt;virt-manager&lt;/code&gt; peut se connecter sans être root à l'hyperviseur QEMU/KVM.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="gui.png" alt="gui" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans mon cas, j'ai dû tout de même redémarrer mon système afin que la configuration soit prise en compte.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>OneDrive : Client Linux OpenSource</title><link>https://slash-root.fr/onedrive-client-linux-opensource/</link><pubDate>Fri, 14 Jan 2022 14:56:22 +0100</pubDate><guid>https://slash-root.fr/onedrive-client-linux-opensource/</guid><description>&lt;img src="https://slash-root.fr/onedrive-client-linux-opensource/cover.jpg" alt="Featured image of post OneDrive : Client Linux OpenSource" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Dans le cadre de mon travail, j'ai récement migré sur Pop!_OS pour mon environnement du quotidien. Etant un utilisateur de plusieurs comptes OneDrive (perso &amp;amp; pro), il me fallait pouvoir synchroniser ceux-ci dans des dossiers différents de mon système.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mon compte OneDrive perso dans &lt;code&gt;~/OneDrive_Perso&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mon compte OneDrive pro dans &lt;code&gt;~/OneDrive_Pro&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bien evidément, cela doit fonctionner en tant que service.&lt;/p&gt;
&lt;p&gt;Je suis tombé sur ce projet : &lt;a href="https://github.com/skilion/onedrive"&gt;https://github.com/skilion/onedrive&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update 07/12/2023 :&lt;br /&gt;
Le projet utilisé dans cet article est stoppé.&lt;br /&gt;
Utiliser / Adapter avec celui-ci : &lt;a href="https://github.com/abraunegg/onedrive.git"&gt;https://github.com/abraunegg/onedrive.git&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;C'est un outil sous licence GPL3 permettant d'intéragir avec OneDrive sous Linux.&lt;/p&gt;
&lt;p&gt;Les fonctionnalités sont les suivantes : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;State caching&lt;/li&gt;
&lt;li&gt;Real-Time file monitoring with Inotify&lt;/li&gt;
&lt;li&gt;Resumable uploads&lt;/li&gt;
&lt;li&gt;Support OneDrive for Business (part of Office 365)&lt;/li&gt;
&lt;li&gt;Shared folders (only OneDrive Personal)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ajouterai également qu'il est possible de faire du multi-comptes.&lt;/p&gt;
&lt;p&gt;C'est parfait car c'est mon besoin 🙂&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;p&gt;Pour information, j'ai réalisé cette installation sous Pop!_OS 21.10 mais celle-ci devrait fonctionner à partir des dérivés d'Ubuntu 18+. Pour Fedora, CentOS, ArchLinux, se référer directement à la page du projet cité plus haut.&lt;/p&gt;
&lt;p&gt;Tout d'abord l'installation des pré-requis :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install git libcurl4-openssl-dev libsqlite3-dev snap snapd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install --classic dmd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis le clonage du projet et l'installation de l'outil :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/skilion/onedrive.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;p&gt;La configuration est optionnelle. Par défaut, tous les fichiers seront stockés dans &lt;code&gt;~/OneDrive&lt;/code&gt; et les fichiers/dossiers commençant par &lt;code&gt;.&lt;/code&gt; et &lt;code&gt;~&lt;/code&gt; seront ignorés.&lt;/p&gt;
&lt;p&gt;3 directives sont définissables :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sync_dir&lt;/code&gt; : Le répertoire où seront stockés les données.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;skip_file&lt;/code&gt; : Les fichiers / dossiers à ne pas synchroniser. L'utilisation des wildcards &lt;code&gt;*&lt;/code&gt; et &lt;code&gt;?&lt;/code&gt; sont autorisés. Le &lt;code&gt;|&lt;/code&gt; peut être employé pour séparer différents patterns.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L'outil doit être relancé avec l'argument &lt;code&gt;--resync&lt;/code&gt; après une modification de la directive &lt;code&gt;skip_file&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sync_list&lt;/code&gt; : Spécifier les fichiers / dossiers à synchroniser. J'en parlerai dans un prochain article.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L'outil doit être relancé avec l'argument &lt;code&gt;--resync&lt;/code&gt; après une modification de la directive &lt;code&gt;skip_file&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme je veux utiliser 2 configurations différentes (une perso et une pro), j'ai créé 1 répertoire pour chaque compte où seront stockés mes données respectives :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p ~/&lt;span style="color:#f92672"&gt;{&lt;/span&gt;OneDrive_Perso,OneDrive_Pro&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, j'ai créé 2 dossiers de configuration (un dossier par compte) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p ~/.config/&lt;span style="color:#f92672"&gt;{&lt;/span&gt;onedrive_perso,onedrive_pro&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'ai ensuite créé mes 2 fichiers de configurations (un fichier par compte).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OneDrive perso :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; ~/.config/onedrive_perso/config &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# Directory where the files will be synced
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;sync_dir = &amp;#34;~/OneDrive_Perso&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# Skip files and directories that match this pattern
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;skip_file = &amp;#34;.*|~*&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OneDrive pro :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; ~/.config/onedrive_pro/config &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# Directory where the files will be synced
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;sync_dir = &amp;#34;~/OneDrive_Pro&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# Skip files and directories that match this pattern
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;skip_file = &amp;#34;.*|~*&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="initialisation"&gt;&lt;a href="#initialisation" class="header-anchor"&gt;&lt;/a&gt;Initialisation
&lt;/h2&gt;&lt;p&gt;L'étape suivante que j'ai réalisé a été de lier chaque configuration (perso et pro) à un compte OneDrive. Pour se faire j'ai exécuté dans un 1er temps la synchronisation de mon OneDrive perso :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;onedrive --monitor --confdir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;~/.config/onedrive_perso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un lien est généré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Authorize this app visiting:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;22c49a0d-d21c-4792-aed1-8f163c982546&amp;amp;scope&lt;span style="color:#f92672"&gt;=&lt;/span&gt;files.readwrite%20files.readwrite.all%20offline_access&amp;amp;response_type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;code&amp;amp;redirect_uri&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://login.microsoftonline.com/common/oauth2/nativeclient
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter the response uri:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En visitant cette URL, une authentification sur le compte OneDrive désiré est demandé. Puis, viens une page blanche (ou noire suivant votre thème) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="URI_init.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;J'ai copié l'URI de cette page en réponse à mon prompt &lt;code&gt;Enter the response uri:&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;La synchro démarre (oui, j'aime bien watch dogs legion...) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sync_init.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, je teste mon compte OneDrive_Pro :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;onedrive --monitor --confdir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;~/.config/onedrive_pro&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Il est important de libèrer le token office avant. J'étais, au préalablement, identifié sur mon compte perso.&lt;/p&gt;
&lt;p&gt;Pour cela, je me suis déconnecté avec mon navigateur internet de mon compte office perso précédement connecté à l'aide de l'URL suivante : &lt;a href="https://www.office.com/?auth=2"&gt;https://www.office.com/?auth=2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="URI_pro.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="5-services"&gt;&lt;a href="#5-services" class="header-anchor"&gt;&lt;/a&gt;5. Services
&lt;/h2&gt;&lt;p&gt;Lors de l'installation de l'outil un service a été créé : &lt;code&gt;/usr/lib/systemd/user/onedrive.service&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J'ai décidé de garder ce service pour mon compte perso et d'en créer un second pour mon compte pro :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /usr/lib/systemd/user/onedrive.service /usr/lib/systemd/user/onedrive_pro.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'ai ensuite édité mon 1er service (onedrive perso) pour correspondre à sa configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /usr/lib/systemd/user/onedrive.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, j'ai modifié la ligne &lt;code&gt;ExecStart&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ExecStart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/usr/local/bin/onedrive --monitor --confdir=&amp;#34;~/.config/onedrive_perso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et enfin la même modification pour mon serive OneDrive pro :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /usr/lib/systemd/user/onedrive_pro.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette fois-ci, j'ai modifié comme suit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ExecStart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/usr/local/bin/onedrive --monitor --confdir=&amp;#34;~/.config/onedrive_pro&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour terminer, j'ai activé mes 2 services :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl --user enable onedrive.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl --user enable onedrive_pro.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl --user start onedrive.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl --user start onedrive_pro.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="6-vérifications--logs"&gt;&lt;a href="#6-v%c3%a9rifications--logs" class="header-anchor"&gt;&lt;/a&gt;6. Vérifications / Logs
&lt;/h2&gt;&lt;p&gt;Pour vérifier le bon fonctionnement des services, j'utilise ces 2 commandes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl --user-unit onedrive -f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl --user-unit onedrive_pro -f
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="7-désinstallation"&gt;&lt;a href="#7-d%c3%a9sinstallation" class="header-anchor"&gt;&lt;/a&gt;7. Désinstallation
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make uninstall
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf ~/.config/onedrive*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Supervision et autodiscover: Open Centreon Discovery</title><link>https://slash-root.fr/supervision-et-autodiscover-open-centreon-discovery/</link><pubDate>Tue, 14 Dec 2021 11:03:02 +0100</pubDate><guid>https://slash-root.fr/supervision-et-autodiscover-open-centreon-discovery/</guid><description>&lt;img src="https://slash-root.fr/supervision-et-autodiscover-open-centreon-discovery/cover.png" alt="Featured image of post Supervision et autodiscover: Open Centreon Discovery" /&gt;&lt;h2 id="présentation"&gt;&lt;a href="#pr%c3%a9sentation" class="header-anchor"&gt;&lt;/a&gt;Présentation
&lt;/h2&gt;&lt;p&gt;Open Centreon Discover est un module indépendant qui permet l'autodiscover des équipements SNMP, de les ajouter à la plateforme Centreon à l'aide de CLAPI. &lt;/p&gt;
&lt;p&gt;OCD permet également un scan des réseaux en tâche de fond, et cerise sur la gateau, il est possible d'affecter automatiquement les templates en fonction de l'OS détecté.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source: &lt;a href="https://www.sugarbug.fr/atelier/techniques/ihmweb/open-centreon-discovery/"&gt;L'atelier de Kermith&lt;/a&gt; et &lt;a href="https://github.com/romnvll/Open-Centreon-Discovery"&gt;Github du créateur&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="téléchargement-du-module"&gt;&lt;a href="#t%c3%a9l%c3%a9chargement-du-module" class="header-anchor"&gt;&lt;/a&gt;Téléchargement du module
&lt;/h3&gt;&lt;p&gt;Créer un dossier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir /usr/share/discovery
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Récupérer le dépôt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/romnvll/Open-Centreon-Discovery.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-dapache"&gt;&lt;a href="#configuration-dapache" class="header-anchor"&gt;&lt;/a&gt;Configuration d&amp;rsquo;Apache
&lt;/h3&gt;&lt;p&gt;Pour qu'Apache reconnaisse OCD, il faut créer le fichier de configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim /etc/httpd/conf.d/discovery.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copiez ces lignes dans le fichier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;###########################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Alias /discovery /usr/share/discovery/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;LocationMatch ^/discovery/&lt;span style="color:#f92672"&gt;(&lt;/span&gt;.*&lt;span style="color:#ae81ff"&gt;\.&lt;/span&gt;php&lt;span style="color:#f92672"&gt;(&lt;/span&gt;/.*&lt;span style="color:#f92672"&gt;)&lt;/span&gt;?&lt;span style="color:#f92672"&gt;)&lt;/span&gt;$&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ProxyPassMatch fcgi://127.0.0.1:9042/usr/share/discovery/$1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/LocationMatch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyTimeout &lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;Directory &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/share/discovery&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DirectoryIndex index.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Options Indexes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AllowOverride all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Order allow,deny
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Allow from all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Require all granted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;IfModule mod_php5.c&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; php_admin_value engine Off
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/IfModule&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AddType text/plain hbs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/Directory&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RedirectMatch ^/$ /discovery
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;###########################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;En fonction de votre configuration vous devrez modifier le port d'écoute de php-fpm (904x). Pour savoir quel port est utilisé: &lt;code&gt;netstat -paunt | grep php&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Redémarrez Apache:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart httpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installation-des-fichiers"&gt;&lt;a href="#installation-des-fichiers" class="header-anchor"&gt;&lt;/a&gt;Installation des fichiers
&lt;/h3&gt;&lt;p&gt;Déplacez vous dans le dossier téléchargé au préalable et copiez les fichiers dans son répertoire dédié:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd Open-Centreon-Discovery
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp -r * /usr/share/discovery
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour que le scan en tâche de fond puisse être réalisé, Apache nécessite les permissions sur ce dossier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chown -R apache: /usr/share/discovery
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Modifiez le fichier de configuration d'OCD. Un fichier d'exemple de configuration existe déjà, je vous suggère de l'utiliser (vous pouvez utiliser le fichier d'exemple déjà présent mais il faudra le renommer):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv /usr/share/discovery/config&lt;span style="color:#f92672"&gt;{&lt;/span&gt;php.example,php&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim /usr/share/config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Placez y le login/password d'un utilisateur ayant les droits de modification avec CLAPI, ainsi que le chemin de CLAPI (&lt;code&gt;admin&lt;/code&gt; dispose des droits, mais vous pouvez créer un utilisateur de service dédié à cela) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;//Vos identifiants centreon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$config&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;centreon&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;][&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$config&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;centreon&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;][&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;//chemin de clapi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$config&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;centreon&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;][&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;clapi&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/usr/share/centreon/bin/centreon&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="scanner-manuellement-le-réseau"&gt;&lt;a href="#scanner-manuellement-le-r%c3%a9seau" class="header-anchor"&gt;&lt;/a&gt;Scanner manuellement le réseau
&lt;/h2&gt;&lt;h3 id="connexion-à-linterface-du-module"&gt;&lt;a href="#connexion-%c3%a0-linterface-du-module" class="header-anchor"&gt;&lt;/a&gt;Connexion à l&amp;rsquo;interface du module
&lt;/h3&gt;&lt;p&gt;Connectez vous à l'interface web d'OCD avec l'url &lt;code&gt;http://ip-centreon-central/discovery&lt;/code&gt; avec l'utilisateur que vous avez déclaré dans le fichier &lt;code&gt;config.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="index-OCD.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Vous arriverez alors sur la page suivante:&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="recherche-OCD.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Si à ce moment vous tombez sur une page blanche, il se peut que vous identifiants soient incorrects. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;u&gt;La découverte SNMP avec ce module ne prend en charge que la v1 et la v2c.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Nous reviendrons plus tard sur le message concernant le scan en tâche de fond.&lt;/p&gt;
&lt;h3 id="configuration-du-réseau-à-scanner"&gt;&lt;a href="#configuration-du-r%c3%a9seau-%c3%a0-scanner" class="header-anchor"&gt;&lt;/a&gt;Configuration du réseau à scanner
&lt;/h3&gt;&lt;p&gt;Pour lancer votre premier scan afin de trouver des hôtes qui ne seraient pas intégrés à votre plateforme Centreon, vous devez entrer manuellement les informations nécessaires au scan: le réseau, la communauté snmp, la version et le timeout.&lt;/p&gt;
&lt;p&gt;Une fois ces paramètres rentrés, cliquez sur le bouton Scan.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="conf-scan-rsx.png" alt="" /&gt;&lt;/p&gt;
&lt;h4 id="le-réseau"&gt;&lt;a href="#le-r%c3%a9seau" class="header-anchor"&gt;&lt;/a&gt;Le réseau
&lt;/h4&gt;&lt;p&gt;Il s'agit du sous-réseau en notation CIDR sur lequel vous voulez détecter des hôtes.&lt;/p&gt;
&lt;h4 id="la-communauté"&gt;&lt;a href="#la-communaut%c3%a9" class="header-anchor"&gt;&lt;/a&gt;La communauté
&lt;/h4&gt;&lt;p&gt;Il n'est pas forcément nécessaire de configurer le fichier de configuration snmpd.conf si vous utilisez la communauté &lt;code&gt;public&lt;/code&gt; avec ses paramètres par défaut, mais dans le cas où vous souhaiteriez utiliser une communauté personnalisé avec vos propres vues et ouvertures de MIB, petit rappel :&lt;/p&gt;
&lt;p&gt;Déplacez le fichier de conf par défaut et créez le votre:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv /etc/snmp/snmpd.&lt;span style="color:#f92672"&gt;{&lt;/span&gt;conf,conf.default&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Il est toujours utile de garder de côté ce fichier par défaut.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim /etc/snmp/snmpd.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;agentAddress udp:161
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# sec.name source community&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;com2sec masecu ip.srv.centreon macommu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# groupname securityModel securityName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;group groupdesecu v1 masecu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;group groupdesecu v2c masecu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# name incl/excl subtree mask(optional)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;view mavue included .1.3.6.1.2.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;view mavue included .1.3.6.1.2.1.25.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# group context sec.model sec.level prefix read write notif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;access groupedesecu &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; any noauth exact mavue none none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Redémarrez snmpd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart snmpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="la-version"&gt;&lt;a href="#la-version" class="header-anchor"&gt;&lt;/a&gt;La version
&lt;/h4&gt;&lt;p&gt;Il s'agit tout simplement de la version utilisée pour &lt;/p&gt;
&lt;h4 id="le-timeout"&gt;&lt;a href="#le-timeout" class="header-anchor"&gt;&lt;/a&gt;Le timeout
&lt;/h4&gt;&lt;p&gt;Si le scan est trop long vous pouvez redescendre ce timeout à des valeurs inférieures. Attention toutefois, un timeout trop court peut empêcher la découverte de certains équipements.&lt;/p&gt;
&lt;h3 id="le-résultat-du-scan"&gt;&lt;a href="#le-r%c3%a9sultat-du-scan" class="header-anchor"&gt;&lt;/a&gt;Le résultat du scan
&lt;/h3&gt;&lt;p&gt;Après avoir cliqué sur &lt;code&gt;Scan&lt;/code&gt;, au bout de quelques secondes vous arriverez sur cette page:&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="resultscan-1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Cette liste affiche les hôtes découvrables (voir config snmp) et qui ne sont pas encore intégrés à Centreon.&lt;/p&gt;
&lt;p&gt;Vous pouvez cliquer sur le bouton &lt;code&gt;Magie&lt;/code&gt; et celui-ci affectera automatiquement le template d'hôte associé à l'os détecté.&lt;/p&gt;
&lt;p&gt;Il sera également possible de rajouter manuellement deux autres templates supplémentaires.&lt;/p&gt;
&lt;p&gt;Veillez également à sélectionner le bon poller, &lt;u&gt;&lt;strong&gt;cochez le ou les équipement(s) à exporter&lt;/strong&gt;&lt;/u&gt; puis cliquez sur &lt;code&gt;Valider&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="resultscan-2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Deux choix s'offrent alors à vous:&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="resultscan-3.png" alt="" /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Soit la configuration actuelle vous suffit, et vous pouvez cliquer sur &lt;code&gt;Appliquer et redémarrer le moteur&lt;/code&gt; ce qui revient à faire l'export de la nouvelle configuration dans l'interface Centreon;&lt;/li&gt;
&lt;li&gt;Soit vous cliquez sur &lt;code&gt;Appliquer dans centreon&lt;/code&gt; ce qui vous permet d'intégrer ces hôtes dans Centreon, sans pour autant appliquer de suite la nouvelle configuration. Libre à vous ensuite d'affiner selon vos besoins la configuration de vos hôtes dans l'interface web Centreon.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Par acquis de conscience vérifiez l'intégralité des hôtes et services déployés.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="background-autodiscover"&gt;&lt;a href="#background-autodiscover" class="header-anchor"&gt;&lt;/a&gt;Background autodiscover
&lt;/h2&gt;&lt;p&gt;Le scan manuel reste un outil pratique pour des besoins ponctuels ou une petite structure, mais lorsque vos besoins couvrent un large panel d'équipements, réseaux et communautés différentes, Open Centreon Discovery embarque un autre outil qui va vous simplifier la vie et vous faire gagner du temps: la découverte SNMP en tâche de fond.&lt;/p&gt;
&lt;h3 id="ajout-de-réseaux-à-scanner"&gt;&lt;a href="#ajout-de-r%c3%a9seaux-%c3%a0-scanner" class="header-anchor"&gt;&lt;/a&gt;Ajout de réseaux à scanner
&lt;/h3&gt;&lt;p&gt;Il faut au préalable venir écrire les réseaux à scanner dans le fichier de configuration d'OCD:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim /usr/share/discovery/config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La variable &lt;code&gt;$config[&amp;#039;backGroundScanUse&amp;#039;]&lt;/code&gt; est activé par défaut. C'est elle qui défini l'activation ou l'arrêt du processus.&lt;/p&gt;
&lt;p&gt;La variable &lt;code&gt;$config[&amp;#039;backGroundRoot&amp;#039;]&lt;/code&gt; permet de déclarer le chemin où viendra s'enregistrer le fichier de résultat du scan ( &lt;code&gt;resultScan&lt;/code&gt; ). &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;: si vous modifiez ce chemin, veillez à bien donner les droits nécessaires au fonctionnement du backgroundScan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'application de tâche de fond doit avoir les droits en lecture/écriture.&lt;/li&gt;
&lt;li&gt;L'application web nécessite les droits en lecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;//pour le scan BackGround

//activation du scan backGround pour les /16 et plus : true or false
$config[&amp;#39;backGroundScanUse&amp;#39;] = true ;
//chemin de l&amp;#39;executable scanBackGround

$config[&amp;#39;backGroundRoot&amp;#39;] = &amp;#39;/usr/share/discovery&amp;#39;;

$config[&amp;#39;backGroundScan&amp;#39;][0] = array(&amp;#34;network&amp;#34; =&amp;gt; &amp;#34;192.168.1.0/24&amp;#34;,
 &amp;#34;community&amp;#34;=&amp;gt;&amp;#34;public&amp;#34;,
 &amp;#34;version&amp;#34;=&amp;gt;&amp;#34;2&amp;#34; );

$config[&amp;#39;backGroundScan&amp;#39;][1] = array(&amp;#34;network&amp;#34; =&amp;gt; &amp;#34;192.168.4.0/24&amp;#34;,
 &amp;#34;community&amp;#34;=&amp;gt;&amp;#34;macommuperso&amp;#34;,
 &amp;#34;version&amp;#34;=&amp;gt;&amp;#34;2&amp;#34; );
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="planifier-la-tâche"&gt;&lt;a href="#planifier-la-t%c3%a2che" class="header-anchor"&gt;&lt;/a&gt;Planifier la tâche
&lt;/h3&gt;&lt;p&gt;Après avoir configuré vos réseaux, il est temps de planifier vos scans.&lt;/p&gt;
&lt;p&gt;Tout d'abord, tester la commande qui exécute le scan:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /usr/share/discovery &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; /usr/bin/php -q backGroundScan.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;code&gt;cd&lt;/code&gt; ici est indispensable. Le code php étant rédigé avec des chemins relatifs il est nécessaire de se placer dans le dossier &lt;code&gt;discovery&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;: après avoir testé manuellement la commande il se peut que les droits du fichier resulScan soit attribué à l'utilisateur qui a lancé la commande. Il est indispensable de rendre apache propriétaire du fichier!!!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chown apache: resulScan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Au bout de quelques secondes vous devriez voir apparaitre vos hôtes sur l'interface web d'OCD&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="resultscan-4.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Cliquez ensuite sur &lt;code&gt;Go&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous arriverez alors sur la même page que le scan manuel où vos hôtes seront listés, avec le bouton &lt;code&gt;magie&lt;/code&gt; pour associer vos templates.&lt;/p&gt;
&lt;p&gt;Merci à &lt;a href="https://github.com/romnvll/Open-Centreon-Discovery"&gt;romnvll&lt;/a&gt;, qui a créé ce module et qui m'a aidé à sa mise en place, et merci à &lt;a href="https://www.sugarbug.fr/atelier/techniques/ihmweb/open-centreon-discovery/"&gt;Kermith&lt;/a&gt; pour ses tutos très éclairés qui m'ont inspiré.&lt;/p&gt;</description></item><item><title>Docker-Compose : Tactical RMM</title><link>https://slash-root.fr/docker-compose-tactical-rmm/</link><pubDate>Mon, 13 Dec 2021 11:56:12 +0100</pubDate><guid>https://slash-root.fr/docker-compose-tactical-rmm/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-tactical-rmm/cover.png" alt="Featured image of post Docker-Compose : Tactical RMM" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3.7&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# networks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ipam&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;subnet&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;172.20.0.0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;/24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;api-db&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;redis&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mesh-db&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#75715e"&gt;# docker managed persistent volumes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical_data&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;postgres_data&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mongo_data&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mesh_data&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;redis_data&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# postgres database for api service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-postgres&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres:13-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tacticalrmm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${POSTGRES_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${POSTGRES_PASS}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./postgres_data:/var/lib/postgresql/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# redis container for celery tasks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-redis&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;redis:6.0-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;redis-server --appendonly yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./redis_data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# used to initialize the docker environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-init&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: [ &lt;span style="color:#e6db74"&gt;&amp;#34;tactical-init&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${POSTGRES_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASS&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${POSTGRES_PASS}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;APP_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${APP_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;API_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${API_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;TRMM_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${TRMM_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;TRMM_PASS&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${TRMM_PASS}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-meshcentral&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# nats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-nats&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-nats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical-nats:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;API_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${API_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;4222:4222&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;api-db&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;aliases&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;${API_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;default&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# meshcentral container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-meshcentral&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-meshcentral&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical-meshcentral:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_PASS&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_PASS}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MONGODB_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGODB_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MONGODB_PASSWORD}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_PERSISTENT_CONFIG&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_PERSISTENT_CONFIG}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;aliases&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;${MESH_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mesh-db&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./mesh_data:/home/node/app/meshcentral-data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# mongodb container for meshcentral&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-mongodb&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-mongodb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongo:4.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGO_INITDB_ROOT_USERNAME&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MONGODB_USER}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGO_INITDB_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MONGODB_PASSWORD}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MONGO_INITDB_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;meshcentral&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mesh-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./mongo_data:/data/db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container that hosts vue frontend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-frontend&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-frontend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical-frontend:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;API_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${API_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container for django backend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-backend&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-backend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: [ &lt;span style="color:#e6db74"&gt;&amp;#34;tactical-backend&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container for django websockets connections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-websockets&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-websockets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: [ &lt;span style="color:#e6db74"&gt;&amp;#34;tactical-websockets&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-backend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container for tactical reverse proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-nginx&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical-nginx:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;APP_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${APP_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;API_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${API_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MESH_HOST&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${MESH_HOST}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CERT_PUB_KEY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${CERT_PUB_KEY}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CERT_PRIV_KEY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${CERT_PRIV_KEY}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ipv4_address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;172.20.0.20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8010:80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8011:443&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container for celery worker service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-celery&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-celery&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: [ &lt;span style="color:#e6db74"&gt;&amp;#34;tactical-celery&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# container for celery beat service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tactical-celerybeat&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trmm-celerybeat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${IMAGE_REPO}tactical:${VERSION}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: [ &lt;span style="color:#e6db74"&gt;&amp;#34;tactical-celerybeat&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;api-db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./tactical_data:/opt/tactical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;tactical-redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="env"&gt;&lt;a href="#env" class="header-anchor"&gt;&lt;/a&gt;.env
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IMAGE_REPO&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;tacticalrmm/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;VERSION&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# tactical credentials (Used to login to dashboard)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TRMM_USER&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;tacticalrmm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TRMM_PASS&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dns settings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;APP_HOST&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;rmm.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;API_HOST&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;api.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MESH_HOST&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;mesh.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# mesh settings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MESH_USER&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;tacticalrmm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MESH_PASS&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MONGODB_USER&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;mongouser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MONGODB_PASSWORD&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;MESH_PERSISTENT_CONFIG&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# database settings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;POSTGRES_USER&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;POSTGRES_PASS&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="certificates"&gt;&lt;a href="#certificates" class="header-anchor"&gt;&lt;/a&gt;certificates
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;\n# certs&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;CERT_PUB_KEY=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;base64 -w &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; /path/to/fullchain.pem&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;CERT_PRIV_KEY=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;base64 -w &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; /path/to/privkey.pem&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : RocketChat</title><link>https://slash-root.fr/docker-compose-rocketchat/</link><pubDate>Mon, 13 Dec 2021 11:48:02 +0100</pubDate><guid>https://slash-root.fr/docker-compose-rocketchat/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-rocketchat/cover.png" alt="Featured image of post Docker-Compose : RocketChat" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rocketchat&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;registry.rocket.chat/rocketchat/rocket.chat:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rocketchat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &amp;gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; bash -c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;for i in `seq 1 30`; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; node main.js &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; s=$$? &amp;amp;&amp;amp; break || s=$$?;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; echo \&amp;#34;Tried $$i times. Waiting 5 secs...\&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; sleep 5;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; done; (exit $$s)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./uploads:/app/uploads&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;PORT=3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ROOT_URL=https://rocketchat.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MONGO_URL=mongodb://mongo:27017/rocketchat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MONGO_OPLOG_URL=mongodb://mongo:27017/local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# - MAIL_URL=smtp://smtp.email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# - HTTP_PROXY=http://proxy.domain.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# - HTTPS_PROXY=http://proxy.domain.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mongo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;traefik.backend=rocketchat&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;traefik.frontend.rule=Host: your.domain.tld&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mongo&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongo:4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rocketchat_mongo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./data/db:/data/db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#- ./data/dump:/dump&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;traefik.enable=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# this container&amp;#39;s job is just run the command to initialize the replica set.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# it will run the command and remove himself (it will not stay running)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mongo-init-replica&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mongo:4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &amp;gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; bash -c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;for i in `seq 1 30`; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; mongo mongo/rocketchat --eval \&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rs.initiate({
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; _id: &amp;#39;rs0&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; members: [ { _id: 0, host: &amp;#39;localhost:27017&amp;#39; } ]})\&amp;#34; &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; s=$$? &amp;amp;&amp;amp; break || s=$$?;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; echo \&amp;#34;Tried $$i times. Waiting 5 secs...\&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; sleep 5;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; done; (exit $$s)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mongo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# hubot, the popular chatbot (add the bot user first and change the password before starting this image)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hubot&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rocketchat/hubot-rocketchat:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ROCKETCHAT_URL=rocketchat:3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ROCKETCHAT_ROOM=GENERAL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ROCKETCHAT_USER=bot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ROCKETCHAT_PASSWORD=password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;BOT_NAME=bot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# you can add more scripts as you&amp;#39;d like here, they need to be installable by npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;rocketchat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;traefik.enable=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./scripts:/home/hubot/scripts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;3001&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#traefik:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# image: traefik:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# restart: unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# command: &amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# traefik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --acme=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --acme.domains=&amp;#39;your.domain.tld&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --acme.email=&amp;#39;your@email.tld&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --acme.entrypoint=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --acme.storagefile=acme.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --defaultentrypoints=http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --defaultentrypoints=https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --entryPoints=&amp;#39;Name:http Address::80 Redirect.EntryPoint:https&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# --entryPoints=&amp;#39;Name:https Address::443 TLS.Certificates:&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ports:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - 80:80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - 443:443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# volumes:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - /var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : qBittorrent</title><link>https://slash-root.fr/docker-compose-qbittorrent/</link><pubDate>Mon, 13 Dec 2021 11:44:54 +0100</pubDate><guid>https://slash-root.fr/docker-compose-qbittorrent/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-qbittorrent/cover.png" alt="Featured image of post Docker-Compose : qBittorrent" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;qbittorrent&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gists/qbittorrent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;qbittorrent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8080:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;6881:6881&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;6881:6881/udp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;UID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Pi-Hole</title><link>https://slash-root.fr/docker-compose-pi-hole/</link><pubDate>Mon, 13 Dec 2021 11:43:04 +0100</pubDate><guid>https://slash-root.fr/docker-compose-pi-hole/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-pi-hole/cover.png" alt="Featured image of post Docker-Compose : Pi-Hole" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;pihole&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pihole&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pihole/pihole:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;53:53/tcp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;53:53/udp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;67:67/udp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8085:80/tcp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;TZ&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Europe/Paris&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;WEBPASSWORD&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Volumes store your data between container upgrades&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;./etc-pihole/:/etc/pihole/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;./etc-dnsmasq.d/:/etc/dnsmasq.d/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Recommended but not required (DHCP needs NET_ADMIN)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cap_add&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;NET_ADMIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Nginx Proxy Manager</title><link>https://slash-root.fr/docker-compose-nginx-proxy-manager/</link><pubDate>Mon, 13 Dec 2021 11:41:08 +0100</pubDate><guid>https://slash-root.fr/docker-compose-nginx-proxy-manager/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-nginx-proxy-manager/cover.png" alt="Featured image of post Docker-Compose : Nginx Proxy Manager" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;jc21/nginx-proxy-manager:latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;8082:81&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./letsencrypt:/etc/letsencrypt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="credentials"&gt;&lt;a href="#credentials" class="header-anchor"&gt;&lt;/a&gt;Credentials
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Email: admin@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Password: changeme
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Nextcloud</title><link>https://slash-root.fr/docker-compose-nextcloud/</link><pubDate>Mon, 13 Dec 2021 11:37:28 +0100</pubDate><guid>https://slash-root.fr/docker-compose-nextcloud/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-nextcloud/cover.png" alt="Featured image of post Docker-Compose : Nextcloud" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud_mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: --&lt;span style="color:#ae81ff"&gt;transaction-isolation=READ-COMMITTED --binlog-format=ROW --skip-innodb-read-only-compressed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./db:/var/lib/mysql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_ROOT_PASSWORD=password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_PASSWORD=password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_DATABASE=nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_USER=nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;APACHE_DISABLE_REWRITE_IP=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;TRUSTED_PROXIES=172.16.0.10&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Si reverse proxy, mettre son IP sinon commenter la ligne&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8084&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;links&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./nextcloud:/var/www/html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_PASSWORD=password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_DATABASE=nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_USER=nextcloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;MYSQL_HOST=db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;APACHE_DISABLE_REWRITE_IP=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;TRUSTED_PROXIES=172.16.0.10&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Si reverse proxy, mettre son IP sinon commenter la ligne&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Netdata</title><link>https://slash-root.fr/docker-compose-netdata/</link><pubDate>Mon, 13 Dec 2021 11:33:45 +0100</pubDate><guid>https://slash-root.fr/docker-compose-netdata/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-netdata/cover.png" alt="Featured image of post Docker-Compose : Netdata" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;netdata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;netdata/netdata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;netdata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hostname&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;HOSTNAME&lt;/span&gt; &lt;span style="color:#75715e"&gt;# set to fqdn of host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;19999&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;19999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cap_add&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;SYS_PTRACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;security_opt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;apparmor:unconfined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./netdataconfig/netdata:/etc/netdata:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;netdatalib:/var/lib/netdata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;netdatacache:/var/cache/netdata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/passwd:/host/etc/passwd:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/group:/host/etc/group:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/proc:/host/proc:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/sys:/host/sys:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/etc/os-release:/host/etc/os-release:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;netdatalib&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;netdatacache&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Keycloak</title><link>https://slash-root.fr/docker-compose-keycloak/</link><pubDate>Mon, 13 Dec 2021 11:30:58 +0100</pubDate><guid>https://slash-root.fr/docker-compose-keycloak/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-keycloak/cover.png" alt="Featured image of post Docker-Compose : Keycloak" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;postgres&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak_postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./postgres_data:/var/lib/postgresql/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;keycloak&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jboss/keycloak:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PROXY_ADDRESS_FORWARDING&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_VENDOR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;POSTGRES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_ADDR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8083&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Docker-Compose : Dashy</title><link>https://slash-root.fr/docker-compose-dashy/</link><pubDate>Mon, 13 Dec 2021 11:27:42 +0100</pubDate><guid>https://slash-root.fr/docker-compose-dashy/</guid><description>&lt;img src="https://slash-root.fr/docker-compose-dashy/cover.png" alt="Featured image of post Docker-Compose : Dashy" /&gt;&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dashy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# To build from source, replace &amp;#39;image: lissy93/dashy&amp;#39; with &amp;#39;build: .&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# build: .&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;lissy93/dashy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dashy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Pass in your config file below, by specifying the path on your host machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./my-config.yml:/app/public/conf.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;8081&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Set any environmental variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;NODE_ENV=production&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Specify your user ID and group ID. You can find this by running `id -u` and `id -g`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;UID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Specify restart policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Configure healthchecks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;healthcheck&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;test&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;CMD&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;node&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/app/services/healthcheck&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;interval&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1m30s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;timeout&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;retries&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# start_period: 40s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Supervision: tour d’horizon avec CentCTL pour Centreon Open Source.</title><link>https://slash-root.fr/supervision-tour-dhorizon-avec-centctl-pour-centreon-open-source/</link><pubDate>Fri, 26 Nov 2021 14:51:09 +0100</pubDate><guid>https://slash-root.fr/supervision-tour-dhorizon-avec-centctl-pour-centreon-open-source/</guid><description>&lt;img src="https://slash-root.fr/supervision-tour-dhorizon-avec-centctl-pour-centreon-open-source/cover.png" alt="Featured image of post Supervision: tour d’horizon avec CentCTL pour Centreon Open Source." /&gt;&lt;h2 id="historique"&gt;&lt;a href="#historique" class="header-anchor"&gt;&lt;/a&gt;Historique
&lt;/h2&gt;&lt;p&gt;CentCTL est un exécutable indépendant créé en 2020 par Mélissa Bertin au sein de la société &lt;a href="https://www.ypsi.fr/"&gt;YPSI&lt;/a&gt;. Tout comme CLAPI, il utilise l'API pour réaliser la majeure partie des tâches sur Centreon en ligne de commande. CLAPI nécessite d'être exécuté localement sur le serveur Centreon Central. Vous aurez donc besoin d'une connexion SSH pour pouvoir l'administrer depuis votre poste de travail. De plus, les commandes nécessitent systématiquement une authentification avec mot de passe en clair, et a parfois une syntaxe de commande peu intuitive.&lt;/p&gt;
&lt;p&gt;CentCTL utilise l'API REST v1 pour opérer les différentes tâches d'administration. En ayant seulement accès à l'API, on peut administrer notre solution de supervision sans connexion SSH. Aucunement besoin d'interface web, seul un utilisateur avec les droits d'accès à l'API est nécessaire. Le module est développé en langage Go, ce qui le rend multiplateforme et plaira donc à la fois à nos amis pingouins comme aux croqueurs de pommes et aux afficionados des solutions Microsoft. &lt;/p&gt;
&lt;h2 id="centreon--centctl-limportance-de-la-convention-de-nommage"&gt;&lt;a href="#centreon--centctl-limportance-de-la-convention-de-nommage" class="header-anchor"&gt;&lt;/a&gt;Centreon &amp;amp; CentCTL: l&amp;rsquo;importance de la convention de nommage.
&lt;/h2&gt;&lt;p&gt;Il est très important d'adopter une convention de nommage précise et de s'y tenir!!! Il est très facile de filtrer les éléments dont vous avez besoin grâce à des regex dans CentCTL. Mais pour cela, il faut adopter une convention assez précise.&lt;/p&gt;
&lt;p&gt;Ci-dessous je détaille une proposition de convention de nommage.&lt;/p&gt;
&lt;h3 id="les-commandes"&gt;&lt;a href="#les-commandes" class="header-anchor"&gt;&lt;/a&gt;Les commandes
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;ChC = Check Command&lt;/li&gt;
&lt;li&gt;NoC = Notification Command&lt;/li&gt;
&lt;li&gt;DiC = Discovery Command&lt;/li&gt;
&lt;li&gt;MiC = Miscellaneous Command&lt;/li&gt;
&lt;li&gt;CoC = Connectors Command&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puis ajoutez le nom de la commande. Prenez soit l'objet utilisé par le plugin Centreon, Nagios ou autre pour les commandes de check (par exemple check_ping), soit un descriptif très succinct comme nous pouvons l'avoir de base dans les commandes de notification déjà intégrées à Centreon (host-notify-by-email).&lt;/p&gt;
&lt;p&gt;Le résultat donnera quelque chose comme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChC_CHECK_PING&lt;/li&gt;
&lt;li&gt;NoC_HOST_EMAIL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si votre commande est spécifiquement adapté à un seul type d'OS, alors il faudra le préciser avant le nom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChC_OS_ORACLE8_DISK_SPACE_VAR&lt;/li&gt;
&lt;li&gt;ChC_OS_WINSRV16_DISK_SPACE_D&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ect... Libre à vous d'imaginer le plus parlant. &lt;/p&gt;
&lt;h3 id="les-templates"&gt;&lt;a href="#les-templates" class="header-anchor"&gt;&lt;/a&gt;Les templates
&lt;/h3&gt;&lt;h4 id="les-templates-de-configuration"&gt;&lt;a href="#les-templates-de-configuration" class="header-anchor"&gt;&lt;/a&gt;Les templates de configuration
&lt;/h4&gt;&lt;p&gt;Une bonne pratique est de créer, pour les services et pour les hôtes, des templates de configuration (pour configurer d'autres templates).&lt;/p&gt;
&lt;p&gt;Exemple: template de configuration de notifications.&lt;/p&gt;
&lt;p&gt;Lors de la création d'un modèle d'hôte ou de service, liez directement le Template de configuration de notifications, et vous n'aurez pas à configurer les notifications pour ce template. Ce qui, grâce aux relations avec les modèles d'hôte ou de service fonctionnels, évitera les manipulations trop lourdes et trop contraignantes dans leurs nombres pour venir modifier un paramètre concernant les notifications. Vous changez votre paramètre directement dans le template de configuration de notification et cela s'applique absolument à tout les templates liés, se répercutant donc sur les hôtes et services. &lt;/p&gt;
&lt;p&gt;Lors de la création de ce template, ne configurez que les paramètres notifications (ce qui correspond à l'onglet du même nom dans l'interface web).&lt;/p&gt;
&lt;p&gt;Par exemple, ces templates se nommeront ainsi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nom =&amp;gt; STC_NOTIF = Service Template Configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nom =&amp;gt; HTC_NOTIF = Host Template Configuration&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez mettre la même chose dans l'alias. &lt;/p&gt;
&lt;p&gt;Libre à vous de créer les template de configuration de votre choix, par exemple plusieurs templates de configuration pour vos différentes communautés snmp, etc... Adaptez selon vos besoins.&lt;/p&gt;
&lt;h4 id="les-templates-de-service"&gt;&lt;a href="#les-templates-de-service" class="header-anchor"&gt;&lt;/a&gt;Les templates de service
&lt;/h4&gt;&lt;p&gt;Ces templates de baseront sur le nom de la commande qu'ils représentent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nom =&amp;gt; ST_ChC_OS_DEB10_DISK_SPACE_VAR (ST pour Service Template)
&lt;ul&gt;
&lt;li&gt;Alias =&amp;gt; SFT_ChC_OS_DEB10_DISK_SPACE_VAR (SFT pour Service From Template)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, définir un alias correctement peut vous permettre de différencier sur la page des services par hôtes, les services hérités d'un modèle de service, et ceux créés manuellement sans passer par un template.&lt;/p&gt;
&lt;h4 id="les-templates-dhôte"&gt;&lt;a href="#les-templates-dh%c3%b4te" class="header-anchor"&gt;&lt;/a&gt;Les templates d&amp;rsquo;hôte
&lt;/h4&gt;&lt;p&gt;Décrivez succinctement l'OS et la fonction de l'hôte en question:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nom =&amp;gt; HT_OS_WINSRV19_WEB_SRV (HT pour Host Template)
&lt;ul&gt;
&lt;li&gt;Alias =&amp;gt; HFT_OS_WINSRV19_WEB_SRV (HFT pour Host From Template)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="les-hôtes"&gt;&lt;a href="#les-h%c3%b4tes" class="header-anchor"&gt;&lt;/a&gt;Les hôtes
&lt;/h3&gt;&lt;p&gt;Le nom de l'hôte supervisé sera basé sur le nom de la société et/ou sa localisation (si vous supervisez plusieurs entreprises ou sites), son os, sa fonction, éventuellement le service auquel il est affecté et un numéro (utile si vous supervisez de très nombreux postes de travail ou une ferme de serveurs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nom: Aukfood_Linux_Server_Web_001
&lt;ul&gt;
&lt;li&gt;ou encore: CrdAgr_RSY-PlaceVendee_Win10_Direction_001&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour l'alias, inscrivez simplement son FQDN.&lt;/p&gt;
&lt;h3 id="les-services"&gt;&lt;a href="#les-services" class="header-anchor"&gt;&lt;/a&gt;Les services
&lt;/h3&gt;&lt;p&gt;Si vous créez un service automatiquement lors de la création d'un hôte en relation avec un template d'hote et des templates de service alors celui ci portera le nom de l'alias donné au template de service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SFT_ChC_CHECK_PING&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous créez un service manuellement sans passer par un template:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S_ChC_CHECK_PING&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pourquoi-tout-ça"&gt;&lt;a href="#pourquoi-tout-%c3%a7a" class="header-anchor"&gt;&lt;/a&gt;Pourquoi tout ça?
&lt;/h3&gt;&lt;p&gt;Et bien, lorsque vous allez utiliser des commandes CentCTL par la suite pour créer des listes à utiliser dans un script pour automatiser un déploiement par exemple, vous n'aurez qu'à filtrer avec un peu de regex des ensembles d'éléments, rediriger le flux de sortie dans un fichier, un peu de substitution massive par de la regex (encore) dans vim et le tour est joué. J'y reviendrai plus tard.&lt;/p&gt;
&lt;h2 id="préparer-le-poste-de-travail"&gt;&lt;a href="#pr%c3%a9parer-le-poste-de-travail" class="header-anchor"&gt;&lt;/a&gt;Préparer le poste de travail
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Le reste de cet article décrit des procédures qui ont été réalisées sous Rocky Linux 8.4.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="téléchargement-de-centctl"&gt;&lt;a href="#t%c3%a9l%c3%a9chargement-de-centctl" class="header-anchor"&gt;&lt;/a&gt;Téléchargement de CentCTL
&lt;/h3&gt;&lt;p&gt;Créer un dossier dans lequel récupérer CentCTL puis télécharger la dernière version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir $HOME/centctl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd $HOME/centctl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://github.com/YPSI-SAS/centctl/releases/download/v2.5/centctl_linux_amd64 -O centctl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rendre ce fichier exécutable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x centctl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="préparation-de-la-commande"&gt;&lt;a href="#pr%c3%a9paration-de-la-commande" class="header-anchor"&gt;&lt;/a&gt;Préparation de la commande
&lt;/h3&gt;&lt;p&gt;Configurer la variable d'environnement CENTCTL_CONF avec le chemin et le nom du fichier de configuration nommé &lt;code&gt;centctl.yaml&lt;/code&gt;. Modifier le &lt;code&gt;.bashrc&lt;/code&gt; de l'utilisateur qui utilisera CentCTL avec la ligne suivante en bas du fichier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export CENTCTL_CONF&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/home/USER/centctl/centctl.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;USER étant votre nom d'utilisateur, bien entendu !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Configurer l'auto-complétion :&lt;/p&gt;
&lt;p&gt;Si le paquet n'est pas installé:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dnf install bash-completion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis exécuter les commandes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;type _init_completion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si la commande réussi, on peut passer à la suite, sinon:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dans le .bashrc, écrivez cette ligne de commande en bas du fichier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /usr/share/bash-compltion/bash_completion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rechargez votre shell avec &lt;code&gt;source .bashrc&lt;/code&gt; puis vérifiez que la complétion et correctement installée avec la commande &lt;code&gt;type _init_completion&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour terminer, ajouter le script de complétion dans le répertoire &lt;code&gt;/etc/bash_completion.d&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/home/USER/centctl/centctl completion bash &amp;gt; /etc/bash_completion.d/centctl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-de-centctl"&gt;&lt;a href="#configuration-de-centctl" class="header-anchor"&gt;&lt;/a&gt;Configuration de CentCTL
&lt;/h3&gt;&lt;p&gt;Il faut maintenant construire de fichier de configuration &lt;code&gt;centctl.yaml&lt;/code&gt;. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim centctl.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour déclarer un serveur, utilisez la configuration ci-dessous en remplaçant les mots en &lt;code&gt;MAJUSCULE&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NAMESERVER&lt;/code&gt; c'est le nom du serveur à utiliser avec le flag &lt;code&gt;--server&lt;/code&gt;. ATTENTION: le nom du serveur doit être unique.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;: c'est l'adresse utilisée pour l'accès à l'interface web de Centreon au format: &lt;a href="https://monserveurcentreon.fr"&gt;https://monserveurcentreon.fr&lt;/a&gt; (ou avec l'IP). ATTENTION: si l'url n'est pas sécurisée, mettre &lt;strong&gt;http&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insecure&lt;/code&gt; est utilisé quand l'URL du server est en &lt;strong&gt;https&lt;/strong&gt;. Le flag est le même ( &lt;code&gt;--insecure&lt;/code&gt;) pour forcer la connexion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LOGIN&lt;/code&gt; est le login &lt;strong&gt;&lt;u&gt;avec les droits d'accès RestAPI&lt;/u&gt;&lt;/strong&gt; utilisé pour la connexion au serveur. CONSEIL: utiliser &lt;strong&gt;admin&lt;/strong&gt; qui est automatiquement autorisé pour l'API Rest.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PASSWORD&lt;/code&gt; est le mot de passe de l'utilisateur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VERSION&lt;/code&gt; est la version du Rest API (v1 ou v2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default&lt;/code&gt; défini le server par défaut auquel se connecter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemple de fichier de configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;servers:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - server: &lt;span style="color:#e6db74"&gt;&amp;#34;centreon-centos&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url: &lt;span style="color:#e6db74"&gt;&amp;#34;https://centreon21.aukfood.fr&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; insecure: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; login: &lt;span style="color:#e6db74"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; password: &lt;span style="color:#e6db74"&gt;&amp;#34;Pa55word&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version: &lt;span style="color:#e6db74"&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - server: &lt;span style="color:#e6db74"&gt;&amp;#34;centreon-rocky&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url: &lt;span style="color:#e6db74"&gt;&amp;#34;http://192.168.1.222/centreon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; login: &lt;span style="color:#e6db74"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; password: &lt;span style="color:#e6db74"&gt;&amp;#34;azerty666&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version: &lt;span style="color:#e6db74"&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pour rappel CentCTL utilise la V1 de Rest API.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="tester-la-configuration"&gt;&lt;a href="#tester-la-configuration" class="header-anchor"&gt;&lt;/a&gt;Tester la configuration
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Pour exécuter les commandes &lt;code&gt;./centctl&lt;/code&gt;, se placer dans le répertoire &lt;code&gt;centctl&lt;/code&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un test tout simple qui permet de voir si la configuration est bonne:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos list host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici le résultat, au format json par défaut:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;server&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;centreon-centos&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hosts&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;23&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Aukfood_Rocky_Client_001&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;alias&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;RockyLinux.aukfood.fr&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;address&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;192.168.1.148&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;activate&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;D'autres formats sont disponibles avec le flag &lt;code&gt;--output&lt;/code&gt; en fin de commande:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos list host --output yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos list host --output csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos list host --output text
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;D'autres options sont disponibles, comme filtrer avec des regex... Rendez-vous sur la page d'aide &lt;code&gt;/.centctl --help&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="exporter-les-configurations"&gt;&lt;a href="#exporter-les-configurations" class="header-anchor"&gt;&lt;/a&gt;Exporter les configurations
&lt;/h3&gt;&lt;p&gt;La migration de la configuration de la plateforme Centreon est possible avec CentCTL, même par exemple depuis la 20.10 vers une version supérieure comme la 21.10.&lt;/p&gt;
&lt;p&gt;Personnellement je préfère éviter d'exporter toute la configuration d'un coup surtout si celle-ci est importante, j'ai été confronté à certains problèmes lors de test. Je préfère être méticuleux et catégoriser.&lt;/p&gt;
&lt;h4 id="la-configuration-du-moteur-centreon"&gt;&lt;a href="#la-configuration-du-moteur-centreon" class="header-anchor"&gt;&lt;/a&gt;La configuration du moteur Centreon
&lt;/h4&gt;&lt;blockquote&gt;
&lt;p&gt;J'utilise le flag &lt;code&gt;-r ^.*&lt;/code&gt; pour tout selectionner mais le flag &lt;code&gt;--all&lt;/code&gt; marche très bien aussi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export engineCFG -r ^.* -f engine.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="les-ressources-du-poller"&gt;&lt;a href="#les-ressources-du-poller" class="header-anchor"&gt;&lt;/a&gt;Les ressources du poller
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export resourceCFG -r ^.* -f ressources.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="les-contactsutilisateurs"&gt;&lt;a href="#les-contactsutilisateurs" class="header-anchor"&gt;&lt;/a&gt;Les contacts/utilisateurs
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export contact -r ^.* -f contacts.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Les paramètres de notification ne seront pas exportés, attention lors de l'importation à les configurer de nouveau à la main. En effet, l'API REST v1 ne prend pas en charge ces paramètres et la v2 ne supporte pas les contacts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="les-commandes-1"&gt;&lt;a href="#les-commandes-1" class="header-anchor"&gt;&lt;/a&gt;Les commandes
&lt;/h4&gt;&lt;p&gt;Exportez les commandes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export commands -r ^ChC -f check_commands.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export commands -r ^NoC -f notification_commands.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;etc...&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="les-templates-1"&gt;&lt;a href="#les-templates-1" class="header-anchor"&gt;&lt;/a&gt;Les Templates
&lt;/h4&gt;&lt;h5 id="les-templates-de-notification"&gt;&lt;a href="#les-templates-de-notification" class="header-anchor"&gt;&lt;/a&gt;Les templates de notification
&lt;/h5&gt;&lt;p&gt;Exportez les templates de notifications des services et des hôtes à part du reste des templates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export template service -r ^STC -f conf_serv_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export template host -r ^HTC -f conf_host_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="les-templates-dhôte-1"&gt;&lt;a href="#les-templates-dh%c3%b4te-1" class="header-anchor"&gt;&lt;/a&gt;Les templates d&amp;rsquo;hôte
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export template host -r ^HT -f host_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="les-templates-de-service-1"&gt;&lt;a href="#les-templates-de-service-1" class="header-anchor"&gt;&lt;/a&gt;Les templates de service
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export template service -r ^ST -f serv_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="les-hôtes-1"&gt;&lt;a href="#les-h%c3%b4tes-1" class="header-anchor"&gt;&lt;/a&gt;Les hôtes
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export host -r ^.* -f hosts.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="les-services-1"&gt;&lt;a href="#les-services-1" class="header-anchor"&gt;&lt;/a&gt;Les services
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-centos export service -r ^*$ -f services.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="importer-vos-configurations"&gt;&lt;a href="#importer-vos-configurations" class="header-anchor"&gt;&lt;/a&gt;Importer vos configurations
&lt;/h3&gt;&lt;p&gt;Cet ordre d'importation me parait le plus logique en fonction des dépendances/héritages qu'il peut y avoir. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;La configuration du moteur&lt;/li&gt;
&lt;li&gt;Les ressources du poller&lt;/li&gt;
&lt;li&gt;Les templates de configuration&lt;/li&gt;
&lt;li&gt;Les commandes&lt;/li&gt;
&lt;li&gt;Les utilisateurs&lt;/li&gt;
&lt;li&gt;Les templates d'hôtes&lt;/li&gt;
&lt;li&gt;Les templates de services&lt;/li&gt;
&lt;li&gt;Les hôtes&lt;/li&gt;
&lt;li&gt;Les services&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Si différents éléments n'ont pas tous les paramètres renseignés car ceux-ci sont hérités de templates, alors de nombreux messages de warning apparaitront, mais ne gêneront pas le processus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f engine.csv 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f ressources.csv 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f contacts.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f check_commands.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(ect... pour les commandes)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f conf_host_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f conf_serv_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f host_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f serv_temp.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f hosts.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f services.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="déployer-la-configuration"&gt;&lt;a href="#d%c3%a9ployer-la-configuration" class="header-anchor"&gt;&lt;/a&gt;Déployer la configuration
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky import -f engine.csv 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Il peut être préférable de vérifier la configuration dans l'interface web plutot que d'appliquer directement lors d'une grosse importation. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="centctl-de-la-commande-à-lhôte"&gt;&lt;a href="#centctl-de-la-commande-%c3%a0-lh%c3%b4te" class="header-anchor"&gt;&lt;/a&gt;CentCTL: de la commande à l&amp;rsquo;hôte.
&lt;/h2&gt;&lt;p&gt;Les manipulations qui vont suivre peuvent paraitre longues et fastidieuses comparé à la simplicité d'utilisation de l'interface web Centreon. En effet, pour un besoin ponctuel, il est préférable de passer par l'interface.&lt;/p&gt;
&lt;p&gt;Mais ces commandes sont nécessaires dans le cadre de la réalisation d'un script pour automatiser et accélérer la configuration de nombreux éléments. &lt;/p&gt;
&lt;h3 id="créer-une-commande"&gt;&lt;a href="#cr%c3%a9er-une-commande" class="header-anchor"&gt;&lt;/a&gt;Créer une commande
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add command -l &lt;span style="color:#e6db74"&gt;&amp;#34;\$USER1&lt;/span&gt;$&lt;span style="color:#e6db74"&gt;/check_ping -H \$HOSTADDRESS&lt;/span&gt;$&lt;span style="color:#e6db74"&gt; -w \$_SERVICEWARNING&lt;/span&gt;$&lt;span style="color:#e6db74"&gt; \$_SERVICECRITICAL&lt;/span&gt;$&lt;span style="color:#e6db74"&gt; -p \$_SERVICENBPACKETS&lt;/span&gt;$&lt;span style="color:#e6db74"&gt; -4&amp;#34;&lt;/span&gt; -n ChC_CHECK_PING -t check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Il est impératif de banaliser le premier $ des macros avec un antislash sinon le shell va interpréter comme une variable vide et ça ne va pas correctement s'implanter dans Centreon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="créer-un-template-de-service"&gt;&lt;a href="#cr%c3%a9er-un-template-de-service" class="header-anchor"&gt;&lt;/a&gt;Créer un template de service:
&lt;/h3&gt;&lt;p&gt;Exemple avec la commande check_ping:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add template service -a SFT_ChC_CHECK_PING -n ST_ChC_CHECK_PING -t CST_NOTIF
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configurer les paramètres généraux:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p macro --value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;WARNING|3,40%|0|seuil d&amp;#39;alerte 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p macro --value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CRITICAL|5,60%|0|seuil d&amp;#39;alerte 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p macro --value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;NBPACKETS|5|0|nombre de paquets&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p check_period -v 24x7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p normal_check_interval -v &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p retry_check_interval -v &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p active_checks_enabled -v &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p passive_checks_enabled -v &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n ST_ChC_CHECK_PING -p is_volatile -v &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configurer les paramètres de notification:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nous allons utiliser un autre template, dédié à la configuration des notifications&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p notifications_enabled -v &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p contact -v &lt;span style="color:#e6db74"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p contactgroup -v &lt;span style="color:#e6db74"&gt;&amp;#34;Supervisors&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p notification_interval -v &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p notification_period -v 24x7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p notification_options -v &lt;span style="color:#e6db74"&gt;&amp;#34;w,u,c,r,f,s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template service -n STC_NOTIF -p recovery_notification_delay -v &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Pour les temps définis à zero il n'est pas utile de taper la commande&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="créer-un-template-dhôte"&gt;&lt;a href="#cr%c3%a9er-un-template-dh%c3%b4te" class="header-anchor"&gt;&lt;/a&gt;Créer un template d&amp;rsquo;hôte
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add template host -a HFT_DEBIAN_WEB_SERVER -n HT_DEBIAN_WEB_SERVER -t HTC_NOTIF
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p snmp_community -v public
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p snmp_version -v 2c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p timezone -v Europe/Paris
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p check_command -v ChC_HOSTALIVE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p max_check_attempts -v &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p check_interval -v &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p retry_check_interval -v &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p active_checks_enabled -v &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p passive_checks_enabled -v &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Ici la commande ChC_HOSTALIVE liée au template ne comporte pas de macros perso ni d'arguments. Dans le cas où vous auriez des macros à configurer, les valeurs de celles-ci se déclarent de la même manière que pour les macros des templates de service.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les commandes pour les paramètres de notifications sont les mêmes que pour les templates de service.&lt;/p&gt;
&lt;p&gt;Pour lier des templates de service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify template host -n HT_DEBIAN_WEB_SERVER -p linkedservice -v ST_ChC_CHECK_PING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Répéter la commande autant de fois qu'il y a de templates de service à lier.&lt;/p&gt;
&lt;h3 id="créer-un-hôte"&gt;&lt;a href="#cr%c3%a9er-un-h%c3%b4te" class="header-anchor"&gt;&lt;/a&gt;Créer un hôte
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add host -i 192.168.1.148 -a websrv01.aukfood.fr -n Aukfood_Debian_Web_Server_001 -p Central -t HT_DEBIAN_WEB_SERVER 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Par défaut, l'ajout de l'hôte par CentCTL créé automatiquement les services liés aux templates.&lt;/p&gt;
&lt;p&gt;Pour définir d'autres paramètres (soit non définis dans un template d'hôte ou volonté de le changer, soit pour configurer l'hôte manuellement sans relation avec un template), se référer aux commandes listées plus haut.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky modify host -n Aukfood_Debian_Web_Server_001 -p .....
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="créer-un-service"&gt;&lt;a href="#cr%c3%a9er-un-service" class="header-anchor"&gt;&lt;/a&gt;Créer un service
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add service -n Aukfood_Debian_Web_Server_001 -t ST_ChC_CHECK_PING -d SFT_ChC_CHECK_PING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;-n nom de l'hôte, -t template de service, -d description (nom du service/alias du template de service)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="pour-aller-plus-loin"&gt;&lt;a href="#pour-aller-plus-loin" class="header-anchor"&gt;&lt;/a&gt;Pour aller plus loin
&lt;/h3&gt;&lt;p&gt;De nombreux autres paramètres n'ont pas été abordés! Pour en découvrir d'autres, c'est par &lt;a href="https://github.com/YPSI-SAS/centctl/tree/master/exemple"&gt;ici&lt;/a&gt; !!!&lt;/p&gt;
&lt;h2 id="exemple-pratique-automatiser-le-déploiement-dun-nouveau-service-sur-tout-un-parc"&gt;&lt;a href="#exemple-pratique-automatiser-le-d%c3%a9ploiement-dun-nouveau-service-sur-tout-un-parc" class="header-anchor"&gt;&lt;/a&gt;Exemple pratique: automatiser le déploiement d&amp;rsquo;un nouveau service sur tout un parc
&lt;/h2&gt;&lt;p&gt;Afin d'éviter de devoir faire une myriade de clics pour déployer un nouveau service sur des centaines de machines, nous pouvons à l'aide d'un petit script très basique déployer en un temps record la nouvelle sonde.&lt;/p&gt;
&lt;h3 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h3&gt;&lt;p&gt;Nous avons correctement créé nos hôtes, hérités d'un Template d'hôte, qui est en relation avec un ou plusieurs Template de service qui contiennent une commande.&lt;/p&gt;
&lt;h3 id="extraire-une-liste-dhôtes"&gt;&lt;a href="#extraire-une-liste-dh%c3%b4tes" class="header-anchor"&gt;&lt;/a&gt;Extraire une liste d&amp;rsquo;hôtes
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky list host -r ^.* --output csv &amp;gt; hosts.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim hosts.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La liste se présente sous ce format: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ID,Name,Alias,Address,Activate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5,Aukfood_Debian_Web_Server_001,websrv01.aukfood.fr,192.168.1.148,1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6,Aukfood_Debian_Web_Server_002,websrv02.aukfood.fr,192.168.1.149,1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7,Aukfood_Win19srv_Dns_Server_001,dnssrv01.aukfood.fr,192.168.1.253,1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques petites manips avec vim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ôter la premiere ligne en plaçant le curseur en début de ligne et appuyez 2 fois rapidement sur d&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Entrez ces commandes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:g/^&lt;span style="color:#ae81ff"&gt;\d&lt;/span&gt;*,/s///
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:g/,.*$/s///
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;gt; Selon les préférences, la commande &lt;code&gt;sed&lt;/code&gt; ira très bien aussi!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après manipulation nous obtennons une liste ne contenant que les noms d'hôtes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Aukfood_Debian_Web_Server_001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Aukfood_Debian_Web_Server_002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Aukfood_Win19srv_Dns_Server_001
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="créer-le-script"&gt;&lt;a href="#cr%c3%a9er-le-script" class="header-anchor"&gt;&lt;/a&gt;Créer le script
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim autodeploy.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Déclare la liste d&amp;#39;hôte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;listhost&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;&amp;lt;hosts.csv&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Boucle sur tout les hôtes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; host in $listhost; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky add service -n $host -t ST_ChC_CHECK_PING -d SFT_ChC_CHECK_PING
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Exporte la configuration sur le poller selectionné et le recharge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./centctl --server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;centreon-rocky apply -n Central
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Wouah, c&amp;#39;était long! Tu as bien travaillé, vas te reposer maintenant ;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant, vous pouvez grâce à toutes les commandes CentCTL vues précédemment vous amuser à scripter dans tout les sens...&lt;/p&gt;
&lt;h1&gt;Sources&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.sugarbug.fr/atelier/" title="L&amp;#039;atelier de Kermith"&gt;L'atelier de Kermith&lt;/a&gt; qui est une vraie pépite pleine de bonne choses!&lt;br /&gt;
&lt;a href="https://github.com/YPSI-SAS/centctl" title="Github de CentCTL"&gt;Github de CentCTL&lt;/a&gt; dans lequel j'ai trouvé nombreuses réponses.&lt;br /&gt;
Mes cours sur la supervision lors de ma formation TSSR à l'&lt;a href="https://www.eni-ecole.fr/" title="ENI de St-Herblain"&gt;ENI de St-Herblain&lt;/a&gt; ( coucou Fred 🙂 )&lt;/p&gt;
&lt;h1&gt;Merci&lt;/h1&gt;
&lt;p&gt;Merci de m'avoir lu, et soyez indulgent pour mon 1er article dans le monde de l'IT !!! (et du monde libre, une pierre deux coups, tant qu'à faire)&lt;/p&gt;
&lt;p&gt;Charles, stagiaire TSSR.&lt;/p&gt;</description></item><item><title>Uptime Kuma : Une alternative à Uptime Robot !</title><link>https://slash-root.fr/uptime-kuma-une-alternative-a-uptime-robot/</link><pubDate>Wed, 24 Nov 2021 09:51:40 +0100</pubDate><guid>https://slash-root.fr/uptime-kuma-une-alternative-a-uptime-robot/</guid><description>&lt;img src="https://slash-root.fr/uptime-kuma-une-alternative-a-uptime-robot/cover.png" alt="Featured image of post Uptime Kuma : Une alternative à Uptime Robot !" /&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.aukfood.fr/uptime-kuma-une-alternative-a-uptimerobot/" title="Cet article a été écrit par la société AukFood, n&amp;#039;hésitez pas à les contacter pour la mise en place d&amp;#039;un tel outil."&gt;Cet article a été écrit par la société AukFood, n'hésitez pas à les contacter pour la mise en place d'un tel outil.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous connaissez certainement UptimeRobot, qui est une solution qui permet de monitorer un ou plusieurs sites web et d'être alerté le plus rapidement possible. C'est un outil de monitoring extrêmement simple, qui surveille une URL donnée. 👀&lt;/p&gt;
&lt;p&gt;Cependant ce service est payant, la version gratuite étant limitée à 50 URLs. C'est pour cela que je vais vous présenter à travers cet article, la solution Uptime Kuma, qui offre les mêmes features. C'est évidemment un projet open-source. ✌️&lt;/p&gt;
&lt;p&gt;Le projet est assez jeune, mais compte 24 releases à ce jour, et près de 9k d'étoiles sur GitHub. Les fonctionnalités sont les suivantes : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Surveillance des protocoles HTTP(s), TCP, Ping, DNS ;&lt;/li&gt;
&lt;li&gt;Notifications via Telegram, Discord, Slack, Rocket.Chat, Pushover, Email, etc... ;&lt;/li&gt;
&lt;li&gt;Surveillance des certificats SSL ;&lt;/li&gt;
&lt;li&gt;Mais également un thème sombre ! 🌙&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La surveillance des services s'effectue sur une intervalle de 20 secondes.&lt;/p&gt;
&lt;p&gt;Uptime Kuma s'installe sur un serveur, principalement en conteneur Docker (une version autonome est possible également). Nous allons voir dans cet article l'installation avec Docker. 🐳&lt;/p&gt;
&lt;p&gt;Premièrement, créer un volume : &lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ docker volume create uptime_kuma_storage
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis créer le conteneur : &lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ docker run -d --restart=always -p 3001:3001 -v uptime-kuma_storage:/app/data --name uptime-kuma louislam/uptime-kuma:1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Comme vous pouvez le constater sur la deuxième commande, Uptime Kuma écoute sur le port 3001.&lt;/p&gt;
&lt;p&gt;Allez sur l'interface web (par défaut : &lt;a href="http://localhost:3001"&gt;http://localhost:3001&lt;/a&gt;), vous pouvez configurer une écoute distante, à travers un reverse-proxy par exemple.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="532" width="696" decoding="async" src="image-20211025155806836.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Vous voici sur la page d'inscription. L'utiliseateur qui sera créé sera de type administrateur. Après avoir rempli le formulaire, vous vous trouverez sur le tableau de bord par défaut : &lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="521" width="696" decoding="async" src="image-20211025180959389.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dans le cadre de notre article, nous allons ajouter notre site web en supervision. Pour cela, cliquez sur &amp;quot;Ajouter une nouvelle sonde&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="521" width="696" decoding="async" src="image-20211025181256338.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Vous avez différentes options possibles, dans notre cas on restera sur celles de base (URL, protocole, intervalle de vérification...) mais vous pouvez paramétrer par exemple les codes HTTP acceptés (par défaut compris entre 200 et 299, le 404 par exemple sera considéré) comme un downtime.&lt;/p&gt;
&lt;p&gt;Quelques secondes plus tard, le résultat est déjà affiché ! &lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="521" width="696" decoding="async" src="image-20211025181500419.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Faisons la même chose avec le DNS : &lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="521" width="696" decoding="async" src="image-20211025181601993.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" height="521" width="696" decoding="async" src="image-20211025181625949.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Les notifications sont paramétrables, ce qui fera l'objet d'un article prochainement.&lt;/p&gt;
&lt;p&gt;En résumé, Uptime Kuma est un outil très simple d'utilisation, dont l'interface est intuitive, attractive, et accessible à un public non technique. &lt;/p&gt;
&lt;p&gt;Il se concentre sur son but principal, à savoir vérifier si un service est UP ou DOWN, ni plus ni moins. On va droit à l'essentiel, et c'est très bien comme cela.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.aukfood.fr/uptime-kuma-une-alternative-a-uptimerobot/" title="Cet article a été écrit par la société AukFood, n&amp;#039;hésitez pas à les contacter pour la mise en place d&amp;#039;un tel outil."&gt;Cet article a été écrit par la société AukFood, n'hésitez pas à les contacter pour la mise en place d'un tel outil.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>LemonLDAP : Activer le HTTPS + Reverse-Proxy</title><link>https://slash-root.fr/lemonldap-activer-le-https/</link><pubDate>Sat, 20 Nov 2021 15:36:41 +0100</pubDate><guid>https://slash-root.fr/lemonldap-activer-le-https/</guid><description>&lt;img src="https://slash-root.fr/lemonldap-activer-le-https/cover.png" alt="Featured image of post LemonLDAP : Activer le HTTPS + Reverse-Proxy" /&gt;&lt;h2 id="apache--nginx-configuration"&gt;&lt;a href="#apache--nginx-configuration" class="header-anchor"&gt;&lt;/a&gt;Apache / Nginx configuration
&lt;/h2&gt;&lt;p&gt;La 1ère chose à faire est de configurer le serveur web pour le passer en HTTPS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suivre cet article par exemple : &lt;a href="https://slash-root.fr/2021/10/15/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/"&gt;Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS - slash-root.fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lemonldap-configuration"&gt;&lt;a href="#lemonldap-configuration" class="header-anchor"&gt;&lt;/a&gt;LemonLDAP configuration
&lt;/h2&gt;&lt;p&gt;La 2nde étape est de configurer les URL en HTTPS pour le portail, cookie, ...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A exécuter en tant que &lt;code&gt;root&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; portal https://auth.example.com &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mailUrl https://auth.example.com/resetpwd &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registerUrl https://auth.example.com/register &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; securedCookie &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="reverse-proxy-configuration"&gt;&lt;a href="#reverse-proxy-configuration" class="header-anchor"&gt;&lt;/a&gt;Reverse-Proxy configuration
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://slash-root.fr/2021/10/15/nginx-reverse-proxy-avec-ssl/"&gt;Nginx : Reverse Proxy avec SSL - slash-root.fr&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si le portail est derrière un reverse-proxy en HTTPS, il est impératif d'effectuer les manipulations plus haut.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Exemple d'un vhost sous Nginx pour le portail :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;auth.example.fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;rewrite&lt;/span&gt; &lt;span style="color:#e6db74"&gt;^&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://auth.example.fr&lt;/span&gt; &lt;span style="color:#e6db74"&gt;permanent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;auth.example.fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/auth.example.fr/fullchain.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/auth.example.fr/privkey.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_session_cache&lt;/span&gt; builtin:&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#e6db74"&gt;shared:SSL:10m&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_ciphers&lt;/span&gt; &lt;span style="color:#e6db74"&gt;HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;error_log&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/log/nginx/error.log&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Host&lt;/span&gt; $host;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Real-IP&lt;/span&gt; $remote_addr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://192.168.49.68:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exemple d'un vhost sous Nginx pour le manager :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;manager.example.fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;rewrite&lt;/span&gt; &lt;span style="color:#e6db74"&gt;^&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://manager.example.fr&lt;/span&gt; &lt;span style="color:#e6db74"&gt;permanent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;manager.example.fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/manager.example.fr/fullchain.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/manager.example.fr/privkey.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_session_cache&lt;/span&gt; builtin:&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#e6db74"&gt;shared:SSL:10m&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_ciphers&lt;/span&gt; &lt;span style="color:#e6db74"&gt;HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Host&lt;/span&gt; $host;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Real-IP&lt;/span&gt; $remote_addr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://192.168.49.68:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le serveur web doit être compilé avec le module &lt;code&gt;--with-http_realip_module&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour vérifier :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx -V
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Retour attendu :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx version: nginx/1.14.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;built with OpenSSL 1.1.1d &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; Sep &lt;span style="color:#ae81ff"&gt;2019&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TLS SNI support enabled
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;configure arguments: --with-cc-opt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;-g -O2 -fdebug-prefix-map=/build/nginx-m1Thpq/nginx-1.14.2=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2&amp;#39;&lt;/span&gt; --with-ld-opt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;-Wl,-z,relro -Wl,-z,now -fPIC&amp;#39;&lt;/span&gt; --prefix&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/share/nginx --conf-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/nginx/nginx.conf --http-log-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/log/nginx/access.log --error-log-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/log/nginx/error.log --lock-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lock/nginx.lock --pid-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/run/nginx.pid --modules-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/lib/nginx/modules --http-client-body-temp-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/nginx/body --http-fastcgi-temp-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/nginx/fastcgi --http-proxy-temp-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/nginx/proxy --http-scgi-temp-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/nginx/scgi --http-uwsgi-temp-path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dynamic --with-http_sub_module --with-http_xslt_module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dynamic --with-stream&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dynamic --with-mail_ssl_module --add-dynamic-module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/build/nginx-m1Thpq/nginx-1.14.2/debian/modules/http-auth-pam --add-dynamic-module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/build/nginx-m1Thpq/nginx-1.14.2/debian/modules/http-dav-ext --add-dynamic-module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/build/nginx-m1Thpq/nginx-1.14.2/debian/modules/http-echo --add-dynamic-module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/build/nginx-m1Thpq/nginx-1.14.2/debian/modules/http-upstream-fair --add-dynamic-module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/build/nginx-m1Thpq/nginx-1.14.2/debian/modules/http-subs-filter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure : Synchronisation AD On-Premise &lt;&gt; Azure AD</title><link>https://slash-root.fr/azure-synchronisation-ad-on-premise-azure-ad/</link><pubDate>Sat, 20 Nov 2021 04:03:05 +0100</pubDate><guid>https://slash-root.fr/azure-synchronisation-ad-on-premise-azure-ad/</guid><description>&lt;img src="https://slash-root.fr/azure-synchronisation-ad-on-premise-azure-ad/cover.jpg" alt="Featured image of post Azure : Synchronisation AD On-Premise &lt;&gt; Azure AD" /&gt;&lt;h2 id="objectif"&gt;&lt;a href="#objectif" class="header-anchor"&gt;&lt;/a&gt;Objectif
&lt;/h2&gt;&lt;p&gt;L'objectif de ce document est de mettre en place une synchronisation des utilisateurs, des mots de passes, et des groupes d'un Active directory local vers une infrastructure Azure AD et d'attribuer des licences Microsoft 365 aux utilisateurs du domaine. Ceux-ci n'auront qu'une seule identité entre le domaine local et leurs services Microsoft 365.&lt;/p&gt;
&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Contrôleur de domaine local : &lt;em&gt;SRV-AD (Windows Serveur 2019 Standard)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Domaine local : &lt;em&gt;starwars-bzh.local&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Tenant Azure AD : &lt;em&gt;starwarsbzh.onmicrosoft.com&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Architecture du domaine local :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="25-ad-structure.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="vérifier-lactivation-de-la-corbeille-active-directory"&gt;&lt;a href="#v%c3%a9rifier-lactivation-de-la-corbeille-active-directory" class="header-anchor"&gt;&lt;/a&gt;Vérifier l&amp;rsquo;activation de la corbeille Active Directory
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;En PowerShell :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-ADOptionalfeature -Filter {name &lt;span style="color:#f92672"&gt;-like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Recycle Bin Feature&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="1-corbeille-ad-off.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Si la valeur &lt;code&gt;EnabledScope&lt;/code&gt; est vide, cela signifie que la corbeille Active Directory n'est pas activée.&lt;/p&gt;
&lt;h2 id="activer-la-corbeille-active-directory"&gt;&lt;a href="#activer-la-corbeille-active-directory" class="header-anchor"&gt;&lt;/a&gt;Activer la corbeille Active Directory
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;En PowerShell :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enable-ADOptionalFeature &lt;span style="color:#e6db74"&gt;&amp;#34;Recycle Bin Feature&amp;#34;&lt;/span&gt; -Scope ForestOrConfigurationSet -Target &lt;span style="color:#e6db74"&gt;&amp;#34;starwars-bzh.local&amp;#34;&lt;/span&gt; -server srv-ad
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="2-activation-corbeille-ad.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Les options &lt;code&gt;-Target&lt;/code&gt; et &lt;code&gt;-Server&lt;/code&gt; doivent être adapté avec l'infrastructure du domaine local. Un message d'avertissement apparait car c'est une action irréversible mais ça peut sauver des vies.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="3-corbeille-ad-on.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Maintenant, la corbeille Active Directory est activée.&lt;/p&gt;
&lt;h2 id="configurer-lalias-upn"&gt;&lt;a href="#configurer-lalias-upn" class="header-anchor"&gt;&lt;/a&gt;Configurer l&amp;rsquo;alias UPN
&lt;/h2&gt;&lt;p&gt;Le domaine local est &lt;code&gt;starwars-bzh.local&lt;/code&gt; et le domaine Microsoft 365 public associé est &lt;code&gt;starwarsbzh.onmicrosoft.com&lt;/code&gt;. Pour que la synchronisation fonctionne, un alias UPN doit être mis en place dans le domaine local. L'idée est de remplacer le &lt;code&gt;@starwars-bzh.local&lt;/code&gt; par &lt;code&gt;@starwarsbzh.onmicrosoft.com&lt;/code&gt; pour tous les utilisateurs qui seront synchronisés vers Azure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sur le contrôleur de domaine, ouvrir la MMC &lt;code&gt;Domaines et approbation Active Directory&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;domain.msc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="4-domain-msc.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effectuer un clic droit sur le nom de la console et cliquer sur &lt;code&gt;Propriétés&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="5-new-upn.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renseigner la zone &lt;code&gt;Autres suffixes UPN&lt;/code&gt; avec le domaine Microsoft 365 déclaré soit &lt;code&gt;starwarsbzh.onmicrosoft.com&lt;/code&gt; puis appliquer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite, il faut modifier en masse l'UPN par défaut des utilisateurs qui seront synchronisés dans Azure AD. Si on regarde les propriétés d'un compte utilisateur dans l'AD, on voit que l'on peut changer l'UPN par défaut.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changer l'UPN par défaut :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="6-propriete-upn.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Au lieu de la faire à la main sur chaque utilisateur, il est possible de le faire en masse.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En PowerShell :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-ADUser -Filter * -SearchBase &lt;span style="color:#e6db74"&gt;&amp;#34;OU=Services,OU=Starwars-BZH,DC=starwars-bzh,DC=local&amp;#34;&lt;/span&gt; | &lt;span style="color:#66d9ef"&gt;Foreach&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$UPNNew = $_.UserPrincipalName &lt;span style="color:#f92672"&gt;-replace&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@starwars-bzh.local&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;@starwarsbzh.onmicrosoft.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Set-ADUser -UserPrincipalName $UPNNew -Identity $_.SamAccountName
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L'option &lt;code&gt;-SearchBase&lt;/code&gt; est à adapter selon les OU contenant les utilisateurs qui seront à synchroniser. La cmdlet &lt;code&gt;Get-ADUser&lt;/code&gt; est récursive.&lt;/p&gt;
&lt;h2 id="installer-azure-ad-connect"&gt;&lt;a href="#installer-azure-ad-connect" class="header-anchor"&gt;&lt;/a&gt;Installer Azure AD Connect
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Télécharger l'outil à l'adresse suivante : &lt;a href="https://www.microsoft.com/en-us/download/details.aspx?id=47594"&gt;https://www.microsoft.com/en-us/download/details.aspx?id=47594&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Puis lancer l'installation sur le contrôleur de domaine local.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accepter les termes de la licence puis continuer :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="7-install-azure-ad-connect-1.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un message d'avertissement s'affiche indiquant que le domaine local n'est pas routable sur Internet. Une installation personnalisée est donc préférable :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="8-install-azure-ad-connect-2.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aucune des options suivantes n'est nécessaire. Il n'y a donc rien à cocher. Cliquer sur Installer :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="9-install-azure-ad-connect-3.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Connexion utilisateur&lt;/code&gt;, &lt;code&gt;Synchronisation de hachage du mot de passe&lt;/code&gt; est coché. Cela permet de synchroniser le mot de passe de l'AD local avec Azure AD. Le mot de passe ne transite pas en clair mais uniquement son hash. La case &lt;code&gt;Activer l&amp;#039;authentification unique&lt;/code&gt; peut être cochée si on souhaite mettre en place du SSO (Single-Sign-On). Ainsi l'utilisateur n'aura pas à ressaisir sont mot de passe du domaine lors de l'accès aux services Azure (Microsoft 365).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10-install-azure-ad-connect-4.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Connexion à Azure AD&lt;/code&gt;, un compte administrateur général du tenant Azure est requis :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11-install-azure-ad-connect-5.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Connexion de vos annuaires&lt;/code&gt;, la forêt locale est bien détectée. Cliquer sur &lt;code&gt;Ajout d&amp;#039;un annuaire&lt;/code&gt;. Il est préférable de créer un nouveau compte dans l'AD local qui sera utilisé par les outils effectuant la synchronisation entre l'AD local et Azure AD. Un compte administrateur du domaine est requis afin de pouvoir créer cet utilisateur. Cet utilisateur sera stocké dans le container &lt;code&gt;Users&lt;/code&gt;. Il ne devra être en aucun cas modifié ou supprimé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12-install-azure-ad-connect-6.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La connexion à l'AD local est configurée :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="13-install-azure-ad-connect-7.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les suffixes UPN apparaissent comme &lt;code&gt;Non ajouté&lt;/code&gt;. Cela est tout à fait normal car il n'y a pas de domaines DNS spécifiques du type &lt;code&gt;starwarsbzh.fr&lt;/code&gt;. Si un domaine DNS en &lt;code&gt;.fr&lt;/code&gt; a été ajouté au tenant Azure, celui-ci sera noté comme &lt;code&gt;Vérifié&lt;/code&gt;. &lt;code&gt;Nom d&amp;#039;utilisateur principal&lt;/code&gt; doit être sur &lt;code&gt;userPrincipalName&lt;/code&gt;. La case &lt;code&gt;Continuer sans faire correspondre tous les suffixes UPN à des domaines vérifiés&lt;/code&gt; est à cocher.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="14-install-azure-ad-connect-8.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélectionner les OU à synchroniser entre l'AD local et Azure AD :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="15-install-azure-ad-connect-9.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Identification de manière unique de vos utilisateurs&lt;/code&gt;, laisser le choix par défaut :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="16-install-azure-ad-connect-10.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Filtrer les utilisateurs et appareils&lt;/code&gt;, laisser le choix par défaut :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="17-install-azure-ad-connect-11.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans la partie &lt;code&gt;Fonctionnalités facultatives&lt;/code&gt;, laisser par défaut. A noter que la &lt;code&gt;Réécriture du mot de passe&lt;/code&gt; peut être intéressante afin de permettre aux utilisateurs de réinitialiser leur mot de passe directement à partir de Microsoft 365. Toutefois cela demande un niveau de licence Azure AD Premium P1. Sans cette option, le mot de passe est écrit dans l'Active Directory et synchronisé sur votre tenant, et non l'inverse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="18-install-azure-ad-connect-12.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le processus de synchronisation peut démarrer :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="19-install-azure-ad-connect-13.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour modifier la configuration, il suffit de relancer l'assistant en cliquant sur l'icône &lt;code&gt;Azure AD Connect&lt;/code&gt; présente sur le bureau puis sur le bouton &lt;code&gt;Configurer&lt;/code&gt; (Modification des OU à synchroniser, ajout de nouvelles fonctionnalités).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="20-fin-azure-ad-connect.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier la bonne présence des utilisateurs et des groupes dans le portail d'administration de Azure AD.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="21-verif-azure-ad.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="affecter-les-licences-microsoft-365"&gt;&lt;a href="#affecter-les-licences-microsoft-365" class="header-anchor"&gt;&lt;/a&gt;Affecter les licences Microsoft 365
&lt;/h2&gt;&lt;p&gt;Afin de pouvoir affecter une licence Microsoft 365 à un utilisateur, il va falloir dans 1er temps lui attribuer un &lt;strong&gt;Lieu d'utilisation&lt;/strong&gt;. Ce paramètre se trouve dans le profil de l'utilisateur dans Azure AD :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="24-localization.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention, une fois le &lt;code&gt;Lieu d&amp;#039;utilisation&lt;/code&gt; affecté à un utilisateur. Un délai de 5 minutes peut être nécessaire avant de pouvoir lui attribuer une licence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une licence Microsoft 365 peut ensuite être attribué à un utilisateur :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="22-affect-licence.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="vérifier-la-synchronisation"&gt;&lt;a href="#v%c3%a9rifier-la-synchronisation" class="header-anchor"&gt;&lt;/a&gt;Vérifier la synchronisation
&lt;/h2&gt;&lt;p&gt;Un outil nommé &lt;code&gt;Synchronization Service Manager&lt;/code&gt; a également été installé sur le contrôleur de domaine local permettant de vérifier l'état de la synchronisation. Par défaut celle-ci s'effectue toutes les 30 minutes.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="23-synchro-service.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A noter que si un mot de passe est modifié dans l'AD local, celui-ci sera répliqué sous 2 minutes au sein d'Azure AD.&lt;/p&gt;</description></item><item><title>LemonLDAP : Installation avec un LDAP et FusionDirectory</title><link>https://slash-root.fr/lemonldap-installation-avec-un-ldap-et-fusiondirectory/</link><pubDate>Tue, 16 Nov 2021 14:48:52 +0100</pubDate><guid>https://slash-root.fr/lemonldap-installation-avec-un-ldap-et-fusiondirectory/</guid><description>&lt;img src="https://slash-root.fr/lemonldap-installation-avec-un-ldap-et-fusiondirectory/cover.png" alt="Featured image of post LemonLDAP : Installation avec un LDAP et FusionDirectory" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;LemonLDAP::NG est un logiciel open source, créé en 2004 par la Gendarmerie nationale française. Il fournit une solution d' authentification unique distribuée avec gestion centralisée des droits sous licence GPL.&lt;/p&gt;
&lt;p&gt;Le logiciel LemonLDAP::NG est issu d'un logiciel créé par Eric German suivant le protocole de gestion d'annuaire LDAP sous TCP/IP pour le Ministère des finances français. La Gendarmerie nationale reprend ce logiciel pour l'élargir et le conformer à ses besoins.&lt;/p&gt;
&lt;p&gt;Le logiciel fonctionne avec les serveurs web Apache ou Nginx mais un mode reverse proxy permet de l'utiliser avec des applications exécutées sur un autre serveur (IIS, Tomcat, etc.)3,4.&lt;/p&gt;
&lt;p&gt;Il peut gérer plus de 200000 utilisateurs de différentes organisations, il implémente à la fois5 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les services de fournisseur d'identité et de service SAML, OpenID, CAS et OpenID Connect6 ;&lt;/li&gt;
&lt;li&gt;peut-être utilisé comme Proxy protocolaire en fédération des identités ;&lt;/li&gt;
&lt;li&gt;l'authentification basée sur LDAP, Kerberos, SQL, Twitter et d'autres protocoles ;&lt;/li&gt;
&lt;li&gt;l'authentification à double facteur (U2F, TOTP, Yubikey, REST ou externe tels SMS ou mails)7&lt;/li&gt;
&lt;li&gt;un système d'authentification unique basé sur des cookies sécurisés ;&lt;/li&gt;
&lt;li&gt;un menu dynamique des applications ;&lt;/li&gt;
&lt;li&gt;un module de réinitialisation de mots de passe ;&lt;/li&gt;
&lt;li&gt;un module d'auto-création de compte ;&lt;/li&gt;
&lt;li&gt;un dispositif de notification ;&lt;/li&gt;
&lt;li&gt;un explorateur de sessions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depuis la version 1.9, il propose un connecteur FranceConnect, lui permettant d'être simplement soit fournisseur d'identités, soit fournisseur de services8.&lt;/p&gt;
&lt;p&gt;La version 2.0.6 apporte, entre autres évolutions, les nouvelles fonctionnalités suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la sur-charge des seconds facteurs et la prise en charge du protocole RADIUS ;&lt;/li&gt;
&lt;li&gt;la possibilité de définir une politique locale des mots de passe ;&lt;/li&gt;
&lt;li&gt;un module de simulation d'identités pour des environnements de formation ;&lt;/li&gt;
&lt;li&gt;un module d'endossement d'identité pouvant être activé à des fins de diagnostic ;&lt;/li&gt;
&lt;li&gt;un module permettant de consulter le profil SSO d'un utilisateur et de vérifier ses droits d'accès ainsi que les en-têtes transmis ;&lt;/li&gt;
&lt;li&gt;un module pour éditer la configuration en lecture seule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La version 2.0.7 permet un meilleur support du protocole OpenId Connect et apporte de nombreuses améliorations ou correctifs.&lt;/p&gt;
&lt;p&gt;La version 2.0.8 offre de nombreuses API et améliorations.&lt;/p&gt;
&lt;p&gt;La version 2.0.9 apporte un outil de gestion des sessions, ameliore la gestion des mots de passe, une documentation intégrée au code source et des correctifs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : &lt;a href="https://fr.wikipedia.org/wiki/LemonLDAP::NG"&gt;LemonLDAP::NG — Wikipédia (wikipedia.org)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Un serveur OpenLDAP installé et fonctionnel&lt;/li&gt;
&lt;li&gt;FusionDirectory déployé sur le serveur LDAP&lt;/li&gt;
&lt;li&gt;Un nom de domaine avec la gestion de sa zone DNS&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Suite directe de : &lt;a href="https://slash-root.fr/2021/11/04/openldap-installation-avec-fusiondirectory/"&gt;OpenLDAP : Installation avec FusionDirectory - slash-root.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Le nom de domaine utilisé dans cet article sera : &lt;em&gt;example.com&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;LemonLDAP sera déployé sur le même serveur qu'OpenLDAP / FusionDirectory&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="installation-lemonldap"&gt;&lt;a href="#installation-lemonldap" class="header-anchor"&gt;&lt;/a&gt;Installation LemonLDAP
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Utiliser le dépôt officiel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cat &amp;gt; /etc/apt/sources.list.d/lemonldap-ng.list &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOL&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# LemonLDAP::NG repository
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;deb https://lemonldap-ng.org/deb 2.0 main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;deb-src https://lemonldap-ng.org/deb 2.0 main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Récupérer la clef GPG :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O - https://lemonldap-ng.org/_media/rpm-gpg-key-ow2 | sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mise à jour du cache apt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer le package principal et le module Perl pour Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install libapache2-mod-perl2 lemonldap-ng
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;LemonLDAP est également compatible avec Nginx mais cela ne sera pas abordé dans cet article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer le module FCGID pour Apache :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install libapache2-mod-fcgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activer les modules et les configurations :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite manager-apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite portal-apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite handler-apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2enmod fcgid perl alias rewrite headers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tester la configuration d'Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apachectl configtest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Par défaut, le domaine est &lt;code&gt;example.com&lt;/code&gt;. Celui-ci peut être changé.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour changer le nom de domaine par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#39;s/example\.com/mondomaine.local/g&amp;#39;&lt;/span&gt; /etc/lemonldap-ng/* /var/lib/lemonldap-ng/conf/lmConf-1.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Adapter la suite des instructions avec le domaine utilisé en lieu et place d'&lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="accès-web-ui"&gt;&lt;a href="#acc%c3%a8s-web-ui" class="header-anchor"&gt;&lt;/a&gt;Accès Web UI
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour accéder à la Web UI et effectuer les tests nécessaires, il y a 4 enregistrements A à réaliser dans la zone DNS du domaine :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auth.example.com&lt;/li&gt;
&lt;li&gt;manager.example.com&lt;/li&gt;
&lt;li&gt;test1.example.com&lt;/li&gt;
&lt;li&gt;test2.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;C'est 4 URLs sont à rediriger vers le même serveur. test1 et test2 sont là pour simuler 2 applications différentes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avec un navigateur web, accéder à &lt;a href="http://auth.example.com"&gt;http://auth.example.com&lt;/a&gt; :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="1stacces.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans un 1er temps, utiliser le login &lt;code&gt;dwho&lt;/code&gt; avec le mot de passe &lt;code&gt;dwho&lt;/code&gt;. Ce compte est local à LemonLDAP et à des droits administrateur sur la plateforme.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Se rendre sur &lt;code&gt;WebSSO Manager&lt;/code&gt; ou directement via l'URL : &lt;a href="http://manager.example.com"&gt;http://manager.example.com&lt;/a&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="websso_manager.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La configuration qui va être appliqué peut se faire intégralement par cette Web UI :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="configuration_sso.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Afin de pouvoir automatiser tout ce processus plus tard, la configuration sera réalisée en ligne de commande à l'aide de l'outil :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/share/lemonldap-ng/bin/lemonldap-ng-cli help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="activer-les-applications-de-démonstration"&gt;&lt;a href="#activer-les-applications-de-d%c3%a9monstration" class="header-anchor"&gt;&lt;/a&gt;Activer les applications de démonstration
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LemonLDAP est fournit avec 2 applications de démonstration qui permettent de lire les en-têtes HTTP. Pour les activer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite test-apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl reload apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C'est un vhost standard d'Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cat /etc/apache2/sites-enabled/test-apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remarquer la ligne qui à été ajoutée concernant le SSO :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# SSO protection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PerlHeaderParserHandler Lemonldap::NG::Handler::ApacheMP2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier l'accès aux applications de démonstration en se rendant sur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://test1.example.com"&gt;http://test1.example.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://test2.example.com"&gt;http://test2.example.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pas besoin de s'authentifier car cela a été fait l'autre de l'accès à la plateforme LemonLDAP :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="test1.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est possible de se déconnecter de cette application test1, en bas de la page :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="test1_logout.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lors de la prochaine tentative d'accès, une demande d'authentification de LemonLDAP sera demandée.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-avec-openldap--fusiondirectory"&gt;&lt;a href="#configuration-avec-openldap--fusiondirectory" class="header-anchor"&gt;&lt;/a&gt;Configuration avec OpenLDAP / FusionDirectory
&lt;/h2&gt;&lt;p&gt;Pour le moment LemonLDAP est en mode démo et utilise une base de compte interne. La configuration de LemonLDAP va consister à utiliser l'annuaire OpenLDAP préalablement déployé avec FusionDirectory. Une chose à savoir est que l'accès au manager est réservé exclusivement à l'utilisateur &lt;code&gt;dwho&lt;/code&gt; de la base de compte interne à LemonLDAP. Lors de la jonction de l'annuaire LDAP à LemonLDAP, la base de compte interne ne sera plus exploitable. Par conséquence, l'accès au WebSSO Manager ne se fera plus. Il y a plusieurs méthodes possibles pour retrouver cet accès. En voici une qui consiste à n'autoriser que l'utilisateur &lt;code&gt;fd-admin&lt;/code&gt; de l'annuaire LDAP :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Avec l'utilisateur &lt;code&gt;dwho&lt;/code&gt; se rendre dans le Manager. Puis &lt;code&gt;Hôtes virtuels&lt;/code&gt;, &lt;code&gt;manager.example.com&lt;/code&gt;, &lt;code&gt;Règles d&amp;#039;accès&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="vhost_manager.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier la partie &lt;code&gt;Règles&lt;/code&gt; à droite comme ci-dessus. Puis &lt;code&gt;Sauver&lt;/code&gt; la configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paramétrer la liaison à l'annuaire LDAP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; authentication LDAP &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userDB LDAP &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; passwordDB LDAP &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registerDB LDAP &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapServer &lt;span style="color:#e6db74"&gt;&amp;#39;ldap://localhost&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; managerDn &lt;span style="color:#e6db74"&gt;&amp;#39;cn=admin,dc=example,dc=com&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; managerPassword &lt;span style="color:#e6db74"&gt;&amp;#39;MonSuperPassword&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapBase &lt;span style="color:#e6db74"&gt;&amp;#39;ou=people,dc=example,dc=com&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Pour des raisons de praticité, le &lt;code&gt;managerDn&lt;/code&gt; utilisé est le compte admin de l'annuaire. Dans un contexte de production un autre compte sera utilisé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Afin d'avoir une vue synthétique de l'annuaire et obtenir les chemins complets pour la précédente commande, utiliser :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo slapcat | grep &lt;span style="color:#e6db74"&gt;&amp;#34;dn:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exporter les attributs souhaités :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -force &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -yes &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addKey &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapExportedVars uid uid &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapExportedVars cn cn &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapExportedVars sn sn &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapExportedVars mail mail &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ldapExportedVars givenName givenName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voici le retour attendu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status : &lt;span style="color:#f92672"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt; &lt;span style="color:#e6db74"&gt;&amp;#39;OK&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'utilisateur &lt;code&gt;fd-admin&lt;/code&gt; peut maintenant s'authentifier, avec accès au manager, sur la plateforme : &lt;a href="http://auth.example.com"&gt;http://auth.example.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="auth_fdadmin.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>Windows Store : Error code 0x80070424</title><link>https://slash-root.fr/windows-store-error-code-0x80070424/</link><pubDate>Sun, 14 Nov 2021 10:50:08 +0100</pubDate><guid>https://slash-root.fr/windows-store-error-code-0x80070424/</guid><description>&lt;img src="https://slash-root.fr/windows-store-error-code-0x80070424/cover.png" alt="Featured image of post Windows Store : Error code 0x80070424" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;L'erreur est apparue sur un poste en Windows 10.&lt;/li&gt;
&lt;li&gt;Toutes les applications du Windows Store pouvaient être installées.&lt;/li&gt;
&lt;li&gt;Windows Update fonctionnait correctement&lt;/li&gt;
&lt;li&gt;Ajout d'une clef produit (AoE 4)&lt;/li&gt;
&lt;li&gt;Impossible d'installer AoE, erreur 0x80070424&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resolution"&gt;&lt;a href="#resolution" class="header-anchor"&gt;&lt;/a&gt;Resolution
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ré-enregistrement des applications du Windows Store en PowerShell :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-AppxPackage -AllUsers| &lt;span style="color:#66d9ef"&gt;Foreach&lt;/span&gt; {Add-AppxPackage -DisableDevelopmentMode -Register &lt;span style="color:#960050;background-color:#1e0010"&gt;“&lt;/span&gt;$($_.InstallLocation)\AppXManifest.xml&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Keycloak : Integration LDAP externe</title><link>https://slash-root.fr/keycloak-integration-ldap-externe/</link><pubDate>Thu, 04 Nov 2021 17:33:31 +0100</pubDate><guid>https://slash-root.fr/keycloak-integration-ldap-externe/</guid><description>&lt;img src="https://slash-root.fr/keycloak-integration-ldap-externe/cover.png" alt="Featured image of post Keycloak : Integration LDAP externe" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;La solution Keycloak est embarqué avec la possibilité de joindre un annuaire LDAP/AD. Il est possible de fédérer plusieurs serveurs d'annuaires au sein d'un même royaume keycloak. Les attributs utilisateurs de l'annuaire LDAP peuvent être mappé dans un model d'utilisateur keycloak. Par défaut, les attributs &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;first name&lt;/code&gt;, &lt;code&gt;last name&lt;/code&gt; sont mappés mais d'autres attributs peuvent l'être également.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cet article fait suite à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://slash-root.fr/2021/10/25/keycloak-installation-avec-docker-et-reverse-proxy-ssl-nginx/"&gt;Keycloak : Installation avec Docker et reverse-proxy SSL Nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slash-root.fr/2021/11/04/openldap-installation-avec-fusiondirectory/"&gt;OpenLDAP : Installation avec FusionDirectory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Un serveur Keycloak fonctionnel&lt;/li&gt;
&lt;li&gt;Un serveur OpenLDAP/FusionDirectory fonctionnel&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Toute la procédure fera référence aux configuration déployées dans les articles cités en introduction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se rendre sur la WebUI du serveur Keycloak : &lt;a href="https://keycloak.example.com"&gt;https://keycloak.example.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se rendre dans la partie &lt;code&gt;User Federation&lt;/code&gt; et ajouter &lt;code&gt;ldap&lt;/code&gt; en provider :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="user_fede.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="paramétrage---1ère-partie"&gt;&lt;a href="#param%c3%a9trage---1%c3%a8re-partie" class="header-anchor"&gt;&lt;/a&gt;Paramétrage - 1ère partie
&lt;/h3&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="fed1.png" alt="" /&gt;&lt;/p&gt;
&lt;h4 id="stockage"&gt;&lt;a href="#stockage" class="header-anchor"&gt;&lt;/a&gt;Stockage
&lt;/h4&gt;&lt;p&gt;Par défaut, Keycloak importe les utilisateurs de l'annuaire LDAP dans sa base locale d'utilisateurs. Cette copie des utilisateurs peut être synchronisée soit manuellement soit automatiquement toutes les x minutes par exemple. Seul les mots de passes ne sont pas synchronisés. Dans le processus d'identification de l'utilisateur, la validation du mot de passe est délégué au serveur LDAP. L'avantage de cette approche est que toutes les fonctionnalités de Keycloak fonctionneront avec des attributs utilisateurs supplémentaires qui sont stockés localement sur Keycloak. Cela permet également de réduire la charge sur le serveur LDAP.&lt;/p&gt;
&lt;p&gt;Il est possible de ne pas importer les utilisateurs de l'annuaire LDAP dans Keycloak en décochant &lt;code&gt;Import Users&lt;/code&gt;. Cela aura pour effet d'augmenter les requêtes vers le serveur LDAP car aucune information utilisateur ne sera stockée localement sur Keycloak. L'autre conséquence de ce choix est que si une fonctionnalité de Keycloak repose sur une partie non supporté par l'annuaire LDAP, celle-ci ne fonctionnera pas. En revanche, l'avantage est de ne pas avoir à gérer la synchronisation des comptes.&lt;/p&gt;
&lt;h4 id="edition"&gt;&lt;a href="#edition" class="header-anchor"&gt;&lt;/a&gt;Edition
&lt;/h4&gt;&lt;p&gt;L'&lt;code&gt;Edit Mode&lt;/code&gt; permet aux utilisateurs et aux administrateurs, à travers leurs consoles respectives sur Keycloak, de modifier les metadas utilisateur.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;READONLY&lt;/code&gt; : Les attributs utilisateurs resteront inchangés. Une erreur apparaitra si une modification d'attribut est faites. Cela est également valable pour la modification d'un mot de passe utilisateur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WRITABLE&lt;/code&gt; : Tous les attributs utilisateurs modifiés seront synchronisés automatiquement avec l'annuaire LDAP.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNSYNCED&lt;/code&gt; : Tous les changements d'attributs seront stockés localement dans la base de Keycloak. La synchronisation des modifications au sein de Keycloak vers l'annuaire LDAP devra être faites manuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="vendor"&gt;&lt;a href="#vendor" class="header-anchor"&gt;&lt;/a&gt;Vendor
&lt;/h4&gt;&lt;p&gt;Plusieurs choix sont possibles suivant le type d'annuaire LDAP en face :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active Directory&lt;/li&gt;
&lt;li&gt;Red Hat Directory Server&lt;/li&gt;
&lt;li&gt;Tivoli&lt;/li&gt;
&lt;li&gt;Novell eDirectory&lt;/li&gt;
&lt;li&gt;Other&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'annuaire installé étant OpenLDAP, &lt;code&gt;other&lt;/code&gt; est le choix à faire.&lt;/p&gt;
&lt;h3 id="paramétrage---2nd-partie"&gt;&lt;a href="#param%c3%a9trage---2nd-partie" class="header-anchor"&gt;&lt;/a&gt;Paramétrage - 2nd partie
&lt;/h3&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="fed2.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Connection URL&lt;/code&gt; : Indiquer le chemin d'accès au serveur LDAP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Users DN&lt;/code&gt; : Indiquer le chemin d'accès aux utilisateurs dans l'annuaire.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bind DN&lt;/code&gt; : Indiquer un compte dans l'annuaire ayant des droits d'écriture.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bind Credential&lt;/code&gt; : Le mot de passe du compte spécifié dans &amp;quot;Bind DN&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="synchronisation"&gt;&lt;a href="#synchronisation" class="header-anchor"&gt;&lt;/a&gt;Synchronisation
&lt;/h3&gt;&lt;p&gt;Un peu plus bas de la page de configuration de la connexion au serveur LDAP, un menu &lt;code&gt;Sync Settings&lt;/code&gt; est disponible :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sync_set.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Batch Size&lt;/code&gt; : Le nombre de compte utilisateurs qui seront traités en une synchronisation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Periodic Full Sync&lt;/code&gt; : La planification en secondes de la synchronisation totale / complète.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Periodic Changed Users Sync&lt;/code&gt; : La planification en secondes de la synchronisation des changements apportés aux attributs utilisateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après avoir sauvegarder tous les paramètres, il est possible de déclencher manuellement une première synchronisation des utilisateurs de l'annuaire LDAP dans Keycloak :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sync_manuel.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="mappers"&gt;&lt;a href="#mappers" class="header-anchor"&gt;&lt;/a&gt;Mappers
&lt;/h3&gt;&lt;p&gt;Par défaut, des &lt;code&gt;Mappers&lt;/code&gt; sont mis en place. Un mapper va permettre de mapper un attribut utilisateur de l'annuaire LDAP à un attribut utilisateur de Keycloak :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="mappers.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dans mes différents essais, en déployant cette solution de SSO avec un OpenLDAP, il est apparu que l'attribut &lt;code&gt;firstName&lt;/code&gt; de Keycloak est mappé avec l'attribut &lt;code&gt;cn&lt;/code&gt; de l'annuaire LDAP. L'attribut &lt;code&gt;cn&lt;/code&gt; dans l'annuaire (avec la couche FusionDirectory) est une concaténation du prénom et du nom de l'utilisateur :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="cn_ldap.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Au lieu de modifier la configuration de l'annuaire LDAP, modifier le mapper &lt;code&gt;first name&lt;/code&gt; dans Keycloak :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="first_name.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Modifier &lt;code&gt;LDAP Attribute&lt;/code&gt; pour indiquer &lt;code&gt;givenName&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;givenName&lt;/code&gt; est le nom de l'attribut prénom au sein de l'annuaire LDAP dans notre configuration.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>OpenLDAP : Installation avec FusionDirectory</title><link>https://slash-root.fr/openldap-installation-avec-fusiondirectory/</link><pubDate>Thu, 04 Nov 2021 13:12:04 +0100</pubDate><guid>https://slash-root.fr/openldap-installation-avec-fusiondirectory/</guid><description>&lt;img src="https://slash-root.fr/openldap-installation-avec-fusiondirectory/cover.png" alt="Featured image of post OpenLDAP : Installation avec FusionDirectory" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;OpenLDAP&lt;/strong&gt; est un annuaire informatique qui fonctionne sur le modèle client/serveur. Il contient des informations de n'importe quelle nature qui sont rangées de manière hiérarchique. Pour bien comprendre le concept, il est souvent comparé aux pages jaunes, où le lecteur recherche un numéro de téléphone particulier : il va d'abord sélectionner la profession, puis la ville, puis le nom de l'entrée pour trouver finalement le numéro de téléphone. En pratique, dans un réseau informatique, il est utilisé pour enregistrer une grande quantité d'utilisateurs ou de services, parfois des centaines de milliers. Il permet d'organiser hiérarchiquement les utilisateurs par département, par lieu géographique ou par n'importe quel autre critère. C'est une alternative libre à Microsoft Active Directory.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : &lt;a href="https://fr.wikipedia.org/wiki/OpenLDAP"&gt;OpenLDAP — Wikipédia (wikipedia.org)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;FusionDirectory&lt;/strong&gt; est une application web qui permet la gestion des infrastructures et le déploiement des systèmes. Son but est de faciliter le travail de l’administrateur système indépendamment de la taille et de la variété du parc à gérer.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="schema_intro.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : &lt;a href="https://fr.wikibooks.org/wiki/FusionDirectory"&gt;FusionDirectory — Wikilivres (wikibooks.org)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans cet article, je vais présenter l'installation et la configuration initiale d'OpenLDAP avec FusionDirectory sur un même serveur Debian 10 fraîchement installé avec les outils de base.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un serveur Debian 10 fraîchement installé et à jour.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une adresse IP statique doit être configuré sur le serveur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le nom d'hôte du serveur doit être le FQDN futur dans l'annuaire ldap.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vérifier les fichiers &lt;code&gt;/etc/hostname&lt;/code&gt; et &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exemple d&amp;#39;un fichier /etc/hostname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;srv-ldap.domaine.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exemple d&amp;#39;un fichier /etc/hosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;127.0.0.1 localhost
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;127.0.1.1 srv-ldap
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.10 srv-ldap.domaine.local srv-ldap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="openldap"&gt;&lt;a href="#openldap" class="header-anchor"&gt;&lt;/a&gt;OpenLDAP
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer les paquets nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install slapd ldap-utils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saisir le mot de passe souhaité pour le compte &lt;code&gt;admin&lt;/code&gt; de l'annuaire :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="admin_pwd.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saisir une seconde fois le mot de passe pour confirmer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier l'installation d'OpenLDAP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo slapcat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voici le retour attendu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dn: dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;objectClass: top
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;objectClass: dcObject
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;objectClass: organization
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;o: domaine.local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dc: domaine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;structuralObjectClass: organization
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;entryUUID: a91714fa-d1a0-103b-9752-7ba3681b6a0b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;creatorsName: cn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;createTimestamp: 20211104095226Z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;entryCSN: 20211104095226.276305Z#000000#000#000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;modifiersName: cn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;modifyTimestamp: 20211104095226Z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dn: cn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;objectClass: simpleSecurityObject
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;objectClass: organizationalRole
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cn: admin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description: LDAP administrator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;userPassword:: e1NTSEF9bHRGR2hnUTNCMTdLcWlUSTI1UVU2TjI2d3U4dmhydWc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;structuralObjectClass: organizationalRole
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;entryUUID: a9175640-d1a0-103b-9753-7ba3681b6a0b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;creatorsName: cn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;createTimestamp: 20211104095226Z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;entryCSN: 20211104095226.278012Z#000000#000#000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;modifiersName: cn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;admin,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,dc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;modifyTimestamp: 20211104095226Z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;La configuration du schéma de l'annuaire sera faites à travers FusionDirectory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="fusiondirectory"&gt;&lt;a href="#fusiondirectory" class="header-anchor"&gt;&lt;/a&gt;FusionDirectory
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Récupérer et ajouter la clef GPG officielle de FusionDirectory :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://public.fusiondirectory.org/FD-archive-key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y gnupg2 &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-key add FD-archive-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter le repository de fusiondirectory pour debian :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cat &amp;gt; /etc/apt/sources.list.d/fusiondirectory-release.list &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOL&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;#fusiondirectory repository
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;deb https://public.fusiondirectory.org/stretch-fusiondirectory-release/ stretch main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter le repository de schema2ldif pour debian :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cat &amp;gt; /etc/apt/sources.list.d/schema2ldif-release.list &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOL&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;#latest version of schema2ldif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;deb https://public.fusiondirectory.org/stretch-schema2ldif-release/ stretch main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mettre à jour la liste des paquets :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les repositories étant en https, installer le paquet &lt;code&gt;apt-transport-https&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer les paquets pour FusionDirectory :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install fusiondirectory fusiondirectory-schema
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Apache2 sera déployé en même temps. Il est possible de se reposer sur un autre serveur web mais cela ne sera pas abordé ici.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer les paquets manquant pour PHP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install php-xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer les schémas FusionDirectory dans la base LDAP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fusiondirectory-insert-schema
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer Apache2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter à la WebUI de FusionDirectory : &lt;a href="http://srv-ldap.domaine.local/fusiondirectory/"&gt;http://srv-ldap.domaine.local/fusiondirectory/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour accéder au serveur, il est nécessaire de mettre un token dans un fichier. Celui-ci est indiquer sur la WebUI :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="token_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier / Coller la commande avant de cliquer sur &lt;strong&gt;Suivant&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo echo -n cm5ch69brdj9jdm8uejjrfans0 &amp;gt; /var/cache/fusiondirectory/fusiondirectory.auth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer la langue :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="langue_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier que l'installation soit entièrement en vert avant de continuer :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="verif_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier les informations de connexion au serveur LDAP et saisir le mot de passe du compte &lt;code&gt;admin&lt;/code&gt; de l'annuaire spécifié lors de l'installation d'OpenLDAP plus haut :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="connect_ldap.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Régler le fuseau horaire :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="timezone_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;La configuration par défaut est conservé dans cette procédure. Il est bien évidement possible de la modifier plus tard pour par définir une politique de sécurité des mots de passes par exemple.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Une inspection LDAP est effectuée et propose plusieurs actions afin d'être pleinement compatible avec FusionDirectory. Effectuer les actions nécessaires :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="inspect_ldap.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Télécharger le fichier de configuration :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="config_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Placer ce fichier &lt;code&gt;fusiondirectory.conf&lt;/code&gt; dans le répertoire du serveur &lt;code&gt;/etc/fusiondirectory/&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier la configuration de FusionDirectory :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fusiondirectory-setup --check-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une erreur est détectée. Répondre &lt;code&gt;Yes&lt;/code&gt; afin de corriger les permissions du fichier de configuration de fusion :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Checking FusionDirectory&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s config file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/etc/fusiondirectory/fusiondirectory.conf exists…
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/etc/fusiondirectory/fusiondirectory.conf is not set properly, &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; you want to fix it ?: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Yes/No&lt;span style="color:#f92672"&gt;]&lt;/span&gt;?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenLDAP et FusionDirectory sont fonctionnels :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="end_install.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="attribut-mail"&gt;&lt;a href="#attribut-mail" class="header-anchor"&gt;&lt;/a&gt;Attribut mail
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Par défaut, il n'y pas d'attribut mail sur un utilisateur. Cependant, il est possible de l'ajouter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer les paquets nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install fusiondirectory-plugin-mail fusiondirectory-plugin-mail-schema
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier le schéma de l'annuaire afin de faire apparaitre l'attribut mail :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fusiondirectory-insert-schema -i /etc/ldap/schema/fusiondirectory/mail-fd.schema
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il est désormais possible de spécifier une adresse mail pour les utilisateurs :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="mail_fusion.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Samba : Installation d’un contrôleur de domaine</title><link>https://slash-root.fr/samba-installation-dun-controleur-de-domaine/</link><pubDate>Fri, 29 Oct 2021 10:40:56 +0200</pubDate><guid>https://slash-root.fr/samba-installation-dun-controleur-de-domaine/</guid><description>&lt;img src="https://slash-root.fr/samba-installation-dun-controleur-de-domaine/cover.png" alt="Featured image of post Samba : Installation d’un contrôleur de domaine" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Samba permet d'implémenter le protocole propriétaire SMB/CIFS de Microsoft sous un environnement Unix et ses dérivés. Il offre la possibilité de partager des ressources dans un SI hétérogène Windows/Linux.&lt;/p&gt;
&lt;p&gt;A partir de la version 3, Samba fournit le partage de fichiers/imprimantes et peut intégrer un domaine Active Directory en tant que membre. Il peut également être PDC (Primary Domain Controller) avec un niveau fonctionnel NT4.&lt;/p&gt;
&lt;p&gt;A partir de la version 4, Samba peut servir de contrôleur de domaine Active Directory avec un niveau fonctionnel Windows Server 2008 et offre les services d'authentification AD. Des GPOs peuvent être déployées.&lt;/p&gt;
&lt;p&gt;Dans cette procédure, une distribution Debian 10 et Samba en version 4 sont utilisées.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le serveur samba sera nommé : srv-samba&lt;/li&gt;
&lt;li&gt;Le domaine sera : domaine.local&lt;/li&gt;
&lt;li&gt;L'adresse IP du serveur samba sera : 192.168.1.10&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="préparation"&gt;&lt;a href="#pr%c3%a9paration" class="header-anchor"&gt;&lt;/a&gt;Préparation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modifier le nom du serveur en y indiquant le futur domaine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo echo &lt;span style="color:#e6db74"&gt;&amp;#34;srv-samba.domaine.local&amp;#34;&lt;/span&gt; &amp;gt; /etc/hostname &lt;span style="color:#75715e"&gt;# Pour la persistence après un reboot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo hostname &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;cat /etc/hostname&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Pour modifier le nom sans avoir à reboot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attribuer une adresse IP fixe :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/network/interfaces
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exemple :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# auto ens18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# iface ens18 inet static&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# address 192.168.1.10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# netmask 255.255.255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gateway 192.168.1.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier le fichier hosts en conséquence :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo echo &lt;span style="color:#e6db74"&gt;&amp;#34;192.168.1.10 srv-samba.domaine.local srv-samba&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-et-configuration-de-samba"&gt;&lt;a href="#installation-et-configuration-de-samba" class="header-anchor"&gt;&lt;/a&gt;Installation et configuration de Samba
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installation des paquets nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt -y install samba krb5-config winbind smbclient
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Modifier smb.conf pour utiliser les paramètres WINS fournis par DHCP ? : &lt;strong&gt;Non&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Royaume (« realm ») Kerberos version 5 par défaut : &lt;strong&gt;domaine.local&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Serveurs Kerberos du royaume : &lt;strong&gt;srv-samba.domaine.local&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Serveur administratif du royaume Kerberos : &lt;strong&gt;srv-samba.domaine.local&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Samba est installé.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="création-du-domaine"&gt;&lt;a href="#cr%c3%a9ation-du-domaine" class="header-anchor"&gt;&lt;/a&gt;Création du domaine
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Renommer le fichier de configuration principal de samba &lt;code&gt;/etc/samba/smb.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provisionner le domaine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo samba-tool domain provision
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Realm [DOMAINE.LOCAL]: &lt;strong&gt;Appuyer sur Entrée&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Domain [DOMAINE]: &lt;strong&gt;Appuyer sur Entrée&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Server Role (dc, member, standalone) [dc]: &lt;strong&gt;Appuyer sur Entrée&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: &lt;strong&gt;Appuyer sur Entrée&lt;/strong&gt; (Le serveur DNS sera interne à Samba dans cette installation)&lt;/li&gt;
&lt;li&gt;DNS forwarder IP address (write 'none' to disable forwarding) [1.1.1.1]: &lt;strong&gt;Appuyer sur Entrée&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Administrator password: &lt;strong&gt;Saisir le mot de passe admin du domaine&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Retype password: &lt;strong&gt;Ressaisir le mot de passe admin du domaine&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le domaine est créé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Looking up IPv4 addresses
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Looking up IPv6 addresses
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No IPv6 address will be assigned
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up share.ldb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up secrets.ldb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up the registry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up the privileges database
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up idmap db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up SAM db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb partitions and settings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb rootDSE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Pre-loading the Samba &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; and AD schema
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unable to determine the DomainSID, can not enforce uniqueness constraint on local domainSIDs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding DomainDN: DC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,DC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding configuration container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb schema
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb configuration data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up display specifiers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Modifying display specifiers and extended rights
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding users container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Modifying users container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding computers container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Modifying computers container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up well known security principals
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb users and groups
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up self join
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding DNS accounts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Creating CN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;MicrosoftDNS,CN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;System,DC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;domaine,DC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Creating DomainDnsZones and ForestDnsZones partitions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Populating DomainDnsZones and ForestDnsZones partitions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up sam.ldb rootDSE marking as synchronized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fixing provision GUIDs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A Kerberos configuration suitable &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; Samba AD has been generated at /var/lib/samba/private/krb5.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Once the above files are installed, your Samba AD server will be ready to use
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Server Role: active directory domain controller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hostname: srv-samba
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NetBIOS Domain: DOMAINE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DNS Domain: domaine.local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DOMAIN SID: S-1-5-21-1555810112-1359199810-2012430263
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mise-en-service-du-domaine"&gt;&lt;a href="#mise-en-service-du-domaine" class="header-anchor"&gt;&lt;/a&gt;Mise en service du domaine
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Copier le fichier de configuration de kerberos dans le répertoire &lt;code&gt;/etc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp /var/lib/samba/private/krb5.conf /etc/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arrêter les services SMB, NMBD et Bind :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl stop smbd nmbd winbind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Désactiver les services SMB, NMBD et Bind :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl disable smbd nmbd winbind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rendre visible le service &lt;code&gt;samba-ad-dc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl unmask samba-ad-dc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Démarrer le service :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start samba-ad-dc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activer le service :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable samba-ad-dc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier le statut de Samba :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;smbclient -L localhost -U%
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tout est OK :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Sharename Type Comment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --------- ---- -------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; netlogon Disk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sysvol Disk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; IPC$ IPC IPC Service &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Samba 4.9.5-Debian&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reconnecting with SMB1 &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; workgroup listing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Server Comment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Workgroup Master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WORKGROUP SRV-SAMBA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier le niveau fonctionnel du domaine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo samba-tool domain level show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le niveau fonctionnel du domaine est Windows 2008 R2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Domain and forest &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; level &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; domain &lt;span style="color:#e6db74"&gt;&amp;#39;DC=domaine,DC=local&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Forest &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; level: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Windows&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2008&lt;/span&gt; R2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Domain &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; level: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Windows&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2008&lt;/span&gt; R2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Lowest &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; level of a DC: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Windows&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2008&lt;/span&gt; R2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="création-utilisateur"&gt;&lt;a href="#cr%c3%a9ation-utilisateur" class="header-anchor"&gt;&lt;/a&gt;Création utilisateur
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer un 1er utilisateur dans l'annuaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo samba-tool user create superman
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Indiquer le mot de passe de superman :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;New Password:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Retype Password:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User &lt;span style="color:#e6db74"&gt;&amp;#39;superman&amp;#39;&lt;/span&gt; created successfully
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jonction-au-domaine"&gt;&lt;a href="#jonction-au-domaine" class="header-anchor"&gt;&lt;/a&gt;Jonction au domaine
&lt;/h2&gt;&lt;p&gt;La jonction au domaine d'un poste Windows est identique qu'avec un contrôleur de domaine Microsoft. Les outils d'administrations (RSAT) peuvent être employé pour administrer les objets du domaine (dsa.msc), les gpo (gpmc.msc), le serveur dns (dnsmgmt.msc)...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Avec un DC Microsoft, un compte utilisateur du domaine peut être employé pour joindre un poste au domaine. Avec samba, le compte &lt;strong&gt;administrator&lt;/strong&gt; doit être employé.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>OpenProject : Mise en place du SSO avec Keycloak</title><link>https://slash-root.fr/openproject-mise-en-place-du-sso-avec-keycloak/</link><pubDate>Thu, 28 Oct 2021 14:40:22 +0200</pubDate><guid>https://slash-root.fr/openproject-mise-en-place-du-sso-avec-keycloak/</guid><description>&lt;img src="https://slash-root.fr/openproject-mise-en-place-du-sso-avec-keycloak/cover.jpg" alt="Featured image of post OpenProject : Mise en place du SSO avec Keycloak" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Par défaut, OpenProject utilise une base locale d'utilisateurs pour gérer l'authentification. Afin de centraliser l'authentification sur un serveur dédié (avec OpenID-Connect) Keycloak, une configuration SSO est nécessaire sur OpenProject.&lt;/p&gt;
&lt;p&gt;OpenProject va utiliser OpenID-Connect pour faire du SSO. Ca tombe bien Keycloak aussi ! Un paramétrage concernant cela est disponible via la web UI d'administration d'OpenProject mais celle-ci ne concerne que Google et Azure. Fort heureusement, c'est tout de même possible en éditant un fichier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Référence :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://slash-root.fr/2021/10/20/installation-openproject/"&gt;OpenProject : Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slash-root.fr/2021/10/25/keycloak-installation-avec-docker-et-reverse-proxy-ssl-nginx/"&gt;Keycloak : Installation avec Docker et reverse-proxy SSL Nginx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h2&gt;&lt;p&gt;Pour mener à bien cette procédure, il faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un serveur OpenProject installé avec une licence &lt;strong&gt;Entreprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Un serveur Keycloak installé&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour la licence OpenProject Entreprise, il est possible de faire un essai de 14 jours gratuitement. Sans licence Entreprise, le SSO n'est pas pris en charge par OpenProject. Lorsque l'essai de la version Entreprise arrive à son terme et que celle-ci n'est pas prolongé, alors la licence repasse automatique en Community Edition (Free).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuration-partie-keycloak"&gt;&lt;a href="#configuration-partie-keycloak" class="header-anchor"&gt;&lt;/a&gt;Configuration partie Keycloak
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Création d'un royaume :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="add_realm.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Création d'un client :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="add_client.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Root URL&lt;/code&gt; : L'URL d'accès au serveur OpenProject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Dans les propriétés du client nouvellement créer, définir l' &lt;code&gt;Access Type&lt;/code&gt; sur &lt;code&gt;confidential&lt;/code&gt; afin de générer un secret :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="confidential.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bien penser à sauvegarder la modification en bas de la page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Un nouvel onglet &lt;code&gt;Credentials&lt;/code&gt; est apparu dans les propriétés du client. Un secret a été généré :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="secret.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer un compte utilisateur si le serveur Keycloak est fraichement installé :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="add_user.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention : Sur l'illustration, seul le champ &lt;code&gt;Username&lt;/code&gt; est indiqué comme obligatoire. Lorsque qu'un utilisateur s'authentifiera avec son compte Keycloak sur OpenProject, les champs &lt;code&gt;Email&lt;/code&gt; , &lt;code&gt;First Name&lt;/code&gt; , &lt;code&gt;Last Name&lt;/code&gt; seront obligatoires. Ces propriétés ne peuvent en cas cas être communes à un autre compte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Une fois l'utilisateur créé, dans l'onglet &lt;code&gt;Credentials&lt;/code&gt; , définir son mot de passe :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="password-1.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="configuration-partie-openproject"&gt;&lt;a href="#configuration-partie-openproject" class="header-anchor"&gt;&lt;/a&gt;Configuration partie OpenProject
&lt;/h2&gt;&lt;p&gt;Pour qu'un utilisateur puisse utiliser son compte Keycloak pour s'authentifier sur OpenProject, celui-ci doit être activé dans OpenProject. Par défaut l'activation se fait manuellement. Pour automatiser ce processus, une option d' &lt;code&gt;activation automatique du compte&lt;/code&gt; existe dans OpenProject.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se connecter en admin sur OpenProject puis &amp;quot;Administration -&amp;gt; Authentification&amp;quot;, modifier l'option &lt;code&gt;Auto-enregistrement&lt;/code&gt; comme suit :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="activation_auto.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour la suite des opérations, se connecter en SSH sur le serveur OpenProject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Modifier le fichier &lt;code&gt;/opt/openproject/config/configuration.yml&lt;/code&gt; afin d'ajouter la possibilité de s'authentifier sur OpenProject au travers du serveur SSO Keycloak. Ajouter les lignes suivantes dans la section &lt;code&gt;default&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# omniauth_direct_login_provider: openid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;openid_connect&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;openid&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;keycloak.example.fr&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;identifier&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MonOpenProject&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;af90aced-0000-0000-0000-0959e6fd5226&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;icon&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;openid_connect/auth_provider-google.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display_name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SSO&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;authorization_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/auth&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;token_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/token&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;userinfo_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/userinfo&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;end_session_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/logout&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check_session_iframe&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/login-status-iframe.html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sso&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;issuer&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;discovery&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adapter les valeurs suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Le&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FQDN&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;du&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;serveur&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;identifier&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Le&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nom&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;du&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;client&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;créé&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dans&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Le&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;du&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;client&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;généré&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dans&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Les URLS suivantes peuvent facilement être obtenues dans Keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Realm Settings -&amp;gt; Endpoints : OpenIP Endpoint Configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;authorization_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/auth&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;token_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/token&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;userinfo_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/userinfo&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;end_session_endpoint&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/logout&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;check_session_iframe&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume/protocol/openid-connect/login-status-iframe.html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;issuer&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://keycloak.example.fr/auth/realms/MonRoyaume&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;La directive &lt;code&gt;omniauth_direct_login_provider&lt;/code&gt; indique que seul l'authentification passera par keycloak. Commenter cette directive pour avoir le choix d'authentification entre keycloak (SSO) ou la base locale d'OpenProject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;OpenProject : Redémarrer le service openproject&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart openproject
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérification-du-fonctionnement"&gt;&lt;a href="#v%c3%a9rification-du-fonctionnement" class="header-anchor"&gt;&lt;/a&gt;Vérification du fonctionnement
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Dorénavant lors de la connexion sur OpenProject, une option de connexion SSO est disponible :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sso.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le serveur Keycloak prends le relais pour demander les credentials :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="sso_keycloak.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Après la 1ère connexion d'un utilisateur au travers du SSO, celui-ci est présent dans OpenProject avec un fournisseur d'authentification &lt;code&gt;OpenID&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="openid.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>Fail2ban : Protéger l’authentification WordPress sous Nginx</title><link>https://slash-root.fr/fail2ban-proteger-lauthentification-wordpress-sous-nginx/</link><pubDate>Tue, 26 Oct 2021 02:43:26 +0200</pubDate><guid>https://slash-root.fr/fail2ban-proteger-lauthentification-wordpress-sous-nginx/</guid><description>&lt;img src="https://slash-root.fr/fail2ban-proteger-lauthentification-wordpress-sous-nginx/cover.png" alt="Featured image of post Fail2ban : Protéger l’authentification WordPress sous Nginx" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;WordPress est une application web extrêmement populaire. Il existe de nombreuses attaques de brute-force sur la page de login de WordPress. Ces attaques peuvent générées des milliers de tentatives de login à votre application WordPress.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cet article fait suite à &lt;a href="https://slash-root.fr/2021/10/25/fail2ban-installation-et-configuration/"&gt;Fail2ban : Installation et configuration&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Par défaut fail2ban est embarqué avec de nombreuses jails mais aucune pour protéger l'authentification de WordPress. Avant de configurer une jail pour WordPress, il va falloir faire quelques modifications en son sein. En effet par défaut, lorsqu'un utilisateur tente de s'authentifier, un message s'affiche à l'écran indiquant une erreur mais surtout la page retourne un code &lt;code&gt;HTTP 200&lt;/code&gt; (le même que celui lors d'un succès d'authentification). Cela sera modifié.&lt;/p&gt;
&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;h3 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;L'installation et les explications sur la configuration général de fail2ban est décrite dans cet article : &lt;a href="https://slash-root.fr/2021/10/25/fail2ban-installation-et-configuration/"&gt;Fail2ban : Installation et configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fail2ban doit être installé et fonctionnel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="modification-du-code-http"&gt;&lt;a href="#modification-du-code-http" class="header-anchor"&gt;&lt;/a&gt;Modification du code HTTP
&lt;/h3&gt;&lt;p&gt;Comme expliqué en introduction, lors d'un échec d'authentification sur la page de login de WordPress, celui-ci génère un code http identique à celui d'un succès.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modifier le fichier &lt;code&gt;functions.php&lt;/code&gt; de votre thème WordPress pour y inclure :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Change WP-Admin login error message to be more generic */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;generic_login_msg&lt;/span&gt; ($msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;global&lt;/span&gt; $errors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $err_codes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $errors&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get_error_codes&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;in_array&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;invalid_username&amp;#39;&lt;/span&gt;, $err_codes ) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;in_array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;incorrect_password&amp;#39;&lt;/span&gt;, $err_codes )) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $msg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ERROR: Invalid credential.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $msg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_filter&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;login_errors&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;generic_login_msg&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Return 403 instead of 200 when wp-login failed */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;wp_login_failed&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;status_header&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;403&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Cela aura pour effet d'indiquer un message générique sur la page lors d'un échec d'authentification et surtout de générer un code &lt;code&gt;HTTP 403&lt;/code&gt;. Le code &lt;code&gt;HTTP 200&lt;/code&gt; sera toujours le code retour lors d'un succès d'authentification.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;11.22.33.44 - - [26/Oct/2021:01:52:10 +0200] &amp;#34;POST /wp-login.php HTTP/1.1&amp;#34; 403 3149 &amp;#34;https://wordpress.example.com/wp-login.php&amp;#34; &amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="création-du-filtre-fail2ban"&gt;&lt;a href="#cr%c3%a9ation-du-filtre-fail2ban" class="header-anchor"&gt;&lt;/a&gt;Création du filtre fail2ban
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fail2ban n'a pas de preset de filtre pour l'authentification de WordPress. Créer un filtre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/fail2ban/filter.d/wp-login.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter le filtre suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Definition]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;_daemon&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;wp-login&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;failregex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;lt;HOST&amp;gt;.*POST.*(wp-login\.php|xmlrpc\.php).* 403&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;failregex&lt;/code&gt; va matcher sur les requêtes &lt;code&gt;POST&lt;/code&gt; à destination de &lt;code&gt;wp-login.php&lt;/code&gt; et &lt;code&gt;xmlrpc.php&lt;/code&gt; portant un code &lt;code&gt;HTTP 403&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter la jail dans &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[wordpress]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http,https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;wp-login&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;logpath&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/log/nginx/access.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer fail2ban :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier la prise en compte de la jail avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fail2ban-client status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le retour doit être :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- Number of jail: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;- Jail list: wordpress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Keycloak : Installation avec Docker et reverse-proxy SSL Nginx</title><link>https://slash-root.fr/keycloak-installation-avec-docker-et-reverse-proxy-ssl-nginx/</link><pubDate>Mon, 25 Oct 2021 17:37:16 +0200</pubDate><guid>https://slash-root.fr/keycloak-installation-avec-docker-et-reverse-proxy-ssl-nginx/</guid><description>&lt;img src="https://slash-root.fr/keycloak-installation-avec-docker-et-reverse-proxy-ssl-nginx/cover.png" alt="Featured image of post Keycloak : Installation avec Docker et reverse-proxy SSL Nginx" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Keycloak est une solution opensource permettant d'implémenter du SSO (Single-Sign-On) au sein d'une infrastructure. Il est compatible avec les principaux protocoles d'authentification (OAuth2.0, OpenID-Connect). Il peut être couplé à un annuaire LDAP.&lt;/p&gt;
&lt;p&gt;Dans cet article, Keycloak, va être déployé sur une Debian 10 conteneurisé dans 2 images dockers. Docker-Compose va orchestrer le tout. Un serveur nginx sera en frontal en tant que reverse-proxy.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1 serveur Debian 10 à jour qui sera dédié à hébergé le serveur Keycloack&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 serveur web Nginx opérationnel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Certificats SSL générés pour votre nom de domaine&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Voir article : &lt;a href="https://slash-root.fr/2021/10/15/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/"&gt;Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="installation-des-paquets"&gt;&lt;a href="#installation-des-paquets" class="header-anchor"&gt;&lt;/a&gt;Installation des paquets
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer docker-compose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier l'installation de docker-compose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="création-du-docker-compose"&gt;&lt;a href="#cr%c3%a9ation-du-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Création du docker-compose
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer un répertoire afin d'y stocker le fichier docker-compose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se positionner dans le répertoire nouvellement créé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention, le fichier doit être au format &lt;code&gt;YAML&lt;/code&gt; ce qui signifie que la tabulation est interdite (il faut mettre des espaces pour l'indentation).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Copier / Coller le fichier suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;postgres_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;driver&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;postgres&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;keycloak&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jboss/keycloak:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PROXY_ADDRESS_FORWARDING&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_VENDOR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;POSTGRES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_ADDR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;keycloak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DB_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mon_mot_de_passe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;9090&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Le numéro de version indiqué en 1ère ligne peut varier suivant votre version de docker-compose. Dans mon cas, j'ai une version de docker-compose en 1.21.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le port de keycloak dans le conteneur est le 8080, il sera bind sur le 9090 du serveur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La directive &lt;code&gt;PROXY_ADDRESS_FORWARDING&lt;/code&gt; est très importante dans le cas d'une utilisation de reverse proxy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lancement-du-docker-compose"&gt;&lt;a href="#lancement-du-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Lancement du docker-compose
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Exécuter le docker-compose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker-compose -f ~/keycloak/docker-compose.yml up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour lancer le docker-compose en arrière-plan :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker-compose -f ~/keycloak/docker-compose.yml up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier que les conteneurs docker soient bien démarrés :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le résultat soit être similaire à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;643f26101b75 jboss/keycloak:latest &lt;span style="color:#e6db74"&gt;&amp;#34;/opt/jboss/tools/do…&amp;#34;&lt;/span&gt; About a minute ago Up &lt;span style="color:#ae81ff"&gt;52&lt;/span&gt; seconds 8443/tcp, 0.0.0.0:9090-&amp;gt;8080/tcp keycloak_keycloak_1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6789a8285283 postgres &lt;span style="color:#e6db74"&gt;&amp;#34;docker-entrypoint.s…&amp;#34;&lt;/span&gt; About a minute ago Up &lt;span style="color:#ae81ff"&gt;52&lt;/span&gt; seconds 5432/tcp keycloak_postgres_1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-reverse-proxy-ssl-avec-nginx"&gt;&lt;a href="#configuration-reverse-proxy-ssl-avec-nginx" class="header-anchor"&gt;&lt;/a&gt;Configuration reverse-proxy SSL avec Nginx
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un serveur Nginx doit être opérationnel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;S'appuyer sur cet article : &lt;a href="https://slash-root.fr/2021/10/15/nginx-installation-dun-reverse-proxy/"&gt;Nginx : Installation d’un Reverse Proxy&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les certificats SSl doivent être générés.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;S'appuyer sur cet article : &lt;a href="https://slash-root.fr/2021/10/15/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/"&gt;Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer le fichier de configuration du virtual host :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/nginx/sites-available/keycloak.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier / Coller le fichier suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;keycloak.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rewrite&lt;/span&gt; &lt;span style="color:#e6db74"&gt;^&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://keycloak.example.com&lt;/span&gt; &lt;span style="color:#e6db74"&gt;permanent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;keycloak.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/keycloak.example.com/fullchain.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/keycloak.example.com/privkey.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_session_cache&lt;/span&gt; builtin:&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#e6db74"&gt;shared:SSL:10m&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_ciphers&lt;/span&gt; &lt;span style="color:#e6db74"&gt;HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Host&lt;/span&gt; $host;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Real-IP&lt;/span&gt; $remote_addr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://IP_MON_SERVEUR_KEYCLOACK:9090&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Remplacer &lt;code&gt;keycloak.example.com&lt;/code&gt; par le nom de domaine pour le serveur keycloak. Le nécessaire doit être fait au sein de la zone DNS.&lt;/li&gt;
&lt;li&gt;Vérifier les chemins d'accès aux certificats SSL.&lt;/li&gt;
&lt;li&gt;Modifier la directive &lt;code&gt;proxy_pass&lt;/code&gt; pour correspondre avec le serveur keycloak.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un lien symbolique pour activer le virtual host :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ln -s /etc/nginx/sites-available/keycloak.conf /etc/nginx/sites-enabled/keycloak.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier la configuration de Nginx avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redémarrer le service nginx :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="accès-administrateur-à-keycloak"&gt;&lt;a href="#acc%c3%a8s-administrateur-%c3%a0-keycloak" class="header-anchor"&gt;&lt;/a&gt;Accès administrateur à Keycloak
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se rendre à l'adresse : &lt;a href="https://keycloak.example.com"&gt;https://keycloak.example.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="keycloak_homepage.png" alt="keycloak_homepage" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accéder à &lt;code&gt;Administration Console&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="keycloak_admin.png" alt="keycloak_admin" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Les credentials à entrer sont ceux définit dans le fichier &lt;code&gt;docker-compose.yml&lt;/code&gt; aux lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;KEYCLOAK_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mon_mot_de_passe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id="démarrage-automatique-avec-le-système"&gt;&lt;a href="#d%c3%a9marrage-automatique-avec-le-syst%c3%a8me" class="header-anchor"&gt;&lt;/a&gt;Démarrage automatique avec le système
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Avec la configuration actuelle au redémarrage du serveur keycloak, le docker-compose ne sera pas lancé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour activer le démarrage automatique des conteneurs Postegresql et Keycloak au boot du serveur, modifier le &lt;code&gt;docker-compose.yml&lt;/code&gt; et ajouter cette ligne dans chaque &lt;code&gt;services&lt;/code&gt; qui doit démarrer avec le service docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Si les conteneurs sont arrêtés à la main, ils ne démarreront pas automatiquement. Docker comprend que c'est une action manuelle et que c'est l'état désiré.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour que cela soit fonctionnel, le service &lt;code&gt;docker.service&lt;/code&gt; doit être en status &lt;code&gt;enable&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl status docker.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le résultat doit être le suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Loaded: loaded &lt;span style="color:#f92672"&gt;(&lt;/span&gt;/lib/systemd/system/docker.service; enabled; vendor preset: enabled&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si cela n'est pas le cas :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tactical RMM : Agent installation</title><link>https://slash-root.fr/tactical-rmm-agent-installation/</link><pubDate>Thu, 21 Oct 2021 10:35:03 +0200</pubDate><guid>https://slash-root.fr/tactical-rmm-agent-installation/</guid><description>&lt;img src="https://slash-root.fr/tactical-rmm-agent-installation/cover.png" alt="Featured image of post Tactical RMM : Agent installation" /&gt;&lt;h2 id="a-lire"&gt;&lt;a href="#a-lire" class="header-anchor"&gt;&lt;/a&gt;A lire
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour l'instant seul un agent Windows est pleinement fonctionnel. Les versions Linux et macOS sont en cours de développement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Afin d'éviter la détection de l'agent par l'antivirus, 2 solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agent avec code signé par Microsoft.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Un don mensuel de 50$ est demandé afin d'avoir accès à l'agent avec le code signé Microsoft. Le status Sponsor est alors attribué au sein du projet Tactical RMM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Agent sans code signé par Microsoft.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Le setup généré dynamiquement de l'agent (explications plus bas) sans code signé peut provoquer une alerte virale sur votre système. L'utilisation de l'agent générique (via script, gpo) ne provoque pas d'alerte virale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Penser à vérifier vos exclusions antivirus une fois l'agent Windows déployé:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files\TacticalAgent\*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files\Mesh Agent\*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Windows\Temp\winagent-v*.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Windows\Temp\trmm\*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\temp\tacticalrmm*.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Lors du déploiement de l'agent, les exclusions sont automatiquement créées dans Windows Defender.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Par défaut les mises à jour Windows sont désactivées automatiquement après l'installation de l'agent.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="déploiement-agent"&gt;&lt;a href="#d%c3%a9ploiement-agent" class="header-anchor"&gt;&lt;/a&gt;Déploiement agent
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;L'exécution de l'installation des agents doit être effectué sur les hôtes à surveiller.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="déploiement-manuel"&gt;&lt;a href="#d%c3%a9ploiement-manuel" class="header-anchor"&gt;&lt;/a&gt;Déploiement manuel
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se rendre sur &lt;a href="https://rmm.example.com"&gt;https://rmm.example.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clic droit sur le client/site puis &lt;strong&gt;Install Agent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="install_agent.png" alt="install_agent" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier que le &lt;strong&gt;Client&lt;/strong&gt; et le &lt;strong&gt;Site&lt;/strong&gt; soient corrects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Définir le type de machine (Server / Workstation) à qui s'adresse l'agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Définir le temps de validité de l'agent (Token expiration).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Définir les options appliqués par l'agent (Enable RDP, Enable Ping, Disable sleep/hibernate).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner la méthode d'installation souhaitée :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent généré dynamiquement&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="agent_dynamic.png" alt="agent_dynamic" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention à l'antivirus si le code de l'agent est non signé par Microsoft. Voir la section &lt;em&gt;A lire&lt;/em&gt; au début de cet article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Powershell&lt;/strong&gt; : Génération d'un script Powershell. L'agent est générique et le scripts contient tous les paramètres de l'agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Autoriser l'exécution du script Powershell :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PS C:\&amp;gt; Set-ExecutionPolicy Unrestricted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manuel&lt;/strong&gt; : L'agent est générique. Le script d'exécution est afficher à l'écran. Cette méthode est préconisée pour l'intégration dans des scripts et/ou des GPOs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="agent_manual.png" alt="agent_manual" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention à la durée du token si cette méthode est choisie pour une utilisation dans des scripts et/ou GPOs. Mettre une valeur très importante si besoin d'une validité &lt;em&gt;permanente&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lien-de-déploiement"&gt;&lt;a href="#lien-de-d%c3%a9ploiement" class="header-anchor"&gt;&lt;/a&gt;Lien de déploiement
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A partir du client, se rendre sur &lt;a href="https://rmm.example.com"&gt;https://rmm.example.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menu &lt;strong&gt;Agents&lt;/strong&gt; puis &lt;strong&gt;Manage Deployments&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="link_deploy.png" alt="link_deploy" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Astuce : Créer un client/site default avec un lien de déploiement (token avec une longue expiration) pour avoir une URL générique. Puis déplacer l'agent dans le client / site souhaité.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;L'agent téléchargé à travers ce lien est de type dynamique. Il est potentiellement détectable par les antivirus (si code non signé). Se référer à la section &lt;em&gt;A lire&lt;/em&gt; en début de cet article.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="starwars_link_agent.png" alt="starwars_link" /&gt;&lt;/p&gt;
&lt;h3 id="déploiement-par-gpo"&gt;&lt;a href="#d%c3%a9ploiement-par-gpo" class="header-anchor"&gt;&lt;/a&gt;Déploiement par GPO
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;La GPO de déploiement de l'agent doit être appliquée au niveau ordinateur afin que l'installation de l'agent se déroule sous un compte &lt;strong&gt;Local System&lt;/strong&gt; ayant les droits nécessaires.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Récupérer le script d'installation de l'installation manuelle (voir plus haut) ainsi que l'exécutable de l'agent générique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stocker le script et l'agent.exe dans un dossier partager du contrôleur de domaine (exemple: &lt;code&gt;C:\agent_rmm\&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sur le domaine Windows, ouvrir la console MMC des GPOs :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpmc.msc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Créer une nouvelle GPO ciblant une OU contenant des Ordinateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="gpo_oucpu.png" alt="gpo_oucpu" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Editer cette GPO. Trois étapes sont nécessaire pour que celle-ci fonctionne parfaitement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La création d'un dossier sur le poste client.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="gpo_dir.png" alt="gpo_dir" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La copie du script et de l'agent.exe sur le poste client.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="gpo_fic.png" alt="gpo_fic" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'exécution d'un script au démarrage du poste client :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd c:\agent_rmm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;agent_rmm.bat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="gpo_start.png" alt="gpo_start" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Patienter ou forcer l'application de la nouvelle GPO :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpupdate /force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Un modèle de GPO importable dans un domaine est disponible : &lt;a href="GPO-Deploiement_agent_TacticalRMM.zip" title="GPO-Deploiement_agent_TacticalRMM"&gt;ICI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="arguments-optionnels"&gt;&lt;a href="#arguments-optionnels" class="header-anchor"&gt;&lt;/a&gt;Arguments optionnels
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Quelques arguments qui peuvent être utilisés dans des scripts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-log debug&lt;/code&gt; : Affiche un log verbeux lors de l'installation de l'agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-silent&lt;/code&gt; : Aucun message durant l'installation de l'agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-proxy &amp;quot;http://proxyserver:port&amp;quot;&lt;/code&gt; : Pour utiliser un proxy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-meshdir &amp;quot;C:\Mesh Agent&amp;quot;&lt;/code&gt; : Spécifier le chemin contenant meshagent.exe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-nomesh&lt;/code&gt; : N'installe pas l'agent meshcentral. Pas de take control, remote terminal, file browser&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tactical RMM : Mise à jour du serveur</title><link>https://slash-root.fr/tactical-rmm-mise-a-jour-du-serveur/</link><pubDate>Wed, 20 Oct 2021 19:43:10 +0200</pubDate><guid>https://slash-root.fr/tactical-rmm-mise-a-jour-du-serveur/</guid><description>&lt;img src="https://slash-root.fr/tactical-rmm-mise-a-jour-du-serveur/cover.png" alt="Featured image of post Tactical RMM : Mise à jour du serveur" /&gt;&lt;h2 id="recommandations"&gt;&lt;a href="#recommandations" class="header-anchor"&gt;&lt;/a&gt;Recommandations
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Le système doit être à jour (exemple sur Debian) :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt -y update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt -y upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Cela est important car sinon le script de mise à jour pour Tactical RMM peut rencontrer des erreurs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ne jamais programmer de mise à jour automatique du serveur RMM via une tâche &lt;code&gt;cron&lt;/code&gt;. Certaines mise à jour demande une interaction de l'utilisateur dans le prompt. Dans le cas d'une mise à jour automatisée, cela pourrait &lt;strong&gt;casser&lt;/strong&gt; le serveur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;De même, modifier le script de mise à jour (update.sh) est fortement déconseillé. Celui-ci est mis à jour automatiquement si besoin vers une nouvelle version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toujours exécuter la mise à jour du serveur RMM avec l'utilisateur créé lors de l'installation du serveur Tactical RMM. Faire la mise à jour en tant que root provoquerait des permissions erronées au sein de Tactical RMM.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mise-à-jour"&gt;&lt;a href="#mise-%c3%a0-jour" class="header-anchor"&gt;&lt;/a&gt;Mise à jour
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Télécharger le script de mise à jour :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -N https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Le rendre exécutable :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x update.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Exécuter la mise à jour :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./update.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Si la dernière version est déjà présente, le script le notifiera immédiatement. Avec le flag &lt;code&gt;--force&lt;/code&gt;, il est possible de bypass la vérification de la version. Cela peut être intéressant pour une mise à jour qui aurait été interrompue et/ou pour &lt;strong&gt;résoudre les erreurs de permission&lt;/strong&gt; (ex: exécution accidentelle en root de script de mise à jour).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="warning"&gt;&lt;a href="#warning" class="header-anchor"&gt;&lt;/a&gt;Warning
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ne jamais faire de mise à jour manuelle de MashCentral vers une nouvelle version. Le script de mise à jour de tactical rmm le fera pour nous si cela est nécessaire.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cette procédure de mise à jour a été réalisée pour mettre à jour un serveur Tactical RMM v0.8.4 vers la v0.8.5.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tactical RMM : Les commandes de management</title><link>https://slash-root.fr/tactical-rmm-les-commandes-de-management/</link><pubDate>Wed, 20 Oct 2021 19:12:35 +0200</pubDate><guid>https://slash-root.fr/tactical-rmm-les-commandes-de-management/</guid><description>&lt;img src="https://slash-root.fr/tactical-rmm-les-commandes-de-management/cover.png" alt="Featured image of post Tactical RMM : Les commandes de management" /&gt;&lt;h2 id="environnement-virtuel-python"&gt;&lt;a href="#environnement-virtuel-python" class="header-anchor"&gt;&lt;/a&gt;Environnement virtuel Python
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en SSH au serveur Tactical RMM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lancer l'environnement virtuel python :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /rmm/api/tacticalrmm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ../env/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="les-commandes"&gt;&lt;a href="#les-commandes" class="header-anchor"&gt;&lt;/a&gt;Les commandes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reset a user's password :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py reset_password USERNAME
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reset a user's 2fa token :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py reset_2fa USERNAME
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find all agents that have X software installed :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py find_software &lt;span style="color:#e6db74"&gt;&amp;#34;adobe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show outdated online agents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py show_outdated_agents
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log out all active web sessions :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py delete_tokens
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check for orphaned tasks on all agents and remove them :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py remove_orphaned_tasks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a MeshCentral agent invite link :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py get_mesh_exe_url
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bulk update agent offline/overdue time :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change offline time on all agents to 5 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --offline --all &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Change offline time on all agents in site named Example Site to 2 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --offline --site &lt;span style="color:#e6db74"&gt;&amp;#34;Example Site&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Change offline time on all agents in client named Example Client to 12 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --offline --client &lt;span style="color:#e6db74"&gt;&amp;#34;Example Client&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Change overdue time on all agents to 10 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --overdue --all &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Change overdue time on all agents in site named Example Site to 4 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --overdue --site &lt;span style="color:#e6db74"&gt;&amp;#34;Example Site&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Change overdue time on all agents in client named Example Client to 14 minutes :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python manage.py bulk_change_checkin --overdue --client &lt;span style="color:#e6db74"&gt;&amp;#34;Example Client&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OpenProject : Installation</title><link>https://slash-root.fr/installation-openproject/</link><pubDate>Wed, 20 Oct 2021 14:55:58 +0200</pubDate><guid>https://slash-root.fr/installation-openproject/</guid><description>&lt;img src="https://slash-root.fr/installation-openproject/cover.jpg" alt="Featured image of post OpenProject : Installation" /&gt;&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenProject sera installé sur Debian 10.&lt;/li&gt;
&lt;li&gt;La base de données recommandée est PostgreSQL.&lt;/li&gt;
&lt;li&gt;Le serveur web recommandé est Apache.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer gnupg2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install gnupg2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Importer la clef PGP utilisées pour signer les paquets openproject :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -qO- https://dl.packager.io/srv/opf/openproject/key | sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter le repo adéquat :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo wget -O /etc/apt/sources.list.d/openproject.list &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://dl.packager.io/srv/opf/openproject/stable/11/installer/debian/10.repo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Télécharger et installer openproject :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install openproject
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration"&gt;&lt;a href="#configuration" class="header-anchor"&gt;&lt;/a&gt;Configuration
&lt;/h2&gt;&lt;h3 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Si une base de données PostgreSQL externe veut être utilisée en lieu et place d'une base de données locale, s'assurer d'avoir les informations suivantes :
&lt;ul&gt;
&lt;li&gt;database hostname&lt;/li&gt;
&lt;li&gt;port&lt;/li&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;password&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;L'utilisateur utilisé pour la connexion à la base de données doit avoir le privilège CREATE DATABASE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Si le HTTPS est utilisé, prévoir le chemin d'accès vers le :
&lt;ul&gt;
&lt;li&gt;certificate file&lt;/li&gt;
&lt;li&gt;private key file&lt;/li&gt;
&lt;li&gt;CA bundle file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lancer-le-wizard"&gt;&lt;a href="#lancer-le-wizard" class="header-anchor"&gt;&lt;/a&gt;Lancer le wizard
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Exécuter le wizard :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo openproject configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Si une erreur se produit et/ou une reconfiguration est nécessaire, annuler le wizard avec &lt;code&gt;CTRL+C&lt;/code&gt; et relancer le wizard avec &lt;code&gt;sudo openproject reconfigure&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Les choix fait durant le wizard sont persistent dans le fichier &lt;code&gt;/etc/openproject/installer.dat&lt;/code&gt;et l'exécution de &lt;code&gt;sudo openproject configure&lt;/code&gt;réutilise ces valeurs. Seul les options non présentes dans le fichier &lt;code&gt;installer.dat&lt;/code&gt;seront alors demandées.&lt;/li&gt;
&lt;li&gt;Pour relancer la demande de tous les paramètres : &lt;code&gt;sudo openproject reconfigure&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id="choisir-lédition"&gt;&lt;a href="#choisir-l%c3%a9dition" class="header-anchor"&gt;&lt;/a&gt;Choisir l&amp;rsquo;édition
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenProject est fournit avec 2 éditions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'édition par défaut : Pour une gestion de projet générale.&lt;/li&gt;
&lt;li&gt;L'édition BIM : Pour une gestion de projet axée dans l'industrie du bâtiment/construction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="openproject_edition.png" alt="openproject_edition" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plus d'information sur la BIM Edition &lt;a href="https://www.openproject.org/bim-project-management/"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La slection de l'édition est uniquement disponible sur les distributions suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RHEL/CentOS 8&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;Debian 10&lt;/li&gt;
&lt;li&gt;Debian 11&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuration-base-de-données"&gt;&lt;a href="#configuration-base-de-donn%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Configuration base de données
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenProject requiert une base de données PostgreSQL pour stocker les données.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cette étape va permettre de sélectionner la méthode de connexion à cette base de données.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="postgre_autoinstall.png" alt="postgres_autoinstall" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3 options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skip : Pas de connexion à une base de données. Il sera nécessaire de spécifier une base de données manuellement à l'aide de la variable &lt;code&gt;DATABASE_URL&lt;/code&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo openproject config:set DATABASE_URL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;postgresql://[user[:password]@][host][:port][/dbname][?param1=value1&amp;amp;...]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install : Le wizard installe et configure une base de données PostgreSQL locale. C'est cette option qui sera retenu dans cette documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reuse : Pour utiliser une base de données PostgreSQL existante. Des paramètres de connexion supplémentaire sont demandés lors de ce choix.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apache2"&gt;&lt;a href="#apache2" class="header-anchor"&gt;&lt;/a&gt;Apache2
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenProject comprend un serveur d'application en ruby interne. Seulement le serveur écoute uniquement sur une interface locale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour pouvoir y accéder d'Internet, il est nécessaire d'avoir un serveur web comme proxy transférer les connexions entrantes vers le serveur applicatif OpenProject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le wizard propose d'installer automatiquement un serveur web Apache2 pour agir comme un proxy.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="server_autoinstall.png" alt="server_autoinstall" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install : Option recommandée. Installe et configure un serveur web Apache2 avec un virtual host du nom de domaine fournit. C'est ce serveur qui fournira du SSL/TLS. Plusieurs options sont demandées par la suite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le nom de domaine pleinement qualifié. Correspond à la valeur &lt;code&gt;ServerName&lt;/code&gt;du virtual host d'apache.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="server_hostname.png" alt="server_hostname" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour spécifier un prefix afin d'accéder à l'applicatif (exemple : mondomaine.example.com/openproject) : &lt;code&gt;/openproject&lt;/code&gt;. Laisser vide si l'accès désiré à l'application est http(s)://mondomaine.example.com.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="server_path_prefix.png" alt="server_path_prefix" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour utiliser des certificats SSL/TLS, 3 choix supplémentaires sont à faire pour spécifier l'accès aux certificats.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="server_ssl.png" alt="server_ssl" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Skip : Non recommandé. Un serveur web Apache ou Nginx doit être installé et configuré manuellement pour rediriger les requêtes entrantes vers &lt;code&gt;localhost:6000&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention avec un serveur Nginx, toutes les fonctionnalités ne sont pas disponible pour OpenProject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="svngit-intégration"&gt;&lt;a href="#svngit-int%c3%a9gration" class="header-anchor"&gt;&lt;/a&gt;SVN/Git intégration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Si le choix d'installer automatiquement Apache2 est fait, il est demandé si une intégration de SVN/Git doit être faites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plus d'informations &lt;a href="https://www.openproject.org/docs/user-guide/repository"&gt;ici&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="repositories_svninstall.png" alt="repositories_svninstall" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuration-email"&gt;&lt;a href="#configuration-email" class="header-anchor"&gt;&lt;/a&gt;Configuration email
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Configurer la méthode d'envoie de mail pour les diverses notifications.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="smtp_autoinstall.png" alt="smtp_autoinstall" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3 options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sendmail : Utilisation d'une installation de sendmail en locale ou d'un serveur postfix local.&lt;/li&gt;
&lt;li&gt;SMTP : Option recommandée en production. Autorise la connexion à un serveur SMTP à travers une authentification de type : &lt;code&gt;NONE&lt;/code&gt;, &lt;code&gt;PLAIN&lt;/code&gt;, &lt;code&gt;LOGIN&lt;/code&gt;, &lt;code&gt;CRAM-MD5&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Skip : Aucune configuration. Néanmoins, la configuration peut se faire plus tard en se rendant sur l'URL : &lt;code&gt;openproject.example.com/settings?tab=notifications&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="serveur-memcached"&gt;&lt;a href="#serveur-memcached" class="header-anchor"&gt;&lt;/a&gt;Serveur Memcached
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenProject a besoin d'un serveur local memcached. L'installation de celui-ci doit &amp;quot;toujours&amp;quot; être faites.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="memcached_install.png" alt="memcached_autoinstall" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="accès-openproject"&gt;&lt;a href="#acc%c3%a8s-openproject" class="header-anchor"&gt;&lt;/a&gt;Accès OpenProject
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;L'installation est terminée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'application OpenProject est disponible à l'adresse : http(s)://openproject.example.com/server prefix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Username = &lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Password = &lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Changer le mot de passe admin immédiatement&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="install_end.png" alt="install_end" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mise-à-jour-postgresql"&gt;&lt;a href="#mise-%c3%a0-jour-postgresql" class="header-anchor"&gt;&lt;/a&gt;Mise à jour PostgreSQL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La version actuelle d'OpenProject est la 11.4.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La prochaine version majeure sera la 12.0 (fin 2021).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PostgreSQL v13 sera nécessaire.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer la nouvelle version de PostgreSQL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install postgresql-13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arrêter les serveurs PostgreSQL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/lib/postgresql/10/bin/pg_ctl stop --wait --pgdata=/var/lib/postgresql/10/main&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/lib/postgresql/13/bin/pg_ctl stop --wait --pgdata=/var/lib/postgresql/13/main&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrer les données vers PostgreSQL v13 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; CMD
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/usr/lib/postgresql/13/bin/pg_upgrade \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--old-bindir=/usr/lib/postgresql/10/bin \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--new-bindir=/usr/lib/postgresql/13/bin \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--old-datadir=/var/lib/postgresql/10/main \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--new-datadir=/var/lib/postgresql/13/main \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--old-options &amp;#39;-c config_file=/etc/postgresql/10/main/postgresql.conf&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;--new-options &amp;#39;-c config_file=/etc/postgresql/13/main/postgresql.conf&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faire de PostgreSQL v13 le serveur par défaut sur le port 45432 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;cp /etc/postgresql/{10,13}/main/conf.d/custom.conf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;sed -i &amp;#39;s|45432|45433|&amp;#39; /etc/postgresql/10/main/conf.d/custom.conf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/lib/postgresql/13/bin/pg_ctl start --wait --pgdata=/var/lib/postgresql/13/main -o &amp;#39;-c config_file=/etc/postgresql/13/main/postgresql.conf&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier dans OpenProject la version de PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="postgre_v13.png" alt="postgre_v13" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supprimer l'ancienne version de PostgreSQL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /var/lib/postgresql/10/main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get purge postgresql-10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Redmine : Installation</title><link>https://slash-root.fr/redmine-installation/</link><pubDate>Mon, 18 Oct 2021 12:24:49 +0200</pubDate><guid>https://slash-root.fr/redmine-installation/</guid><description>&lt;img src="https://slash-root.fr/redmine-installation/cover.png" alt="Featured image of post Redmine : Installation" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Redmine peut être installé sur la plupart des systèmes Unix, Linux, macOS, Windows&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La base de données qu'utilise Redmine peut être MySQL (MariaDB), PostgreSQL, Microsoft SQL, SQLite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian 10 sera choisit pour cette installation avec une base de données MySQL (MariaDB)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-apache-et-paquets-nécessaires"&gt;&lt;a href="#installation-apache-et-paquets-n%c3%a9cessaires" class="header-anchor"&gt;&lt;/a&gt;Installation Apache et paquets nécessaires
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installation dépendances nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates dirmngr gnupg2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installation Apache, MariaDB, Passenger et les autres paquets nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apache2 apache2-dev libapache2-mod-passenger mariadb-server mariadb-client build-essential ruby-dev libxslt1-dev libmariadb-dev libxml2-dev zlib1g-dev imagemagick libmagickwand-dev curl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une fois tous ces paquets et dépendances installés, créer la base de données pour Redmine&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="création-de-la-base-de-données"&gt;&lt;a href="#cr%c3%a9ation-de-la-base-de-donn%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Création de la base de données
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sécurisation de la base de données :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mysql_secure_installation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Suivre les recommandations de sécurisation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en root puis à MariaDB :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su -
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Création d'une base de données &amp;quot;redminedb&amp;quot; et d'un utilisateur mysql &amp;quot;redmineuser&amp;quot; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DATABASE&lt;/span&gt; redminedb &lt;span style="color:#66d9ef"&gt;CHARACTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;SET&lt;/span&gt; utf8mb4;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GRANT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ALL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PRIVILEGES&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; redminedb.&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TO&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;redmineuser&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IDENTIFIED&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_secure_password&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flush les privilèges et quitter MariaDB :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FLUSH&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PRIVILEGES&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;EXIT&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se déconnecter de l'utilisateur root :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-et-configuration-redmine"&gt;&lt;a href="#installation-et-configuration-redmine" class="header-anchor"&gt;&lt;/a&gt;Installation et configuration Redmine
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Création d'un utilisateur linux &amp;quot;redmine&amp;quot; pour Redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo useradd -r -m -d /opt/redmine -s /usr/bin/bash redmine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajout de l'utilisateur redmine au groupe &amp;quot;www-data&amp;quot; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG redmine www-data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se connecter avec l'utilisateur redmine et télécharger la dernière version de Redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - redmine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://www.redmine.org/releases/redmine-4.2.3.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extraire l'archive téléchargée :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -xvzf redmine-4.2.3.tar.gz -C /opt/redmine/ --strip-components&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copie des fichiers de configurations exemples :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /opt/redmine/config/configuration.yml&lt;span style="color:#f92672"&gt;{&lt;/span&gt;.example,&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /opt/redmine/public/dispatch.fcgi&lt;span style="color:#f92672"&gt;{&lt;/span&gt;.example,&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /opt/redmine/config/database.yml&lt;span style="color:#f92672"&gt;{&lt;/span&gt;.example,&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editer le fichier database.yml et y définir les paramètres de la base de données :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /opt/redmine/config/database.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faire les modifications suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;production:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;adapter: mysql2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;database: redminedb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;host: localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;username: redmineuser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;password: &amp;#34;my_secure_password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sauvegarder le fichier et quitter l'utilisateur redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se rendre dans le répertoire &amp;quot;/opt/redmine&amp;quot; et installer &amp;quot;Bundler&amp;quot; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /opt/redmine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo gem install bundler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se connecter avec l'utilisateur redmine et installer les dépendances gems nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - redmine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bundle install --without development test --path vendor/bundle
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Générer un token secret :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bundle exec rake generate_secret_token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer une structure de base de données Rails et insérer les données de configuration par défaut dans la bdd :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RAILS_ENV&lt;span style="color:#f92672"&gt;=&lt;/span&gt;production bundle exec rake db:migrate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RAILS_ENV&lt;span style="color:#f92672"&gt;=&lt;/span&gt;production REDMINE_LANG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;en bundle exec rake redmine:load_default_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer les répertoires et fichiers nécessaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in tmp tmp/pdf public/plugin_assets; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -d $i &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; mkdir -p $i; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Définir les permission sur le dossier /opt/redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chown -R redmine:redmine files log tmp public/plugin_assets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod -R &lt;span style="color:#ae81ff"&gt;755&lt;/span&gt; /opt/redmine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se déconnecter de l'utilisateur Redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-apache"&gt;&lt;a href="#configuration-apache" class="header-anchor"&gt;&lt;/a&gt;Configuration Apache
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Désactiver le site par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2dissite 000-default.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un virtual host pour Redmine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/apache2/sites-available/redmine.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajout des lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; &lt;span style="color:#f92672"&gt;VirtualHost&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:80&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ServerName redmine.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RailsEnv production
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DocumentRoot /opt/redmine/public
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; &lt;span style="color:#f92672"&gt;Directory&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;opt&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;redmine&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;public&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Allow from all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Require all granted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; /&lt;span style="color:#f92672"&gt;Directory&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ErrorLog ${APACHE_LOG_DIR}/redmine_error.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CustomLog ${APACHE_LOG_DIR}/redmine_access.log combined
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; /&lt;span style="color:#f92672"&gt;VirtualHost&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Attention ! &lt;strong&gt;Enlever l'espace&lt;/strong&gt; après le 1er chevron.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sauvegarder le fichier, activer le virtual host redmine et redémarrer le service apache :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite redmine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="accès-redmine"&gt;&lt;a href="#acc%c3%a8s-redmine" class="header-anchor"&gt;&lt;/a&gt;Accès Redmine
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ouvrir un navigateur web et se rendre sur &lt;a href="http://redmine.example.com"&gt;http://redmine.example.com&lt;/a&gt;&lt;br /&gt;
&lt;img data-recalc-dims="1" decoding="async" src="home.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquer sur &amp;quot;Connexion&amp;quot;&lt;br /&gt;
&lt;img data-recalc-dims="1" decoding="async" src="login.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renseigner le compte admin et le mot de passe par défaut : admin/admin. Un nouveau mot de passe est demandé&lt;br /&gt;
&lt;img data-recalc-dims="1" decoding="async" src="password.png" alt="" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'installation de Redmine est terminée&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ansible : Déploiement de 3 routeurs Linux en milieu hétérogène</title><link>https://slash-root.fr/ansible-deploiement-de-3-routeurs-linux-en-milieu-heterogene/</link><pubDate>Sat, 16 Oct 2021 09:20:29 +0200</pubDate><guid>https://slash-root.fr/ansible-deploiement-de-3-routeurs-linux-en-milieu-heterogene/</guid><description>&lt;img src="https://slash-root.fr/ansible-deploiement-de-3-routeurs-linux-en-milieu-heterogene/cover.png" alt="Featured image of post Ansible : Déploiement de 3 routeurs Linux en milieu hétérogène" /&gt;&lt;h2 id="contexte-de-lenvironnement"&gt;&lt;a href="#contexte-de-lenvironnement" class="header-anchor"&gt;&lt;/a&gt;Contexte de l&amp;rsquo;environnement
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;1 Serveur sous Debian 10 où sera installé la solution Ansible&lt;/li&gt;
&lt;li&gt;1 Serveur sous Debian 10 qui sera un routeur pour le LAN 11&lt;/li&gt;
&lt;li&gt;1 Serveur sous Ubuntu Server 20.04 qui sera un routeur pour le LAN 12&lt;/li&gt;
&lt;li&gt;1 Serveur sous CentOS 7 qui sera un routeur pour le LAN 13&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="objectif"&gt;&lt;a href="#objectif" class="header-anchor"&gt;&lt;/a&gt;Objectif
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;L’objectif de ce document est d’obtenir l’environnement ci-dessous après le déploiement automatisé à l’aide de la solution Ansible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="plan2.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Tous les serveurs sont installés avec leur distribution respective.&lt;/li&gt;
&lt;li&gt;La configuration IP de SRV-ANSIBLE est effectuée sur la carte réseau ens32 avec pour IP 10.0.0.11/16.&lt;/li&gt;
&lt;li&gt;La configuration IP de RNAT-11 est effectuée sur la carte réseau ens32 avec pour IP 10.0.0.11/16. Une seconde carte réseau ens34 est également présente sans aucun paramétrage.&lt;/li&gt;
&lt;li&gt;La configuration IP de RNAT-12 est effectuée sur la carte réseau ens32 avec pour IP 10.0.0.12/16. Une seconde carte réseau ens35 est également présente sans aucun paramétrage.&lt;/li&gt;
&lt;li&gt;La configuration IP de RNAT-13 est effectuée sur la carte réseau ens33 avec pour IP 10.0.0.13/16. Une seconde carte réseau ens32 est également présente sans aucun paramétrage.&lt;/li&gt;
&lt;li&gt;Un serveur SSH est opérationnel sur chaque RNAT.&lt;/li&gt;
&lt;li&gt;Le compte root est activé sur RNAT-12 (Ubuntu) :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo passwd root
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="installation-dansible"&gt;&lt;a href="#installation-dansible" class="header-anchor"&gt;&lt;/a&gt;Installation d&amp;rsquo;Ansible
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;L’installation d’Ansible se fait sur SRV-ANSIBLE. Ansible est présent nativement dans les dépôts de Debian 10. L’installation peut donc se faire à l’aide d’apt :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install ansible
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="install-ansible.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A ce jour, la version 2.7.7 d’Ansible est installée ainsi que Python version 3.7.3.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="modification-du-fichier-etchosts"&gt;&lt;a href="#modification-du-fichier-etchosts" class="header-anchor"&gt;&lt;/a&gt;Modification du fichier /etc/hosts
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Pour des questions de praticité, le fichier /etc/hosts de SRV-ANSIBLE est modifié afin de travailler avec des noms d’hôtes plutôt que les adresses IP des différents RNAT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="etc_hosts.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="création-dun-utilisateur-ansible"&gt;&lt;a href="#cr%c3%a9ation-dun-utilisateur-ansible" class="header-anchor"&gt;&lt;/a&gt;Création d&amp;rsquo;un utilisateur ansible
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Pour éviter d’exécuter le déploiement en tant que root sur SRV-ANSIBLE, un utilisateur ansible est crée :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo useradd -d /home/ansible -m -s /bin/bash ansible
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo passwd ansible
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;L’ensemble des commandes exécutées par la suite sur SRV-ANSIBLE sont faites avec cet utilisateur ansible. L’ensemble des fichiers de configurations de la solution Ansible seront stockés dans la home directory de cet utilisateur &lt;strong&gt;ansible&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - ansible
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="création-de-linventaire"&gt;&lt;a href="#cr%c3%a9ation-de-linventaire" class="header-anchor"&gt;&lt;/a&gt;Création de l&amp;rsquo;inventaire
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Un fichier &lt;strong&gt;inventory&lt;/strong&gt; est créé afin de répertorier les RNAT sur lequel le playbook sera joué. La variable &lt;strong&gt;ansible_user&lt;/strong&gt; définit quel utilisateur est utilisé pour la connexion ssh aux RNAT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="inventory.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour éviter que ce fichier d'inventaire soit lu par d'autres utilisateurs du système, ses droits sont modifiés :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;0600&lt;/span&gt; inventory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="génération-et-copie-des-clefs-ssh"&gt;&lt;a href="#g%c3%a9n%c3%a9ration-et-copie-des-clefs-ssh" class="header-anchor"&gt;&lt;/a&gt;Génération et copie des clefs SSH
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Afin d'éviter de saisir les mots de passe SSH sur les RNAT lors de l'exécution du playbook, une clef SSH est générée sur SRV-ANSIBLE :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;La clef peut être laissée à son emplacement par défaut. Aucune passphrase ne sera définie.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="ssh-keygen.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour copier la clef SSH publique sur les 3 RNAT, il est nécessaire d'autoriser root à se connecter en SSH par mot de passe. Décommenter et modifier l'option &lt;strong&gt;PermitRootLogin&lt;/strong&gt; dans le fichier &lt;strong&gt;/etc/ssh/sshd_config&lt;/strong&gt; des 3 RNAT pour avoir &lt;strong&gt;PermitRootLogin yes&lt;/strong&gt;. Relancer le service &lt;strong&gt;sshd.service&lt;/strong&gt; après la modification sur les 3 RNAT :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;La clef SSH publique peut être copiée sur les 3 RNAT. A partir de SRV-ANSIBLE :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-copy-id root@rnat-11 &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh-copy-id root@rnat-12 &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh-copy-id root@rnat-13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="ssh-copy-id.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois la clef publique SSH de SRV-ANSIBLE copiée sur les 3 RNAT, autoriser la connexion SSH en tant que root sur les 3 RNAT uniquement par clef SSH.&lt;/li&gt;
&lt;li&gt;Modifier l'option &lt;strong&gt;PermitRootLogin&lt;/strong&gt; dans le fichier &lt;strong&gt;/etc/ssh/sshd_config&lt;/strong&gt; des 3 RNAT pour avoir &lt;strong&gt;PermitRootLogin prohibit-password&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Relancer le service &lt;strong&gt;sshd.service&lt;/strong&gt; après la modification sur les 3 RNAT :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Vérifier que la connexion SSH de SRV-ANSIBLE vers les RNAT fonctionne correctement sans demande de mot de passe :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@rnat-11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@rnat-12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@rnat-13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérification-de-la-communication-entre-le-srv-ansible-et-les-3-rnat"&gt;&lt;a href="#v%c3%a9rification-de-la-communication-entre-le-srv-ansible-et-les-3-rnat" class="header-anchor"&gt;&lt;/a&gt;Vérification de la communication entre le SRV-ANSIBLE et les 3 RNAT
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;A partir de maintenant, toutes les commandes seront exécutées à partir de SRV-ANSIBLE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Une des 1ères choses à vérifier à ce stade est la bonne communication entre SRV-ANSIBLE et les 3 RNAT. Ansible regorge d'énormément de module. Dans le cas présent, l'utilisation du module &lt;strong&gt;ping&lt;/strong&gt; est parfaitement indiqué :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ansible -i inventory -m ping routeurs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="ansible-ping-1.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;-i &amp;lt;le fichier d'inventaire&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-m &amp;lt;le module à utiliser&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le dernier argument routeurs correspond au type de serveur, définit dans l’inventaire, sur lequel exécuter le module.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RNAT-11 et RNAT-13 répondent correctement. RNAT-12 est en erreur.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Cela est dû au fait que le serveur Ansible requiert d'avoir Python version 2.7 qui n'est pas installé par défaut sur le serveur Ubuntu.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A partir de RNAT-12 : &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install python
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="ubuntu-python.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On remarque qu'en spécifiant uniquement le paquet &lt;strong&gt;python&lt;/strong&gt;, c'est &lt;strong&gt;python2.7&lt;/strong&gt; qui est installé.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Une fois cela fait, revérifier la bonne communication entre SRV-ANSIBLE et les 3 RNAT :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ansible -i inventory -m ping routeurs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="ansible-ping-2.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="création-de-larborescence-où-seront-stockée-les-configurations-des-rnat"&gt;&lt;a href="#cr%c3%a9ation-de-larborescence-o%c3%b9-seront-stock%c3%a9e-les-configurations-des-rnat" class="header-anchor"&gt;&lt;/a&gt;Création de l&amp;rsquo;arborescence où seront stockée les configurations des RNAT
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;La configuration IP des RNAT va être stockée sur SRV-ANSIBLE dans un dossier &lt;strong&gt;~/conf_routeurs&lt;/strong&gt; et chaque RNAT aura son dossier. Ces dossiers sont à protéger des autres utilisateurs du système :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p conf_routeurs/&lt;span style="color:#f92672"&gt;{&lt;/span&gt;rnat-11,rnat-12,rnat-13&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod -R &lt;span style="color:#ae81ff"&gt;0700&lt;/span&gt; conf_routeurs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="création-des-fichiers-de-configuration-pour-rnat-11"&gt;&lt;a href="#cr%c3%a9ation-des-fichiers-de-configuration-pour-rnat-11" class="header-anchor"&gt;&lt;/a&gt;Création des fichiers de configuration pour RNAT-11
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RNAT-11 étant sous Debian 10, la configuration IP est stockée dans le fichier &lt;strong&gt;/etc/network/interfaces&lt;/strong&gt; et le routage dans le fichier &lt;strong&gt;/etc/sysctl.conf&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Création du fichier de configuration IP pour RNAT-11 :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-11/interfaces
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Interface loopback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;auto lo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;iface lo inet loopback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Interface LAN 10.0.0.0 /16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;auto ens32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;iface ens32 inet static&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;address 10.0.0.11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;netmask 255.255.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;gateway 10.0.0.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Interface LAN 192.168.11.0 /24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;auto ens34&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;iface ens34 inet static&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;address 192.168.11.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;netmask 255.255.255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Création du fichier permettant le routage IPv4 pour RNAT-11 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-11/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Activation du routage IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv4.ip_forward&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="création-des-fichiers-de-configuration-pour-rnat-12"&gt;&lt;a href="#cr%c3%a9ation-des-fichiers-de-configuration-pour-rnat-12" class="header-anchor"&gt;&lt;/a&gt;Création des fichiers de configuration pour RNAT-12
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RNAT-12 étant sous Ubuntu Server 20.04, la configuration IP est stockée dans le dossier &lt;strong&gt;/etc/netplan/&lt;/strong&gt; avec un fichier &lt;strong&gt;yaml&lt;/strong&gt; pour chaque interface et le routage dans le fichier &lt;strong&gt;/etc/sysctl.conf&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Création des fichiers de configuration IP pour RNAT-12 :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-12/00-lan_10.0.0.0.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Configuration IP pour le LAN 10.0.0.0 /16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;network:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ethernets:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ens32:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dhcp4: false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;addresses: [10.0.0.12/16]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;gateway4: 10.0.0.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nameservers:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;addresses: [192.168.1.1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version: 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-12/01-lan_192.168.12.0.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Configuration IP pour le LAN 192.168.12.0 /24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;network:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ethernets:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ens35:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dhcp4: false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;addresses: [192.168.12.254/24]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version: 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Création du fichier permettant le routage IPv4 pour RNAT-12 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-12/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Activation du routage IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv4.ip_forward&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="création-des-fichiers-de-configuration-pour-rnat-13"&gt;&lt;a href="#cr%c3%a9ation-des-fichiers-de-configuration-pour-rnat-13" class="header-anchor"&gt;&lt;/a&gt;Création des fichiers de configuration pour RNAT-13
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RNAT-13 étant sous CentOS 7, la configuration IP est stockée dans le dossier &lt;strong&gt;/etc/sysconfig/network-scripts/&lt;/strong&gt; avec un fichier de type &lt;strong&gt;ifcfg-ensXX&lt;/strong&gt; pour chaque interface et le routage dans le fichier &lt;strong&gt;/etc/sysctl.conf&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Création des fichiers de configuration IP pour RNAT-13 :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-13/ifcfg-ens33
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Interface LAN 10.0.0.0 /16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DEVICE&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ens33&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;BOOTPROTO&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ONBOOT&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IPADDR&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;10.0.0.13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NETMASK&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;255.255.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;GATEWAY&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;10.0.0.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DNS1&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;192.168.1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-13/ifcfg-ens32
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Interface LAN 192.168.13.0 /24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DEVICE&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ens32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;BOOTPROTO&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ONBOOT&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IPADDR&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;192.168.13.254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NETMASK&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;255.255.255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Création du fichier permettant le routage IPv4 pour RNAT-13 :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi conf_routeurs/rnat-13/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Activation du routage IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;net.ipv4.ip_forward&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="création-du-playbook-pour-linstallation-des-rnat"&gt;&lt;a href="#cr%c3%a9ation-du-playbook-pour-linstallation-des-rnat" class="header-anchor"&gt;&lt;/a&gt;Création du playbook pour l’installation des RNAT
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Les modules &lt;strong&gt;copy&lt;/strong&gt;, &lt;strong&gt;shell&lt;/strong&gt;, &lt;strong&gt;service&lt;/strong&gt;, &lt;strong&gt;apt&lt;/strong&gt;, et &lt;strong&gt;yum&lt;/strong&gt; vont être utilisés dans le playbook.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Au lancement du playbook, un &lt;strong&gt;Gathering Facts&lt;/strong&gt; est exécuté pour récupérer toutes les informations nécessaires concernant les RNAT. Grâce à cela, un filtrage par nom d'hôte et par type de distribution est appliqué sur chaque action du playbook.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Création du playbook pour l'installation et la configuration des 3 RNAT :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi install_routeurs.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;hosts&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;routeurs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tasks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier de la configuration IP pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-11/interfaces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/network/interfaces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation des cartes réseaux pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens32 up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens34 up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Redémarrage du service réseau pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;service&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;networking&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;restarted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier activant le routage IPv4 pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-11/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation du routage IPv4 permanent pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; sysctl -p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Création du SNAT pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -t nat -A POSTROUTING -o ens32 -j SNAT --to 10.0.0.11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mise en persistence du SNAT pour RNAT-11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;apt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;iptables-persistent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;present&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-11&amp;#34; and ansible_distribution == &amp;#34;Debian&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Suppression des configurations IP existantes pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; warn: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rm /etc/netplan/*.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier de la configuration IP du LAN 10.0.0.0 /16 pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-12/00-lan_10.0.0.0.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/netplan/00-lan_10.0.0.0.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier de la configuration IP du LAN 192.168.12.0 /24 pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-12/01-lan_192.168.12.0.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/netplan/01-lan_192.168.12.0.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation des cartes réseaux pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens32 up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens35 up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Application de la configuration IP pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; netplan apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier activant le routage IPv4 pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-12/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation du routage IPv4 permanent pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; sysctl -p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Création du SNAT pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -t nat -A POSTROUTING -o ens32 -j SNAT --to 10.0.0.12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mise en persistence du SNAT pour RNAT-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;apt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;iptables-persistent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;present&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-12&amp;#34; and ansible_distribution == &amp;#34;Ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier de la configuration IP du LAN 10.0.0.0 /16 pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-13/ifcfg-ens33&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/sysconfig/network-scripts/ifcfg-ens33&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier de la configuration IP du LAN 192.168.13.0 /24 pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-13/ifcfg-ens32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/sysconfig/network-scripts/ifcfg-ens32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation des cartes réseaux pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens33 up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ip l set ens32 up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Redémarrage du service réseau pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;service&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;restarted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copie du fichier activant le routage IPv4 pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;copy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;src&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/conf_routeurs/rnat-13/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dest&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/sysctl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;force&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Activation du routage IPv4 permanent pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Suppression de firewalld pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;yum&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;firewalld&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Installation des services iptables pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;yum&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;iptables-services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;present&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Démarrage des services iptables pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;service&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;iptables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;started&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Purge des règles iptables existantes pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -F
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -X&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mise en place des nouvelles règles iptables pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -t nat -A POSTROUTING -o ens33 -j SNAT --to 10.0.0.13
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; iptables -t filter -A FORWARD -i ens32 -o ens33 -j ACCEPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Sauvegarde des règles iptables pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; warn: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; service iptables save&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Chargement des services iptables au démarrage pour RNAT-13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;shell&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; chkconfig iptables on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible_hostname == &amp;#34;rnat-13&amp;#34; and ansible_distribution == &amp;#34;CentOS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le playbook est format YAML ce qui signifie que l’indentation doit se faire avec des espaces et non avec des tabulations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="exécution-du-playbook-pour-le-déploiement-des-rnat"&gt;&lt;a href="#ex%c3%a9cution-du-playbook-pour-le-d%c3%a9ploiement-des-rnat" class="header-anchor"&gt;&lt;/a&gt;Exécution du playbook pour le déploiement des RNAT
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Le playbook d'installation des 3 RNAT est exécuté par la commande :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ansible-playbook -i inventory install_routeurs.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Un résumé des actions réalisées est affiché à la fin de l'exécution du playbook :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="play_recap.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="vérification-de-linstallation-des-3-rnat"&gt;&lt;a href="#v%c3%a9rification-de-linstallation-des-3-rnat" class="header-anchor"&gt;&lt;/a&gt;Vérification de l’installation des 3 RNAT
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;A l'aide d'un client sur chaque LAN, le routage est bien actif avec les bonnes règles dans iptables afin de pouvoir communiquer avec l’extérieur.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nginx : Reverse Proxy avec SSL</title><link>https://slash-root.fr/nginx-reverse-proxy-avec-ssl/</link><pubDate>Fri, 15 Oct 2021 15:00:06 +0200</pubDate><guid>https://slash-root.fr/nginx-reverse-proxy-avec-ssl/</guid><description>&lt;img src="https://slash-root.fr/nginx-reverse-proxy-avec-ssl/cover.png" alt="Featured image of post Nginx : Reverse Proxy avec SSL" /&gt;&lt;h2 id="pré-requis"&gt;&lt;a href="#pr%c3%a9-requis" class="header-anchor"&gt;&lt;/a&gt;Pré-requis
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Avoir suivi : &lt;a href="https://slash-root.fr/2021/10/15/nginx-installation-dun-reverse-proxy/" title="Nginx : Installation d’un Reverse Proxy"&gt;Nginx : Installation d’un Reverse Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avoir suivi : &lt;a href="https://slash-root.fr/2021/10/15/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/" title="Nginx : Ajouter un certificat SSL Let&amp;#039;s Encrypt pour passer en HTTPS"&gt;Nginx : Ajouter un certificat SSL Lets Encrypt pour passer en HTTPS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nginx-configuration"&gt;&lt;a href="#nginx-configuration" class="header-anchor"&gt;&lt;/a&gt;Nginx configuration
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Editez le fichier de configuration du reverse proxy :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vim /etc/nginx/sites-available/reverse-proxy.example.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;En principe, après avoir suivi l'installation d'un reverse proxy avec Nginx, le server block suivant va être modifié :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;blog.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://172.0.1.10:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;En premier lieu, nous allons réécrire l'url de &lt;a href="http://blog.example.com"&gt;http://blog.example.com&lt;/a&gt; en &lt;a href="https://blog.example.conf"&gt;https://blog.example.conf&lt;/a&gt;, pour cela nous allons modifié le server block précédent en :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;blog.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rewrite&lt;/span&gt; &lt;span style="color:#e6db74"&gt;^&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://blog.example.com&lt;/span&gt; &lt;span style="color:#e6db74"&gt;permanent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Ajouter un nouveau server block pour permettre de faire du reverse proxy SSL comme suit :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;blog.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/blog.example.com/fullchain.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/blog.example.com/privkey.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_session_cache&lt;/span&gt; builtin:&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#e6db74"&gt;shared:SSL:10m&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_ciphers&lt;/span&gt; &lt;span style="color:#e6db74"&gt;HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Host&lt;/span&gt; $host;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Real-IP&lt;/span&gt; $remote_addr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://172.0.1.10:443&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_read_timeout&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ssl_certificate&lt;/code&gt; et &lt;code&gt;ssl_certificate_key&lt;/code&gt; contiendront le chemin d'accès au certificat et à la clef privée. Bien entendu, il faudra les transféré sur le serveur reverse proxy au bon endroit avec les bonnes permissions. Générer un certificat wildcard est fortement recommandé si vous souhaitez développer plusieurs sous-domaine. Cette partie ne sera pas détaillé dans ce tutorial ainsi que la gestion de son renouvelement.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;proxy_pass&lt;/code&gt; : L'URL http / https vers le serveur hébergeant blog.example.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Vérifiez la configuration de Nginx avec :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Aucune erreur ne doit être retournée :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx: configuration file /etc/nginx/nginx.conf test is successful
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Redémarrer le serveur reverse proxy :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Tactical RMM : Présentation et installation</title><link>https://slash-root.fr/tactical-rmm-presentation-et-installation/</link><pubDate>Fri, 15 Oct 2021 14:48:51 +0200</pubDate><guid>https://slash-root.fr/tactical-rmm-presentation-et-installation/</guid><description>&lt;img src="https://slash-root.fr/tactical-rmm-presentation-et-installation/cover.png" alt="Featured image of post Tactical RMM : Présentation et installation" /&gt;&lt;h2 id="présentation"&gt;&lt;a href="#pr%c3%a9sentation" class="header-anchor"&gt;&lt;/a&gt;Présentation
&lt;/h2&gt;&lt;p&gt;Durant mes années d'administrateur systèmes Microsoft Windows (Il en faut bien), j'ai régulièrement été confronté à un souci de gestion de parc complet, simple, et efficace.&lt;br /&gt;
Lors de mes recherches, de nombreuses solutions se sont révélées être intéressantes (SolarWinds RMM, NinjaRMM, etc...).&lt;br /&gt;
Comme vous le savez, chez AukFood, on ne mange qu'OpenSource.&lt;br /&gt;
De ce fait, une solution s'est révélée pertinente : Tactical RMM (Remote Monitoring &amp;amp; Management)&lt;/p&gt;
&lt;p&gt;Tactical RMM fournit une interface web pour la gestion de flotte d'ordinateur permettant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La prise en main sur les postes (comme un TeamViewer)&lt;/li&gt;
&lt;li&gt;Obtenir une ligne de commande à distance&lt;/li&gt;
&lt;li&gt;Parcourir, télécharger, uploader des fichiers à distance&lt;/li&gt;
&lt;li&gt;Surveiller les logs&lt;/li&gt;
&lt;li&gt;Gérer les MAJ Windows, les services&lt;/li&gt;
&lt;li&gt;Mise en place d'alertes (CPU, espace disque, RAM...)&lt;/li&gt;
&lt;li&gt;Inventaire matériel et logiciels en place&lt;/li&gt;
&lt;li&gt;Déploiement d'applications via Chocolatey&lt;/li&gt;
&lt;li&gt;L'exécution de tâches en masse sur un ensemble de ressources&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tactical RMM s'appuie sur Django, Vue et Golang. Il utilise MeshCentral et un agent écrit en Golang.&lt;br /&gt;
Le serveur web utilisé est Nginx et la base de données MongoDB.&lt;br /&gt;
Cette solution est directement inspirée de l'outil commercial SolarWinds RMM (un des leaders du marché dans le RMM).&lt;br /&gt;
Contrairement à toutes les solutions de RMM performantes, celle-ci est sous licence MIT et est donc libre.&lt;/p&gt;
&lt;p&gt;Actuellement, seul un agent Windows x86 et x64 sont disponibles. Un agent Linux et macOS sont en cours de développement.&lt;br /&gt;
Les versions de Windows supportés sont : Windows 7, 8.1, 10, Server 2008R2, 2012R2, 2016, 2019.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour obtenir un agent Windows avec du code signé (Pas d'alerte antivirale), un don mensuel au projet de 50$ (statut sponsor) est nécessaire. Pas de panique, lors du déploiement d'un agent, des exclusions antivirus seront faites automatiquement. Nous y reviendrons un peu plus tard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;p&gt;2 méthodes d'installation sont possibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classique / Traditionnelle&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="avant-de-commencer"&gt;&lt;a href="#avant-de-commencer" class="header-anchor"&gt;&lt;/a&gt;Avant de commencer
&lt;/h3&gt;&lt;p&gt;Dans cette démonstration, une installation fraîche de Debian 10 est utilisée pour le serveur et la méthode d'installation classique est employée.&lt;br /&gt;
Un domaine résolvable sur Internet pour la génération de certificats Let's Encrypt est nécessaire ainsi qu'une application basée sur TOTP (Microsoft Authenticator, Authy, PrivacyIDEA...)&lt;br /&gt;
Pour la connexion à la Web UI, il faudra vous munir d'un des navigateurs suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome &amp;gt;= 93&lt;/li&gt;
&lt;li&gt;Edge &amp;gt;= 93&lt;/li&gt;
&lt;li&gt;Firefox &amp;gt;= 92&lt;/li&gt;
&lt;li&gt;Safari &amp;gt;= 15&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's Go Pinguy !&lt;/p&gt;
&lt;h3 id="prérequis"&gt;&lt;a href="#pr%c3%a9requis" class="header-anchor"&gt;&lt;/a&gt;Prérequis
&lt;/h3&gt;&lt;p&gt;Mise à jour système et installation des prérequis.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y wget curl sudo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt -y upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si un nouveau kernel a été installé, redémarrez dessus.&lt;/p&gt;
&lt;h3 id="création-dun-utilisateur"&gt;&lt;a href="#cr%c3%a9ation-dun-utilisateur" class="header-anchor"&gt;&lt;/a&gt;Création d&amp;rsquo;un utilisateur
&lt;/h3&gt;&lt;p&gt;Créez un utilisateur &amp;quot;tactical&amp;quot; et ajoutez-le au groupe sudoers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;useradd -m -s /bin/bash tactical
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;usermod -a -G sudo tactical
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;passwd tactical
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le mot de passe renseigné à ce niveau servira pour la connexion en SSH au serveur et non à la Web UI. Celui-ci sera défini un peu plus tard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="ouverture-des-ports"&gt;&lt;a href="#ouverture-des-ports" class="header-anchor"&gt;&lt;/a&gt;Ouverture des ports
&lt;/h3&gt;&lt;p&gt;Configurez votre pare-feu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Port TCP 443 : Accès Web UI&lt;/li&gt;
&lt;li&gt;Port TCP 22 : Accès SSH&lt;/li&gt;
&lt;li&gt;Port TCP 4222 : Communication avec l'agent&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="script-dinstallation"&gt;&lt;a href="#script-dinstallation" class="header-anchor"&gt;&lt;/a&gt;Script d&amp;rsquo;installation
&lt;/h3&gt;&lt;p&gt;Il est impératif de vérifier la bonne conformité de fichier /etc/hosts en premier lieu. Si le nom du serveur n'est pas correct, des erreurs d'installation se produiront.&lt;/p&gt;
&lt;p&gt;Basculez sur l'utilisateur tactical.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - tactical
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Téléchargez et exécutez le script d'installation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./install.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Répondez aux questions en remplaçant example.com par votre domaine ainsi qu'une adresse de messagerie valide.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="install_questions.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="enregistrement-txt"&gt;&lt;a href="#enregistrement-txt" class="header-anchor"&gt;&lt;/a&gt;Enregistrement TXT
&lt;/h3&gt;&lt;p&gt;Un challenge DNS est demandé afin de permettre la génération d'un certificat wildcard Let's Encrypt. Ce challenge DNS est demandé lors de la phase d'installation.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="txtrecord.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Une fois la propagation de l'entrée DNS effectuée, vérifiez celle-ci.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dig -t txt _acme-challenge.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;L'enregistrement DNS TXT doit impérativement retourner la bonne valeur sous peine d'un échec de la génération du certificat wildcard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="création-accès-web-ui"&gt;&lt;a href="#cr%c3%a9ation-acc%c3%a8s-web-ui" class="header-anchor"&gt;&lt;/a&gt;Création accès Web UI
&lt;/h3&gt;&lt;p&gt;Un couple login/password est à renseigner pour l'accès web durant le processus d'installation : &lt;a href="https://rmm.example.com"&gt;https://rmm.example.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="rmmlogin.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Un résumé de toutes les informations de connexions sera affiché à la fin du processus d'installation.&lt;/p&gt;
&lt;h3 id="mfa-et-authenticator"&gt;&lt;a href="#mfa-et-authenticator" class="header-anchor"&gt;&lt;/a&gt;MFA et Authenticator
&lt;/h3&gt;&lt;p&gt;Par défaut du MFA est mis en place avec une authentification par QR Code après la validation du couple login/password. Ce QR code est généré durant l'installation.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="qrcode_tactical_rmm.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Nous vous recommandons l'utilisation d'une application mobile OpenSource comme PrivacyIDEA ou Authy.&lt;/p&gt;
&lt;h3 id="récupération-de-lagent"&gt;&lt;a href="#r%c3%a9cup%c3%a9ration-de-lagent" class="header-anchor"&gt;&lt;/a&gt;Récupération de l&amp;rsquo;agent
&lt;/h3&gt;&lt;p&gt;Récupérez l'agent via &lt;a href="https://mesh.example.com:443/agentinvite?c=abcdef"&gt;https://mesh.example.com:443/agentinvite?c=abcdef&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="recup_agent.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ce lien sera affiché dans le résumé affiché à la fin de l'installation.&lt;/p&gt;
&lt;h3 id="configuration-initiale"&gt;&lt;a href="#configuration-initiale" class="header-anchor"&gt;&lt;/a&gt;Configuration initiale
&lt;/h3&gt;&lt;p&gt;Rendez-vous sur &lt;a href="https://rmm.example.com"&gt;https://rmm.example.com&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez le premier client/site.&lt;/li&gt;
&lt;li&gt;Définissez le fuseau horaire.&lt;/li&gt;
&lt;li&gt;Uploadez l'agent RMM préalablement récupéré.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'installation est terminée.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="tactical-rmm.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="fonctionnalités-aperçus"&gt;&lt;a href="#fonctionnalit%c3%a9s-aper%c3%a7us" class="header-anchor"&gt;&lt;/a&gt;Fonctionnalités (aperçus)
&lt;/h2&gt;&lt;p&gt;Voici quelques captures des fonctionnalités disponibles (non exhaustives).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="summary-1.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="checks.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="tasks.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Patches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="patches.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="software.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="history.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scripting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="scripting.png" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bulk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="bulk.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Tactical RMM est une solution robuste et en constante évolution. Les gestionnaires du projet ainsi que les contributeurs sont très réactifs et à l'écoute.&lt;br /&gt;
C'est une solution alternative parfaitement viable face aux concurrents propriétaires.&lt;/p&gt;
&lt;p&gt;Dans un prochain article, je vous décrirai les différentes méthodes de déploiements de l'agent (manuellement, automatiquement, par GPO...), approfondissement les différentes fonctionnalités, les commandes de management spécifiques, comment réaliser une mise à jour de Tactical RMM, la sauvegarde, la restauration, etc...&lt;/p&gt;
&lt;h2 id="source"&gt;&lt;a href="#source" class="header-anchor"&gt;&lt;/a&gt;Source
&lt;/h2&gt;&lt;p&gt;Projet : &lt;a href="https://github.com/wh1te909/tacticalrmm"&gt;GitHub - wh1te909/tacticalrmm: A remote monitoring &amp;amp; management tool, built with Django, Vue and Go.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS</title><link>https://slash-root.fr/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/</link><pubDate>Fri, 15 Oct 2021 14:05:01 +0200</pubDate><guid>https://slash-root.fr/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/</guid><description>&lt;img src="https://slash-root.fr/nginx-ajouter-un-certificat-ssl-lets-encrypt-pour-passer-en-https/cover.png" alt="Featured image of post Nginx : Ajouter un certificat SSL Let’s Encrypt pour passer en HTTPS" /&gt;&lt;h2 id="installation-de-certbot-pour-nginx"&gt;&lt;a href="#installation-de-certbot-pour-nginx" class="header-anchor"&gt;&lt;/a&gt;Installation de Certbot pour Nginx
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Installez les deux paquets nécessaires à l'utilisation de Certbot sous Debian avec un serveur Nginx :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install certbot python3-certbot-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="lets-encrypt--demander-un-certificat-ssl-pour-nginx"&gt;&lt;a href="#lets-encrypt--demander-un-certificat-ssl-pour-nginx" class="header-anchor"&gt;&lt;/a&gt;Let&amp;rsquo;s Encrypt : Demander un certificat SSL pour Nginx
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Effectuez une demande de certificat :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo certbot --nginx -d www.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--nginx&lt;/code&gt; : Pour spécifier que l'on utilise un serveur web sous Nginx&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-d www.example.com&lt;/code&gt; : Pour préciser le nom de domaine&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Votre adresse e-mail vous sera demandé. Un e-mail vous sera envoyé dans le cas où le certificat ne parvient pas à se renouveler automatiquement avant expiration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="certbot.png" alt="certbot" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il vous sera demandé si vous souhaitez rediriger automatiquement le traffic HTTP vers HTTPS :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="redirect_to_https.png" alt="redirect_to_https" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si tout se passe bien, un message de congratulations doit apparaitre :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="congratz.png" alt="congratz" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il a noté que dans le message final, les emplacements du certificat, clef privée, etc... sont également indiquées.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Certbot c'est occupé de configurer automatiquement le bloc server correspondant.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Vous pouvez aller voir les modifications apportées par Certbot dans le fichier de configuration de votre site. Les ajouts / modifications apportés par Certbot seront commentés en fin de ligne par &lt;strong&gt;# managed by Certbot&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="renouvellement-automatique-du-certificat-ssl"&gt;&lt;a href="#renouvellement-automatique-du-certificat-ssl" class="header-anchor"&gt;&lt;/a&gt;Renouvellement automatique du certificat SSL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Un certificat Let's Encrypt a une durée de validité de 90 jours.&lt;/li&gt;
&lt;li&gt;Certbot va s'occuper tout seul du renouvellement de celui-ci.&lt;/li&gt;
&lt;li&gt;Une tâche cron a été créée automatiquement par Certbot. Pour se rassurer :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vim /etc/cron.d/certbot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;La tâche planifiée va s'exécuter de façon à renouveler le certificat avant qu'il expire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="cron_certbot.png" alt="cron_certbot" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est possible de faire une simulation de renouvellement du certificat :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo certbot renew --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--dry-run&lt;/code&gt; : Permet de faire une simulation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le message &amp;quot;&lt;strong&gt;Congratulations, all renewals succeded.&lt;/strong&gt;&amp;quot; doit apparaitre si la simulation du renouvellement du certificat est un succès.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="renew_sim.png" alt="renew_sim" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La tâche planifiée va s'occuper de gérer cette opération à notre place. En cas de soucis, un e-mail sera envoyé à l'adresse indiqué lors de la demande de certificat.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nginx : Installation d’un Reverse Proxy</title><link>https://slash-root.fr/nginx-installation-dun-reverse-proxy/</link><pubDate>Fri, 15 Oct 2021 13:50:26 +0200</pubDate><guid>https://slash-root.fr/nginx-installation-dun-reverse-proxy/</guid><description>&lt;img src="https://slash-root.fr/nginx-installation-dun-reverse-proxy/cover.png" alt="Featured image of post Nginx : Installation d’un Reverse Proxy" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un des outils reverse proxy le + populaires du moment est Nginx&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un reverse proxy est un serveur positionné entre les applications web internes et les utilisateurs extérieurs. Le reverse proxy aiguille les requêtes des utilisateurs vers le serveur approprié.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le service reverse proxy agis comme un front-end qui traite toutes les requetes clientes entrantes et les distribue vers le back-end, bdd, ou autres serveurs. Puis il redirige les réponses en retour vers le client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nginx en tant que reverse proxy permet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;Améliore la sécurité&lt;/li&gt;
&lt;li&gt;Meilleur performance&lt;/li&gt;
&lt;li&gt;Point de terminaison SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-dun-reverse-proxy-avec-nginx"&gt;&lt;a href="#installation-dun-reverse-proxy-avec-nginx" class="header-anchor"&gt;&lt;/a&gt;Installation d&amp;rsquo;un reverse proxy avec Nginx
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Une Debian 10 sera utilisée avec 4GB de RAM, 2 vCPU, 20GB de disque&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installer-nginx"&gt;&lt;a href="#installer-nginx" class="header-anchor"&gt;&lt;/a&gt;Installer Nginx
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installer Nginx :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Après l'installation, vous pouvez vérifier que Nginx c'est correctement installé en vérifiant la version :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configurer-nginx"&gt;&lt;a href="#configurer-nginx" class="header-anchor"&gt;&lt;/a&gt;Configurer Nginx
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nous allons considérer que le site principal example.com est sur le même serveur que notre Nginx. Un site WordPress est disponible sur un sous domaine blog.example.com hébergé sur un serveur différent ayant l'adresse IP 172.0.1.10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nous devons configurer un reverse proxy avec Nginx pour rediriger les requêtes à destination de blog.example.com vers le serveur 172.0.1.10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Désactivez le vhost pré-configuré par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unlink /etc/nginx/sites-enabled/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous dans le répertoire &lt;code&gt;/etc/nginx/sites-available&lt;/code&gt; et créez le fichier de configuration du reverse proxy :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /etc/nginx/sites-available
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vim example.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collez cette configuration Nginx :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;example.com&lt;/span&gt; &lt;span style="color:#e6db74"&gt;www.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;try_files&lt;/span&gt; $uri $uri/ &lt;span style="color:#e6db74"&gt;/index.php?&lt;/span&gt;$query_string;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;blog.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Host&lt;/span&gt; $host:$server_port;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Server&lt;/span&gt; $host;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://172.0.1.10:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans cet exemple, le site example.com et www.example.com reste accessible sur la même instance Nginx. Par contre, Nginx redirige toutes les connexions entrantes pour blog.example.com sur le port 80 vers le serveur 127.0.1.10 écoutant sur le port 80&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sauvegardez le fichier et activez le en créant un lien symbolique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testez Nginx pour d'éventuelles erreurs de configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nginx: configuration file /etc/nginx/nginx.conf test is successful
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si aucune erreur, redémarrez Nginx pour prendre en compte les modifications :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C'est terminé !&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>