{"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\/de\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Zun\u00e4chst etwas Theorie. Was ist <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Die Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nEinfach ausgedr\u00fcckt, handelt es sich um ein Dokument, das darauf abzielt, die Entwicklung von SaaS-Anwendungen zu vereinfachen, indem es Entwicklern und DevOps-Ingenieuren \u00fcber h\u00e4ufige Probleme und Praktiken informiert, die in der modernen Anwendungsentwicklung auftreten. <\/p>\n<p>Das Dokument wurde von den Entwicklern der Plattform Heroku erstellt.<\/p>\n<p>Die Methodologie der zw\u00f6lf Faktoren (The Twelve-Factor App) kann auf Anwendungen angewendet werden, die in jeder Programmiersprache geschrieben sind und beliebige Kombinationen von externen Diensten (backing services) nutzen (Datenbanken, Nachrichtenwarteschlangen, Cache usw.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Kurze Zusammenfassung der Faktoren, auf denen diese Methodologie basiert:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Codebasis<\/b> \u2013 Eine Codebasis, die in einem Versionskontrollsystem verfolgt wird, \u2013 mehrere Bereitstellungen <\/li>\n<li><b>Abh\u00e4ngigkeiten<\/b> \u2013 Abh\u00e4ngigkeiten klar deklarieren und isolieren<\/li>\n<li><b>Konfiguration<\/b> \u2013 Konfiguration zur Laufzeit speichern<\/li>\n<li><b>Externe Dienste (Backing Services)<\/b> \u2013 Betrachten Sie externe Dienste (backing services) als angeschlossene Ressourcen<\/li>\n<li><b>Build, Release, Run<\/b> \u2013 Trennen Sie strikt die Phasen von Build und Run<\/li>\n<li><b>Prozesse<\/b> \u2013 F\u00fchren Sie die Anwendung als einen oder mehrere zustandslose Prozesse (stateless) aus <\/li>\n<li><b>Portbindung<\/b> \u2013 Exportieren Sie Dienste \u00fcber Portbindung <\/li>\n<li><b>Parallelismus<\/b> \u2013 Skalieren Sie die Anwendung mit Prozessen <\/li>\n<li><b>Entsorgbarkeit<\/b> \u2013 Maximieren Sie die Zuverl\u00e4ssigkeit durch schnelles Starten und korrektes Herunterfahren <\/li>\n<li><b>Parit\u00e4t zwischen Entwicklung und Betrieb der Anwendung<\/b> \u2013 Halten Sie die Entwicklungs-, Staging- und Produktionsumgebungen so \u00e4hnlich wie m\u00f6glich <\/li>\n<li><b>Protokollierung (Logs)<\/b> \u2013 Betrachten Sie das Protokoll als Ereignisfluss<\/li>\n<li><b>Verwaltungsaufgaben<\/b> \u2013 F\u00fchren Sie Verwaltungs- und Managementaufgaben mit einmaligen Prozessen aus <\/li>\n<\/ol>\n<p>\n<b>Weitere Informationen zu den 12 Faktoren finden Sie in den folgenden Ressourcen:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Offizielle Quelle<\/a><\/noindex> \u2014 unbedingt zu lesen<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikel auf Habr: Die Twelve-Factor App<\/a><\/noindex> \u2014 offizielle \u00dcbersetzung<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Artikel auf Habr: 7 fehlende Faktoren im 12-Factor-App-Ansatz<\/a><\/noindex> \u2014 ein neuer Blick auf die 12 Faktoren zur Verbesserung.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Was ist Blue-Green Deployment?<\/h3>\n<p>\nBlue-Green Deployment ist eine Methode zur Bereitstellung von Anwendungen auf <b>production<\/b> so dass der Endkunde keinerlei Ver\u00e4nderungen bemerkt. Mit anderen Worten, die Bereitstellung der Anwendung erfolgt mit null <b>Ausfallzeiten<\/b>.<\/p>\n<p>Das klassische BG Deploy-Schema sieht folgenderma\u00dfen aus, wie auf dem Bild unten dargestellt. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Zu Beginn gibt es 2 physische Server mit absolut identischem Code, Anwendung und Projekt, sowie einen Router (Load Balancer). <\/li>\n<li>Der Router leitet anfangs alle Anfragen an einen der Server<b>gr\u00fcn<\/b>). <\/li>\n<li>In dem Moment, in dem ein neues Release durchgef\u00fchrt werden muss, wird das gesamte Projekt auf dem anderen Server<b>blau<\/b>aktualisiert, der momentan keine Anfragen bearbeitet. <\/li>\n<li>Nachdem der Code auf dem <b>blauen<\/b> Server vollst\u00e4ndig aktualisiert wurde, erh\u00e4lt der Router den Befehl, auf den <b>gr\u00fcnen<\/b> findet man <b>blau<\/b> Server. <\/li>\n<li>zu wechseln. Nun sehen alle Kunden die Ergebnisse des Codes von <b>blauem<\/b> Server. <\/li>\n<li> F\u00fcr eine gewisse Zeit dient der <b>gr\u00fcn<\/b> Server als Backup f\u00fcr den Fall eines fehlerhaften Deployments auf den <b>blau<\/b> Server, und im Falle eines Fehlers oder Bugs schaltet der Router den Nutzerstrom zur\u00fcck auf den <b>gr\u00fcn<\/b> Server mit der alten stabilen Version, w\u00e4hrend der neue Code zur \u00dcberarbeitung und Testung gesendet wird.<\/li>\n<li>Am Ende des Prozesses wird ebenso der <b>gr\u00fcn<\/b> Server aktualisiert. Nach seiner Aktualisierung schaltet der Router den Anfragenstrom zur\u00fcck auf <b>gr\u00fcn<\/b> Server.<\/li>\n<\/ul>\n<p>\nDas sieht alles sehr gut aus und auf den ersten Blick sollten damit keine Probleme auftreten.<br \/>\nDa wir jedoch in einer modernen Welt leben, ist die Variante mit physischen Schaltern, wie sie im klassischen Schema dargestellt ist, nicht praktikabel. Halten Sie die Informationen vorerst fest, wir werden sp\u00e4ter darauf zur\u00fcckkommen.<\/p>\n<h3>N\u00fctzliche und sch\u00e4dliche Tipps<\/h3>\n<p>\n<i>Haftungsausschluss<\/i>: In den untenstehenden Beispielen sind die Werkzeuge \/ Methoden aufgef\u00fchrt, die ich verwende; Sie k\u00f6nnen jedoch beliebige Alternativen mit \u00e4hnlichen Funktionen nutzen. <\/p>\n<p>Die meisten Beispiele werden in irgendeiner Weise mit Web-Entwicklung (\u00fcberraschung!) sowie mit PHP und Docker zu tun haben.<\/p>\n<p>In den folgenden Punkten finden Sie eine einfache praktische Beschreibung der Nutzung von Faktoren anhand bestimmter Beispiele. Wenn Sie mehr Theorie zu diesem Thema w\u00fcnschen, wenden Sie sich bitte \u00fcber die obigen Links an die Originalquelle. <\/p>\n<h4>1. Codebasis<\/h4>\n<p>\nVerwenden Sie FTP und FileZilla, um Dateien einzeln auf Server hochzuladen. Speichern Sie den Code nirgendwo au\u00dfer auf dem Produktionsserver.<\/p>\n<p>In einem Projekt sollte es immer eine einheitliche Codebasis geben, das hei\u00dft, der gesamte Code stammt aus einer Quelle. <b>Git<\/b> Repository. Die Server (Produktion, Staging, Test1, Test2 \u2026) verwenden Code aus den Branches eines gemeinsamen Repositories. So erreichen wir Konsistenz im Code.<\/p>\n<h4>2. Abh\u00e4ngigkeiten<\/h4>\n<p>\nLaden Sie alle Bibliotheken als Verzeichnisse direkt in das Hauptverzeichnis des Projekts herunter. Aktualisierungen erfolgen einfach durch das \u00dcbertragen des neuen Codes in den Ordner der aktuellen Version der Bibliothek. Installieren Sie alle ben\u00f6tigten Tools direkt auf dem Hostserver, wo bereits 20 Dienste laufen.<\/p>\n<p>Das Projekt sollte immer eine klar definierte Liste von Abh\u00e4ngigkeiten haben (unter Abh\u00e4ngigkeiten verstehe ich auch die Umgebung). Alle Abh\u00e4ngigkeiten m\u00fcssen eindeutig definiert und isoliert sein. <br \/>\nAls Beispiel nehmen wir <b>Composer<\/b> und <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 einen Paketmanager, der es erm\u00f6glicht, PHP-Bibliotheken zu installieren. Composer bietet die M\u00f6glichkeit, Versionen strikt oder nicht strikt anzugeben und sie eindeutig zu definieren. Auf dem Server k\u00f6nnen 20 verschiedene Projekte laufen, und jedes hat eine eigene Liste von Paketen und Bibliotheken, die unabh\u00e4ngig voneinander sind.<\/p>\n<p><b>Docker<\/b> \u2014 ein Werkzeug, das es erm\u00f6glicht, die Umgebung zu bestimmen und zu isolieren, in der die Anwendung ausgef\u00fchrt wird. \u00c4hnlich wie bei Composer, aber diesmal umfassender, k\u00f6nnen wir festlegen, mit was die Anwendung arbeitet. Eine bestimmte PHP-Version ausw\u00e4hlen, nur die f\u00fcr das Projekt ben\u00f6tigten Pakete installieren und nichts \u00dcberfl\u00fcssiges hinzuf\u00fcgen. Am wichtigsten ist, dass es keine \u00dcberschneidungen mit den Paketen und der Umgebung der Hostmaschine und anderer Projekte gibt. Das hei\u00dft, alle Projekte auf dem Server, die \u00fcber Docker laufen, k\u00f6nnen v\u00f6llig unterschiedliche Paketsets und Umgebungen nutzen.<\/p>\n<h4>3. Konfiguration<\/h4>\n<p>\nBewahren Sie Konfigurationen als Konstanten direkt im Code auf. Separate Konstanten f\u00fcr den Test-Server, separate f\u00fcr die Produktionsumgebung. Binden Sie die Funktionsweise der Anwendung abh\u00e4ngig von der Umgebung direkt in die Logik des Projekts ein, indem Sie if-else-Konstruktionen verwenden.<\/p>\n<p><b>Konfigurationen<\/b> \u2014 das ist das einzige, was die Bereitstellungen des Projekts (Deployment) unterscheiden sollte. Idealerweise sollten Konfigurationen \u00fcber Umgebungsvariablen (env vars) \u00fcbergeben werden. <\/p>\n<p>Das hei\u00dft, selbst wenn Sie mehrere Konfigurationsdateien wie .config.prod und .config.local speichern und diese beim Deployment in .config umbenennen (die Hauptkonfiguration, aus der die Anwendung Daten liest) - w\u00e4re dies kein sinnvoller Ansatz, da in diesem Fall die Informationen aus den Konfigurationen f\u00fcr alle Entwickler der Anwendung zug\u00e4nglich w\u00e4ren und die Daten vom Produktionsserver kompromittiert werden k\u00f6nnten. Alle Konfigurationen sollten direkt im Deployment-System (CI\/CD) gespeichert und f\u00fcr verschiedene Umgebungen mit unterschiedlichen Werten, die f\u00fcr die jeweilige Umgebung erforderlich sind, genau zum Zeitpunkt des Deployments generiert werden.<\/p>\n<h4>4. Externe Dienste (Backing Services)<\/h4>\n<p>\nBinden Sie sich stark an die Umgebung, nutzen Sie unterschiedliche Verbindungen f\u00fcr dieselben Dienste in bestimmten Umgebungen.<\/p>\n<p>Tats\u00e4chlich \u00fcberschneidet sich dieser Punkt stark mit dem Punkt \u00fcber Konfigurationen, da ohne diesen Punkt keine ordentlichen Konfigurationsdaten erstellt werden k\u00f6nnen und die M\u00f6glichkeit zur Konfiguration insgesamt verloren geht.<\/p>\n<p>Alle Verbindungen zu externen Diensten wie Warteschlangensystemen, Datenbanken und Caching-Diensten sollten sowohl f\u00fcr die lokale Umgebung als auch f\u00fcr die Produktionsumgebung einheitlich sein. Anders gesagt, ich kann jederzeit die Verbindungszeichenfolge \u00e4ndern und die Zugriffe auf Datenbank #1 durch Datenbank #2 ersetzen, ohne den Anwendungscode zu \u00e4ndern. Ein Beispiel hierf\u00fcr ist, dass Sie beim Skalieren des Services nicht f\u00fcr einen zus\u00e4tzlichen Cache-Server eine spezielle Verbindung angeben m\u00fcssen.<\/p>\n<h4>5. Aufbau, Ver\u00f6ffentlichung, Ausf\u00fchrung<\/h4>\n<p>\nHalten Sie nur die finale Version des Codes auf dem Server, ohne die M\u00f6glichkeit, ein Release zur\u00fcckzusetzen. Platzieren Sie keine nicht ben\u00f6tigten Daten auf der Festplatte. Wer denkt, dass er fehlerhaften Code in die Produktion bringen kann, ist ein schlechter Programmierer!<\/p>\n<p>Alle Phasen des Deployments sollten voneinander getrennt sein.<\/p>\n<p>Haben Sie die M\u00f6glichkeit, zur\u00fcckzugehen. Erstellen Sie Releases und bewahren Sie \u00e4ltere Kopien der Anwendung (schon erstellt und bereit f\u00fcr den Einsatz) in leicht zug\u00e4nglichen Verzeichnissen auf, um im Falle von Fehlern zur alten Version zur\u00fcckzukehren. Es gibt also den Ordner <i>releases<\/i> und den Ordner <i>current<\/i>, und nach einem erfolgreichen Deployment und Aufbau befindet sich der Ordner <i>current<\/i> verkn\u00fcpft sich \u00fcber einen symbolischen Link mit der neuen Version, die intern liegt. <i>releases<\/i> mit einer bedingten Bezeichnung f\u00fcr die Versionsnummer. <\/p>\n<p>Hier kommt das Blue-Green-Deployment ins Spiel, das nicht nur den Wechsel zwischen Code erm\u00f6glicht, sondern auch das Umschalten zwischen allen Ressourcen und sogar Umgebungen erlaubt, mit der M\u00f6glichkeit, alles zur\u00fcckzusetzen.<\/p>\n<h4>6. Prozesse<\/h4>\n<p>\nSpeichern Sie die Anwendungszust\u00e4nde direkt in der Anwendung selbst. Verwenden Sie Sessions im Arbeitsspeicher der Anwendung. Nutzen Sie so viele gemeinsam genutzte Daten wie m\u00f6glich, die zwischen externen Diensten geteilt werden k\u00f6nnen. Stellen Sie sicher, dass die Anwendung nur einen Prozess haben kann und verhindern Sie die M\u00f6glichkeit der Skalierung.<\/p>\n<p>Hinsichtlich der Sitzungen sollten Sie Daten nur im Cache speichern, der von externen Diensten (memcached, redis) verwaltet wird. Dadurch kann selbst bei 20 laufenden Anwendungsprozessen jeder von ihnen \u00fcber den Cache weiterhin mit dem Kunden im gleichen Zustand arbeiten, in dem der Benutzer zuvor mit der Anwendung in einem anderen Prozess gewesen ist. Dieser Ansatz gew\u00e4hrleistet, dass unabh\u00e4ngig davon, wie viele Kopien externer Dienste Sie verwenden, alles reibungslos funktioniert und der Datenzugang unproblematisch bleibt.<\/p>\n<h4>7. Portbindung<\/h4>\n<p>\nNur der Webserver sollte wissen, wie man mit externen Diensten umgeht. Am besten w\u00e4re es, externe Dienste direkt innerhalb des Webservers zu betreiben, zum Beispiel als PHP-Modul in Apache.<br \/>\nAlle Ihre Dienste sollten \u00fcber eine Adresse und einen Port (localgost:5432, localhost:3000, nginx:80, php-fpm:9000) f\u00fcreinander erreichbar sein. Das bedeutet, dass ich von nginx sowohl auf php-fpm als auch auf Postgres zugreifen kann, und von php-fpm auf Postgres und nginx, sodass ich von jedem Dienst auf jeden anderen Dienst zugreifen kann. Dadurch ist die Lebensf\u00e4higkeit eines Dienstes nicht von der eines anderen abh\u00e4ngig.<\/p>\n<h4>8. Parallelit\u00e4t<\/h4>\n<p>\nArbeiten Sie mit einem Prozess, denn mehrere Prozesse k\u00f6nnen m\u00f6glicherweise nicht harmonieren! <\/p>\n<p>Halten Sie die M\u00f6glichkeit zur Skalierung offen. Docker Swarm ist daf\u00fcr hervorragend geeignet. <br \/>\nDocker Swarm ist ein Tool zur Erstellung und Verwaltung von Container-Clustern, sowohl \u00fcber verschiedene Maschinen als auch innerhalb einer Vielzahl von Containern auf einer einzelnen Maschine.<\/p>\n<p>Mit Swarm kann ich festlegen, wie viele Ressourcen ich jedem Prozess zuweisen m\u00f6chte und wie viele Prozesse eines bestimmten Dienstes ich starten will. Der interne Load Balancer empf\u00e4ngt Daten auf einen bestimmten Port und leitet sie automatisch an die Prozesse weiter. Wenn die Last auf dem Server steigt, kann ich mehr Prozesse hinzuf\u00fcgen, um die Belastung bestimmter Prozesse zu verringern.<\/p>\n<h4>9. Entsorgbarkeit (Disposability)<\/h4>\n<p>\nVerwenden Sie keine Warteschlangen f\u00fcr die Arbeit mit Prozessen und Daten. Das Beenden eines Prozesses sollte die Funktionsweise der gesamten Anwendung beeinflussen. F\u00e4llt ein Dienst aus, f\u00e4llt alles aus.<\/p>\n<p>Jeder Prozess und Dienst kann jederzeit abgeschaltet werden, ohne dass dies andere Dienste beeintr\u00e4chtigt (was hier gemeint ist, ist nicht, dass ein Dienst nicht f\u00fcr einen anderen Dienst verf\u00fcgbar ist, sondern dass ein anderer Dienst nicht sofort daraufhin ebenfalls abgeschaltet wird). Alle Prozesse sollten sanft beendet werden, sodass beim Abschluss keine Daten verloren gehen und das System beim n\u00e4chsten Start einwandfrei funktioniert. Das hei\u00dft, selbst im Falle eines Notabschaltens d\u00fcrfen keine Daten verloren gehen (hier w\u00e4re ein Transaktionsmechanismus hilfreich; Datenbankanfragen funktionieren nur gruppenweise, und wenn auch nur eine Anfrage aus der Gruppe nicht erfolgreich ist oder mit einem Fehler beendet wird, wird letztendlich keine andere Anfrage aus der Gruppe ausgef\u00fchrt).<\/p>\n<h4>10. Parit\u00e4t der Entwicklung\/Betrieb des Anwendungsprogramms<\/h4>\n<p>\nDie Produktions-, Staging- und lokale Version der Anwendung m\u00fcssen unterschiedlich sein. In der Produktion verwenden wir das Yii Lite Framework, w\u00e4hrend wir lokal Yii nutzen, damit es in der Produktion schneller l\u00e4uft!<\/p>\n<p>In der Praxis sollten alle Deployments und die Arbeit mit Code in nahezu identischen Umgebungen erfolgen (es geht nicht um physische Hardware). Auch das Deployment von Code in der Produktion sollte von jedem Entwicklungsteammitglied m\u00f6glich sein, nicht nur von einer speziell geschulten DevOps-Abteilung, die nur durch besondere F\u00e4higkeiten in der Lage ist, eine Anwendung in der Produktion zu starten.<\/p>\n<p>Dabei hilft uns auch Docker. Wenn alle vorherigen Punkte beachtet werden, erm\u00f6glicht die Nutzung von Docker, den Prozess der Erstellung von Umgebungen sowohl in der Produktion als auch auf dem lokalen Rechner auf ein bis zwei Befehle zu reduzieren.<\/p>\n<h4>11. Protokollierung (Logs)<\/h4>\n<p>\nWir schreiben Logs in Dateien und Datenbanken! Dateien und Datenbanken werden nicht von Logs bereinigt. Wir kaufen einfach eine Festplatte mit 9000 Petabyte, und das war's.<\/p>\n<p>Alle Logs sollten als Ereignisstr\u00f6me betrachtet werden. Die Anwendung selbst sollte sich nicht mit der Verarbeitung von Logs befassen. Logs sollten entweder in stdout ausgegeben oder \u00fcber ein Protokoll wie UDP gesendet werden, damit die Arbeit mit Logs der Anwendung keine Probleme bereitet. Hierf\u00fcr eignet sich Graylog gut. Graylog empf\u00e4ngt alle Logs \u00fcber UDP (f\u00fcr dieses Protokoll ist keine Best\u00e4tigung des erfolgreichen Empfangs des Pakets erforderlich), st\u00f6rt die Anwendung in keiner Weise und besch\u00e4ftigt sich nur mit der Strukturierung und Verarbeitung der Logs. Die Logik der Anwendung \u00e4ndert sich nicht, wenn man solche Ans\u00e4tze verwendet.<\/p>\n<h4>12. Administrationsaufgaben<\/h4>\n<p>\nUm Daten, Datenbanken usw. zu aktualisieren, verwenden Sie einen separat erstellten Endpunkt in der API. Die Ausf\u00fchrung dieses Endpunkts zweimal hintereinander kann dazu f\u00fchren, dass Sie alle Daten duplizieren. Aber Sie sind ja nicht dumm, Sie klicken nicht zweimal, und Migrationen sind uns nicht n\u00f6tig.<\/p>\n<p>Alle Administrationsaufgaben m\u00fcssen in derselben Umgebung wie der gesamte Code und auf der Release-Ebene durchgef\u00fchrt werden. Das bedeutet, wenn wir die Struktur der Datenbank \u00e4ndern m\u00fcssen, werden wir dies nicht manuell tun, indem wir die Spaltennamen \u00e4ndern oder neue \u00fcber irgendwelche visuellen DB-Management-Tools hinzuf\u00fcgen. F\u00fcr solche Dinge erstellen wir separate Skripte \u2013 Migrationen, die \u00fcberall und in allen Umgebungen mit einem gemeinsamen und eindeutigen Ergebnis ausgef\u00fchrt werden. F\u00fcr alle anderen Aufgaben, wie das Bef\u00fcllen des Projekts mit Daten, sollten \u00e4hnliche Methoden angewendet werden.<\/p>\n<h3>Beispielimplementierung in PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. Alle Beispiele wurden auf MacOS erstellt. Der Gro\u00dfteil ist auch f\u00fcr Linux geeignet. Windows-Nutzer, entschuldigt bitte, aber mit Windows habe ich seit langem nicht mehr gearbeitet.<\/p>\n<p>Stellen wir uns vor, dass auf unserem PC keine PHP-Version installiert ist und \u00fcberhaupt nichts vorhanden ist. <br \/>\nWir installieren die neuesten Versionen von Docker und Docker-Compose. (das findet man im Internet)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Wir installieren <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=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZu Laradock kann ich sagen, dass es ein gro\u00dfartiges Werkzeug ist, das viele Container und Hilfsdienste vereint. Allerdings w\u00fcrde ich nicht empfehlen, Laradock ohne Anpassungen in der Produktion zu verwenden, da es \u00fcberladen ist. Es ist besser, eigene Container basierend auf den Beispielen in Laradock zu erstellen, da es dadurch mehr M\u00f6glichkeiten zur Optimierung gibt, denn niemand ben\u00f6tigt alles, was dort gleichzeitig vorhanden ist.<\/p>\n<p>2. Konfigurieren Sie Laradock f\u00fcr den Betrieb unserer Anwendung.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. \u00d6ffnen Sie das Verzeichnis habr (den \u00fcbergeordneten Ordner, in den Laradock geklont wurde) in einem beliebigen Editor. (In meinem Fall PHPStorm)<\/p>\n<p>An diesem Punkt legen wir nur den Projektnamen fest.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Starten Sie das Workspace-Image. (In Ihrem Fall werden die Images eine Weile gebaut.)<br \/>\nDas Workspace ist ein speziell vorbereitetes Image f\u00fcr die Arbeit mit dem Framework aus der Sicht des Entwicklers.<\/p>\n<p>Betreten Sie den Container mit <\/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=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Installieren Sie Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Nach der Installation \u00fcberpr\u00fcfen wir, ob das Projektverzeichnis erstellt wurde, und beenden den Compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Kehren wir zur\u00fcck zu PHPStorm und setzen den richtigen Pfad zu unserer Laravel-Anwendung in der .env-Datei.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. F\u00fcgen wir den gesamten Code zu Git hinzu.<\/p>\n<p>Dazu erstellen wir ein Repository auf Github (oder woanders). Wechseln wir im Terminal in das Verzeichnis habr und f\u00fchren wir den folgenden Code aus.<\/p>\n<pre><code class=\"bash\">echo \"# habr-12factor\" &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m \"first commit\"\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # hier wird der Link zu Ihrem Repo sein\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\n\u00dcberpr\u00fcfen wir, ob alles in Ordnung ist. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZur Vereinfachung empfehle ich die Nutzung einer visuellen Schnittstelle f\u00fcr Git, in meinem Fall ist das <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (hier ist der Referenzlink)<\/p>\n<p>4. Lassen Sie uns starten!<\/p>\n<p>Stellen Sie vor dem Start sicher, dass auf den Ports 80 und 443 nichts l\u00e4uft.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo besteht unser Projekt aus 3 separaten Diensten:<\/p>\n<ul>\n<li>nginx \u2014 Webserver<\/li>\n<li>php-fpm \u2014 PHP zur Verarbeitung von Anfragen vom Webserver<\/li>\n<li>workspace \u2014 PHP f\u00fcr den Entwickler<\/li>\n<\/ul>\n<p>\nDerzeit haben wir erreicht, dass wir eine Anwendung erstellt haben, die bereits 4 Punkte von 12 erf\u00fcllt, n\u00e4mlich:<\/p>\n<p>1. <b>Codebasis<\/b> \u2014 der gesamte Code liegt in einem Repository (eine kleine Anmerkung: es k\u00f6nnte sinnvoll sein, Docker innerhalb des Laravel-Projekts zu integrieren, aber das ist nicht entscheidend).<\/p>\n<p>2. <b>Abh\u00e4ngigkeiten<\/b> \u2014 Alle unsere Abh\u00e4ngigkeiten sind klar in der application\/composer.json und in jedem Dockerfile jedes Containers definiert.<\/p>\n<p>3. <b>Externe Dienste (Backing Services)<\/b> \u2014 Jeder Dienst (php-fpm, nginx, workspace) l\u00e4uft unabh\u00e4ngig und ist extern angebunden. Bei der Arbeit mit einem Dienst bleibt der andere unber\u00fchrt.<\/p>\n<p>4. <b>Prozesse<\/b> \u2014 Jeder Dienst ist ein einzelner Prozess. Jeder Dienst speichert keinen internen Zustand.<\/p>\n<p>5.<b> Portbindung<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWie wir sehen, wird jeder Dienst auf seinem eigenen Port gestartet und ist f\u00fcr alle anderen Dienste zug\u00e4nglich.<\/p>\n<p>6.<b> Parallelismus <\/b><\/p>\n<p>Docker erm\u00f6glicht es uns, mehrere Instanzen desselben Dienstes mit automatischer Lastverteilung zu starten. <\/p>\n<p>Lassen Sie uns die Container anhalten und mit dem Flag neu starten. <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=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWie wir sehen, wurden Kopien des php-fpm Containers erstellt. Wir m\u00fcssen bei der Arbeit mit diesem Container nichts \u00e4ndern. Wir greifen weiterhin \u00fcber den Port 9000 darauf zu, w\u00e4hrend Docker die Last zwischen den Containern reguliert.<\/p>\n<p>7. <b>Entsorgbarkeit<\/b> \u2014 Jeder Container kann ohne Beeintr\u00e4chtigung anderer Container beendet werden. Das Stoppen oder Neustarten eines Containers hat keine Auswirkungen auf die Anwendung bei nachfolgenden Starts. Jeder Container kann auch jederzeit wieder aktiviert werden.<\/p>\n<p>8. <b>Parit\u00e4t zwischen Entwicklung und Betrieb der Anwendung<\/b> \u2014 Alle unsere Umgebungen sind identisch. Wenn Sie ein System auf dem Server in der Produktion starten, m\u00fcssen Sie nichts in Ihren Befehlen \u00e4ndern. Alles basiert genau so auf Docker.<\/p>\n<p>9. <b>Protokollierung (Logs)<\/b> \u2014 Alle Protokolle in diesen Containern werden an den Stream weitergeleitet und sind in der Docker-Konsole sichtbar. (In diesem Fall kann es bei anderen benutzerdefinierten Containern anders sein, wenn Sie sich nicht darum k\u00fcmmern.)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs gibt jedoch ein Problem: Die Standardwerte in PHP und Nginx schreiben ebenfalls Protokolle in eine Datei. Um den 12-Faktoren-Kriterien zu entsprechen, ist es notwendig, <b>logging<\/b> die Protokollierung in Dateien in den Konfigurationen jedes Containers einzeln zu deaktivieren.<\/p>\n<p>Docker bietet auch die M\u00f6glichkeit, Protokolle nicht nur an stdout zu senden, sondern auch an Dinge wie Graylog, von dem ich oben gesprochen habe. Innerhalb von Graylog k\u00f6nnen wir die Protokolle nach Belieben verarbeiten, und unsere Anwendung wird dies nicht bemerken.<\/p>\n<p>10. <b>Verwaltungsaufgaben<\/b> \u2014 Alle Administrationsaufgaben werden von Laravel dank des Artisan-Tools genau so gel\u00f6st, wie es die Entwickler einer 12-Faktoren-Anwendung vorgesehen haben.<\/p>\n<p>Als Beispiel zeige ich, wie einige Befehle ausgef\u00fchrt werden.<br \/>\nBetreten Sie den Container.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJetzt k\u00f6nnen wir jeden Befehl nutzen. (Bitte beachten Sie, dass wir die Datenbank und den Cache nicht konfiguriert haben, daher werden die H\u00e4lfte der Befehle nicht korrekt ausgef\u00fchrt, da sie f\u00fcr die Arbeit mit dem Cache und der DB gedacht sind).<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodologie der Twelve-Factor Apps mit Beispielen in PHP und Docker.\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigurationen<\/b> und 12. <b>Build, Release, Run<\/b><\/p>\n<p>Diesen Teil wollte ich dem Blue-Green Deployment widmen, aber es stellte sich als zu umfangreich f\u00fcr diesen Artikel heraus. Ich werde dar\u00fcber einen separaten Artikel schreiben. <\/p>\n<p>Kurz gesagt, das Konzept basiert auf CI\/CD-Systemen wie <b>Jenkins<\/b> und <b>(geschrieben in<\/b>. In beiden k\u00f6nnen Umgebungsvariablen festgelegt werden, die mit einer bestimmten Umgebung verbunden sind. Entsprechend wird der Punkt mit <b>Konfigurationen<\/b>.<\/p>\n<p>Und der Punkt \u00fcber <b>Build, Release, Run<\/b> wird durch integrierte Funktionen in beiden Tools gel\u00f6st, die als <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> erm\u00f6glicht es, den Deployment-Prozess in viele Phasen zu unterteilen, wobei die Phasen der Erstellung, Freigabe und Ausf\u00fchrung hervorgehoben werden. Auch im Pipeline k\u00f6nnen Sie Backups erstellen und \u00fcberhaupt alles M\u00f6gliche erledigen. Dieses Werkzeug hat unbegrenztes Potenzial.<\/p>\n<p>Der Anwendungscode befindet sich auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nVergessen Sie nicht, das Submodul beim Klonen dieses Repositories zu initialisieren.<\/p>\n<p>P.S.: Alle diese Ans\u00e4tze k\u00f6nnen mit anderen Tools und Programmiersprachen verwendet werden. Hauptsache, der Kern bleibt unver\u00e4ndert.<br \/>\n<br \/>Quelle: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/de\/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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47 Anwendungsentwicklung und Blue-Green Deployment, basierend auf der Methodologie der Twelve-Factor App mit Beispielen in PHP und Docker | ProHoster","description":"Zu Beginn etwas Theorie. Was ist die Twelve-Factor App? Einfach ausgedr\u00fcckt, ist es ein Dokument, das darauf abzielt, die Entwicklung von SaaS-Anwendungen zu vereinfachen. Es informiert Entwickler und DevOps-Engineers \u00fcber g\u00e4ngige Probleme und Praktiken, die in der Entwicklung moderner Anwendungen h\u00e4ufig auftreten. Das Dokument wurde von den Entwicklern der Heroku-Plattform erstellt. Die Methodologie der Twelve Factors kann f\u00fcr Anwendungen angewendet werden, die in jeder Programmiersprache geschrieben sind.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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:description":"\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","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}