<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.0">Jekyll</generator><link href="https://www.worteks.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.worteks.com/" rel="alternate" type="text/html" /><updated>2026-04-11T19:37:32+02:00</updated><id>https://www.worteks.com/feed.xml</id><title type="html">Worteks - Expertise Open Source</title><subtitle>Société de service spécialisée dans l&apos;expertise Open Source, Worteks porte à coeur de conseiller et satisfaire ses clients.</subtitle><author><name>Worteks</name><email>info@worteks.com</email></author><entry><title type="html">Comment choisir votre composant Open Source - 1/3</title><link href="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie1/" rel="alternate" type="text/html" title="Comment choisir votre composant Open Source - 1/3" /><published>2026-03-12T00:00:00+01:00</published><updated>2026-03-12T00:00:00+01:00</updated><id>https://www.worteks.com/blog/oss-et-developpement_partie1</id><content type="html" xml:base="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie1/">&lt;p&gt;Cet article a pour objectif de lister les différents points à ne pas négliger quand on commence un projet intégrant des composants Open Source.&lt;/p&gt;

&lt;p&gt;On va tout d’abord présenter l’impact économique de l’Open Source et de son emploi. On s’attachera ensuite à définir les critères de choix des composants, puis les contraintes associées. On terminera par quelques exemples du monde réel pour mettre en exergue les points d’achoppement et la difficulté de s’appuyer sur ces composants.&lt;/p&gt;

&lt;p&gt;Toutes les parties de cet article sont accessibles ci-dessous :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie1/&quot;&gt;Open Source et développement - Partie 1 : Comment choisir votre composant Open Source&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie2/&quot;&gt;Open Source et développement - Partie 2 : La vie du composant Open Source après son intégration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie3/&quot;&gt;Open Source et développement - Partie 3 : Questions ouvertes : bugs, IA, souveraineté et autres&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Commençons par définir les besoins et les contraintes au niveau technique et économique, mais aussi juridique et organisationnel.&lt;/p&gt;

&lt;h2 id=&quot;rapide-balayage-historique&quot;&gt;Rapide balayage historique&lt;/h2&gt;

&lt;p&gt;Le mouvement Open Source n’est pas récent. Il fut un temps où la notion de “propriété intellectuelle” n’existait tout simplement pas. Il faut attendre le 18ème siècle pour que soit instauré le droit d’auteur. Le partage était néanmoins limité par la difficulté de se procurer des supports à moindre coût. Les copistes du Moyen-Age étaient un parfait exemple de système de partage de connaissances, certes limité à un domaine assez restreint…&lt;/p&gt;

&lt;p&gt;Dans le domaine de l’informatique, le partage de code et de spécifications se pratique très vite. Les RFC (“Request for Comments”) sont publiées à partir de 1969. Toutefois, le partage de code a existé depuis au moins1955, quand les membres du groupe SHARE mettaient à disposition de tous les modifications logicielles du code tournant sur des serveurs IBM.&lt;/p&gt;

&lt;p&gt;Le mouvement “Open Source” se développe fortement dans les années 1980 et 1990. On parlait alors de “free software”. Mais pour supprimer l’ambiguïté du mot “free”, le terme  Open Source a été validé qu’en 1998.&lt;/p&gt;

&lt;p&gt;À cette même période, voient le jour des projets comme GNU et Linux et des fondations comme The ASF, qui deviennent rapidement des acteurs incontournables de l’Open Source. Considérés comme un “cancer” par certains gros éditeurs, ils vont effectivement métastaser l’écosystème, au point qu’il est difficile aujourd’hui d’imaginer un développement informatique ne comportant pas de composants Open Source. Et cela sans tuer les sociétés qui les utilisent ;-)&lt;/p&gt;

&lt;h2 id=&quot;loss-en-2026&quot;&gt;L’OSS en 2026&lt;/h2&gt;

&lt;p&gt;On peut donc considérer qu’en 2026, l’Open Source (OSS) est partout. Dans l’étude “The Value of Open Source Software”&lt;sup&gt;&lt;a href=&quot;#ref-1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, on peut lire :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;…recent studies have come to similar conclusions showing that open source software (OSS) – software whose source code is publicly available for inspection, use, and modification and is often created in a decentralized manner and distributed for free – appears in 96% of codebases (Synopsys 2023), and that some commercial software consists of up to 99.9% freely available OSS (Musseau et al., 2022)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La quasi totalité du logiciel produit s’appuie donc sur des composants Open Source. Il est illusoire d’imaginer un retour en arrière.&lt;/p&gt;

&lt;h2 id=&quot;quelle-est-la-valeur-de-loss-et-comment-la-mesurer&quot;&gt;Quelle est la valeur de l’OSS et comment la mesurer ?&lt;/h2&gt;

&lt;p&gt;Se pose la question de la valorisation de l’Open Source et de son coût. Tout d’abord, on peut évaluer son coût de “remplacement”, à savoir combien coûterait le développement des composants Open Source si chaque acteur économique les utilisant devait les réécrire, ou les acheter. Sur quelle base cette valorisation est-elle effectuée ? Un produit commercial a une valeur théorique qui correspond à un prix de vente multiplié par une quantité vendue. Dans le cas de l’Open Source, le prix de vente peut être considéré comme nul (même s’il est toujours possible de vendre un logiciel Open Source, si on trouve un acheteur…). On calcule alors la valeur de remplacement à partir :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;du coût du logiciel s’il devait être réécrit,&lt;/li&gt;
  &lt;li&gt;du nombre d’entreprises l’utilisant,&lt;/li&gt;
  &lt;li&gt;Ou de l’achat d’un logiciel propriétaire équivalent, avec le coût du support récurant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’étude “The Value of Open Source Software” citée plus haut donne cette évaluation :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Le coût de remplacement s’élèverait à 8,8T$, soit environ le PIB du Japon et de l’Inde combinés.&lt;/li&gt;
  &lt;li&gt;Le coût d’écriture unitaire représenterait 4,15G$.&lt;/li&gt;
  &lt;li&gt;Les acteurs économiques dépenseraient 3,5 fois plus en logiciels si l’Open Source n’existait pas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;un-petit-exemple&quot;&gt;Un petit exemple&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://directory.apache.org/studio/&quot; target=&quot;_blank&quot;&gt;Apache Directory Studio&lt;/a&gt; est un logiciel assez largement utilisé dans le monde LDAP.&lt;/p&gt;

&lt;p&gt;Il comporte environ 260 000 lignes de code (sans compter les sauts de ligne ou les commentaires, ce qui en double le nombre), soit 10 millions de dollars (selon le modèle COCOMO - Constructive Cost Model -). Le remplacement de ce logiciel Open Source représenterait un effort total de 2,7 ans pour une équipe de 26 développeurs.&lt;/p&gt;

&lt;p&gt;En réalité, Apache Directory Studio a été développé à 98% par 3 personnes. Le projet a démarré il y a 20 ans même si l’essentiel du travail s’est concentré sur 7 années.&lt;/p&gt;

&lt;p&gt;Il est donc clair que les contraintes du monde professionnel ne s’appliquent pas à l’Open Source, en général. Néanmoins cela donne une idée de ce que peut représenter le coût du développement d’un logiciel Open Source.&lt;/p&gt;

&lt;h2 id=&quot;les-choix-techniques&quot;&gt;Les choix techniques&lt;/h2&gt;

&lt;p&gt;Bien choisir un composant est essentiel, puisqu’on ne va pas le réécrire. Il est primordial de déterminer les critères de sélection. Ils se répartissent en deux catégories :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Les critères mesurables
    &lt;ul&gt;
      &lt;li&gt;L’adéquation au besoin&lt;/li&gt;
      &lt;li&gt;La compétence interne sur le composant choisi&lt;/li&gt;
      &lt;li&gt;Les performances attendues du composant&lt;/li&gt;
      &lt;li&gt;L’intégration avec les autres composants&lt;/li&gt;
      &lt;li&gt;Les limitations du composant&lt;/li&gt;
      &lt;li&gt;La facilité à administrer et à monitorer le composant&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Les critères non mesurables
    &lt;ul&gt;
      &lt;li&gt;La maintenance du projet d’où est issu le composant&lt;/li&gt;
      &lt;li&gt;La possibilité d’y apporter des corrections&lt;/li&gt;
      &lt;li&gt;La qualité de la documentation&lt;/li&gt;
      &lt;li&gt;Le support des failles de sécurité&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette liste n’est pas exhaustive, mais représente tout de même un ensemble de points pertinents permettant de comparer les composants disponibles et de faire un choix.&lt;/p&gt;

&lt;h3 id=&quot;les-critères-mesurables&quot;&gt;Les critères mesurables&lt;/h3&gt;

&lt;p&gt;De toute évidence, le composant doit répondre à votre besoin technique et fonctionnel. C’est la première étape. Pour valider cette adéquation, il convient de conduire des tests et de réaliser des études de cas ainsi qu’une évaluation fonctionnelle.&lt;/p&gt;

&lt;p&gt;Cela suppose que les personnes en charge de cette étude aient la compétence requise pour la mener à bien ou aient recours à des compétences extérieures, ce qui engendre un coût supplémentaire.&lt;/p&gt;

&lt;p&gt;La notion de performance est importante, elle sera un des facteurs de dimensionnement de la plateforme sur laquelle tournera le logiciel. Il faut tenir compte des effets de saturation, où les performances peuvent diminuer de façon non linéaire.&lt;/p&gt;

&lt;p&gt;L’intégration est à mettre en regard des technologies déjà utilisées et maîtrisées (langage, OS, etc). De même les APIs doivent être étudiées avec soin pour s’assurer qu’elles sont adaptées au besoin.&lt;/p&gt;

&lt;p&gt;Un composant Open Source a des limitations, de même qu’un composant privatif. S’il est possible de demander des corrections et des évolutions à une société commerciale, c’est beaucoup plus compliqué pour un projet Open Source, dont le développement est généralement assuré par des volontaires.&lt;/p&gt;

&lt;p&gt;Enfin une fois le composant intégré, il faudra le maintenir : montées de versions, analyse des problèmes, corrections des anomalies, sans compter la formation des utilisateurs.&lt;/p&gt;

&lt;p&gt;Tout ces critères mesurables vont représenter un coût à internaliser, qu’il ne faut pas négliger lors du choix.&lt;/p&gt;

&lt;h3 id=&quot;les-critères-non-mesurables&quot;&gt;Les critères non mesurables&lt;/h3&gt;

&lt;p&gt;Ils regroupent les facteurs qu’il n’est pas possible d’évaluer techniquement.&lt;/p&gt;

&lt;p&gt;Quand on choisit un composant Open Source, on choisit une communauté : celle qui développe et maintient le produit. Cette communauté n’a aucune obligation autre que celles qu’elle s’impose. Il faut en être conscient, accepter ce risque et l’intégrer dans son plan produit.
Un composant Open Source développé au sein d’une fondation comme &lt;a href=&quot;https://apache.org/&quot; target=&quot;_blank&quot;&gt;The ASF&lt;/a&gt; ou &lt;a href=&quot;https://www.eclipse.org/&quot; target=&quot;_blank&quot;&gt;Eclipse Foundation&lt;/a&gt; offre tout de même une garantie plus poussée de pérennité et de qualité sur le long terme, du fait des contraintes imposées aux projets. Par exemple, en ce qui concerne The ASF, on peut citer ces règles :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Un projet ne peut rejoindre la fondation que s’il a atteint un niveau de maturité suffisant.&lt;/li&gt;
  &lt;li&gt;Il doit passer par une phase d’incubation sous la supervision d’au moins trois membres de la fondation.&lt;/li&gt;
  &lt;li&gt;Il ne peut sortir de l’incubation tant qu’une release n’a été fournie.&lt;/li&gt;
  &lt;li&gt;Un projet doit disposer d’au moins trois participants actifs de trois sociétés différentes, ce qui interdit la main-mise d’une seule entreprise sur ce projet.&lt;/li&gt;
  &lt;li&gt;Des revues trimestrielles sont à fournir au Board par le responsable de chaque projet.&lt;/li&gt;
  &lt;li&gt;Enfin un projet inactif sera reversé dans l’Attic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il est également possible de corriger par soi-même une anomalie critique ou bloquante, ou de développer une fonctionnalité manquante, puisqu’il s’agit d’Open Source. Reste à savoir dans quelle mesure ces corrections ou ajouts vont être intégrés dans les futures versions. Le risque étant d’avoir à maintenir un “fork”.&lt;/p&gt;

&lt;p&gt;Un autre aspect qui est souvent reproché aux composants Open Source est la qualité de la documentation. Les projets Open Source n’ont pas nécessairement les moyens de disposer de rédacteurs techniques en charge de la documentation, et c’est généralement du “best effort”. Il n’est pas rare d’avoir des composants dont la seule documentation est le code source, et l’API exposée. Internet reste souvent un moyen d’obtenir l’information manquante, en s’appuyant sur la communauté des utilisateurs.&lt;/p&gt;

&lt;p&gt;Enfin il faut tenir compte de la capacité d’une communauté Open Source à prendre en compte les failles de sécurité critiques. L’information est généralement fournie trop tard, lorsqu’elle est déjà publique. En effet, il y a rarement une politique d’alerte privée permettant d’informer les utilisateurs principaux avant la divulgation de la faille corrigée, ce qui est plutôt logique étant donné qu’un projet Open Source ne connaît pas ses utilisateurs (sauf cas d’espèce). Si un processus documenté de gestion des CVE (Common Vulnerabilities and Exposures) existe déjà, c’est un plus. The ASF dispose d’un tel processus&lt;sup&gt;&lt;a href=&quot;#ref-2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;, par exemple.&lt;/p&gt;

&lt;p&gt;Au final, il est compliqué d’associer un coût à ces critères, mais il est nécessaire à tout le moins de les intégrer en terme de gestion du risque.&lt;/p&gt;

&lt;h2 id=&quot;les-choix-organisationnels&quot;&gt;Les choix organisationnels&lt;/h2&gt;

&lt;p&gt;Les éléments qui doivent être pris en compte lors du choix d’un composant Open Source sont également directement liés à des choix organisationnels :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Disponibilité des ressources internes,&lt;/li&gt;
  &lt;li&gt;Disponibilité de support,&lt;/li&gt;
  &lt;li&gt;Vitalité du projet,&lt;/li&gt;
  &lt;li&gt;État de la communauté,&lt;/li&gt;
  &lt;li&gt;Type de communauté.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le composant sélectionné doit être pris en main par les équipes internes. Il leur faut l’intégrer, en comprendre le fonctionnement, le tester, valider les performances par rapport aux besoins, gérer les alarmes, le monitorer… En un mot, se l’approprier.&lt;/p&gt;

&lt;p&gt;Il est possible d’employer des consultants externes connaissant le composant, encore faut-il les trouver ! Plus le composant est connu, plus il est facile de trouver une ressource externe.&lt;/p&gt;

&lt;p&gt;On peut également se poser la question du support : les composants les plus connus sont généralement supportés par de nombreuses entreprises. Reste à qualifier leur niveau de compétence…&lt;/p&gt;

&lt;p&gt;Un aspect à ne pas négliger est l’état de la communauté autour du projet. Y-a-t-il une liste de diffusion sur laquelle envoyer les questions que l’on se pose ? Est-elle active ? Les releases sont-elles fréquentes ? Les anomalies remontées sont-elles prises en charge rapidement et efficacement ? Plus généralement, combien y-a-t-il de participants actifs ? Github permet par exemple de vérifier l’activité sur une période de temps afin de se rendre compte si le projet est toujours activement maintenu et développé, pour autant qu’il soit hébergé sur cette plateforme.&lt;/p&gt;

&lt;p&gt;Quand aux contributeurs, il faut également se poser la question de leur implication et du cadre de leurs contributions. S’ils sont salariés par des entreprises qui financent leurs travaux, la question de savoir s’ils continueront en cas de changement de cadre professionnel se pose. L’âge des contributeurs est également un facteur à prendre en considération : personne n’est éternel (et chacun va prendre sa retraite à un moment donné…) !&lt;/p&gt;

&lt;p&gt;Enfin le type de communauté donne une idée de la direction que peut prendre un projet. Il existe plusieurs modes de fonctionnement, du ‘‘one man show’’ en passant par le BDFL (Benevolent Dictator For Life) jusqu’à un système totalement décentralisé sans direction formelle, où les décisions se prennent collégialement. En pratique, on se trouve souvent confronté à de très petites communautés, ou bien à des communautés adossées à des entreprises commerciales.&lt;/p&gt;

&lt;h2 id=&quot;les-choix-économiques&quot;&gt;Les choix économiques&lt;/h2&gt;

&lt;p&gt;À ne pas négliger ! Sauf à disposer d’une équipe “couteau suisse” capable de prendre en charge la totalité des composants choisis, il sera sans doute nécessaire d’avoir recours à des experts sur quelques composants essentiels. Et ce n’est pas gratuit !&lt;/p&gt;

&lt;p&gt;L’alternative est de souscrire à un contrat de support, ce qui se pratique fréquemment. On entre alors dans un modèle proche de celui d’un éditeur logiciel dont on a acheté un produit, le prix du produit en moins. En réalité, c’est ainsi que se financent de nombreux éditeurs Open Source.&lt;/p&gt;

&lt;p&gt;Si votre composant est amené à être exécuté dans le cloud, ou si vous recourez à un service PaaS, il y aura des coûts induits, qui peuvent être conséquents. De nombreux éditeurs logiciels Open Source ont modifié leur modèle de licence pour interdire l’utilisation de leurs produits par des fournisseurs PaaS pour des raisons évidentes. L’impact est alors majeur pour les utilisateurs. Par exemple, une base de données comme &lt;a href=&quot;https://www.mongodb.com/fr-fr&quot; target=&quot;_blank&quot;&gt;MongoDB&lt;/a&gt; ne peut pas être utilisée dans sa version Open Source en mode “as a service”. Les coûts peuvent vite se monter à plusieurs dizaines de milliers d’euros par mois pour des volumétries importantes, si on a recours à des solutions basées sur ce produit.&lt;/p&gt;

&lt;p&gt;Globalement, les services de type PaaS ne sont pas gratuits et nécessitent une évaluation de l’impact financier lié à ce choix.&lt;/p&gt;

&lt;h2 id=&quot;les-choix-juridiques&quot;&gt;Les choix juridiques&lt;/h2&gt;

&lt;p&gt;Un dernier aspect à prendre en compte, qui n’est pas le moins important, est le type de licence du composant. Toutes les licences Open Source ne se valent pas, certaines sont permissives, d’autres non. Il est primordial d’en comprendre les tenants et aboutissants avant d’opter pour une solution.
Il y a trois grandes catégories de licences :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“copyleft”, ou “contaminantes” : GPL et dérivées. Ce type de licence impose que les versions dérivées sont soumises aux règles de la licence d’origine.&lt;/li&gt;
  &lt;li&gt;“Permissives” : AL, MIT, BSD… Ce type de licence autorise l’utilisation des composants sans imposer de règles autre que celle de tracer la paternité du code (en l’occurrence, rendre accessible le texte de la licence dans le produit final).&lt;/li&gt;
  &lt;li&gt;“Asymétriques” : Il s’agit de licences autorisant l’utilisation du composant dans un certain cadre, tout en limitant son usage en dehors de ce cadre. C’est, par exemple, une autorisation d’utiliser le composant pour le propre usage d’une entreprise, mais une interdiction d’en permettre l’usage pour les clients de cette même entreprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il existe plusieurs dizaines d’autres licences. Il est nécessaire d’en faire le recensement et d’en étudier les contraintes juridiques avant d’intégrer les composants associés. A ce titre, il peut être judicieux de recourir aux conseils d’un juriste.&lt;/p&gt;

&lt;p&gt;Enfin, il faut tenir compte des dépendances transitives ! Un composant Open Source n’arrive jamais seul, il est la plupart du temps lui même consommateur d’autres composants Open Source. Il convient de faire l’étude de chacune de ces dépendances pour faire son choix en connaissance de cause.&lt;/p&gt;

&lt;p&gt;Le document produit par The Linux Foundation&lt;sup&gt;&lt;a href=&quot;#ref-3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; donne une idée assez précise de ce qu’il convient de prendre en compte lors d’une étude de “compliance” d’un composant.&lt;/p&gt;

&lt;p&gt;Lire la suite : &lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie2/&quot;&gt;Open Source et développement - Partie 2 : Versions, licences, évolutions et maintenance, la vie du composant Open Source après son intégration&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;bibliographie&quot;&gt;Bibliographie&lt;/h2&gt;

&lt;p&gt;&lt;a id=&quot;ref-1&quot; href=&quot;https://www.hbs.edu/ris/Publication%20Files/24-038_51f8444f-502c-4139-8bf2-56eb4b65c58a.pdf&quot; target=&quot;blank&quot;&gt;[1] The Value of Open Source Software &lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-2&quot; href=&quot;https://www.apache.org/security/committers.html&quot; target=&quot;blank&quot;&gt;[2] ASF Project Security for Committers&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-3&quot; href=&quot;https://www.linuxfoundation.org/hubfs/LF%20Research/OpenSourceLicenseComplianceReport_010224.pdf?hsLang=en&quot; target=&quot;blank&quot;&gt;[3] Open Source Compliance&lt;/a&gt;&lt;/p&gt;</content><author><name>Emmanuel LÉCHARNY</name></author><category term="Opensource" /><category term="Développement" /><summary type="html">Open Source et développement - Partie 1/3 : Comment choisir votre composant Open Source</summary></entry><entry><title type="html">Questions ouvertes : bugs, IA, souveraineté et autres - 3/3</title><link href="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie3/" rel="alternate" type="text/html" title="Questions ouvertes : bugs, IA, souveraineté et autres - 3/3" /><published>2026-03-12T00:00:00+01:00</published><updated>2026-03-12T00:00:00+01:00</updated><id>https://www.worteks.com/blog/oss-et-developpement_partie3</id><content type="html" xml:base="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie3/">&lt;p&gt;Cet article a pour objectif de lister les différents points à ne pas négliger quand on commence un projet intégrant des composants Open Source.&lt;/p&gt;

&lt;p&gt;Toutes les parties de cet article sont accessibles ci-dessous :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie1/&quot;&gt;Open Source et développement - Partie 1 : Comment choisir votre composant Open Source&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie2/&quot;&gt;Open Source et développement - Partie 2 : La vie du composant Open Source après son intégration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie3/&quot;&gt;Open Source et développement - Partie 3 : Questions ouvertes : bugs, IA, souveraineté et autres&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une fois ce panorama (partiel) présenté, certaines questions restent en suspens. Ce dernier chapitre va essayer de les lister, sans prétendre à l’exhaustivité.&lt;/p&gt;

&lt;h2 id=&quot;quid-de-la-longévité&quot;&gt;Quid de la longévité ?&lt;/h2&gt;

&lt;p&gt;Ayant recherché un composant récemment pour un besoin client, voici le dernier message posté sur la page du projet&lt;sup&gt;&lt;a href=&quot;#ref-13&quot;&gt;[13]&lt;/a&gt;&lt;/sup&gt; :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“This repository is now archived.
    Thank you all for your excellent contributions.
    May it continue to live in all your wonderful forks.”
    OPENLDAP Exporter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C’est juste un exemple, et fort heureusement il a été forké 65 fois, mais cela ouvre d’autres questions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Quel fork utiliser ?&lt;/li&gt;
  &lt;li&gt;Quelle garanties a-t-on que le fork que l’on choisira survivra ?&lt;/li&gt;
  &lt;li&gt;Le problème ne va-t-il pas se reproduire ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encore une fois, dans le monde Open Source, l’utilisateur est le responsable de ses choix. Ceux-ci doivent être pesés.&lt;/p&gt;

&lt;h2 id=&quot;la-gestion-des-cves&quot;&gt;La gestion des CVEs&lt;/h2&gt;

&lt;p&gt;Les CVE sont des failles de sécurité identifiées. Elles couvrent l’ensemble des logiciels depuis 1999. Ce système d’alerte est géré par The MITRE Corporation. Aujourd’hui, il s’agit de la référence conservant toutes les failles connues et elle est alimentée en continue. Le 15 avril 2025, le contrat qui liait cette organisation et le gouvernement américain a été rompu par ce dernier à la veille de la date d’expiration contractuelle&lt;sup&gt;&lt;a href=&quot;#ref-14&quot;&gt;[14]&lt;/a&gt;&lt;/sup&gt;. Vu l’urgence, une extension de 11 mois a été mise en place, mais rien n’est prévu sur ce qui se passera en avril 2026… On peut légitimement se poser la question de savoir pourquoi l’industrie ne finance pas ce service essentiel.&lt;/p&gt;

&lt;p&gt;En Europe, un service équivalent (EUVD, European Union Vulnerability Database&lt;sup&gt;&lt;a href=&quot;#ref-15&quot;&gt;[15]&lt;/a&gt;&lt;/sup&gt;) a été mis en place et délégué à l’ENISA&lt;sup&gt;&lt;a href=&quot;#ref-16&quot;&gt;[16]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h2 id=&quot;que-faire-en-cas-de-bug&quot;&gt;Que faire en cas de bug ?&lt;/h2&gt;

&lt;p&gt;Donc vous avez trouvé un bug dans un des composants que vous utilisez. Quelle est la démarche à suivre ? Il n’y a pas de procédure toute faite.&lt;/p&gt;

&lt;p&gt;La première démarche est de vérifier que ce bug n’a pas été corrigé dans une version plus récente. Si ce n’est pas le cas, peut-être qu’un ticket d’anomalie a déjà été rempli ? Sinon, le plus simple est de créer un nouveau ticket. Mais encore faut-il que le projet propose un mécanisme qui le permette. Si le projet est sous GitHub, par exemple, vous pouvez certainement remplir un rapport d’anomalie (mais attention, tous les projets sous GitHub ne le permettent pas). Si le projet dispose d’un système de gestion des anomalies (JIRA, Redmine, Mantis, Bugzilla, etc), c’est sans doute votre point d’entrée. Une autre solution pourrait être de poster un message sur la liste de diffusion du projet, à condition qu’il y en ait une… Comme on le voit, il n’y a pas de mécanisme standardisé pour signaler une anomalie, chaque projet les gère à son gré et il faut en tenir compte.&lt;/p&gt;

&lt;p&gt;En espérant qu’une correction sera proposée ! Et si ce n’est pas le cas, mais qu’on est à même d’apporter cette correction, la question suivante est de savoir comment la gérer : faut-il forker le projet en attendant une éventuelle release ?&lt;/p&gt;

&lt;p&gt;Dans tous les cas, les utilisateurs sont fortement encouragés à remonter les anomalies et idéalement à proposer des patchs sous toutes formes possibles.&lt;/p&gt;

&lt;h2 id=&quot;et-lia&quot;&gt;Et l’IA ?&lt;/h2&gt;

&lt;p&gt;Un nouveau venu est en train de bouleverser la façon dont on développait : l’IA. Depuis un ou deux ans, les progrès des solutions basées sur des LLM permettent de générer du code qui n’est pas totalement inutilisable. On prétend même que ces IA vont remplacer les développeurs, qui ne seront plus que des prompteurs avec une productivité 10 fois supérieure…&lt;/p&gt;

&lt;p&gt;On peut rêver. En attendant, cela pose quand même un certain nombre de questions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Quel est la qualité du code proposé par ces IAs ?&lt;/li&gt;
  &lt;li&gt;Quid de la licence ?&lt;/li&gt;
  &lt;li&gt;Qu’en est-il des tests associés ?&lt;/li&gt;
  &lt;li&gt;Les rapports d’anomalies générés par des IAs sont-ils pertinent ?&lt;/li&gt;
  &lt;li&gt;Quel sera le coût de ces solutions à long terme ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aujourd’hui, de nombreux mainteneurs de projets Open Source se plaignent d’être inondés de propositions de correction de piètre qualité générées par des IA. Le temps passé à relire les propositions, à les tester et à les corriger n’est pas forcément en rapport avec le gain obtenu. Sans compter les faux positifs à éliminer.&lt;/p&gt;

&lt;p&gt;De plus, on peut se poser la question du coût d’usage de ces outils. S’ils sont aujourd’hui quasi gratuits, ils risquent de devenir payants quand les sociétés qui ont investit des dizaines de milliards de dollars dans ces solutions demanderont un retour sur investissement.&lt;/p&gt;

&lt;p&gt;Certains sites se protègent (difficilement) contre ces robots en tentant de leur interdire l’accès aux sources. En effet, ces requêtes incessantes consomment de la bande passante et du temps CPU, ce qui se traduit en frais d’hébergement en forte augmentation. Le second problème est qu’on risque d’aboutir à une “moyennisation” des solutions proposées, puisque l’alimentation de ces outils se fait par la récupération des sources sur internet. A partir du moment où les IA se mettent à produire du code qui sera intégré dans les bases, elles vont se nourrir de ce qu’elles ont elles-même produit. Il ne faut pas oublier qu’il s’agit d’outil de génération probabilistique.&lt;/p&gt;

&lt;p&gt;Sans vouloir dépeindre un tableau apocalyptique, il est important de questionner la portée de ces outils et d’en faire un usage raisonné.&lt;/p&gt;

&lt;h2 id=&quot;qui-finance&quot;&gt;Qui finance ?&lt;/h2&gt;

&lt;p&gt;La grande question… Puisqu’il s’agit d’Open Source, le modèle économique est compliqué à identifier. Aujourd’hui on peut considérer que les contributions sont financées de différentes façons :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Par de grosses sociétés comme Google, IBM, Microsoft, qui ont une politique Open Source assez poussée.&lt;/li&gt;
  &lt;li&gt;Par des fondations qui assurent non pas le financement des développements, mais au moins l’infrastructure nécessaire à sa mise à disposition. C’est le cas des fondations Apache ou Eclipse, etc.&lt;/li&gt;
  &lt;li&gt;Par des organisations gouvernementales qui couvrent tout ou partie des développements (NGI, NLNET…).&lt;/li&gt;
  &lt;li&gt;De nombreuses PMI/PME qui soit utilisent des composants et les maintiennent, soit développent ces composants en les mettant à disposition, soit ont une politique de contribution.&lt;/li&gt;
  &lt;li&gt;Par des initiatives publiques ou privées (Bug Bounties, GitHub sponsoring…).&lt;/li&gt;
  &lt;li&gt;Mais également par beaucoup de personnes travaillant sur leur temps personnel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;parlons-de-souveraineté&quot;&gt;Parlons de souveraineté&lt;/h2&gt;

&lt;p&gt;L’Open Source n’a pas de frontière mais… savez-vous que les USA peuvent interdire l’accès à GitHub à certains pays, comme l’Iran ? Cela a été le cas jusqu’en 2021.&lt;/p&gt;

&lt;p&gt;Il peut être utile de se poser la question de la disponibilité de certains composants en terme de souveraineté. Pendant de nombreuses années, toute partie de code qui relevait de la cryptographie relevait de mesures d’autorisation d’exportation de la part du gouvernement américain. Rien n’interdit de penser que des règles plus strictes pourraient être imposées.&lt;/p&gt;

&lt;p&gt;L’Open Source offre plus de souplesse que le code privatif, mais il convient de rester prudent. Les demandes récurrentes de la mise en place de backdoors par les administrations sont autant d’éléments inquiétants, par exemple.&lt;/p&gt;

&lt;p&gt;Sans aller jusqu’à la paranoïa, il semblerait utile que les administrations s’approprient l’Open Source, non seulement en tant qu’utilisatrices, mais également en tant qu’actrices au sein de projets d’importance vitale. Voilà un autre débat, qui ne sera pas ouvert ici et ce long post de blog se clôturera sur ce point en suspens !&lt;/p&gt;

&lt;h2 id=&quot;bibliographie&quot;&gt;Bibliographie&lt;/h2&gt;

&lt;p&gt;&lt;a id=&quot;ref-13&quot; href=&quot;https://github.com/tomcz/openldap_exporter&quot; target=&quot;blank&quot;&gt;[13] OpenLDAP exporter&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-14&quot; href=&quot;https://www.csoonline.com/article/3963190/cve-program-faces-swift-end-after-dhs-fails-to-renew-contract-leaving-security-flaw-tracking-in-limbo.html&quot; target=&quot;blank&quot;&gt;[14] CVE program averts swift end after CISA executes 11-month contract extension&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-15&quot; href=&quot;https://euvd.enisa.europa.eu/about&quot; target=&quot;blank&quot;&gt;[15] European Union Vulnerability Database&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-16&quot; href=&quot;https://www.enisa.europa.eu/&quot; target=&quot;blank&quot;&gt;[16] ENISA&lt;/a&gt;
&lt;br /&gt;&lt;/p&gt;</content><author><name>Emmanuel LÉCHARNY</name></author><category term="Opensource" /><category term="Développement" /><summary type="html">Open Source et développement - Partie 3/3 : Questions ouvertes : bugs, IA, souveraineté et autres</summary></entry><entry><title type="html">La vie du composant Open Source après son intégration - 2/3</title><link href="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie2/" rel="alternate" type="text/html" title="La vie du composant Open Source après son intégration - 2/3" /><published>2026-03-12T00:00:00+01:00</published><updated>2026-03-12T00:00:00+01:00</updated><id>https://www.worteks.com/blog/oss-et-developpement_partie2</id><content type="html" xml:base="https://www.worteks.com/blog/2026-03-12-oss-et-developpement_partie2/">&lt;p&gt;Cet article a pour objectif de lister les différents points à ne pas négliger quand on commence un projet intégrant des composants Open Source.&lt;/p&gt;

&lt;p&gt;Toutes les parties de cet article sont accessibles ci-dessous :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie1/&quot;&gt;Open Source et développement - Partie 1 : Comment choisir votre composant Open Source&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie2/&quot;&gt;Open Source et développement - Partie 2 : La vie du composant Open Source après son intégration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie3/&quot;&gt;Open Source et développement - Partie 3 : Questions ouvertes : bugs, IA, souveraineté et autres&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Après avoir défini les critères de choix des composants, nous allons étudier les éléments techniques permettant d’effectuer un choix éclairé.&lt;/p&gt;

&lt;h2 id=&quot;les-versions&quot;&gt;Les versions&lt;/h2&gt;

&lt;p&gt;Généralement, un composant Open Source est utilisé dans sa dernière version, mais ce n’est pas toujours le cas. Il est parfois nécessaire d’opter pour une version antérieure.&lt;/p&gt;

&lt;p&gt;Du fait du nombre limité de contributeurs, il est rare que plusieurs versions d’un composant soient maintenues. Il faut s’en assurer quand on fait son choix et comprendre que l’impact d’une montée de version peut être important.&lt;/p&gt;

&lt;p&gt;La plupart des projets utilisent la notation “Semantic Versioning”, avec des versions utilisant la notation X.Y.Z :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;X représente les versions majeures, qui ne sont pas compatibles entre elles. L’introduction de modifications dans l’API est souvent la raison de ce changement de version.&lt;/li&gt;
  &lt;li&gt;Y représente les versions mineures, qui restent compatibles. L’introduction de nouvelles fonctions ne cause pas de modification de l’API, la nouvelle version reste utilisable sans changement du code qui s’appuie sur le composant.&lt;/li&gt;
  &lt;li&gt;Z représente les correctifs apportés au composant, sans changement de l’API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce type de notation n’est pas universel. Une autre logique relativement récente consiste à livrer de nouvelles versions incrémentales fréquemment. Les utilisateurs doivent alors prendre en charge les ruptures techniques à chaque changement de version. On pourrait par exemple citer les navigateurs Chrome ou Firefox qui ont un cycle de release particulièrement court (environ une par semaine). Dans tous les cas, une veille technologique est indispensable. Des outils de suivi existent, tel &lt;a href=&quot;https://docs.github.com/en/code-security/tutorials/secure-your-dependencies/dependabot-quickstart-guide&quot; target=&quot;_blank&quot;&gt;Dependabot&lt;/a&gt; qui permet de savoir au jour le jour quel composant a changé de version.&lt;/p&gt;

&lt;p&gt;Un autre aspect important concerne l’environnement dans lequel s’exécute le projet. Il est parfois nécessaire de maintenir un projet utilisant de vieilles versions d’un langage (par exemple Java 8) ou d’une version d’OS. En pratique, il suffit souvent de vérifier le bon fonctionnement dans les différentes versions d’un environnement. L’impact est clair : cela interdit souvent l’utilisation des dernières fonctionnalités. Néanmoins il faut être conscient que l’abandon d’une version impacte une quantité non négligeable d’utilisateurs.&lt;/p&gt;

&lt;p&gt;Le problème est que la fréquence des releases tend à s’accroître, augmentant ainsi la charge de travail. Il n’est pas à exclure que cela devienne une difficulté de plus en plus importante, dans la mesure où un projet s’appuie sur des librairies, utilisées dans un framework logiciel qui s’appuie à son tour sur un container applicatif, lui-même exécuté dans une plateforme logicielle, dans une machine virtuelle ! Par exemple, Log4J utilisé dans une application Spring, tournant sur Tomcat, dans Docker, sur VMWare…&lt;/p&gt;

&lt;p&gt;Pour illustrer ce propos, cette image représente les versions de l’API Apache LDAP téléchargées au mois de décembre 2025 : plus de 39 versions différentes, certaines datant de 12 ans (!!!) sont toujours utilisées…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/versions/ldap-api-versions.png&quot; alt=&quot;Téléchargements Apache LDAP API&quot; title=&quot;Téléchargements Apache LDAP API&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;les-évolutions&quot;&gt;Les évolutions&lt;/h2&gt;

&lt;p&gt;On devra donc prendre en compte les évolutions de l’environnement d’exécution qui sont liées à plusieurs facteurs :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Les versions de l’OS,&lt;/li&gt;
  &lt;li&gt;Les versions de containers,&lt;/li&gt;
  &lt;li&gt;Les évolutions du ou des langages utilisés,&lt;/li&gt;
  &lt;li&gt;Les évolutions des librairies utilisées.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À cela s’ajoute les potentiels conflits de versions : il n’est pas rare que plusieurs composants intègrent eux-mêmes des librairies dont les versions sont incompatibles. C’est ce qu’on appelle classiquement le “dependency hell”.&lt;/p&gt;

&lt;p&gt;En Java, cela peut se résoudre par l’utilisation d’une plateforme de service comme OSGi, qui permet d’isoler les composants entre eux. Il existe d’autres solutions, par exemple en JS où un composant va charger tout le code dont il dépend pour former un bloc de code autonome, au prix d’une croissance du code…&lt;/p&gt;

&lt;p&gt;Dans tous les cas, il convient d’avoir en tête que cette gestion incombe au projet et que cela peut rapidement devenir complexe.&lt;/p&gt;

&lt;h2 id=&quot;les-dépendances-transitives&quot;&gt;Les dépendances transitives&lt;/h2&gt;

&lt;p&gt;Pour aller plus loin, il est important de tenir compte des dépendances transitives, c’est à dire des dépendances utilisées par les composants choisis. C’est évidement récursif et il n’est pas rare d’avoir plusieurs niveaux de profondeur (ici, 9) :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[INFO] org.apache.directory.server:apacheds-installers:pom:2.0.0.AM28-SNAPSHOT
[INFO] +- org.apache.directory.server:apacheds-service:jar:2.0.0.AM28-SNAPSHOT:compile
…
[INFO] |  +- org.apache.directory.server:apacheds-service-builder:jar:2.0.0.AM28-SNAPSHOT:compile
…
[INFO] |  |  +- org.apache.directory.server:apacheds-http-integration:jar:2.0.0.AM28-SNAPSHOT:compile
[INFO] |  |  |  +- org.apache.directory.server:apacheds-http-directory-bridge:jar:2.0.0.AM28-SNAPSHOT:compile
[INFO] |  |  |  \- org.eclipse.jetty:jetty-webapp:jar:9.4.56.v20240826:compile
[INFO] |  |  |     +- org.eclipse.jetty:jetty-xml:jar:9.4.56.v20240826:compile
[INFO] |  |  |     |  \- org.eclipse.jetty:jetty-util:jar:9.4.56.v20240826:compile
[INFO] |  |  |     \- org.eclipse.jetty:jetty-servlet:jar:9.4.56.v20240826:compile
[INFO] |  |  |        +- org.eclipse.jetty:jetty-security:jar:9.4.56.v20240826:compile
[INFO] |  |  |        |  \- org.eclipse.jetty:jetty-server:jar:9.4.56.v20240826:compile
[INFO] |  |  |        |     +- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] |  |  |        |     +- org.eclipse.jetty:jetty-http:jar:9.4.56.v20240826:compile
[INFO] |  |  |        |     \- org.eclipse.jetty:jetty-io:jar:9.4.56.v20240826:compile
…
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Il faudra vérifier toutes les dépendances transitives, leur licence, leur version, leur signature. Ne pas négliger non plus qu’un repository peut également avoir été attaqué ou certaines dépendances avoir été modifiées…&lt;sup&gt;&lt;a href=&quot;#ref-4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&quot;les-sboms-une-solution&quot;&gt;Les SBOMs, une solution ?&lt;/h2&gt;

&lt;p&gt;Le SBOM (Software Bill Of Material, ou Nomenclature Logicielle) est la liste officielle des dépendances. Il permet de contrôler les licences, de lister les dépendances transitives, de donner la version de chaque composant, de vérifier les signatures et éventuellement d’identifier les CVE associées aux versions utilisées. Il peut (et devrait !) être généré automatiquement. Il existe des outils qui génèrent le SBOM en différents formats, par exemple :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pour CycloneDX&lt;sup&gt;&lt;a href=&quot;#ref-5&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt;, qui fonctionne pour C/C++, Node.js, Python, Go, Ruby, Java, .NET, PHP, Javascript.&lt;/li&gt;
  &lt;li&gt;Pour SPDX&lt;sup&gt;&lt;a href=&quot;#ref-6&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt;, qui fonctionne pour Java, Python et Go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ils génèrent une liste des dépendances, leur version, leur licence…&lt;/p&gt;

&lt;p&gt;L’importance de cette nomenclature n’est pas à négliger. Un “Executive order”&lt;sup&gt;&lt;a href=&quot;#ref-7&quot;&gt;[7]&lt;/a&gt;&lt;/sup&gt; a stipulé qu’un logiciel ne peut être utilisé par une entité publique aux USA si un SBOM n’est pas fourni. Par ailleurs, en Europe, le Cyber Resilient Act (CRA) en a fait un prérequis et le SBOM doit être livré en même temps que la documentation.&lt;/p&gt;

&lt;p&gt;Il s’agit donc d’un élément de confiance à fournir, qui ne règle certainement pas tout, mais permet de s’assurer que l’utilisateur dispose de la liste des composants embarqués, ce qui simplifie le travail des utilisateurs.&lt;/p&gt;

&lt;h2 id=&quot;les-licences&quot;&gt;Les licences&lt;/h2&gt;

&lt;p&gt;Dans le cadre du développement d’un produit, il faut définir la licence d’utilisation. Il n’est pas toujours possible de choisir celle que l’on souhaite adopter pour son produit. Dans certains cas, l’utilisation de composants Open Source impose le choix de la licence à utiliser.&lt;/p&gt;

&lt;p&gt;Comme indiqué plus haut, la catégorie de licence à laquelle appartiennent les composants utilisés peut imposer le choix. C’est le cas de la licence GPL, qui est dite “contaminante”.
Si vous choisissez une licence permissive, vous devrez en faire mention dans votre code et cette mention devra être accessible aux utilisateurs. Prenez votre iPhone, par exemple, allez sur Réglage -&amp;gt; Général -&amp;gt; Mentions légales et certifications -&amp;gt; Mentions légales, vous y trouverez la liste de toutes les licences de chaque composant utilisé. Et il y en a beaucoup ;-)&lt;/p&gt;

&lt;p&gt;Quels sont les risques à ne pas respecter les licences, ou à en choisir une qui ne soit pas adaptée ? En réalité, tout dépend de la provenance du composant utilisé. Si celui-ci est maintenu par une société disposant d’un service juridique solide, cela peut s’avérer coûteux.
En pratique, les deux risques principaux sont surtout l’obligation de publier l’intégralité de ses sources, si on a choisi un composant GPL par exemple, et l’obligation de basculer sur un autre composant dans un délai assez court. Dans tous les cas, ce n’est ni agréable, ni simple. Autant faire le bon choix dès le départ.&lt;/p&gt;

&lt;h2 id=&quot;le-support&quot;&gt;Le support&lt;/h2&gt;

&lt;p&gt;Partant du principe que le choix du composant a été effectué en tenant compte des différents points exposés précédemment, la suite logique est de se préoccuper de la vie de ce composant. Qui dit logiciel dit bugs, évolutions, améliorations… et l’obligation d’en tenir compte. On cherche ici à comprendre quels sont les besoins en support, qui en est responsable et les modalités de maintenance du composant choisi.&lt;/p&gt;

&lt;h3 id=&quot;quoi&quot;&gt;Quoi ?&lt;/h3&gt;

&lt;p&gt;La première étape est d’identifier les besoins. Cela passe par la qualification du composant sur les points suivants :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sa criticité dans la solution construite.&lt;/li&gt;
  &lt;li&gt;La façon dont on a détourné les anomalies ou les manques fonctionnels lors de l’intégration.&lt;/li&gt;
  &lt;li&gt;Le niveau de performance obtenu et attendu dans un futur proche ou moins proche.&lt;/li&gt;
  &lt;li&gt;La présence ou non de système de supervision, de gestion d’alertes, de logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il faut aussi tenir compte de la façon dont on l’utilise, selon qu’il est intégré au produit, ou hébergé (solution PaaS ou SaaS). Chacun de ses points doit être géré en amont et tout au long de la vie du produit.&lt;/p&gt;

&lt;h3 id=&quot;qui&quot;&gt;Qui ?&lt;/h3&gt;

&lt;p&gt;Une fois que l’on sait ce qu’on attend d’un composant et ce qu’implique son usage, se pose la question de la responsabilité de son intégration et de sa maintenance en condition opérationnelle.&lt;/p&gt;

&lt;p&gt;Il est possible de devenir un membre actif de la communauté, bénéficiant ainsi d’un levier important sur l’évolution du composant. C’est une des raisons pour lesquelles les éditeurs de logiciels recrutent des membres de communautés actives. Le cas de Red Hat est assez significatif, mais ce ne sont pas les seuls. Le bémol étant que la communauté est généralement diverse et que des agendas différents peuvent entrer en conflit.&lt;/p&gt;

&lt;p&gt;On peut aussi s’appuyer sur la communauté pour obtenir un support. Rien n’est garanti, mais cela fonctionne étonnamment bien. L’être humain est doué d’empathie et, à condition de demander poliment, on obtient généralement les réponses à ses questions. Reste à voir dans quel délai…&lt;/p&gt;

&lt;p&gt;Enfin, on peut aussi avoir recours à des experts externes (consultants, sociétés spécialisées dans le logiciel libre). La principale difficulté est la disponibilité de ces experts, leur coût et leurs compétences réelles. On peut également passer un contrat de service, charge au contractant de faire sienne cette recherche de compétences disponibles.&lt;/p&gt;

&lt;h3 id=&quot;comment&quot;&gt;Comment ?&lt;/h3&gt;

&lt;p&gt;Une fois identifiée la ou les ressources pouvant répondre au besoin de support à court, moyen ou long terme, reste à définir un cadre de travail.&lt;/p&gt;

&lt;p&gt;Dans le cas où le projet internalise ces ressources, il faudra prévoir des formations et/ou des embauches. Et sur une durée longue. L’acquisition de compétences internes est une solution solide.&lt;/p&gt;

&lt;p&gt;L’alternative immédiate est le recours à des ressources externes. Il faut s’assurer de la compétence des intervenants, de la surface couverte par le prestataire et du coût induit. Cette solution a l’avantage de ne pas nécessiter une présence permanente : on peut y faire appel ponctuellement en fonction des besoins.&lt;/p&gt;

&lt;p&gt;Il est également possible de ne pas internaliser le composant, mais de le ‘louer’, c’est la solution PaaS. L’avantage c’est qu’on s’adresse à une entité dont c’est le cœur d’activité, elle a donc un bon niveau de connaissance et de maîtrise du composant. C’est une solution absolument classique dès qu’on parle d’hébergement de sites web ou de bases de données. L’inconvénient est son coût, à quoi s’ajoute le risque de Vendor Lock-in : changer d’hébergeur n’est jamais simple. On l’a constaté lors du récent changement tarifaire chez VMware, la migration vers des solutions moins coûteuses (Proxmox par exemple) ne s’est pas faite sans peine…&lt;/p&gt;

&lt;p&gt;Enfin la dernière possibilité est d’estimer que le composant est fiable, qu’une fois qu’il est intégré il n’y a pas lieu de s’en préoccuper et que, dans le pire des cas, on trouvera toujours une solution. Cela peut sembler inconséquent, mais c’est une pratique assez courante quand il s’agit de composants non critiques ou relativement simples. Les outils de test (Junit ou autre), de log (Log4J), les petites briques simples (il y en a des milliers dans le monde JS) sont fréquemment gérés de cette façon. Les risques sont de deux ordres :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;L’abandon du composant, qui n’évolue plus, faute de développeur,&lt;/li&gt;
  &lt;li&gt;La faille de sécurité (CVE) qu’il faut corriger en urgence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur ce second point, on a tous en mémoire les mésaventures de Log4J. Vous pouvez regarder la présentation qui a été faite en 2022 à ce sujet&lt;sup&gt;&lt;a href=&quot;#ref-8&quot;&gt;[8]&lt;/a&gt;&lt;/sup&gt; et l’histoire de la correction du bug par celui qui était en charge du projet Log4j2&lt;sup&gt;&lt;a href=&quot;#ref-9&quot;&gt;[9]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h2 id=&quot;forker-ou-pas&quot;&gt;Forker ou pas ?&lt;/h2&gt;

&lt;p&gt;Il y a de multiples raisons pour vouloir forker un composant. Il y a également de multiples raisons de ne pas le faire ;-)&lt;/p&gt;

&lt;p&gt;Quand est-il intelligent de forker un composant ? Voici quelques raisons pertinentes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Quand la gouvernance du projet est inadaptée : exemple avec BDFL qui devient un Dictateur tout court, communauté fermée, projet focalisé sur un agenda commercial, projet en état de mort cérébrale, etc.&lt;/li&gt;
  &lt;li&gt;Quand le projet change de “propriétaire” et que le nouveau ne respecte plus l’esprit initial du projet, ou risque de ne plus le respecter. Ça a été le cas de Hudson (remplacé par &lt;a href=&quot;/tech/technologies/jenkins/&quot;&gt;Jenkins&lt;/a&gt; après son rachat par Oracle), MySQL (remplacé par &lt;a href=&quot;/tech/technologies/mariadb/&quot;&gt;MariaDB&lt;/a&gt; après son rachat par SUN), OpenOffice (devenu Libre Office après son abandon par Oracle). Les exemples sont nombreux.&lt;/li&gt;
  &lt;li&gt;Quand le projet n’est simplement plus maintenu. L’exemple le plus notable est le serveur Web NCSA qui a donné naissance à Apache httpd.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais il y a également autant de cas où forker est simplement une perte de temps ou une dilution de l’effort commun.&lt;/p&gt;

&lt;h2 id=&quot;lexemple-de-openssl&quot;&gt;L’exemple de OpenSSL&lt;/h2&gt;

&lt;p&gt;L’histoire de OpenSSL est intéressante. Le projet a commencé comme un fork d’un autre projet (SSLEay, projet démarré en 1995, mais pour lequel les efforts de développement avaient cessés en 1998).&lt;/p&gt;

&lt;p&gt;Jusqu’en 2014, OpenSSL a suivi une vie assez paisible, jusqu’à la survenue de la faille de sécurité HeartBleed, qui a été une des plus importantes de par son ubiquité. Cela a donné lieu à la création de forks pour diverses mauvaises raisons :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fork LibreSSL par des équipes de OpenBDS, suite à un audit du code. Plutôt que de décider de contribuer, ils ont préféré forker. En une semaine, 90 000 lignes de code ont été supprimées du projet initial… Le succès de ce fork reste à démontrer.&lt;/li&gt;
  &lt;li&gt;Fork BoringSSL par Google. Pas de release, pas de communauté. Mais au moins Google a la main dessus pour son propre usage.&lt;/li&gt;
  &lt;li&gt;Fork AWS-LC par Amazon. Au moins, il y a des releases…&lt;/li&gt;
  &lt;li&gt;Fork QuicTLS, par Akaimai et Microsoft : l’objectif est d’intégrer la couche transport QUIC au dessus de OpenSSL 3.3. Une volonté d’intégrer la fondation Apache a été exprimée.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au final, l’épisode malheureux a permis la création d’une fondation dédiée (OpenSSL Foundation), l’embauche de 14 salariés et la mise en place d’un budget de développement significatif.&lt;/p&gt;

&lt;h2 id=&quot;lts-ou-pas&quot;&gt;LTS ou pas ?&lt;/h2&gt;

&lt;p&gt;Autre problème : la maintenance des composants à longue durée de vie ? Le serveur Apache httpd n’existe que dans 2 versions majeures, la 1.X et la 2.X. Aujourd’hui, seule la version 2.4 est supportée. D’autres projets proposent des versions appelées LTS (Long Time Support) avec un engagement de maintenance sur une durée garantie. Cela signifie que les bugs découverts sur les dernières versions seront éventuellement back-portés vers les anciennes versions si nécessaire et qu’une correction des anomalies est assurée.&lt;/p&gt;

&lt;p&gt;On doit se poser la question d’opter pour de telles versions LTS, plutôt que pour des versions intermédiaires à rotation rapide. Le cas de Java est assez typique :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;des LTS toutes les 4 versions,&lt;/li&gt;
  &lt;li&gt;un support (gratuit) de la version sur 5 ans,&lt;/li&gt;
  &lt;li&gt;des versions intermédiaires qui ne sont supportées que jusqu’à la sortie de la nouvelle version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En ce sens, opter pour une LTS semble raisonnable, on utilisera les versions intermédiaires comme un moyen d’anticiper les migrations ultérieures à moindre coût.&lt;/p&gt;

&lt;p&gt;C’est également le cas d’Ubuntu qui a une politique de release de LTS et de versions intermédiaires.&lt;/p&gt;

&lt;h2 id=&quot;retrouver-de-linformation&quot;&gt;Retrouver de l’information&lt;/h2&gt;

&lt;p&gt;Il faut aussi mentionner qu’il ne suffit pas d’utiliser un composant Open Source, il faut également disposer de sources d’informations fiables. Et ce n’est pas simple.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Les versions évoluent vite et il faut constamment se tenir au courant des modifications apportées. En espérant que les projets fournissent un Change Log adapté et des outils de migration, ce qui n’est pas toujours le cas…&lt;/li&gt;
  &lt;li&gt;Les sociétés qui supportent des projets Open Source se font racheter et il devient difficile de trouver les informations originelles.&lt;/li&gt;
  &lt;li&gt;Internet est vivant et il arrive que les liens sur les documentations ou sources que l’on conservait précieusement soient cassés (parfois parce que le nom de domaine n’est plus renouvelé). Il n’y a plus qu’à espérer qu’InternetArchives a conservé une copie (généralement partielle) des pages.&lt;/li&gt;
  &lt;li&gt;Le contenu peut également disparaître. Toutes les entités gérant des projets Open Source ne proposent pas de récupérer les versions historiques.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tout cela sans compter les IA qui aujourd’hui rendent difficilement accessibles la documentation ou les échanges sur les anciennes versions, puisque entraînées sur les dernières versions, couplé au fait que les moteurs de recherche ont aujourd’hui tendance à pousser en avant la production de ces IA.&lt;/p&gt;

&lt;h2 id=&quot;open-source-is-one-person&quot;&gt;Open Source is One Person&lt;/h2&gt;

&lt;p&gt;Pour finir, il faut quand même pointer le fait qu’un composant Open Source n’est généralement pas développé ni maintenu par une structure pléthorique. Ceci est parfaitement résumé par le dessin suivant :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/dependency_2x.png&quot; alt=&quot;https://xkcd.com/2347/&quot; title=&quot;source : xkcd.com&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le projet ecosyste.ms&lt;sup&gt;&lt;a href=&quot;#ref-10&quot;&gt;[10]&lt;/a&gt;&lt;/sup&gt; recense un grand nombre de projets Open Source et ses conclusions sont sans appel : sur 11,6 millions de projets analysés, 7 millions sont gérés par une seule personne :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/1-maintainer.png&quot; alt=&quot;Nombre de mainteneurs par projet&quot; title=&quot;Nombre de mainteneurs par projet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et si on analyse les projets avec plus de 1 million de téléchargements par mois, près de la moitié n’ont qu’un seul mainteneur :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/1-maintainer-downloads.png&quot; alt=&quot;Nombre de mainteneurs par projet téléchargés plus de 1M de fois par mois&quot; title=&quot;Nombre de mainteneurs par projet téléchargés plus de 1M de fois par mois&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le résumé est donné sur la page “Open Source is one person”&lt;sup&gt;&lt;a href=&quot;#ref-11&quot;&gt;[11]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h3 id=&quot;exemple-apache-log4j2&quot;&gt;Exemple : Apache Log4j2&lt;/h3&gt;

&lt;p&gt;Prenons un premier exemple, le projet &lt;a href=&quot;https://logging.apache.org/log4j/2.12.x/&quot; target=&quot;_blank&quot;&gt;Apache Log4j2&lt;/a&gt;. Sur les deux dernières années :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Il y a eu 1 313 commits,&lt;/li&gt;
  &lt;li&gt;Dont 354 par des outils (Dependabot, ASF CI release Manager), soit 27% des commits,&lt;/li&gt;
  &lt;li&gt;Le développeur le plus actif a effectué 484 modifications, soit 50% du total&lt;/li&gt;
  &lt;li&gt;Le second développeur a effectué 291 modifications, soit 30% du total&lt;/li&gt;
  &lt;li&gt;Le troisième développeur a effectué 65 modifications, soit 7% du total.&lt;/li&gt;
  &lt;li&gt;Les trois premiers développeurs sont donc responsables de près de 88% des modifications&lt;/li&gt;
  &lt;li&gt;Les 34 développeurs ayant participés au projet ont collectivement produit 119 modifications, 3,5 chacun en moyenne…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/log4j2-commits.png&quot; alt=&quot;Apache Log4j2&quot; title=&quot;Apache Log4j2&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;exemple-apache-tomcat&quot;&gt;Exemple : Apache Tomcat&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://tomcat.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Tomcat&lt;/a&gt; est certainement un des composants Open Source de la fondation Apache le plus utilisé. On pourrait se dire qu’il est maintenu par une grosse équipe :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Il y a environ 100 contributeurs sur les 20 dernières années,&lt;/li&gt;
  &lt;li&gt;Cela représente environ 25 000 commits,&lt;/li&gt;
  &lt;li&gt;Le premier développeur, Mark Thomas, représente plus de 75% de ces modifications,&lt;/li&gt;
  &lt;li&gt;Le second développeur, Rémy Maucherat, a contribué à hauteur de 10% des modifications,&lt;/li&gt;
  &lt;li&gt;Le troisième développeur, Filip Hanik, a contribué à 4% des modifications,&lt;/li&gt;
  &lt;li&gt;Ces trois développeurs sont donc responsables de 91% des contributions de ces 20 dernières années !&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;exemple-libxml2&quot;&gt;Exemple : LibXML2&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://gitlab.gnome.org/GNOME/libxml2/-/wikis/home&quot; target=&quot;_blank&quot;&gt;LibXML2&lt;/a&gt; est une (petite) librairie en C utilisée pour parser des documents XML. Elle est largement utilisée par des milliers de packages sous Linux. À la fin de l’année 2025, son unique mainteneur, Nick Wellnhofer, a décidé de se retirer du projet. Son dernier commit est le suivant :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/oss-et-developpement/libxml2-unmaintained-message.png&quot; alt=&quot;Dernier commit de LibXML2&quot; title=&quot;Dernier commit de LibXML2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On peut légitimement s’inquiéter de cette situation&lt;sup&gt;&lt;a href=&quot;#ref-12&quot;&gt;[12]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/blog/2026-03-12-oss-et-developpement_partie3/&quot;&gt;Open Source et développement - Partie 3 : Questions ouvertes : bugs, IA, souveraineté et autres&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;bibliographie&quot;&gt;Bibliographie&lt;/h1&gt;

&lt;p&gt;&lt;a id=&quot;ref-4&quot; href=&quot;https://cybernews.com/security/hundreds-npm-packages-compromised-in-ongoing-attack/&quot; target=&quot;blank&quot;&gt;[4] Hundred of NPM packages compromised&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-5&quot; href=&quot;https://cyclonedx.org/&quot; target=&quot;blank&quot;&gt;[5] CycloneDX&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-6&quot; href=&quot;https://spdx.dev/&quot; target=&quot;blank&quot;&gt;[6] SPDX&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-7&quot; href=&quot;https://www.govinfo.gov/content/pkg/DCPD-202100401/pdf/DCPD-202100401.pdf&quot; target=&quot;blank&quot;&gt;[7] Executive Order 14028&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-8&quot; href=&quot;https://devconf.net/talk/log4shell-c-est-la-faute-a-la-fondation-apache-e-lecharny-j-b-onofre-et-h-boutemy&quot; target=&quot;blank&quot;&gt;[8] Log4shell, c’est la faute à la fondation Apache ?&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-9&quot; href=&quot;https://www.youtube.com/watch?v=t74ClffSUW0&quot; target=&quot;blank&quot;&gt;[9] L’histoire inédite de Log4j et Log4Shell&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-10&quot; href=&quot;https://github.com/tomcz/openldap_exporter&quot; target=&quot;blank&quot;&gt;[10] Open source intelligence for your project&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-11&quot; href=&quot;hhttps://opensourcesecurity.io/2025/08-oss-one-person/&quot; target=&quot;blank&quot;&gt;[11] Open Source is one person&lt;/a&gt;
&lt;br /&gt;
&lt;a id=&quot;ref-12&quot; href=&quot;https://linuxiac.com/libxml2-becomes-officially-unmaintained/&quot; target=&quot;blank&quot;&gt;[12] Libxml2 Becomes Officially Unmaintained After Maintainer Steps Down&lt;/a&gt;&lt;/p&gt;</content><author><name>Emmanuel LÉCHARNY</name></author><category term="OpenSource" /><category term="Développement" /><summary type="html">Open Source et développement - Partie 2/3 : La vie du composant Open Source après son intégration</summary></entry><entry><title type="html">OVN IPsec avec Kayobe et FreeIPA</title><link href="https://www.worteks.com/blog/ovn-ipsec-miniwaas/" rel="alternate" type="text/html" title="OVN IPsec avec Kayobe et FreeIPA" /><published>2026-01-26T00:00:00+01:00</published><updated>2026-01-26T00:00:00+01:00</updated><id>https://www.worteks.com/blog/vpn-ovn-openstack</id><content type="html" xml:base="https://www.worteks.com/blog/ovn-ipsec-miniwaas/">&lt;h1 id=&quot;openstack-20251--le-guide-ultime-pour-ovn-ipsec-avec-kayobe-et-freeipa&quot;&gt;OpenStack 2025.1 : Le Guide Ultime pour OVN IPsec avec Kayobe et FreeIPA&lt;/h1&gt;

&lt;p&gt;La sécurité “Zero Trust” n’est plus une option pour les clouds privés modernes. Si vous déployez OpenStack après 2025.1, vous utilisez sûrement &lt;a href=&quot;https://www.ovn.org/en/&quot; target=&quot;_blank&quot;&gt;OVN&lt;/a&gt; (Open Virtual Network) pour le SDN (Software Defined Network). Mais par défaut, le trafic entre vos hyperviseurs circule en clair.&lt;/p&gt;

&lt;p&gt;Dans ce guide, nous allons implémenter le chiffrement IPsec pour les tunnels &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8926&quot; target=&quot;_blank&quot;&gt;Geneve&lt;/a&gt; (Generic Network Virtualization Encapsulation).
Nous allons construire une chaîne automatisée robuste :&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;/tech/technologies/freeipa/&quot;&gt;FreeIPA&lt;/a&gt; fournit et renouvelle les certificats automatiquement.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.freeipa.org/page/Certmonger&quot; target=&quot;_blank&quot;&gt;Certmonger&lt;/a&gt; surveille ces certificats sur l’OS de l’hôte.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.openstack.org/kayobe/latest/&quot; target=&quot;_blank&quot;&gt;Kayobe&lt;/a&gt; orchestre la configuration en injectant les clés dans les conteneurs &lt;a href=&quot;https://docs.openstack.org/kolla/latest/&quot; target=&quot;_blank&quot;&gt;Kolla&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;larchitecture--le-défi-du-conteneur&quot;&gt;L’Architecture : Le défi du Conteneur&lt;/h2&gt;

&lt;p&gt;C’est là que réside la complexité. Dans un déploiement Kolla/Kayobe :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;La PKI (Certificats) doit être gérée par l’OS hôte (pour que Certmonger fonctionne).&lt;/li&gt;
  &lt;li&gt;Le service OVS tourne dans un conteneur isolé (openvswitch_vswitchd).&lt;/li&gt;
  &lt;li&gt;Le chiffrement IPsec est effectué par le Kernel Linux de l’hôte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous devons donc générer les clés sur l’hôte, les monter dans le conteneur, et piloter la configuration depuis l’extérieur.&lt;/p&gt;

&lt;h2 id=&quot;1-prérequis-réseau--la-mtu&quot;&gt;1. Prérequis Réseau : la MTU&lt;/h2&gt;

&lt;p&gt;C’est non-négociable. L’encapsulation (Geneve) + le chiffrement (ESP) ajoutent environ 100 à 130 octets d’overhead. Pour que vos VMs aient une vie normale (MTU 1500), le réseau physique (“Underlay”) doit être en Jumbo Frames.&lt;/p&gt;

&lt;p&gt;Dans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kayobe/inventory/group_vars/all/network&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;network_interfaces:
  - device: eth1
    mtu: 9000
    description: &quot;Tunnel Interface&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kayobe/kolla/globals.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;network_mtu: 9000
kolla_enable_neutron_mtu: &quot;yes&quot;
neutron_tenant_network_mtu: 1500
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;2-préparation-kolla--monter-les-volumes&quot;&gt;2. Préparation Kolla : Monter les Volumes&lt;/h2&gt;

&lt;p&gt;Puisque OVS est enfermé dans un conteneur, il ne voit pas vos certificats par défaut. Il faut “monter” le dossier des clés.&lt;/p&gt;

&lt;p&gt;Créez le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kayobe/kolla/config/openvswitch.yml&lt;/code&gt; :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# On monte le dossier des clés de l&apos;hôte vers le conteneur en lecture seule
openvswitch_vswitchd_extra_volumes:
  - &quot;/etc/openvswitch/keys:/etc/openvswitch/keys:ro&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;3-le-hook-ansible--automatisation-pki--firewall&quot;&gt;3. Le Hook Ansible : Automatisation PKI &amp;amp; Firewall&lt;/h2&gt;

&lt;p&gt;Ce playbook va transformer chaque nœud en client FreeIPA, ouvrir le pare-feu et préparer les certificats.&lt;/p&gt;

&lt;p&gt;Fichier : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;etc/kayobe/ansible/hooks/setup-host-pki.yml&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
- name: Configure Host PKI and Firewall for OVN IPsec
  hosts: overcloud
  become: true
  vars:
    ovs_keys_dir: /etc/openvswitch/keys
    ipa_domain: &quot;internal.corp.net&quot;
    # Astuce: utilisez kayobe-vault pour ce mot de passe
    ipa_join_password: &quot;&quot;

  tasks:
    # --- Étape A : Firewall (Crucial !) ---
    - name: Allow IPsec protocols (IKE, NAT-T, ESP)
      firewalld:
        service: ipsec
        permanent: yes
        state: enabled
        immediate: yes
      when: ansible_os_family == &apos;RedHat&apos;

    # --- Étape B : Installation FreeIPA ---
    - name: Install IPA client and tools
      package:
        name:
          - ipa-client
          - firewalld
        state: present

    - name: Register node to FreeIPA
      command: &amp;gt;
        ipa-client-install --unattended
        --domain=
        --realm=
        --principal=admin
        --password=
        --mkhomedir
      args:
        creates: /etc/ipa/default.conf

    # --- Étape C : Certificats via Certmonger ---
    - name: Ensure keys directory exists
      file:
        path: &quot;&quot;
        state: directory
        owner: root # Sur l&apos;hôte, root gère ça. Dans le conteneur, ce sera monté.
        mode: &apos;0755&apos;

    - name: Request Certificates using Certmonger
      # Cette commande génère les clés et configure le renouvellement auto
      # Le -C redémarre le conteneur si le certif change
      command: &amp;gt;
        ipa-getcert request
        -f /system.pem
        -k /system-privkey.pem
        -N CN=
        -D 
        -K host/@
        -C &quot;docker restart openvswitch_vswitchd&quot;
      args:
        creates: &quot;/system.pem&quot;

    - name: Copy IPA CA cert to OVS keys dir
      copy:
        src: /etc/ipa/ca.crt
        dest: &quot;/ca-cert.pem&quot;
        remote_src: yes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;4-le-hook-de-configuration-ovs-post-deploy&quot;&gt;4. Le Hook de Configuration OVS (Post-Deploy)&lt;/h2&gt;

&lt;p&gt;Une fois que Kolla a déployé les conteneurs, nous devons dire à OVS d’utiliser ces clés. Ce hook intervient après le démarrage des services.&lt;/p&gt;

&lt;p&gt;Fichier : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;etc/kayobe/ansible/hooks/configure-ovs-container.yml&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
- name: Configure OVS Container for IPsec
  hosts: overcloud
  become: true
  tasks:
    - name: Wait for Open vSwitch container
      command: docker inspect -f &apos;&apos; openvswitch_vswitchd
      register: ovs_status
      until: ovs_status.stdout == &quot;true&quot;
      retries: 20
      delay: 5
      ignore_errors: true

    - name: Set OVS SSL config inside container
      # On utilise docker exec car ovs-vsctl n&apos;est pas sur l&apos;hôte
      command: &amp;gt;
        docker exec openvswitch_vswitchd ovs-vsctl set Open_vSwitch .
        other_config:certificate=/etc/openvswitch/keys/system.pem
        other_config:private_key=/etc/openvswitch/keys/system-privkey.pem
        other_config:ca_cert=/etc/openvswitch/keys/ca-cert.pem
      when: ovs_status.stdout == &quot;true&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;(Note : Si vous utilisez podman, remplacez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker&lt;/code&gt; par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;podman&lt;/code&gt;)&lt;/p&gt;

&lt;h2 id=&quot;5-intégration-dans-kayobe&quot;&gt;5. Intégration dans Kayobe&lt;/h2&gt;

&lt;p&gt;Modifiez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;etc/kayobe/hooks.yml&lt;/code&gt; pour insérer ces étapes au bon moment du cycle de vie.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 1. Préparer l&apos;hôte et les certs AVANT que Kolla ne touche à tout
pre_overcloud_host_configure:
  - ansible/hooks/setup-host-pki.yml

# 2. Configurer OVS une fois que les conteneurs sont lancés
post_overcloud_service_deploy:
  - ansible/hooks/configure-ovs-container.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;6-linterrupteur-général&quot;&gt;6. L’Interrupteur Général&lt;/h2&gt;

&lt;p&gt;Tout est prêt, les certificats sont là, OVS les connaît. Il ne reste plus qu’à activer le chiffrement globalement dans la base OVN Northbound.&lt;/p&gt;

&lt;p&gt;Fichier : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;etc/kayobe/ansible/hooks/enable-ovn-global.yml&lt;/code&gt; (à lancer manuellement ou en post-deploy final)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- name: Enable IPsec Globally in OVN NB
  hosts: controllers[0]
  become: true
  tasks:
    - name: Enable IPsec
      command: docker exec ovn_nb_db ovn-nbctl set NB_Global . ipsec=true
      ignore_errors: yes # Ignore si déjà activé
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;le-test-de-vérité&quot;&gt;Le Test de Vérité&lt;/h2&gt;

&lt;p&gt;Une fois le déploiement terminé :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Connectez-vous sur un Compute Node.&lt;/li&gt;
  &lt;li&gt;Interrogez le démon OVS (dans le conteneur) :
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker exec openvswitch_vswitchd ovs-appctl -t ovs-monitor-ipsec tunnels/show
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Vérifiez le kernel de l’hôte :
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ip xfrm state
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si vous voyez des clés &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rfc4106(gcm(aes))&lt;/code&gt;, félicitations. Votre cloud &lt;a href=&quot;/tech/technologies/openstack/&quot;&gt;OpenStack&lt;/a&gt; est chiffré, “Zero Trust”, et vos certificats se renouvelleront tout seuls sans casser la prod.&lt;/p&gt;</content><author><name>Thibaut DEMARET</name></author><summary type="html">OpenStack 2025.1 : Le Guide Ultime pour OVN IPsec avec Kayobe et FreeIPA</summary></entry><entry><title type="html">Autonomie stratégique numérique - 2/2</title><link href="https://www.worteks.com/blog/souverainete-numerique-2/" rel="alternate" type="text/html" title="Autonomie stratégique numérique - 2/2" /><published>2026-01-23T00:00:00+01:00</published><updated>2026-01-23T00:00:00+01:00</updated><id>https://www.worteks.com/blog/souverainete-2</id><content type="html" xml:base="https://www.worteks.com/blog/souverainete-numerique-2/">&lt;p&gt;&lt;strong&gt;Vos résolutions 2026 pour l’autonomie stratégique numérique : comment Worteks peut vous accompagner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’analyse de l’état actuel des systèmes d’exploitation Open Source en entreprise révèle une maturité technique indéniable et des avantages structurels majeurs. La transparence, la sécurité renforcée, la flexibilité, la maîtrise des coûts et la souveraineté numérique plaident en faveur d’une adoption réfléchie. Dans &lt;a href=&quot;/blog/souverainete-numerique-1/&quot;&gt;un précédent article&lt;/a&gt;, nous vous expliquions que 2026 est l’année idéale pour franchir le pas en lien avec :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;La situation géopolitique mondiale&lt;/li&gt;
  &lt;li&gt;Le contexte réglementaire qui favorise l’Open Source.&lt;/li&gt;
  &lt;li&gt;La maturité de l’écosystème technique.&lt;/li&gt;
  &lt;li&gt;Les retours d’expérience qui sont nombreux et positifs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De son côté, Worteks dispose de toute l’expertise pour vous accompagner dans votre projet. L’approche la plus intelligente consiste à évaluer stratégiquement vos besoins, à vous faire accompagner par nos experts et à privilégier une intégration progressive de l’Open Source, en tirant parti de ses atouts pour construire des infrastructures résilientes, sécurisées et maîtrisées.&lt;/p&gt;

&lt;p&gt;En ce début 2026, la question n’est donc plus “Pourquoi migrer vers Linux et l’Open Source ?” mais bien “Quelles parties de mon infrastructure puis-je faire basculer en premier et comment Worteks peut-il m’accompagner dans cette transformation ?” Audit de votre infrastructure et feuille de route personnalisée, contactez Worteks dès aujourd’hui et libérez le potentiel de vos infrastructures.&lt;/p&gt;

&lt;h2 id=&quot;lécosystème-complet--tout-ce-dont-vous-avez-besoin&quot;&gt;L’Écosystème complet : tout ce dont vous avez besoin&lt;/h2&gt;
&lt;p&gt;L’écosystème Open Source d’entreprise est désormais mature, complet et prêt pour tous vos besoins, comme nous l’avons expliqué dans notre article &lt;a href=&quot;/blog/souverainete-numerique-1/&quot;&gt;« Vos résolutions 2026 pour l’autonomie stratégique numérique : vers des infrastructures toujours plus ouvertes ! »&lt;/a&gt;. Petit rappel des possibilités :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Infrastructure de virtualisation : &lt;a href=&quot;/tech/technologies/proxmox/&quot;&gt;Proxmox VE&lt;/a&gt; , &lt;a href=&quot;/tech/technologies/ovirt/&quot;&gt;oVirt&lt;/a&gt;, &lt;a href=&quot;https://xcp-ng.org/&quot; target=&quot;_blank&quot;&gt;XCP-ng&lt;/a&gt; pour la virtualisation traditionnelle. &lt;a href=&quot;/tech/technologies/openstack/&quot;&gt;OpenStack&lt;/a&gt; pour le cloud privé. &lt;a href=&quot;/tech/technologies/kubevirt/&quot;&gt;KuberVirt&lt;/a&gt; pour l’hybridation VM/conteneurs.&lt;/li&gt;
  &lt;li&gt;Conteneurisation et orchestration : &lt;a href=&quot;/tech/technologies/docker/&quot;&gt;Docker&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/podman/&quot;&gt;Podman&lt;/a&gt; pour les conteneurs. &lt;a href=&quot;/tech/technologies/kubernetes/&quot;&gt;Kubernetes&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/openshift/&quot;&gt;OpenShift&lt;/a&gt; pour l’orchestration à grande échelle.&lt;/li&gt;
  &lt;li&gt;Stockage : &lt;a href=&quot;/tech/technologies/ceph/&quot;&gt;Ceph&lt;/a&gt; (stockage distribué objet/bloc/fichier), GlusterFS (stockage distribué), ZFS (système de fichiers avancé avec snapshots et déduplication).&lt;/li&gt;
  &lt;li&gt;Réseau et sécurité : pfSense/OPNsense (pare-feu/routeur), Snort/Suricata (IDS/IPS), OpenVPN/WireGuard (VPN), &lt;a href=&quot;/tech/technologies/wazuh/&quot;&gt;Wazuh&lt;/a&gt; (CVE/logs).&lt;/li&gt;
  &lt;li&gt;Monitoring et observabilité : &lt;a href=&quot;/tech/technologies/prometheus/&quot;&gt;Prometheus&lt;/a&gt;/&lt;a href=&quot;/tech/technologies/grafana/&quot;&gt;Grafana&lt;/a&gt; (métriques et dashboards), &lt;a href=&quot;/tech/technologies/elastic/&quot;&gt;ELK&lt;/a&gt; Stack ou Graylog (centralisation de logs), &lt;a href=&quot;/tech/technologies/zabbix/&quot;&gt;Zabbix&lt;/a&gt;/&lt;a href=&quot;/tech/technologies/nagios/&quot;&gt;Nagios&lt;/a&gt; (monitoring infrastructure).&lt;/li&gt;
  &lt;li&gt;Authentification et SSO : &lt;a href=&quot;/tech/technologies/openldap/&quot;&gt;OpenLDAP&lt;/a&gt; (annuaire), &lt;a href=&quot;/tech/technologies/freeipa/&quot;&gt;FreeIPA&lt;/a&gt; (gestion d’identité intégrée), &lt;a href=&quot;/tech/technologies/lemonldapng/&quot;&gt;LemonLDAP::NG&lt;/a&gt; (Web Access Manager et SSO), &lt;a href=&quot;/tech/technologies/keycloak/&quot;&gt;Keycloak&lt;/a&gt; (Identity Provider moderne).&lt;/li&gt;
  &lt;li&gt;Collaboration : &lt;a href=&quot;/tech/technologies/bluemind/&quot;&gt;BlueMind&lt;/a&gt; ou Carbonio (messagerie), &lt;a href=&quot;/tech/technologies/nextcloud/&quot;&gt;Nextcloud&lt;/a&gt; (partage et collaboration), Mattermost, &lt;a href=&quot;/tech/technologies/jitsi/&quot;&gt;Jitsi Meet&lt;/a&gt; (communication), GitLab (DevOps).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worteks maîtrise l’ensemble de cet écosystème et sait composer la solution optimale pour votre contexte quels que soient la taille de votre organisation, votre secteur d’activité, vos contraintes réglementaires, votre budget et vos compétences en interne.&lt;/p&gt;

&lt;h2 id=&quot;votre-feuille-de-route-2026&quot;&gt;Votre feuille de route 2026&lt;/h2&gt;
&lt;p&gt;Faire de 2026 l’année de votre indépendance technologique nécessite une approche méthodique et progressive. Voici une proposition de stratégie éprouvée chez nos clients que Worteks recommande.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/slidebean-iW9oP7Ljkbg-unsplash.jpg&quot; alt=&quot;Roadmap&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;approche-progressive&quot;&gt;Approche Progressive&lt;/h3&gt;
&lt;h4 id=&quot;infrastructure-backend&quot;&gt;Infrastructure backend&lt;/h4&gt;
&lt;p&gt;Commencez par l’invisible : migration des serveurs d’infrastructure (DNS, DHCP, proxy), serveurs de fichiers Samba, serveurs web, bases de données.&lt;/p&gt;

&lt;p&gt;Avantages : zéro impact utilisateur, gains économiques immédiats.&lt;/p&gt;

&lt;p&gt;Worteks vous accompagne avec : audit de l’existant, architecture cible, migration supervisée, formation des équipes techniques, transfert de compétences.&lt;/p&gt;

&lt;h4 id=&quot;services-utilisateurs&quot;&gt;Services Utilisateurs&lt;/h4&gt;
&lt;p&gt;Déploiement de messagerie Open Source (BlueMind, Carbonio), migration vers Nextcloud pour le partage, mise en place d’authentification centralisée avec OpenLDAP/FreeIPA et gestion des accès web avec LemonLDAP::NG pour le SSO.&lt;/p&gt;

&lt;p&gt;Worteks vous accompagne avec : architecture SSO complète, intégration de toutes vos applications, formation des équipes support, documentation personnalisée.&lt;/p&gt;

&lt;h4 id=&quot;postes-de-travail&quot;&gt;Postes de Travail&lt;/h4&gt;
&lt;p&gt;Lancement avec des groupes volontaires, profils techniques et utilisateurs bureautique. Distributions comme Ubuntu LTS ou Linux Mint, avec LibreOffice et OnlyOffice. Formation intensive et support rapproché.&lt;/p&gt;

&lt;p&gt;Worteks vous accompagne avec : configuration optimale des postes, image système personnalisée, scripts de déploiement, formation utilisateurs, hotline dédiée.&lt;/p&gt;

&lt;h4 id=&quot;généralisation&quot;&gt;Généralisation&lt;/h4&gt;
&lt;p&gt;Extension progressive par services, approche hybride assumée avec maintien de postes propriétaires pour applications vraiment critiques, utilisation de VDI (Kyber/Guacamole) pour accès transparent aux applications depuis les postes Linux.
Worteks vous accompagne avec : infrastructure VDI complète, optimisation des performances, monitoring et supervision, support continu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-44.jpg&quot; alt=&quot;server&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;gestion-du-changement-avec-lhumain-au-cœur&quot;&gt;Gestion du changement avec l’humain au cœur&lt;/h3&gt;
&lt;p&gt;L’aspect humain est crucial pour une migration réussie :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Communication transparente : expliquer les raisons stratégiques (souveraineté, sécurité, économies), valoriser les bénéfices utilisateurs (performances, stabilité, ergonomie moderne).&lt;/li&gt;
  &lt;li&gt;Formations et ateliers multi-niveaux :
    &lt;ul&gt;
      &lt;li&gt;Administrateurs système : formation approfondie sur Linux, scripting, sécurité.&lt;/li&gt;
      &lt;li&gt;Support technique : formation intermédiaire, résolution de problèmes courants.&lt;/li&gt;
      &lt;li&gt;Utilisateurs finaux : sessions pratiques courtes, focus sur les outils quotidiens.&lt;/li&gt;
      &lt;li&gt;Identification de champions internes : utilisateurs enthousiastes servant de relais.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Support renforcé : période de double support post-migration, documentation accessible (wiki interne, guides visuels, tutoriels vidéo), recueil actif des retours utilisateurs et améliorations continues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-55.jpg&quot; alt=&quot;formation&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;L’expertise pédagogique de Worteks se traduit par des &lt;a href=&quot;/services/formation/&quot;&gt;formations adaptées à chaque public&lt;/a&gt;, du débutant à l’expert, avec supports de cours complets, labs pratiques et certification des compétences acquises.&lt;/p&gt;

&lt;h2 id=&quot;worteks-votre-partenaire-pour-2026&quot;&gt;Worteks, votre partenaire pour 2026&lt;/h2&gt;
&lt;p&gt;Worteks accompagne depuis des années les entreprises dans leur transition vers l’Open Source. Notre approche se distingue par :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Une expertise technique reconnue
    &lt;ul&gt;
      &lt;li&gt;Contribution active aux projets Open Source majeurs (OpenLDAP, LemonLDAP::NG, Samba) ;&lt;/li&gt;
      &lt;li&gt;Certification et reconnaissance par les éditeurs et communautés ;&lt;/li&gt;
      &lt;li&gt;Veille technologique permanente et maîtrise des dernières innovations ;&lt;/li&gt;
      &lt;li&gt;Retours d’expérience concrets de centaines de projets réussis.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Une méthodologie éprouvée
    &lt;ul&gt;
      &lt;li&gt;Audit initial complet : infrastructure, applications, compétences, contraintes ;&lt;/li&gt;
      &lt;li&gt;Architecture sur mesure : adaptée à vos besoins réels, pas de solution générique ;&lt;/li&gt;
      &lt;li&gt;Migration progressive : sans rupture de service, avec rollback possible ;&lt;/li&gt;
      &lt;li&gt;Formation intensive : transfert de compétences réel vers vos équipes ;&lt;/li&gt;
      &lt;li&gt;Support continu : accompagnement long terme, hotline, maintenance.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au-delà de la migration initiale, Worteks reste votre partenaire stratégique pour :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Support technique réactif&lt;/li&gt;
  &lt;li&gt;Évolutions et optimisations continues&lt;/li&gt;
  &lt;li&gt;Formations complémentaires&lt;/li&gt;
  &lt;li&gt;Audits de sécurité réguliers&lt;/li&gt;
  &lt;li&gt;Veille sur les nouvelles technologies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-37.jpg&quot; alt=&quot;partenaire&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notre ancrage français et européen nous positionne idéalement pour accompagner les entreprises dans leurs enjeux de souveraineté numérique. Nous privilégions les solutions développées en Europe (BlueMind, LemonLDAP::NG, Nextcloud) quand elles existent, garantissant conformité réglementaire et indépendance.&lt;/p&gt;</content><author><name>Jean-Christophe ELINEAU</name></author><category term="Souveraineté" /><category term="Autonomie" /><category term="Infrastructure" /><category term="Géopolitique" /><summary type="html">Comment Worteks peut vous accompagner</summary></entry><entry><title type="html">Autonomie stratégique numérique - 1/2</title><link href="https://www.worteks.com/blog/souverainete-numerique-1/" rel="alternate" type="text/html" title="Autonomie stratégique numérique - 1/2" /><published>2026-01-22T00:00:00+01:00</published><updated>2026-01-22T00:00:00+01:00</updated><id>https://www.worteks.com/blog/souverainete-1</id><content type="html" xml:base="https://www.worteks.com/blog/souverainete-numerique-1/">&lt;p&gt;&lt;strong&gt;Vos résolutions 2026 pour l’autonomie stratégique numérique : vers des infrastructures toujours plus ouvertes !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le paysage technologique des entreprises connaît une transformation profonde. Il s’éloigne des systèmes propriétaires et envisage de manière pérenne un tournant vers des solutions ouvertes et maîtrisées. Ce mouvement, autrefois perçu comme une niche réservée aux pionniers, est désormais une réalité pour des organisations de tous types. Il est impulsé par une conjonction de facteurs stratégiques, économiques, réglementaires, sécuritaires et technologiques qui font de l’adoption de l’Open Source non plus seulement une alternative, mais avant tout une démarche qui offre des avantages structurels souvent supérieurs aux écosystèmes propriétaires traditionnels.&lt;/p&gt;

&lt;p&gt;Et si 2026 était l’année où votre entreprise prenait enfin le contrôle de son infrastructure technologique ?&lt;/p&gt;

&lt;h2 id=&quot;souveraineté-numérique-et-contexte-géopolitique&quot;&gt;Souveraineté numérique et contexte géopolitique&lt;/h2&gt;

&lt;p&gt;Le gouvernement Trump 2 affiche une politique agressive visant à déréguler au plus vite le numérique, au niveau européen notamment. En témoignent les sanctions prises récemment à l’encontre des juges de la CPI ou l’interdiction de visa pour Thierry Breton, ancien commissaire européen au marché intérieur. Les géants étasuniens du numérique (Google, Amazon, Facebook, Apple, Microsoft…) obéissent aux autorités américaines et appliquent ces demandes de sanctions.&lt;/p&gt;

&lt;p&gt;Ces sanctions sont la conséquence directe de la politique de la Commission Européenne qui vise à réduire la dépendance vis-à-vis des “gatekeepers” technologiques et à promouvoir la transparence. L’Union Européenne s’est dotée, pour cela, de directives et règlements comme le RGPD (Règlement Général sur la Protection des Données), le Digital Services Act (DSA), le Digital Markets Act (DMA), le Cyber Resilience Act (CRA), la directive NIS2, le Data Act et l’IA Act.&lt;/p&gt;

&lt;p&gt;Ces réglementations incitent fortement à privilégier l’Open Source, dont le code est auditable par nature. En effet, certains systèmes propriétaires intègrent souvent des mécanismes de télémétrie qui envoient des données vers des serveurs centralisés hors de l’Union Européenne, soulevant des défis juridiques complexes.
L’intégration de l’Open Source s’inscrit donc dans un cadre réglementaire et stratégique en constante évolution, où la recherche d’une meilleure sécurité et d’une souveraineté numérique accrue conduit les organisations à réévaluer leurs choix technologiques. Ce virage s’appuie sur la richesse et la diversité des solutions Open Source disponibles, chacune offrant des atouts indéniables. L’Open Source offre ainsi aux organisations la maîtrise totale de leurs infrastructures et de leurs données ce qui garantit qu’aucune information sensible ne peut être transférée sans consentement explicite.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/antoine-schibler-KF3Ty-K6NVA-unsplash.jpg&quot; alt=&quot;Drapeaux européens&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;De nombreux pays européens ont inscrit l’Open Source comme priorité stratégique :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;France : doctrine “Cloud au centre”, programme “Tech.gouv”, soutien à des projets comme Software Heritage ;&lt;/li&gt;
  &lt;li&gt;Allemagne : stratégie “Digitale Souveränität”, projet Sovereign Workplace développant un environnement de travail souverain basé sur Linux ;&lt;/li&gt;
  &lt;li&gt;Commission Européenne : stratégie Open Source officielle depuis 2020, obligation d’évaluer les solutions Open Source en priorité, financement via EU-FOSSA et NGI ;&lt;/li&gt;
  &lt;li&gt;Pays-Bas, Suède, Italie, Espagne : politiques “Open Source first” pour l’administration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce consensus politique signale un changement de paradigme durable et une reconnaissance de l’Open Source comme voie privilégiée pour la souveraineté numérique européenne. 2026 sera l’année où ces initiatives prendront leur pleine ampleur, avec des appels d’offres publics favorisant massivement l’Open Source et des exigences accrues de transparence.&lt;/p&gt;

&lt;h2 id=&quot;le-panorama-des-solutions-open-source&quot;&gt;Le panorama des solutions Open Source&lt;/h2&gt;
&lt;h3 id=&quot;les-systèmes-dexploitation&quot;&gt;Les systèmes d’exploitation&lt;/h3&gt;

&lt;h4 id=&quot;les-distributions-linux&quot;&gt;Les distributions Linux&lt;/h4&gt;
&lt;p&gt;Elles se sont imposées comme le moteur principal de la transformation numérique. Avec des variantes éprouvées comme Red Hat Enterprise Linux (RHEL), Ubuntu Server LTS, Debian ou encore Rocky Linux et AlmaLinux, Linux offre une flexibilité et une adaptabilité sans précédent. Chaque distribution propose un équilibre entre stabilité, innovation et support professionnel. Sa vaste communauté et son écosystème logiciel pléthorique en font une plateforme de choix pour les applications métier, le cloud computing, le big data et l’intelligence artificielle.
&lt;a href=&quot;https://www.kernel.org/&quot; target=&quot;_blank&quot;&gt;Le noyau Linux&lt;/a&gt; bénéficie de contributions exceptionnelles de milliers de développeurs issus en partie de nombreuses entreprises, garantissant ainsi une diversité de perspectives et une qualité de révision sans équivalent dans le monde propriétaire.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/distributions-linux.png&quot; alt=&quot;Quelques distributions Linux&quot; width=&quot;60%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;openbsd&quot;&gt;OpenBSD&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.openbsd.org/&quot; target=&quot;_blank&quot;&gt;OpenBSD&lt;/a&gt; est mondialement reconnu pour son approche intransigeante de la sécurité. Sa philosophie de “sécurité par défaut”, combinée à un processus d’audit de code continu et à des innovations pionnières en matière de protection, en font un choix privilégié pour les infrastructures critiques : pare-feu, routeurs, serveurs VPN. Contrairement aux systèmes propriétaires dont le fonctionnement interne reste opaque, l’ouverture totale du code source d’OpenBSD permet une vérification constante et une confiance inégalée, réduisant drastiquement la surface d’attaque.&lt;/p&gt;

&lt;h4 id=&quot;autres-systèmes-bsd&quot;&gt;Autres Systèmes BSD&lt;/h4&gt;
&lt;p&gt;Au-delà d’OpenBSD, &lt;a href=&quot;https://www.freebsd.org/&quot; target=&quot;_blank&quot;&gt;FreeBSD&lt;/a&gt; et &lt;a href=&quot;https://www.netbsd.org/&quot; target=&quot;_blank&quot;&gt;NetBSD&lt;/a&gt; proposent des alternatives robustes pour des besoins spécifiques. FreeBSD est particulièrement réputé pour ses performances réseau exceptionnelles (utilisé par Netflix, WhatsApp, Sony PlayStation), sa gestion avancée du stockage avec ZFS et sa stabilité légendaire. NetBSD se distingue par son incroyable portabilité, fonctionnant sur une multitude d’architectures matérielles, un atout dans les environnements industriels hétérogènes ou les systèmes embarqués.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/systemes-bsd.jpg&quot; alt=&quot;Systèmes BSD&quot; width=&quot;60%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;les-architecture-système-et-sécurité&quot;&gt;Les architecture système et sécurité&lt;/h3&gt;
&lt;p&gt;Les systèmes &lt;a href=&quot;https://www.opengroup.org/unix-systems&quot; target=&quot;_blank&quot;&gt;Unix&lt;/a&gt; et leurs dérivés se distinguent par un modèle de permissions granulaire et robuste, offrant un contrôle précis sur l’accès aux ressources. Des mécanismes avancés comme SELinux et AppArmor sur Linux ajoutent des couches supplémentaires de contrôles d’accès obligatoires, permettant une isolation renforcée des applications et limitant considérablement l’impact d’une compromission.&lt;/p&gt;

&lt;p&gt;Cette architecture de sécurité multi-couches contraste avec les systèmes propriétaires qui peuvent souffrir de complexités diverses et de services système s’exécutant avec les privilèges les plus élevés par défaut.&lt;/p&gt;

&lt;p&gt;Le modèle Open Source démontre une réactivité supérieure dans la gestion des vulnérabilités. La transparence du code permet à une vaste communauté internationale de chercheurs d’identifier rapidement les failles. Les correctifs sont souvent disponibles avant même que les vulnérabilités ne soient largement exploitées. Les distributions Linux de qualité entreprise affichent des temps de résolution des vulnérabilités critiques considérablement plus courts que les systèmes propriétaires. De plus, des fonctionnalités comme le livepatch permettent d’appliquer des mises à jour critiques du noyau sans redémarrage, un avantage majeur pour la continuité des activités.&lt;/p&gt;

&lt;p&gt;L’expertise de Worteks en matière de durcissement des systèmes (hardening) et d’audits de sécurité permet d’accompagner les organisations dans la mise en œuvre de configurations sécurisées dès le déploiement, réduisant drastiquement les risques.&lt;/p&gt;

&lt;h3 id=&quot;lopen-source-catalyseur-de-lécosystèmedevops&quot;&gt;L’Open Source, catalyseur de l’écosystème DevOps&lt;/h3&gt;
&lt;p&gt;Le cœur de l’écosystème DevOps moderne bat au rythme exclusif de Linux et des systèmes Open Source. La quasi-totalité des outils de CI/CD et d’automatisation trouve leur support optimal sur ces plateformes. Qu’il s’agisse d’&lt;a href=&quot;/tech/technologies/ansible/&quot;&gt;Ansible&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/puppet/&quot;&gt;Puppet&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/docker/&quot;&gt;Docker&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/kubernetes/&quot;&gt;Kubernetes&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/git/&quot;&gt;Git&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/prometheus/&quot;&gt;Prometheus&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/grafana/&quot;&gt;Grafana&lt;/a&gt; ou de la stack &lt;a href=&quot;/tech/technologies/elastic/&quot;&gt;ELK&lt;/a&gt;, l’environnement Linux offre une maturité technique et une intégration native qui simplifient considérablement le déploiement et la gestion des infrastructures complexes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/DevOps.png&quot; alt=&quot;DevOps&quot; width=&quot;60%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;L’Infrastructure as Code (IaC), paradigme fondamental qui consiste à gérer l’infrastructure via du code versionné, s’épanouit naturellement dans l’écosystème Open Source. Des outils comme Terraform, Pulumi ou CloudFormation facilitent la définition déclarative des infrastructures, permettant des déploiements automatisés, cohérents et rapides à grande échelle.&lt;/p&gt;

&lt;p&gt;Worteks accompagne ses clients dans l’adoption de ces pratiques DevOps, avec des formations personnalisées (&lt;a href=&quot;/services/formation/&quot;&gt;centre de formation Qualiopi&lt;/a&gt;) et un accompagnement sur mesure pour transformer les équipes IT traditionnelles en équipes agiles et efficaces.&lt;/p&gt;

&lt;h3 id=&quot;alternatives-open-source-pour-les-services-essentiels&quot;&gt;Alternatives Open Source pour les services essentiels&lt;/h3&gt;

&lt;p&gt;Il est possible d’adresser chaque pan de l’infrastructure via des solutions Open Source :&lt;/p&gt;

&lt;h4 id=&quot;annuaire-et-authentification&quot;&gt;Annuaire et authentification&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/tech/technologies/openldap/&quot;&gt;OpenLDAP&lt;/a&gt; s’impose comme la solution d’annuaire Open Source de référence, offrant une gestion centralisée des identités robuste et éprouvée depuis des décennies. Compatible avec les protocoles standards, OpenLDAP permet de structurer l’organisation des utilisateurs, groupes et ressources de manière hiérarchique et efficace. Pour les besoins plus avancés, &lt;a href=&quot;/tech/technologies/freeipa/&quot;&gt;FreeIPA&lt;/a&gt; et &lt;a href=&quot;/tech/technologies/keycloak/&quot;&gt;Keycloak&lt;/a&gt; fournissent des solutions d’authentification centralisées et de SSO modernes.&lt;/p&gt;

&lt;p&gt;Worteks possède une expertise reconnue dans l’architecture et le déploiement d’annuaires OpenLDAP haute disponibilité, avec réplication multi-provider, optimisation des performances et intégration avec les écosystèmes existants. Nous accompagnons régulièrement des migrations depuis Active Directory vers des solutions 100% Open Source.&lt;/p&gt;

&lt;h4 id=&quot;gestion-des-accès-web-sso&quot;&gt;Gestion des accès web (SSO)&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/tech/technologies/lemonldapng/&quot;&gt;LemonLDAP::NG&lt;/a&gt; (LLNG) mérite une attention particulière comme solution française de Single Sign-On. Cette plateforme mature et complète permet de sécuriser l’accès aux applications web avec une authentification centralisée, incluant le support de multiples facteurs d’authentification (MFA), SAML, OpenID Connect, CAS et OAuth2. LLNG offre une alternative souveraine et performante aux solutions commerciales, avec une flexibilité remarquable pour gérer des politiques d’accès complexes et des règles de sécurité granulaires.
En tant que contributeur actif au projet LemonLDAP::NG, Worteks dispose d’une expertise unique pour déployer des architectures SSO complexes, couvrant des centaines d’applications hétérogènes avec des règles d’accès sophistiquées. Nos équipes maîtrisent parfaitement l’intégration avec les applications modernes (API REST, microservices) comme legacy.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustratons_ecosysteme/logo_llng.svg&quot; alt=&quot;LLNG&quot; width=&quot;60%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;partage-de-fichiers-et-services-réseau&quot;&gt;Partage de fichiers et services réseau&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.samba.org/&quot; target=&quot;_blank&quot;&gt;Samba&lt;/a&gt; offre une compatibilité totale avec les protocoles propriétaires (SMB/CIFS) tout en apportant des fonctionnalités avancées, incluant l’intégration avec OpenLDAP, le chiffrement natif et des performances réseau optimisées.&lt;/p&gt;

&lt;h4 id=&quot;messagerie-et-collaboration&quot;&gt;Messagerie et collaboration&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/tech/technologies/bluemind/&quot;&gt;BlueMind&lt;/a&gt; (solution française souveraine), Carbonio et SOGo proposent des alternatives complètes avec compatibilité Exchange, calendriers partagés et synchronisation mobile native.&lt;/p&gt;

&lt;h4 id=&quot;partage-documentaire&quot;&gt;Partage documentaire&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/tech/technologies/nextcloud/&quot;&gt;Nextcloud&lt;/a&gt; s’est imposé comme la plateforme collaborative européenne de référence, offrant partage de fichiers, calendrier, contacts et édition collaborative via Collabora Online ou OnlyOffice.&lt;/p&gt;

&lt;h3 id=&quot;cas-dusage-réels-et-adoption-sectorielle&quot;&gt;Cas d’usage réels et adoption sectorielle&lt;/h3&gt;
&lt;p&gt;Au niveau de la défense et de la sécurité nationale, de nombreux pays européens ont développé des distributions Linux durcies, comme Clip OS en France (ANSSI) ou NeutrINO en Allemagne. Ces systèmes soulignent la confiance placée dans la sécurité intrinsèque de l’Open Source, là où le caractère fermé des solutions propriétaires soulève des doutes légitimes.
Dans l’industrie, l’Open Source est le pilier des architectures modernes. Les usines Smart Factory s’appuient sur des systèmes Linux de bout en bout. Des ERP majeurs comme SAP HANA ont fait le choix stratégique de ne fonctionner que sur Linux, en raison des exigences de performance et mise à l’échelle.&lt;/p&gt;

&lt;p&gt;Worteks intervient auprès d’entreprises de tous secteurs :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;secteur privé, industries&lt;/li&gt;
  &lt;li&gt;administration publique&lt;/li&gt;
  &lt;li&gt;santé&lt;/li&gt;
  &lt;li&gt;finance&lt;/li&gt;
  &lt;li&gt;éducation
Cette diversité nous permet d’apporter des retours d’expérience concrets et des solutions éprouvées, adaptées à chaque contexte métier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;stratégies-pour-les-applications-propriétaires&quot;&gt;Stratégies pour les applications propriétaires&lt;/h2&gt;
&lt;p&gt;Pour certaines applications propriétaires qui ne fonctionnent que sur des systèmes spécifiques, plusieurs solutions existent.&lt;/p&gt;

&lt;h3 id=&quot;virtualisation-dentreprise&quot;&gt;Virtualisation d’entreprise&lt;/h3&gt;
&lt;p&gt;L’écosystème Open Source offre des plateformes de virtualisation matures et performantes qui ont bénéficié d’un coup de projecteur depuis le rachat de VMWare par Broadcom.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/tech/technologies/proxmox/&quot;&gt;Proxmox VE&lt;/a&gt; : solution complète intégrant KVM pour la virtualisation et LXC pour les conteneurs, avec interface web intuitive, haute disponibilité native et gestion centralisée. Particulièrement adaptée aux PME et infrastructures distribuées.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/tech/technologies/ovirt/&quot;&gt;oVirt&lt;/a&gt; : plateforme de gestion de virtualisation KVM d’entreprise, sponsorisée par Red Hat, offrant des fonctionnalités avancées de centre de données (live migration, haute disponibilité, gestion centralisée de milliers de machines virtuelles).&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://xcp-ng.org/&quot; target=&quot;_blank&quot;&gt;XCP-ng&lt;/a&gt; : fork communautaire libre de Xen, éliminant les limitations artificielles, avec Xen Orchestra comme interface de gestion moderne. Solution robuste pour les environnements exigeants nécessitant une isolation stricte.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/tech/technologies/openstack/&quot;&gt;OpenStack&lt;/a&gt; : plateforme cloud complète pour infrastructures à grande échelle, permettant de créer des clouds privés ou publics avec gestion automatisée de milliers de machines virtuelles et de ressources réseau/stockage.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/tech/technologies/kubevirt/&quot;&gt;KubeVirt&lt;/a&gt; : extension de Kubernetes permettant d’exécuter des machines virtuelles aux côtés des conteneurs, idéale pour les organisations adoptant une approche cloud-native tout en conservant des workloads legacy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worteks a déployé et gère des infrastructures de virtualisation pour des centaines de clients, du petit cluster Proxmox à des clouds privés OpenStack de plusieurs milliers de cœurs. Notre expertise couvre toute la chaîne :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;architecture,&lt;/li&gt;
  &lt;li&gt;déploiement,&lt;/li&gt;
  &lt;li&gt;migration,&lt;/li&gt;
  &lt;li&gt;formation et support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-12.jpg&quot; alt=&quot;Dev&quot; width=&quot;80%&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;infrastructures-de-bureau-virtuel-vdi&quot;&gt;Infrastructures de bureau virtuel (VDI)&lt;/h3&gt;
&lt;p&gt;Des solutions comme Apache Guacamole (Open Source, accès via navigateur) ou Kyber permettent de centraliser les applications sur des serveurs dédiés et d’y accéder à distance depuis des clients légers. Kyber, en particulier, offre une solution VDI Open Source performante qui facilite l’accès aux applications Windows depuis des postes Linux, réduisant drastiquement le nombre de licences nécessaires tout en maintenant l’expérience utilisateur.&lt;/p&gt;

&lt;p&gt;L’approche VDI avec Kyber ou Guacamole représente souvent la solution idéale pour les entreprises souhaitant migrer progressivement : les utilisateurs bénéficient d’un poste Linux performant et sécurisé pour leur travail quotidien, tout en conservant un accès transparent aux quelques applications propriétaires critiques via VDI.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce panorama des logiciels Open Source montre qu’ils balayent le spectre d’utilisation des solutions propriétaires tout en constituant des alternatives plus performante, sécurisée et souveraine que ces dernières. Dans notre article suivant &lt;a href=&quot;/blog/souverainete-numerique-2/&quot;&gt;« Vos résolutions 2026 pour l’autonomie stratégique numérique : comment Worteks peut vous accompagner »&lt;/a&gt;, nous vous expliquons comment Worteks peut vous accompagner dans votre migration vers des solutions 100% Open Source.&lt;/p&gt;</content><author><name>Jean-Christophe ELINEAU</name></author><category term="Souveraineté" /><category term="Autonomie" /><category term="Infrastructure" /><category term="Géopolitique" /><summary type="html">Vos résolutions 2026 : vers des infrastructures toujours plus ouvertes !</summary></entry><entry><title type="html">Proxmox VE</title><link href="https://www.worteks.com/blog/2025-12-29-proxmox-et-vmware/" rel="alternate" type="text/html" title="Proxmox VE" /><published>2025-12-29T00:00:00+01:00</published><updated>2025-12-29T00:00:00+01:00</updated><id>https://www.worteks.com/blog/proxmox</id><content type="html" xml:base="https://www.worteks.com/blog/2025-12-29-proxmox-et-vmware/">&lt;h1 id=&quot;proxmox-ve--une-alternative-crédible-à-vmware-mais-pas-universelle&quot;&gt;Proxmox VE : Une alternative crédible à VMware, mais pas universelle&lt;/h1&gt;

&lt;p&gt;L’annonce du changement de politique tarifaire de VMware par Broadcom a créé un véritable séisme dans l’écosystème de la virtualisation d’entreprise. Face à des augmentations parfois dramatiques des coûts de licensing, nombreuses sont les organisations qui explorent des alternatives. &lt;a href=&quot;/tech/technologies/proxmox/&quot;&gt;Proxmox VE&lt;/a&gt; s’impose naturellement dans cette réflexion, porté par une communauté active et une approche Open Source séduisante. Cependant, cette migration mérite une analyse technique approfondie pour éviter les écueils d’une transition mal préparée.&lt;/p&gt;

&lt;h2 id=&quot;le-contexte-post-broadcom--comprendre-lexode-vmware&quot;&gt;Le contexte post-Broadcom : comprendre l’exode VMware&lt;/h2&gt;

&lt;p&gt;Depuis le rachat de VMware, les nouvelles grilles tarifaires ont bouleversé l’équation économique de nombreuses infrastructures. Les licences par socket disparaissent au profit d’un modèle par cœur CPU, accompagné de bundles imposés qui incluent des fonctionnalités parfois non utilisées. Cette évolution pousse légitimement les DSI à réévaluer leurs choix technologiques. Nous avons déjà réalisé une &lt;a href=&quot;/blog/VMWare-ROI/&quot;&gt;série d’articles&lt;/a&gt; à ce sujet, n’hésitez pas à aller les consulter.&lt;/p&gt;

&lt;p&gt;Proxmox VE apparaît alors comme un candidat naturel : hyperviseur basé sur KVM/QEMU, distribution Debian, interface web unifiée et modèle économique transparent. Mais attention aux raccourcis : remplacer VMware par Proxmox ne se résume pas à une simple substitution technique.&lt;/p&gt;

&lt;h2 id=&quot;architecture-vmware-vs-proxmox--correspondances-et-divergences&quot;&gt;Architecture VMware vs Proxmox : correspondances et divergences&lt;/h2&gt;

&lt;h3 id=&quot;le-modèle-vmware-traditionnel&quot;&gt;Le modèle VMware traditionnel&lt;/h3&gt;

&lt;p&gt;L’architecture VMware classique s’articule autour de vCenter Server pour la gestion centralisée, d’ESXi comme hyperviseur, et s’appuie sur un stockage partagé (SAN/NAS) avec des fonctionnalités avancées comme vMotion, DRS, et HA. Cette architecture convient particulièrement aux environnements nécessitant une haute disponibilité avec des SLA stricts. Ce modèle est le cas typique des déploiements VMware et correspond à une grande partie des infrastructures à migrer.&lt;/p&gt;

&lt;h3 id=&quot;lapproche-proxmox&quot;&gt;L’approche Proxmox&lt;/h3&gt;
&lt;p&gt;Proxmox VE propose une architecture plus distribuée où chaque nœud intègre à la fois l’hyperviseur (&lt;a href=&quot;/tech/technologies/kvm/&quot;&gt;KVM&lt;/a&gt;) et les capacités de gestion via une API REST. Le clustering s’appuie sur Corosync, et le stockage peut être géré de manière native via &lt;a href=&quot;/tech/technologies/ceph/&quot;&gt;Ceph&lt;/a&gt;, ZFS, ou des backends externes.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Correspondance directe : infrastructures de 3 à 16 nœuds avec besoins de virtualisation classique, environnements de développement/test, infrastructures départementales.&lt;/li&gt;
  &lt;li&gt;Limites architecturales : grandes fermes de virtualisation (&amp;gt;100 hôtes), environnements multi-tenants complexes, intégrations poussées avec des écosystèmes propriétaires.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;migration-technique--méthodologie-et-limite&quot;&gt;Migration technique : méthodologie et limite&lt;/h2&gt;

&lt;h3 id=&quot;prérequis-et-planification&quot;&gt;Prérequis et planification&lt;/h3&gt;

&lt;p&gt;La migration nécessite une analyse préalable rigoureuse :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Audit de l’existant VMware&lt;/li&gt;
  &lt;li&gt;Inventaire des VMs et leurs dépendances&lt;/li&gt;
  &lt;li&gt;Analyse des performances (CPU, RAM, stockage, réseau)&lt;/li&gt;
  &lt;li&gt;Cartographie des fonctionnalités utilisées (vMotion, DRS, snapshots)&lt;/li&gt;
  &lt;li&gt;Évaluation des intégrations (backup, monitoring, orchestration)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;processus-de-migration&quot;&gt;Processus de migration&lt;/h3&gt;

&lt;p&gt;La phase de migration est assez simple, reposant essentiellement sur de la conversion de machines virtuelles. Les technologies se ressemblant fortement, il est facile de proposer un modèle type :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Phase 1 : Reconstruction des services
    &lt;ul&gt;
      &lt;li&gt;Reconfiguration du réseau (VLAN, bridges)&lt;/li&gt;
      &lt;li&gt;Mise en place du clustering Proxmox&lt;/li&gt;
      &lt;li&gt;Configuration du stockage (Ceph, ZFS, ou stockage externe)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Phase 2 : Conversion des VMs , Proxmox propose plusieurs méthodes :
    &lt;ul&gt;
      &lt;li&gt;Conversion directe via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;qm importovf&lt;/code&gt; pour les exports OVF&lt;/li&gt;
      &lt;li&gt;Migration à chaud possible avec des outils comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;virt-v2v&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Import des disques VMDK vers formats qcow2 ou raw&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il est possible de créer un cluster minimal et de basculer les hyperviseurs d’une solution à une autre pour éviter de devoir dupliquer le nombre de serveurs physiques. Attention : un point de vigilence important concerne la partie stockage local, où un certain nombre de déploiements ESX sont sur des cartes SD ou flash simples.&lt;/p&gt;

&lt;h3 id=&quot;points-de-vigilance-techniques&quot;&gt;Points de vigilance techniques&lt;/h3&gt;

&lt;p&gt;Il y a plusieurs points de vigilance pour identifier la faisabilité d’une migration VMware vers Proxmox :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Stockage : L’absence d’équivalent direct à VMFS nécessite de repenser l’architecture de stockage. Ceph étant intégré, cela offre une solution élégante. Pour les profils les plus expérimentés, il est conseillé de séparer le stockage et la virtualisation en gérant le cluster Ceph autrement.&lt;/li&gt;
  &lt;li&gt;Réseau : Proxmox gère nativement les VLAN et bridges, mais des configurations réseau complexes (NSX) nécessitent une refonte.&lt;/li&gt;
  &lt;li&gt;Haute disponibilité : Le système HA de Proxmox, bien que fonctionnel, reste plus basique que DRS/vSphere HA pour des environnements critiques.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;léquation-économique--au-delà-de-la-gratuité-apparente&quot;&gt;L’équation économique : au-delà de la gratuité apparente&lt;/h2&gt;

&lt;h3 id=&quot;coûts-directs-proxmox&quot;&gt;Coûts directs Proxmox&lt;/h3&gt;

&lt;p&gt;Si Proxmox VE Community est gratuit, les environnements de production nécessitent généralement un support commercial :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Les tarifs Proxmox évoluent régulièrement. Il convient de vérifier les prix actuels sur le &lt;a href=&quot;https://www.proxmox.com/en/&quot; target=&quot;_blank&quot;&gt;site officiel&lt;/a&gt; pour une évaluation précise.&lt;/li&gt;
  &lt;li&gt;Proxmox Backup Server nécessite également une souscription pour les environnements de production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;coûts-indirects-souvent-oubliés&quot;&gt;Coûts indirects souvent oubliés&lt;/h3&gt;

&lt;p&gt;Il est important de noter que certains coûts restent souvent peu estimés ou négligés, ils sont à prendre en compte dans le ROI avec l’économie faite sur les souscriptions VMware :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Formation et montée en compétences sur :
    &lt;ul&gt;
      &lt;li&gt;KVM&lt;/li&gt;
      &lt;li&gt;LXC&lt;/li&gt;
      &lt;li&gt;Ceph&lt;/li&gt;
      &lt;li&gt;clustering Linux&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Mise en place d’outils périphériques : L’écosystème VMware (vRealize, NSX) n’a pas d’équivalent direct, nécessitant des solutions tierces.&lt;/li&gt;
  &lt;li&gt;Souscription à des contrats de support et d’expertise : Il est recommandé de passer par un intégrateur en plus du support Proxmox pour le déploiement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cas-dusage-adaptés-et-limites-de-proxmox&quot;&gt;Cas d’usage adaptés et limites de Proxmox&lt;/h2&gt;

&lt;p&gt;Le paysage des solutions de virtualisation Open Source est varié et complexe, comme nous l’avons décrit dans notre &lt;a href=&quot;/blog/Comment-comparer-les-solutions-de-virtualisation/&quot;&gt;série d’articles sur le sujet&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;proxmox-excelle-pour-&quot;&gt;Proxmox excelle pour :&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;PME avec infrastructures simples à moyennes (5-50 VMs)&lt;/li&gt;
  &lt;li&gt;Environnements de développement/test&lt;/li&gt;
  &lt;li&gt;Organisations avec expertise Linux forte&lt;/li&gt;
  &lt;li&gt;Besoins de conteneurisation (LXC natif)&lt;/li&gt;
  &lt;li&gt;Budgets contraints avec tolérance aux risques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dautres-alternatives-sont-préférables-pour-&quot;&gt;D’autres alternatives sont préférables pour :&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Grandes infrastructures (&amp;gt;100 hôtes) :  &lt;a href=&quot;/tech/technologies/openstack/&quot;&gt;OpenStack&lt;/a&gt; ou &lt;a href=&quot;https://www.ovirt.org/&quot; target=&quot;_blank&quot;&gt;oVirt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Environnements critiques 24/7 : &lt;a href=&quot;https://xcp-ng.org/&quot; target=&quot;_blank&quot;&gt;XCP-ng&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/kubevirt/&quot;&gt;KubeVirt&lt;/a&gt;, OpenStack ou oVirt&lt;/li&gt;
  &lt;li&gt;Intégrations complexes : KubeVirt ou OpenStack&lt;/li&gt;
  &lt;li&gt;Organisations sans expertise Linux : oVirt ou XCP-ng&lt;/li&gt;
  &lt;li&gt;Besoins cloud hybride : OpenStack&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;recommandations-pour-une-migration-réussie&quot;&gt;Recommandations pour une migration réussie&lt;/h2&gt;

&lt;h3 id=&quot;approche-pilote&quot;&gt;Approche pilote&lt;/h3&gt;

&lt;p&gt;Il est préférable de prendre en main l’outil avant de réaliser la conversion de toute votre infrastructure. Commencer par un sous-ensemble non critique permet de valider l’approche :&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Migration d’un cluster de développement&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/services/formation/&quot;&gt;Formation&lt;/a&gt; des équipes sur 6 mois&lt;/li&gt;
  &lt;li&gt;Validation des processus de sauvegarde/restauration&lt;/li&gt;
  &lt;li&gt;Extension progressive aux environnements de production&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;critères-de-décision&quot;&gt;Critères de décision&lt;/h3&gt;

&lt;p&gt;La décision doit être motivée par un besoin et non par une mode ou un effet de foule. Voici certains éléments à prendre en compte :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Complexité : Plus l’infrastructure VMware est sophistiquée, plus la migration sera complexe&lt;/li&gt;
  &lt;li&gt;Compétences : L’expertise Linux/KVM interne conditionne largement le succès&lt;/li&gt;
  &lt;li&gt;Budget : Au-delà des licences, intégrer formation, outils et période de transition&lt;/li&gt;
  &lt;li&gt;Évolutivité : Anticiper les besoins futurs (croissance, cloud hybride)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion--pragmatisme-avant-tout&quot;&gt;Conclusion : pragmatisme avant tout&lt;/h2&gt;

&lt;p&gt;Proxmox VE représente une alternative sérieuse et économiquement attractive pour de nombreux cas d’usage. Son architecture moderne, basée sur des standards ouverts, offre une flexibilité appréciable. Cependant, cette migration ne doit pas être motivée uniquement par les considérations économiques immédiates.
Le succès d’une transition repose sur une analyse technique rigoureuse, une planification méthodique et une évaluation réaliste des compétences disponibles. Pour les organisations disposant de l’expertise technique appropriée et d’infrastructures correspondant au modèle Proxmox, cette migration peut effectivement représenter une opportunité de modernisation et d’optimisation des coûts.&lt;/p&gt;

&lt;p&gt;L’écosystème Open Source offre aujourd’hui plusieurs alternatives crédibles : oVirt, KubeVirt pour les environnements hybrides, XCP-ng pour une approche Xen, ou OpenStack pour les infrastructures orientées IaC ou IaaS. Chaque solution répond à des besoins spécifiques et mérite une évaluation dans le contexte de migration post-VMware. L’engouement autour de Proxmox est légitime, mais doit être tempéré par une approche technique pragmatique : il ne s’agit pas simplement de remplacer VMware, mais de construire l’infrastructure de virtualisation la plus adaptée aux besoins réels et à l’évolution future de l’organisation.&lt;/p&gt;</content><author><name>Thibaut DEMARET</name></author><category term="Infrastructure" /><category term="Complexite" /><category term="Conception" /><summary type="html">Une alternative crédible à VMware, mais pas universelle</summary></entry><entry><title type="html">Retour sur l’OSXP 2025 : Mini W’aaS, le Cloud Provider de poche</title><link href="https://www.worteks.com/blog/mini-waas/" rel="alternate" type="text/html" title="Retour sur l’OSXP 2025 : Mini W’aaS, le Cloud Provider de poche" /><published>2025-12-15T00:00:00+01:00</published><updated>2025-12-15T00:00:00+01:00</updated><id>https://www.worteks.com/blog/mini-waas</id><content type="html" xml:base="https://www.worteks.com/blog/mini-waas/">&lt;h1 id=&quot;retour-sur-losxp-2025--mini-waas-le-cloud-provider-de-poche-à-la-cité-des-sciences&quot;&gt;Retour sur l’OSXP 2025 : Mini W’aaS, le Cloud Provider de poche à la Cité des Sciences&lt;/h1&gt;

&lt;p&gt;Lors de l’édition 2025 de l’Open Source Experience (OSXP) à la Cité des Sciences et de l’Industrie, on a voulu relever un défi un peu fou avec le projet Mini W’aaS : la démonstration en live et en miniature de notre &lt;a href=&quot;/hebergement/&quot;&gt;offre d’hébergement W’aaS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le défi : déployer, seul et en seulement 2 jours de préparation, une infrastructure Cloud Provider complète (IaaS), sécurisée et monitorée, sur du matériel de bureau obsolète.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’objectif n’était pas de montrer la puissance brute, mais de démontrer l’expertise et l’efficience : prouver qu’avec une architecture logicielle maîtrisée, on peut faire tourner &lt;a href=&quot;/tech/technologies/openstack/&quot;&gt;OpenStack&lt;/a&gt;, &lt;a href=&quot;/tech/technologies/kubernetes/&quot;&gt;Kubernetes&lt;/a&gt; et &lt;a href=&quot;/tech/technologies/ceph/&quot;&gt;Ceph&lt;/a&gt; sur des machines que d’autres auraient mis à la benne.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/miniwaas_archi.png&quot; alt=&quot;Architechture ultra simplifiée de mini waas&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;le-hardware--des-machines-doccasion-et-des-contraintes-extrêmes&quot;&gt;Le Hardware : des machines d’occasion et des contraintes extrêmes&lt;/h2&gt;

&lt;h3 id=&quot;le-matériel&quot;&gt;Le matériel&lt;/h3&gt;
&lt;p&gt;Pour cette démo, le Data Center tenait sur une table et dans trois racks. Il était composé de 21 machines récupérées, des ThinkCentre Tiny :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;14x ThinkCentre M700&lt;/li&gt;
  &lt;li&gt;13x ThinkCentre M710Q (dont je n’ai utilisé qu’une partie)&lt;/li&gt;
  &lt;li&gt;8x ThinkCentre M715Q&lt;/li&gt;
  &lt;li&gt;15x ThinkCentre M73 (les vétérans de 2014 !)&lt;/li&gt;
  &lt;li&gt;1 Switch 24 Ports pour faire quelques vlans et Jumbo frame&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-1.jpg&quot; alt=&quot;OSXP 2025 - Mini W&apos;aaS&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;la-contrainte-absolue--4-go-de-ram-par-machine&quot;&gt;La contrainte absolue : 4 Go de RAM par machine&lt;/h3&gt;

&lt;p&gt;C’est là que résidait tout le sel de la démo. Dans le monde du Cloud, 4 Go, c’est ce qu’on alloue à une petite VM. Ici, c’est la RAM totale du host physique pour faire tourner l’OS, Kubernetes (&lt;a href=&quot;https://K3s.io/&quot; target=&quot;_blank&quot;&gt;K3s&lt;/a&gt;), l’agent OpenStack (&lt;a href=&quot;https://docs.openstack.org/nova/latest/&quot; target=&quot;_blank&quot;&gt;Nova&lt;/a&gt;), l’agent Ceph et les VMs clientes.&lt;/p&gt;

&lt;h3 id=&quot;le-stockage-audacieux-sur-usb&quot;&gt;Le stockage “audacieux” sur USB&lt;/h3&gt;

&lt;p&gt;Pour le stockage distribué (Ceph), pas de disques NVMe. J’ai utilisé 3 hosts dédiés avec 6 OSDs montés sur… des clés USB. Faire tourner un cluster Ceph fonctionnel sur de la mémoire flash USB grand public démontre la robustesse incroyable de &lt;a href=&quot;https://rook.io/&quot; target=&quot;_blank&quot;&gt;Rook&lt;/a&gt;, capable de gérer la santé du stockage même sur des supports lents (la subtilité : faire croire que les clés usb n’en sont pas).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[root@k1 ~]# kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph status
  cluster:
    id:     31de7d7b-e50a-4fc9-aaef-1159c0a0c047
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum a,b,c (age 2d)
    mgr: a(active, since 2d)
    osd: 6 osds: 6 up (since 2d), 6 in (since 2d)
 
  data:
    pools:   7 pools, 193 pgs
    objects: 115 objects, 293 MiB
    usage:   4.2 GiB used, 342 GiB / 347 GiB avail
    pgs:     193 active+clean
 
  io:
    client:   20 KiB/s wr, 0 op/s rd, 1 op/s wr
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;une-stack-logicielle-parfaitement-adaptée&quot;&gt;Une stack logicielle parfaitement adaptée&lt;/h2&gt;

&lt;h3 id=&quot;liste-des-logiciels-utilisés&quot;&gt;Liste des logiciels utilisés&lt;/h3&gt;

&lt;p&gt;Si on fait un petit résumé des principaux produits déployés :&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Technologie&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Lien&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Commentaires&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;OpnSense&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://opnsense.org/&quot; target=&quot;_blank&quot;&gt;opnsense.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Pare-feu Open Source&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Rocky Linux 9&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://rockylinux.org/&quot; target=&quot;_blank&quot;&gt;rockylinux.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;OS Base&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;SELinux&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://docs.rockylinux.org/guides/security/learning_selinux/&quot; target=&quot;_blank&quot;&gt;docs.rockylinux.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Module de sécurité noyau&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;K3S&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://K3s.io/&quot; target=&quot;_blank&quot;&gt;K3s.io&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Distribution Kubernetes légère&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Calico&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://www.tigera.io/project-calico/&quot; target=&quot;_blank&quot;&gt;tigera.io/project-calico&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;CNI (Interface Réseau K8s)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;WireGuard&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://www.wireguard.com/&quot; target=&quot;_blank&quot;&gt;wireguard.com&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;VPN moderne et rapide&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;OpenStack-Helm&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://docs.openstack.org/openstack-helm/latest/&quot; target=&quot;_blank&quot;&gt;docs.openstack.org&lt;/a&gt; / &lt;a href=&quot;https://opendev.org/openstack/openstack-helm.git&quot; target=&quot;_blank&quot;&gt;Git&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Orchestre les conteneurs OpenStack (Nova, Neutron, Keystone, Cinder) sur Kubernetes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Rook-Ceph&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://rook.io/&quot; target=&quot;_blank&quot;&gt;rook.io&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Opérateur Kubernetes pour Ceph&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;MetalLB&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://metallb.universe.tf/&quot; target=&quot;_blank&quot;&gt;metallb.universe.tf&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Load Balancer pour K8s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;FRR&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://frrouting.org/&quot; target=&quot;_blank&quot;&gt;frrouting.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Suite de routage (BGP/OSPF)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;FreeIPA&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://www.freeipa.org/&quot; target=&quot;_blank&quot;&gt;freeipa.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Gestion d’identité centralisée (LDAP/Kerberos)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Keycloak&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://www.keycloak.org/&quot; target=&quot;_blank&quot;&gt;keycloak.org&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Gestionnaire d’identité et d’accès (IAM)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Grafana&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://grafana.com/&quot; target=&quot;_blank&quot;&gt;grafana.com&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Visualisation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Prometheus&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://prometheus.io/&quot; target=&quot;_blank&quot;&gt;prometheus.io&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Base de données Time-Series / Collecte les métriques&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exporter FRR&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://github.com/tynany/frr_exporter&quot; target=&quot;_blank&quot;&gt;github.com/tynany/frr_exporter&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Permet de monitorer l’état des sessions BGP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exporter Node&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://github.com/prometheus/node_exporter&quot; target=&quot;_blank&quot;&gt;github.com/prometheus/node_exporter&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Métriques système de base (CPU, RAM, Disque, Réseau) de chaque serveur physique&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exporter OpenStack&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://github.com/openstack-exporter/openstack-exporter&quot; target=&quot;_blank&quot;&gt;github.com/openstack-exporter&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Interroge les API OpenStack pour remonter l’état applicatif&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exporter Goldpinger&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://github.com/bloomberg/goldpinger&quot; target=&quot;_blank&quot;&gt;github.com/bloomberg/goldpinger&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Outil visuel génial pour voir la connectivité réseau entre les nœuds K8s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exporter Kubernetes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes/kube-state-metrics&quot; target=&quot;_blank&quot;&gt;github.com/kubernetes/kube-state-metrics&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Remonte l’état des objets K8s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Ansible&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://www.ansible.com/&quot; target=&quot;_blank&quot;&gt;ansible.com&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Automatisation. Utilisé pour le Day 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Helm&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https://helm.sh/&quot; target=&quot;_blank&quot;&gt;helm.sh&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Gestionnaire de paquets K8s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Il est possible qu’il en manque mais cela représente déjà une idée du projet.&lt;/p&gt;

&lt;h3 id=&quot;avec-cette-répartition-sur-le-matériel&quot;&gt;Avec cette répartition sur le matériel&lt;/h3&gt;

&lt;p&gt;Pour la démo, nous sommes parti d’une infrastructure de Data Center Leaf Spine à la sauce petit hardware :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;3 Firewalls OpnSense avec le routage FRR&lt;/li&gt;
  &lt;li&gt;3 Leafs avec du FRR et les services Freeaipa&lt;/li&gt;
  &lt;li&gt;6 noeuds K3S hébergeant les control Plane : Openstack / Ceph / K3S&lt;/li&gt;
  &lt;li&gt;6 noeuds Kubernetes pour les computes Openstack&lt;/li&gt;
  &lt;li&gt;3 noeuds Ceph pour les 6 OSDs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_actualites/2025-osxp/OSXP25-FloraRichardet-12.jpg&quot; alt=&quot;OSXP 2025 - Mini W&apos;aaS&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;k3s--wireguard--lart-du-déploiement-optimisé&quot;&gt;K3s &amp;amp; WireGuard : l’art du déploiement optimisé&lt;/h2&gt;

&lt;p&gt;Pour faire tenir tout ce monde dans 4 Go de RAM, chaque mégaoctet comptait. L’utilisation d’un Kubernetes standard (k8s) était impossible car trop gourmand.&lt;/p&gt;

&lt;h3 id=&quot;lorchestrateur--k3s&quot;&gt;L’Orchestrateur : K3s&lt;/h3&gt;

&lt;p&gt;Mon choix s’est porté sur K3s, la distribution Kubernetes légère certifiée. Là où un K8s classique consomme facilement 1 Go de RAM à vide, K3s se contente de moins de 512 Mo, laissant des ressources vitales pour les charges de travail OpenStack.&lt;/p&gt;

&lt;p&gt;L’installation s’est faite en une ligne de commande, illustrant la puissance de l’automatisation moderne.&lt;/p&gt;

&lt;h3 id=&quot;le-secret--wireguard-dans-calico&quot;&gt;Le Secret : WireGuard dans Calico&lt;/h3&gt;

&lt;p&gt;Le véritable tour de force réside dans la couche réseau (CNI). Je voulais un réseau chiffré (Zero Trust), mais sur des CPU vieux de 10 ans, le chiffrement IPsec classique aurait mis les machines à genoux.&lt;/p&gt;

&lt;p&gt;La solution ? Utiliser le backend WireGuard de Calico pour pouvoir utiliser MetalLB. WireGuard fonctionnant directement dans le kernel Linux, l’overhead est minime et les performances excellentes.&lt;/p&gt;

&lt;p&gt;K3s configure automatiquement des tunnels WireGuard transparents entre tous les nœuds. Le résultat est immédiat : tout le trafic inter-pod est encapsulé et chiffré, sans aucune configuration complexe de certificats ou de VPN tiers.&lt;/p&gt;

&lt;h2 id=&quot;sécurité--niveau-entreprise-zero-trust&quot;&gt;Sécurité : Niveau Entreprise (Zero Trust)&lt;/h2&gt;

&lt;p&gt;Même si le matériel est roots et que le setup a été monté en deux jours, la sécurité n’a pas été sacrifiée. Au contraire, elle respecte les standards les plus stricts.&lt;/p&gt;

&lt;h3 id=&quot;identité-unifiée-et-sso&quot;&gt;Identité Unifiée et SSO&lt;/h3&gt;

&lt;p&gt;Pas de comptes locaux dispersés. L’infrastructure repose sur une gestion d’identité centralisée :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;FreeIPA : pour la gestion des serveurs Linux, l’authentification SSH centralisée et les règles SUDO. Chaque nœud rejoint le domaine au boot. Hébergé sur les trois noeuds FRR, une machine virtuelle hébergeant les services FreeIPA permet d’avoir une redondance.&lt;/li&gt;
  &lt;li&gt;Keycloak : pour la couche fédération d’identité. L’accès au dashboard OpenStack (Horizon), à Grafana et aux APIs est protégé par SSO (Single Sign-On) hébergé directement sur le K3s. Une seule identité permet de tout piloter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sdn-chiffré-le-résultat-du-setup-k3s&quot;&gt;SDN Chiffré (Le résultat du setup K3s)&lt;/h3&gt;

&lt;p&gt;Grâce à la configuration WireGuard décrite plus haut, le réseau Overlay (les tunnels VXLAN qui transportent les paquets des VMs) ne circule pas en clair. Même si on branche un sniffer sur le switch de la démo, on ne voit qu’un flux chiffré indéchiffrable entre les hyperviseurs. Le réseau physique est considéré comme non-sûr par défaut.&lt;/p&gt;

&lt;h2 id=&quot;lobservabilité--piloter-au-millimètre&quot;&gt;L’Observabilité : piloter au millimètre&lt;/h2&gt;

&lt;p&gt;Faire tourner une stack Cloud complète sur 4 Go de RAM ne laisse aucune marge d’erreur. Une fuite mémoire de 200 Mo et le nœud crash (OOM Killer). L’observabilité n’était pas un luxe, mais une nécessité vitale.&lt;/p&gt;

&lt;p&gt;J’ai déployé une stack Prometheus / Grafana surveillant 4 niveaux critiques :&lt;/p&gt;

&lt;h3 id=&quot;la-surveillance-des-ressources&quot;&gt;La surveillance des ressources&lt;/h3&gt;
&lt;p&gt;Via node_exporter, je surveillais l’usage RAM à la seconde près. Des alertes étaient configurées pour prévenir si la RAM disponible descendait sous les 200 Mo, permettant d’intervenir avant que le kernel ne tue les processus OpenStack.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/miniwaas_globalview.png&quot; alt=&quot;Vue globale&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;la-performance-du-stockage-usb&quot;&gt;La performance du stockage USB&lt;/h3&gt;
&lt;p&gt;Avec le module Ceph Exporter, je surveillais spécifiquement la latence de commit (écriture) sur les 6 clés USB.
Le constat : on pouvait voir graphiquement les pics d’IOPS lors du déploiement d’une VM. Malgré la lenteur du support, Rook a parfaitement lissé la charge, assurant la stabilité du service.&lt;/p&gt;

&lt;h3 id=&quot;la-santé-du-control-plane&quot;&gt;La santé du Control Plane&lt;/h3&gt;
&lt;p&gt;Un exportateur dédié interrogeait les APIs OpenStack pour vérifier l’état des agents Nova, Neutron et Cinder. Cela permettait de savoir instantanément si un service était Down sans avoir à se connecter en SSH.&lt;/p&gt;

&lt;h3 id=&quot;la-connectivité-bgp&quot;&gt;La connectivité BGP&lt;/h3&gt;
&lt;p&gt;Grâce au monitoring de FRR, je pouvais visualiser l’état des sessions BGP entre les hyperviseurs et les routeurs de bordure, garantissant que les IPs des VMs étaient bien annoncées sur le réseau.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/miniwaas_frrexporter.png&quot; alt=&quot;FRR Exporter&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Ce projet Mini W’aaS présenté à l’OSXP démontre qu’OpenStack n’est pas une usine à gaz réservée aux équipes de 50 personnes avec un budget illimité. Seul, en 2 jours, et sur du matériel de récupération, il est possible de monter un Cloud Privé résilient, avec du chiffrement WireGuard natif, du SSO et un monitoring complet. C’est une belle preuve de ce que permet la sobriété quand elle est couplée à une expertise technique sur des outils comme K3s.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Retour de helm
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[root@k1 ~]# helm list -n openstack
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
cinder          openstack       7               2025-12-04 15:51:19.950985143 +0100 CET deployed        cinder-2025.2                   v1.0.0     
glance          openstack       1               2025-12-03 13:12:30.524797775 +0100 CET deployed        glance-2025.2                   v1.0.0     
horizon         openstack       2               2025-12-04 16:04:21.569158846 +0100 CET deployed        horizon-2025.2                  v1.0.0     
ingress         openstack       2               2025-12-03 11:33:30.030254791 +0100 CET deployed        ingress-0.2.19                  v1.8.2     
keystone        openstack       3               2025-12-03 12:02:03.239122838 +0100 CET deployed        keystone-2025.2                 v1.0.0     
libvirt         openstack       5               2025-12-03 17:30:27.140643483 +0100 CET deployed        libvirt-2025.2                  v1.0.0     
mariadb         openstack       1               2025-12-02 13:20:41.893833456 +0100 CET deployed        mariadb-2025.2                  v10.6.7    
memcached       openstack       1               2025-12-02 13:39:38.422099454 +0100 CET deployed        memcached-2025.2                v1.5.5     
neutron         openstack       1               2025-12-03 13:42:06.874793696 +0100 CET deployed        neutron-2025.2                  v1.0.0     
nova            openstack       23              2025-12-04 16:11:55.042845769 +0100 CET deployed        nova-2025.2                     v1.0.0     
openvswitch     openstack       2               2025-12-03 17:31:10.676735009 +0100 CET deployed        openvswitch-2025.2              v1.0.0     
placement       openstack       1               2025-12-03 13:28:08.736924742 +0100 CET deployed        placement-2025.2                v1.0.0     
rabbitmq        openstack       1               2025-12-03 11:51:58.42025061 +0100 CET  deployed        rabbitmq-2025                   v3.12.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rendez-vous à la prochaine édition :)&lt;/p&gt;

&lt;p&gt;Retrouvez notre retour complet de l’événement et nos conférences dans nos actualités : &lt;a href=&quot;/actualites/2025-12-18-Open-Source-Experience-2025_retour/&quot;&gt;L’Open Source Experience, c’est fini ! Retour sur l’édition 2025&lt;/a&gt;.&lt;/p&gt;</content><author><name>Thibaut DEMARET</name></author><category term="K3S" /><category term="Kubernetes" /><category term="Openstack" /><category term="BGP" /><summary type="html">Une infrastructure cloud complète et résiliente à partir de 21 mini-PC.</summary></entry><entry><title type="html">Évolution du plugin de suppression de vidéos anciennes pour PeerTube : un traitement côté back-end</title><link href="https://www.worteks.com/blog/PeerTube-Plugin-Cleanup-Unviewed-Backend/" rel="alternate" type="text/html" title="Évolution du plugin de suppression de vidéos anciennes pour PeerTube : un traitement côté back-end" /><published>2025-11-07T00:00:00+01:00</published><updated>2025-11-07T00:00:00+01:00</updated><id>https://www.worteks.com/blog/PeerTube-Plugin-Cleanup-Unviewed-Backend</id><content type="html" xml:base="https://www.worteks.com/blog/PeerTube-Plugin-Cleanup-Unviewed-Backend/">&lt;p&gt;Le développement initial du plugin “Cleanup Unviewed Videos” pour &lt;a href=&quot;/tech/technologies/peertube/&quot;&gt;PeerTube&lt;/a&gt; (disponible sur
le &lt;a href=&quot;https://github.com/Worteks/peertube-plugin-cleanup-unviewed-videos&quot; target=&quot;\_blank&quot;&gt;Github de Worteks&lt;/a&gt;) avait été évoqué dans un &lt;a href=&quot;/blog/PeerTube-Plugin-Cleanup-Unviewed/&quot;&gt;article précédent&lt;/a&gt;.
Dans la continuité, cet article traite de l’évolution de son architecture en vue de transférer
une partie du traitement côté serveur.&lt;/p&gt;

&lt;p&gt;Cette évolution permet une recherche plus efficace des vidéos éligibles à la
suppression du fait d’un accès direct à la base de données.&lt;/p&gt;

&lt;h2 id=&quot;accès-à-lapi-interne&quot;&gt;Accès à l’API interne&lt;/h2&gt;

&lt;p&gt;La fonction en charge d’enregistrer le plugin dans PeerTube doit être enrichie
de nouveaux attributs permettant l’accès à l’API interne de PeerTube :&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;getRouter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;peertubeHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;registerSetting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// Cet attribut était déjà importé&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;settingsManager&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;database&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;peertubeHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;peertubeHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;router&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getRouter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;videos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;peertubeHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Les attributs qui sont exposés aux plugins sont listés sur &lt;a href=&quot;https://docs.joinpeertube.org/api/plugins#server-register-unregister-only-plugins&quot; target=&quot;\_blank&quot;&gt;la page de documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;interactions-avec-le-routeur&quot;&gt;Interactions avec le routeur&lt;/h2&gt;

&lt;p&gt;Pour que le plugin puisse être piloté depuis l’interface de PeerTube, il faut
qu’il déclare des terminaisons d’API HTTP. Nous allons déclarer deux routes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;récupération des vidéos éligibles à la suppression&lt;/li&gt;
  &lt;li&gt;suppression d’une vidéo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le routeur utilisé par PeerTube est celui du framework &lt;a href=&quot;https://expressjs.com/&quot; target=&quot;\_blank&quot;&gt;Express&lt;/a&gt;.
La déclaration des deux routes se fait de la sorte :&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/:id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;204&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Les routes sont alors accessibles via les requêtes HTTP suivantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET /plugins/&amp;lt;plugin-name&amp;gt;/router&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELETE /plugins/&amp;lt;plugin-name&amp;gt;/router/:id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;accès-aux-paramètres-du-plugin&quot;&gt;Accès aux paramètres du plugin&lt;/h2&gt;

&lt;p&gt;La recherche des vidéos éligibles à une suppression est basée sur des
critères d’âge exprimés en années, mois et jours. Ces critères sont
passés en paramètres GET de la requête. Il est possible d’anticiper des requêtes
incomplètes dont certains paramètres seraient manquants. On peut alors
augmenter la robustesse du code en chargeant la valeur par défaut pour
chacun des arguments manquants. (Note : on aurait pu décider de leur
donner la valeur de “0” par défaut, mais ça aurait été trop simpliste).&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;years&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;days&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;years&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;days&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;req_value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;isNaN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;req_value&lt;/span&gt;
				&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
						&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;settingsManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getSetting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`default-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-old`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
						&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}),&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

	&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans sa version initiale, le plugin expose un paramètre permettant de désactiver
la suppression (à des fins de test). La prise en compte de ce paramètre doit
maintenant se faire dans le code de traitement de la route
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELETE /plugins/&amp;lt;plugin-name&amp;gt;/router/:id&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;enable_deletion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;settingsManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getSetting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;enable-deletion&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enable_deletion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// Actually delete video&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// Write a log message&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;accès-à-la-base-de-données&quot;&gt;Accès à la base de données&lt;/h2&gt;

&lt;p&gt;PeerTube interagit avec la base de données via &lt;a href=&quot;https://sequelize.org/&quot;&gt;Sequelize&lt;/a&gt;.
Les plugins peuvent accéder à cette bibliothèque via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;peertubeHelpers.database&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cette méthode d’accès permet d’exécuter des &lt;a href=&quot;https://sequelize.org/docs/v6/core-concepts/raw-queries/&quot; target=&quot;\_blank&quot;&gt;requêtes au format SQL&lt;/a&gt; sur la base de données. Cependant, des limitations ou des particularités imposent
les précautions suivantes.&lt;/p&gt;

&lt;p&gt;Il n’est pas possible d’accéder aux commodités de haut niveau de l’ORM :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://sequelize.org/docs/v6/core-concepts/model-querying-basics/&quot; target=&quot;\_blank&quot;&gt;requêtes basées sur les modèles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sequelize.org/docs/v6/other-topics/other-data-types/&quot; target=&quot;\_blank&quot;&gt;types de données&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par ailleurs, Sequelize nomme les tables en traduction camelCase de la classe
TypeScript associée. Ceci a comme conséquence que les tables ne seront pas
reconnues directement par le shell PostgreSQL et devront être entourées de
doubles-quotes :&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;videoView&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;-- ERROR:  relation &quot;videoview&quot; does not exist&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;&quot;videoView&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;-- OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Enfin, les plugins n’ont pas accès à suffisamment de fonctionnalités de protection
anti-injection (bind-parameters, date-ranges, etc.).&lt;/p&gt;

&lt;p&gt;Les besoins du plugin nécessitent l’intervention d’opérateurs de calculs de date
afin de traduire l’âge spécifié en date. La requête que le plugin va exécuter ne
pourra pas être sécurisée par l’ORM et nous devons nous assurer nous-mêmes
qu’elle ne permettra pas d’injection. Une conversion en entier base 10 a été
insérée dans sa mise en forme. Le résultat de cette conversion sera soit une
succession de chiffres, soit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NaN&lt;/code&gt;. Ni l’un ni l’autre ne seront vecteurs
d’injection.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s2&quot;&gt;`SELECT &quot;videoId&quot; as id, name, url, &quot;createdAt&quot;
				FROM (
					SELECT &quot;videoId&quot;, video.name, video.url, video.&quot;createdAt&quot;, MAX(&quot;endDate&quot;) AS last_viewed
						FROM &quot;videoView&quot;
						LEFT JOIN video ON &quot;videoId&quot; = video.id
						GROUP BY &quot;videoId&quot;, video.name, video.url, video.&quot;createdAt&quot;
				)
				WHERE last_viewed &amp;lt; CURRENT_DATE
					- interval \&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;years&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; years\&apos;
					- interval \&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; months\&apos;
					- interval \&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;days&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; days\&apos;
			`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;suppression-dune-vidéo&quot;&gt;Suppression d’une vidéo&lt;/h2&gt;

&lt;p&gt;Parmi les fonctions d’aide exposées aux plugins par PeerTube, la fonction
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;removeVideo&lt;/code&gt; permet la suppression d’une vidéo et de tous les éléments qui y
sont associés :&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;peertubeHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;removeVideo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;L’ajout de fonctionnalités back-end à ce plugin représente un important gain
d’efficacité. De plus, il permet d’en rendre l’architecture plus classique.&lt;/p&gt;

&lt;p&gt;Les fonctionnalités offertes aux plugins par PeerTube permettent de traiter
des cas simples sans trop de difficulté. Cependant, la documentation étant
assez rudimentaire, il est nécessaire d’avoir un bagage TypeScript/Javascript
suffisant pour comprendre la façon dont les interfaces de l’API interne à
PeerTube doivent être utilisées.&lt;/p&gt;

&lt;p&gt;Une évolution prochaine de ce plugin (ou une approche initiale pour un prochain
plugin) pourrait être de le développer en TypeScript, ce qui apporterait un
gain en ergonomie dans le processus de développement (au détriment de la
simplicité de déploiement actuelle).&lt;/p&gt;</content><author><name>Sébastien NOBILI</name></author><category term="PeerTube" /><summary type="html">Une présentation de l&apos;évolution d&apos;architecture du code et des possibilités offertes par PeerTube côté backend.</summary></entry><entry><title type="html">Conduite d’un test de charge de réplication avec OpenLDAP</title><link href="https://www.worteks.com/blog/Test-de-charge-replication-openldap/" rel="alternate" type="text/html" title="Conduite d’un test de charge de réplication avec OpenLDAP" /><published>2025-09-22T00:00:00+02:00</published><updated>2025-09-22T00:00:00+02:00</updated><id>https://www.worteks.com/blog/Test-de-charge-replication-openldap-openstack_1-OpenLDAP</id><content type="html" xml:base="https://www.worteks.com/blog/Test-de-charge-replication-openldap/">&lt;p&gt;On a une base &lt;a href=&quot;/tech/technologies/openldap/&quot;&gt;&lt;strong&gt;OpenLDAP&lt;/strong&gt;&lt;/a&gt; avec 30 millions d’entrées, donc assez volumineuse. De temps en temps, pour des raisons techniques (mise à jour d’un service, par exemple), on doit basculer un état booléen sur &lt;strong&gt;toutes&lt;/strong&gt; les entrées de façon à ce que ce service ne soit pas visible le temps de la mise à jour, puis revenir à l’état antérieur. Du fonctionnel, donc.&lt;/p&gt;

&lt;h2 id=&quot;les-principes-et-objectifs&quot;&gt;Les principes et objectifs&lt;/h2&gt;

&lt;p&gt;L’objectif de ce test est de déterminer la meilleure méthode pour conduire cette mise à jour, dans un contexte où des contraintes fortes de production sont présentes.&lt;/p&gt;

&lt;p&gt;Pour cela nous allons tester plusieurs configurations tant matérielles que logicielles et mesurer les résultats obtenus, de façon à définir la configuration optimale.&lt;/p&gt;

&lt;h3 id=&quot;larchitecture-de-réplication-cible&quot;&gt;L’architecture de réplication cible&lt;/h3&gt;

&lt;p&gt;On dispose de 4 serveurs identiques (32 Go de mémoire), avec &lt;strong&gt;OpenLDAP&lt;/strong&gt; dans la version 2.6.10, en réplication complète (chaque serveur pouvant recevoir des modifications et les transmettre aux autres). La raison pour laquelle cette architecture a été choisie est de répartir la charge tout en s’assurant de la continuité de service si un ou plusieurs serveurs tombaient. La charge est importante, avec entre 100 000 à 300 000 modifications par jour (considérant que cette charge se répartit sur 10h, on tourne donc autour de 10 modifications par seconde).&lt;/p&gt;

&lt;p&gt;Par ailleurs, ces serveurs reçoivent une charge de 30 000 recherches par seconde, ce qui est très important.&lt;/p&gt;

&lt;p&gt;Le schéma suivant indique les relations de réplication :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/illustrations_blog/openstack-openldap/replication.drawio.png&quot; alt=&quot;MMR 4 serveurs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En terme de transferts, une modification appliquée sur un des serveurs est transmise plusieurs fois. Par exemple, la modification &lt;strong&gt;M&lt;/strong&gt; appliquée sur le serveur &lt;strong&gt;S1&lt;/strong&gt; est transmise à &lt;strong&gt;S2&lt;/strong&gt;, &lt;strong&gt;S3&lt;/strong&gt; et &lt;strong&gt;S4&lt;/strong&gt;. Mais il faut aussi considérer que &lt;strong&gt;S2&lt;/strong&gt; transmet cette modification à &lt;strong&gt;S3&lt;/strong&gt; et &lt;strong&gt;S4&lt;/strong&gt;, et de même pour chaque serveur. Au total, une modification est communiquée dans le pire des cas jusqu’à 9 fois avec 4 serveurs.&lt;/p&gt;

&lt;p&gt;Note : La propagation s’arrête grâce à deux règles :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On ne propage pas une entrée vers le serveur de provenance (par exemple, si &lt;strong&gt;S2&lt;/strong&gt; reçoit une entrée de &lt;strong&gt;S1&lt;/strong&gt;, il ne la lui renvoie pas).&lt;/li&gt;
  &lt;li&gt;On ne propage pas une entrée que l’on a déjà reçue (et pour cela on compare l’&lt;em&gt;entryCSN&lt;/em&gt; local avec l’&lt;em&gt;entryCSN&lt;/em&gt; de l’entrée reçue, s’ils sont égaux, la propagation de l’entrée cesse).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec d’aussi gros volumes de modifications potentielles, il est nécessaire d’utiliser &lt;em&gt;delta-syncrepl&lt;/em&gt;, qui ne transfert que les attributs modifiés (et quelques autres attributs techniques), au lieu d’utiliser l’algorithme classique (&lt;em&gt;syncrepl&lt;/em&gt;) qui transmet les entrées modifiées dans leur totalité.&lt;/p&gt;

&lt;p&gt;Cela implique la mise en place d’une base de stockage des modifications partielles (&lt;em&gt;accesslog&lt;/em&gt;), qui est utilisée en cas de reprise suite à une déconnexion d’un des serveurs. Cela signifie que chaque modification est appliquée localement, puis enregistrée dans &lt;em&gt;accesslog&lt;/em&gt;, et envoyée aux serveurs en réplication.&lt;/p&gt;

&lt;p&gt;On a donc une double écriture sur disque.&lt;/p&gt;

&lt;p&gt;La contrainte supplémentaire est qu’il faut prévoir la purge de la base &lt;em&gt;accesslog&lt;/em&gt; qui ne fait que grossir : idéalement, sur une base journalière, mais de préférence plus fréquemment pour éviter les gros traitements de purge (on parle de purger jusqu’à 300 000 modifications par jour, et 30 millions lors de l’opération qui nous intéresse).&lt;/p&gt;

&lt;h3 id=&quot;la-configuration-testée&quot;&gt;La configuration testée&lt;/h3&gt;

&lt;p&gt;Pour les tests de charge, on va se contenter de configurer deux serveurs en &lt;strong&gt;MMR&lt;/strong&gt;. Cela nous suffit pour mettre en évidence les problèmes potentiels et mesurer les performances dans différentes configurations.&lt;/p&gt;

&lt;p&gt;De même, pour des raisons de temps de traitement, on teste les serveurs avec une base de données de 10 millions d’entrées, une extrapolation à 30 millions d’entrées sera effectuée.&lt;/p&gt;

&lt;p&gt;La plateforme &lt;strong&gt;OpenStack&lt;/strong&gt; a été configurée en conséquence, comme décrit dans l’article &lt;a href=&quot;/blog/construction-plateforme-test-de-charge-openstack/&quot;&gt;Construction d’une plateforme de test avec OpenStack&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;configuration-openldap&quot;&gt;Configuration OpenLDAP&lt;/h2&gt;

&lt;h3 id=&quot;principes-généraux&quot;&gt;Principes généraux&lt;/h3&gt;

&lt;p&gt;On configure donc deux serveurs disposant d’une base pour les données (&lt;strong&gt;worteks&lt;/strong&gt;), et d’une base pour stocker les opérations à répliquer (&lt;strong&gt;accessLog&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Le mode de réplication utilisé est &lt;strong&gt;delta-syncrepl&lt;/strong&gt;, qui optimise les données transmises en ne propageant que les valeurs d’attributs modifiées.&lt;/p&gt;

&lt;p&gt;La base de configuration est également répliquée afin que les modifications apportées à chaud puissent se propager automatiquement aux autres serveurs.&lt;/p&gt;

&lt;h3 id=&quot;la-configuration-en-détail&quot;&gt;La configuration en détail&lt;/h3&gt;

&lt;p&gt;La configuration se présente sous la forme d’une arborescence :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cn=config/
 |
 +-- cn=config.ldif
 |
 +-- cn=module{0}.ldif
 |
 +-- cn={0}schema/
 |
 +-- cn=schema.ldif
 |
 +-- olcDatabase={-1}frontend.ldif
 |
 +-- olcDatabase={0}config/
 |    |
 |    +-- olcOverlay={0}syncprov.ldif
 |
 +-- olcDatabase={0}config.ldif
 |
 +-- olcDatabase={1}monitor.ldif
 |
 +-- olcDatabase={2}mdb/
 |    |
 |    +-- olcOverlay={0}syncprov.ldif
 |
 +-- olcDatabase={2}mdb.ldif
 |
 +-- olcDatabase={3}mdb/
 |    |
 |    +-- olcOverlay={0}syncprov.ldif
 |    |
 |    +-- olcOverlay={1}accesslog.ldif
 |
 +-- olcDatabase={3}mdb.ldif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Les paragraphes suivants décrivent l’intégralité de la configuration.&lt;/p&gt;

&lt;h4 id=&quot;cnconfig&quot;&gt;cn=config&lt;/h4&gt;

&lt;p&gt;Voici le contenu de la configuration :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: cn=config
objectClass: olcGlobal
cn: config
# Les connections anonymes sont interdites
olcDisallows: bind_anon
# Localisation du fichier de log
olcLogFile: /var/log/openldap/slapd.log
# Sync + stats
olcLogLevel: 16640
olcRequires: authc
# Premier serveur
olcServerID: 11 ldap://openldap1:10389
# Second serveur
olcServerID: 12 ldap://openldap2:10389
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;cnmodule0ldif&quot;&gt;cn=module{0}.ldif&lt;/h4&gt;

&lt;p&gt;Trois modules sont chargés :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;MDB&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;AccessLog&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SyncProv&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
# Chemin de stockage des modules
olcModulePath: /usr/local/openldap/libexec/openldap/
# Base mdb
olcModuleLoad: {0}back_mdb
# Provider de réplication
olcModuleLoad: {1}syncprov
# Base access log
olcModuleLoad: {2}accesslog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;olcdatabase-1frontendldif&quot;&gt;olcDatabase={-1}frontend.ldif&lt;/h4&gt;

&lt;p&gt;Cet élément de configuration ne contient aucune information globale dans notre plateforme de test.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcDatabase={-1}frontend
objectClass: olcDatabaseConfig
olcDatabase: {-1}frontend
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase0configldif&quot;&gt;olcDatabase={0}config.ldif&lt;/h4&gt;

&lt;p&gt;C’est dans cette entrée que l’on trouve les deux règles de réplication pour la configuration. La raison pour laquelle deux règles sont définies est que cela permet de copier cette configuration intégralement sur l’autre serveur : seules les règles qui ne correspondent pas au serveur local seront actives.&lt;/p&gt;

&lt;p&gt;Note : Il faut faire attention à ce que les URLs utilisées comme valeur de l’attribut &lt;em&gt;olcSyncrepl&lt;/em&gt; pour le paramètre &lt;em&gt;provider&lt;/em&gt; correspondent &lt;strong&gt;exactement&lt;/strong&gt; au paramètre &lt;em&gt;-h&lt;/em&gt; passé en ligne de commande à &lt;em&gt;slapd&lt;/em&gt;, sinon le serveur va chercher à répliquer vers lui-même. Par exemple, pour la ligne de commande de lancement de &lt;em&gt;OpenLdap&lt;/em&gt; suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ slapd -h ldap://openldap1:10389 ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;il faut utiliser la configuration suivante pour &lt;em&gt;olcSyncrepl&lt;/em&gt; :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;olcSyncrepl: {0}rid=001 provider=ldap://openldap1:10389 ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Si on utilise l’addresse IP de &lt;em&gt;openldap1&lt;/em&gt; dans cette ligne, la réplication du serveur vers lui-même sera activée…&lt;/p&gt;

&lt;p&gt;Il est à noter que le mot de passe est en clair pour cet exemple, mais devrait techniquement être chiffré. Cela dit le mot de passe est également fourni en clair dans les directives de réplication, ce qui est nécessaire pour pouvoir s’authentifier sur le serveur distant.
Une meilleure solution consiste à mettre en œuvre une authentification via certificats, pour éviter ce problème, mais cela sort du cadre de cette étude.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
# Donne accès au user root
olcAccess: {0}to * by dn=&quot;gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=a
 uth&quot; manage by dn=&quot;cn=admin,cn=config&quot; manage by * none
olcRootDN: cn=admin,cn=config
# Mot de passe encodé en base 64 (ici : &apos;secret&apos;)
olcRootPW:: c2VjcmV0
# première directive de réplication de la configuration
olcSyncrepl: {0}rid=001 provider=ldap://openldap1:10389 binddn=&quot;cn=admin,cn=co
 nfig&quot; bindmethod=simple credentials=&quot;secret&quot; searchbase=&quot;cn=config&quot; type=refr
 eshAndPersist retry=&quot;5 5 300 +&quot; timeout=1
# seconde directive de réplication de la configuration
olcSyncrepl: {1}rid=002 provider=ldap://openldap2:10389 binddn=&quot;cn=admin,cn=co
 nfig&quot; bindmethod=simple credentials=&quot;secret&quot; searchbase=&quot;cn=config&quot; type=refr
 eshAndPersist retry=&quot;5 5 300 +&quot; timeout=1
# Autorise les updates sur ce serveur
olcMultiProvider: TRUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase0configolcoverlay0syncprovldif&quot;&gt;olcDatabase={0}config/olcOverlay={0}syncprov.ldif&lt;/h4&gt;

&lt;p&gt;Cette entrée se contente de déclarer le module &lt;em&gt;syncprov&lt;/em&gt; pour la base &lt;em&gt;config&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcOverlay={0}syncprov
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase1monitorldif&quot;&gt;olcDatabase={1}monitor.ldif&lt;/h4&gt;

&lt;p&gt;On définit les identifiants d’accès à la base monitor.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcDatabase={1}monitor
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcRootDN: cn=monitor
olcRootPW:: c2VjcmV0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase2mdbldif&quot;&gt;olcDatabase={2}mdb.ldif&lt;/h4&gt;

&lt;p&gt;On définit ici la configuration de la base &lt;em&gt;accesslog&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Un utilisateur spécifique doit être créé pour accéder à cette base. Son &lt;strong&gt;DN&lt;/strong&gt; est &lt;em&gt;uid=repl,ou=security,o=service,o=worteks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Cette base est assez importante pour conserver une grande quantité de modifications, mais il faut la purger régulièrement.
On verra quelle taille sera occupée après avoir appliqué 10 millions de modifications.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcDatabase={2}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
# Répertoire de stockage
olcDbDirectory: /usr/local/openldap/data/accesslog
# Le point d&apos;entrée de la base
olcSuffix: cn=accesslog
# Accès autorisé au user uid=repl
olcAccess: {0}to * by dn.base=&quot;uid=repl,ou=security,o=service,o=worteks&quot; read by * break
# Cet utilisateur n&apos;a pas de restriction
olcLimits: {0}dn=&quot;uid=repl,ou=security,o=service,o=worteks&quot; size=unlimited time=unl
 imited
# La base est read only (seul le serveur y écrira)
olcReadOnly: TRUE
# Le root user
olcRootDN: cn=accesslog
# et son mot de passe (&apos;secret&apos;)
olcRootPW:: c2VjcmV0
# Stocke le ContextCSN dans une subentry cn=ldapsync
olcSyncUseSubentry: TRUE
# La base est monitorée
olcMonitoring: TRUE
# Écrit les données toutes les minutes en base
olcDbCheckpoint: 0 1
# Les données ne sont pas immédiatement écrites sur disque
olcDbNoSync: TRUE
# Les index déclarés
olcDbIndex: default eq
olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart,reqDN,reqSession
# Taille maximale de la base, ici 40Go
olcDbMaxSize: 40000000000
# Nombre d&apos;entrées maximales traitées par un search
olcDbRtxnSize: 10000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase2mdbolcoverlay0syncprovldif&quot;&gt;olcDatabase={2}mdb/olcOverlay={0}syncprov.ldif&lt;/h4&gt;

&lt;p&gt;Cette entrée déclare le module &lt;em&gt;syncprov&lt;/em&gt; pour la base &lt;em&gt;accesslog&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La particularité est que l’on positionne le flag &lt;em&gt;olcSpNoPresent&lt;/em&gt; à &lt;strong&gt;TRUE&lt;/strong&gt; car on ne souhaite pas que la phase &lt;em&gt;‘present’&lt;/em&gt; de l’algorithme de réplication soit activée. Cette phase permet de déterminer les entrées qui ont été supprimées sur le serveur distant, pour pouvoir les supprimer localement. Cela n’a pas de sens pour une base de log.&lt;/p&gt;

&lt;p&gt;Le flag &lt;em&gt;olcSpReloadHint&lt;/em&gt; doit être positionné à &lt;strong&gt;TRUE&lt;/strong&gt; pour la base &lt;em&gt;accesslog&lt;/em&gt;. Cela force une mise à jour au redémarrage de la réplication.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcOverlay={0}syncprov
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
# La phase &apos;present&apos; de la réplication est désactivée.
olcSpNoPresent: TRUE
olcSpReloadHint: TRUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase3mdbldif&quot;&gt;olcDatabase={3}mdb.ldif&lt;/h4&gt;

&lt;p&gt;Cette entrée définit la configuration de la base de données proprement dite.&lt;/p&gt;

&lt;p&gt;On y décrit les &lt;strong&gt;ACLs&lt;/strong&gt; (règles d’accès), les limites, l’utilisateur d’administration (dont le mot de passe est en clair ici, mais devra être haché en production), les directives de réplication.&lt;/p&gt;

&lt;p&gt;Concernant ces dernières, on en a autant qu’il y a de serveurs présents dans l’architecture &lt;strong&gt;MMR&lt;/strong&gt;, sachant que celle correspondant au serveur lui-même sera ignorée. Ici, on a deux directives, une seule sera activée.&lt;/p&gt;

&lt;p&gt;Leur configuration indique :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;L’identifiant de réplication (&lt;strong&gt;RID&lt;/strong&gt;) utilisé par le client pour identifier la réplication. Dans notre cas on a 2 serveurs, le local et le distant, donc il y a deux lignes &lt;em&gt;olcSyncrepl&lt;/em&gt; avec deux &lt;em&gt;RID&lt;/em&gt; différents. Il est à noter qu’on réplique également la configuration, donc il faut faire attention à ce que les &lt;em&gt;RID&lt;/em&gt; soient différents de ceux utilisés pour la configuration.&lt;/li&gt;
  &lt;li&gt;L’URL du serveur à contacter&lt;/li&gt;
  &lt;li&gt;L’utilisateur de réplication : &lt;em&gt;uid=repl,ou=security,o=service,o=worteks&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;La base &lt;em&gt;accesslog&lt;/em&gt; à utiliser : &lt;em&gt;cn=accesslog&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Le filtre sur cette base, à savoir les objets en update (&lt;em&gt;objectClass=auditWriteObject&lt;/em&gt;) et qui ont été validés (&lt;em&gt;reqResult=0&lt;/em&gt;). A noter que, comme la base a été configurée pour ne stocker que les modifications réussies, ce dernier filtre n’est pas nécessaire.&lt;/li&gt;
  &lt;li&gt;Le type de réplication (&lt;em&gt;refreshAndPersist&lt;/em&gt;) : on se connecte, on rafraîchit la base puis on reste à l’écoute de toute mise à jour indéfiniment&lt;/li&gt;
  &lt;li&gt;Les directives &lt;em&gt;retry&lt;/em&gt; en cas de déconnexion, ici toutes les 5 secondes sans interruption&lt;/li&gt;
  &lt;li&gt;Le temps d’attente maximum pour valider la connexion à un serveur distant, ici 1 seconde&lt;/li&gt;
  &lt;li&gt;Le format des données reçues, ici avec le paramètre &lt;em&gt;syncdata=accesslog&lt;/em&gt;, on ne recevra que les différences entre l’entrée initiale et l’entrée modifiée.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La base est &lt;em&gt;MultiProvider&lt;/em&gt;, ce qui signifie que le serveur pourra recevoir des modifications.&lt;/p&gt;

&lt;p&gt;Elle est configurée pour ne pas écrire les données immédiatement sur le disque, pour des raisons de performances (&lt;em&gt;olcDbNoSync&lt;/em&gt; à &lt;strong&gt;TRUE&lt;/strong&gt;). Les données sont alors écrites sur disque quand plus de 1Mo de données ont été reçues, ou qu’une minute s’est écoulée. Le risque de perte en cas de crash est faible.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcDatabase={3}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {3}mdb
# Le répertoire de stockage des données
olcDbDirectory: /usr/local/openldap/data/worteks/
# Le DN de la racine
olcSuffix: o=service,o=worteks
# Autorise l&apos;utilisateur root à se connecter
# ainsi que l&apos;utilisateur de réplication en read only
# Les utilisateurs anonymes sont rejetés
olcAccess: {0}to * by dn=&quot;gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=a
 uth&quot; read by dn=&quot;uid=repl,ou=security,o=service,o=worteks&quot; read by anonymous a
 uth by * none break
# L&apos;attribut userPassword n&apos;est jamais accessible
olcAccess: {1}to attrs=userPassword by * none
# La branche ou=security n&apos;est pas accessible
olcAccess: {2}to dn.subtree=&quot;ou=security,o=service,o=worteks&quot; by * none
olcAccess: {3}to * by * none
# Les entrées ajoutées seront contrôlées avec les ACLs
olcAddContentAcl: TRUE
# L&apos;utilisateur de réplication n&apos;a pas de limite
olcLimits: {0}dn=&quot;uid=repl,ou=security,o=service,o=worteks&quot; size=unlimited tim
 e=unlimited
# L&apos;utilisateur root n&apos;a pas de limite
olcLimits: {1}dn=&quot;gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth&quot; siz
 e=unlimited time=unlimited
# DN de l&apos;administrateur de la base
olcRootDN: cn=admin,o=service,o=worteks
# Password en clair (&apos;secret&apos;)
olcRootPW:: c2VjcmV0
# Première directive de réplication
olcSyncrepl: {0}rid=012 provider=ldap://openldap1:10389 binddn=&quot;uid=repl,ou=se
 curity,o=service,o=worteks&quot; bindmethod=simple credentials=&quot;secret&quot; searchbase
 =&quot;o=service,o=worteks&quot; logbase=&quot;cn=accesslog&quot; logfilter=&quot;(&amp;amp;(objectClass=audit
 WriteObject)(reqResult=0))&quot; type=refreshAndPersist retry=&quot;5 +&quot; timeout=1 sync
 data=accesslog
# Seconde directive de réplication
olcSyncrepl: {1}rid=011 provider=ldap://openldap2:10389 binddn=&quot;uid=repl,ou=se
 curity,o=service,o=worteks&quot; bindmethod=simple credentials=&quot;secret&quot; searchbase
 =&quot;o=service,o=worteks&quot; logbase=&quot;cn=accesslog&quot; logfilter=&quot;(&amp;amp;(objectClass=audit
 WriteObject)(reqResult=0))&quot; type=refreshAndPersist retry=&quot;5 +&quot; timeout=1 sync
 data=accesslog
# Serveur en MMR
olcMultiProvider: TRUE
# Les données sont écrites chaque minute
olcDbCheckpoint: 0 1
# Pas d&apos;écriture sur disque immédiate
olcDbNoSync: TRUE
# Les index à déclarer
olcDbIndex: entryUUID eq
olcDbIndex: objectClass eq
olcDbIndex: entryCSN eq
olcDbIndex: uid eq
olcDbIndex: mailboxServiceIMAP eq
olcDbIndex: mailboxServicePOP eq
olcDbIndex: mailPrimaryAddress eq
olcDbIndex: mailAlternativeAddress eq
olcDbIndex: mailboxHiddenAlias eq
# Taille maximale de la base, 80Gb
olcDbMaxSize: 85899345920
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase3mdbolcoverlay0syncprovldif&quot;&gt;olcDatabase={3}mdb/olcOverlay={0}syncprov.ldif&lt;/h4&gt;

&lt;p&gt;La configuration de l’overlay &lt;em&gt;syncprov&lt;/em&gt; pour la base de données spécifie une taille de log en mémoire de 10 000 opérations pour éviter de lire dans la base &lt;em&gt;accesslog&lt;/em&gt; si une déconnexion courte a lieu.
On n’écrit l’attribut &lt;em&gt;contextCSN&lt;/em&gt; qu’une fois toutes les 100 opérations ou toutes les 10 minutes, ce qui évite des écritures trop fréquentes. Avec 300 000 modifications par jour (réparties sur 10h), cela représente 500 mises à jour par minute, donc 5 mises à jour des données par minute pendant la journée, et une modification toutes les 10 minutes hors période d’activité. C’est un compromis acceptable, mais il est possible d’augmenter le nombre de modifications à appliquer avant mise à jour du &lt;em&gt;contextCSN&lt;/em&gt; à 500 pour qu’il ne soit effectué qu’une fois par minute.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcOverlay={0}syncprov
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
# Le _contextCSN_ n&apos;est écrit sur disque que toutes les 100 opérations ou 10 minutes
olcSpCheckpoint: 100 10
# Taille de la session conservée en mémoire, ici 10 000 opérations
olcSpSessionlog: 10000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;olcdatabase3mdbolcoverlay1accesslogldif&quot;&gt;olcDatabase={3}mdb/olcOverlay={1}accesslog.ldif&lt;/h4&gt;

&lt;p&gt;La configuration de l’overlay &lt;em&gt;accesslog&lt;/em&gt; utilisé pour la réplication de la base de données :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: olcOverlay={1}accesslog
objectClass: olcAccessLogConfig
olcOverlay: {1}accesslog
# Pointe vers la base accesslog à utiliser
olcAccessLogDB: cn=accesslog
# Ne garde que les opérations d&apos;écriture (add, delete, modify, moddn)
olcAccessLogOps: writes
# Garde les entrées un maximum de 7 jours, et effectue la purge tous les jours
olcAccessLogPurge: 07+00:00 01+00:00
# Ne garde que les opérations ayant réussi
olcAccessLogSuccess: TRUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;la-préparation-des-données&quot;&gt;La préparation des données&lt;/h2&gt;

&lt;p&gt;Les tests effectués montrent qu’on peut appliquer jusqu’à 2000 modifications par seconde avec un serveur disposant de 8 Go de mémoire. Il faut donc 1h30 pour les appliquer toutes dans le cas des 10 millions de modifications (10 000 000 modifications / 2000 par seconde / 3600 secondes par heure -&amp;gt; 1h 23mins)&lt;/p&gt;

&lt;p&gt;Bien évidemment, cela dépend de l’infrastructure physique. La base utilisée est &lt;strong&gt;MDB&lt;/strong&gt;, qui n’accepte pas d’écriture concurrente, donc une écriture en base ne pourra se faire que quand la précédente aura été effectuée. Le facteur important concernant les performances est la taille mémoire disponible : l’objectif est que la totalité de la base &lt;strong&gt;MDB&lt;/strong&gt; soit montée en mémoire. On analysera le comportement de la base quand ce n’est pas le cas.&lt;/p&gt;

&lt;p&gt;Chaque entrée contient de nombreux attributs et, ceux-ci pouvant être indexés, il convient d’étudier la base chargée avec un nombre significatif d’entrées pour estimer sa taille.&lt;/p&gt;

&lt;p&gt;En utilisant la commande _mdb_stat -a &lt;database&gt;_, on obtient le listing suivant, dans lequel nous prenons les _&apos;branch pages&apos;_ et _&apos;leaf pages&apos;_, qui contiennent le **B-tree**, que l&apos;on multiplie par la taille d&apos;une page, soit 4096 octets, pour avoir la taille réellement occupée par les données :&lt;/database&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ mdb_stat -a /usr/local/openldap/data/worteks
Status of Main DB
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 14

  Total: 4Ko

Status of ad2i
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 35

  Total: 4Ko

Status of dn2i
  Tree depth: 4
  Branch pages: 594
  Leaf pages: 133335
  Overflow pages: 0
  Entries: 20000013

  Total: 4096 * (594 + 133 335) = 536 Mo

Status of entryCSN
  Tree depth: 3
  Branch pages: 55
  Leaf pages: 13596
  Overflow pages: 0
  Entries: 10000006

 Total: 4096 * (55 + 13 596) = 54 Mo

Status of entryUUID
  Tree depth: 4
  Branch pages: 451
  Leaf pages: 77171
  Overflow pages: 0
  Entries: 10000006

  Total = 4096 * (451 + 77 171) = 310 Mo

Status of id2e
  Tree depth: 4
  Branch pages: 29118
  Leaf pages: 4935050
  Overflow pages: 0
  Entries: 10000006

  Total = 4096 * (29 118 + 4 935 050) = 19,9 Go

Status of id2v
  Tree depth: 0
  Branch pages: 0
  Leaf pages: 0
  Overflow pages: 0
  Entries: 0

  Total: 0

Status of ixck
  Tree depth: 0
  Branch pages: 0
  Leaf pages: 0
  Overflow pages: 0
  Entries: 0

  Total: 0

Status of mailAlternativeAddress
  Tree depth: 4
  Branch pages: 453
  Leaf pages: 77987
  Overflow pages: 0
  Entries: 10000000

  Total = 4096 * (453 + 77 987) = 314 Mo

Status of mailPrimaryAddress
  Tree depth: 4
  Branch pages: 441
  Leaf pages: 77862
  Overflow pages: 0
  Entries: 10000000

  Total = 4096 * (441 + 77 862) = 313 Mo

Status of objectClass
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 36

  Total = 4 Ko

Status of MailboxHiddenAlias
  Tree depth: 4
  Branch pages: 448
  Leaf pages: 77683
  Overflow pages: 0
  Entries: 10000000

  Total = 4096 * (448 + 77 683) = 313 Mo

Status of MailboxServiceIMAP
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 3

  Total = 4 Ko

Status of MailboxServicePOP
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 3

  Total = 4 Ko

Status of uid
  Tree depth: 4
  Branch pages: 465
  Leaf pages: 77931
  Overflow pages: 0
  Entries: 10000001

  Total = 4096 * (465 + 77 931) = 313 Mo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cette base occupe donc 19,9 Go pour les données (table &lt;em&gt;id2e&lt;/em&gt;), 1,6 Go pour les index et 0,5 Go pour les &lt;strong&gt;DNs&lt;/strong&gt;, soit un total d’environ 22 Go.&lt;/p&gt;

&lt;p&gt;On peut croiser cette information avec les données récupérées avec la commande _mdb_stat -e &lt;database&gt;_ :&lt;/database&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ mdb_stat -e /usr/local/openldap/data/worteks
Environment Info
  Map address: (nil)
  Map size: 137438953472
  Page size: 4096
  Max pages: 33554432
  Number of pages used: 5650219
  Last transaction ID: 9691279
  Max readers: 126
  Number of readers used: 7
Status of Main DB
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 14
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On constate qu’il y a 5 650 219 pages utilisées, avec une taille de 4 Ko par page, soit un total de 22,6 Go.&lt;/p&gt;

&lt;p&gt;Le chiffre diffère légèrement, car il y a des pages libres qui seront réutilisées dans le retour de la seconde commande. On retiendra la taille de 23 Go par sécurité.&lt;/p&gt;

&lt;p&gt;A ce chiffre, il faut ajouter la place occupée par la base &lt;em&gt;access_log&lt;/em&gt; après injection de 10 millions de modifications :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Environment Info
  Map address: (nil)
  Map size: 137438953472
  Page size: 4096
  Max pages: 33554432
  Number of pages used: 1511239
  Last transaction ID: 4811538
  Max readers: 126
  Number of readers used: 5
Status of Main DB
  Tree depth: 1
  Branch pages: 0
  Leaf pages: 1
  Overflow pages: 0
  Entries: 12
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pour 1 511 239 pages de 4 Ko, cela correspond à 6 Go supplémentaires.&lt;/p&gt;

&lt;p&gt;On considère donc qu’avec 23 Go + 6 Go, soit 29 Go, une taille mémoire de 32 Go permet de conserver la totalité de la base en mémoire, ce qui évitera des I/O lors de la mise à jour des B-tree. En effet, si on dispose d’une taille mémoire inférieure, il y aura nécessairement des lectures de pages sur disque pour remonter la structure et les feuilles en mémoire. En pratique, moins on dispose de mémoire, plus il y a d’entrées sorties et donc de ralentissements.&lt;/p&gt;

&lt;p&gt;Voici par exemple ce que prend l’injection de 10 millions d’entrées selon la taille mémoire affectée au serveur (le fichier contenant les entrées fait 9,4 Gb) :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+----------------+-------------------+----------+
| Taille mémoire | Temps d&apos;injection | Entrée/s |
+----------------+-------------------+----------+
| 2Gb            | 11h 37m           | 239/s    |
+----------------+-------------------+----------+
| 3Gb            | 1h 39m 55s        | 1668/s   |
+----------------+-------------------+----------+
| 3.5Gb          | 36m 59s           | 4625/s   |
+----------------+-------------------+----------+
| 4Gb            | 8m 50s            | 18 867/s |
+----------------+-------------------+----------+
| 8Gb            | 8m 20s            | 20 000/s |
+----------------+-------------------+----------+
| 16Gb           | 7m 08s            | 23 364/s |
+----------------+-------------------+----------+
| 32Gb           | 7m 41s            | 24 390/s |
+----------------+-------------------+----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jusqu’à un certain point, le manque de mémoire est pénalisant lors de l’injection de données dans la base, puis rajouter de la mémoire n’améliore que marginalement les temps d’exécution. L’inflexion est assez brutale.&lt;/p&gt;

&lt;p&gt;Si on considère l’index de l’attribut &lt;strong&gt;entryUUID&lt;/strong&gt;, dont les données sont les suivantes :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Status of entryUUID
  Tree depth: 4
  Branch pages: 451
  Leaf pages: 77171
  Overflow pages: 0
  Entries: 10000006
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;on constate que le nombre de pages intermédiaires ne représente que 0,6% des pages utilisées pour cet index. Le ratio est le même pour la table &lt;strong&gt;id2e&lt;/strong&gt; qui contient les entrées. Plus on dispose de mémoire, plus on augmente la probabilité que les pages intermédiaires soient présentes en mémoire. Cela limite les I/O disque, augmentant les performances de plusieurs ordres de magnitude. C’est ce qu’on constate dès 3 Gb de mémoire.&lt;/p&gt;

&lt;p&gt;Par contre, il s’agit d’un scénario d’écriture où les données sont écrites séquentiellement, qui n’est pas représentatif d’un fonctionnement normal d’une base &lt;strong&gt;LDAP&lt;/strong&gt;. Dans un scénario de lecture où les données lues se répartiront aléatoirement sur l’ensemble des pages, ce niveau de mémoire va entraîner de nombreuses lectures de pages terminales. Il convient, dans la mesure du possible, de monter la totalité des pages en mémoire et donc d’augmenter celle-ci pour correspondre à la taille totale de la base de données.
Pour une base de 30 millions d’entrées, on peut considérer que 32 Gb de mémoire sont suffisants pour l’injection, mais insuffisants pour monter la totalité de la base en mémoire. En extrapolant les chiffres obtenus pour 10 millions d’entrées, on peut estimer qu’il faut 96 Gb de mémoire (32 Gb x 3 pour un triplement du nombre d’entrées) pour s’assurer que toute la base sera en mémoire à terme et ainsi obtenir la meilleure performance possible en lecture et en écriture.&lt;/p&gt;

&lt;h3 id=&quot;la-copie-des-données&quot;&gt;La copie des données&lt;/h3&gt;

&lt;p&gt;Dans notre cas, on va utiliser des serveurs disposant de 16 Go de mémoire, dont les bases de données et &lt;em&gt;accesslog&lt;/em&gt; ont été supprimées au préalable.&lt;/p&gt;

&lt;p&gt;Le nettoyage des bases se fait de la façon suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cd /usr/local/openldap/data
$ rm accesslog/*
$ rm worteks/*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Cette suppression doit s’effectuer sur les deux serveurs.&lt;/p&gt;

&lt;p&gt;On va ensuite charger deux jeux de données :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;La base, qui construit l’arborescence. Il s’agit d’une dizaine d’entrées. La commande suivante effectue ce travail :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ slapadd -b &quot;o=service,o=worteks&quot; -F /usr/local/openldap/etc/openldap/slapd.d -l /home/debian/base.ldif -S 11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Les données, soit 10 millions d’entrées avec une structure telle que :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dn: uid=&amp;lt;UID&amp;gt;,cn=mailboxes,ou=fr,o=service,o=worteks
objectClass: inetOrgPerson
objectClass: mailbox
objectClass: simpleSecurityObject
objectClass: uidObject
cn: cn&amp;lt;UID&amp;gt;
sn: sn&amp;lt;UID&amp;gt;
uid: &amp;lt;UID&amp;gt;
userPassword:: MDAwMDAwMDAwMA==
displayName: displayName&amp;lt;UID&amp;gt;
givenName: givenName&amp;lt;UID&amp;gt;
mailAlternativeAddress: alias&amp;lt;UID&amp;gt;@worteks.fr
mailPrimaryAddress: &amp;lt;UID&amp;gt;@worteks.fr
mailboxAccountStatus: active
mailboxDomainId: 1
mailboxGroupName: RETAIL
mailboxHiddenAlias: hiddenAlias&amp;lt;UID&amp;gt;@worteks.fr
mailboxQuota: 10737418240
mailboxServiceAntivirusAll: FALSE
mailboxServiceIMAP: FALSE
mailboxServicePOP: FALSE
mailboxServiceSMTPIn: TRUE
mailboxServiceSMTPOut: TRUE
mailboxServiceWebmail: TRUE
mailboxSite: 1
mailboxStorage: 0
mailboxUserOidVal: MELOFR-200-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA==
mailboxUserServiceOidVal: 0030003000300030003000300030003000300030
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Une entrée comporte 24 attributs et les attributs suivants sont indexés :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;entryUUID&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;objectClass&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;entryCSN&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;uid&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;mailboxServiceIMAP&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;mailboxServicePOP&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;mailPrimaryAddress&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;mailAlternativeAddress&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;mailboxHiddenAlias&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATTENTION!!! Si les injections de données se font avec le user root, la base de données n’aura pas les bons droits et ne pourra pas être chargée au démarrage de slapd. Il conviendra de faire un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chown ldap:ldap /usr/local/openldap/data/worteks/*&lt;/code&gt; avant le lancement de slapd.&lt;/p&gt;

&lt;p&gt;L’injection se fait via la commande :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ slapadd -q -w -s -b &quot;o=service,o=worteks&quot; -F /usr/local/openldap/etc/openldap/slapd.d -l /tmp/entries.ldif -S 11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Les options utilisées pour ce premier import sont les suivantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;-q : Quick mode. On suppose que les données sont correctes.&lt;/li&gt;
  &lt;li&gt;-w : Une fois toutes les entrées injectées, le &lt;em&gt;contextCSN&lt;/em&gt; va être mis à jour avec l’&lt;em&gt;entryCSN&lt;/em&gt; le plus récent (donc celui de la dernière valeur injectée)&lt;/li&gt;
  &lt;li&gt;-s : Pas de vérification du schéma&lt;/li&gt;
  &lt;li&gt;-S : L’identifiant du serveur, &lt;em&gt;ServerID&lt;/em&gt;, ici 11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une fois l’injection initiale effectuée sur un des serveurs, il faut exporter les données et les recharger sur les autres serveurs.&lt;/p&gt;

&lt;p&gt;On commence par exporter les données du premier serveur par la commande suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ slapcat -b &quot;o=service,o=worteks&quot; -F /usr/local/openldap/etc/openldap/slapd.d -l /tmp/all.ldif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On déplace le résultat sur le second serveur, puis on injecte les données par la commande suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ slapadd -b &quot;o=service,o=worteks&quot; -F /usr/local/openldap/etc/openldap/slapd.d -l /tmp/all.ldif -q -s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ici, on utilise également les options -q (pas de vérification) et -s (pas de contrôle du schéma), mais pas l’option -w. L’option -S permet de donner le serverID.&lt;/p&gt;

&lt;p&gt;L’opération prend environ 7 minutes sur ce serveur, comme précédemment.&lt;/p&gt;

&lt;p&gt;A ce stade, les deux serveurs contiennent les mêmes informations, toutes avec la même date. Les bases sont donc équivalentes.&lt;/p&gt;

&lt;p&gt;On le vérifie après relance des deux serveurs OpenLDAP :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# slapd-cli start
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Launching OpenLDAP configuration test...
slapd-cli: [OK] OpenLDAP configuration test successful
slapd-cli: [INFO] Launching OpenLDAP...
slapd-cli: [OK] File descriptor limit set to 1024
slapd-cli: [ALERT] No PID file for OpenLDAP
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Même opération sur le second serveur.&lt;/p&gt;

&lt;p&gt;Comme on est en delta-syncrepl, il faut déclencher la réplication, ce qui se fait en effectuant une modification sur le premier serveur, ce qui synchronise les deux bases. La raison pour laquelle cette étape est nécessaire est que le mécanisme de réplication s’appuie sur le contenu de la base &lt;em&gt;accesslog&lt;/em&gt;, qui est vide. Cela permet de diffuser les &lt;em&gt;contextCSN&lt;/em&gt; sur chaque serveur.&lt;/p&gt;

&lt;p&gt;Normalement, on doit retrouver le &lt;em&gt;contextCSN&lt;/em&gt; des deux serveurs sur chaque serveur.&lt;/p&gt;

&lt;p&gt;Sur &lt;strong&gt;OpenLDAP1&lt;/strong&gt; :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;20250625130822.612684Z#000000#000#000000
20250625135436.855194Z#000000#00c#000000 -&amp;gt; Serveur ID 12 (&apos;0x0b&apos; en troisième position)
20250625135502.701625Z#000000#00b#000000 -&amp;gt; Serveur ID 11 (&apos;0x0c&apos; en troisième position)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Sur &lt;strong&gt;OpenLDAP2&lt;/strong&gt; :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;20250625130822.612684Z#000000#000#000000
20250625135502.701625Z#000000#00b#000000 -&amp;gt; Serveur ID 11 (&apos;0x0b&apos; en troisième position)
20250625135922.024564Z#000000#00c#000000 -&amp;gt; Serveur ID 12 (&apos;0x0c&apos; en troisième position)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On est prêt pour l’étape suivante.&lt;/p&gt;

&lt;h3 id=&quot;injection-des-modifications&quot;&gt;Injection des modifications&lt;/h3&gt;

&lt;p&gt;On va donc appliquer une modification sur 10 millions d’entrées. Cette modification va être générée par un script prenant comme template ce fichier :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;DN: uid=&amp;lt;UID&amp;gt;,cn=mailboxes,ou=fr,o=service,o=worteks
changetype: modify
replace: mailboxServiceAntivirusAll
mailboxServiceAntivirusAll: TRUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;qui va être appliquée via un &lt;em&gt;ldapModify&lt;/em&gt; à toutes les entrées, le résultat étant stocké dans le fichier mod.ldif. On boucle pour remplacer l’UID par la valeur de chaque entrée.&lt;/p&gt;

&lt;p&gt;La commande est la suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ldapmodify -x -H ldap://openldap1:10389 -D &quot;cn=admin,o=service,o=worteks&quot; -w secret -f mod.ldif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Sur les serveurs de test, cela applique environ 2200 modifications par seconde. Il faut donc environ 1h30 pour que toutes les modifications soient appliquées et répliquées. Sur une base de 30 millions d’entrées, cela va prendre près de 5h.&lt;/p&gt;

&lt;p&gt;Il est à noter qu’en modifiant le paramètre &lt;strong&gt;olcDbNoSync&lt;/strong&gt; de &lt;strong&gt;TRUE&lt;/strong&gt; à &lt;strong&gt;FALSE&lt;/strong&gt;, l’injection se fait au rythme de 250 modifications par seconde, soit environ 9 fois plus lentement!&lt;/p&gt;

&lt;p&gt;La raison étant que les données sont écrites lors de chaque modification, ralentissant fortement le traitement. La contrepartie en production, c’est qu’il y a un risque de perte de données, si le serveur est arrêté brutalement.&lt;/p&gt;

&lt;p&gt;Ce risque est compensé par le fait qu’il faudrait l’arrêt de l’ensemble des serveurs simultanément pour que les données ne soient pas enregistrées, la réplication étant déclenchée dès l’enregistrement local des données sur un serveur.&lt;/p&gt;

&lt;p&gt;Est-il possible d’améliorer ce temps d’injection ? En pratique, il est possible de basculer sur une commande passée serveur arrêté, &lt;strong&gt;slapmodify&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La seconde solution consiste à arrêter les bases, appliquer les modifications avec un slapmodify, exporter la base avec un slapcat, copier l’export sur les différents serveurs, les recharger avec un slapadd après avoir purgé les bases, redémarrer les serveurs et faire une modification sur un des serveurs pour relancer la réplication.&lt;/p&gt;

&lt;p&gt;Ces opérations prennent un peu moins d’une heure (slapmodify : 10 minutes, slapcat : 10 minutes, slapadd sur les serveurs : 10 minutes, plus le temps de copie et les manipulations), mais peuvent être scriptées. Il s’agit néanmoins d’une opération qui se mène à froid, ce qui interrompt le service pendant sa durée. Il est néanmoins possible de limiter la durée de coupure à 10 minutes, le temps nécessaire pour appliquer localement les modifications. La manipulation est plus complexe, il faut relancer le serveur après application des modifications, puis faire un &lt;em&gt;ldapsearch&lt;/em&gt; à chaud, et injecter le résultat dans la seconde base qui, elle, a été maintenue arrêtée. Une fois ces manipulations terminées, on peut relancer le second serveur, qui se met à jour avec le premier.&lt;/p&gt;

&lt;p&gt;Une alternative serait de garder les serveurs clients en lecture seule, réplication désactivée, le temps que la mise à jour des données et l’export soient effectués sur le premier serveur, suivi d’un redémarrage du serveur à jour, avec arrêt des serveurs clients, mise à jour de ceux-ci et redémarrage. Dans ce scénario, on n’aura qu’un service dégradé le temps de la mise à jour, mais accessible en lecture.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OpenLDAP&lt;/strong&gt; est une base performante, mais qui nécessite une attention particulière aux paramètres de configuration dès qu’on y stocke des données volumineuses. Une base de 30 millions d’entrées n’est pas un cas d’usage fréquent et il convient d’anticiper les opérations de maintenance.&lt;/p&gt;

&lt;p&gt;La taille de la mémoire allouée est le paramètre le plus crucial quand il s’agit d’obtenir les meilleures performances. Économiser sur la configuration physique est une garantie de surcoût à brève échéance.
Dans le cas d’écritures nombreuses, il est également critique de disposer d’un support physique rapide (SSD ou NVMe) et de se poser la question de l’arbitrage entre risque de perte et rapidité (on a vu qu’un facteur 9 en performance est à payer si on souhaite s’assurer d’écritures atomiques).&lt;/p&gt;

&lt;p&gt;Les autres éléments de configuration (index, structure de la base, ACLs, attributs multi-valués avec de nombreuses valeurs, etc) peuvent également impacter les performances, mais dans une moindre mesure. Ils pourront faire l’objet d’autres études.&lt;/p&gt;</content><author><name>Emmanuel LÉCHARNY</name></author><category term="LDAP" /><category term="Réplication" /><category term="OpenStack" /><summary type="html">Mener une campagne de test de charge de réplication avec OpenLDAP.</summary></entry></feed>