{"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\/hu\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kezdj\u00fck egy kis elm\u00e9lettel. Mi az <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">A Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nEgyszer\u0171 szavakkal, ez egy dokumentum, amely c\u00e9lja a SaaS alkalmaz\u00e1sok fejleszt\u00e9s\u00e9nek megk\u00f6nny\u00edt\u00e9se, seg\u00edtve a fejleszt\u0151ket \u00e9s DevOps m\u00e9rn\u00f6k\u00f6ket azokon a probl\u00e9m\u00e1kon \u00e9s gyakorlatokon kereszt\u00fcl, amelyek a modern alkalmaz\u00e1sok fejleszt\u00e9se sor\u00e1n a leggyakrabban el\u0151fordulnak. <\/p>\n<p>A dokumentumot a Heroku platform fejleszt\u0151i alak\u00edtott\u00e1k ki.<\/p>\n<p>A tizenk\u00e9t faktor m\u00f3dszertan (The Twelve-Factor App) alkalmazhat\u00f3 b\u00e1rmilyen programoz\u00e1si nyelven \u00edrt alkalmaz\u00e1sokra, \u00e9s b\u00e1rmilyen harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1sokkal (backing services) egy\u00fctt (adatb\u00e1zisok, \u00fczenetk\u00fcld\u0151 sorok, gyors\u00edt\u00f3t\u00e1rak stb.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>R\u00f6viden azokr\u00f3l a faktorr\u00f3l, amelyekre ez a m\u00f3dszertan \u00e9p\u00fcl:<\/h3>\n<p><\/p>\n<ol>\n<li><b>K\u00f3dalap<\/b> \u2013 Egy k\u00f3dalap, amelyet verzi\u00f3kezel\u0151 rendszerben k\u00f6vetnek \u2013 t\u00f6bb telep\u00edt\u00e9s <\/li>\n<li><b>F\u00fcgg\u0151s\u00e9gek<\/b> \u2013 K\u00fcl\u00f6n\u00edtse el vil\u00e1gosan a f\u00fcgg\u0151s\u00e9geket<\/li>\n<li><b>Konfigur\u00e1ci\u00f3<\/b> \u2013 Tartsa fenn a konfigur\u00e1ci\u00f3t a fut\u00e1si k\u00f6rnyezetben<\/li>\n<li><b>Harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1sok (Backing Services)<\/b> \u2013 Tekintse a harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1sokat (backing services) csatolhat\u00f3 er\u0151forr\u00e1soknak<\/li>\n<li><b>\u00d6ssze\u00e1ll\u00edt\u00e1s, kiad\u00e1s, v\u00e9grehajt\u00e1s<\/b> \u2013 Szigor\u00faan v\u00e1lassza el az \u00f6ssze\u00e1ll\u00edt\u00e1si \u00e9s a v\u00e9grehajt\u00e1si l\u00e9p\u00e9seket<\/li>\n<li><b>Folyamatok<\/b> \u2013 Ind\u00edtson el egy alkalmaz\u00e1st egy vagy t\u00f6bb \u00e1llapot n\u00e9lk\u00fcli (stateless) folyamatban <\/li>\n<li><b>Port bindel\u00e9s (Port binding)<\/b> \u2013 Export\u00e1lja a szolg\u00e1ltat\u00e1sokat port bindel\u00e9ssel <\/li>\n<li><b>P\u00e1rhuzamoss\u00e1g<\/b> \u2013 Sk\u00e1l\u00e1zza az alkalmaz\u00e1st folyamatok seg\u00edts\u00e9g\u00e9vel <\/li>\n<li><b>El\u00e9rhet\u0151s\u00e9g (Disposability)<\/b> \u2013 Maximaliz\u00e1lja a megb\u00edzhat\u00f3s\u00e1got gyors ind\u00edt\u00e1ssal \u00e9s helyes le\u00e1ll\u00edt\u00e1ssal <\/li>\n<li><b>Fejleszt\u00e9si\/termel\u00e9si k\u00f6rnyezet parit\u00e1s<\/b> \u2013 Tartsa a fejleszt\u00e9si, staging \u00e9s production k\u00f6rnyezeteket a lehet\u0151 legjobban hasonl\u00f3n <\/li>\n<li><b>Napl\u00f3z\u00e1s (Logs)<\/b> \u2013 Tekintse a napl\u00f3t esem\u00e9nyek \u00e1raml\u00e1s\u00e1nak<\/li>\n<li><b>Adminisztr\u00e1ci\u00f3s feladatok<\/b> \u2013 V\u00e9gezze el az adminisztr\u00e1ci\u00f3s\/m\u0171k\u00f6dtet\u00e9si feladatokat egyszeri folyamatokkal <\/li>\n<\/ol>\n<p>\n<b>Tov\u00e1bbi inform\u00e1ci\u00f3kat a 12 faktorr\u00f3l az al\u00e1bbi forr\u00e1sokb\u00f3l szerezhet:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Hivatalos els\u0151dleges forr\u00e1s<\/a><\/noindex> \u2014 k\u00f6telez\u0151 olvasm\u00e1ny<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Cikk a habr-on. A tizenk\u00e9t faktor alkalmaz\u00e1s \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 hivatalos ford\u00edt\u00e1s<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Cikk a habr-on. A 12-Factor App megk\u00f6zel\u00edt\u00e9s 7 hi\u00e1nyz\u00f3 faktora<\/a><\/noindex> \u2014 friss n\u00e9z\u0151pont a 12 faktorra a t\u00f6k\u00e9letes\u00edt\u00e9s c\u00e9lj\u00e1b\u00f3l.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Mi az a Blue-Green deployment?<\/h3>\n<p>\nA Blue-Green deployment egy m\u00f3dszer az alkalmaz\u00e1s sz\u00e1ll\u00edt\u00e1s\u00e1ra. <b>production<\/b> \u00edgy, hogy a v\u00e9gfelhaszn\u00e1l\u00f3 semmilyen v\u00e1ltoz\u00e1st nem \u00e9szlel. M\u00e1s szavakkal, a nulla downtime-os alkalmaz\u00e1s telep\u00edt\u00e9se <b>le\u00e1ll\u00e1s<\/b>.<\/p>\n<p>A klasszikus BG Deploy sch\u00e9ma az al\u00e1bbi \u00e1br\u00e1n l\u00e1that\u00f3. <\/p>\n<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Kezd\u00e9skor k\u00e9t fizikai szerver van, abszol\u00fat azonos k\u00f3ddal, alkalmaz\u00e1ssal, projekttel, \u00e9s van egy router (terhel\u00e9seloszt\u00f3). <\/li>\n<li>A router eredetileg minden k\u00e9r\u00e9st az egyik szerverre ir\u00e1ny\u00edt (<b>alpha<\/b>). <\/li>\n<li>Amikor \u00fajra el kell v\u00e9gezni a kiad\u00e1st, az eg\u00e9sz projekt friss\u00fcl egy m\u00e1sik szerveren (<b>k\u00e9k<\/b>), amely \u00e9ppen nem dolgozik fel semmilyen k\u00e9r\u00e9st. <\/li>\n<li>Miut\u00e1n a k\u00f3d a <b>k\u00e9k<\/b> szerveren teljesen friss\u00fclt, a router utas\u00edt\u00e1st kap arra, hogy v\u00e1ltson <b>z\u00f6ld<\/b> Gyorsan eml\u00e9kezz\u00fcnk vissza, hogyan m\u0171k\u00f6dik a modul\u00e1ris aritmetika. Az \u00f3ra m\u00e1r egy ismert koncepci\u00f3. Az \u00f3r\u00e1k haszn\u00e1lata <b>k\u00e9k<\/b> szerver figyel. <\/li>\n<li>Most minden \u00fcgyf\u00e9l l\u00e1tja a k\u00f3d m\u0171k\u00f6d\u00e9s\u00e9nek eredm\u00e9ny\u00e9t a <b>k\u00e9k<\/b> szervereket. <\/li>\n<li> Egy ideig a <b>alpha<\/b> szerver tartal\u00e9k\u00e9nt szolg\u00e1l egy rossz telep\u00edt\u00e9s eset\u00e9re a <b>k\u00e9k<\/b> szerverre, \u00e9s ha hiba mer\u00fcl fel, a router visszakapcsolja a felhaszn\u00e1l\u00f3i forgalmat a <b>alpha<\/b> r\u00e9gi stabil verzi\u00f3val rendelkez\u0151 szerverre, a \u00faj k\u00f3dot pedig jav\u00edt\u00e1sra \u00e9s tesztel\u00e9sre k\u00fcldj\u00fck.<\/li>\n<li>A folyamat v\u00e9g\u00e9n a <b>alpha<\/b> szerver is hasonl\u00f3an friss\u00fcl. \u00c9s miut\u00e1n ez friss\u00fclt, a router visszakapcsolja a k\u00e9r\u00e9sek \u00e1r\u00e1t a <b>alpha<\/b> szerver figyel.<\/li>\n<\/ul>\n<p>\nEz nagyon j\u00f3l n\u00e9z ki, \u00e9s els\u0151 pillant\u00e1sra nem kellene, hogy legyen vele probl\u00e9ma.<br \/>\nDe mivel a modern vil\u00e1gban \u00e9l\u00fcnk, a klasszikus s\u00e9m\u00e1ban eml\u00edtett fizikai v\u00e1lt\u00e1s nem megfelel\u0151 sz\u00e1munkra. Az inform\u00e1ci\u00f3t addig \u0151rizz\u00fck meg, k\u00e9s\u0151bb visszat\u00e9r\u00fcnk r\u00e1.<\/p>\n<h3>Rosszul \u00e9s j\u00f3l megfogalmazott tan\u00e1csok<\/h3>\n<p>\n<i>Megjegyz\u00e9s<\/i>: Az al\u00e1bbi p\u00e9ld\u00e1kban azokat az eszk\u00f6z\u00f6ket\/m\u00f3dszereket sorolom fel, amelyeket \u00e9n haszn\u00e1lok, \u00d6n pedig b\u00e1rmilyen hasonl\u00f3 funkci\u00f3val rendelkez\u0151 alternat\u00edv\u00e1t haszn\u00e1lhat. <\/p>\n<p>A legt\u00f6bb p\u00e9lda valamilyen m\u00f3don a webfejleszt\u00e9ssel (micsoda meglepet\u00e9s), PHP-val \u00e9s Dockerrel fog foglalkozni.<\/p>\n<p>Az al\u00e1bbi pontokban egyszer\u0171 gyakorlati le\u00edr\u00e1s tal\u00e1lhat\u00f3 bizonyos p\u00e9ld\u00e1k felhaszn\u00e1l\u00e1s\u00e1val, ha \u00d6n t\u00f6bblet elm\u00e9letet szeretne err\u0151l a t\u00e9m\u00e1r\u00f3l, forduljon a fenti hivatkoz\u00e1sokhoz az eredeti forr\u00e1shoz. <\/p>\n<h4>1. K\u00f3dalap<\/h4>\n<p>\nHaszn\u00e1ljon FTP-t \u00e9s FileZill\u00e1t, f\u00e1jlokat felt\u00f6ltve a szerverre egyes\u00e9vel, ne t\u00e1roljon k\u00f3dot sehol, csak a production szerveren.<\/p>\n<p>A projektben mindig egys\u00e9ges k\u00f3dalapnak kell lennie, azaz az \u00f6sszes k\u00f3d egy forr\u00e1sb\u00f3l sz\u00e1rmazik. <b>Kont\u00e9neriz\u00e1l\u00e1s<\/b> A t\u00e1rol\u00f3k. A szerverek (production, staging, test1, test2 &#8230;) egy k\u00f6z\u00f6s t\u00e1rol\u00f3 \u00e1gain l\u00e9v\u0151 k\u00f3dot haszn\u00e1lnak. \u00cdgy \u00e9rj\u00fck el a k\u00f3d konzisztenci\u00e1j\u00e1t.<\/p>\n<h4>2. F\u00fcgg\u0151s\u00e9gek<\/h4>\n<p>\nT\u00f6ltsd le az \u00f6sszes k\u00f6nyvt\u00e1rat k\u00f6zvetlen\u00fcl a projekt gy\u00f6k\u00e9rk\u00f6nyvt\u00e1r\u00e1ba. A friss\u00edt\u00e9seket egyszer\u0171en \u00faj k\u00f3d \u00e1tmozgat\u00e1s\u00e1val v\u00e9gezd a k\u00f6nyvt\u00e1r aktu\u00e1lis verzi\u00f3j\u00e1ba. Az \u00f6sszes sz\u00fcks\u00e9ges seg\u00e9dprogramot telep\u00edtsd k\u00f6zvetlen\u00fcl arra a hosztszerverre, ahol m\u00e1r 20 szolg\u00e1ltat\u00e1s fut.<\/p>\n<p>A projektnek mindig \u00e9rthet\u0151 f\u00fcgg\u0151s\u00e9gi list\u00e1val kell rendelkeznie (a f\u00fcgg\u0151s\u00e9gek alatt a k\u00f6rnyezetet is \u00e9rtem). Minden f\u00fcgg\u0151s\u00e9get vil\u00e1gosan kell defini\u00e1lni \u00e9s elk\u00fcl\u00f6n\u00edteni. <br \/>\nP\u00e9ldak\u00e9nt vegy\u00fck <b>Composer<\/b> \u00e9s <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 egy csomagkezel\u0151t, amely lehet\u0151v\u00e9 teszi PHP k\u00f6nyvt\u00e1rak telep\u00edt\u00e9s\u00e9t. A Composer lehet\u0151v\u00e9 teszi a verzi\u00f3k szigor\u00fa vagy nem szigor\u00fa meghat\u00e1roz\u00e1s\u00e1t, \u00e9s azok egy\u00e9rtelm\u0171 defini\u00e1l\u00e1s\u00e1t. A szerveren 20 k\u00fcl\u00f6nb\u00f6z\u0151 projekt lehet, mindegyik saj\u00e1t csomag- \u00e9s k\u00f6nyvt\u00e1rlist\u00e1val, amely nem f\u00fcgg a t\u00f6bbiekt\u0151l.<\/p>\n<p><b>Docker<\/b> \u2014 egy seg\u00e9dprogram, amely lehet\u0151v\u00e9 teszi a k\u00f6rnyezet meghat\u00e1roz\u00e1s\u00e1t \u00e9s izol\u00e1l\u00e1s\u00e1t, ahol az alkalmaz\u00e1s fog m\u0171k\u00f6dni. \u00cdgy, ak\u00e1rcsak a composer eset\u00e9ben, de m\u00e1r alaposabban, meghat\u00e1rozhatjuk, hogy mivel dolgozik az alkalmaz\u00e1s. Kiv\u00e1laszthatjuk a megfelel\u0151 PHP verzi\u00f3t, telep\u00edthetj\u00fck csak a projekt m\u0171k\u00f6d\u00e9s\u00e9hez sz\u00fcks\u00e9ges csomagokat, an\u00e9lk\u00fcl, hogy b\u00e1rmi felesleges ker\u00fclj\u00f6n be. A legfontosabb, hogy ne \u00e9rintkezz\u00fcnk a hosztszerver \u00e9s m\u00e1s projektek csomagjaival \u00e9s k\u00f6rnyezet\u00e9vel. Teh\u00e1t az \u00f6sszes Docker-en fut\u00f3 projekt a szerveren b\u00e1rmilyen csomagk\u00e9szletet \u00e9s teljesen elt\u00e9r\u0151 k\u00f6rnyezetet haszn\u00e1lhat.<\/p>\n<h4>3. Konfigur\u00e1ci\u00f3<\/h4>\n<p>\nA konfigur\u00e1ci\u00f3kat t\u00e1rolja konstansokk\u00e9nt k\u00f6zvetlen\u00fcl a k\u00f3dban. K\u00fcl\u00f6n konstansok a tesztszerver sz\u00e1m\u00e1ra, k\u00fcl\u00f6n a produkci\u00f3hoz. K\u00f6sse \u00f6ssze az alkalmaz\u00e1s m\u0171k\u00f6d\u00e9s\u00e9t a k\u00f6rnyezett\u0151l f\u00fcgg\u0151en k\u00f6zvetlen\u00fcl a projekt \u00fczleti logik\u00e1j\u00e1ban, if else konstrukci\u00f3t haszn\u00e1lva.<\/p>\n<p><b>Konfigur\u00e1ci\u00f3k<\/b> \u2014 ez az egyetlen dolog, amivel a projekt telep\u00edt\u00e9sei (deployment) k\u00fcl\u00f6nb\u00f6znek. Ide\u00e1lisan a konfigur\u00e1ci\u00f3knak k\u00f6rnyezeti v\u00e1ltoz\u00f3kon (env vars) kereszt\u00fcl kellene \u00e9rkezni\u00fck. <\/p>\n<p>Teh\u00e1t m\u00e9g ha t\u00f6bb konfigur\u00e1ci\u00f3s f\u00e1jlt is t\u00e1rol, mint p\u00e9ld\u00e1ul .config.prod, .config.local, \u00e9s ezeket \u00e1tnevezi a telep\u00edt\u00e9s pillanat\u00e1ban .config-ra (aminek alap\u00e9rtelmezett konfigur\u00e1ci\u00f3, amelyb\u0151l az alkalmaz\u00e1s olvassa az adatokat) - ez nem lesz helyes megk\u00f6zel\u00edt\u00e9s, mert ebben az esetben a konfigur\u00e1ci\u00f3s inform\u00e1ci\u00f3k minden fejleszt\u0151 sz\u00e1m\u00e1ra hozz\u00e1f\u00e9rhet\u0151k lesznek, \u00e9s a produkci\u00f3s szerver adatai vesz\u00e9lybe ker\u00fclnek. Minden konfigur\u00e1ci\u00f3nak k\u00f6zvetlen\u00fcl a telep\u00edt\u00e9si rendszerben (CI\/CD) kell t\u00e1rol\u00f3dnia, \u00e9s a telep\u00edt\u00e9s pillanat\u00e1ban, az adott k\u00f6rnyezethez sz\u00fcks\u00e9ges k\u00fcl\u00f6nb\u00f6z\u0151 \u00e9rt\u00e9kekkel kell gener\u00e1lni.<\/p>\n<h4>4. Harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1sok (Backing Services)<\/h4>\n<p>\nSzorosan k\u00f6ss\u00f6n az k\u00f6rnyezethez, haszn\u00e1ljon k\u00fcl\u00f6nb\u00f6z\u0151 kapcsolatokat ugyanazon szolg\u00e1ltat\u00e1sokhoz k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6rnyezetekben.<\/p>\n<p>Val\u00f3j\u00e1ban ez a pont er\u0151sen \u00e1tfedi az el\u0151z\u0151 ponttal a konfigur\u00e1ci\u00f3kr\u00f3l, mivel en\u00e9lk\u00fcl nem lehet megfelel\u0151 konfigur\u00e1ci\u00f3s adatokat l\u00e9trehozni, \u00e9s az eg\u00e9sz konfigur\u00e1l\u00e1si lehet\u0151s\u00e9g meghi\u00fasul.<\/p>\n<p>Minden kapcsolat a k\u00fcls\u0151 szolg\u00e1ltat\u00e1sokkal, mint p\u00e9ld\u00e1ul a sorok szerverei, adatb\u00e1zisok, gyors\u00edt\u00f3t\u00e1r-szolg\u00e1ltat\u00e1sok, ugyanazok legyenek mind a helyi, mind a k\u00fcls\u0151 \/ produkci\u00f3s k\u00f6rnyezetben. M\u00e1s szavakkal, b\u00e1rmikor megv\u00e1ltoztathatom a kapcsolat sztringet, hogy az #1 adatb\u00e1zis helyett a #2 adatb\u00e1zisra hivatkozzon, an\u00e9lk\u00fcl, hogy az alkalmaz\u00e1s k\u00f3dj\u00e1t meg kellene v\u00e1ltoztatni. Vagy el\u0151reugorva, p\u00e9ld\u00e1ul ha a szolg\u00e1ltat\u00e1st sk\u00e1l\u00e1zza, nem kell k\u00fcl\u00f6nleges m\u00f3don megadnia a csatlakoz\u00e1st egy extra gyors\u00edt\u00f3t\u00e1r-szerverhez.<\/p>\n<h4>5. \u00d6ssze\u00e1ll\u00edt\u00e1s, kiad\u00e1s, v\u00e9grehajt\u00e1s<\/h4>\n<p>\nCsak a k\u00e9sz k\u00f3d v\u00e9gleges verzi\u00f3j\u00e1t t\u00e1rolja a szerveren, an\u00e9lk\u00fcl, hogy vissza lehetne \u00e1ll\u00edtani a kiad\u00e1st. Ne t\u00f6ltse ki a lemezter\u00fcletet. Aki azt gondolja, hogy hib\u00e1s k\u00f3dot vihet a produkci\u00f3ba, az rossz programoz\u00f3!<\/p>\n<p>Minden telep\u00edt\u00e9si szakasznak k\u00fcl\u00f6n kell lennie.<\/p>\n<p>Legyen lehet\u0151s\u00e9ge visszal\u00e9pni. K\u00e9sz\u00edtsen kiad\u00e1sokat \u00fagy, hogy gyorsan hozz\u00e1f\u00e9rhet\u0151 r\u00e9gi m\u00e1solatai legyenek az alkalmaz\u00e1snak (m\u00e1r \u00f6sszeszerelt \u00e9s harcra k\u00e9sz), hogy hiba eset\u00e9n vissza tudja \u00e1ll\u00edtani a r\u00e9gi verzi\u00f3t. Teh\u00e1t van egy mapp\u00e1ja, <i>releases<\/i> \u00e9s egy mappa, <i>\u2013 \u00e1ram<\/i>, \u00e9s a sikeres telep\u00edt\u00e9s \u00e9s \u00f6ssze\u00e1ll\u00edt\u00e1s ut\u00e1n a mappa <i>\u2013 \u00e1ram<\/i> szimbolikus hivatkoz\u00e1ssal kapcsol\u00f3dik az \u00faj kiad\u00e1shoz, amely bel\u00fcl tal\u00e1lhat\u00f3. <i>releases<\/i> egy felt\u00e9telezett kiad\u00e1si sz\u00e1m. <\/p>\n<p>Itt j\u00f6n sz\u00f3ba a Blue-Green deploy, amely nemcsak a k\u00f3dok k\u00f6z\u00f6tti v\u00e1lt\u00e1st, hanem az \u00f6sszes er\u0151forr\u00e1s \u00e9s k\u00f6rnyezet k\u00f6z\u00f6tti v\u00e1lt\u00e1st is lehet\u0151v\u00e9 teszi, lehet\u0151s\u00e9get adva arra, hogy mindent visszaford\u00edtsunk.<\/p>\n<h4>6. Folyamatok<\/h4>\n<p>\nTartsa az alkalmaz\u00e1s \u00e1llapotainak adatait mag\u00e1ban az alkalmaz\u00e1sban. Haszn\u00e1lja a mem\u00f3ria alap\u00fa munkameneteket. Haszn\u00e1ljon min\u00e9l t\u00f6bb, harmadik felek \u00e1ltal megosztott er\u0151forr\u00e1st. Legyenek az alkalmaz\u00e1snak csak egyszeri folyamatai, \u00e9s ne engedje meg a sk\u00e1l\u00e1z\u00e1st.<\/p>\n<p>A munkamenetekhez t\u00e1rolja az adatokat csak a harmadik felek \u00e1ltal ellen\u0151rz\u00f6tt gyors\u00edt\u00f3t\u00e1rban (memcached, redis), \u00edgy m\u00e9g ha 20 alkalmaz\u00e1sfolyamat is m\u0171k\u00f6dik, b\u00e1rmelyik k\u00e9pes a gyors\u00edt\u00f3t\u00e1r el\u00e9r\u00e9s\u00e9vel folytatni a munk\u00e1t az \u00fcgyf\u00e9llel abban az \u00e1llapotban, amelyben a felhaszn\u00e1l\u00f3 a m\u00e1sik folyamatban dolgozott. Ilyen megk\u00f6zel\u00edt\u00e9ssel, b\u00e1rmennyi harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1st is haszn\u00e1ljon, minden sim\u00e1n \u00e9s probl\u00e9mamentesen fog m\u0171k\u00f6dni az adatok el\u00e9r\u00e9s\u00e9vel.<\/p>\n<h4>7. Portk\u00f6t\u00e9s (Port binding)<\/h4>\n<p>\nCsak a webszervernek kell tudnia, hogyan m\u0171k\u00f6dj\u00f6n egy\u00fctt a harmadik felekkel. A legjobb, ha a harmadik felek szolg\u00e1ltat\u00e1sait k\u00f6zvetlen\u00fcl a webszerveren bel\u00fcl ind\u00edtja el. P\u00e9ld\u00e1ul PHP modul form\u00e1j\u00e1ban az Apache-ban.<br \/>\nMinden szolg\u00e1ltat\u00e1snak el\u00e9rhet\u0151nek kell lennie egym\u00e1s sz\u00e1m\u00e1ra valamilyen c\u00edm \u00e9s port el\u00e9r\u00e9s\u00e9n kereszt\u00fcl (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), azaz az nginx-b\u0151l el\u00e9rhetem a php-fpm-t \u00e9s a postgres-t is, a php-fpm-b\u0151l a postgres-t \u00e9s az nginx-et, \u00e9s tulajdonk\u00e9ppen minden szolg\u00e1ltat\u00e1sb\u00f3l el\u00e9rhetem a m\u00e1sikat. \u00cdgy a szolg\u00e1ltat\u00e1s \u00e9leterej\u00e9nek nem kell m\u00e1s szolg\u00e1ltat\u00e1s \u00e9leterej\u00e9hez k\u00f6t\u0151dnie.<\/p>\n<h4>8. P\u00e1rhuzamoss\u00e1g<\/h4>\n<p>\nDolgozzon egyetlen folyamattal, mert ha t\u00f6bb folyamat egy\u00fctt nem tud egy\u00fcttm\u0171k\u00f6dni! <\/p>\n<p>Hagyjon lehet\u0151s\u00e9get a sk\u00e1l\u00e1z\u00e1sra. Erre t\u00f6k\u00e9letes megold\u00e1s a Docker Swarm. <br \/>\nA Docker Swarm egy eszk\u00f6z a kont\u00e9ner klaszterek l\u00e9trehoz\u00e1s\u00e1ra \u00e9s kezel\u00e9s\u00e9re, ak\u00e1r k\u00fcl\u00f6nb\u00f6z\u0151 g\u00e9pek k\u00f6z\u00f6tt, ak\u00e1r sok kont\u00e9ner egy g\u00e9pen.<\/p>\n<p>A swarm allows me to determine how many resources I will allocate to each process and how many instances of the same service I will run. The internal load balancer, receiving data on a designated port, will automatically proxy it to the processes. Thus, seeing that the server load has increased, I can add more processes, thereby reducing the load on specific processes.<\/p>\n<h4>9. Eldobhat\u00f3s\u00e1g (Disposability)<\/h4>\n<p>\nNe haszn\u00e1lj sorokat a folyamatokkal \u00e9s adatokkal val\u00f3 munk\u00e1hoz. Egy folyamat meg\u00f6l\u00e9s\u00e9nek hat\u00e1ssal kell lennie az eg\u00e9sz alkalmaz\u00e1s m\u0171k\u00f6d\u00e9s\u00e9re. Ha egy szolg\u00e1ltat\u00e1s le\u00e1llt, minden le\u00e1ll.<\/p>\n<p>Minden folyamat \u00e9s szolg\u00e1ltat\u00e1s b\u00e1rmikor le\u00e1ll\u00edthat\u00f3, \u00e9s ez nem befoly\u00e1solhatja a t\u00f6bbi szolg\u00e1ltat\u00e1st (itt nem arr\u00f3l van sz\u00f3, hogy egy szolg\u00e1ltat\u00e1s nem lesz el\u00e9rhet\u0151 egy m\u00e1sik sz\u00e1m\u00e1ra, hanem arr\u00f3l, hogy a m\u00e1sik szolg\u00e1ltat\u00e1s nem \u00e1ll le ennek k\u00f6vetkezt\u00e9ben). Minden folyamatnak sim\u00e1n kell befejez\u0151dnie, \u00fagy, hogy a befejez\u00e9s\u00fck sor\u00e1n az adatok ne s\u00e9r\u00fcljenek, \u00e9s a k\u00f6vetkez\u0151 ind\u00edt\u00e1skor a rendszer helyesen m\u0171k\u00f6dj\u00f6n. Teh\u00e1t m\u00e9g v\u00e9szhelyzeti le\u00e1ll\u00e1s eset\u00e9n is, az adatoknak nem szabad s\u00e9r\u00fclni\u00fck (ehhez tranzakci\u00f3s mechanizmusok, a DB-hez k\u00fcld\u00f6tt lek\u00e9rdez\u00e9sek csoportokban m\u0171k\u00f6dnek, \u00e9s ha egy csoport b\u00e1rmelyik lek\u00e9rdez\u00e9se nem teljes\u00fclt vagy hib\u00e1val z\u00e1rult, akkor a csoport t\u00f6bbi lek\u00e9rdez\u00e9se sem fog v\u00e9g\u00fcl v\u00e9gbemenni).<\/p>\n<h4>10. Fejleszt\u00e9si\/alkalmaz\u00e1si parit\u00e1s<\/h4>\n<p>\nA termel\u00e9si, staging \u00e9s helyi alkalmaz\u00e1sverzi\u00f3knak k\u00fcl\u00f6nb\u00f6z\u0151nek kell lenni\u00fck. A termel\u00e9sben mi a Yii Lite keretrendszert haszn\u00e1ljuk, helyben pedig a Yii-t, hogy a termel\u00e9si rendszer gyorsabban m\u0171k\u00f6dj\u00f6n!<\/p>\n<p>Val\u00f3j\u00e1ban minden alkalmaz\u00e1s k\u00f3dj\u00e1nak telep\u00edt\u00e9se \u00e9s kezel\u00e9se legal\u00e1bbis azonos k\u00f6rnyezetben kell, hogy t\u00f6rt\u00e9njen (itt nem a fizikai hardverr\u0151l van sz\u00f3). A k\u00f3dot a termel\u00e9sben b\u00e1rmely fejleszt\u0151nek k\u00e9pesnek kell lennie telep\u00edteni, nem pedig valamilyen k\u00fcl\u00f6n\u00f6sen k\u00e9pzett devops csapatnak, amely csak a k\u00fcl\u00f6nleges er\u0151 \u00e1ltal k\u00e9pes elind\u00edtani az alkalmaz\u00e1st a termel\u00e9si k\u00f6rnyezetben.<\/p>\n<p>Ebben is seg\u00edt a Docker. Az \u00f6sszes kor\u00e1bbi pont betart\u00e1sa mellett a Docker haszn\u00e1lata a telep\u00edt\u00e9si folyamatot a production \u00e9s a helyi g\u00e9p k\u00f6z\u00f6tt egy-k\u00e9t parancs be\u00edr\u00e1s\u00e1ra reduk\u00e1lja.<\/p>\n<h4>11. Napl\u00f3z\u00e1s (Logs)<\/h4>\n<p>\nA napl\u00f3kat f\u00e1jlokba \u00e9s adatb\u00e1zisokba \u00edrjuk! A napl\u00f3kat nem tiszt\u00edtjuk a f\u00e1jlokb\u00f3l \u00e9s az adatb\u00e1zisokb\u00f3l. Csak v\u00e1s\u00e1rolunk egy 9000 petab\u00e1jt kapacit\u00e1s\u00fa merevlemezt, \u00e9s k\u00e9sz.<\/p>\n<p>Minden napl\u00f3t esem\u00e9nyfolyamk\u00e9nt kell kezelni. Mag\u00e1nak az alkalmaz\u00e1snak nem szabad napl\u00f3k feldolgoz\u00e1s\u00e1val foglalkoznia. A napl\u00f3kat vagy stdout-ra kell kiadni, vagy olyan protokollon, mint az udp, hogy az alkalmaz\u00e1s sz\u00e1m\u00e1ra a napl\u00f3kkal val\u00f3 munka ne okozzon probl\u00e9m\u00e1t. Erre a graylog j\u00f3l megfelel. A graylog, amely fogadja az \u00f6sszes napl\u00f3t udp-n (ez a protokoll nem ig\u00e9nyel v\u00e1lasz v\u00e1rakoz\u00e1st a csomag sikeres \u00e1tv\u00e9tel\u00e9r\u0151l), semmilyen m\u00f3don nem zavarja az alkalmaz\u00e1st, \u00e9s csak a napl\u00f3k struktur\u00e1l\u00e1s\u00e1val \u00e9s feldolgoz\u00e1s\u00e1val foglalkozik. Az alkalmaz\u00e1s logik\u00e1ja nem v\u00e1ltozik az ilyen megk\u00f6zel\u00edt\u00e9sek eset\u00e9n.<\/p>\n<h4>12. Adminisztr\u00e1ci\u00f3s feladatok<\/h4>\n<p>\nAz adatok, adatb\u00e1zis stb. friss\u00edt\u00e9s\u00e9hez haszn\u00e1ljon k\u00fcl\u00f6n k\u00e9sz\u00edtett v\u00e9gpontot az API-ban, amelynek v\u00e9grehajt\u00e1sa k\u00e9tszer egym\u00e1s ut\u00e1n azt eredm\u00e9nyezi, hogy mindent megdupl\u00e1z. De ti nem vagytok h\u00fcly\u00e9k, nem kattintotok r\u00e1 k\u00e9tszer, \u00e9s a migr\u00e1ci\u00f3k nek\u00fcnk nem kellenek.<\/p>\n<p>Minden adminisztr\u00e1ci\u00f3s feladatot ugyanabban a k\u00f6rnyezetben kell v\u00e9grehajtani, mint az \u00f6sszes k\u00f3d, a kiad\u00e1si szinten. Teh\u00e1t, ha az adatb\u00e1zis szerkezet\u00e9t meg kell v\u00e1ltoztatnunk, akkor nem fogjuk ezt k\u00e9zzel elv\u00e9gezni az oszlopnevek megv\u00e1ltoztat\u00e1s\u00e1val \u00e9s \u00faj oszlopok hozz\u00e1ad\u00e1s\u00e1val valamilyen vizu\u00e1lis adatb\u00e1zis-kezel\u0151 eszk\u00f6zzel. Az ilyen dolgokra k\u00fcl\u00f6n szkripteket \u2014 migr\u00e1ci\u00f3kat \u2014 hozunk l\u00e9tre, amelyek mindenhol \u00e9s minden k\u00f6rnyezetben azonos \u00e9s \u00e1ttekinthet\u0151 eredm\u00e9nyt adnak. Minden egy\u00e9b feladat, p\u00e9ld\u00e1ul a projekt adatainak felt\u00f6lt\u00e9se, hasonl\u00f3 m\u00f3dszereket kell alkalmazni.<\/p>\n<h3>P\u00e9lda megval\u00f3s\u00edt\u00e1s PHP, Laravel, Laradock, Docker-Compose haszn\u00e1lat\u00e1val<\/h3>\n<p>\nP.S Minden p\u00e9lda MacOS-en k\u00e9sz\u00fclt. A legt\u00f6bb Linux alatt is m\u0171k\u00f6dik. Windows felhaszn\u00e1l\u00f3knak eln\u00e9z\u00e9st, de r\u00e9g\u00f3ta nem haszn\u00e1ltam Windows-t.<\/p>\n<p>K\u00e9pzelj\u00fck el, hogy a PC-n semmilyen PHP verzi\u00f3 nincs telep\u00edtve, \u00e9s val\u00f3j\u00e1ban semmi sincs. <br \/>\nTelep\u00edtj\u00fck a leg\u00fajabb docker-t \u00e9s docker-compose-t. (ezt az interneten meg lehet tal\u00e1lni)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Telep\u00edtj\u00fck <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=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA Laradockr\u00f3l azt mondhatom, hogy ez egy nagyon klassz dolog, amelyben nagyon sok kont\u00e9ner \u00e9s seg\u00e9dprogram tal\u00e1lhat\u00f3. De a Laradockot \u00fagy haszn\u00e1lni, ahogy van, production k\u00f6rnyezetben \u2014 nem aj\u00e1nlan\u00e1m a t\u00falzott mivolta miatt. Jobb saj\u00e1t kont\u00e9nereket l\u00e9trehozni a Laradock p\u00e9ld\u00e1i alapj\u00e1n, \u00edgy t\u00f6bbet lehet optimaliz\u00e1lni, mert senkinek sem sz\u00fcks\u00e9ges egyszerre mindaz, ami ott tal\u00e1lhat\u00f3.<\/p>\n<p>2. Konfigur\u00e1ljuk a Laradockot az alkalmaz\u00e1sunk m\u0171k\u00f6d\u00e9s\u00e9hez.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Nyissuk meg a habr k\u00f6nyvt\u00e1rat (a sz\u00fcl\u0151mappa, ahov\u00e1 a laradock kl\u00f3nozva lett) b\u00e1rmilyen szerkeszt\u0151ben. (Az \u00e9n esetemben PHPStorm)<\/p>\n<p>Ebben a l\u00e9p\u00e9sben csak a projekt nev\u00e9t adjuk meg.<\/p>\n<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Ind\u00edtsuk el a workspace k\u00e9pet. (Az \u00d6n eset\u00e9ben a k\u00e9pek egy ideig \u00e9p\u00fclnek majd)<br \/>\nA workspace - ez egy k\u00fcl\u00f6nlegesen el\u0151k\u00e9sz\u00edtett k\u00e9p a keretrendszer fejleszt\u0151i nev\u00e9ben t\u00f6rt\u00e9n\u0151 haszn\u00e1latra.<\/p>\n<p>L\u00e9pj\u00fcnk be a kont\u00e9nerbe a k\u00f6vetkez\u0151 paranccsal: <\/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=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Telep\u00edts\u00fck a Laravel-t<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Telep\u00edt\u00e9s ut\u00e1n ellen\u0151rizz\u00fck, hogy l\u00e9trej\u00f6tt-e a projekt k\u00f6nyvt\u00e1r, majd le\u00e1ll\u00edtjuk a compose-t.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. T\u00e9rj\u00fcnk vissza a PHPStorm-ba, \u00e9s \u00e1ll\u00edtsuk be a megfelel\u0151 utat a laravel alkalmaz\u00e1sunkhoz a .env f\u00e1jlban.<\/p>\n<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Adjunk hozz\u00e1 valamennyi k\u00f3dot a Git-hez.<\/p>\n<p>Ehhez hozzunk l\u00e9tre egy t\u00e1rol\u00f3t a Github-on (vagy m\u00e1shol). Navig\u00e1ljunk a habr k\u00f6nyvt\u00e1rba a termin\u00e1lban, \u00e9s futtassuk a k\u00f6vetkez\u0151 parancsot.<\/p>\n<pre><code class=\"bash\">echo &quot;# habr-12factor&quot; &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m &quot;els\u0151 elk\u00f6telez\u00e9s&quot;\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # itt lesz a link a t\u00e1rol\u00f3dhoz\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nEllen\u0151rizz\u00fck, hogy minden rendben van-e. <\/p>\n<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e9rem, hogy az egyszer\u0171s\u00e9g kedv\u00e9\u00e9rt haszn\u00e1ljon valamilyen vizu\u00e1lis Git interf\u00e9szt, az \u00e9n esetemben ez <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (itt tal\u00e1lhat\u00f3 egy aj\u00e1nl\u00f3 link)<\/p>\n<p>4. Ind\u00edtsuk el!<\/p>\n<p>Ind\u00edt\u00e1s el\u0151tt gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a 80-as \u00e9s 443-as portokon nincs semmi.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cdgy a projekt\u00fcnk 3 k\u00fcl\u00f6n szolg\u00e1ltat\u00e1sb\u00f3l \u00e1ll:<\/p>\n<ul>\n<li>nginx - web szerver<\/li>\n<li>php-fpm - php a web szerverrel val\u00f3 k\u00e9r\u00e9sek megv\u00e1laszol\u00e1s\u00e1ra<\/li>\n<li>workspace - php a fejleszt\u0151 sz\u00e1m\u00e1ra<\/li>\n<\/ul>\n<p>\nJelenleg el\u00e9rt\u00fck, hogy l\u00e9trehoztunk egy alkalmaz\u00e1st, amely m\u00e1r 4 pontnak felel meg a 12 k\u00f6z\u00fcl, nevezetesen:<\/p>\n<p>1. <b>K\u00f3dalap<\/b> \u2014 az \u00f6sszes k\u00f3d egy t\u00e1rol\u00f3ban tal\u00e1lhat\u00f3 (kicsi megjegyz\u00e9s: lehet, hogy helyesebb lenne a dockert a laravel projektbe helyezni, de ez nem alapvet\u0151 k\u00e9rd\u00e9s).<\/p>\n<p>2. <b>F\u00fcgg\u0151s\u00e9gek<\/b> \u2014 Minden f\u00fcgg\u0151s\u00e9g\u00fcnk vil\u00e1gosan fel van t\u00fcntetve az application\/composer.json f\u00e1jlban \u00e9s minden kont\u00e9ner Dockerfile-j\u00e1ban.<\/p>\n<p>3. <b>Harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 szolg\u00e1ltat\u00e1sok (Backing Services)<\/b> \u2014 Minden szolg\u00e1ltat\u00e1s (php-fpm, nginx, workspace) a saj\u00e1t \u00e9let\u00e9t \u00e9li, \u00e9s k\u00edv\u00fclr\u0151l csatlakozik, \u00e9s ha az egyik szolg\u00e1ltat\u00e1ssal dolgozunk, a m\u00e1sik nincs hat\u00e1ssal.<\/p>\n<p>4. <b>Folyamatok<\/b> \u2014 minden szolg\u00e1ltat\u00e1s egy folyamatot jelent. Minden szolg\u00e1ltat\u00e1s nem \u0151riz bels\u0151 \u00e1llapotot.<\/p>\n<p>5.<b> Port bindel\u00e9s (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAhogy l\u00e1tjuk, minden szolg\u00e1ltat\u00e1s a saj\u00e1t portj\u00e1n fut, \u00e9s el\u00e9rhet\u0151 a t\u00f6bbi szolg\u00e1ltat\u00e1s sz\u00e1m\u00e1ra.<\/p>\n<p>6.<b> P\u00e1rhuzamoss\u00e1g <\/b><\/p>\n<p>A Docker lehet\u0151v\u00e9 teszi, hogy t\u00f6bb azonos szolg\u00e1ltat\u00e1s folyamat\u00e1t ind\u00edtsuk el automatikusan terhel\u00e9seloszt\u00e1ssal k\u00f6z\u00f6tt\u00fck. <\/p>\n<p>\u00c1ll\u00edtsuk le a kont\u00e9nereket, \u00e9s ind\u00edtsuk el \u0151ket a z\u00e1szl\u00f3 haszn\u00e1lat\u00e1val <b>&#8212;scale<\/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=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAhogy l\u00e1tjuk, a php-fpm kont\u00e9ner p\u00e9ld\u00e1nyai j\u00f6ttek l\u00e9tre. Ezen a kont\u00e9neren a munk\u00e1nk sor\u00e1n semmit sem kell megv\u00e1ltoztatnunk. Tov\u00e1bbra is a 9000-es porton hivatkozunk r\u00e1, \u00e9s a Docker kezeli vel\u00fcnk a terhel\u00e9st a kont\u00e9nerek k\u00f6z\u00f6tt.<\/p>\n<p>7. <b>El\u00e9rhet\u0151s\u00e9g (Disposability)<\/b> \u2014 minden kont\u00e9nert k\u00fcl\u00f6n-k\u00fcl\u00f6n le lehet \u00e1ll\u00edtani an\u00e9lk\u00fcl, hogy a m\u00e1sikra k\u00e1ros hat\u00e1ssal lenne. A kont\u00e9ner le\u00e1ll\u00edt\u00e1sa vagy \u00fajraind\u00edt\u00e1sa semmilyen hat\u00e1ssal nincs az alkalmaz\u00e1sra a k\u00f6vetkez\u0151 ind\u00edt\u00e1sok sor\u00e1n. Minden kont\u00e9ner b\u00e1rmikor \u00fajraind\u00edthat\u00f3.<\/p>\n<p>8. <b>Fejleszt\u00e9si\/termel\u00e9si k\u00f6rnyezet parit\u00e1s<\/b> \u2014 minden k\u00f6rnyezet\u00fcnk azonos. Ha a rendszert a szerveren \u00e9lesben futtatod, nem lesz sz\u00fcks\u00e9ged semmire az utas\u00edt\u00e1saidban. Minden pontosan \u00fagy fog m\u0171k\u00f6dni, ahogy a Docker alapj\u00e1ul szolg\u00e1l.<\/p>\n<p>9. <b>Napl\u00f3z\u00e1s (Logs)<\/b> \u2014 minden napl\u00f3 a kont\u00e9nerekben folyamatban van, \u00e9s l\u00e1that\u00f3 a Docker konzolban. (ebben az esetben, val\u00f3j\u00e1ban, m\u00e1s h\u00e1zi k\u00e9sz\u00edt\u00e9s\u0171 kont\u00e9nerekkel lehet, hogy ez nem \u00edgy van, ha nem gondoskodsz err\u0151l)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe itt van a b\u00f6kken\u0151, hogy az alap\u00e9rtelmezett \u00e9rt\u00e9kek a PHP-ban \u00e9s az Nginxben is napl\u00f3kat \u00edrnak f\u00e1jlba. A 12 elvnek megfelel\u0151en sz\u00fcks\u00e9ges <b>kikapcsolni<\/b> a napl\u00f3kat k\u00fcl\u00f6n f\u00e1jlokba ir\u00e1ny\u00edtani minden egyes kont\u00e9ner konfigur\u00e1ci\u00f3j\u00e1ban.<\/p>\n<p>A Docker lehet\u0151s\u00e9get ad arra is, hogy a napl\u00f3kat ne csak stdoutra k\u00fcldj\u00fck, hanem olyan dolgokba is, mint a graylog, amir\u0151l m\u00e1r besz\u00e9ltem. A graylogon bel\u00fcl a napl\u00f3kkal szabadon manipul\u00e1lhatunk, \u00e9s az alkalmaz\u00e1sunk ezt \u00e9szre sem veszi.<\/p>\n<p>10. <b>Adminisztr\u00e1ci\u00f3s feladatok<\/b> \u2014 minden adminisztr\u00e1ci\u00f3s feladatot a laravel megold az artisan eszk\u00f6z seg\u00edts\u00e9g\u00e9vel, \u00e9ppen \u00fagy, ahogy a 12 elv\u0171 alkalmaz\u00e1s k\u00e9sz\u00edt\u0151i szerett\u00e9k volna.<\/p>\n<p>P\u00e9ldak\u00e9nt bemutatom, hogyan hajthat\u00f3k v\u00e9gre egyes parancsok.<br \/>\nL\u00e9pj\u00fcnk be a kont\u00e9nerbe.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMost b\u00e1rmilyen parancsot haszn\u00e1lhatunk. (Vegy\u00e9tek figyelembe, hogy nem \u00e1ll\u00edtottuk be az adatb\u00e1zist \u00e9s a gyors\u00edt\u00f3t\u00e1rat, \u00edgy sok parancs nem fog megfelel\u0151en m\u0171k\u00f6dni, mivel azok a gyors\u00edt\u00f3t\u00e1rral \u00e9s az adatb\u00e1zissal val\u00f3 munk\u00e1ra k\u00e9sz\u00fcltek.)<\/p>\n<p><img decoding=\"async\" alt=\"Application development and Blue-Green deployment based on the Twelve-Factor App methodology with examples in php and docker\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigur\u00e1ci\u00f3k<\/b> \u00e9s 12. <b>\u00d6ssze\u00e1ll\u00edt\u00e1s, kiad\u00e1s, v\u00e9grehajt\u00e1s<\/b><\/p>\n<p>Ezt a r\u00e9szt a Blue-Green Deploymentnek szenteltem volna, de ez t\u00fal kiterjedtnek bizonyult ehhez a cikkhez. Err\u0151l k\u00fcl\u00f6n \u00edrok majd egy cikket. <\/p>\n<p>R\u00f6viden, a koncepci\u00f3 CI\/CD rendszereken alapul, mint p\u00e9ld\u00e1ul <b>Jenkins<\/b> \u00e9s <b>Felh\u0151platformok<\/b>. Mindkett\u0151ben lehet k\u00f6rnyezeti v\u00e1ltoz\u00f3kat megadni, amelyek egy adott k\u00f6rnyezettel kapcsolatosak. Ennek megfelel\u0151en ezen a k\u00f6rnyezeti feloszt\u00e1s alapj\u00e1n ker\u00fcl v\u00e9grehajt\u00e1sra a <b>Konfigur\u00e1ci\u00f3k<\/b>.<\/p>\n<p>A r\u00e9sz, ami <b>\u00d6ssze\u00e1ll\u00edt\u00e1s, kiad\u00e1s, v\u00e9grehajt\u00e1s<\/b> megold\u00e1sokat a k\u00e9t eszk\u00f6zbe be\u00e9p\u00edtett funkci\u00f3kkal is kezel. <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> lehet\u0151v\u00e9 teszi, hogy a telep\u00edt\u00e9si folyamatot sok l\u00e9p\u00e9sre bontsuk, kiemelve az \u00e9p\u00edt\u00e9si, kiad\u00e1si \u00e9s v\u00e9grehajt\u00e1si szakaszokat. A Pipelines-ben biztons\u00e1gi ment\u00e9seket is k\u00e9sz\u00edthet, s\u0151t, szinte b\u00e1rmit l\u00e9trehozhat. Ez az eszk\u00f6z korl\u00e1tlan potenci\u00e1llal rendelkezik.<\/p>\n<p>Az alkalmaz\u00e1s k\u00f3dja ezen a helyen tal\u00e1lhat\u00f3 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Githubot<\/a><\/noindex>.<br \/>\nNe feledje inicializ\u00e1lni a submodule-t a repozit\u00f3rium kl\u00f3noz\u00e1sa sor\u00e1n.<\/p>\n<p>P.S.: Ezek a megk\u00f6zel\u00edt\u00e9sek b\u00e1rmilyen m\u00e1s eszk\u00f6zzel \u00e9s programoz\u00e1si nyelvvel haszn\u00e1lhat\u00f3k. A l\u00e9nyeg, hogy a tartalom ne v\u00e1ltozzon.<br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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 Alkalmaz\u00e1sfejleszt\u00e9s \u00e9s Blue-Green telep\u00edt\u00e9s, a The Twelve-Factor App metodol\u00f3gi\u00e1j\u00e1ra \u00e9p\u00edtve, p\u00e9ld\u00e1kkal php \u00e9s docker haszn\u00e1lat\u00e1val | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hu\/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":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}