<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>DevOps life (français)</title><description>Le blog technique de Tristan Bessoussa : infrastructure, Symfony, serverless et code assisté par IA, en français.</description><link>https://devops-life.com/</link><language>fr</language><atom:link href="https://devops-life.com/fr/feed.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Thu, 28 Nov 2024 00:00:00 GMT</lastBuildDate><image><url>https://devops-life.com/apple-touch-icon.png</url><title>DevOps life (français)</title><link>https://devops-life.com/fr/</link></image><item><title>Comment j’ai hacké la liste d’attente de ma box de CrossFit avec l’IA (et pourquoi ça a changé mon regard sur le code assisté par IA)</title><link>https://devops-life.com/fr/blog/2024/11/28/ia-liste-attente-crossfit/</link><guid isPermaLink="true">https://devops-life.com/fr/blog/2024/11/28/ia-liste-attente-crossfit/</guid><description>CTO, je ne code presque plus, et je n&apos;aurais jamais cru me remettre à développer une application de zéro... jusqu&apos;à ce que mon addiction au CrossFit et l&apos;IA…</description><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CTO, je ne code presque plus, et je n’aurais jamais cru me remettre à développer une application de zéro… jusqu’à ce que mon addiction au CrossFit et l’IA unissent leurs forces. Voici comment l’IA générative m’a permis de faire passer mes chances d’obtenir une place dans les cours de CrossFit les plus demandés de 20% à 90%.&lt;/p&gt;
&lt;h2 id=&quot;le-problème--la-galère-des-réservations&quot;&gt;Le problème : la galère des réservations&lt;/h2&gt;
&lt;p&gt;Depuis deux ans, je me bats avec le système de réservation de ma box de CrossFit. Les cours sont pris d’assaut : il faut réserver jusqu’à 14 jours à l’avance. Vous avez raté le coche ? Bienvenue dans l’enfer de la liste d’attente, souvent longue de 15 personnes pour les créneaux tant convoités de l’après-boulot.&lt;/p&gt;
&lt;p&gt;Le hic : je suis incapable de m’organiser à l’avance. Mon seul espoir, c’était de bondir sur les notifications d’annulation, mais même mon pouce ultra-rapide n’y suffisait pas. Pourquoi ? Les notifications push arrivaient avec jusqu’à une minute de décalage d’un utilisateur à l’autre. Même en cliquant dans la seconde, je ratais la place 80% du temps.&lt;/p&gt;
&lt;h2 id=&quot;le-déclic&quot;&gt;Le déclic&lt;/h2&gt;
&lt;p&gt;J’ai codé pendant une dizaine d’années avant de m’éloigner du clavier, et je savais qu’il y avait forcément mieux à faire. La solution était évidente : pourquoi attendre des notifications push en retard, alors que je pouvais interroger directement l’API (qui n’est d’ailleurs pas publique) ? Seul bémol : si le principe était simple, le paysage du développement avait beaucoup changé depuis l’époque où je codais.&lt;/p&gt;
&lt;h2 id=&quot;lia-entre-en-scène--un-binôme-de-code-inattendu&quot;&gt;L’IA entre en scène : un binôme de code inattendu&lt;/h2&gt;
&lt;p&gt;La semaine dernière, j’ai décidé de mettre à l’épreuve tout ce battage autour du « code assisté par IA » que je voyais passer sur les réseaux sociaux. Armé de Cursor et de Claude, je me suis lancé dans mon plan diabolique pour optimiser ma vie de sportif.&lt;/p&gt;
&lt;p&gt;Le processus a été fascinant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;J’ai commencé petit, en demandant à l’IA de créer une interface qui affiche les cours disponibles, le nombre de participants et la longueur des listes d’attente&lt;/li&gt;
&lt;li&gt;J’ai extrait les appels réseau (.HAR) de l’application web officielle et je les ai donnés à Claude&lt;/li&gt;
&lt;li&gt;En moins d’une heure, j’ai eu mon premier moment « waouh » : ce qui m’aurait pris 4 heures avec ma stack habituelle, je l’ai fait en terrain inconnu (Astro et React)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;retour-sur-terre--lia-nest-pas-magique-cest-un-partenariat&quot;&gt;Retour sur terre : l’IA n’est pas magique, c’est un partenariat&lt;/h2&gt;
&lt;p&gt;Travailler avec l’IA n’a pas été un long fleuve tranquille :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parfois, c’était comme travailler avec un enfant brillant mais distrait&lt;/li&gt;
&lt;li&gt;Elle oubliait le contexte (« Tu as généré du React pur, mais on est dans un projet Astro, tu te souviens ? »)&lt;/li&gt;
&lt;li&gt;Ajouter une fonctionnalité pouvait en casser une autre (il faut croire que l’IA a quelques travers de développeur bien humains 😅)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La clé, c’était d’apprendre à lui fournir le contexte efficacement, en partageant des fichiers précis ou tout le périmètre du projet, pour obtenir des solutions cohérentes.&lt;/p&gt;
&lt;h2 id=&quot;le-point-de-vue-du-cto--une-prise-de-conscience-décisive&quot;&gt;Le point de vue du CTO : une prise de conscience décisive&lt;/h2&gt;
&lt;p&gt;Cette expérience a transformé ma vision des outils d’IA dans le développement. Une partie de mon équipe utilise déjà GitHub Copilot ou Cursor, mais c’est ce projet perso qui m’a révélé le vrai potentiel du développement assisté par IA. Il ne s’agit pas de remplacer les développeurs, mais de former un vrai binôme avec les outils d’IA.&lt;/p&gt;
&lt;h2 id=&quot;ce-que-jen-retiens&quot;&gt;Ce que j’en retiens&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Des besoins clairs, ça compte&lt;/strong&gt; : l’IA a besoin d’un périmètre et d’attentes bien définis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le contexte est roi&lt;/strong&gt; : le facteur limitant, c’est souvent la communication humaine ; une demande floue donne un résultat flou&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accepter le changement&lt;/strong&gt; : la tech évolue sans cesse ; les concepts fondamentaux restent, mais les outils et les frameworks changent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L’IA comme levier&lt;/strong&gt; : elle peut aider les développeurs expérimentés à travailler plus efficacement avec des technologies qu’ils ne connaissent pas.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour les développeurs expérimentés, l’IA peut &lt;strong&gt;vraiment changer la donne&lt;/strong&gt; : elle leur permet de travailler &lt;strong&gt;bien plus vite&lt;/strong&gt;, même avec des technologies qu’ils ne maîtrisent pas.&lt;/p&gt;
&lt;p&gt;Pour les développeurs juniors, c’est un formidable outil d’apprentissage, qui accélère leur compréhension des nouvelles technologies. Il y a toutefois un revers : trop s’appuyer sur l’IA pourrait les empêcher d’acquérir des compétences essentielles et de comprendre en profondeur ce qui se passe « sous le capot ».&lt;/p&gt;
&lt;p&gt;Pour les profils non techniques, en 2024, il est sans doute encore un peu tôt pour créer de zéro du code pleinement fonctionnel sans bases techniques. En revanche, l’IA est une excellente aide à la communication : elle leur permet d’exposer leurs idées aux développeurs avec plus de clarté et de précision.
À l’heure actuelle (et cela pourrait changer), je ne vois pas l’IA remplacer les développeurs : ce projet m’a demandé de mobiliser mon expérience et mes connaissances.&lt;/p&gt;
&lt;p&gt;P.-S. : mon plan diabolique a-t-il fonctionné ? Absolument. Mon taux de réussite pour décrocher les créneaux de CrossFit libérés par une annulation est passé de 20% à 100%. Surtout, je n’ai plus besoin de rester sur le qui-vive en permanence, prêt à me jeter sur mon téléphone à la moindre notification d’annulation.
Parfois, les meilleurs projets de code naissent d’un besoin égoïste !&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Cet article a été écrit par Tristan Bessoussa, CTO chez Wamiz (Nestlé), où j’explore des façons de marier la technologie et les solutions concrètes… quitte à détourner le système pour mieux m’entraîner ! 💪&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cet article a ensuite été amélioré par l’IA, et si vous l’avez lu jusqu’au bout, c’est que l’IA écrit mieux que moi&lt;/em&gt;&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>AI</category><category>Development</category><category>Personal Project</category><category>CrossFit</category><category>Technology</category></item><item><title>Un environnement de développement sain en 2021. Bonjour Docker, bye machines virtuelles</title><link>https://devops-life.com/blog/2021/04/28/un-environnement-de-developpement-sain-en-2021-hello-docker-goodbye-machines-virtuelles/</link><guid isPermaLink="true">https://devops-life.com/blog/2021/04/28/un-environnement-de-developpement-sain-en-2021-hello-docker-goodbye-machines-virtuelles/</guid><description>Depuis mai 2015, le modèle chez Yproximité de &quot;tout installer à la main en local en 1/2 journée&quot; a été abandonné pour une solution basée sur une machine…</description><pubDate>Wed, 28 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexte&quot;&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Depuis mai 2015, le modèle chez Yproximité de “tout installer à la main en local en 1/2 journée” a été abandonné pour une solution basée sur une machine virtuelle, configurée à l’aide de playbook &lt;a href=&quot;https://www.ansible.com/&quot;&gt;Ansible&lt;/a&gt; afin qu’en une commande, l’environnement de développement soit opérationnel après quelques minutes.&lt;/p&gt;
&lt;p&gt;Les prérequis pour faire tourner les &lt;strong&gt;projets Symfony&lt;/strong&gt; consistait à installer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make, afin de lancer les commandes&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot;&gt;VirtualBox&lt;/a&gt;, pour la VM&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vagrantup.com/downloads.html&quot;&gt;Vagrant&lt;/a&gt;, afin de piloter la VM&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vagrant-landrush/landrush&quot;&gt;Vagrant Landrush&lt;/a&gt;, un DNS pour accéder aux URL de développement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/FiloSottile/mkcert&quot;&gt;mkcert&lt;/a&gt;, pour générer le certificat TLS local&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’utilisateur était alors invité alors à exécuter dans son terminal &lt;code&gt;make setup&lt;/code&gt;, puis une vingtaine de minutes plus tard, le projet était complètement opérationnel, les données de la base de données importés et toute l’équipe sur les mêmes versions mineures de PHP, Nginx, PostgreSQL.&lt;/p&gt;
&lt;p&gt;❤️ Je tiens d’ailleurs à remercier les contributeurs du projet &lt;a href=&quot;https://www.manala.io/&quot;&gt;manala.io&lt;/a&gt; porté par mon ancienne agence web, &lt;a href=&quot;https://www.elao.com/&quot;&gt;Elao&lt;/a&gt; et notamment &lt;a href=&quot;https://github.com/nervo&quot;&gt;Nervo&lt;/a&gt; qui maintient les différents &lt;a href=&quot;https://github.com/manala/ansible-roles&quot;&gt;rôles Ansible&lt;/a&gt;. Merci pour leurs contributions open source et d’avoir permis de faire tourner notre usine de développement pendant 6 ans.&lt;/p&gt;
&lt;p&gt;Nous sommes maintenant en 2021. Qu’est-ce qui m’a poussé à prévoir ce changement d’usine de développement et à abandonner ce modèle de machines virtuelles (VM) ?&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-séloigner-du-modèle-machines-virtuelles-&quot;&gt;Pourquoi s’éloigner du modèle machines virtuelles ?&lt;/h2&gt;
&lt;p&gt;Plusieurs arguments étaient pour l’abandon des VM :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker qui devient de plus en plus mature et qui a un bon taux d’adoption dans la communauté web sur les environnements de développement.&lt;/li&gt;
&lt;li&gt;Les performances un peu en retrait (surtout sur Linux si j’en crois mon équipe) par rapport à une installation locale du projet.&lt;/li&gt;
&lt;li&gt;Le poids des machines virtuelles (compter plusieurs Go par projets)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Néanmoins, l’idée d’adopter une usine de développement uniquement basée sur Docker m’a énormément freiné. Avec une équipe réduite et sans compétence Docker particulière (notamment pour les problématiques de performances macOS vs Linux) ce choix s’avère risqué pour la stabilité de l’environnement de développement, qui doit être là pour permettre aux développeurs d’être le plus productif, et non pas comme étant une source de frustration, ou de ralentissement.&lt;/p&gt;
&lt;p&gt;Je savais que les VM allaient bientôt être poussées vers la sortie, mais était-ce suffisant pour arrêter une date butoire de transition vers autre chose ? Prévoir un plan de formation ? Faire évoluer nos dizaines de projets vers un autre environnement de développement basé sur du Docker ? Pas tout à fait…&lt;/p&gt;
&lt;p&gt;L’élément qui à permis de faire basculer la balance vers “autre chose” est &lt;a href=&quot;https://forums.virtualbox.org/viewtopic.php?f=8&amp;amp;t=98742#wrap&quot;&gt;l’annonce discrète par l’équipe de VirtualBox&lt;/a&gt; qui dit ne pas pouvoir techniquement porter VirtualBox sur un processeur ARM. VirtualBox, qui fait tourner les VM, est un hyperviseur, et non un émulateur CPU. VirtualBox ne peut donc pas émuler un processeur x86.&lt;/p&gt;
&lt;p&gt;En quoi c’est gênant ? Et bien peut-être avez vous raté &lt;a href=&quot;https://nr.apple.com/dE7O5p9q0t&quot;&gt;l’annonce d’Apple&lt;/a&gt; de leur plan de transition vers une architecture ARM sous 2 ans environ en débutant par leur puce “M1” (qui envoie du lourd), équipant les MacBook Pro 13”, le MacBook Air et le Mac Mini. Il semblerait même que devant les retours extrêmement positifs des utilisateurs, la firme ait même acceléré le déploiement de la nouvelle architecture ARM en annoncant il y à quelques jours les iMac 24” et les iPad Pro avec la puce M1. Pour le grand public, il ne reste donc plus que le MacBook Pro 16” et l’iMac 27” à sauter le cap.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/vm-docker/apple-m1.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/vm-docker/apple-m1.jpg&quot; alt=&quot;Illustration du processeur d&apos;Apple sous architecture ARM baptisé M1&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;442&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Illustration du processeur d&apos;Apple sous architecture ARM baptisé M1&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Je vois venir les trolls d’Apple au loin, mais dans mon équipe, j’ai toujours eu à cœur de proposer aux développeurs/euses le choix entre du Linux et du macOS (&lt;a href=&quot;https://barometre.afup.org/report/os_developpment?filter%5Bcampaign%5D%5B%5D=6&amp;amp;filter%5Bcampaign%5D%5B%5D=7&amp;amp;filter%5Bcampaign%5D%5B%5D=8&amp;amp;filter%5Bsalary%5D%5Bmin%5D=&amp;amp;filter%5Bsalary%5D%5Bmax%5D=&amp;amp;filter%5Bsubmit%5D=&quot;&gt;voir baromètre AFUP pour les répartions d’OS&lt;/a&gt;). Donc merci de rediriger les troll vers les seuls qui le méritent : les devs PHP/JS sous Windows.&lt;/p&gt;
&lt;h2 id=&quot;une-solution-propulsée-par-docker-mais-pas-que-&quot;&gt;Une solution propulsée par Docker, mais pas que !&lt;/h2&gt;
&lt;p&gt;Dans mon contexte d’entreprise et d’équipe, une solution basée uniquement sur Docker est compromise tant que le problème de performance soit définitivement reglé sur Mac ou qu’il y ait besoin d’une ressource experte Docker/Linux pour implémenter la solution.&lt;/p&gt;
&lt;p&gt;J’ai donc choisi de pousser l’adoption d’une solution hybride afin d’éviter les volumes partagés (et donc pas de problème de performances). Il semblerait, d’après ma mémoire de SymfonyLive que ça soit aussi le choix de &lt;a href=&quot;https://twitter.com/fabpot&quot;&gt;Fabien Potencier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur la machine hôte (macOS/Linux) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP et composer&lt;/li&gt;
&lt;li&gt;NodeJS&lt;/li&gt;
&lt;li&gt;Docker Desktop&lt;/li&gt;
&lt;li&gt;Symfony CLI. Ce dernier offre un serveur web avec gestion du TLS, le support docker, et la gestion des versions de PHP spécifiques.&lt;/li&gt;
&lt;li&gt;Binaire Manala (Permettra de générer votre &lt;code&gt;docker-compose.yaml&lt;/code&gt; d’après un template. Voir &lt;a href=&quot;#aller-plus-loin&quot;&gt;aller plus loin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⚠ Malgré tous les avantages qu’offre Symfony CLI, ce dernier n’est pas open source. C’est à noter, surtout si on se repose dessus pour une usine de développement.&lt;/p&gt;
&lt;p&gt;Avec Docker :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base de données (MySQL, PostgreSQL, MariaDB…)&lt;/li&gt;
&lt;li&gt;Serveur Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/vm-docker/docker-containers.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/vm-docker/docker-containers.jpg&quot; alt=&quot;Liste des containeurs Docker&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;411&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Liste des containeurs Docker&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;L’expérience de développement avec cette nouvelle stack hybride est vraiment très plaisante et rapide, je retrouve les performances natives de ma machine.&lt;/p&gt;
&lt;h2 id=&quot;aller-plus-loin&quot;&gt;Aller plus loin&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/HugoAlliaume&quot;&gt;Hugo Alliaume&lt;/a&gt; a repris le POC que j’ai réalisé en Août 2020 et levé tous les points de bloquages. Il s’est saisi de la problématique à bras le corps et a mené le projet de transition à son exécution sur tous les projets de l’équipe R&amp;amp;D.&lt;/p&gt;
&lt;p&gt;Il a abordé des parties plus techniques dans sur son blog, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une analyse plus poussée des limites des VM et des workaround nécessaires&lt;/li&gt;
&lt;li&gt;Pourquoi remplacer son serveur web / reverse proxy et gestion DNS local par Symfony CLI&lt;/li&gt;
&lt;li&gt;Un exemple de &lt;code&gt;docker-compose.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Comment tirer profit de cette stack de développement pour le CI, avec GitHub Actions ?&lt;/li&gt;
&lt;li&gt;Comment aller plus loin avec le binaire &lt;code&gt;manala&lt;/code&gt; pour faciliter la gestion et la maintenance (ex: &lt;code&gt;Makefile&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;📖  Je vous invite à lire son article : &lt;a href=&quot;https://hugo.alliau.me/2021/04/26/migration-stack-developpement/&quot;&gt;migration de notre stack de développement vers Docker&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;installation-des-prérequis-sous-macos&quot;&gt;Installation des prérequis sous macOS&lt;/h2&gt;
&lt;p&gt;Ce chapitre s’adresse aux utilisateurs sous macOS 🍎 qui souhaiteraient retrouver ici toutes les procédures d’installation des outils sur votre machine.&lt;/p&gt;
&lt;h3 id=&quot;prérequis&quot;&gt;Prérequis&lt;/h3&gt;
&lt;p&gt;Installation de &lt;a href=&quot;https://brew.sh/index_fr&quot;&gt;&lt;code&gt;brew&lt;/code&gt;&lt;/a&gt; le gestionnaire de paquets pour macOS.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;/bin/bash&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Installation de &lt;a href=&quot;https://ohmyz.sh/#install&quot;&gt;&lt;code&gt;Zsh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;sh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;installation-de-php&quot;&gt;Installation de PHP&lt;/h3&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; php&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # installe la dernière version stable de PHP, soit la version 8.0.x à l&apos;heure ou j&apos;écris cet article.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; php@7.4&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # installe php 7.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; composer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si vous avez des projets sous différentes versions de PHP, pas de soucis, installez toutes les versions de PHP nécessaires à vos projets, Symfony utilisera la bonne version grâce au fichier &lt;code&gt;.php-version&lt;/code&gt; déposé à la racine de votre projet.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/vm-docker/symfony-cli-php-version.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/vm-docker/symfony-cli-php-version.jpg&quot; alt=&quot;Détection des différentes versions de PHP installées sur votre machine tel que vu par le binaire Symfony&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;347&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Détection des différentes versions de PHP installées sur votre machine tel que vu par le binaire Symfony&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;installation-de-nodejs&quot;&gt;Installation de NodeJS&lt;/h3&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # installe la dernière version stable de NodeJS, soit la version 16.0.x à l&apos;heure ou j&apos;écris cet article.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; node@14&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # installe la nodeJS 14&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; yarn&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # si vous avez besoin du gestionnaire de dépandance JS Yarn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sur le même schéma, si vous avez des projets sous différentes versions de NodeJS, installez toutes les versions nécessaires à vos projets, nous utiliserons &lt;code&gt;nvm&lt;/code&gt; qui permet d’utiliser la bonne version de node selon le projet (la version étant contenue dans le fichier à la racine du projet &lt;code&gt;.nvmrc&lt;/code&gt;).&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; nvm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enfin lorsque vous lancerez votre &lt;code&gt;yarn install&lt;/code&gt; ou &lt;code&gt;yarn dev-server&lt;/code&gt; pour éviter de faire un &lt;code&gt;nvm use&lt;/code&gt; pour sélectionner la bonne version de nodejs, vous pouvez ajouter ce bloc dans votre &lt;code&gt;~/.zshrc&lt;/code&gt; (puis relancer votre terminal, ou executez &lt;code&gt;source ~/.zshrc&lt;/code&gt;). Cela aura pour effet de regarder si dans votre chemin courant, un &lt;code&gt;.nvmrc&lt;/code&gt; existe avec une version de node spécifique au projet, et l’utilise, si elle est installée.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; NVM_DIR&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/.nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/usr/local/opt/nvm/nvm.sh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/usr/local/opt/nvm/nvm.sh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;  # This loads nvm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/usr/local/opt/nvm/etc/bash_completion.d/nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/usr/local/opt/nvm/etc/bash_completion.d/nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;  # This loads nvm bash_completion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;# place this after nvm initialization!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;autoload&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; -U&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; add-zsh-hook&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;load-nvmrc&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;  local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;  local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; nvmrc_path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;nvm_find_nvmrc&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$nvmrc_path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ];&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; nvmrc_node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;nvmrc_path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;}&quot;)&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$nvmrc_node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;N/A&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ];&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;      nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;    elif&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$nvmrc_node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; !=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ];&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;      nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; use&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;  elif&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$node_version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; !=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; version default&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ];&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;Reverting to nvm default version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    nvm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; use&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;add-zsh-hook&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; chpwd&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; load-nvmrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;load-nvmrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;bonus-avec-mux-et-tmuxinator&quot;&gt;Bonus avec mux et tmuxinator&lt;/h3&gt;
&lt;p&gt;Si vous travaillez avec un projet Symfony contenant du JS ayant besoin d’être compilé, vous allez surement avoir besoin de 3 onglet de terminal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une session sur &lt;code&gt;symfony serve&lt;/code&gt; le webserveur&lt;/li&gt;
&lt;li&gt;Une session à la racine de votre projet&lt;/li&gt;
&lt;li&gt;Une session sur &lt;code&gt;yarn dev-server&lt;/code&gt; pour compiler votre Javascript quand il est modifié.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour gagner en confort, je vous suggère d’utiliser &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; avec le multiplexer de terminal &lt;code&gt;tmux&lt;/code&gt;. Il permettra de scinder vos terminaux en terminaux virtuels et de pouvoir les splitter. Concrètement, quand je lance dans mon terminal &lt;code&gt;mux start &amp;lt;nom_du_projet&amp;gt;&lt;/code&gt; j’ai automatiquement mes containers qui se lancent, mon split de terminal qui se fait, et &lt;code&gt;yarn dev-server&lt;/code&gt; dans un onglet virtuel comme ci-dessous.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/vm-docker/symfony-cli.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/vm-docker/symfony-cli.jpg&quot; alt=&quot;Illustration du binaire Symfony CLI, sur la gauche, différentes étapes pour booter le projet, sur la droite le serveur web lancé par `symfony serve` qui traitera vos requêtes&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;396&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Illustration du binaire Symfony CLI, sur la gauche, différentes étapes pour booter le projet, sur la droite le serveur web lancé par `symfony serve` qui traitera vos requêtes&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Pour profiter de la même chose:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; tmux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; tmuxinator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;puis rajouter l’alias dans votre &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;alias mux=tmuxinator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;puis la configuration d’un projet est assez basique&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;mux open &amp;lt;nom_du_projet&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;et configurer votre projet à l’aide de la documentation de &lt;a href=&quot;https://github.com/tmuxinator/tmuxinator&quot;&gt;tmuxinator&lt;/a&gt;, comme par exemple :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;# /Users/t.bessoussa/.config/tmuxinator/&amp;lt;nom_du_projet&amp;gt;.yml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; &amp;lt;nom_du_projet&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; ~/workspace/&amp;lt;mon_projet&amp;gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # Chemin de votre projet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;# Run on project exit ( detaching from tmux session )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;on_project_exit&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; make halt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;# Run on project stop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;on_project_stop&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; make halt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;windows&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; php&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;      layout&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; main-vertical&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;      panes&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;        -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; make setup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;        -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; symfony serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt; js&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; sleep 70&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; # on attends un peu vu que mon make setup va lancer un build js de dev qui rentrerait en conflit avec le dev-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; yarn dev-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il ne vous reste plus qu’à retenir &lt;code&gt;mux start &amp;lt;nom_du_projet&amp;gt;&lt;/code&gt; et &lt;code&gt;mux stop &amp;lt;nom_du_projet&amp;gt;&lt;/code&gt; et le tour est joué.&lt;/p&gt;
&lt;p&gt;Une typo ? L’article est disponible sur mon &lt;a href=&quot;https://github.com/tristanbes/devops-life/blob/gh-pages/_posts/2021-04-28-un-environnement-de-developpement-sain-en-2021-hello-docker-goodbye-machines-virtuelles.md&quot;&gt;dépôt Github&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>VM</category><category>Docker</category><category>Machine Virtuelles</category><category>PHP</category><category>environnement de développement</category></item><item><title>Essai du PaaS Suisse, Hidora</title><link>https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/</link><guid isPermaLink="true">https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/</guid><description>Ce billet s&apos;inscrit dans la suite d&apos;une série d&apos;articles visant à faire un retour d&apos;expérience sur les différents PaaS français dans une problématique…</description><pubDate>Tue, 19 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ce billet s’inscrit dans la suite d’une série d’articles visant à faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série initiale :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bien que ma quête pour héberger notre parc de WordPress s’est achevée fin 2019, j’ai décidé de tester Hidora, un PaaS suisse 🇨🇭.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;hidora&quot;&gt;Hidora&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#r%C3%A9sum%C3%A9-hidora-tldr&quot;&gt;Accéder au résumé si vous êtes pressés&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;build-de-lapplication-sur-hidora&quot;&gt;Build de l’application sur Hidora&lt;/h4&gt;
&lt;p&gt;Hidora propose des installations préconçues pour les principaux CMS, néanmoins, il n’est pas possible de choisir l’édition de WordPress désirée et l’unique proposée est l’édition basique, et non &lt;a href=&quot;https://roots.io/bedrock/&quot;&gt;Bedrock&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Comment build notre WordPress qui nécessite d’installer les dépendances &lt;code&gt;composer&lt;/code&gt; et &lt;code&gt;javascript&lt;/code&gt; ?&lt;/p&gt;
&lt;p&gt;Plusieures difficultés se sont posés pour arriver à déployer notre projet avec  WordPress - Bedrock:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Les environnements PHP chez Hidora n’embarquent aucune runtime &lt;code&gt;Node.js&lt;/code&gt;, il n’est pas possible d’y faire &lt;code&gt;yarn install &amp;amp;&amp;amp; yarn build&lt;/code&gt; pour générer les fichiers &lt;code&gt;css&lt;/code&gt; et &lt;code&gt;js&lt;/code&gt;. Il a donc fallu identifier la distribution sur laquelle tourne le scaler (CentOS), puis installer &lt;code&gt;Node.js&lt;/code&gt;, puis &lt;code&gt;yarn&lt;/code&gt; à la main sur le noeud PHP en SSH, en ayant au préalable demandé au support de nous mettre les droits &lt;code&gt;root&lt;/code&gt; sur notre environnement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lorsque nous devons personnaliser le script de “post deploy” pour y rajouter notre &lt;code&gt;composer install&lt;/code&gt;, nous nous attendons à être à la racine du dossier contenant notre application déployée, ce n’est pas le cas. Il n’a pas été facile de savoir ou se rendre pour rentrer dans notre répertoire applicatif (&lt;code&gt;cd $WEBROOT/app&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il n’y a malheureusement pas de multi-edition des variables d’environnements. J’ai du en saisir 30 à la main, une par une: c’est long. Avoir une zone de texte éditable pour pouvoir coller toutes nos variables aurait été plus rapide.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je pense que la frustration ressentie face à ces nombreuses problématiques/questions peuvent être réglées par l’édition de “cookbook” pour répondre aux questions que les nouveaux clients doivent se poser quand ils arrivent sur Hidora (ex: Comment déployer une application Symfony, WordPress…). Les seuls guides que j’ai trouvés sont ceux de la solution qu’à choisi Hidora pour exploiter son cloud: &lt;a href=&quot;https://jelastic.com/&quot;&gt;Jelastic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Capture d’écran de l’interface d’administration :
&lt;img src=&quot;https://devops-life.com/img/paas/hidora-ui.png&quot; alt=&quot;Interface Hidora UI&quot; width=&quot;1305&quot; height=&quot;884&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;performance-chez-hidora&quot;&gt;Performance chez Hidora&lt;/h4&gt;
&lt;p&gt;Voilà une des typologies de l’infrastructure faisant tourner le WordPress. Les visuels viennent faciliter la compréhension et les ressources allouées.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://devops-life.com/img/paas/hidora-typology.png&quot; alt=&quot;Hidora Typologie Infrastructure WordPress&quot; width=&quot;979&quot; height=&quot;609&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exemple : J’envoie 5 visiteurs uniques par seconde pendant 2 minutes sur la page d’accueil. Pas d’optimisations excepté le &lt;code&gt;pm.max_children&lt;/code&gt; réglé sur 10.&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;10,8€&lt;/strong&gt;/mois chez &lt;u&gt;Scalingo&lt;/u&gt;, j’obtiens &lt;strong&gt;492ms&lt;/strong&gt; de moyenne de temps de réponse.&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;15,7€&lt;/strong&gt;/mois chez &lt;u&gt;Hidora&lt;/u&gt;, j’obtiens &lt;strong&gt;2 048ms&lt;/strong&gt; de moyenne de temps de réponse.&lt;/p&gt;
&lt;p&gt;Les performances ne sont donc pas bonnes par défaut. Je pense qu’il serait possible d’obtenir de meilleurs performances, mais n’ayant eu à appliquer d’autres améliorations sur les autres plateformes testés, je ne l’ai pas fait ici non plus.&lt;/p&gt;
&lt;p&gt;Pour plus de détail, voir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notons qu’Hidora propose une tarification à la ressource réellement consommée. Nous pouvons reserver 2Ghz/2Gb de RAM, et dire que nous autorisons jusqu’à 6Ghz/6Gb de RAM consommés. Si votre applicatif consomme par moment 3,4Ghz de CPU, vous serez facturé uniquement sur la base de cette consommation, et non la borne maximale (6Ghz) choisie ce qui permet de mieux maitriser les coûts lors de pics de charge.&lt;/p&gt;
&lt;h3 id=&quot;résumé-hidora-tldr&quot;&gt;Résumé Hidora (TLDR)&lt;/h3&gt;
&lt;h4 id=&quot;-inconvénients&quot;&gt;👎 Inconvénients&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Interface basé sur Jelastic: complexité de l’interface, peu sexy.&lt;/li&gt;
&lt;li&gt;L’interface Jelastic aurait pu être plus orienté UX.&lt;/li&gt;
&lt;li&gt;La flexibilité peut introduire des mauvaises pratiques (= modifications à la main sur le serveurs de fichiers de config)&lt;/li&gt;
&lt;li&gt;PaaS pas vraiment 100% “PaaS”: on se retrouve à installer des choses manuellement en &lt;code&gt;SSH&lt;/code&gt; via &lt;code&gt;apt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le build de l’application se fait sur la même machine qui éxecute le code. J’ai dû augmenter la RAM disponible de la plateforme juste pour le build, alors que pour le run, il n’y en avait pas réellement besoin.&lt;/li&gt;
&lt;li&gt;Pas de possibilité de déporter facilement (1 click) le build de l’application sur un scaler, plus gros, à part afin de ne payer que la consommation de ce scaler au moment où l’on en a besoin.&lt;/li&gt;
&lt;li&gt;Performances brutes par défaut (sans avoir à faire des optimisations)&lt;/li&gt;
&lt;li&gt;Le support ne propose pas un canal “live chat”&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-avantages&quot;&gt;👍 Avantages&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Interface basé sur Jelastic: les ressources internes sont dédiées à autre chose que développer l’UI.&lt;/li&gt;
&lt;li&gt;Très flexible (accès &lt;code&gt;root&lt;/code&gt;, &lt;code&gt;sFTP&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;). C’est top si vous avez beaucoup d’intégrations qui ne sont pas supportés par d’autres PaaS.&lt;/li&gt;
&lt;li&gt;Beaucoup de technologies supportés, dont Docker&lt;/li&gt;
&lt;li&gt;Le support qui à pris le temps de répondre a certaines problématiques par visioconférence, en écran partagé.&lt;/li&gt;
&lt;li&gt;Les data sont hébérgées en Suisse.&lt;/li&gt;
&lt;li&gt;Les ressources consommées sont celles réellement facturées lorsque l’on utilise des ressources flexibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;verdict&quot;&gt;Verdict&lt;/h3&gt;
&lt;p&gt;Je ne suis pas sûr d’être en mesure de recommander Hidora dans le scénario ou un &lt;strong&gt;développeur&lt;/strong&gt; serait chargé de configurer et déployer un applicatif (comme on peut le retrouver dans des petites équipes). En effet la couche d’UI fournie par Jelastic est, je trouve, assez complexe à prendre en main et l’expérience nécessite plus de compétences “infra / ops / run” que d’autre hébergeur 100% PaaS que j’ai évoqué dans cette série d’articles.&lt;/p&gt;
&lt;p&gt;On peut se retrouver à faire des opérations hybrides entre de la configuration au travers de l’UI, comme l’on peut s’y attendre pour un PaaS. Mais, de manière plus surprenante, on peut aussi avoir à modifier via &lt;code&gt;sFTP&lt;/code&gt; ou via &lt;code&gt;SSH&lt;/code&gt; des fichiers de configuration (&lt;code&gt;php.ini&lt;/code&gt;, &lt;code&gt;vhost.conf&lt;/code&gt;) ce qui donne l’impression de configurer un serveur dédié ou un VPS.&lt;/p&gt;
&lt;p&gt;Pour les clients qui découvrent l’interface Jelastic, utilisé par Hidora, le partage d’écran avec le support est nécessaire pour y voir plus clair.&lt;/p&gt;
&lt;p&gt;⚠️ Mon avis sur cet hébérgeur ne concerne que l’utilisation que j’en ai faite. Honnêtement, je ne suis pas sûr que mon cas d’utilisation tire le meilleur parti de cet hébérgeur ⚠️&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Performances</category><category>Hidora</category><category>Hosting</category><category>Cloud</category></item><item><title>Comment le serverless nous a sauvé la mise pour 2 $</title><link>https://devops-life.com/fr/blog/2020/03/06/serverless-bref-sh-2-dollars/</link><guid isPermaLink="true">https://devops-life.com/fr/blog/2020/03/06/serverless-bref-sh-2-dollars/</guid><description>Ces derniers mois, vous avez sûrement vu passer les mots « serverless » ou « FaaS » (Function as a Service), en vous demandant : « Bon, simple effet de mode…</description><pubDate>Fri, 06 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ces derniers mois, vous avez sûrement vu passer les mots « serverless » ou « FaaS » (Function as a Service), en vous demandant : « Bon, simple effet de mode, ou il y a vraiment quelque chose à y gagner ? »&lt;/p&gt;
&lt;p&gt;Je vous propose un retour d’expérience sur un cas concret, rencontré dans l’entreprise où je travaille : il montre pourquoi le passage au serverless nous a permis de répondre au besoin.&lt;/p&gt;
&lt;p&gt;Pour y arriver, nous avons utilisé les produits, frameworks et bibliothèques suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://symfony.com/&quot;&gt;Symfony (PHP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bref.sh/&quot;&gt;Bref.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://serverless.com/&quot;&gt;Serverless Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spatie/browsershot&quot;&gt;Browsershot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pptr.dev/&quot;&gt;Puppeteer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/sqs/&quot;&gt;Amazon SQS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/lambda/?nc2=type_a&quot;&gt;Amazon Lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scaleway.com/en/object-storage/&quot;&gt;Scaleway S3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mon équipe travaille avec &lt;code&gt;PHP7&lt;/code&gt;, &lt;code&gt;Symfony&lt;/code&gt; et &lt;code&gt;Vue.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une coquille ou une erreur dans la version originale ? Vous pouvez contribuer à cet article en &lt;a href=&quot;https://github.com/tristanbes/devops-life/tree/gh-pages/_posts/2020-03-06-how-serverless-saved-us-for-$2-with-bref-sh.md&quot;&gt;proposant une pull request&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;le-besoin--générer-des-rapports-statistiques-en-pdf&quot;&gt;Le besoin : générer des rapports statistiques en PDF&lt;/h2&gt;
&lt;p&gt;Voici les user stories :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;« En tant que client du CMS,
je dois recevoir chaque mois un rapport PDF contenant plusieurs statistiques sur mon site web »&lt;/li&gt;
&lt;li&gt;« En tant que revendeur de ce groupe de clients du CMS,
je dois recevoir chaque mois un rapport PDF qui reprend les rapports de chacun de mes clients (une partie de chacun) »&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concrètement, pour les quelques clients qui disposent de cette fonctionnalité, cela fait plus de 2 000 PDF à générer.
Voici à quoi ressemble l’un des PDF à générer :&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/serverless/pdf-lambda-result.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/serverless/pdf-lambda-result.jpg&quot; alt=&quot;Le PDF obtenu&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;842&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Le PDF obtenu&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;loption-vps-ou-serveur-dédié&quot;&gt;L’option VPS ou serveur dédié&lt;/h3&gt;
&lt;p&gt;Vous pourriez mettre en place une tâche cron sur l’un de vos serveurs, qui se chargerait de lancer une commande pour générer les PDF.
Le principal problème : &lt;strong&gt;ça ne passe pas à l’échelle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;~20 secondes (génération d’un PDF) x 2 000 PDF = &lt;em&gt;11 heures de génération de PDF&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;La génération prend 2 secondes en moyenne, mais un PDF lourd, qui contient plusieurs pages de plusieurs rapports, peut demander jusqu’à 30 secondes.&lt;/p&gt;
&lt;p&gt;Pendant ces 11 heures, il vous faudrait garantir que la génération tienne la distance (déploiements de l’application, redémarrages du serveur, etc.), et disposer d’un moyen de vérifier que le processus tourne toujours, par exemple avec &lt;a href=&quot;http://supervisord.org/&quot;&gt;Supervisor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il vous faudrait aussi écrire tout le processus en « &lt;a href=&quot;https://en.wikipedia.org/wiki/Defensive_programming&quot;&gt;programmation défensive&lt;/a&gt; », pour que votre code continue de fonctionner face aux imprévus.&lt;/p&gt;
&lt;p&gt;Comme notre application est en PHP, elle n’est pas multithread : impossible de tirer facilement parti de tous les cœurs CPU de notre serveur dédié. Pour paralléliser, l’une des solutions consiste à louer davantage de serveurs, qu’il faut ensuite déployer, provisionner et administrer.&lt;/p&gt;
&lt;h3 id=&quot;loption-serverless&quot;&gt;L’option serverless&lt;/h3&gt;
&lt;p&gt;Voici comment s’enchaînent les étapes de notre architecture.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/serverless/pdf-lambda-architecture.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/serverless/pdf-lambda-architecture.jpg&quot; alt=&quot;Architecture serverless de génération des PDF, avec 2 applications Symfony.&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;310&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Architecture serverless de génération des PDF, avec 2 applications Symfony. &lt;br /&gt;&lt;a href=&apos;/img/serverless/pdf-lambda-architecture.jpg&apos;&gt;L’architecture serverless en Full HD&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/serverless/puml-lambda-pdf.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/serverless/puml-lambda-pdf.png&quot; alt=&quot;Diagramme PUML du processus de génération des PDF&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;310&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Diagramme PUML du processus de génération des PDF&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4 id=&quot;étape-1--préparer-les-données&quot;&gt;Étape 1 : préparer les données&lt;/h4&gt;
&lt;p&gt;Comme ce PDF agrège de nombreuses données, internes et externes, mieux vaut avoir les &lt;strong&gt;données prêtes&lt;/strong&gt; au moment de le générer. L’application CMS (&lt;code&gt;app #1&lt;/code&gt;, PHP/Symfony) se charge de &lt;strong&gt;rassembler et de stocker dans une instance Redis toutes les données&lt;/strong&gt; nécessaires à la construction du PDF.&lt;/p&gt;
&lt;p&gt;Puisque l’on vise la scalabilité, il ne faut pas que le service chargé de générer les PDF aille demander les données à &lt;code&gt;app #1&lt;/code&gt; via une API : elle deviendrait un goulot d’étranglement si 3 000 lambdas lui envoyaient des requêtes en même temps.&lt;/p&gt;
&lt;h4 id=&quot;étape-2--créer-des-messages-asynchrones&quot;&gt;Étape 2 : créer des messages asynchrones&lt;/h4&gt;
&lt;p&gt;Une fois toutes les données prêtes, &lt;code&gt;app #1&lt;/code&gt; les met en forme dans un message, qu’elle glisse dans une enveloppe avec &lt;a href=&quot;https://symfony.com/doc/current/messenger.html&quot;&gt;Symfony Messenger&lt;/a&gt; pour &lt;strong&gt;envoyer les messages dans une file Amazon SQS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Remarque pour les utilisateurs de Symfony : comme les messages seront lus par une autre application (Symfony, elle aussi), vous devez utiliser un sérialiseur de messages personnalisé. Pour en savoir plus, lisez la &lt;a href=&quot;https://github.com/symfony/symfony/issues/33912&quot;&gt;RFC que j’ai ouverte sur le dépôt de Symfony&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;étape-3--stocker-les-messages-dans-une-file-dattente&quot;&gt;Étape 3 : stocker les messages dans une file d’attente&lt;/h4&gt;
&lt;p&gt;Dès que les messages arrivent dans la file Amazon SQS, ils déclenchent notre lambda, qui exécute notre code de génération des PDF.&lt;/p&gt;
&lt;p&gt;Remarque : la structure de nos messages (un Plain Old PHP Object) est stockée dans un autre dépôt git. Pourquoi ? Parce que &lt;code&gt;app #1&lt;/code&gt; et &lt;code&gt;app #2&lt;/code&gt; ont toutes les deux besoin de ce POPO. Qu’un développeur modifie la structure du message dans &lt;code&gt;app #1&lt;/code&gt; en oubliant de le faire dans &lt;code&gt;app #2&lt;/code&gt;, c’était un risque inutile.&lt;/p&gt;
&lt;h4 id=&quot;étape-4--générer-les-pdf&quot;&gt;Étape 4 : générer les PDF&lt;/h4&gt;
&lt;p&gt;Jusqu’à &lt;strong&gt;3 000 instances de lambda sont démarrées&lt;/strong&gt; : là, on parle de scalabilité sérieuse (dans notre cas, nous nous sommes limités à 50 lambdas simultanées). Chaque lambda reçoit un message qui contient les données nécessaires pour générer 1 PDF.&lt;/p&gt;
&lt;p&gt;La lambda exécute ensuite notre &lt;code&gt;app #2&lt;/code&gt; (PHP, Symfony), chargée d’afficher une vue dans une page web à partir de simples templates &lt;code&gt;.twig&lt;/code&gt;, avec un peu de JavaScript pour dessiner les graphiques.&lt;/p&gt;
&lt;p&gt;Le code utilise ensuite &lt;a href=&quot;https://github.com/spatie/browsershot&quot;&gt;Browsershot&lt;/a&gt;, qui transforme une page web en PDF : un Chrome headless, piloté par Puppeteer, visite l’URL qui affiche le template &lt;code&gt;.twig&lt;/code&gt;, lequel deviendra notre PDF.&lt;/p&gt;
&lt;p&gt;Une fois généré, le PDF est stocké dans un &lt;strong&gt;bucket S3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nous avons utilisé &lt;a href=&quot;https://bref.sh/&quot;&gt;Bref.sh&lt;/a&gt; autour de Symfony. C’est &lt;strong&gt;génial&lt;/strong&gt; : Bref intègre votre framework PHP préféré aux lambdas, et fournit différents &lt;a href=&quot;https://bref.sh/docs/runtimes/#bref-runtimes&quot;&gt;runtimes PHP&lt;/a&gt; qui tourneront sur la lambda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les 2 000 PDF sont tous générés en 2 minutes&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;étape-5--envoyer-le-pdf-au-client-par-e-mail&quot;&gt;Étape 5 : envoyer le PDF au client par e-mail&lt;/h4&gt;
&lt;p&gt;Le schéma d’architecture ne montre qu’une partie de ce qui se passe réellement. Une fois le PDF généré dans le bucket, nous créons un nouveau message, que nous envoyons dans une autre file SQS. Cette file-là fait de nouveau appel à &lt;code&gt;app #2&lt;/code&gt; (mais à une autre partie du code) pour envoyer au client un e-mail avec le PDF en pièce jointe, et pour prévenir l’application CMS : les clients peuvent ainsi télécharger leur PDF depuis le back-office, eux aussi.&lt;/p&gt;
&lt;h2 id=&quot;comparatif&quot;&gt;Comparatif&lt;/h2&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;VPS ou serveur dédié&lt;/th&gt;
&lt;th&gt;Serverless&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complexité&lt;/td&gt;
&lt;td&gt;Faible&lt;/td&gt;
&lt;td&gt;Moyenne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût&lt;/td&gt;
&lt;td&gt;Élevé&lt;/td&gt;
&lt;td&gt;Faible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalabilité&lt;/td&gt;
&lt;td&gt;Complexe&lt;/td&gt;
&lt;td&gt;Très scalable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;L’un des principaux avantages d’une architecture serverless, c’est que vous n’êtes facturé que pour le temps réellement nécessaire à l’exécution du code.&lt;/p&gt;
&lt;p&gt;Vous n’avez pas non plus à vous soucier d’où ni de comment il tourne : vous livrez votre code, et il s’exécute dans le cloud. C’est le fournisseur cloud qui se charge d’allouer les ressources machine.&lt;/p&gt;
&lt;p&gt;Dans notre exemple, avec l’offre gratuite d’Amazon Lambda et d’Amazon SQS, générer 2 000 PDF nous coûte &lt;strong&gt;~1,63 $&lt;/strong&gt; (1,62 $ pour SQS, 0,01 $ pour Lambda). Pour affiner vos estimations, vous pouvez utiliser ce &lt;a href=&quot;https://cost-calculator.bref.sh/&quot;&gt;calculateur de coûts serverless&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous pensez qu’une partie de votre code gagnerait à passer sur une architecture serverless, je vous conseille de commencer par un POC très simple, pour vous familiariser avec ces nouveaux concepts. C’est ce que nous avons fait avec une petite portion de notre code, avant même de nous attaquer au problème des PDF, pour mieux comprendre tout l’écosystème (files d’attente, lambdas, notifications…). Nous avons aujourd’hui 5 lambdas, chacune chargée d’une tâche précise (en dehors des PDF).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pour aller plus loin&lt;/strong&gt;, sous un angle plus technique : &lt;a href=&quot;https://hugo.alliau.me/2020/01/02/generate-pdfs-on-amazon-aws-with-php-and-puppeteer/&quot;&gt;Generate PDFs on Amazon AWS with PHP and Puppeteer&lt;/a&gt;, écrit par Hugo Alliaume, qui nous a beaucoup aidés sur ce sujet. Vous y trouverez de nombreux détails, comme la façon dont nous avons embarqué Chrome dans la lambda.&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>faas</category><category>serverless</category><category>architecture</category><category>bref.sh</category><category>Symfony</category><category>sqs</category><category>lambda</category><category>php</category></item><item><title>Travailler avec WordPress sans déprimer</title><link>https://devops-life.com/fr/blog/2019/04/10/etat-de-wordpress-en-2019/</link><guid isPermaLink="true">https://devops-life.com/fr/blog/2019/04/10/etat-de-wordpress-en-2019/</guid><description>Vous avez choisi WordPress pour un nouveau projet (ou on l&apos;a choisi pour vous) ? Bonne nouvelle : en 2019, ce n&apos;est plus forcément la galère dès le départ.</description><pubDate>Wed, 10 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bon, vous avez choisi de démarrer un nouveau projet WordPress (ou quelqu’un l’a choisi pour vous) ? Bonne nouvelle : nous sommes en 2019, et ce n’est plus forcément la galère dès le départ.&lt;/p&gt;
&lt;p&gt;Dans cet article, je ne vais pas tout expliquer en détail, il me faudrait un livre entier pour ça. Je vais simplement vous indiquer des pistes : &lt;strong&gt;comment faire mieux que la méthode officielle, bancale&lt;/strong&gt;, qui se justifiait il y a 10 ans. Cet article s’adresse à tout le monde : développeurs web, back-end, front-end…&lt;/p&gt;
&lt;p&gt;Promis, il n’y a &lt;em&gt;pas plus de 3 minutes de lecture&lt;/em&gt; par chapitre.&lt;/p&gt;
&lt;p&gt;Dans l’entreprise où je travaille, nous avons plus de 150 sites WordPress. J’ai décidé que les nouveaux adopteraient tout ce que je décris dans cet article, et que les anciens y migreraient petit à petit. À l’heure où j’écris ces lignes, ~10% d’entre eux utilisent déjà cette architecture.&lt;/p&gt;
&lt;p&gt;Remarque : si vous repérez des fautes d’anglais dans la version originale, j’accepte volontiers les &lt;a href=&quot;https://github.com/tristanbes/devops-life/blob/gh-pages/_posts/2019-04-10-state-of-wordpress-in-2019.md&quot;&gt;pull requests&lt;/a&gt; pour les corriger.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;utilisez-bedrock-edition&quot;&gt;Utilisez Bedrock Edition&lt;/h2&gt;
&lt;p&gt;C’est &lt;strong&gt;LE&lt;/strong&gt; point de départ de cet article. Bedrock est un boilerplate WordPress créé par &lt;a href=&quot;https://roots.io/&quot;&gt;Roots&lt;/a&gt;. Il s’appuie sur des outils de développement modernes et adopte la &lt;a href=&quot;https://12factor.net/&quot;&gt;méthodologie 12 Factor App&lt;/a&gt;. Autant de choses que WordPress ne peut pas (ou ne veut pas) faire, à cause de son statut de dinosaure 🦖 du monde PHP.&lt;/p&gt;
&lt;p&gt;Voici les principaux avantages de ce boilerplate :&lt;/p&gt;
&lt;h4 id=&quot;prise-en-charge-des-variables-denvironnement&quot;&gt;Prise en charge des variables d’environnement&lt;/h4&gt;
&lt;p&gt;Si vous avez déjà travaillé sur des applications modernes, le principe de stocker la configuration de votre application dans des variables d’environnement vous est familier.&lt;/p&gt;
&lt;p&gt;L’intérêt des variables d’environnement, c’est de pouvoir disposer de plusieurs environnements, comme &lt;code&gt;production&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; et &lt;code&gt;development&lt;/code&gt;, et par exemple de n’activer l’envoi d’e-mails qu’en &lt;code&gt;production&lt;/code&gt;, sans devoir modifier en permanence des valeurs selon l’environnement sur lequel vous vous trouvez.&lt;/p&gt;
&lt;p&gt;En 2019, tous les grands frameworks du monde PHP ont une notion de variables d’environnement : &lt;em&gt;Symfony&lt;/em&gt;, &lt;em&gt;Laravel&lt;/em&gt;, &lt;em&gt;Yii&lt;/em&gt;. C’est une pratique courante, qui existe depuis des décennies dans les mondes Windows et Unix.&lt;/p&gt;
&lt;p&gt;Les variables d’environnement peuvent être stockées dans un fichier en &lt;code&gt;development&lt;/code&gt;, et injectées dans votre serveur web pour les environnements de &lt;code&gt;staging&lt;/code&gt; et de &lt;code&gt;production&lt;/code&gt;. Pas de panique : beaucoup d’hébergeurs dignes de ce nom proposent une interface pour manipuler les variables d’environnement. Regardez par exemple &lt;a href=&quot;https://devcenter.heroku.com/articles/config-vars#using-the-heroku-dashboard&quot;&gt;ce que fait Heroku pour les variables d’environnement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Des variables d’environnement, ça ressemble à ceci :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;mysql://john_doe:p4sSWorD@127.0.0.1:3306/db_awesome_blog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;WP_ENV&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;development&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;WP_HOME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;http://my-awesome-wordpress.vm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;WP_SITEURL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;WP_HOME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;/wp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;une-arborescence-mieux-pensée&quot;&gt;Une arborescence mieux pensée&lt;/h4&gt;
&lt;p&gt;Tout est mieux rangé, et du coup, on trouve plus facilement ce que l’on cherche. L’arborescence ressemble à ceci :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; composer.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; .env&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;-----------------&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; majority&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; configuration&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; will&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; happen,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; must&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; be&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; committed&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; inside&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; repository&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; application.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; environments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; development.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; staging.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; production.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; vendor&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;--------------&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; 3rd&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; party&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; code&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; lives&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;└──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    │&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; mu-plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    │&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    │&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; themes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    │&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; uploads&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; wp-config.php&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; do&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; touch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    ├──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; index.php&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;------&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; point&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; your&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; application,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; each&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; are&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; send&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; through&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    └──&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; wp&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;-------------&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; WordPress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt; files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Point bonus pour la sécurité : la racine web (le point d’entrée de votre application), &lt;code&gt;web/index.php&lt;/code&gt;, est isolée du reste de l’arborescence. Vos visiteurs ne peuvent donc pas accéder à votre fichier &lt;code&gt;config/production.php&lt;/code&gt;, puisqu’il se trouve en dehors de &lt;code&gt;web/&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;des-builds-reproductibles&quot;&gt;Des builds reproductibles&lt;/h4&gt;
&lt;p&gt;Le principe des &lt;a href=&quot;https://en.wikipedia.org/wiki/Reproducible_builds&quot;&gt;builds reproductibles&lt;/a&gt; peut se résumer ainsi : peu importe quand et où je construis et déploie l’application, j’obtiendrai toujours la même version du code (et des plugins).&lt;/p&gt;
&lt;p&gt;Comme vous allez travailler sur votre environnement local (si ce n’est pas déjà le cas 👀), vous devez garantir que ce que vous avez sur votre ordinateur sera exactement identique à ce que vous aurez en production. Prenons un exemple pour comprendre pourquoi c’est important.&lt;/p&gt;
&lt;p&gt;Imaginons que votre site tourne en production depuis à peu près un an, jusqu’au jour où une vilaine panne matérielle frappe votre serveur. Tous vos fichiers sont perdus. Heureusement pour vous, vous avez bien fait les choses : votre répertoire &lt;code&gt;uploads/&lt;/code&gt; et une sauvegarde de votre base de données sont stockés quelque part dans le cloud.&lt;/p&gt;
&lt;p&gt;L’étape suivante consiste à réinstaller WordPress à partir de la sauvegarde de la base de données et des médias. Puis à réinstaller les 20 plugins qu’utilisait ce site. En un an, les plugins évoluent (et c’est tant mieux), mais votre thème, ou certaines de vos fonctionnalités, ne sont peut-être pas compatibles avec WooCommerce &lt;code&gt;v3.5&lt;/code&gt;. Résultat possible : un &lt;strong&gt;site cassé&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Autre exemple : quand vous travaillez à plusieurs sur un projet, sans builds reproductibles, la personne chargée du front-end se retrouvera sur WordPress 5.1.1 pendant que le développeur en sera encore à la version 4.9.10, incapable de reproduire le bug que vous rencontrez avec cette configuration.&lt;/p&gt;
&lt;p&gt;Ce principe implique d’&lt;strong&gt;interdire toute installation ou mise à jour de plugins ou de thèmes depuis le back-office de WordPress&lt;/strong&gt;. Par défaut, Bedrock s’en charge quand vous êtes dans l’environnement de &lt;code&gt;production&lt;/code&gt;. Et comme WordPress est lui aussi une dépendance composer, le mettre à jour est aussi simple qu’un &lt;code&gt;composer update roots/wordpress&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Mais comment garantir des builds reproductibles ? La réponse se trouve juste en dessous : utilisez &lt;strong&gt;Composer&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;utilisez-composer&quot;&gt;Utilisez Composer&lt;/h2&gt;
&lt;p&gt;Le boilerplate Bedrock vous permet de gérer les dépendances de votre projet avec &lt;a href=&quot;https://getcomposer.org/&quot;&gt;Composer&lt;/a&gt;, comme devrait le faire &lt;strong&gt;tout&lt;/strong&gt; projet PHP moderne et digne de ce nom (oui, WordPress, c’est de toi que je parle).&lt;/p&gt;
&lt;p&gt;Vous voulez installer &lt;code&gt;WooCommerce&lt;/code&gt; ? Ouvrez votre terminal et tapez :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer require woocommerce/woocommerce&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Composer récupère la dernière version et la fige dans votre &lt;code&gt;composer.lock&lt;/code&gt;. C’est grâce à ce fichier que vous obtenez toujours exactement les mêmes versions, quels que soient le moment et l’endroit où vous installez les dépendances de votre projet avec &lt;code&gt;composer install&lt;/code&gt;. Vu son importance, ce fichier doit être commité ⚠️.&lt;/p&gt;
&lt;p&gt;Le site roots.io propose un bon article sur &lt;a href=&quot;https://roots.io/using-composer-with-wordpress/&quot;&gt;l’utilisation de composer avec WordPress&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tous les plugins peuvent aussi s’installer via composer. Comment ? &lt;strong&gt;3 scénarios sont possibles&lt;/strong&gt; :&lt;/p&gt;
&lt;h4 id=&quot;le-plugin-fournit-un-composerjson&quot;&gt;Le plugin fournit un &lt;code&gt;composer.json&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Derrière le plugin, il y a un développeur ou une entreprise qui ne souffre pas du syndrome du « WordPress d’un autre âge » et qui développe des applications modernes. Concrètement, son plugin est livré avec un fichier &lt;a href=&quot;https://github.com/woocommerce/woocommerce/blob/master/composer.json&quot;&gt;composer.json&lt;/a&gt; qui permet de l’installer via composer. Dans ce scénario, vous pouvez chercher votre plugin sur &lt;a href=&quot;https://packagist.org/?query=woocommerce&quot;&gt;packagist.org&lt;/a&gt;, le dépôt qui recense tous les paquets PHP publics de l’univers ✨.&lt;/p&gt;
&lt;h4 id=&quot;le-plugin-ne-fournit-pas-de-composerjson&quot;&gt;Le plugin ne fournit pas de &lt;code&gt;composer.json&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Si vous ne trouvez pas le plugin sur &lt;a href=&quot;https://packagist.org/&quot;&gt;packagist.org&lt;/a&gt;, c’est qu’il n’a pas de fichier &lt;code&gt;composer.json&lt;/code&gt;.
Pas d’inquiétude, &lt;strong&gt;wpackagist&lt;/strong&gt; vient à la rescousse. Outlandish a créé ce projet pour permettre d’installer 100% des plugins et des thèmes à partir du dépôt officiel de WordPress. Ce plugin WordPress-ci, par exemple, est introuvable sur packagist.org ; &lt;a href=&quot;https://wpackagist.org/&quot;&gt;utilisons donc wpackagist&lt;/a&gt; à la place :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer require wpackagist-plugin/cookie-law-info&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;le-plugin-est-payant-ou-privé-et-na-pas-de-composerjson&quot;&gt;Le plugin est payant ou privé et n’a pas de &lt;code&gt;composer.json&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Plusieurs options s’offrent alors à vous :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/elementor/elementor/issues/4042&quot;&gt;Ouvrez un ticket auprès de leur support&lt;/a&gt; ou sur leur GitHub, et demandez-leur un moyen d’installer leur plugin via composer. Vous êtes leur client, vous payez pour un produit que vous ne pouvez pas installer proprement. Ils devraient s’en soucier.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👎 Mauvais élèves : ACF Pro, Elementor Pro, Formidable Forms&lt;/li&gt;
&lt;li&gt;👍 Bon élève : &lt;a href=&quot;https://deliciousbrains.com/wp-migrate-db-pro/doc/installing-via-composer/&quot;&gt;Delicious Brains&lt;/a&gt; (Migrate DB Pro, Offload Media…).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/PhilippBaschke/acf-pro-installer&quot;&gt;Utilisez des solutions alternatives&lt;/a&gt; quand il y en a.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créez un nouveau dépôt GitHub privé (c’est gratuit), copiez-y le code et ajoutez un &lt;a href=&quot;https://gist.github.com/tristanbes/fbacfb2ce6990e7fdc7411a73715fd92&quot;&gt;composer.json comme dans cet exemple&lt;/a&gt;, taguez une nouvelle version avec les &lt;a href=&quot;https://help.github.com/en/articles/creating-releases&quot;&gt;GitHub Releases&lt;/a&gt;, puis installez ce paquet via un dépôt personnalisé (custom repository). Toute la procédure est &lt;a href=&quot;https://roots.io/guides/private-or-commercial-wordpress-plugins-as-composer-dependencies/&quot;&gt;détaillée sur le site roots.io&lt;/a&gt;. Si vous en avez le budget, je vous conseille d’utiliser &lt;a href=&quot;https://packagist.com/&quot;&gt;Private Packagist&lt;/a&gt; pour héberger vos paquets privés.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;utilisez-un-meilleur-moteur-de-templates-que-php---im-yelling-timber--&quot;&gt;Utilisez un meilleur moteur de templates que PHP : « I’m yelling timber » !&lt;/h2&gt;
&lt;p&gt;Et côté templates, alors ?
PHP n’est pas un bon moteur de templates. Difficile à lire, difficile à écrire, et ne nous voilons pas la face : nous ne sommes plus au début des années 2010, nous avons des outils conçus spécialement pour chaque usage. Le meilleur moteur de templates PHP, c’est &lt;a href=&quot;https://twig.symfony.com/&quot;&gt;Twig&lt;/a&gt;. Il est très utilisé dans l’écosystème Symfony (mais pas seulement).&lt;/p&gt;
&lt;p&gt;Alors, comment utiliser Twig dans un projet WordPress ? Heureusement pour nous, il existe un projet appelé &lt;a href=&quot;https://github.com/timber/timber&quot;&gt;Timber&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un plugin pour écrire des thèmes WordPress avec du code orienté objet et le moteur de templates Twig&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il ajoute un modèle Vue / Contrôleur, ce qui profitera énormément à la lisibilité et à la maintenance de votre thème.&lt;/p&gt;
&lt;p&gt;Une fois que vous aurez commencé à écrire vos thèmes en Twig, &lt;strong&gt;vous ne reviendrez plus au PHP brut&lt;/strong&gt;. Point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Astuce de pro&lt;/strong&gt; : comme vous ne concevez plus vos thèmes en PHP brut mais en Twig, le serveur doit transformer vos fichiers &lt;code&gt;.twig&lt;/code&gt; en fichiers &lt;code&gt;.php&lt;/code&gt;. Cette phase s’appelle la compilation, et elle prend du temps. Heureusement, il existe un système de cache qui stocke les templates compilés sur votre système de fichiers, pour que Twig ne recompile pas vos templates à chaque requête que votre serveur doit traiter.&lt;/p&gt;
&lt;p&gt;Par défaut, Timber n’active pas ce cache.&lt;/p&gt;
&lt;p&gt;Voici comment l’activer sans risque. Vous gagnerez ainsi jusqu’à 40% de temps de génération. Dans le &lt;code&gt;functions.php&lt;/code&gt; de votre thème :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;// Active le cache de Twig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;class_exists&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;Timber&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; WP_ENV&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;production&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;    Timber&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$cache &lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;// Remplacez WP_ENV === &apos;production&apos; par !WP_DEBUG si vous n&apos;êtes PAS dans une structure Bedrock&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/timber-cache.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/timber-cache.png&quot; alt=&quot;Écart de temps de rendu avant/après l’activation du système de cache de Twig. Plus de détails sur cette trace Blackfire.&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;37&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Écart de temps de rendu avant/après l’activation du système de cache de Twig. &lt;a href=&apos;https://blackfire.io/profiles/compare/5b79d23e-3bb8-4089-8e56-82aaae679b6b/graph&apos;&gt;Plus de détails sur cette trace Blackfire&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Notez que ce sont les templates PHP compilés qui sont mis en cache, pas les données. Une modification des templates &lt;code&gt;.twig&lt;/code&gt; en production ne sera pas prise en compte tant que vous n’aurez pas vidé le cache. (Mais qui modifie des fichiers en production ? 😱 Certainement pas vous !)&lt;/p&gt;
&lt;h2 id=&quot;stockez-de-préférence-vos-assets-dans-le-cloud&quot;&gt;Stockez de préférence vos assets dans le cloud&lt;/h2&gt;
&lt;p&gt;Stocker vos assets sur le système de fichiers local, dans le répertoire &lt;code&gt;uploads/&lt;/code&gt;, c’est pratique, mais tôt ou tard, il vous faudra synchroniser ce dossier entre tous vos environnements. Sinon, votre version locale aura un jeu de médias complètement différent de celui de la production, et inversement.&lt;/p&gt;
&lt;p&gt;Vous vous souvenez des builds reproductibles ? Ce serait bien de pouvoir stocker nos médias à distance pour ne plus dépendre du système de fichiers local, non ? Spoiler : oui, c’est bien.&lt;/p&gt;
&lt;p&gt;L’autre gros avantage de cette technique, c’est qu’elle &lt;strong&gt;permet à votre site de monter en charge&lt;/strong&gt; pour absorber un énorme pic de trafic. Il vous suffit d’ajouter des serveurs (scaling horizontal) : comme votre build est reproductible, le projet et les plugins seront identiques sur les serveurs numéro 1, 2, … 23, 24.&lt;/p&gt;
&lt;p&gt;Quelques services pour stocker vos médias dans le cloud :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/s3/&quot;&gt;Amazon S3&lt;/a&gt;. Le plus connu, mais pas le moins cher 💸.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/products/spaces/&quot;&gt;Digital Ocean Spaces&lt;/a&gt;. Compatible S3, 45 emplacements disponibles.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scaleway.com/object-storage/&quot;&gt;Scaleway&lt;/a&gt;. Stockage bon marché, compatible S3, mais seulement 2 emplacements disponibles (Paris et Amsterdam).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ Pensez à toujours choisir un bucket situé près de la majorité de votre audience.
Je vous conseille de choisir une « API compatible S3 », car il n’existe pas beaucoup de plugins WordPress qui permettent d’utiliser un stockage distant et qui fonctionnent dans la majorité des cas.&lt;/p&gt;
&lt;p&gt;Voici une liste de plugins gratuits qui permettent de stocker vos médias sur différents stockages cloud :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/ilab-media-tools/&quot;&gt;MediaCloud&lt;/a&gt; (gratuit)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/humanmade/S3-Uploads&quot;&gt;humanmade/s3-uploads&lt;/a&gt; (gratuit)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce que je souhaite pour WordPress, c’est qu’il utilise une abstraction du système de fichiers comme &lt;a href=&quot;https://flysystem.thephpleague.com/docs/&quot;&gt;Flysystem&lt;/a&gt;. Nous n’aurions alors plus besoin de plugins qui bidouillent WordPress pour lui dire d’envoyer les médias et les assets ailleurs. En attendant, vous pouvez utiliser l’un des plugins ci-dessus.&lt;/p&gt;
&lt;h2 id=&quot;connaissez-vos-outils--acf-peut-plomber-les-performances-de-votre-site&quot;&gt;Connaissez vos outils : ACF peut plomber les performances de votre site&lt;/h2&gt;
&lt;p&gt;Si vous utilisez Advanced Custom Fields, alias ACF, vous devez connaître certains goulots d’étranglement que vous risquez de rencontrer si vous abusez de la fonction &lt;code&gt;get_field&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;N’exposez que les variables dont vous avez besoin sur chaque page. J’ai vu beaucoup d’exemples, y compris dans la documentation, qui vous invitent à faire :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$context&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt; get_fields&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; // retrieve all options fields from the database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;Timber&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;index.twig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; $context&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt; // render the index.twig page with the options passed to the twig context so you can use them inside your view.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quand vous faites ça, chaque champ récupéré déclenche une requête en base de données. Si vous avez 35 champs dans la catégorie options, cela déclenche donc 35 requêtes rien que pour récupérer ces champs. Mais avez-vous vraiment besoin de ces 35 champs sur toutes les pages ?&lt;/p&gt;
&lt;p&gt;Que faire à la place ?&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$context&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;twitter_link&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt; get_fields&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;twitter_link&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;$context&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;logo_footer_img&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt; get_fields&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;logo_img&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; &apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;Timber&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6139C4;--shiki-dark:#B8A8FA&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#0D7358;--shiki-dark:#5FCDA8&quot;&gt;index.twig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; $context&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;twig&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#5F6B7D;--shiki-light-font-style:italic;--shiki-dark:#8795A9;--shiki-dark-font-style:italic&quot;&gt;{# utilisez-les dans votre template .twig #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;{{&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;twitter_link&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; }}&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;Follow us&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;--shiki-light:#AE3F14;--shiki-dark:#F3996F&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&apos;{{&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;logo_footer_img&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; }}&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#2855BC;--shiki-dark:#8DAEF6&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4B586B;--shiki-dark:#A2AEBE&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sur un vrai projet, ce genre d’optimisation apporte des gains de performance importants.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/blackfire-acf.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/blackfire-acf.png&quot; alt=&quot;Écart de temps de rendu avant/après avoir récupéré uniquement les champs ACF strictement nécessaires. -850 requêtes en base de données et -37% de temps de rendu ! Plus de détails sur cette trace Blackfire.&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;38&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Écart de temps de rendu avant/après avoir récupéré uniquement les champs ACF strictement nécessaires. -850 requêtes en base de données et -37% de temps de rendu ! &lt;a href=&apos;https://blackfire.io/profiles/compare/3984573f-3fc2-48fc-9683-2668c3a4a7e5/graph&apos;&gt;Plus de détails sur cette trace Blackfire&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;L’explicite vaut mieux que l’implicite. Cela aide aussi vos collègues à faire une revue de code plus précise de votre travail, un exercice bien plus difficile quand on ne sait pas à quoi votre template a accès.&lt;/p&gt;
&lt;p&gt;Et les champs vidéo et image ? Si vous en utilisez, sachez que si vous les récupérez « tels quels » avec &lt;code&gt;get_field(&apos;my_youtube_video&apos;)&lt;/code&gt;, le code va essayer de récupérer les métadonnées (taille, orientation, durée…) des vidéos et des images.&lt;/p&gt;
&lt;p&gt;Où est le problème ? Eh bien, comme vous hébergez vos médias dans le cloud (ou sur un service distant, YouTube dans cet exemple), &lt;strong&gt;les vidéos et les images doivent être téléchargées côté serveur&lt;/strong&gt; pour obtenir ces informations, dont vous n’aurez pas besoin dans 98% des cas. Faire des appels HTTP externes depuis votre serveur vers Internet fait alors perdre un temps précieux et tue les performances de votre site.&lt;/p&gt;
&lt;p&gt;J’ai vu des projets passer presque 1 seconde en appels externes, rien que pour récupérer les informations de 10 images dans le cloud, ce qui empêchait le serveur d’envoyer le HTML au navigateur pendant tout ce temps.&lt;/p&gt;
&lt;p&gt;Dans ces cas-là, vous devez utiliser &lt;code&gt;get_field(&apos;my_youtube_video&apos;, null, false)&lt;/code&gt;. Le dernier paramètre (&lt;code&gt;false&lt;/code&gt;) indique de récupérer la valeur brute du champ (ici, l’URL YouTube de la vidéo, sans mise en forme ni traitement supplémentaire). Autre solution : configurer le champ en tant que champ « URL » (et non oEmbed), et, pour les images, en « Image URL ».&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/external_http_calls_blackfire.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/external_http_calls_blackfire.png&quot; alt=&quot;Écart de temps de rendu avant/après la configuration des champs en champs URL plutôt qu’en oEmbed. Tous les appels HTTP externes que faisait le serveur pour récupérer les métadonnées des images ou des vidéos ont disparu (-7), soit 35% de temps gagné (-846ms) ! Plus de détails sur cette trace Blackfire.&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;39&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Écart de temps de rendu avant/après la configuration des champs en champs URL plutôt qu’en oEmbed. Tous les appels HTTP externes que faisait le serveur pour récupérer les métadonnées des images ou des vidéos ont disparu (-7), soit 35% de temps gagné (-846ms) ! &lt;a href=&apos;https://blackfire.io/profiles/compare/29fc43d1-fce1-447e-9d4e-cef4b2f53750/graph&apos;&gt;Plus de détails sur cette trace Blackfire&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;lintez-votre-code&quot;&gt;Lintez votre code&lt;/h2&gt;
&lt;p&gt;Votre thème embarque du CSS, du JavaScript et un peu de PHP ? Vous devriez les linter, pour vous assurer d’écrire du code conforme aux standards du métier. Utilisez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://eslint.org/&quot;&gt;ESLint&lt;/a&gt; - JavaScript&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stylelint.io/&quot;&gt;stylelint&lt;/a&gt; - CSS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt; - JavaScript, CSS…&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cs.symfony.com/&quot;&gt;PHP-CS-Fixer&lt;/a&gt; - PHP (exemple de notre &lt;a href=&quot;https://gist.github.com/tristanbes/8f29b6f9336a77fd9b205f3453aae892&quot;&gt;fichier .php_cs_dist&lt;/a&gt;, qui contient nos règles de lint)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Utilisez l’outil de build ou le task runner avec lequel vous êtes à l’aise (&lt;a href=&quot;https://gulpjs.com/&quot;&gt;Gulp&lt;/a&gt;, &lt;a href=&quot;https://brunch.io&quot;&gt;Brunch&lt;/a&gt;). Si vous n’avez pas encore choisi d’outil et qu’il vous en faut un simple, je vous suggère de jeter un œil à &lt;strong&gt;&lt;a href=&quot;https://github.com/Yproximite/yProx-cli&quot;&gt;yProx-CLI&lt;/a&gt;&lt;/strong&gt;, que nous utilisons depuis un moment chez Yproximité et que nous venons de publier en open source.&lt;/p&gt;
&lt;p&gt;Pour votre santé mentale, par pitié, n’ouvrez pas le code des plugins que vous téléchargez. Vous pourriez être choqué par la piètre qualité du code auquel vous avez affaire, et finir par réécrire une bonne partie de vos plugins WordPress.&lt;/p&gt;
&lt;h2 id=&quot;utilisez-un-service-dintégration-continue-ci&quot;&gt;Utilisez un service d’intégration continue (CI)&lt;/h2&gt;
&lt;p&gt;Utilisez une CI (&lt;a href=&quot;https://travis-ci.org/&quot;&gt;Travis&lt;/a&gt;, &lt;a href=&quot;https://about.gitlab.com/product/continuous-integration/&quot;&gt;GitLab&lt;/a&gt;, &lt;a href=&quot;https://circleci.com/&quot;&gt;CircleCI&lt;/a&gt;, &lt;a href=&quot;https://jenkins.io/&quot;&gt;Jenkins&lt;/a&gt;).
Voici notre fichier &lt;code&gt;.travis.yml&lt;/code&gt; de base. Il vérifie que notre &lt;code&gt;composer.json&lt;/code&gt; est valide, que notre code PHP passe le linter, et pareil pour nos fichiers JavaScript. Aucune pull request ne devrait être mergée avec des erreurs de lint : une fois en production, elles ne seront jamais corrigées. Vos pairs peuvent ainsi relire votre code en se concentrant sur l’essentiel.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dist: trusty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;language: php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;php:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &apos;7.3&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cache:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  yarn: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  directories:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - ./vendor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - ./node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - ~/.composer/cache/files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;before_install:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if [ -f &quot;package.json&quot; ]; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        set -e # properly fails Travis if one of the following commands fails&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        nvm install v10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        nvm use 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        node --version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        npm --version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        npm install --global yarn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        set +e # re-enable previous behaviour&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;script:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - composer validate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - composer install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - vendor/bin/php-cs-fixer fix -v --dry-run --using-cache=no&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - if [ -f &quot;package.json&quot; ]; then yarn install; fi;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - if [ -f &quot;package.json&quot; ]; then yarn lint; fi;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - if [ -f &quot;package.json&quot; ]; then yarn build; fi;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;mettez-en-place-un-outil-de-mise-à-jour-automatique-des-dépendances&quot;&gt;Mettez en place un outil de mise à jour automatique des dépendances&lt;/h2&gt;
&lt;p&gt;Avec 150 projets WordPress dans notre organisation, lancer &lt;code&gt;composer update&lt;/code&gt; sur chacun d’eux une fois par semaine n’est pas franchement ce dont nous avons envie : il a fallu trouver comment gérer les mises à jour.&lt;/p&gt;
&lt;p&gt;Nous utilisions &lt;a href=&quot;https://managewp.com/&quot;&gt;ManageWP&lt;/a&gt; pour mettre à jour WordPress et toutes ses dépendances, mais cette option n’est plus envisageable puisqu’elle casse le principe des builds reproductibles. Rien ne doit altérer ni modifier votre environnement. Le code doit être exactement le même que dans votre dépôt git.&lt;/p&gt;
&lt;p&gt;Une option viable pour nous a été de déléguer les mises à jour à &lt;a href=&quot;https://dependabot.com/&quot;&gt;Dependabot&lt;/a&gt;, dont le rôle est d’ouvrir une pull request dès qu’une mise à jour est disponible. Il existe des alternatives, par exemple &lt;a href=&quot;https://renovatebot.com/&quot;&gt;Renovate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nous l’avons configuré pour merger automatiquement les pull requests quand il s’agit d’une mise à jour mineure ou d’un patch (&lt;code&gt;v1.0.0 -&amp;gt; v1.1.4&lt;/code&gt; sera mergée automatiquement, mais pas &lt;code&gt;v1.0.0 -&amp;gt; v2.0.0&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;⚠️ L’écosystème WordPress ne respecte pas forcément le &lt;a href=&quot;https://semver.org/&quot;&gt;SemVer&lt;/a&gt;, parce que… (je cherche encore la raison…).&lt;/p&gt;
&lt;p&gt;Comme nous avons choisi une « Platform as a Service » (PaaS) pour héberger tous nos WordPress, dès qu’une pull request est mergée sur la branche master, le projet est redéployé en production.&lt;/p&gt;
&lt;p&gt;Quel que soit l’hébergement choisi, vous devriez avoir du déploiement automatique. Sinon, si vous devez redéployer chaque projet à la main et que vous en avez un très grand nombre, vos projets seront à jour, mais les mises à jour n’arriveront jamais en production.&lt;/p&gt;
&lt;h2 id=&quot;choisissez-le-bon-hébergement&quot;&gt;Choisissez le bon hébergement&lt;/h2&gt;
&lt;p&gt;Je vous conseille vivement d’opter pour une offre PaaS. Les principaux avantages d’une Platform as a Service (PaaS) sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aucune maintenance à prévoir, ni pour le serveur ni pour les logiciels&lt;/li&gt;
&lt;li&gt;Des déploiements automatisés&lt;/li&gt;
&lt;li&gt;Prête pour le scaling vertical et horizontal&lt;/li&gt;
&lt;li&gt;Bon marché&lt;/li&gt;
&lt;li&gt;Simple&lt;/li&gt;
&lt;li&gt;Isolée (pas de contamination croisée d’un site A vers un site B hébergés sur le même serveur)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques exemples de PaaS :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.heroku.com/&quot;&gt;🌍 Heroku&lt;/a&gt; (à partir de 14 $/mois)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scalingo.com/&quot;&gt;🇫🇷 Scalingo&lt;/a&gt; (à partir de 10,80 €/mois)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.clever-cloud.com/en/&quot;&gt;🇫🇷 Clever Cloud&lt;/a&gt; (à partir de 26,50 €/mois)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⛔️ N’utilisez jamais de FTP ou de SFTP pour déployer en production. Comme vous devez construire votre projet en lançant &lt;code&gt;composer install&lt;/code&gt;, et peut-être compiler vos assets avec &lt;code&gt;yarn build&lt;/code&gt;, le bon vieux copier-coller du projet sur votre FTP, qui avait déjà un pied dans la tombe, est &lt;strong&gt;définitivement et enfin&lt;/strong&gt; mort ⛔️&lt;/p&gt;
&lt;h2 id=&quot;ce-que-vous-devriez-déjà-faire&quot;&gt;Ce que vous devriez déjà faire&lt;/h2&gt;
&lt;p&gt;Voici une liste de choses que vous devriez déjà faire, et qui ne méritent donc pas un chapitre à elles seules :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Travaillez avec une machine virtuelle, pour que tout le monde ait le même environnement. Vous pouvez utiliser &lt;a href=&quot;https://roots.io/trellis/&quot;&gt;trellis&lt;/a&gt;, ou &lt;a href=&quot;http://www.manala.io/&quot;&gt;manala&lt;/a&gt; si vous êtes plus technique&lt;/li&gt;
&lt;li&gt;Utilisez la dernière version de PHP disponible&lt;/li&gt;
&lt;li&gt;Travaillez avec des pull requests&lt;/li&gt;
&lt;li&gt;Relisez le code de vos pairs, et demandez-leur de relire le vôtre&lt;/li&gt;
&lt;li&gt;Configurez GitHub pour interdire le merge d’une pull request qui n’a pas été relue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;note-aux-développeurs-de-plugins-wordpress&quot;&gt;Note aux développeurs de plugins WordPress&lt;/h2&gt;
&lt;p&gt;Pour faire de l’écosystème WordPress un monde meilleur, s’il vous plaît, respectez au moins ces 5 règles :&lt;/p&gt;
&lt;p&gt;⚠️ Ne partez pas du principe que les utilisateurs de votre plugin stockent leurs fichiers uploadés sur le système de fichiers local. &lt;strong&gt;Partez du principe que non&lt;/strong&gt;. Passez par une couche d’abstraction pour manipuler les fichiers, par exemple &lt;a href=&quot;https://flysystem.thephpleague.com/docs/&quot;&gt;Flysystem&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce raisonnement s’explique surtout par les cas suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quand vous hébergez votre application dans le cloud, vous voudrez peut-être pouvoir la faire monter en charge en ajoutant des serveurs.&lt;/li&gt;
&lt;li&gt;Quand vous hébergez votre WordPress sur une &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/what-is-immutable-infrastructure&quot;&gt;infrastructure immuable&lt;/a&gt;, ce qui veut dire, en gros :
&lt;ul&gt;
&lt;li&gt;Soit vous ne pouvez pas écrire sur le serveur, ce qui empêche toute modification ;&lt;/li&gt;
&lt;li&gt;Soit les modifications que vous avez faites sont perdues quand le projet est redéployé. (Un déploiement a lieu chaque fois que vous mergez du code dans votre dépôt, ou quand vous faites varier le nombre de serveurs de votre application, en en ajoutant ou en en retirant. Seul ce qui se trouve dans votre dépôt git est déployé sur le serveur.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⚙ Proposez un moyen de configurer votre plugin par variables d’environnement, avec un repli sur la base de données si la variable d’environnement est introuvable.
&lt;strong&gt;Variables d’environnement &amp;gt; configuration stockée en base de données&lt;/strong&gt;, par ordre d’importance. Cela nous permet d’automatiser l’installation des plugins et de regrouper toute la configuration au même endroit.&lt;/p&gt;
&lt;p&gt;🎻 Rendez votre plugin installable avec &lt;strong&gt;composer&lt;/strong&gt; : il faut pour cela un fichier &lt;code&gt;composer.json&lt;/code&gt; de 10 lignes minimum. Regardez quelques exemples &lt;a href=&quot;https://github.com/deliciousbrains/wp-amazon-s3-and-cloudfront/blob/master/composer.json&quot;&gt;ici&lt;/a&gt;, &lt;a href=&quot;https://github.com/awesomemotive/WP-Mail-SMTP/blob/master/composer.json#L4&quot;&gt;ici&lt;/a&gt; ou &lt;a href=&quot;https://github.com/Yoast/wordpress-seo/blob/trunk/composer.json&quot;&gt;là&lt;/a&gt;. L’étape suivante consiste à taguer vos versions avec les &lt;a href=&quot;https://github.com/deliciousbrains/wp-migrate-db/releases&quot;&gt;GitHub Releases&lt;/a&gt; en respectant SemVer, puis à soumettre votre paquet sur &lt;a href=&quot;https://packagist.org/packages/submit&quot;&gt;packagist.org&lt;/a&gt; en saisissant l’URL GitHub de votre dépôt.&lt;/p&gt;
&lt;p&gt;🔒 Prenez en charge les &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;versions maintenues de PHP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;💅🏽 Lintez votre code PHP avec PHP-CS-Fixer, bon sang ! Choisissez entre le preset PSR2 et celui de Symfony, mais choisissez-en un et corrigez votre code.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Si vous voulez voir une structure de projet qui met en œuvre la plupart des points abordés dans cet article, &lt;a href=&quot;https://github.com/tristanbes/wordpress-boilerplate&quot;&gt;jetez un œil à mon exemple de boilerplate WordPress basé sur Bedrock et Timber&lt;/a&gt;.
Ce dépôt n’est pas fait pour être utilisé « tel quel », mais il vous aidera à comprendre comment structurer les fichiers de votre projet.&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>WordPress</category><category>Architecture</category><category>composer</category><category>best practices</category><category>Bedrock</category></item><item><title>Le benchmark PaaS de Clever Cloud vs Scalingo vs Hidora</title><link>https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/</link><guid isPermaLink="true">https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/</guid><description>Cette série de billets a pour but de faire un retour d&apos;expérience sur les différents PaaS français dans une problématique d&apos;hébergement d&apos;un parc de 120+…</description><pubDate>Thu, 24 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cette série de billets a pour but de faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;EDIT 01/21&lt;/strong&gt; Les tests de performances ont été ré-actualisés. La première fournée de tests en 2019, accessibles ici: &lt;strong&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1hrny3Rf4RB7qqezy8jHQ_DbZXGzBK293sttXRlmxUMA/edit?usp=sharing&quot;&gt;exhaustivité des ~80 tests du comparatif 2019 de performances de PaaS entre Scalingo et Clever Cloud&lt;/a&gt;&lt;/strong&gt; contenait 80 tests.
En 2021, j’ai été beaucoup plus concis sur les tests, disponibles sur &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Lv9eyBcLTh2hEt7-9YxrTPGz5QUB1OQ2GbOVl-xmahA/edit?usp=sharing&quot;&gt;cette feuille de calcul&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;les-performances-mesurées&quot;&gt;Les performances mesurées&lt;/h2&gt;
&lt;p&gt;Sont retenus pour ce benchmark :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Clever Cloud&lt;/li&gt;
&lt;li&gt;✅ Scalingo&lt;/li&gt;
&lt;li&gt;✅ Hidora&lt;/li&gt;
&lt;li&gt;⛔️ OVH Cloud Web (impossible de faire tourner le projet, voir Partie II)&lt;/li&gt;
&lt;li&gt;⛔️ Platform.sh (trop cher pour notre contexte WordPress)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les tests ont été réalisés dans des conditions réelles. J’ai pris un WordPress “représentatif” déjà en production chez nous. Il ne s’agit pas de tests sur un WordPress sans plugins qui ne comporte qu’une page vierge.&lt;/p&gt;
&lt;p&gt;J’ai effectué les tests avec un outil de test de montée de charge (&lt;a href=&quot;https://k6.io/&quot;&gt;k6.io&lt;/a&gt;) depuis un serveur à Paris, FR : 5 visiteurs unique par seconde pendant 2 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les tests chez les différents PaaS ont été réalisés dans les même conditions&lt;/strong&gt; : Même versions de wordpress et des plugins, même page testée. Aucune optimisation apportée excepté la variable d’ajustement &lt;code&gt;pm.max_children&lt;/code&gt; pour gérer la concurrence des requêtes à &lt;code&gt;php-fpm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Avant de consigner les résultats obtenus, j’ai passé quelques temps à trouver la valeur optimale pour la configuration &lt;code&gt;pm.max_children&lt;/code&gt; qui permet de dire aux scalers combien de requêtes PHP concurrentes il est capable de traiter.&lt;/p&gt;
&lt;p&gt;Une valeur trop haute, et ce sont les performances qui sont plombées à cause du manque de RAM (qui swap). Une valeur trop faible, et le scaler est alors bridé, et vos performances aussi.&lt;/p&gt;
&lt;p&gt;⚠️ Notez que le nombre de visiteur unique est variable, même si l’on règle le test sur 5 visiteurs uniques par secondes pendant 2 minutes. Je n’ai jamais obtenu 5x60x2 = 600 requêtes. Pensez donc à regarder le nombre de requête que le serveur à eu à traiter. ⚠️&lt;/p&gt;
&lt;h4 id=&quot;résultat-des-tests-extraits&quot;&gt;Résultat des tests (extraits)&lt;/h4&gt;
&lt;h5 id=&quot;5-clients-par-seconde-sur-2-minutes&quot;&gt;5 clients par seconde sur 2 minutes&lt;/h5&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Prix/mois&lt;/th&gt;
&lt;th&gt;Détail&lt;/th&gt;
&lt;th&gt;BDD&lt;/th&gt;
&lt;th&gt;Moyenne (ms)&lt;/th&gt;
&lt;th&gt;Nombre de requêtes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scalingo&lt;/td&gt;
&lt;td&gt;10,8€&lt;/td&gt;
&lt;td&gt;1x S&lt;/td&gt;
&lt;td&gt;256M&lt;/td&gt;
&lt;td&gt;492&lt;/td&gt;
&lt;td&gt;335&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalingo&lt;/td&gt;
&lt;td&gt;18,0€&lt;/td&gt;
&lt;td&gt;1x M&lt;/td&gt;
&lt;td&gt;256M&lt;/td&gt;
&lt;td&gt;451&lt;/td&gt;
&lt;td&gt;342&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clever Cloud&lt;/td&gt;
&lt;td&gt;11,9€&lt;/td&gt;
&lt;td&gt;1x nano&lt;/td&gt;
&lt;td&gt;XXS-Med (512Mb)&lt;/td&gt;
&lt;td&gt;884&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clever Cloud&lt;/td&gt;
&lt;td&gt;20,3€&lt;/td&gt;
&lt;td&gt;1x XS&lt;/td&gt;
&lt;td&gt;XXS-Med (512Mb)&lt;/td&gt;
&lt;td&gt;588&lt;/td&gt;
&lt;td&gt;313&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidora&lt;/td&gt;
&lt;td&gt;15,78€&lt;/td&gt;
&lt;td&gt;2gb&lt;/td&gt;
&lt;td&gt;256mb&lt;/td&gt;
&lt;td&gt;2 042&lt;/td&gt;
&lt;td&gt;239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidora&lt;/td&gt;
&lt;td&gt;28,70€&lt;/td&gt;
&lt;td&gt;2gb&lt;/td&gt;
&lt;td&gt;512mb&lt;/td&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;237&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h5 id=&quot;configuration-des-tests&quot;&gt;Configuration des tests&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Edition Wordpress &lt;a href=&quot;https://roots.io/bedrock/&quot;&gt;Bedrock&lt;/a&gt; afin que WP soit compatible avec un hébergement PaaS, en plus de proposer des outils modernes (gestion de la conf par variables d’environnement, gestion des plugins WordPress par &lt;code&gt;composer&lt;/code&gt;…)&lt;/li&gt;
&lt;li&gt;PHP 7.4.x&lt;/li&gt;
&lt;li&gt;Site 1
&lt;ul&gt;
&lt;li&gt;Wordpress 5.6.x&lt;/li&gt;
&lt;li&gt;Liste des dépendances et plugins : &lt;a href=&quot;https://gist.github.com/tristanbes/b2b1f0ecbc83313cb3d5c1dc18555dfd&quot;&gt;composer.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pm.max_children&lt;/code&gt; est reglé sur &lt;code&gt;10&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Clever Cloud</category><category>Performances</category><category>Scalingo</category><category>Hosting</category><category>Cloud</category></item><item><title>Les PaaS Français sont sur un bateau : Platform.sh au mouillage</title><link>https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/</link><guid isPermaLink="true">https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/</guid><description>Ce billet s&apos;inscrit dans une série d&apos;articles visant à faire un retour d&apos;expérience sur les différents PaaS français dans une problématique d&apos;hébergement d&apos;un…</description><pubDate>Wed, 23 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ce billet s’inscrit dans une série d’articles visant à faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;platformsh&quot;&gt;Platform.sh&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#r%C3%A9sum%C3%A9-platformsh-tldr&quot;&gt;Accéder au résumé si vous êtes pressés&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour nos projets Symfony sur mesure, nous sommes chez &lt;a href=&quot;https://platform.sh/&quot;&gt;Platform.sh&lt;/a&gt; (~7 projets).&lt;/p&gt;
&lt;p&gt;Je l’ai rapidement éliminé dans le contexte d’une offre d’hébergement de plus de 120+ projets Wordpress car le pricing n’est pas du tout adapté à notre contexte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;40€ pour 0.8GB de mémoire&lt;/strong&gt;, sachant qu’elle est partagée entre les containers applicatifs ; donc 800Mo de mémoire divisé entre le container web, et le container de la base de données, ça ne fait pas vraiment rêver….&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/platformsh-memory.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/platformsh-memory.png&quot; alt=&quot;Répartition de la mémoire sur les plans Platform.sh. Pour un service avec du PHP et une base de données, le plan S ne suffira pas.&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;406&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Répartition de la mémoire sur les plans Platform.sh. Pour un service avec du PHP et une base de données, le plan S ne suffira pas.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Le plan supérieur est à 100€/mois. Et là, on fait x10 sur nos dépenses, sachant que dans notre contexte, la fonctionnalité pour utiliser différents environnements ne nous intéressait pas.&lt;/p&gt;
&lt;p&gt;La gestion des variables d’environnement, comment dire… c’est compliqué : on pense que l’onglet variable sur la branche en question suffirait ? En fait non, car elles ne sont accessibles qu’au runtime et pas au build.&lt;/p&gt;
&lt;p&gt;Pour rajouter des variables au build, il faut aller cliquer sur une zone de 20 par 20 pixels pas du tout miss en avant et rajouter les variables. On se retrouve souvent alors à rajouter les variables dans la configuration du projet, puis à les dupliquer dans la configuration de l’environnement master afin de bénéficier de l’héritage sur les autres branches.&lt;/p&gt;
&lt;p&gt;Notez qu’il n’y a pas d’édition de variables d’environnement en mode “Bulk Edit/Add”.&lt;/p&gt;
&lt;p&gt;Des efforts sur l’UI et l’UX/DX sont à prévoir car l’interface génère régulièrement des frustrations (en plus d’être lente).&lt;/p&gt;
&lt;p&gt;Les incidents sont fréquents (ou alors je n’ai pas de chance et le peu de fois où j’ai besoin de Platform.sh, il y a un incident…), du type “ah tiens, mes builds sont bloqués”, “l’application n’est plus auto-deployée, donc mes correctifs que je pensais être déployés en prod il y a 7 jours ne sont jamais arrivés”. Heureusement, la prod n’est jamais tombée sur nos projets, mais ces problèmes à répétition sur l’utilisation du PaaS sont usants.&lt;/p&gt;
&lt;p&gt;Pour illustrer mes propos, de décembre à janvier, il y a eu 10 incidents répertoriés, certains majeurs, sur leur &lt;a href=&quot;https://status.platform.sh/history&quot;&gt;statuspage&lt;/a&gt; (hors maintenance). A l’heure où j’écris cet article, mon équipe me signale qu’elle est encore bloquée pour déployer certains environnements.&lt;/p&gt;
&lt;h3 id=&quot;résumé-platformsh-tldr&quot;&gt;Résumé Platform.sh (TLDR)&lt;/h3&gt;
&lt;h4 id=&quot;-inconvénients&quot;&gt;👎 Inconvénients&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Cher&lt;/li&gt;
&lt;li&gt;Pas de scalabilité automatique&lt;/li&gt;
&lt;li&gt;On ne sait pas combien de ressources on consomme&lt;/li&gt;
&lt;li&gt;Interface très lente et pas sexy&lt;/li&gt;
&lt;li&gt;Gestion des variables d’environnement&lt;/li&gt;
&lt;li&gt;Incidents à repetition&lt;/li&gt;
&lt;li&gt;Hook de déploiement qu’il faut régulièrement supprimer et rajouter pour que le projet continue à se déployer automatiquement&lt;/li&gt;
&lt;li&gt;Aucun outil de monitoring depuis l’interface pour aller créer des règles d’alertes (ex : Poster un message dans Slack si la RAM &amp;gt;90%). Il y a uniquement un check sur l’espace disque&lt;/li&gt;
&lt;li&gt;Backups pas automatisés, ni proposés de manière automatique. Il faut s’occuper soi-même de créer un cron de snapshot&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-avantages&quot;&gt;👍 Avantages&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;On peut déployer des branches comme environnements pour faire des démos ou de la préprod facilement&lt;/li&gt;
&lt;li&gt;Système d’héritage des variables d’environemment qui facilite la création d’autres environnements&lt;/li&gt;
&lt;li&gt;Copie de la base de données de production lors de la création d’un nouvel environnement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⛔️  &lt;strong&gt;VERDICT : ELIMINÉ&lt;/strong&gt; ⛔️&lt;/p&gt;
&lt;p&gt;Aucun benchmark n’a été réalisé avec Wordpress, tant que la projection d’une migration chez eux bloquait au niveau tarifaire.&lt;/p&gt;
&lt;h2 id=&quot;lire-la-partie-vi&quot;&gt;Lire la partie VI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Platform.sh</category><category>Performances</category><category>Hosting</category><category>Cloud</category></item><item><title>Les PaaS Français sont sur un bateau : Scalingo reste à flot</title><link>https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/</link><guid isPermaLink="true">https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/</guid><description>Cette série de billets a pour but de faire un retour d&apos;expérience sur les différents PaaS français dans une problématique d&apos;hébergement d&apos;un parc de 120+…</description><pubDate>Tue, 22 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cette série de billets a pour but de faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;scalingo&quot;&gt;Scalingo&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#r%C3%A9sum%C3%A9-clever-cloud-tldr&quot;&gt;Accéder au résumé si vous êtes pressés&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sclng.io/r/dfa62f9bc47ec843&quot;&gt;Scalingo&lt;/a&gt; est un service PaaS dont je n’avais jamais entendu parler (ni sur ma timeline Twitter), c’est un peu à reculons que je l’ai ajouté dans ma liste de “candidats”.&lt;/p&gt;
&lt;p&gt;Ici, l’onboarding est très simple, je n’ai pas dû aller négocier un budget pour tester le service : &lt;strong&gt;tout est facturé à la minute&lt;/strong&gt;. De ce fait, tous les services qui facturent au mois prennent un gros coup de vieux.&lt;/p&gt;
&lt;p&gt;Si vous possédez un site qui passe sur Capital, vous pourrez commander XX scalers supplémentaires afin que l’application tienne la charge, et n’être facturé que sur les 20 minutes durant lesquelles le reportage aura parlé de vous. Et ce même pour la base de données, afin d’augmenter les fameuses limites de connexions simultanées (même si dans ce cas, il serait préférable de passer le site en lecture seule, et mettre un reverse proxy) et de RAM.&lt;/p&gt;
&lt;p&gt;L’interface ne colle plus aux tendances actuelles : elle fait un peu vieillotte, mais elle est agréable à l’utilisation et très réactive. Il vaut mieux ça qu’une interface très “belle”, mais mal pensée et lente.&lt;/p&gt;
&lt;h4 id=&quot;build-de-lapplication-sur-scalingo&quot;&gt;Build de l’application sur Scalingo&lt;/h4&gt;
&lt;p&gt;Un fichier &lt;code&gt;.buildpacks&lt;/code&gt; doit être créé à la racine du projet contenant l’URL d’un dépôt git afin de dire au PaaS comment construire l’application. Dans notre cas c’était : &lt;code&gt;https://github.com/Scalingo/php-buildpack&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le &lt;code&gt;composer.json&lt;/code&gt; est alors détecté, et &lt;strong&gt;bonus&lt;/strong&gt;, l’édition de Wordpress Bedrock étant supportée chez eux, je n’ai rien eu à faire pour configurer le Vhost NGINX, ça a fonctionné de manière automatique (&lt;a href=&quot;https://github.com/Scalingo/php-buildpack/tree/master/frameworks&quot;&gt;liste des framework PHP auto-détectés&lt;/a&gt;), ce qui n’a pas été le cas par exemple chez Clever Cloud où il a fallu indiquer où était le front controller de l’application (&lt;code&gt;web/index.php&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;L’application se build rapidement et j’ai pu procéder aux tests.&lt;/p&gt;
&lt;h4 id=&quot;performance-chez-scalingo&quot;&gt;Performance chez Scalingo&lt;/h4&gt;
&lt;p&gt;Les tests parleront d’eux-mêmes dans le chapitre dédié. Notez que &lt;a href=&quot;https://sclng.io/r/dfa62f9bc47ec843&quot;&gt;Scalingo&lt;/a&gt; écrase Clever Cloud qui ne passe même pas certains tests à tarif équivalent.&lt;/p&gt;
&lt;p&gt;Quelques fois, nous avons obtenu des performances bien meilleures lors de tests réalisés à des dates différentes chez Scalingo. Après avoir contacté le support, cela s’expliquerait par le voisinage. En effet, les scalers peuvent bouger de machine en machine selon leur charge. Si nous avons des voisins qui possèdent des scalers avec une très forte priorité CPU (donc qui payent plus cher) et qui sont très actifs sur le moment alors moins de temps CPU sera alors alloué à nos containers avec une priorité plus faible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;résumé-scalingo-tldr&quot;&gt;Résumé Scalingo (TLDR)&lt;/h3&gt;
&lt;h4 id=&quot;-inconvénients&quot;&gt;👎 Inconvénients&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UI pas très sexy sans être catastrophique non plus.&lt;/li&gt;
&lt;li&gt;Autoscaling (en BETA fermée) qui demande encore d’être un peu ajusté&lt;/li&gt;
&lt;li&gt;Interface de gestion des logs qui pourrait être améliorée visuellement&lt;/li&gt;
&lt;li&gt;Pas de support de Github Server (pour l’app de déploiement)&lt;/li&gt;
&lt;li&gt;Pas (encore) de vision “d’ensemble” pour les portefeuilles avec beaucoup de projets&lt;/li&gt;
&lt;li&gt;Pas de reverse proxy (ex : Varnish) facilement configurable depuis un &lt;code&gt;.vcl &lt;/code&gt; déposé à la racine de l’application afin d’augmenter les performances applicatives en tirant parti du cache HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 12/20&lt;/strong&gt; Au moins 2 incidents majeurs de la plateforme sur 2020 suite à des attaques &lt;a href=&quot;https://scalingo.com/blog/mitigating-massive-ddos&quot;&gt;DDOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-avantages&quot;&gt;👍 Avantages&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tarifs compétitifs&lt;/li&gt;
&lt;li&gt;Tout est facturé à la “minute”, même la base de données&lt;/li&gt;
&lt;li&gt;Auto-scaling horizontal&lt;/li&gt;
&lt;li&gt;Support réactif. &lt;strong&gt;EDIT 3/12/20&lt;/strong&gt; Toujours très réactif, et souvent un développeur est à l’autre bout qui comprends tout de suite la problématique et apporte une solution rapidement. C’est très appréciable.&lt;/li&gt;
&lt;li&gt;Interface agréable à utiliser et réactive (UX/DX)&lt;/li&gt;
&lt;li&gt;Gestion facilitée du &lt;code&gt;pm.max_children&lt;/code&gt; depuis l’UI (variable &lt;code&gt;MAX_CONCURRENCY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Gestion d’environnements différents pour une même application (prod/préprod…), mais pas aussi facile que ce que peut proposer Platform.sh par exemple&lt;/li&gt;
&lt;li&gt;Gestion simple et assez complète des règles de monitoring de vos scalers sur différents cannaux (slack, mail…)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 3/12/20&lt;/strong&gt; Environnement plus flexible que certains PaaS sur certaines extensions: compatible avec Blackfire, Datadog…&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-verdict--retenu-&quot;&gt;✅ &lt;strong&gt;VERDICT : RETENU&lt;/strong&gt; ✅&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://sclng.io/r/dfa62f9bc47ec843&quot;&gt;Scalingo&lt;/a&gt; a été pour moi &lt;strong&gt;LA&lt;/strong&gt; bonne surprise de ce comparatif. Les tarifs sont compétitifs par rapport au marché, sans compromis sur les performances. Les principales features que l’on peut attendre d’un PaaS sont là et fonctionnent bien !&lt;/p&gt;
&lt;h2 id=&quot;lire-la-partie-v&quot;&gt;Lire la partie V&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;u&gt;Disclaimer :&lt;/u&gt; les liens Scalingo sont câblés sur un système de parrainage rattaché à mon compte personnel. Si les autres PaaS testés ici avaient eu ce même système de parainage, j’aurais aussi utilisé ce système sur leurs liens (pour faire des futurs POC ou petits projets persos).&lt;/p&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Performances</category><category>Scalingo</category><category>Hosting</category><category>Cloud</category></item><item><title>Les PaaS Français sont sur un bateau : Clever Cloud redresse la barre</title><link>https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/</link><guid isPermaLink="true">https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/</guid><description>Cette série de billets a pour but de faire un retour d&apos;expérience sur les différents PaaS français dans une problématique d&apos;hébergement d&apos;un parc de 120+…</description><pubDate>Mon, 21 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cette série de billets a pour but de faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;clever-cloud&quot;&gt;Clever Cloud&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mise à jour Janvier 2021&lt;/strong&gt;: Clever Cloud à changé courant 2020 sa politique de prix sur les bases de données ce qui lui permet de réduire considérablement les coûts, dont je parlais dans cet article. &lt;br&gt;
De plus, après un nouveau test de performance, en utilisant le même projet qu’en décembre 2019, les performances par défaut sont bien meilleures qu’avant (voir mise à jour de l’article &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#r%C3%A9sum%C3%A9-clever-cloud-tldr&quot;&gt;Accéder au résumé si vous êtes pressés&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.clever-cloud.com/&quot;&gt;Clever Cloud&lt;/a&gt; est aussi un PaaS français qui apparait souvent dans ma timeline Twitter dès que des twittos demandaient où héberger leurs projets. C’est avec enthousiasme que j’ai voulu tester leur PaaS.&lt;/p&gt;
&lt;p&gt;Sur le papier, l’offre est sexy   (auto) scaling vertical, horizontal.&lt;/p&gt;
&lt;h4 id=&quot;la-base-de-données&quot;&gt;La base de données&lt;/h4&gt;
&lt;p&gt;Au moment de prendre le service, première mauvaise surprise : la base de données est payante au mois complet, et il n’est pas encore possible de la faire scaler de manière automatique ou manuelle, mais cela devrait (bientôt) changer,&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Clever Cloud&lt;/th&gt;
&lt;th&gt;Scalingo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connexion max&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taille max BDD&lt;/td&gt;
&lt;td&gt;&lt;del&gt;10&lt;/del&gt; 5Gb&lt;/td&gt;
&lt;td&gt;5Gb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mémoire&lt;/td&gt;
&lt;td&gt;1Gb&lt;/td&gt;
&lt;td&gt;1Gb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Dédié&lt;/td&gt;
&lt;td&gt;Dédié (Software + RAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;1 vCPU&lt;/td&gt;
&lt;td&gt;Partagé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prix&lt;/td&gt;
&lt;td&gt;&lt;del&gt;45&lt;/del&gt; 22€/mois &lt;br /&gt;&lt;/td&gt;
&lt;td&gt;14,4€/mois&lt;br /&gt;(découpé par minute)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Autre point d’alerte, chez &lt;a href=&quot;https://www.clever-cloud.com/&quot;&gt;Clever Cloud&lt;/a&gt;, ils vous incitent à vous orienter vers du PostgreSQL et ce de manière assumée, puisqu’à ressource strictement équivalente, les containers de base de données sont &lt;strong&gt;plus chers&lt;/strong&gt; pour du MySQL.&lt;/p&gt;
&lt;p&gt;On parle d’une &lt;strong&gt;différence de &lt;del&gt;180&lt;/del&gt; +54€ par an&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ils justifient cette différence par le fait qu’une instance MySQL coûte plus cher à gérer que du PostgreSQL et l’équipe technique chez eux préfère maintenir du PostgreSQL.&lt;/p&gt;
&lt;p&gt;Autant pour une application Symfony, ça ne me fait ni chaud, ni froid (ou presque…) de mettre un PostgreSQL, autant pour du WordPress, nous n’avons pas le choix sur la base de données compatible avec le CMS. Donc au final, c’est l’utilisateur qui paye le coût supplémentaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT 12/20&lt;/strong&gt; &lt;del&gt;A priori, ils seraient en train de retravailler le pricing des scaler de base de données.&lt;/del&gt; C’est maintenant chose faite, d’ou la MAJ de cet article.&lt;/p&gt;
&lt;h4 id=&quot;paramétrage-de-lapplication-sur-clever-cloud&quot;&gt;Paramétrage de l’application sur Clever Cloud&lt;/h4&gt;
&lt;p&gt;Comme toute application hebergée sur un PaaS, on passe par la case “variables d’environnement”. Chez Clever Cloud, c’est peu pratique. Lors de mes tests, il y a quelques semaines, il n’y avait pas de gestion de l’édition/ajout des variables en masse. Quand on doit saisir 20 variables : quelle perte de temps ! Heureusement, ça a été corrigé récemment par l’ajout d’un bulk edit/add.&lt;/p&gt;
&lt;p&gt;Il n’est pas possible de faire référence à une autre variable (ex: &lt;code&gt;DATABASE_URL=$MYSQL_ADDON_URI&lt;/code&gt;), et ça, c’est dommage.&lt;/p&gt;
&lt;p&gt;J’ai voulu déployer ensuite mon Wordpress. Je n’ai malheureusement pas pu puisqu’une dépendance (&lt;a href=&quot;https://github.com/wp-cli/wp-cli&quot;&gt;wp-cli&lt;/a&gt;) nécessitait la présence de l’extension PHP &lt;code&gt;ext-readline&lt;/code&gt; qui n’était pas disponible sur Clever Cloud.&lt;/p&gt;
&lt;p&gt;Il a fallu faire une demande au support, et manque de pot, c’est tombé un vendredi, donc pas de mise en prod possible avant mon départ en vacances.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;NB (non dirigée contre Clever Cloud) :&lt;/u&gt; il faut arrêter avec cette politique absurde, je suis tout à fait d’accord avec le Tweet ci dessous : chez nous le vendredi est un jour comme les autres pour les déploiements parce qu’on a fait en sorte que ça soit le cas (tests, automatisation, reviews…).&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;fr&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&amp;quot;No deploys on friday&amp;quot; is cancer philosophy that enforces fear to deploy and slow down the dev cycle. Stop repeating this crap as if it&amp;#39;s cool, and improve processes and tests, for god&amp;#39;s sake.&lt;/p&gt;&amp;mdash; SergiGP 🎗 (@SergiGP) &lt;a href=&quot;https://twitter.com/SergiGP/status/1075417087714181120?ref_src=twsrc%5Etfw&quot;&gt;19 décembre 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;A mon retour de vacances, toujours pas possible de build, suite à un couac, “la feature est activée mais pas l’extension”. Bref, ça arrive quelque heures plus tard : l’application peut enfin être build.&lt;/p&gt;
&lt;h4 id=&quot;build-de-lapplication-sur-clever-cloud&quot;&gt;Build de l’application sur Clever Cloud&lt;/h4&gt;
&lt;p&gt;Alors, comment on build chez eux ?&lt;/p&gt;
&lt;p&gt;Comme le projet possède un &lt;code&gt;composer.json&lt;/code&gt;, le PaaS va récupérer les dépendances de manière automatique. Seulement, nous “buildons” le thème depuis une tâche &lt;code&gt;yarn build&lt;/code&gt;. Il faut donc que l’on puisse lancer un &lt;code&gt;yarn install&lt;/code&gt; suivi d’un &lt;code&gt;yarn build&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et la ce n’est pas hyper pratique puisqu’il n’est pas capable de dire “Ok, je vois un &lt;code&gt;yarn.lock&lt;/code&gt; donc je vais lancer aussi un &lt;code&gt;yarn install &amp;amp;&amp;amp; yarn build&lt;/code&gt;”. Donc on est obligé de passer par un &lt;strong&gt;Build Hook.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On lui définit une variable pour lui dire d’utiliser &lt;code&gt;yarn&lt;/code&gt; comme package manager, et puis on va lui dire quelles commandes lancer et à quel moment du build, exemple : &lt;code&gt;CC_POST_BUILD_HOOK=&quot;yarn install &amp;amp;&amp;amp; yarn build&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Notez que Wordpress n’a pas été detecté automatiquement, et il a fallu que je crée un fichier dans un dossier &lt;code&gt;.clevercloud&lt;/code&gt; nommé &lt;code&gt;php.json&lt;/code&gt; afin que le routeur puisse savoir quoi servir :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes devops-life-light devops-life-dark&quot; style=&quot;--shiki-light:#1B2638;--shiki-dark:#DAE2EC;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#151C26; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;deploy&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;webroot&quot;: &quot;/web&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;configuration&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;pm.max_children&quot;: &quot;20&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;performance-chez-clever-cloud&quot;&gt;Performance chez Clever Cloud&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;EDIT 01/21&lt;/strong&gt; Les nouvelles politiques tarifaires, ainsi que de multiples améliorations hardware/software (migration datacenter + meilleur reverse proxy en Rust) permettent à Clever Cloud de redresser la barre de manière drastique par rapport aux tests réalisés en décembre 2019.&lt;/p&gt;
&lt;p&gt;Ainsi, l’écart de prix se réduit. Mes testent réalisés en Janvier 2021 montrent qu’il ne faut plus avoir à débourser 5 à 9 fois plus d’argent pour obtenir des performances similaires à l’un de ses principaux concurrents, Scalingo.
On est plus sur un ratio de x2. Comprendre ici, pour 2 fois moins cher sur Scalingo, on a des performances similaires à Clever Cloud sur notre environnement WordPress.&lt;/p&gt;
&lt;p&gt;Exemple : J’envoie 5 visiteurs uniques par seconde pendant 2 minutes sur la page d’accueil.&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;10,8€&lt;/strong&gt;/mois chez &lt;u&gt;Scalingo&lt;/u&gt;, j’obtiens &lt;strong&gt;492ms&lt;/strong&gt; de moyenne de temps de réponse.&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;20,3€&lt;/strong&gt;/mois chez &lt;u&gt;Clever Cloud&lt;/u&gt;, j’obtiens &lt;strong&gt;588ms&lt;/strong&gt;. C’est la somme &lt;u&gt;minimum&lt;/u&gt; à débourser pour avoir des performances semblables.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;résumé-clever-cloud-tldr&quot;&gt;Résumé Clever Cloud (TLDR)&lt;/h3&gt;
&lt;h4 id=&quot;-inconvénients&quot;&gt;👎 Inconvénients&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Ratio prix/performances sur du WordPress catastrophique&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Gestion du pricing des add-ons de base de données : &lt;del&gt;prix important, et&lt;/del&gt; engagement au mois&lt;/li&gt;
&lt;li&gt;Pas de scaling sur la base de données&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Pas de références à d’autres variables d’environnement&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Pas de support de Github Server pour déploiement auto&lt;/li&gt;
&lt;li&gt;Interface parfois peu intuitive&lt;/li&gt;
&lt;li&gt;Gestion des statistiques (en BETA depuis 2019 ?)&lt;/li&gt;
&lt;li&gt;Pas de gestion facilitée du &lt;code&gt;pm.max_children&lt;/code&gt; depuis l’UI (ex : par une variable d’environnement)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 12/20&lt;/strong&gt; Très peu d’ouverture sur l’écosystème PHP: APM / Monitoring (pas de Datadog, blackfire.io, tideways.io)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 01/21&lt;/strong&gt; Ratio prix/performances bonnes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-avantages&quot;&gt;👍 Avantages&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Backup automatisés&lt;/li&gt;
&lt;li&gt;Intégration avec let’s encrypt&lt;/li&gt;
&lt;li&gt;Auto-scaling vertical et/ou horizontal&lt;/li&gt;
&lt;li&gt;Support réactif sur l’aspect communication&lt;/li&gt;
&lt;li&gt;Interface sexy &amp;amp; réactive&lt;/li&gt;
&lt;li&gt;Gestion des logs claire&lt;/li&gt;
&lt;li&gt;Une alternative à Amazon S3 “maison”, pour monter un espace de stockage non volatile&lt;/li&gt;
&lt;li&gt;Une gestion optionelle d’un reverse proxy qui a l’air simplifiée (Varnish)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 12/20&lt;/strong&gt; Très stable (Rex sur 1an+ d’hébergement d’un projet chez eux)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDIT 12/20&lt;/strong&gt; Gestion multi-régions (avec l’aide d’OVH en coulisse)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;️-verdict--eliminé-️&quot;&gt;⛔️ &lt;strong&gt;VERDICT : ELIMINÉ&lt;/strong&gt; ⛔️&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;EDIT 01/21&lt;/strong&gt; Les problèmes de rapport performance/prix, maintenant résolus, ont été les 2 raisons de l’élimination de Clever Cloud pour notre problématique d’hébergement en 2019.&lt;/p&gt;
&lt;h2 id=&quot;lire-la-partie-iv&quot;&gt;Lire la partie IV&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo, on reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Performances</category><category>Clever Cloud</category><category>Hosting</category><category>Cloud</category></item><item><title>Les PaaS Français sont sur un bateau : OVH tombe à l’eau</title><link>https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/</link><guid isPermaLink="true">https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/</guid><description>Ce billet s&apos;inscrit dans une série d&apos;articles visant à faire un retour d&apos;expérience sur les différents PaaS français dans une problématique d&apos;hébergement d&apos;un…</description><pubDate>Sun, 20 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ce billet s’inscrit dans une série d’articles visant à faire un retour d’expérience sur les différents PaaS français dans une problématique d’hébergement d’un parc de 120+ WordPress.&lt;/p&gt;
&lt;p&gt;Dans la série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part1. &lt;a href=&quot;https://devops-life.com/blog/2019/01/19/comparatif-paas-wordpress-francais/&quot;&gt;Contexte du comparatif de l’offre PaaS Française&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part2. &lt;a href=&quot;https://devops-life.com/blog/2019/01/20/paas-ovh-comparatif-cloud-web/&quot;&gt;Comparatif PaaS : OVH tombe à l’eau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, &lt;del&gt;le bateau prends l’eau&lt;/del&gt; le capitaine redresse la barre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part4. &lt;a href=&quot;https://devops-life.com/blog/2019/01/22/paas-scalingo-comparatif/&quot;&gt;Comparatif PaaS : Scalingo reste à flot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part5. &lt;a href=&quot;https://devops-life.com/blog/2019/01/23/paas-platform-sh-comparatif/&quot;&gt;Comparatif PaaS : Platform.sh au mouillage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part6. &lt;a href=&quot;https://devops-life.com/blog/2021/01/19/test-paas-suisse-hidora/&quot;&gt;Comparatif PaaS : Hidora, le cloud suisse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part7. &lt;a href=&quot;https://devops-life.com/blog/2019/01/24/clevercloud-vs-scalingo/&quot;&gt;Comparatif PaaS : Les performances, Clever Cloud VS Scalingo VS Hidora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ovh-et-son-offre-cloud-web&quot;&gt;OVH et son offre Cloud Web&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#r%C3%A9sum%C3%A9-ovh-cloud-web-tldr&quot;&gt;Accéder au résumé si vous êtes pressés&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OVH est le dernier arrivé dans le monde du PaaS avec son &lt;a href=&quot;https://www.ovh.com/fr/hebergement-web/cloud-web.xml&quot;&gt;offre Cloud Web&lt;/a&gt;, ce n’est pas son domaine d’expertise, et ça se ressent vite, très vite.&lt;/p&gt;
&lt;p&gt;Tout d’abord, première mauvaise surprise, il est impossible de commander une offre Cloud Web pour moins de 12 mois.&lt;/p&gt;
&lt;p&gt;Si vous ne souhaitez pas commander un nom de domaine avec l’offre Cloud Web (car vous en avez déjà un), il est impossible de sauter cette étape lors de la commande de l’offre par l’interface OVH. Il est cependant possible de contourner cette étape si vous commandez l’offre par l’API d’OVH.&lt;/p&gt;
&lt;p&gt;A priori, les équipes travailleraient à lever ces contraintes, mais de source interne, ça ne sera pas traité avant de longs mois (sans garanties). Mais soyons clairs, certains concurrents proposent de la &lt;strong&gt;facturation à la minute&lt;/strong&gt;, donc débourser ~490€ TTC pour faire quelques tests sur du Cloud Web 3, ou même si l’on se projette sur notre parc de Wordpress de 120+ projets, cela reviendrait à un ticket d’entrée de ~&lt;strong&gt;60,000€&lt;/strong&gt; sans garantie que nos clients restent un an chez nous.&lt;/p&gt;
&lt;p&gt;Je suis rentré en contact avec une personne de chez OVH pour lui faire remonter ces problèmes. On m’a proposé de m’offrir l’offre Cloud Web 3 pour 1 an, en échange de feedbacks sur le produit. Merci pour cette proposition.&lt;/p&gt;
&lt;p&gt;Dès que j’ai eu accès au produit, j’ai voulu mettre PHP 7.3 et créer mes variables d’environnement afin de pouvoir configurer le wordpress et faire mes tests de performances. Mais je me suis heurté à des problèmes, dont un qui m’a empêché toute utilisation du produit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 7.3 n’est pas disponible, il est pourtant sorti le 6 Décembre 2018, soit depuis plus d’un mois lors de la création de cet article&lt;/li&gt;
&lt;li&gt;Pas de gestion de permissions (autre que pour le gestionnaire/contact technique) pour donner par exemple accès à la gestion des variables d’environnement pour un ensemble de personnes d’une équipe&lt;/li&gt;
&lt;li&gt;J’ai créé des variables d’environnement, certaines se sont créées en quelques secondes/minutes, et d’autres, rien après 15 minutes de “En cours de création”. Je me suis mis à fouiller l’UI avant de découvrir que la tâche de création de certaines variables était en erreur (sans plus de détails)&lt;/li&gt;
&lt;li&gt;Pas de gestion de “bulk insert” des variables d’environnement. J’ai dû répéter les opérations de création de variable 20 fois à cause de ce manque&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;https://devops-life.com/img/ovh-environment-variables-bug.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://devops-life.com/img/ovh-environment-variables-bug.png&quot; alt=&quot;La création de ces variables d&apos;environnement sur OVH sont &apos;en cours&apos; depuis 14 jours sans possibilité de les supprimer ou de les modifier&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;302&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;La création de ces variables d&apos;environnement sur OVH sont &apos;en cours&apos; depuis 14 jours sans possibilité de les supprimer ou de les modifier&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4 id=&quot;le-support-dovh&quot;&gt;Le support d’OVH&lt;/h4&gt;
&lt;p&gt;Sans possibilité de modifier ou de supprimer les variables “fautives”, &lt;strong&gt;je suis bloqué&lt;/strong&gt; dans ma configuration, je me tourne donc vers le support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le 8 janvier 2019, ouverture du ticket au support pour signaler que je ne peux pas utiliser le produit à cause de mon problème de variables d’environnement&lt;/li&gt;
&lt;li&gt;Le 21 janvier 2019, soit &lt;strong&gt;13 JOURS après&lt;/strong&gt;, je reçois la première réponse du support qui peut être résumé à : “Nous sommes désolés pour la prise en charge tardive du ticket, des administrateurs sont en train de vérifier votre demande.”&lt;/li&gt;
&lt;li&gt;Le 23 janvier 2019, on m’informe que les opérations en erreur ont été annulées, et on m’invite à réessayer sans m’expliquer ce qu’il s’est passé.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;résumé-ovh-cloud-web-tldr&quot;&gt;Résumé OVH Cloud Web (TLDR)&lt;/h4&gt;
&lt;h4 id=&quot;-inconvénients&quot;&gt;👎 Inconvénients&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Engagement annuel&lt;/li&gt;
&lt;li&gt;Pas de paiement mensuel&lt;/li&gt;
&lt;li&gt;Impossible de commander sans domaine associé par l’interface web&lt;/li&gt;
&lt;li&gt;Documentation très pauvre et incomplète&lt;/li&gt;
&lt;li&gt;Pas de déploiement par Git&lt;/li&gt;
&lt;li&gt;Pas de déploiement automatique via app Github/Gitlab&lt;/li&gt;
&lt;li&gt;Pas de scaling horizontal, vertical&lt;/li&gt;
&lt;li&gt;Pas &lt;a href=&quot;https://en.wikipedia.org/wiki/Autoscaling&quot;&gt;d’auto-scaling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Le support d’OVH : à proscrire&lt;/li&gt;
&lt;li&gt;Pas de gestion de permissions pour donner les droits d’accès à une équipe sur les variables d’environnement par exemple&lt;/li&gt;
&lt;li&gt;UX/DX pauvres sur la gestion des variables, en plus d’être buggées&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-avantages&quot;&gt;👍 Avantages&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Backup automatisés&lt;/li&gt;
&lt;li&gt;Intégration avec let’s encrypt&lt;/li&gt;
&lt;li&gt;Réseau OVH&lt;/li&gt;
&lt;li&gt;C’est à peu près tout… 🤷‍♂️😱&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;️-verdict--eliminé-️&quot;&gt;⛔️ &lt;strong&gt;VERDICT : ELIMINÉ&lt;/strong&gt; ⛔️&lt;/h4&gt;
&lt;p&gt;Difficile d’émettre un jugement définitif quant aux offres PaaS d’OVH tant que l’on ressent qu’elles ont besoin de maturer encore afin de répondre au besoin du marché. Honnêtement, j’étais frustré et déçu sur le fait de ne pas avoir pu benchmarker la performance de leur offre Cloud Web 3.&lt;/p&gt;
&lt;p&gt;Mes aprioris sur le support se sont malheureusement confirmés, de ce fait, je ne peux conseiller à personne cette offre dans le cadre professionnel, où au moindre souci, vous attendez des semaines la réponse du support (à moins de les harceler sur Twitter), et ce, même si c’est critique pour le service.&lt;/p&gt;
&lt;p&gt;Quant à une utilisation personnelle, qui est capable de sortir ~490€ d’un coup pour héberger son “side project” personnel pour une offre PaaS ? 🙊&lt;/p&gt;
&lt;h2 id=&quot;lire-la-partie-iii&quot;&gt;Lire la partie III&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Part3. &lt;a href=&quot;https://devops-life.com/blog/2019/01/21/paas-clever-cloud-comparatif/&quot;&gt;Comparatif PaaS : Clever Cloud, le bateau prend l’eau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Tristan Bessoussa</dc:creator><dc:language>fr</dc:language><category>PaaS</category><category>Performances</category><category>OVH</category><category>Hosting</category><category>Cloud</category></item></channel></rss>