{"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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 ein wenig Theorie. Was ist <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nEinfach gesagt, ist dies ein Dokument, das die Entwicklung von SaaS-Anwendungen vereinfachen soll. Es informiert Entwickler und DevOps-Ingenieure \u00fcber h\u00e4ufig auftretende Probleme und Praktiken in der Entwicklung moderner Anwendungen. <\/p>\n<p>Das Dokument wurde von den Entwicklern der Plattform Heroku erstellt.<\/p>\n<p>Die Zw\u00f6lf-Faktoren-Methode (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, Caches usw.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Kurze \u00dcbersicht \u00fcber die Faktoren, auf denen diese Methode basiert:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Codebasis<\/b> \u2013 Eine Codebasis, die in einem Versionskontrollsystem verfolgt wird \u2013 mehrere Deployments. <\/li>\n<li><b>Abh\u00e4ngigkeiten<\/b> \u2013 Abh\u00e4ngigkeiten explizit 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 anpassbare Ressourcen.<\/li>\n<li><b>Bauen, Freigeben, Ausf\u00fchren<\/b> \u2013 Trennen Sie strikt die Phasen des Build- und Laufzeit.<\/li>\n<li><b>Prozesse<\/b> \u2013 F\u00fchren Sie die Anwendung als einen oder mehrere zustandslose Prozesse aus. <\/li>\n<li><b>Portbindung (Port Binding)<\/b> \u2013 Exportieren Sie Dienste \u00fcber die Portbindung. <\/li>\n<li><b>Parallelit\u00e4t<\/b> \u2013 Skalieren Sie die Anwendung mit Prozessen. <\/li>\n<li><b>Entsorgbarkeit (Disposability)<\/b> \u2013 Maximieren Sie die Zuverl\u00e4ssigkeit durch schnelles Hochfahren 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 Logs als einen Ereignisstrom.<\/li>\n<li><b>Verwaltungsaufgaben<\/b> \u2013 F\u00fchren Sie Verwaltungs- \/ Managementaufgaben mit einmaligen Prozessen durch. <\/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> \u2013 unbedingt lesenswert.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikel auf Habr. Die zw\u00f6lf Faktoren \u2013 The Twelve-Factor App<\/a><\/noindex> \u2013 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 Ansatz der 12-Faktor-App.<\/a><\/noindex> \u2013 frischer 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 zum Bereitstellen von Anwendungen. <b>Produktion<\/b> so dass der Endkunde keine \u00c4nderungen von seiner Seite aus sieht. Mit anderen Worten, die Bereitstellung der Anwendung erfolgt ohne <b>Ausfallzeit<\/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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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, Projekt, und es gibt einen Router (Lastverteiler). <\/li>\n<li>Der Router leitet urspr\u00fcnglich alle Anfragen an einen der Server weiter (<b>blau<\/b>). <\/li>\n<li>In dem Moment, in dem ein neuer Release durchgef\u00fchrt werden muss, wird das gesamte Projekt auf dem anderen Server aktualisiert (<b>alpha<\/b>), der momentan keine Anfragen verarbeitet. <\/li>\n<li>Nachdem der Code auf <b>dem blauen<\/b> Server vollst\u00e4ndig aktualisiert ist, erh\u00e4lt der Router den Befehl, auf <b>den gr\u00fcnen<\/b> auf <b>alpha<\/b> Server. <\/li>\n<li>Jetzt sehen alle Kunden das Ergebnis des Codes von <b>dem blauen<\/b> Server an. <\/li>\n<li> F\u00fcr eine gewisse Zeit dient <b>blau<\/b> der Server als Backup f\u00fcr den Fall, dass das Deployment auf <b>alpha<\/b> den Server fehlschl\u00e4gt, und im Falle von Fehlern schaltet der Router den Benutzerstrom zur\u00fcck auf <b>blau<\/b> den Server mit der alten stabilen Version, und der neue Code wird zur \u00dcberarbeitung und Testung geschickt.<\/li>\n<li>Und am Ende des Prozesses wird ebenso der <b>blau<\/b> gr\u00fcne Server aktualisiert. Und nach seiner Aktualisierung schaltet der Router den Benutzerstrom wieder auf <b>blau<\/b> Server.<\/li>\n<\/ul>\n<p>\nDas sieht alles sehr gut aus und auf den ersten Blick sollte es dabei keine Probleme geben.<br \/>\nAber da wir in der modernen Welt leben, ist die Option mit der physischen Umschaltung, wie im klassischen Schema angegeben, f\u00fcr uns nicht geeignet. Merken Sie sich die Informationen vor, wir kommen sp\u00e4ter darauf zur\u00fcck.<\/p>\n<h3>Schlechte und gute Ratschl\u00e4ge<\/h3>\n<p>\n<i>Haftungsausschluss<\/i>: In den folgenden Beispielen sind die von mir verwendeten Tools \/ Methoden aufgef\u00fchrt, Sie k\u00f6nnen absolut beliebige Alternativen mit \u00e4hnlichen Funktionen verwenden. <\/p>\n<p>Der Gro\u00dfteil der Beispiele wird mehr oder weniger mit Webentwicklung (\u00dcberraschung!) sowie PHP und Docker \u00fcberschneiden.<\/p>\n<p>In den folgenden Punkten finden Sie eine einfache praktische Beschreibung der Verwendung von Faktoren anhand bestimmter Beispiele. Wenn Sie mehr Theorie zu diesem Thema w\u00fcnschen, wenden Sie sich \u00fcber die obigen Links an die Hauptquelle. <\/p>\n<h4>1. Codebasis<\/h4>\n<p>\nVerwenden Sie FTP und FileZilla, um Dateien einzeln auf die Server hochzuladen, speichern Sie den Code nirgendwo au\u00dfer auf dem Produktionsserver.<\/p>\n<p>Im Projekt sollte immer eine einheitliche Codebasis vorhanden sein, das hei\u00dft, der gesamte Code stammt aus einer Quelle. <b>Git<\/b> Repository. Die Server (Produktion, Staging, Test1, Test2 ...) verwenden Code aus den Zweigen eines gemeinsamen Repositories. Somit erreichen wir Konsistenz im Code.<\/p>\n<h4>2. Abh\u00e4ngigkeiten<\/h4>\n<p>\nLaden Sie alle Bibliotheken als Ordner direkt in das Stammverzeichnis des Projekts herunter. Aktualisierungen erfolgen einfach durch das Verschieben des neuen Codes in den Ordner der aktuellen Bibliotheksversion. Installieren Sie alle erforderlichen Utilities direkt auf dem Host-Server, wo noch 20 Dienste laufen.<\/p>\n<p>Das Projekt sollte immer eine klar verst\u00e4ndliche Liste von Abh\u00e4ngigkeiten haben (unter Abh\u00e4ngigkeiten verstehe ich auch die Umgebung). Alle Abh\u00e4ngigkeiten m\u00fcssen eindeutig definiert und isoliert sein. <br \/>\nNehmen wir als Beispiel <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 gibt die M\u00f6glichkeit, Versionen streng oder nicht streng anzugeben und klar zu definieren. Auf dem Server k\u00f6nnen 20 verschiedene Projekte existieren, und jedes hat eine pers\u00f6nliche Liste von Paketen und Bibliotheken, die unabh\u00e4ngig voneinander sind.<\/p>\n<p><b>Docker<\/b> \u2014 ein Tool, das es erm\u00f6glicht, die Umgebung zu definieren und zu isolieren, in der die Anwendung ausgef\u00fchrt wird. Ebenso wie bei Composer k\u00f6nnen wir hier jedoch umfassender definieren, mit was die Anwendung arbeitet. Eine bestimmte PHP-Version ausw\u00e4hlen, nur die f\u00fcr das Projekt erforderlichen Pakete installieren, ohne etwas \u00dcberfl\u00fcssiges hinzuzuf\u00fcgen. Und das Wichtigste \u2013 ohne \u00dcberschneidung mit Paketen und der Umgebung der Hostmaschine und anderer Projekte. Das hei\u00dft, alle Projekte auf dem Server, die \u00fcber Docker arbeiten, k\u00f6nnen absolut jede Paket-Anzahl und v\u00f6llig unterschiedliche Umgebungen verwenden.<\/p>\n<h4>3. Konfiguration<\/h4>\n<p>\nBewahren Sie Konfigurationen als Konstanten direkt im Code auf. Einzelne Konstanten f\u00fcr den Testserver, separate f\u00fcr die Produktion. Binden Sie die Funktionalit\u00e4t der Anwendung abh\u00e4ngig von der Umgebung direkt in die Gesch\u00e4ftslogik 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 bedeutet, dass selbst wenn Sie mehrere Konfigurationsdateien .config.prod .config.local speichern und diese beim Deployment in .config umbenennen (die Hauptkonfiguration, aus der die Anwendung Daten liest) \u2014 dies nicht der richtige Ansatz ist, 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 w\u00fcrden. Alle Konfigurationen sollten direkt im Bereitstellungssystem (CI\/CD) gespeichert und f\u00fcr verschiedene Umgebungen mit den spezifischen 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, verwenden Sie unterschiedliche Verbindungen f\u00fcr dieselben Dienste in bestimmten Umgebungen.<\/p>\n<p>Tats\u00e4chlich \u00fcberschneidet sich dieser Punkt stark mit dem Punkt zu den Konfigurationen, denn ohne diesen Punkt lassen sich keine ordentlichen Konfigurationsdaten erstellen und die M\u00f6glichkeit zur Konfiguration w\u00fcrde vollst\u00e4ndig verloren gehen.<\/p>\n<p>Alle Verbindungen zu externen Diensten, wie Warteschserversysteme, Datenbanken, Caching-Dienste, sollten sowohl f\u00fcr die lokale Umgebung als auch f\u00fcr die externe \/ Produktionsumgebung einheitlich sein. Mit anderen Worten, ich kann jederzeit die Verbindungszeichenfolge \u00e4ndern und den Zugriff auf Datenbank #1 durch Datenbank #2 ersetzen, ohne den Anwendungscode zu \u00e4ndern. Oder um vorzugreifen, als Beispiel ist es so, dass Sie beim Skalieren des Dienstes f\u00fcr einen zus\u00e4tzlichen Cache-Server nicht auf besondere Weise eine Verbindung angeben m\u00fcssen.<\/p>\n<h4>5. Build, Release, Execute<\/h4>\n<p>\nHalten Sie auf dem Server nur die endg\u00fcltige Version des Codes, ohne M\u00f6glichkeit, das Release zur\u00fcckzusetzen. Es ist nicht n\u00f6tig, Speicherplatz zu verschwenden. Wer denkt, er k\u00f6nnte fehlerhaften Code in die Produktion bringen, ist ein schlechter Programmierer!<\/p>\n<p>Alle Phasen des Deployments sollten voneinander getrennt sein.<\/p>\n<p>Haben Sie die M\u00f6glichkeit, zur\u00fcckzukehren. Machen Sie Releases mit der Sicherung der alten Anwendungs-Kopien (bereits gebaut und kampfbereit), sodass Sie im Falle von Fehlern auf die alte Version zur\u00fcckgreifen k\u00f6nnen. Das bedeutet, es gibt bedingt einen Ordner <i>releases<\/i> und einen Ordner <i>\u2013 Strom<\/i>, und nach einem erfolgreichen Deployment und Build wird der Ordner <i>\u2013 Strom<\/i> \u00fcber einen symbolischen Link mit dem neuen Release verbunden, das sich innerhalb von <i>releases<\/i> mit einer bedingten Bezeichnung der Release-Nummer. <\/p>\n<p>Hier denken wir an Blue-Green Deployment, das nicht nur den Wechsel zwischen Code erm\u00f6glicht, sondern auch den Wechsel zwischen allen Ressourcen und sogar Umgebungen mit der M\u00f6glichkeit, alles zur\u00fcckzusetzen.<\/p>\n<h4>6. Prozesse<\/h4>\n<p>\nSpeichern Sie Anwendungsstatusdaten direkt in der Anwendung selbst. Nutzen Sie die Sessions im Arbeitsspeicher der Anwendung. Verwenden Sie so viele zwischen externen Diensten gemeinsame Ressourcen wie m\u00f6glich. Stellen Sie sicher, dass die Anwendung nur einen Prozess haben kann und verhindern Sie die M\u00f6glichkeit der Skalierung.<\/p>\n<p>Bez\u00fcglich der Sessions speichern Sie Daten nur im Cache, der von externen Diensten kontrolliert wird (memcached, redis), sodass selbst wenn Sie 20 Anwendungsprozesse gleichzeitig ausf\u00fchren, jeder von ihnen, der auf den Cache zugreift, mit dem Kunden im gleichen Zustand fortfahren kann, in dem der Benutzer in einem anderen Prozess mit der Anwendung gearbeitet hat. Mit diesem Ansatz gilt, dass egal wie viele Kopien von externen Diensten Sie verwenden, alles reibungslos funktioniert, ohne Probleme beim Datenzugriff.<\/p>\n<h4>7. Portbindung<\/h4>\n<p>\nNur der Webserver sollte wissen, wie man mit externen Diensten umgeht. Noch besser ist es, externe Dienste direkt innerhalb des Webservers zu starten. Zum Beispiel als PHP-Modul in Apache.<br \/>\nAlle Ihre Dienste sollten untereinander durch den Zugriff auf eine Adresse und einen Port (localhost:5432, localhost:3000, nginx:80, php-fpm:9000) erreichbar sein, d. h. ich kann aus nginx sowohl auf php-fpm als auch auf postgres zugreifen, und aus php-fpm auf postgres und nginx, und grunds\u00e4tzlich kann jeder Dienst auf jeden anderen Dienst zugreifen. So ist die Lebensf\u00e4higkeit eines Dienstes nicht von der Lebensf\u00e4higkeit eines anderen Dienstes abh\u00e4ngig.<\/p>\n<h4>8. Parallelit\u00e4t<\/h4>\n<p>\nArbeiten Sie mit einem Prozess, denn sonst k\u00f6nnten mehrere Prozesse nicht miteinander auskommen! <\/p>\n<p>Lassen Sie die M\u00f6glichkeit der Skalierung offen. Docker Swarm eignet sich daf\u00fcr hervorragend. <br \/>\nDocker Swarm ist ein Tool zur Erstellung und Verwaltung von Container-Clustern, sowohl \u00fcber verschiedene Maschinen als auch \u00fcber viele Container auf einer einzigen 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 werde. Der interne Load-Balancer, der Daten \u00fcber einen bestimmten Port empf\u00e4ngt, wird diese automatisch auf die Prozesse weiterleiten. Wenn ich also sehe, dass die Serverlast gestiegen ist, kann ich weitere Prozesse hinzuf\u00fcgen, um die Last auf bestimmte Prozesse zu verringern.<\/p>\n<h4>9. Entsorgung (Disposability)<\/h4>\n<p>\nVerwenden Sie keine Warteschlangen f\u00fcr die Arbeit mit Prozessen und Daten. Das Beenden eines Prozesses sollte die gesamte Anwendung beeinflussen. Wenn ein Dienst ausf\u00e4llt, f\u00e4llt alles aus.<\/p>\n<p>Jeder Prozess und Dienst kann jederzeit beendet werden, ohne dass dies andere Dienste beeintr\u00e4chtigt (es geht nicht darum, dass der Dienst nicht mehr verf\u00fcgbar ist, sondern darum, dass ein anderer Dienst nicht zusammen mit diesem abgeschaltet wird). Alle Prozesse sollten sanft beendet werden, sodass beim Beenden keine Daten verloren gehen und das System beim n\u00e4chsten Start korrekt funktioniert. Selbst im Falle eines Notabschaltens sollten keine Daten verloren gehen (hier kommt ein Transaktionsmechanismus ins Spiel, bei dem Datenbankabfragen nur in Gruppen ausgef\u00fchrt werden, und wenn auch nur eine Abfrage aus der Gruppe fehlschl\u00e4gt oder einen Fehler aufweist, wird keine der anderen Abfragen aus der Gruppe tats\u00e4chlich ausgef\u00fchrt).<\/p>\n<h4>10. Gleichstand zwischen Entwicklung\/Betrieb der Anwendung<\/h4>\n<p>\nDie Produktions-, Staging- und lokale Version der Anwendung sollten unterschiedlich sein. In der Produktion verwenden wir das Framework Yii Lite, lokal jedoch Yii, damit es in der Produktion schneller l\u00e4uft!<\/p>\n<p>Tats\u00e4chlich sollten alle Bereitstellungen und die Arbeit mit dem Code in nahezu identischen Umgebungen erfolgen (es geht nicht um die physische Hardware). Auch sollte jede Person in der Entwicklung in der Lage sein, den Code bei Bedarf in der Produktion bereitzustellen, und nicht nur eine speziell ausgebildete DevOps-Abteilung, die nur durch besondere Macht in der Lage ist, die Anwendung in der Produktion zu starten.<\/p>\n<p>Hierbei hilft uns auch Docker. Bei Einhaltung aller vorherigen Punkte wird die Bereitstellung der Umgebung sowohl in der Produktion als auch lokal auf ein oder zwei Befehle reduziert.<\/p>\n<h4>11. Protokollierung (Logs)<\/h4>\n<p>\nWir schreiben Logs in Dateien und Datenbanken! Wir bereinigen Dateien und Datenbanken von Logs nicht. 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 auf stdout ausgegeben oder \u00fcber einen Protokoll wie UDP gesendet werden, damit die Arbeit der Anwendung mit Logs keine Probleme verursacht. Daf\u00fcr eignet sich Graylog gut. Graylog empf\u00e4ngt alle Logs \u00fcber UDP (bei diesem Protokoll ist es nicht notwendig, auf eine Best\u00e4tigung des Empfangs zu warten) und st\u00f6rt die Anwendung in keiner Weise, w\u00e4hrend es sich nur mit der Strukturierung und Verarbeitung von Logs besch\u00e4ftigt. Die Logik der Anwendung \u00e4ndert sich nicht, wenn man solche Ans\u00e4tze verwendet.<\/p>\n<h4>12. Verwaltungsaufgaben<\/h4>\n<p>\nF\u00fcr die Aktualisierung von Daten, der Datenbank usw. verwenden Sie einen separat erstellten Endpunkt in der API, dessen Ausf\u00fchrung zweimal hintereinander dazu f\u00fchren kann, dass Sie doppelte Eintr\u00e4ge erhalten. Aber Sie sind ja nicht dumm, Sie dr\u00fccken nicht zweimal, und Migrationen brauchen wir nicht.<\/p>\n<p>Alle Verwaltungsaufgaben sollten in derselben Umgebung ausgef\u00fchrt werden wie der gesamte Code, auf Ebene der Releases. Das hei\u00dft, wenn wir die Struktur der Datenbank \u00e4ndern m\u00fcssen, werden wir dies nicht manuell tun, indem wir Spaltennamen \u00e4ndern und neue \u00fcber irgendwelche visuellen Datenbankverwaltungstools hinzuf\u00fcgen. F\u00fcr solche Dinge erstellen wir separate Skripte \u2013 Migrationen, die \u00fcberall und in allen Umgebungen gleich ausgef\u00fchrt werden und ein gemeinsames und verst\u00e4ndliches Ergebnis liefern. 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 unter MacOS erstellt. Der Gro\u00dfteil funktioniert auch f\u00fcr Linux. Windows-Nutzer, tut mir leid, aber mit Windows habe ich seit langem nicht mehr gearbeitet.<\/p>\n<p>Stellen wir uns die Situation vor, dass auf unserem PC keine Version von PHP installiert und \u00fcberhaupt nichts vorhanden ist. <br \/>\nWir installieren die neuesten Versionen von Docker und Docker-Compose. (Das kann man im Internet finden.)<\/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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App mit Beispielen in PHP und Docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas Laradock betrifft, so ist es eine gro\u00dfartige Sache, die viele Container und Hilfswerkzeuge zusammenfasst. Aber ich w\u00fcrde nicht empfehlen, Laradock ohne Anpassungen in der Produktion zu verwenden, aufgrund seiner \u00dcberfl\u00fcssigkeit. Es ist besser, eigene Container basierend auf den Beispielen in Laradock zu erstellen, da man so Optimierungsspielraum hat, denn niemand ben\u00f6tigt alles, was dort gleichzeitig vorhanden ist.<\/p>\n<p>2. Wir konfigurieren 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 (der \u00fcbergeordnete Ordner, in den laradock geklont wurde) in einem beliebigen Editor. (In meinem Fall PHPStorm)<\/p>\n<p>An diesem Punkt vergeben wir nur den Projektnamen.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Image workspace. (In Ihrem Fall werden die Images eine Zeit lang gebaut.)<br \/>\nWorkspace ist ein speziell vorbereitetes Image f\u00fcr die Arbeit mit dem Framework aus der Perspektive 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Verzeichnis mit dem Projekt 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Sie zur\u00fcck zu PHPStorm und geben Sie den richtigen Pfad zu unserer Laravel-Anwendung in der Datei .env an.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Sie im Terminal in das Verzeichnis habr und f\u00fchren Sie 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 Sie, ob alles in Ordnung ist. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Verwendung einer visuellen Git-Oberfl\u00e4che, in meinem Fall ist das <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (hier ist der referenzielle Link)<\/p>\n<p>4. Lassen Sie uns starten!<\/p>\n<p>Stellen Sie vor dem Start sicher, dass an 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 Entgegennahme von Anfragen vom Webserver<\/li>\n<li>workspace \u2014 PHP f\u00fcr den Entwickler<\/li>\n<\/ul>\n<p>\nBis jetzt haben wir erreicht, dass wir eine Anwendung geschaffen haben, die den Punkten 1-4 von 12 entspricht, n\u00e4mlich:<\/p>\n<p>1. <b>Codebasis<\/b> \u2014 Der gesamte Code befindet sich 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 application\/composer.json und in jedem Dockerfile jedes Containers angegeben.<\/p>\n<p>3. <b>Externe Dienste (Backing Services)<\/b> \u2014 Jeder Dienst (php-fpm, nginx, workspace) lebt sein eigenes Leben und ist von au\u00dfen verbunden und bei der Arbeit mit einem Dienst wird der andere nicht ber\u00fchrt.<\/p>\n<p>4. <b>Prozesse<\/b> \u2014 Jeder Dienst ist ein Prozess. Jeder Dienst speichert keinen internen Zustand.<\/p>\n<p>5.<b> Portbindung (Port Binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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, l\u00e4uft jeder Dienst auf seinem eigenen Port und ist f\u00fcr alle anderen Dienste zug\u00e4nglich.<\/p>\n<p>6.<b> Parallelit\u00e4t <\/b><\/p>\n<p>Docker erm\u00f6glicht es uns, mehrere Prozesse derselben Dienste mit automatischer Lastverteilung zwischen ihnen zu starten. <\/p>\n<p>Beenden wir die Container und starten wir sie mit dem Flag <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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 in der Arbeit mit diesem Container nichts \u00e4ndern. Wir greifen weiterhin \u00fcber den Port 9000 auf ihn zu, w\u00e4hrend Docker die Last zwischen den Containern reguliert.<\/p>\n<p>7. <b>Entsorgbarkeit (Disposability)<\/b> \u2014 Jeder Container kann ohne Schaden f\u00fcr einen anderen beendet werden. Das Stoppen oder Neustarten eines Containers wirkt sich nicht auf den Betrieb der Anwendung bei sp\u00e4teren Starts aus. Jeder Container kann zudem jederzeit hochgefahren werden.<\/p>\n<p>8. <b>Parit\u00e4t zwischen Entwicklung und Betrieb der Anwendung<\/b> \u2014 Unsere Umgebungen sind identisch. Wenn Sie das System auf einem Server in der Produktion ausf\u00fchren, m\u00fcssen Sie in Ihren Befehlen nichts \u00e4ndern. Alles basiert weiterhin genau auf Docker.<\/p>\n<p>9. <b>Protokollierung (Logs)<\/b> \u2014 Alle Protokolle in diesen Containern laufen auf einen Stream und sind in der Docker-Konsole sichtbar. (In diesem Fall, tats\u00e4chlich, kann es mit 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App mit Beispielen in PHP und Docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAber hier gibt es einen Haken, denn die Standardwerte in PHP und Nginx protokollieren auch in eine Datei. Um den 12-Faktor-Anforderungen gerecht zu werden, ist es notwendig <b>deaktivieren<\/b> die Protokollierung in eine Datei in den Konfigurationen jedes Containers einzeln.<\/p>\n<p>Docker erm\u00f6glicht es auch, Protokolle nicht nur in stdout zu leiten, sondern auch in so etwas wie Graylog, von dem ich oben gesprochen habe. Innerhalb von Graylog k\u00f6nnen wir mit Logdaten nach Belieben operieren, ohne dass unsere Anwendung davon etwas bemerkt.<\/p>\n<p>10. <b>Verwaltungsaufgaben<\/b> \u2014 Alle Verwaltungsaufgaben werden von Laravel dank des Artisan-Werkzeugs genau so gel\u00f6st, wie sich die Sch\u00f6pfer einer 12-Faktor-Anwendung das w\u00fcnschen w\u00fcrden.<\/p>\n<p>Ich zeige als Beispiel, wie einige Befehle ausgef\u00fchrt werden.<br \/>\nWir betreten 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 unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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 verwenden. (Bitte beachten Sie, dass wir die Datenbank und den Cache nicht konfiguriert haben, sodass die H\u00e4lfte der Befehle nicht korrekt ausgef\u00fchrt wird, da sie f\u00fcr die Arbeit mit Cache und DB gedacht sind.)<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungsentwicklung und Blue-Green Deployment unter Ber\u00fccksichtigung der Methodik The Twelve-Factor App 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>Bauen, Freigeben, Ausf\u00fchren<\/b><\/p>\n<p>Ich wollte diesen Teil dem Blue-Green Deployment widmen, aber das stellte sich als zu umfangreich f\u00fcr diesen Artikel heraus. Dar\u00fcber werde ich einen separaten Artikel schreiben. <\/p>\n<p>In K\u00fcrze basiert das Konzept auf CI\/CD-Systemen wie <b>Jenkins<\/b> und <b>Gitlab CI<\/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>Bauen, Freigeben, Ausf\u00fchren<\/b> wird durch in beiden Tools integrierte Funktionen mit dem Namen gel\u00f6st. <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> erlaubt es, den Deployment-Prozess in viele Phasen zu unterteilen, indem er die Phasen von Build, Release und Execution hervorhebt. Auch im Pipeline k\u00f6nnen Sie Backups erstellen und im Allgemeinen alles M\u00f6gliche tun. Dieses Werkzeug hat unendliches 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 beliebigen anderen Tools und Programmiersprachen verwendet werden. Hauptsache, die Grundidee bleibt erhalten.<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 5.0.1.1 - 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\/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) 5.0.1.1\" \/>\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: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\udd47Anwendungsentwicklung und Blue-Green Deployment basierend auf der Methodik der Twelve-Factor App mit Beispielen in PHP und Docker | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}