<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://kharmaodo.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kharmaodo.github.io/" rel="alternate" type="text/html" /><updated>2025-12-30T10:34:05+00:00</updated><id>https://kharmaodo.github.io/feed.xml</id><title type="html">Maodo DIOP | Architecte &amp;amp; Lead DevOps</title><subtitle> Partage d&apos;expertise en Architecture Micro-services, Java/Spring Boot et industrialisation DevOps. Réflexions sur la transformation digitale.</subtitle><author><name>Maodo DIOP</name></author><entry><title type="html">Cirriculum Vitae Again !</title><link href="https://kharmaodo.github.io/cv/" rel="alternate" type="text/html" title="Cirriculum Vitae Again !" /><published>2025-12-10T13:32:35+00:00</published><updated>2025-12-10T13:32:35+00:00</updated><id>https://kharmaodo.github.io/cvofcourse</id><content type="html" xml:base="https://kharmaodo.github.io/cv/"><![CDATA[<p>Maodo DIOP</p>

<table>
  <tbody>
    <tr>
      <td>Architecte Technique</td>
      <td>Lead DevOps (16+ ans d’expérience)</td>
    </tr>
  </tbody>
</table>

<p><strong>CONTACT &amp; INFORMATIONS PERSONNELLES</strong></p>

<p>● <strong>Tel</strong> : (+221)775708806 / 766288197</p>

<p>● <strong>Email</strong> : dmaodo@gmail.com</p>

<table>
  <tbody>
    <tr>
      <td>● <strong>Statut</strong> : Marié</td>
      <td><strong>Nationalité</strong> : Sénégalaise</td>
    </tr>
  </tbody>
</table>

<p>PROFIL PROFESSIONNEL</p>

<p>Architecte Technique Senior (16+ ans) spécialisé en <strong>Architecture à Micro-services</strong> et <strong>DevOps</strong>. Expertise prouvée dans la <strong>refonte de systèmes critiques</strong> (Télécoms, Finance) et le <strong>leadership technique</strong> (encadrement et mentoring d’équipes de développeurs). Expert de niveau 3 en <strong>Génie Logiciel (Java/Spring Boot)</strong> et méthodologies <em>Clean Architecture/Clean Code</em>.</p>

<p>COMPÉTENCES TECHNIQUES</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Catégorie</th>
      <th style="text-align: left">Compétences Niveau (3: Expert / 2: Avancé)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Génie Logiciel</strong></td>
      <td style="text-align: left">Java/JEE, Spring/SpringBoot (3), UML, Clean Architecture, Clean Code (3), Angular, Node.js (2), Ionic (1)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Architecture / BDD</strong></td>
      <td style="text-align: left">Architecture Micro-services, SQL (Oracle, Postgresql, MySql) (3), NoSQL (ELK, Mongo DB, Redis) (2)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Industrialisation / DevOps</strong></td>
      <td style="text-align: left">Docker (3), Maven (3), Kubernetes (2), Jenkins, SonarQube, GIT, Load Balancing (Haproxy, Apache)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Systèmes &amp; Outils</strong></td>
      <td style="text-align: left">Linux (2), Windows (3), Eclipse, Visual Studio (3)</td>
    </tr>
  </tbody>
</table>

<p>EXPÉRIENCES PROFESSIONNELLES</p>

<table>
  <tbody>
    <tr>
      <td>Senior Architecte</td>
      <td>SFR (France) - Télécoms</td>
    </tr>
  </tbody>
</table>

<p><strong>Janvier 2024 – Présent</strong></p>

<p>● Refonte de la messagerie vocale visuelle.</p>

<p>● Pilotage du <strong>Reverse Engineering</strong> du code existant.</p>

<p>● Rédaction des spécifications technico-fonctionnelles.</p>

<p>● <strong>Redéfinition et proposition</strong> d’architecture pour les modules de refonte (Micro-services).</p>

<table>
  <tbody>
    <tr>
      <td>Architecte Technique</td>
      <td>ADEPME (République du Sénégal) – PME <strong>Mai 2022 à Décembre 2023</strong></td>
    </tr>
  </tbody>
</table>

<p>● <strong>Définition et validation</strong> de l’architecture technique des micro-services. ● <strong>Mise en place de la chaîne DevOps complète</strong> (Docker, Jenkins, Sonar) pour l’industrialisation des systèmes.</p>

<p>● <strong>Encadrement technique</strong> et mentoring de l’équipe et des apprentis ingénieurs.</p>

<table>
  <tbody>
    <tr>
      <td>Consultant EXPERT, Lead Technique</td>
      <td>LA POSTE (France) - Télécoms <strong>Mars 2021 – Avril 2022</strong></td>
    </tr>
  </tbody>
</table>

<p>● Digitalisation des campagnes de tournées (géolocalisation des points d’attentions). ● <strong>Conception</strong> de l’architecture technique et applicative de nouveaux modules. ● <strong>Migration de données</strong> Cloudant vers CouchDB.</p>

<table>
  <tbody>
    <tr>
      <td>Consultant Trainer (Formateur)</td>
      <td>Campus Training DiverseIT : LA POSTE <strong>Mars 2021 à fin Mars 2021</strong></td>
    </tr>
  </tbody>
</table>

<p>● Formation théorique et pratique des futurs collaborateurs (junior et senior) sur la Stack ELK (ElasticSearch, Logstash, Kibana), GIT, et Cassandra (Big Data).</p>

<table>
  <tbody>
    <tr>
      <td>Consultant Expert (Load Balancing)</td>
      <td>Orange Botswana (Botswana) <strong>Janvier 2021 à Février 2021</strong></td>
    </tr>
  </tbody>
</table>

<p>● Mise en place de l’infrastructure de <strong>load-balancing</strong> du produit CRM &amp; 360 Customer View.</p>

<p>● Rédaction de la spécification technique détaillée et du coût de mise en œuvre.</p>

<table>
  <tbody>
    <tr>
      <td>Consultant Expert (Load Balancing)</td>
      <td>Orange Botswana (Botswana) <strong>Janvier 2021 à Février 2021</strong></td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Mise en place de l’infrastructure de load-balancing du produit CRM &amp; 360 Customer View.</li>
  <li>Rédaction de la spécification technique détaillée et du coût de mise en œuvre.</li>
</ul>

<table>
  <tbody>
    <tr>
      <td>Senior Backend Developer</td>
      <td>DGID(Rép. Sénégal) <strong>Mars 2020 à Décembre 2020</strong></td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Mise en place d’une plateforme de télédéclaration (MOBILE,SMS,USSD,SVI) basée sur une architecture micro-services et Restful-API.</li>
  <li>Implémentation du microservice de notification SMS (Twilio) et d’une infrastructure de monitoring.</li>
</ul>

<table>
  <tbody>
    <tr>
      <td>Application Architect - Lead Technique</td>
      <td>Orange (MALI) <strong>Novembre 2019 à Janvier 2020</strong></td>
    </tr>
  </tbody>
</table>

<p>● Transformation digitale : Initialisation des stacks et architecture technique (Restful API, Micro-services, front-end).</p>

<p>● <strong>Appui technique et mentoring</strong> d’une équipe de deux développeurs.</p>

<table>
  <tbody>
    <tr>
      <td>Technical Lead &amp; SAP Hybris Backend</td>
      <td>INWI (Maroc) – Télécoms <strong>Février 2019 à Novembre 2019</strong></td>
    </tr>
  </tbody>
</table>

<p>● <strong>Mise en place de l’environnement de développement industrialisé</strong> (Gitlab, Jenkins, Sonar).</p>

<p>● Application des <em>Best practices Git</em> avec SAP Hybris.</p>

<p>● <strong>Appui technique</strong> d’une équipe de huit développeurs.</p>

<table>
  <tbody>
    <tr>
      <td>Technical Lead</td>
      <td>Orange Sénégal – Télécoms</td>
    </tr>
  </tbody>
</table>

<p><strong>Septembre 2017 à Février 2019</strong></p>

<p>● Projet KBTR (KPI Business Real Time) : gestion des indicateurs KPIS en temps réel avec usage du <strong>Big Data (Hadoop, Hive)</strong>.</p>

<p>● Mise en place de l’environnement de développement (Microservices backend et frontend) et <em>Best practices</em> de Team Leading.</p>

<table>
  <tbody>
    <tr>
      <td>Technical Lead Dev</td>
      <td>WORDLINE (France) – Télécoms</td>
    </tr>
  </tbody>
</table>

<p><strong>Mai 2016 à Février 2017</strong></p>

<p>Gestion oneClick Deploy : gestion de configurations, livraisons et sauvegarde des serveurs.</p>

<p>Environnement de microservices.</p>

<table>
  <tbody>
    <tr>
      <td>Ingénieur Études et Développement</td>
      <td>Eiffage (France) – Transport <strong>Décembre 2015 à Mai 2016</strong></td>
    </tr>
  </tbody>
</table>

<p>● Projet AGATE APRR : Collecte et Valorisation des tickets de péages. ● <strong>Architecture</strong> : Batch de collecte, de basculement et de valorisation.</p>

<table>
  <tbody>
    <tr>
      <td>Ingénieur Études et Développement</td>
      <td>AVEC (Ministère des Transports, Sénégal)</td>
    </tr>
  </tbody>
</table>

<p><strong>Novembre 2014 à Novembre 2015</strong></p>

<p>● Sécurisation et numérisation des titres de transport.</p>

<p>● <strong>Architecture</strong> : Analyse conceptuelle et proposition de la solution. Développement des modules (référentiel, visites techniques, immatriculation).</p>

<table>
  <tbody>
    <tr>
      <td>Responsable technique des plateformes de télémédecine</td>
      <td>CIRET(UCAD) <strong>Novembre 2013 à Décembre 2014</strong></td>
    </tr>
  </tbody>
</table>

<p>● Analyse et développement des systèmes d’informations de collecte de données patient. ● <strong>Industrialisation</strong> : Mise en place de l’infrastructure WAN (DNS, Samba, SSH, Postfix/Exim, FTP) et de l’environnement développeur.</p>

<table>
  <tbody>
    <tr>
      <td>Full Stack Développeur</td>
      <td>Quality Center (Sénégal) – Centre d’Appel <strong>Octobre 2012 à Novembre 2013</strong></td>
    </tr>
  </tbody>
</table>

<p>● Conception et développement du Système d’Information interne (gestion des collaborateurs, paie, reporting).</p>

<p>● Déploiement du parc informatique et mise en place de la politique de sécurité (plus de 150 postes).</p>

<table>
  <tbody>
    <tr>
      <td>Full Stack Développeur</td>
      <td>DS21-Offshore Center (Sénégal) – Centre d’Appel <strong>Juin 2011 à Septembre 2012</strong></td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Développement du site de GrosBill (e-commerce).</li>
  <li>Rédaction de spécifications techniques et fonctionnelles.  Déploiement de l’application</li>
</ul>

<table>
  <tbody>
    <tr>
      <td>Full Stack Développeur et Formateur</td>
      <td>LABEL-DEV (Sénégal) – Offshoring <strong>Avril 2010 à Mai 2011</strong></td>
    </tr>
  </tbody>
</table>

<p>● Amélioration du module Statistique de la plateforme sportive WAZABET. ● Formateur sur les briques métiers (Smarty Templating, Pear_Cache, Doctrine(ORM)).</p>

<table>
  <tbody>
    <tr>
      <td>Consultant en audit d’applications</td>
      <td>ANGOKH Systems (Sénégal) <strong>Août 2010 à Septembre 2010</strong></td>
    </tr>
  </tbody>
</table>

<p>● Audit technique du système douanier GAINDE-Extension.</p>

<p>● Rédaction de l’audit technique et proposition des choix de nouvelles briques technologiques.</p>

<table>
  <tbody>
    <tr>
      <td>Chef de projet technique</td>
      <td>GSIE Technology (Sénégal) - Telecoms <strong>Avril 2010 à Septembre 2010</strong></td>
    </tr>
  </tbody>
</table>

<p>● Architecture technique du Movney.</p>

<p>● Implémentation de l’architecture technique. Administration des serveurs.</p>

<table>
  <tbody>
    <tr>
      <td>Backend Développeur</td>
      <td>Tringa Music Technology (Sénégal) - Telecoms <strong>Fevrier 2010 à Mars 2010</strong></td>
    </tr>
  </tbody>
</table>

<p>● Développement Backend et Frontend du portail Mobiciné (promotion artistes africains).</p>

<table>
  <tbody>
    <tr>
      <td>Ingénieur Logiciel TMA</td>
      <td>JOUVE (Sénégal)</td>
    </tr>
  </tbody>
</table>

<p><strong>Avril 2007 à Janvier 2010</strong></p>

<p>● Gestion des brevets d’invention (migration et refonte applicative) de l’INPI. ● Développement de l’intranet de gestion des marques et brevets de l’UE. Correction de bugs et développement du backend du portail OEB.</p>

<table>
  <tbody>
    <tr>
      <td>Ingénieur Logiciel TMA</td>
      <td>Ekondev (Sénégal)</td>
    </tr>
  </tbody>
</table>

<p><strong>Avril 2006 à Mars 2007</strong></p>

<p>● Développement backend et frontend pour la gestion de vente en ligne B2B.</p>

<table>
  <tbody>
    <tr>
      <td>Stagiaire TMA</td>
      <td>SINTI (Sénégal) Juin 2005 à Décembre 2005</td>
    </tr>
  </tbody>
</table>

<p>FORMATION</p>

<ul>
  <li>2005 : DESS 2TIC (Diplôme d’Études Supérieures Spécialisées), Université Gaston Berger Saint-Louis, Sénégal</li>
  <li>2004 : Maîtrise Informatique, Université Gaston Berger Saint-Louis, Sénégal</li>
  <li>2003 : Licence Informatique, Université Gaston Berger Saint-Louis, Sénégal</li>
</ul>

<p>ACTIVITÉS ACADÉMIQUES</p>

<p>Enseignements Universitaires (Depuis 2010)</p>

<p>● <strong>Domaines :</strong> Applications distribuées/JEE, Web Dynamique, Web Service &amp; Technologie XML, Microservices, Développement Web Fullstack.</p>

<p>● <strong>Institutions :</strong> UGB (depuis 2013), ESP (2010-2012), Université de Thiès, Université Alioune DIOP de Bambey.</p>

<p>Encadrements de Mémoires (Master 2 / Licence)</p>

<p>Université Gaston Berger de Saint-Louis :</p>

<p>● <strong>2024-2025:</strong> Permis de travail pour les employés des entreprises, Abidine Abdallahi ABIDINE, Master 2 MadDIS2CFPP UGB</p>

<p>● <strong>2024-2025:</strong> Réalisation d’une application intelligente de réclamation des clients au centre de Mauritel, Mlle Aïchétou Mamadou SOW, Master 2 MadDIS2,CFPP UGB</p>

<p>● <strong>2024-2025 (en cours) :</strong> Améliorer la productivité en industrialisant un environnement de développement par le biais des outils de containerisation, Maimouna GUEYE, Licence Professionnelle Génie Informatique, UGB</p>

<p>● <strong>2023-2024 :</strong> Solution de gestion d’achat et logistique de transport, KHAWLA MOHAMED YESLEM AYEDE, Master 2 MadDIS2, CFPP, UGB</p>

<p>● <strong>2023-2024 :</strong> Gestion facturation pour RIMTIC. BINT OUMRANA MOHAMED HAMDY 2022/2023 Master 2 MadDIS2,CFPP, UGB <br />
● <strong>2022-2023 :</strong> Mise en place d’une cartographie des volontaires pour la campagne de collecte de sang. Mme M’barcka Bekar Deida 2022/2023 Master 2 MadDIS2,CFPP, UGB ● <strong>2022-2023 :</strong> Études comparatives entre les Framework Restful Gin-Golang &amp; Spring Boot. El HACEN MAMADOU DIOP Master 2 MadDIS2, CFPP, UGB</p>

<p>● <strong>2022-2023 :</strong> État de l’art des services de paiements Et intégration avec la plateforme de commerce électronique Shopify Samba Oumar Ba Master 2 MadDIS2, CFPP, UGB ● <strong>2021-2022 :</strong> Mise en place d’une application hybride (web &amp; mobile) de Service de Nettoyage chez Qwalit Tech : CHOZEN. Moussa DIA,2021/2022 Master 2 MadDIS2, CFPP, UGB</p>

<p>● <strong>2021-2022 :</strong> Mise à niveau du progiciel de gestion des flux automatisé de transport, Analyse et Conception du module Importation. EL GHALIA Mohamed Salem,2021/2022 Master 2 MadDIS2, CFPP, UGB</p>

<p>● <strong>2021-2022 :</strong> Analyse et conception d’un logiciel de transport et transit en : Analyse et Conception du module exportation. VATIMETOU MOHAMED HAMDI,2021/2022 Master 2 MadDIS2, CFPP, UGB</p>

<p>● <strong>2019-2020 :</strong> Réalisation d’un système de gestion de la cuvette de Boundioum. Mr Dadah DIOP, 2019/2022 Master 2 Master 2 MadDIS2, CFPP, UGB</p>

<p>Ecole Supérieure Polytechnique :</p>

<p>● <strong>2010-2011 :</strong> Mise en place d’une plateforme de MMS : Envoi de sonneries et logos. Abdou Salam KANE,2010-2011-ESP, UCAD</p>

<p>● <strong>2010-2011 :</strong> Choix d’outils de monitoring pour une notification d’alerte SMS : cas de la DOUANE SENEGALAISE. El Hadji Malick DIENG,2010-2011, Département Génie Informatique, Licence Professionnelle Télécoms &amp; Réseaux, ESP, UCAD</p>

<p>● <strong>2010-2011 :</strong> Mise en place d’un SVA avec l’API FACEBOOK. Bélal Ba et Pape Mor Coundoul,2010-2011, Département Génie Informatique, Licence Professionnelle Télécoms &amp; Réseaux, ESP, UCAD</p>

<p>Université Alioune Diop de Bambey :</p>

<p>● <strong>2023-2024 :</strong> Conception et Réalisation d’une application mobile pour la réservation d’hôtel, Assane Guilavogui, UFR SATIC, SID</p>

<p>LANGUES</p>

<p>● <strong>Wolof</strong> (Maternelle)</p>

<p>● <strong>Français</strong> (Courant)</p>

<p>● <strong>Poular</strong> (Courant)</p>

<p>● <strong>Anglais, Arabe, Espagnol</strong> (Scolaire)</p>]]></content><author><name>Maodo DIOP</name></author><category term="DevOps" /><category term="Industrialisation" /><category term="Virtualisation" /><category term="Portfolio" /><summary type="html"><![CDATA[Maodo DIOP]]></summary></entry><entry><title type="html">Notifications Pull vs. Push</title><link href="https://kharmaodo.github.io/devops/industrialisation/virtualisation/push/pull/notification/2025/12/03/post2.html" rel="alternate" type="text/html" title="Notifications Pull vs. Push" /><published>2025-12-03T12:32:35+00:00</published><updated>2025-12-03T12:32:35+00:00</updated><id>https://kharmaodo.github.io/devops/industrialisation/virtualisation/push/pull/notification/2025/12/03/post2</id><content type="html" xml:base="https://kharmaodo.github.io/devops/industrialisation/virtualisation/push/pull/notification/2025/12/03/post2.html"><![CDATA[<hr />

<h2 id="-notifications-pull-vs-push--maîtrisez-lart-de-la-livraison-dinfos-avec-firebase">🚀 Notifications Pull vs. Push : Maîtrisez l’Art de la Livraison d’Infos avec Firebase</h2>

<h3 id="1--introduction--fini-les-boîtes-aux-lettres-vides-">1. 💡 Introduction : Fini les boîtes aux lettres vides !</h3>

<p>Salut à toi, humain(e) ! Si tu as déjà utilisé une application qui t’envoie un petit message sur ton téléphone pour te dire que ton ami a aimé ta photo, tu as déjà bénéficié d’une <strong>notification</strong>.</p>

<p>Les notifications sont le cœur battant de l’engagement utilisateur. Elles transforment une application passive en un outil dynamique qui te rappelle d’y revenir. 
Dans cet article, nous allons décortiquer les deux grandes stratégies pour y arriver – le <strong>Pull</strong> et le <strong>Push</strong> – et te montrer comment mettre en place la magie du Push en utilisant <strong>Firebase Cloud Messaging (FCM)</strong>.</p>

<h3 id="2--problématique--pourquoi-les-notifications-">2. ❓ Problématique : Pourquoi les notifications ?</h3>

<p>Imagine une application de réseau social sans notifications. Pour savoir si quelqu’un t’a répondu, tu devrais <strong>ouvrir l’application toutes les 5 minutes</strong> et actualiser ta page. C’est inefficace, frustrant, et ça vide ta batterie !</p>

<p>Les notifications résolvent ce problème en :</p>
<ul>
  <li><strong>Améliorant l’Engagement :</strong> Elles ramènent l’utilisateur dans l’application.</li>
  <li><strong>Offrant une Réactivité Maximale :</strong> L’information arrive instantanément.</li>
  <li><strong>Permettant la Communication Asynchrone :</strong> L’émetteur n’a pas besoin que le récepteur soit “en ligne” au moment de l’envoi.</li>
</ul>

<h3 id="3-️-push-vs-pull--définitions--différences">3. ⚖️ Push vs Pull : Définitions &amp; Différences</h3>

<p>C’est là que réside le concept fondamental. Faisons simple :</p>

<h4 id="le-modèle-pull-tirer--le-facteur-qui-attend"><strong>Le Modèle PULL (Tirer) : Le Facteur qui Attend</strong></h4>

<ul>
  <li><strong>Définition :</strong> C’est le client (ton téléphone/navigateur) qui initie la demande. Il va régulièrement demander au serveur : “J’ai de nouvelles données pour moi ?”.</li>
  <li><strong>Analogie :</strong> C’est comme aller vérifier ta <strong>boîte aux lettres</strong> tous les matins. S’il n’y a rien, tu as fait le voyage pour rien.</li>
  <li><strong>Exemples :</strong> La plupart des requêtes HTTP classiques (<code class="language-plaintext highlighter-rouge">GET</code>), les requêtes pour actualiser un flux RSS.</li>
  <li><strong>Inconvénients :</strong> Latence (tu dois attendre le prochain “check”) et consommation de ressources (le client et le serveur travaillent même si rien n’a changé).</li>
</ul>

<h4 id="le-modèle-push-pousser--le-livreurs-de-pizza"><strong>Le Modèle PUSH (Pousser) : Le Livreurs de Pizza</strong></h4>

<ul>
  <li><strong>Définition :</strong> C’est le serveur qui initie la communication. Dès qu’une nouvelle donnée est prête, il la “pousse” vers le client.</li>
  <li><strong>Analogie :</strong> C’est comme le <strong>livreur de pizza</strong> qui sonne à ta porte dès que ta commande est prête. C’est instantané !</li>
  <li><strong>Exemples :</strong> Les notifications mobiles, les e-mails entrants, les mises à jour en direct.</li>
  <li><strong>Avantages :</strong> Zéro latence pour l’utilisateur, très économe en ressources côté client (il n’a pas besoin de vérifier).</li>
</ul>

<h3 id="4--comparaison-push--pull-chez-les-géants-de-linformatique">4. 🌍 Comparaison Push / Pull chez les géants de l’informatique</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Caractéristique</th>
      <th style="text-align: left">Système PULL</th>
      <th style="text-align: left">Système PUSH (Notifications)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Qui initie la connexion ?</strong></td>
      <td style="text-align: left">Le Client (Ton App)</td>
      <td style="text-align: left">Le Serveur (ou un service tiers)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Quand reçoit-on l’info ?</strong></td>
      <td style="text-align: left">Au prochain intervalle de vérification</td>
      <td style="text-align: left">Immédiatement</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Exemple Courant</strong></td>
      <td style="text-align: left">Charger une page web (Actualiser)</td>
      <td style="text-align: left">WhatsApp, SMS, Alerte Météo</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Consommation Batterie</strong></td>
      <td style="text-align: left">Plus élevée (vérifications régulières)</td>
      <td style="text-align: left">Moins élevée (connexion maintenue par l’OS)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Cas d’Usage</strong></td>
      <td style="text-align: left">Afficher des données statiques/peu fréquentes</td>
      <td style="text-align: left">Alertes, Messagerie instantanée, Rappels</td>
    </tr>
  </tbody>
</table>

<h3 id="5--webhooks-vs-notifications-pushpull">5. 🔗 Webhooks vs Notifications Push/Pull</h3>

<p>Tu entendras souvent parler de <strong>Webhooks</strong> dans le contexte du “Push”, et c’est important de faire la distinction :</p>

<ul>
  <li>
    <p><strong>Webhooks (ou Push HTTP) :</strong> C’est du Push, mais généralement utilisé pour la <strong>communication de serveur à serveur</strong>. Par exemple, quand une transaction PayPal est terminée, PayPal envoie une requête HTTP PUSH à un serveur (le tien) pour le prévenir.</p>
  </li>
  <li>
    <p><strong>Notifications Push (FCM, APNs) :</strong> C’est du Push, mais destiné à la <strong>communication de serveur au client final</strong> (l’application mobile ou web de l’utilisateur). Elles passent par des services intermédiaires optimisés (comme FCM) pour garantir la livraison et économiser la batterie.</p>
  </li>
</ul>

<h3 id="6--présentation-de-fcm-firebase-cloud-messaging">6. 📱 Présentation de FCM (Firebase Cloud Messaging)</h3>

<p>Puisque développer un système Push fiable de zéro est un cauchemar (problèmes de connectivité, gestion des jetons, économie de batterie, etc.), on utilise des services spécialisés. Le plus populaire et le plus facile d’accès est <strong>Firebase Cloud Messaging (FCM)</strong>, une offre de Google.</p>

<p><strong>FCM, c’est le ‘facteur universel’ :</strong> Il gère la connexion persistante et sécurisée entre ton serveur d’application et l’appareil de l’utilisateur, que l’appareil soit Android, iOS ou une application Web.</p>

<h3 id="7-️-architecture-du-système-fcm">7. 🏗️ Architecture du Système FCM</h3>

<p>Comprendre l’architecture, c’est comprendre comment ça marche ! Il y a trois acteurs clés :</p>

<ol>
  <li><strong>Le Client (L’Application de l’Utilisateur) :</strong> C’est ton application mobile ou web. Il reçoit et affiche la notification.</li>
  <li><strong>FCM (Le “Router”) :</strong> Le service de Google qui gère la connexion en direct avec chaque appareil. Il reçoit le message de ton serveur et le relaie à la bonne plateforme (Android ou Apple).</li>
  <li><strong>Le Serveur d’Application (Ton Backend) :</strong> C’est là que la logique métier réside (ex: un nouvel ami a posté, la commande est prête). C’est ce serveur qui <strong>appelle l’API de FCM</strong> pour lui dire : “Envoie ce message à cet utilisateur !”.</li>
</ol>

<h3 id="8-️-étapes-de-configuration-pratique">8. 🛠️ Étapes de Configuration Pratique</h3>

<p>Pour implémenter des notifications avec FCM, voici les étapes simplifiées :</p>

<h4 id="étape-1--côté-client-ton-app"><strong>Étape 1 : Côté Client (Ton App)</strong></h4>

<ol>
  <li><strong>Enregistrement :</strong> Au premier lancement, ton application demande à FCM un <strong>Token d’enregistrement (ou Jeton)</strong> unique pour cet appareil. C’est l’adresse postale de l’appareil.</li>
  <li><strong>Transmission du Token :</strong> L’application envoie ce Jeton au <strong>Serveur d’Application</strong> (Ton Backend).</li>
  <li><strong>Gestion du Message :</strong> L’application installe un <em>Listener</em> (écouteur) pour savoir quoi faire quand le message arrive (ex: afficher une alerte, mettre à jour des données).</li>
</ol>

<h4 id="étape-2--côté-serveur-ton-backend"><strong>Étape 2 : Côté Serveur (Ton Backend)</strong></h4>

<ol>
  <li><strong>Stockage :</strong> Ton serveur doit <strong>stocker en base de données</strong> le Jeton de l’utilisateur (l’adresse postale) avec l’ID de l’utilisateur.</li>
  <li><strong>Envoi :</strong> Quand un événement se produit (ex: un ‘Like’), ton serveur exécute un code qui appelle l’<strong>API de FCM</strong> en lui fournissant :
    <ul>
      <li>Le <strong>Jeton</strong> de l’appareil cible.</li>
      <li>Le <strong>Contenu</strong> de la notification (titre, corps, icône).</li>
    </ul>
  </li>
  <li><strong>FCM prend le relais :</strong> FCM reçoit l’appel et se charge de livrer la notification à l’appareil correspondant.</li>
</ol>

<h3 id="9-️-sécurité-et-bonnes-pratiques">9. 🛡️ Sécurité et Bonnes Pratiques</h3>

<ul>
  <li><strong>Gestion des Tokens :</strong> Les Jetons peuvent changer (par exemple, si l’utilisateur désinstalle et réinstalle l’application). Ton serveur doit gérer la mise à jour et la suppression des jetons invalides pour éviter d’envoyer des notifications dans le vide.</li>
  <li><strong>Confidentialité :</strong> N’inclus jamais d’informations ultra-sensibles (comme des mots de passe) dans le corps des notifications, car elles transitent par le service FCM.</li>
  <li><strong>Limiter les Abus :</strong> Ne spamme jamais l’utilisateur ! Un excès de notifications est la première cause de désinstallation d’une application.</li>
</ul>

<h3 id="10--avantages---limites-de-fcm">10. ✅ Avantages / 🛑 Limites de FCM</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Avantages de FCM</th>
      <th style="text-align: left">Limites de FCM</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Gratuit et Illimité</strong> (dans la plupart des cas)</td>
      <td style="text-align: left"><strong>Dépendance à Google</strong> (et à Apple pour l’APNs)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Multi-Plateforme</strong> (Android, iOS, Web)</td>
      <td style="text-align: left"><strong>Pas de garantie de livraison</strong> à 100% (mais très élevé)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Optimisé par l’OS</strong> (économie de batterie)</td>
      <td style="text-align: left"><strong>Personnalisation limitée</strong> par rapport à une solution maison</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Gestion automatique des échecs</strong> de livraison</td>
      <td style="text-align: left">Le <strong>Token</strong> peut nécessiter d’être actualisé</td>
    </tr>
  </tbody>
</table>

<h3 id="11--conclusion-et-démonstration-de-lapplication">11. 🎬 Conclusion et Démonstration de l’Application</h3>

<p>Le passage du <strong>Pull</strong> au <strong>Push</strong> est une étape cruciale pour créer une expérience utilisateur moderne et engageante. Grâce à des outils comme <strong>Firebase Cloud Messaging</strong>, nous pouvons facilement implémenter cette stratégie sans avoir à gérer les complexités des connexions réseau persistantes.</p>

<h3 id="12--documentation-générale-et-concepts">12. 📖 Documentation Générale et Concepts</h3>

<ul>
  <li>
    <p><strong>Accueil Firebase Cloud Messaging :</strong></p>

    <ul>
      <li>Le point de départ pour comprendre les fonctionnalités, la tarification (principalement gratuit) et les cas d’utilisation.</li>
      <li><a href="https://firebase.google.com/docs/cloud-messaging">Lien vers la documentation FCM</a></li>
    </ul>
  </li>
  <li>
    <p><strong>Architecture et Processus des Messages :</strong></p>

    <ul>
      <li>Comprendre en détail le rôle du serveur, de FCM et du client.</li>
      <li><a href="https://www.google.com/search?q=https://firebase.google.com/docs/cloud-messaging/concept-options">Lien vers l’aperçu de l’architecture FCM</a></li>
    </ul>
  </li>
</ul>

<h3 id="13--guides-de-démarrage-rapide-par-plateforme-client">13. 📱 Guides de Démarrage Rapide (Par Plateforme Client)</h3>

<p>Ces guides t’expliquent comment installer le SDK Firebase et obtenir le fameux <strong>Jeton d’enregistrement</strong> sur l’appareil.</p>

<ul>
  <li>
    <p><strong>Pour Android (Kotlin/Java) :</strong></p>

    <ul>
      <li>Comment configurer ton projet Android et gérer les messages entrants.</li>
      <li><a href="https://firebase.google.com/docs/cloud-messaging/android/client">Lien vers le guide de démarrage Android</a></li>
    </ul>
  </li>
  <li>
    <p><strong>Pour iOS / Swift :</strong></p>

    <ul>
      <li>Les étapes pour configurer le projet Apple (APNs) et le relier à Firebase.</li>
      <li><a href="https://firebase.google.com/docs/cloud-messaging/ios/client">Lien vers le guide de démarrage iOS</a></li>
    </ul>
  </li>
  <li>
    <p><strong>Pour le Web (JavaScript) :</strong></p>

    <ul>
      <li>Comment intégrer FCM à ton site web pour afficher des notifications dans le navigateur.</li>
      <li><a href="https://firebase.google.com/docs/cloud-messaging/js/client">Lien vers le guide de démarrage Web</a></li>
    </ul>
  </li>
</ul>

<h3 id="14-️-guides-dimplémentation-côté-serveur-backend">14. ⚙️ Guides d’Implémentation Côté Serveur (Backend)</h3>

<p>C’est ici que tu apprendras à envoyer la notification après avoir collecté le Jeton. Tu peux utiliser n’importe quel langage de programmation pour ton backend en utilisant l’API HTTP ou les SDK d’administration.</p>

<ul>
  <li>
    <p><strong>Envoi de Messages avec l’API HTTP v1 :</strong></p>

    <ul>
      <li>La méthode recommandée pour envoyer des messages depuis ton propre backend.</li>
      <li><a href="https://www.google.com/search?q=https://firebase.google.com/docs/cloud-messaging/send-message">Lien vers le guide d’envoi via l’API HTTP v1</a></li>
    </ul>
  </li>
  <li>
    <p><strong>Utilisation du SDK Admin (Exemple Node.js) :</strong></p>

    <ul>
      <li>Si tu utilises Node.js, Python, Java, ou d’autres pour ton backend, le SDK Admin simplifie l’envoi de messages à FCM.</li>
      <li><a href="https://firebase.google.com/docs/admin/setup">Lien vers le guide d’utilisation du SDK Admin</a></li>
    </ul>
  </li>
</ul>

<hr />]]></content><author><name>Maodo DIOP</name></author><category term="DevOps" /><category term="Industrialisation" /><category term="Virtualisation" /><category term="Push" /><category term="Pull" /><category term="Notification" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Vagrant et HAProxy - Mise en place d’un Load Balancer avec la virtualisation</title><link href="https://kharmaodo.github.io/devops/industrialisation/virtualisation/2020/12/01/vagrant-et-haproxy.html" rel="alternate" type="text/html" title="Vagrant et HAProxy - Mise en place d’un Load Balancer avec la virtualisation" /><published>2020-12-01T00:00:00+00:00</published><updated>2020-12-01T00:00:00+00:00</updated><id>https://kharmaodo.github.io/devops/industrialisation/virtualisation/2020/12/01/vagrant-et-haproxy</id><content type="html" xml:base="https://kharmaodo.github.io/devops/industrialisation/virtualisation/2020/12/01/vagrant-et-haproxy.html"><![CDATA[<p>Si les questions suivantes vous sont familières :</p>

<ul>
  <li>Comment simplifier les tâches de déploiements d’applications dans plusieurs serveurs avec le même stack d’outils ?</li>
  <li>Ou ne plus répéter les tâches d’installations des outils pour l’infrastructure de développement ou de la production ?</li>
  <li>Ou bien ne plus entendre la fameuse phrase « Pourtant cela marche sur mon environnement/machine » de la part des collaborateurs.</li>
  <li>Comment fournir un stack préfabriqué de l’entreprise pour les nouveaux collaborateurs pour leur simplifier les tâches d’installations et/ou de configuration ?</li>
  <li>Comment configurer un arsenal de serveurs avec plus ou moins les mêmes caractéristiques ?</li>
</ul>

<p>Si ces genres de questions vous concernent, alors la virtualisation et ses outils référents sont le remède de votre souci. Un des outils permettant de résoudre votre problème est <strong>Vagrant</strong>.</p>

<p>Vagrant s’adresse aux développeurs, aux devops, aux geeks etc…</p>

<p>Wikipédia cite : « Vagrant est un logiciel libre et open-source pour la création et la configuration des environnements de développement virtuel. Il peut être considéré comme un wrapper autour de logiciels de virtualisation comme VirtualBox. »</p>

<p>L’on peut citer d’autres outils de virtualisation en l’occurrence VMware, Hyper-V, Xen, KVM, Oracle VM, Proxmox VE, oVirt etc.</p>

<p>Parce qu’elle utilise le principe de virtualisation, il est donc compatible avec la majorité des systèmes d’exploitation (OS). C’est-à-dire qu’un utilisateur travaillant sous Mac aura accès au même environnement qu’un développeur sous Windows ou Linux tout en conservant les mêmes stacks.</p>

<p>Dans la suite, l’on utilisera <strong>VirtualBox</strong> comme outils de virtualisation avec Vagrant car ce dernier est en réalité une surcouche des solutions de virtualisation. Il faudra noter aussi que Vagrant n’est pas un outil de <em>provisioning</em> qui gère les dépendances logicielles de la machine virtuelle (VM).</p>

<p>Les solutions de <em>provisionning</em> par ordre de priorité sont pour les débutants l’usage des scripts shell puis enfin l’utilisation des solutions prouvées comme : Ansible, Puppet, Solo, Chef.</p>

<h2 id="vagrant-repose-sur-la-trilogie-suivante-">Vagrant repose sur la trilogie suivante :</h2>

<h3 id="1-un-fichier-dentrée-vagrantfile">1. Un fichier d’entrée Vagrantfile</h3>

<ul>
  <li>Écrit en Ruby, ce fichier de configuration principale va servir à définir le dossier racine du projet avec quelques options de configurations. Les options de base de configurations seront :
    <ul>
      <li>Le type de machine souhaité (Ubunty, Centos, Debian etc…) et dans le vocabulaire de Vagrant c’est la <strong>box</strong>.</li>
      <li>La configuration réseau (nat, dhcp, ip fixe etc…)</li>
      <li>Le <em>provider</em> qui est soit un script shell et/ou les outils tels Ansible, Puppet etc.</li>
    </ul>
  </li>
</ul>

<h3 id="2-les-boxes">2. Les boxes</h3>

<ul>
  <li>Ceux sont la plupart du temps des OS (Ubuntu entre autres…) ou des applications préinstallées prêtes à l’emploi pour accélérer la construction de l’environnement virtuel.</li>
</ul>

<h3 id="3-un-ou-plusieurs-providers">3. Un ou plusieurs providers</h3>

<ul>
  <li>Vagrant ne virtualisant pas directement les environnements fait appel à un <em>provider</em> pour accomplir cette tâche. VirtualBox étant la plus utilisée pour la plupart du temps mais VmWare gagne aussi du terrain.</li>
</ul>

<h2 id="un-cas-dexemple-universel---hello-world--à-la-sauce-vagrant">Un cas d’exemple universel : « Hello World » à la sauce Vagrant</h2>

<p>Créer un répertoire que l’on nommera <code class="language-plaintext highlighter-rouge">lab-vagrant</code> et démarrons un petit projet vagrant en exécutant la commande :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λ vagrant init
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
</code></pre></div></div>

<p>Lister le contenu de ce répertoire :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λ <span class="nb">ls
</span>Vagrantfile
</code></pre></div></div>

<p>Cette commande crée un fichier de configuration de nom <code class="language-plaintext highlighter-rouge">Vagrantfile</code> dont le contenu est commenté. Nous allons modifier ce fichier en supprimer les commentaires et le personnaliser.</p>

<p>Générerons notre VM en exécutant la commande ci-dessous :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λ vagrant up
</code></pre></div></div>

<p><strong>Explication du code en rapport avec ce qui est plus haut.</strong></p>

<p>Nous avons configuré notre environnement avec le système d’exploitation <code class="language-plaintext highlighter-rouge">hashicorp/precision32</code> avec sa version <code class="language-plaintext highlighter-rouge">1.0.0</code>. Celui-ci est une <em>box</em> dans le jargon de Vagrant, nous pourrions pu utiliser un Ubuntu ou un Debian ou CentOS pourquoi pas ?</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span><span class="p">.</span><span class="nf">vm</span><span class="p">.</span><span class="nf">box</span> <span class="o">=</span> <span class="err">“</span><span class="n">hashicorp</span><span class="o">/</span><span class="n">precise32</span><span class="err">”</span>
<span class="n">config</span><span class="p">.</span><span class="nf">vm</span><span class="p">.</span><span class="nf">box_version</span> <span class="o">=</span> <span class="err">“</span><span class="mf">1.0</span><span class="o">.</span><span class="mi">0</span><span class="err">”</span>
</code></pre></div></div>

<p>Notre logiciel de virtualisation étant VirtualBox, nous définissons une mémoire octroyée et l’absence d’interface ergonomique.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span><span class="p">.</span><span class="nf">vm</span><span class="p">.</span><span class="nf">provider</span> <span class="err">“</span><span class="n">virtualbox</span><span class="err">”</span> <span class="k">do</span> <span class="o">|</span><span class="n">vb</span><span class="o">|</span>
  <span class="n">vb</span><span class="p">.</span><span class="nf">gui</span> <span class="o">=</span> <span class="kp">false</span>
  <span class="n">vb</span><span class="p">.</span><span class="nf">memory</span> <span class="o">=</span> <span class="err">“</span><span class="mi">1024</span><span class="err">”</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Puis en dernier, l’affichage d’un message une fois que le <em>provisioning</em> est terminé par les citations des auteurs (Shakespeare et La Fontaine).</p>

<p>Pour les besoins de simplicité, nous appelons un script-line avec l’aide des possibilités du Shell en lieu et place des outils de <em>provisionning</em> comme Puppet, Salt, Chef, Solo, Ansible etc…</p>

<h2 id="commandes-vagrant-fréquemment-utilisées">Commandes Vagrant fréquemment utilisées</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Action</th>
      <th style="text-align: left">Commande</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Initialiser une box</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Vagrant init &lt;nom-vm&gt;</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Ajouter une box</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant box add distrib/version</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Lister les box</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant box list</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Générer un(e) VM</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant up</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Connexion en SSH</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant ssh &lt;nom-vm&gt;</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Éteindre la VM</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant halt</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Détruire la VM</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">vagrant destroy</code></td>
    </tr>
    <tr>
      <td style="text-align: left">Arrêter la VM</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Vagrant suspend</code></td>
    </tr>
  </tbody>
</table>

<p>Avec un <code class="language-plaintext highlighter-rouge">vagrant ssh</code>, l’on peut faire ce que l’on veut sur sa VM en terme d’installations de paquets, de personnalisation (clavier, heure…)</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vagrant@vm1hello:~<span class="nv">$ </span><span class="nb">uname</span> <span class="nt">-a</span>
Linux vm1hello 3.13.0–32-generic <span class="c">#57~precise1-Ubuntu SMP Tue Jul 15 03:50:54 UTC 2014 i686 i686 i386 GNU/Linux</span>
vagrant@vm1hello:~<span class="nv">$ </span><span class="nb">whoami
</span>vagrant
vagrant@vm1hello:~<span class="nv">$ </span><span class="nb">sudo </span>apt-get update
<span class="c"># ... Logs de l'update ...</span>
vagrant@vm1hello:~<span class="nv">$ </span><span class="nb">sudo </span>apt-get <span class="nb">install</span> <span class="nt">-y</span> git
<span class="c"># ... Logs de l'installation de git ...</span>
</code></pre></div></div>

<hr />

<h2 id="vagrant-et-haproxy-comme-load-balancing">Vagrant et HAProxy comme Load Balancing</h2>

<p>Le <em>load balancing</em> est une technique qui consiste à répartir les charges sur différents appareils d’un même réseau. Elle permet notamment aux serveurs de sites Internet à forte audience de ne pas se retrouver surchargés. Dans le <em>load balancing</em>, les multiples requêtes sont distribuées sur plusieurs serveurs.</p>

<p>Techniquement, chaque élément qui compose le système a un rôle :</p>

<ol>
  <li>L’internet à travers lequel l’utilisateur accède.</li>
  <li>Le serveur DNS, chargé de faire la jonction entre le nom de domaine et l’adresse IP du serveur qui l’héberge.</li>
  <li>Le <em>loadbalancer</em> a pour but de transmettre les charges sur différentes ressources.</li>
</ol>

<p>Pour ce billet, nous allons utiliser Vagrant pour faire du <em>load balancing</em> avec <strong>HAProxy</strong>.</p>

<p>Nous allons utiliser trois (3) instances avec les caractéristiques suivantes :</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Instance</th>
      <th style="text-align: left">Hostname</th>
      <th style="text-align: left">OS / Rôle</th>
      <th style="text-align: left">Private IP</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Instance 1</strong></td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">haproxy</code></td>
      <td style="text-align: left">Ubuntu / Load Balancer</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">192.168.205.30</code></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Instance 2</strong></td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">webserver1</code></td>
      <td style="text-align: left">Ubuntu + Apache / Web Server 1</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">192.168.205.10</code></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Instance 3</strong></td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">webserver2</code></td>
      <td style="text-align: left">Ubuntu + Apache / Web Server 2</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">192.168.205.20</code></td>
    </tr>
  </tbody>
</table>

<p>Sur les deux derniers serveurs (<code class="language-plaintext highlighter-rouge">webserver1</code>, <code class="language-plaintext highlighter-rouge">webserver2</code>), Apache y est installé servant de tests pour le <em>load balancing</em> servi par HAProxy.</p>

<h3 id="configuration-des-instances-via-vagrant-et-shell-scripts">Configuration des Instances via Vagrant et Shell Scripts</h3>

<p>Pour configurer nos instances, nous définissons pour chaque instance l’appel à un script shell pour l’installation et la configuration :</p>

<h4 id="webserversh"><code class="language-plaintext highlighter-rouge">webserver.sh</code></h4>

<p>Ce script installe le paquet Apache 2, ajoute le nom du serveur dans le fichier de configuration d’Apache et redémarre Apache.</p>

<p>Le fichier <code class="language-plaintext highlighter-rouge">index.html</code> est modifié pour qu’il affiche selon l’algorithme utilisé par le <em>loadbalancer</em> pour l’élection des serveurs :</p>

<ul>
  <li>Soit <code class="language-plaintext highlighter-rouge">Webserver1</code> / <code class="language-plaintext highlighter-rouge">Je suis votre serviteur !</code></li>
  <li>Ou <code class="language-plaintext highlighter-rouge">Webserver2</code> / <code class="language-plaintext highlighter-rouge">Je suis votre serviteur !</code></li>
</ul>

<h4 id="haproxysh"><code class="language-plaintext highlighter-rouge">haproxy.sh</code></h4>

<p>Pour la configuration HAProxy, nous avons les étapes suivantes :</p>

<ol>
  <li>Mise à jour du gestionnaire des paquets : <code class="language-plaintext highlighter-rouge">apt-get update -y -qq</code></li>
  <li>Installer HAProxy : <code class="language-plaintext highlighter-rouge">apt-get install -y haproxy</code></li>
  <li>Activer HAProxy comme <em>daemon</em> au démarrage :
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&gt;</span> /etc/default/haproxy <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
ENABLED=1
</span><span class="no">EOF
</span></code></pre></div>    </div>
  </li>
  <li>Configuration des serveurs pour le <em>load balancing</em> avec l’algorithme <strong>roundrobin</strong> :
    <div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">server</span> <span class="n">webserver1</span> <span class="m">192</span>.<span class="m">168</span>.<span class="m">50</span>.<span class="m">10</span>:<span class="m">80</span> <span class="n">check</span>
<span class="n">server</span> <span class="n">webserver2</span> <span class="m">192</span>.<span class="m">168</span>.<span class="m">50</span>.<span class="m">20</span>:<span class="m">80</span> <span class="n">check</span>
</code></pre></div>    </div>
  </li>
  <li>Accéder à l’interface web des statistiques de HAProxy :
    <ul>
      <li><code class="language-plaintext highlighter-rouge">stats enable</code></li>
      <li><code class="language-plaintext highlighter-rouge">stats auth admin:admin</code></li>
      <li><code class="language-plaintext highlighter-rouge">stats uri /haproxy?stats</code></li>
    </ul>
  </li>
  <li>Valider la configuration : <code class="language-plaintext highlighter-rouge">haproxy -f /etc/haproxy/haproxy.cfg -c</code></li>
  <li>Démarrer l’utilitaire HAProxy : <code class="language-plaintext highlighter-rouge">service haproxy start</code></li>
</ol>

<h3 id="test-de-linfrastructure">Test de l’Infrastructure</h3>

<p>Pour tester notre infrastructure, lancer les commandes suivantes :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vagrant up
</code></pre></div></div>

<p>Nous pouvons nous connecter à chaque instance en SSH :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vagrant ssh webserver1
vagrant ssh webserver2
vagrant ssh haproxy
</code></pre></div></div>

<p>En appelant le serveur (par l’IP du load balancer), l’on est servi suivant la disponibilité de <code class="language-plaintext highlighter-rouge">webserver1</code> et/ou <code class="language-plaintext highlighter-rouge">webserver2</code>.</p>

<p>Nous pouvons tester en mode web et avoir les réponses suivant la disponibilité des serveurs.</p>

<p>HAProxy offre l’interface d’administration des serveurs. Il suffit de se pointer sur <code class="language-plaintext highlighter-rouge">http://192.168.50.30/haproxy?stats</code>.</p>

<p>Ici nous remarquons que tous nos serveurs sont au vert. Essayer d’éteindre le premier serveur à savoir <code class="language-plaintext highlighter-rouge">webserver1</code>.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λ vagrant halt webserver1
<span class="o">==&gt;</span> webserver1: Attempting graceful shutdown of VM…
</code></pre></div></div>

<p>Et nous aurons l’interface HAProxy qui prend en compte l’état actuel des serveurs.</p>

<hr />

<h2 id="liens-utiles">Liens Utiles</h2>

<ul>
  <li>Boxes Vagrant : <a href="https://www.google.com/search?q=http://www.vagrantbox.es/">http://www.vagrantbox.es/</a></li>
  <li>HAProxy Ubuntu : <a href="https://www.google.com/search?q=https://upcloud.com/community/tutorials/haproxy-load-balancer-ubuntu/">https://upcloud.com/community/tutorials/haproxy-load-balancer-ubuntu/</a></li>
  <li>HAProxy Wikipedia : <a href="https://en.wikipedia.org/wiki/HAProxy">https://en.wikipedia.org/wiki/HAProxy</a></li>
</ul>

<!-- end list -->

<p>```</p>

<hr />]]></content><author><name>Maodo DIOP</name></author><category term="DevOps" /><category term="Industrialisation" /><category term="Virtualisation" /><category term="Vagrant" /><category term="HAProxy" /><category term="VirtualBox" /><category term="Load Balancing" /><summary type="html"><![CDATA[Si les questions suivantes vous sont familières :]]></summary></entry></feed>