{"id":40596,"date":"2020-02-02T10:38:43","date_gmt":"2020-02-02T07:38:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker"},"modified":"2020-02-02T10:38:43","modified_gmt":"2020-02-02T07:38:43","slug":"razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"D\u00e9veloppement d'applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Pour commencer, un peu de th\u00e9orie. Qu'est-ce que <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">L'application en douze facteurs<\/a><\/noindex>?<\/h3>\n<p>\nEn termes simples, c'est un document destin\u00e9 \u00e0 simplifier le d\u00e9veloppement d'applications SaaS, en informant les d\u00e9veloppeurs et les ing\u00e9nieurs DevOps des probl\u00e8mes et pratiques que l'on retrouve le plus souvent dans le d\u00e9veloppement d'applications modernes. <\/p>\n<p>Le document a \u00e9t\u00e9 \u00e9labor\u00e9 par les d\u00e9veloppeurs de la plateforme Heroku.<\/p>\n<p>La m\u00e9thodologie des douze facteurs (The Twelve-Factor App) peut \u00eatre appliqu\u00e9e aux applications \u00e9crites dans n'importe quel langage de programmation et utilisant n'importe quelle combinaison de services tiers (backing services) (bases de donn\u00e9es, files d'attente, cache, etc.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Un bref aper\u00e7u des facteurs qui constituent cette m\u00e9thodologie :<\/h3>\n<p><\/p>\n<ol>\n<li><b>Base de code<\/b> \u2013 Une base de code unique, suivie dans un syst\u00e8me de contr\u00f4le de version, \u2013 de nombreux d\u00e9ploiements <\/li>\n<li><b>D\u00e9pendances<\/b> \u2013 D\u00e9clarez clairement et isolez les d\u00e9pendances<\/li>\n<li><b>Configuration<\/b> \u2013 Conservez la configuration dans l'environnement d'ex\u00e9cution<\/li>\n<li><b>Services externes (Backing Services)<\/b> \u2013 Consid\u00e9rez les services externes (backing services) comme des ressources connect\u00e9es<\/li>\n<li><b>Build, release, run<\/b> \u2013 S\u00e9parez strictement les \u00e9tapes de construction et d'ex\u00e9cution<\/li>\n<li><b>Processus<\/b> \u2013 Ex\u00e9cutez l'application comme un ou plusieurs processus sans \u00e9tat (stateless) <\/li>\n<li><b>Liaison de ports (Port binding)<\/b> \u2013 Exportez des services via la liaison de ports <\/li>\n<li><b>Parall\u00e9lisme<\/b> \u2013 \u00c9voluez l'application \u00e0 l'aide de processus <\/li>\n<li><b>Disposabilit\u00e9 (Disposability)<\/b> \u2013 Maximisez la fiabilit\u00e9 gr\u00e2ce \u00e0 un d\u00e9marrage rapide et \u00e0 une consommation correcte <\/li>\n<li><b>Parit\u00e9 entre le d\u00e9veloppement et l'exploitation de l'application<\/b> \u2013 Maintenez les environnements de d\u00e9veloppement, de pr\u00e9production (staging) et de production aussi similaires que possible <\/li>\n<li><b>Journalisation (Logs)<\/b> \u2013 Consid\u00e9rez le journal comme un flux d'\u00e9v\u00e9nements<\/li>\n<li><b>T\u00e2ches d'administration<\/b> \u2013 Ex\u00e9cutez les t\u00e2ches d'administration\/gestion \u00e0 l'aide de processus ponctuels <\/li>\n<\/ol>\n<p>\n<b>Pour plus d'informations sur les 12 facteurs, vous pouvez consulter les ressources suivantes :<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Source officielle<\/a><\/noindex> \u2014 lecture incontournable<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Article sur habr. Application en douze facteurs \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 traduction officielle<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Article sur habr. Les 7 facteurs manquants dans l'approche 12 Factor App<\/a><\/noindex> \u2014 un nouveau regard sur les 12 facteurs dans le but de les am\u00e9liorer.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Qu'est-ce que le d\u00e9ploiement Blue-Green ?<\/h3>\n<p>\nLe d\u00e9ploiement Blue-Green est une m\u00e9thode de livraison d'application <b>production<\/b> Ainsi, le client final ne voit aucun changement de son c\u00f4t\u00e9. En d'autres termes, le d\u00e9ploiement de l'application est sans <b>temps d'arr\u00eat<\/b>.<\/p>\n<p>Le sch\u00e9ma classique de BG Deploy ressemble \u00e0 ce qui est indiqu\u00e9 dans l'image ci-dessous. <\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Au d\u00e9part, il y a 2 serveurs physiques avec exactement le m\u00eame code, application, projet, et un routeur (\u00e9quilibreur de charge). <\/li>\n<li>Le routeur dirige initialement toutes les requ\u00eates vers l'un des serveurs (<b>bleu<\/b>). <\/li>\n<li>Au moment o\u00f9 il est n\u00e9cessaire de relancer une version, l'ensemble du projet est mis \u00e0 jour sur l'autre serveur (<b>alpha<\/b>), qui \u00e0 ce moment-l\u00e0 ne traite aucune requ\u00eate. <\/li>\n<li>Apr\u00e8s que le code sur <b>le serveur bleu<\/b> soit compl\u00e8tement mis \u00e0 jour, le routeur re\u00e7oit l'instruction de passer de <b>vert<\/b> sur <b>alpha<\/b> un serveur. <\/li>\n<li>Maintenant, tous les clients voient le r\u00e9sultat du code de <b>bleu<\/b> serveur. <\/li>\n<li> Pendant un certain temps, <b>bleu<\/b> le serveur sert de sauvegarde en cas de d\u00e9ploiement rat\u00e9 sur <b>alpha<\/b> le serveur et en cas d'\u00e9chec et de bogues, le routeur redirige le flux d\u2019utilisateurs vers <b>bleu<\/b> le serveur avec l'ancienne version stable, tandis que le nouveau code est envoy\u00e9 pour r\u00e9visions et tests.<\/li>\n<li>Et \u00e0 la fin du processus, le <b>bleu<\/b> serveur est \u00e9galement mis \u00e0 jour. Et apr\u00e8s sa mise \u00e0 jour, le routeur redirige de nouveau le flux de requ\u00eates vers <b>bleu<\/b> un serveur.<\/li>\n<\/ul>\n<p>\nCela semble tr\u00e8s bien et \u00e0 premi\u00e8re vue, il ne devrait y avoir aucun probl\u00e8me avec cela.<br \/>\nMais comme nous vivons dans un monde moderne, l'option de basculement physique comme indiqu\u00e9e dans le sch\u00e9ma classique ne nous convient pas. Gardez cette information \u00e0 l'esprit, nous y reviendrons plus tard.<\/p>\n<h3>Conseils bons et mauvais<\/h3>\n<p>\n<i>Avertissement<\/i>: Dans les exemples ci-dessous, des utilitaires \/ m\u00e9thodologies que j'utilise sont mentionn\u00e9s, vous pouvez utiliser absolument toutes les alternatives avec des fonctions similaires. <\/p>\n<p>La plupart des exemples se croiseront d'une mani\u00e8re ou d'une autre avec le d\u00e9veloppement web (surprise !), avec PHP et Docker.<\/p>\n<p>Les points suivants contiennent une description pratique simple de l'utilisation des facteurs dans des exemples sp\u00e9cifiques, si vous souhaitez obtenir plus de th\u00e9ories sur ce sujet, r\u00e9f\u00e9rez-vous aux liens ci-dessus vers la source d'origine. <\/p>\n<h4>1. Base de code<\/h4>\n<p>\nUtilisez FTP et FileZilla pour t\u00e9l\u00e9charger des fichiers sur les serveurs un \u00e0 un, ne stockez le code nulle part sauf sur le serveur de production.<\/p>\n<p>Le projet doit toujours avoir une base de code unique, c'est-\u00e0-dire que tout le code provient d'une seule source. <b>Git<\/b> d'un d\u00e9p\u00f4t. Les serveurs (production, staging, test1, test2 ...) utilisent le code des branches d'un d\u00e9p\u00f4t commun. Ainsi, nous garantissons la coh\u00e9rence du code.<\/p>\n<h4>2. D\u00e9pendances<\/h4>\n<p>\nT\u00e9l\u00e9chargez toutes les biblioth\u00e8ques dans des dossiers directement \u00e0 la racine du projet. Mettez \u00e0 jour simplement en transf\u00e9rant le nouveau code dans le dossier de la version actuelle de la biblioth\u00e8que. Installez tous les utilitaires directement sur le serveur h\u00f4te o\u00f9 fonctionnent d\u00e9j\u00e0 20 services.<\/p>\n<p>Le projet doit toujours avoir une liste de d\u00e9pendances clairement d\u00e9finie (par d\u00e9pendances, j'entends aussi l'environnement). Toutes les d\u00e9pendances doivent \u00eatre clairement d\u00e9finies et isol\u00e9es. <br \/>\n\u00c0 titre d'exemple, prenons <b>Composer<\/b> et <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 un gestionnaire de paquets qui permet d'installer des biblioth\u00e8ques PHP. Composer permet de sp\u00e9cifier les versions de mani\u00e8re stricte ou non, et de les d\u00e9finir clairement. Sur le serveur, il peut y avoir 20 projets diff\u00e9rents, chacun ayant sa propre liste de paquets et de biblioth\u00e8ques, ind\u00e9pendante des autres.<\/p>\n<p><b>Docker<\/b> \u2014 un utilitaire qui permet de d\u00e9finir et d'isoler l'environnement dans lequel l'application va fonctionner. De m\u00eame que pour Composer, mais de mani\u00e8re plus approfondie, nous pouvons d\u00e9finir ce avec quoi l'application travaille. Choisir une version sp\u00e9cifique de PHP, installer uniquement les paquets n\u00e9cessaires au fonctionnement du projet, sans ajouter de composants superflus. Et surtout, ne pas entrer en conflit avec les paquets et l'environnement de la machine h\u00f4te et d'autres projets. Ainsi, tous les projets sur le serveur fonctionnant via Docker peuvent utiliser n'importe quel ensemble de paquets et un environnement totalement diff\u00e9rent.<\/p>\n<h4>3. Configuration<\/h4>\n<p>\nConservez les configurations sous forme de constantes directement dans le code. Des constantes distinctes pour le serveur de test, et d'autres pour la production. Liez le fonctionnement de l'application en fonction de l'environnement directement dans la logique m\u00e9tier du projet en utilisant des constructions if else.<\/p>\n<p><b>Configurations<\/b> \u2014 c'est la seule chose qui doit varier entre les d\u00e9ploiements du projet. Id\u00e9alement, les configurations devraient \u00eatre transmises via des variables d'environnement (env vars). <\/p>\n<p>Ainsi, m\u00eame si vous conservez plusieurs fichiers de configuration .config.prod .config.local et que vous les renommez au moment du d\u00e9ploiement en .config (la configuration principale \u00e0 partir de laquelle l'application lit les donn\u00e9es), cela ne serait pas une approche correcte, car dans ce cas, les informations des configurations seraient accessibles \u00e0 tous les d\u00e9veloppeurs de l'application et les donn\u00e9es du serveur de production seraient compromises. Toutes les configurations doivent \u00eatre stock\u00e9es directement dans le syst\u00e8me de d\u00e9ploiement (CI\/CD) et g\u00e9n\u00e9r\u00e9es pour diff\u00e9rents environnements avec diff\u00e9rentes valeurs n\u00e9cessaires pour un environnement sp\u00e9cifique au moment du d\u00e9ploiement.<\/p>\n<h4>4. Services externes (Backing Services)<\/h4>\n<p>\nSoyez rigidement li\u00e9 \u00e0 l'environnement, utilisez diff\u00e9rentes connexions pour les m\u00eames services dans des environnements sp\u00e9cifiques.<\/p>\n<p>En r\u00e9alit\u00e9, ce point chevauche fortement celui concernant les configurations, car sans ce point, il est impossible de cr\u00e9er des donn\u00e9es de configuration normales et la possibilit\u00e9 de configuration dispara\u00eetra compl\u00e8tement.<\/p>\n<p>Toutes les connexions aux services externes, tels que les serveurs de files d'attente, bases de donn\u00e9es, services de mise en cache, doivent \u00eatre uniformes pour l'environnement local ainsi que pour l'environnement externe \/ de production. En d'autres termes, je peux \u00e0 tout moment changer une cha\u00eene de connexion pour remplacer les appels \u00e0 la base #1 par ceux \u00e0 la base #2 sans modifier le code de l'application. Ou, en anticipant un exemple, lors de la mise \u00e0 l'\u00e9chelle du service, vous n'aurez pas besoin d'indiquer une connexion d'une mani\u00e8re particuli\u00e8re pour un serveur de cache suppl\u00e9mentaire.<\/p>\n<h4>5. Construction, version, ex\u00e9cution<\/h4>\n<p>\nAyez uniquement la version finale du code sur le serveur, sans possibilit\u00e9 de revenir en arri\u00e8re sur la version pr\u00e9c\u00e9dente. Ne gaspillez pas d'espace disque. Qui pense qu'il peut d\u00e9ployer du code en production avec une erreur est un mauvais programmeur !<\/p>\n<p>Toutes les \u00e9tapes de d\u00e9ploiement doivent \u00eatre s\u00e9par\u00e9es les unes des autres.<\/p>\n<p>Ayez la possibilit\u00e9 de revenir en arri\u00e8re. R\u00e9alisez des versions en conservant d'anciennes copies de l'application (d\u00e9j\u00e0 compil\u00e9es et pr\u00eates pour le combat) en acc\u00e8s rapide, afin qu'en cas d'erreurs, vous puissiez restaurer l'ancienne version. Donc, il y a conditionnellement un dossier <i>releases<\/i> et un dossier <i>courant<\/i>, et apr\u00e8s un d\u00e9ploiement et une compilation r\u00e9ussis, le dossier <i>courant<\/i> est li\u00e9 par un lien symbolique \u00e0 la nouvelle version qui se trouve \u00e0 l'int\u00e9rieur <i>releases<\/i> d'un nom conditionnel de num\u00e9ro de version. <\/p>\n<p>C'est ici que nous rappelons le d\u00e9ploiement Blue-Green, qui permet non seulement de basculer entre les versions de code, mais aussi de changer tous les ressources et environnements avec la capacit\u00e9 de revenir en arri\u00e8re.<\/p>\n<h4>6. Processus<\/h4>\n<p>\nConservez les donn\u00e9es d'\u00e9tat de l'application directement dans l'application elle-m\u00eame. Utilisez des sessions dans la m\u00e9moire vive de l'application. Utilisez autant que possible les \u00e9l\u00e9ments partag\u00e9s entre les services tiers. Engagez-vous sur le fait que l'application ne peut avoir qu'un seul processus et n'autorisez pas la possibilit\u00e9 de mise \u00e0 l'\u00e9chelle.<\/p>\n<p>Concernant les sessions, conservez les donn\u00e9es uniquement dans le cache contr\u00f4l\u00e9 par des services tiers (memcached, redis), de sorte que m\u00eame si vous avez 20 processus de l'application en cours d'ex\u00e9cution, chacun d'eux peut acc\u00e9der au cache et continuer \u00e0 travailler avec le client dans le m\u00eame \u00e9tat que l'utilisateur l'\u00e9tait en utilisant l'application dans un autre processus. Avec cette approche, peu importe combien de copies des services tiers vous utilisez, tout fonctionnera normalement sans probl\u00e8me d'acc\u00e8s aux donn\u00e9es.<\/p>\n<h4>7. Liaison des ports (Port binding)<\/h4>\n<p>\nSeul le serveur web doit savoir comment travailler avec les services tiers. Il est m\u00eame pr\u00e9f\u00e9rable de lancer les services tiers directement \u00e0 l'int\u00e9rieur du serveur web. Par exemple, comme un module PHP dans Apache.<br \/>\nTous vos services doivent \u00eatre accessibles les uns aux autres via une adresse et un port quelconque (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), c'est-\u00e0-dire qu'\u00e0 partir de nginx, je peux acc\u00e9der \u00e0 php-fpm, ainsi qu'\u00e0 postgres, et \u00e0 partir de php-fpm, acc\u00e9der \u00e0 postgres et nginx, et en fait, chaque service peut acc\u00e9der \u00e0 un autre service. De cette mani\u00e8re, la viabilit\u00e9 d'un service n'est pas li\u00e9e \u00e0 celle d'un autre service.<\/p>\n<h4>8. Parall\u00e9lisme<\/h4>\n<p>\nTravaillez avec un seul processus, car plusieurs processus pourraient ne pas s'entendre ! <\/p>\n<p>Laissez la possibilit\u00e9 de mise \u00e0 l'\u00e9chelle. Docker Swarm est parfait pour cela. <br \/>\nDocker Swarm est un outil pour cr\u00e9er et g\u00e9rer des clusters de conteneurs, tant entre diff\u00e9rentes machines qu'un grand nombre de conteneurs sur une seule machine.<\/p>\n<p>En utilisant swarm, je peux d\u00e9terminer combien de ressources je vais allouer \u00e0 chaque processus et combien de processus d'un m\u00eame service je vais lancer, tandis que le r\u00e9partiteur interne, en recevant des donn\u00e9es sur le port d\u00e9sign\u00e9, va automatiquement les proxy vers les processus. Ainsi, en voyant que la charge sur le serveur a augment\u00e9, je peux ajouter plus de processus, r\u00e9duisant ainsi la charge sur certains processus.<\/p>\n<h4>9. \u00c9liminabilit\u00e9 (Disposability)<\/h4>\n<p>\nN'utilisez pas de files d'attente pour travailler avec des processus et des donn\u00e9es. Tuer un processus doit influencer le fonctionnement de l'ensemble de l'application. Si un service s'arr\u00eate, tout s'arr\u00eate.<\/p>\n<p>Chaque processus et service peut \u00eatre arr\u00eat\u00e9 \u00e0 tout moment et cela ne doit pas perturber les autres services (il ne s'agit pas que le service sera indisponible pour un autre service, mais que l'autre service ne s'arr\u00eatera pas en raison de celui-ci). Tous les processus doivent se terminer en douceur, de mani\u00e8re \u00e0 ce que, lors de leur arr\u00eat, les donn\u00e9es ne soient pas endommag\u00e9es et que, lors de la prochaine activation, le syst\u00e8me fonctionne correctement. M\u00eame en cas d'arr\u00eat d'urgence, les donn\u00e9es ne doivent pas \u00eatre compromises (un m\u00e9canisme de transactions convient ici, les requ\u00eates \u00e0 la base de donn\u00e9es fonctionnent uniquement par groupes, et si une seule requ\u00eate du groupe \u00e9choue ou s'ex\u00e9cute avec une erreur, aucune autre requ\u00eate du groupe n'est ex\u00e9cut\u00e9e en r\u00e9alit\u00e9).<\/p>\n<h4>10. Parit\u00e9 entre le d\u00e9veloppement et le fonctionnement de l'application<\/h4>\n<p>\nLa version de production, la version de staging et la version locale de l'application doivent \u00eatre diff\u00e9rentes. En production, nous avons le framework Yii Lite, tandis qu'en local nous avons Yii, pour que cela fonctionne plus rapidement en production !<\/p>\n<p>En r\u00e9alit\u00e9, tous les d\u00e9ploiements et le travail avec le code doivent se faire dans des environnements presque identiques (il ne s'agit pas de mat\u00e9riel physique). De plus, n'importe quel membre de l'\u00e9quipe de d\u00e9veloppement doit pouvoir d\u00e9ployer le code en production si n\u00e9cessaire, et non pas uniquement une \u00e9quipe de devops sp\u00e9cialement form\u00e9e, qui peut mettre en production l'application gr\u00e2ce \u00e0 une force particuli\u00e8re.<\/p>\n<p>Docker nous aide \u00e9galement dans cette t\u00e2che. Si toutes les pr\u00e9c\u00e9dentes exigences sont respect\u00e9es, l'utilisation de Docker rendra le processus de d\u00e9ploiement de l'environnement aussi bien en production que sur la machine locale aussi simple que de taper une ou deux commandes.<\/p>\n<h4>11. Journalisation (Logs)<\/h4>\n<p>\nNous \u00e9crivons les journaux dans des fichiers et des bases de donn\u00e9es ! Nous ne nettoyons pas les fichiers et les bases de donn\u00e9es des journaux. Nous allons simplement acheter un disque dur de 9000 p\u00e9taoctets et c'est bon.<\/p>\n<p>Tous les logs doivent \u00eatre consid\u00e9r\u00e9s comme un flux d'\u00e9v\u00e9nements. L'application elle-m\u00eame ne doit pas traiter les logs. Les logs doivent \u00eatre \u00e9mis soit en stdout, soit envoy\u00e9s via un protocole tel que udp, afin que la gestion des logs par l'application ne pose aucun probl\u00e8me. Graylog convient bien \u00e0 cela. Graylog, en recevant tous les logs via udp (car avec ce protocole, il n'est pas n\u00e9cessaire d'attendre une confirmation de r\u00e9ception r\u00e9ussie du paquet), ne d\u00e9range l'application d'aucune mani\u00e8re et se charge uniquement de la structuration et du traitement des logs. La logique de l'application ne change pas pour travailler avec de telles approches.<\/p>\n<h4>12. T\u00e2ches d'administration<\/h4>\n<p>\nPour mettre \u00e0 jour les donn\u00e9es, la base de donn\u00e9es, etc., utilisez un endpoint cr\u00e9\u00e9 s\u00e9par\u00e9ment dans l'API ; l'ex\u00e9cution de celui-ci deux fois de suite peut entra\u00eener un doublement de tout. Mais vous n'\u00eates pas idiots, vous ne cliquerez pas deux fois, et les migrations ne nous sont pas n\u00e9cessaires.<\/p>\n<p>Toutes les t\u00e2ches d'administration doivent \u00eatre ex\u00e9cut\u00e9es dans le m\u00eame environnement que tout le code, au niveau des versions. Donc, si nous devons modifier la structure de la base de donn\u00e9es, nous ne ferons pas cela manuellement en changeant les noms des colonnes et en ajoutant de nouvelles via des outils de gestion de base de donn\u00e9es visuels. Pour ces choses, nous cr\u00e9ons des scripts s\u00e9par\u00e9s - des migrations, qui sont ex\u00e9cut\u00e9es partout et dans tous les environnements avec un r\u00e9sultat commun et compr\u00e9hensible. Pour toutes les autres t\u00e2ches, comme le remplissage d'un projet avec des donn\u00e9es, des m\u00e9thodologies similaires doivent \u00eatre appliqu\u00e9es.<\/p>\n<h3>Exemple d'impl\u00e9mentation en PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. Tous les exemples ont \u00e9t\u00e9 r\u00e9alis\u00e9s sur MacOS. La majeure partie convient aussi pour Linux. Les utilisateurs de Windows, d\u00e9sol\u00e9, mais je n'ai pas travaill\u00e9 avec Windows depuis longtemps.<\/p>\n<p>Imaginons une situation o\u00f9 aucune version de PHP n'est install\u00e9e sur notre PC et o\u00f9 il n'y a rien du tout. <br \/>\nNous installons les derni\u00e8res versions de docker et docker-compose. (cela peut \u00eatre trouv\u00e9 sur Internet)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Installons <noindex><a rel=\"nofollow\" href=\"https:\/\/laradock.io\/\">Laradock<\/a><\/noindex><\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/Laradock\/laradock.git &amp;&amp; \nls\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c0 propos de Laradock, je dirais que c'est un outil fantastique, rassemblant de nombreux conteneurs et outils auxiliaires. Mais utiliser Laradock tel quel en production sans modifications - je ne le recommanderais pas en raison de son exc\u00e8s. Il vaut mieux cr\u00e9er ses propres conteneurs en se basant sur les exemples de Laradock, car cela permet d'optimiser, car personne n'a besoin de tout ce qui s'y trouve en m\u00eame temps.<\/p>\n<p>2. Configurons Laradock pour le fonctionnement de notre application.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Ouvrir le r\u00e9pertoire habr (dossier parent dans lequel laradock a \u00e9t\u00e9 clon\u00e9) dans n'importe quel \u00e9diteur. (Dans mon cas, PHPStorm)<\/p>\n<p>\u00c0 ce stade, nous d\u00e9finissons uniquement le nom du projet.<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. D\u00e9marrez l'image de workspace. (Dans votre cas, les images mettront un certain temps \u00e0 se construire)<br \/>\nWorkspace est une image sp\u00e9cialement pr\u00e9par\u00e9e pour travailler avec le framework au nom du d\u00e9veloppeur.<\/p>\n<p>Acc\u00e9dez au conteneur \u00e0 l'aide de <\/p>\n<pre><code class=\"bash\">docker-compose up -d workspace &amp;&amp; \ndocker-compose exec workspace bash\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Installer Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Apr\u00e8s l'installation, v\u00e9rifiez si le r\u00e9pertoire du projet a \u00e9t\u00e9 cr\u00e9\u00e9, puis arr\u00eatez compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Retournez dans PHPStorm et mettez le chemin correct vers notre application Laravel dans le fichier .env.<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Ajoutons tout le code dans Git.<\/p>\n<p>Pour ce faire, cr\u00e9ons un r\u00e9f\u00e9rentiel sur Github (ou ailleurs). Allons dans le terminal dans le r\u00e9pertoire habr et ex\u00e9cutons le code suivant.<\/p>\n<pre><code class=\"bash\">echo \"# habr-12factor\" &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m \"premier commit\"\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # ici sera le lien vers votre d\u00e9p\u00f4t\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nV\u00e9rifions que tout va bien. <\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour plus de commodit\u00e9, je recommande d'utiliser une interface graphique pour Git, dans mon cas c'est <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (lien r\u00e9f\u00e9rentiel ici)<\/p>\n<p>4. D\u00e9marrez !<\/p>\n<p>Avant de d\u00e9marrer, assurez-vous qu'il n'y a rien qui tourne sur les ports 80 et 443.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAinsi, notre projet se compose de 3 services distincts :<\/p>\n<ul>\n<li>nginx \u2014 serveur web<\/li>\n<li>php-fpm \u2014 php pour recevoir des requ\u00eates du serveur web<\/li>\n<li>workspace \u2014 php pour le d\u00e9veloppeur<\/li>\n<\/ul>\n<p>\nPour l'instant, nous sommes parvenus \u00e0 cr\u00e9er une application conforme \u00e0 4 des 12 points, \u00e0 savoir :<\/p>\n<p>1. <b>Base de code<\/b> \u2014 tout le code est dans un seul r\u00e9f\u00e9rentiel (petite remarque : il peut \u00eatre judicieux d'int\u00e9grer docker dans le projet Laravel, mais ce n'est pas fondamental).<\/p>\n<p>2. <b>D\u00e9pendances<\/b> \u2014 Toutes nos d\u00e9pendances sont clairement \u00e9nonc\u00e9es dans application\/composer.json et dans chaque Dockerfile de chaque conteneur.<\/p>\n<p>3. <b>Services externes (Backing Services)<\/b> \u2014 Chacune des services (php-fpm, nginx, workspace) vit sa propre vie et est connect\u00e9e de l'ext\u00e9rieur, et en travaillant avec un service, les autres ne seront pas affect\u00e9s.<\/p>\n<p>4. <b>Processus<\/b> \u2014 chaque service est un processus unique. Chacune des services ne conserve pas d'\u00e9tat interne.<\/p>\n<p>5.<b> Liaison de ports (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComme nous le voyons, chaque service est lanc\u00e9 sur son propre port et est accessible \u00e0 tous les autres services.<\/p>\n<p>6.<b> Parall\u00e9lisme <\/b><\/p>\n<p>Docker nous permet de lancer plusieurs processus des m\u00eames services avec un \u00e9quilibrage de charge automatique entre eux. <\/p>\n<p>Arr\u00eatons les conteneurs et relan\u00e7ons-les avec le drapeau <b>\u2014scale<\/b><\/p>\n<pre><code class=\"bash\">docker-compose down &amp;&amp; \ndocker-compose up -d --scale php-fpm=3 nginx php-fpm\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComme nous le voyons, des copies du conteneur php-fpm ont \u00e9t\u00e9 cr\u00e9\u00e9es. Dans notre travail avec ce conteneur, nous n'avons rien \u00e0 changer. Nous continuons \u00e9galement \u00e0 y acc\u00e9der via le port 9000, et Docker g\u00e8re la charge entre les conteneurs pour nous.<\/p>\n<p>7. <b>Disposabilit\u00e9 (Disposability)<\/b> \u2014 chaque conteneur peut \u00eatre arr\u00eat\u00e9 sans nuire aux autres. L'arr\u00eat ou le red\u00e9marrage d'un conteneur n'affectera en rien le fonctionnement de l'application lors des lancements suivants. Chaque conteneur peut \u00e9galement \u00eatre d\u00e9marr\u00e9 \u00e0 tout moment.<\/p>\n<p>8. <b>Parit\u00e9 entre le d\u00e9veloppement et l'exploitation de l'application<\/b> \u2014 tous nos environnements sont identiques. En lan\u00e7ant le syst\u00e8me sur un serveur en production, vous n'aurez rien \u00e0 changer dans vos commandes. Tout sera exactement comme bas\u00e9 sur Docker.<\/p>\n<p>9. <b>Journalisation (Logs)<\/b> \u2014 tous les logs de ces conteneurs sortent en flux et sont visibles dans la console Docker. (dans ce cas, en r\u00e9alit\u00e9, avec d'autres conteneurs faits maison, cela peut ne pas \u00eatre le cas si vous ne vous en occupez pas)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMais il y a un hic, car les valeurs par d\u00e9faut en PHP et Nginx enregistrent \u00e9galement les logs dans un fichier. Pour respecter les 12 facteurs, il est n\u00e9cessaire de <b>d\u00e9sactiver<\/b> l'enregistrement des logs dans un fichier dans les configurations de chaque conteneur s\u00e9par\u00e9ment.<\/p>\n<p>Docker offre \u00e9galement la possibilit\u00e9 de diriger les logs non seulement vers stdout, mais aussi vers des outils comme graylog dont j'ai parl\u00e9 ci-dessus. Et \u00e0 l'int\u00e9rieur de graylog, nous pouvons manipuler les logs comme nous le souhaitons, et notre application ne s'en apercevra en aucune mani\u00e8re.<\/p>\n<p>10. <b>T\u00e2ches d'administration<\/b> \u2014 toutes les t\u00e2ches d'administration sont r\u00e9solues par Laravel gr\u00e2ce \u00e0 l'outil artisan exactement comme les cr\u00e9ateurs de l'application \u00e0 12 facteurs l'auraient souhait\u00e9.<\/p>\n<p>\u00c0 titre d'exemple, je vais montrer comment certaines commandes sont ex\u00e9cut\u00e9es.<br \/>\nEntrons dans le conteneur.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous pouvons maintenant utiliser n'importe quelle commande. (notez que nous n'avons pas configur\u00e9 la base de donn\u00e9es et le cache, donc la moiti\u00e9 des commandes ne s'ex\u00e9cuteront pas correctement, car elles sont destin\u00e9es \u00e0 fonctionner avec le cache et la base de donn\u00e9es).<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;applications et d\u00e9ploiement Blue-Green, bas\u00e9 sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Configurations<\/b> et 12. <b>Build, release, run<\/b><\/p>\n<p>Je voulais consacrer cette partie au Blue-Green Deployment, mais cela s'est av\u00e9r\u00e9 trop d\u00e9velopp\u00e9 pour cet article. J'\u00e9crirai un article s\u00e9par\u00e9 \u00e0 ce sujet. <\/p>\n<p>En deux mots, le concept repose sur des syst\u00e8mes CI\/CD comme <b>Jenkins<\/b> et <b>Gitlab CI<\/b>. Dans les deux cas, il est possible de d\u00e9finir des variables d'environnement li\u00e9es \u00e0 un environnement sp\u00e9cifique. Par cons\u00e9quent, dans ce cas, le point concernant <b>les configurations<\/b>.<\/p>\n<p>Et le point concernant <b>Build, release, run<\/b> est r\u00e9solu par des fonctions int\u00e9gr\u00e9es dans les deux outils, appel\u00e9es <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> permet de diviser le processus de d\u00e9ploiement en plusieurs \u00e9tapes, en mettant en avant les phases de construction, de mise en production et d'ex\u00e9cution. Dans le Pipeline, vous pourrez \u00e9galement cr\u00e9er des sauvegardes, et en fait, tout ce que vous voulez. Cet outil a un potentiel illimit\u00e9.<\/p>\n<p>Le code de l'application est sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nN'oubliez pas d'initialiser le submodule lors du clonage de ce d\u00e9p\u00f4t.<\/p>\n<p>P.S. : Toutes ces approches peuvent \u00eatre utilis\u00e9es avec d'autres utilitaires et langages de programmation. L'essentiel est que le principe reste le m\u00eame.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/480020\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 The Twelve-Factor App? \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 SaaS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u043c \u0447\u0442\u043e, \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Heroku. \u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432(The Twelve-Factor App) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40597,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 Blue-Green deployment, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044e The Twelve-Factor App \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 php \u0438 docker | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47D\u00e9veloppement d'applications et d\u00e9ploiement Blue-Green, en s'appuyant sur la m\u00e9thodologie The Twelve-Factor App avec des exemples en php et docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 Blue-Green deployment, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044e The Twelve-Factor App \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 php \u0438 docker | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-02T07:38:43+00:00","article:modified_time":"2020-02-02T07:38:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40596","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:20:45","updated":"2022-09-27 22:57:35","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}