{"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\/sk\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Na za\u010diatku trochu te\u00f3rie. \u010co je <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Dvan\u00e1s\u0165 faktorov\u00e1 aplik\u00e1cia<\/a><\/noindex>?<\/h3>\n<p>\nJednoducho povedan\u00e9, je to dokument, ktor\u00fd m\u00e1 za cie\u013e zjednodu\u0161i\u0165 v\u00fdvoj SaaS aplik\u00e1ci\u00ed a pom\u00e1ha t\u00fdm, \u017ee informuje v\u00fdvoj\u00e1rov a DevOps in\u017einierov o praktick\u00fdch probl\u00e9moch, ktor\u00e9 sa naj\u010dastej\u0161ie vyskytovali pri v\u00fdvoji modern\u00fdch aplik\u00e1ci\u00ed. <\/p>\n<p>Dokument bol vytvoren\u00fd v\u00fdvoj\u00e1rmi platformy Heroku.<\/p>\n<p>Metodol\u00f3gia dvan\u00e1stich faktorov (The Twelve-Factor App) m\u00f4\u017ee by\u0165 aplikovan\u00e1 na aplik\u00e1cie naprogramovan\u00e9 v akomko\u013evek programovacom jazyku a pou\u017e\u00edvaj\u00face ak\u00e9ko\u013evek kombin\u00e1cie extern\u00fdch slu\u017eieb (backing services) (datab\u00e1zy, posielanie spr\u00e1v, cache pam\u00e4\u0165, at\u010f.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Stru\u010dne o samotn\u00fdch faktoroch, na ktor\u00fdch je t\u00e1to metodol\u00f3gia postaven\u00e1:<\/h3>\n<p><\/p>\n<ol>\n<li><b>K\u00f3dov\u00e1 z\u00e1klad\u0148a<\/b> \u2013 Jeden k\u00f3dov\u00fd z\u00e1klad sledovan\u00fd v syst\u00e9me spr\u00e1vy verzi\u00ed \u2013 mno\u017estvo nasaden\u00ed <\/li>\n<li><b>Z\u00e1vislosti<\/b> \u2013 V\u00fdslovne deklarujte a izolujte z\u00e1vislosti<\/li>\n<li><b>Konfigur\u00e1cia<\/b> \u2013 Ukladajte konfigur\u00e1ciu v runtime prostred\u00ed<\/li>\n<li><b>Extern\u00e9 slu\u017eby (Backing Services)<\/b> \u2013 Pova\u017eujte extern\u00e9 slu\u017eby (backing services) za pripojite\u013en\u00e9 zdroje<\/li>\n<li><b>Zostavenie, uvo\u013enenie, vykonanie<\/b> \u2013 Strikne rozde\u013ete f\u00e1zy zostavenia a vykonania<\/li>\n<li><b>Procesy<\/b> \u2013 Sp\u00fa\u0161\u0165ajte aplik\u00e1ciu ako jeden alebo viacero procesov bez ukladania vn\u00fatorn\u00e9ho stavu (stateless) <\/li>\n<li><b>Zviazanie portov (Port binding)<\/b> \u2013 Exportujte slu\u017eby prostredn\u00edctvom viazania portov <\/li>\n<li><b>Paralelizmus<\/b> \u2013 \u0160k\u00e1lujte aplik\u00e1ciu pomocou procesov <\/li>\n<li><b>Odstr\u00e1nite\u013enos\u0165 (Disposability)<\/b> \u2013 Maxim\u00e1lne zvy\u0161ujte spo\u013eahlivos\u0165 prostredn\u00edctvom r\u00fdchleho spustenia a spr\u00e1vneho ukon\u010denia <\/li>\n<li><b>Parita v\u00fdvoja\/prev\u00e1dzky aplik\u00e1cie<\/b> \u2013 Udr\u017eujte v\u00fdvojov\u00e9, stagingov\u00e9 a produk\u010dn\u00e9 prostredia \u010do najviac podobn\u00e9 <\/li>\n<li><b>Zaznamen\u00e1vanie (Logs)<\/b> \u2013 Pova\u017eujte log za tok udalost\u00ed<\/li>\n<li><b>Administrat\u00edvne \u00falohy<\/b> \u2013 Vykon\u00e1vajte administrat\u00edvne\/manipula\u010dn\u00e9 \u00falohy pomocou jednorazov\u00fdch procesov <\/li>\n<\/ol>\n<p>\n<b>Viac inform\u00e1ci\u00ed o 12 faktoroch m\u00f4\u017eete z\u00edska\u0165 z nasleduj\u00facich zdrojov:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Ofici\u00e1lny prim\u00e1rny zdroj<\/a><\/noindex> \u2014 ur\u010dite na pre\u010d\u00edtanie<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">\u010cl\u00e1nok na habr. Dvan\u00e1s\u0165 faktorov\u00e1 aplik\u00e1cia \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 ofici\u00e1lny preklad<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">\u010cl\u00e1nok na habr. 7 ch\u00fdbaj\u00facich faktorov v pr\u00edstupe 12 Factor App<\/a><\/noindex> \u2014 \u010derstv\u00fd poh\u013ead na 12 faktorov s cie\u013eom ich zdokonali\u0165.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u010co je Blue-Green deployment?<\/h3>\n<p>\nBlue-Green deployment je sp\u00f4sob dodania aplik\u00e1cie na <b>produkciu<\/b> tak, \u017ee koncov\u00fd z\u00e1kazn\u00edk nevid\u00ed \u017eiadne zmeny z jeho strany. In\u00fdmi slovami, nasadenie aplik\u00e1cie s nulov\u00fdm <b>v\u00fdpadkom<\/b>.<\/p>\n<p>Klasick\u00e1 sch\u00e9ma BG Deploy vyzer\u00e1 tak, ako je zn\u00e1zornen\u00e9 na obr\u00e1zku ni\u017e\u0161ie. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Na za\u010diatku s\u00fa 2 fyzick\u00e9 servery s \u00faplne rovnak\u00fdm k\u00f3dom, aplik\u00e1ciou a projektom, a je tu router (vyrovn\u00e1vac\u00ed z\u00e1sobn\u00edk). <\/li>\n<li>Router p\u00f4vodne smeruje v\u0161etky po\u017eiadavky na jeden z serverov (<b>zelen\u00fd<\/b>). <\/li>\n<li>V momente, ke\u010f je potrebn\u00e9 znova urobi\u0165 release, cel\u00fd projekt sa aktualizuje na druhom serveri (<b>modr\u00fd<\/b>), ktor\u00fd v s\u00fa\u010dasnosti nespracov\u00e1va \u017eiadne po\u017eiadavky. <\/li>\n<li>Po tom, \u010do je k\u00f3d na <b>modrom<\/b> serveri \u00faplne aktualizovan\u00fd, router dostane pr\u00edkaz pre prepnutie z <b>zelen\u00e9ho<\/b> na <b>modr\u00fd<\/b> server. <\/li>\n<li>Teraz v\u0161etci z\u00e1kazn\u00edci vidia v\u00fdsledok pr\u00e1ce k\u00f3du z <b>modr\u00e9ho<\/b> servera. <\/li>\n<li> N nejak\u00fd \u010das, <b>zelen\u00fd<\/b> server sl\u00fa\u017ei ako z\u00e1loha v pr\u00edpade zlyhania nasadenia na <b>modr\u00fd<\/b> server a v pr\u00edpade zlyhania a ch\u00fdb router prepne tok pou\u017e\u00edvate\u013eov sp\u00e4\u0165 na <b>zelen\u00fd<\/b> server so starou stabilnou verziou, a nov\u00fd k\u00f3d sa posiela na \u00fapravu a testovanie.<\/li>\n<li>A na konci procesu sa rovnak\u00fdm sp\u00f4sobom aktualizuje <b>zelen\u00fd<\/b> server. A po jeho aktualiz\u00e1cii router prepne tok po\u017eiadaviek sp\u00e4\u0165 na <b>zelen\u00fd<\/b> server.<\/li>\n<\/ul>\n<p>\nVyzer\u00e1 to v\u0161etko ve\u013emi dobre a na prv\u00fd poh\u013ead by s t\u00fdm nemali by\u0165 \u017eiadne probl\u00e9my.<br \/>\nAle preto\u017ee \u017eijeme v modernej dobe, mo\u017enos\u0165 fyzick\u00e9ho prep\u00ednania, ako je zn\u00e1zornen\u00e9 v klasickej sch\u00e9me, n\u00e1m nevyhovuje. Inform\u00e1cie si zatia\u013e zapam\u00e4tajte, nesk\u00f4r sa k nim vr\u00e1time.<\/p>\n<h3>Zl\u00e9 a dobr\u00e9 rady<\/h3>\n<p>\n<i>Upozornenie<\/i>: V pr\u00edkladoch ni\u017e\u0161ie s\u00fa uveden\u00e9 utilitn\u00e9 met\u00f3dy, ktor\u00e9 pou\u017e\u00edvam, m\u00f4\u017ee\u0161 pou\u017ei\u0165 ak\u00e9ko\u013evek alternat\u00edvy s podobn\u00fdmi funkciami. <\/p>\n<p>Ve\u013ek\u00e1 \u010das\u0165 pr\u00edkladov bude tak \u010di onak prekr\u00fdva\u0165 s webov\u00fdm v\u00fdvojom (to je prekvapenie), s PHP a Dockerom.<\/p>\n<p>V bodoch ni\u017e\u0161ie sa nach\u00e1dza jednoduch\u00fd praktick\u00fd popis pou\u017eitia faktorov na ur\u010dit\u00fdch pr\u00edkladoch, ak chce\u0161 viac te\u00f3rie v tejto t\u00e9me, pozri sa na odkazy vy\u0161\u0161ie na p\u00f4vodn\u00fd zdroj. <\/p>\n<h4>1. K\u00f3dov\u00e1 b\u00e1za<\/h4>\n<p>\nPou\u017e\u00edvaj FTP a FileZilla na nahr\u00e1vanie s\u00faborov na servery po jednotliv\u00fdch kusoch, neukladaj k\u00f3d nikde okrem produk\u010dn\u00e9ho servera.<\/p>\n<p>V projekte by v\u017edy mala by\u0165 jednotn\u00e1 k\u00f3dov\u00e1 b\u00e1za, to znamen\u00e1, \u017ee cel\u00fd k\u00f3d poch\u00e1dza z jedn\u00e9ho <b>Git<\/b> repo. Servery (produkcia, staging, test1, test2 ...) pou\u017e\u00edvaj\u00fa k\u00f3d z vetiev jedn\u00e9ho spolo\u010dn\u00e9ho repo. Tak dosahujeme konzistentnos\u0165 k\u00f3du.<\/p>\n<h4>2. Z\u00e1vislosti<\/h4>\n<p>\nS\u0165ahujte v\u0161etky kni\u017enice do prie\u010dinkov priamo do kore\u0148a projektu. Aktualiz\u00e1cie robte jednoducho presunut\u00edm nov\u00e9ho k\u00f3du do prie\u010dinka s aktu\u00e1lnou verziou kni\u017enice. Nain\u0161talujte v\u0161etky potrebn\u00e9 utilitky priamo na hostite\u013esk\u00fd server, kde be\u017e\u00ed e\u0161te 20 slu\u017eieb.<\/p>\n<p>Projekt v\u017edy mus\u00ed ma\u0165 jasn\u00fd a zrozumite\u013en\u00fd zoznam z\u00e1vislost\u00ed (pod z\u00e1vislos\u0165ami ch\u00e1pem aj prostredie). V\u0161etky z\u00e1vislosti musia by\u0165 jasne definovan\u00e9 a izolovan\u00e9. <br \/>\nAko pr\u00edklad vezmeme <b>Composer<\/b> a <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 bal\u00ed\u010dkov\u00fd mana\u017e\u00e9r, ktor\u00fd umo\u017e\u0148uje in\u0161talova\u0165 kni\u017enice v PHP. Composer umo\u017e\u0148uje striktne alebo vo\u013ene ur\u010dova\u0165 verzie a jasne ich definova\u0165. Na serveri m\u00f4\u017ee by\u0165 20 r\u00f4znych projektov a ka\u017ed\u00fd bude ma\u0165 svoj osobn\u00fd zoznam bal\u00edkov a kni\u017en\u00edc, ktor\u00fd nie je z\u00e1visl\u00fd od in\u00e9ho.<\/p>\n<p><b>Docker<\/b> \u2014 utilita, ktor\u00e1 umo\u017e\u0148uje definova\u0165 a izolova\u0165 prostredie, v ktorom bude aplik\u00e1cia pracova\u0165. Tak\u017ee, rovnako ako s Composerom, ale u\u017e podrobnej\u0161ie, m\u00f4\u017eeme definova\u0165, s \u010d\u00edm aplik\u00e1cia pracuje. Vybra\u0165 ur\u010dit\u00fa verziu PHP, nain\u0161talova\u0165 len nevyhnutn\u00e9 bal\u00edky pre projekt, ani\u017e by sme prid\u00e1vali nie\u010do nadbyto\u010dn\u00e9. A najd\u00f4le\u017eitej\u0161ie, aby sme sa nepren\u00e1\u0161ali s bal\u00edkmi a prostred\u00edm hostite\u013esk\u00e9ho stroja a in\u00fdch projektov. To znamen\u00e1, \u017ee v\u0161etky projekty na serveri be\u017eiace cez Docker m\u00f4\u017eu pou\u017e\u00edva\u0165 ak\u00fako\u013evek kombin\u00e1ciu bal\u00edkov a \u00faplne r\u00f4zne prostredie.<\/p>\n<h4>3. Konfigur\u00e1cia<\/h4>\n<p>\nUkladajte konfigur\u00e1cie ako kon\u0161tanty priamo v k\u00f3de. Oddelen\u00e9 kon\u0161tanty pre testovac\u00ed server, oddelen\u00e9 pre produkciu. Spojte fungovanie aplik\u00e1cie v z\u00e1vislosti od prostredia priamo v biznis logike projektu pomocou kon\u0161trukci\u00ed if else.<\/p>\n<p><b>Konfigur\u00e1cie<\/b> \u2014 to je jedin\u00e9, \u010d\u00edm by sa mali l\u00ed\u0161i\u0165 nasadenia projektu (deployment). V ide\u00e1lnom pr\u00edpade by sa konfigur\u00e1cie mali pren\u00e1\u0161a\u0165 cez premenn\u00e9 prostredia (env vars). <\/p>\n<p>To znamen\u00e1, \u017ee aj ke\u010f budete uchov\u00e1va\u0165 nieko\u013eko konfigura\u010dn\u00fdch s\u00faborov .config.prod .config.local a premenov\u00e1va\u0165 ich pri nasadzovan\u00ed na .config (hlavn\u00fd konfigura\u010dn\u00fd s\u00fabor, z ktor\u00e9ho aplik\u00e1cia \u010d\u00edta \u00fadaje) \u2014 to nebude spr\u00e1vny pr\u00edstup, preto\u017ee v takom pr\u00edpade bud\u00fa inform\u00e1cie z konfigur\u00e1ci\u00ed pr\u00edstupn\u00e9 v\u0161etk\u00fdm v\u00fdvoj\u00e1rom aplik\u00e1cie a \u00fadaje z produk\u010dn\u00e9ho servera bud\u00fa ohrozen\u00e9. V\u0161etky konfigur\u00e1cie musia by\u0165 ulo\u017een\u00e9 priamo v syst\u00e9me nasadzovania (CI\/CD) a generovan\u00e9 pre r\u00f4zne prostredia s r\u00f4znymi hodnotami potrebn\u00fdmi pre konkr\u00e9tne prostredie pr\u00e1ve v okamihu nasadzovania.<\/p>\n<h4>4. Extern\u00e9 slu\u017eby (Backing Services)<\/h4>\n<p>\nPe staticky sa via\u017ete na prostredie, pou\u017e\u00edvajte r\u00f4zne pripojenia pre rovnak\u00e9 slu\u017eby v \u0161pecifick\u00fdch prostrediach.<\/p>\n<p>V skuto\u010dnosti tento bod silne s\u00favis\u00ed s bodom o konfigur\u00e1ci\u00e1ch, preto\u017ee bez pr\u00edtomnosti tohto bodu nie je mo\u017en\u00e9 vytvori\u0165 norm\u00e1lne konfigura\u010dn\u00e9 \u00fadaje a v\u00f4bec mo\u017enos\u0165 konfigur\u00e1cie by sa stratila.<\/p>\n<p>V\u0161etky pripojenia k extern\u00fdm slu\u017eb\u00e1m, ako s\u00fa servery frontov, datab\u00e1zy, slu\u017eby cache, by mali by\u0165 jednotn\u00e9 pre lok\u00e1lne prostredie aj pre extern\u00e9 \/ produk\u010dn\u00e9 prostredie. In\u00fdmi slovami, m\u00f4\u017eem kedyko\u013evek zmeni\u0165 pripojovac\u00ed re\u0165azec tak, \u017ee nahrad\u00edm pr\u00edstup k datab\u00e1ze #1 datab\u00e1zou #2 bez zmeny k\u00f3du aplik\u00e1cie. Alebo dopredu ako pr\u00edklad, po\u010das \u0161k\u00e1lovania slu\u017eby nemus\u00edte pre \u010fal\u0161\u00ed server cache \u0161pecifikova\u0165 pripojenie nejak\u00fdm \u0161peci\u00e1lnym sp\u00f4sobom.<\/p>\n<h4>5. Kompil\u00e1cia, vydanie, vykonanie<\/h4>\n<p>\nNa serveri majte iba fin\u00e1lnu verziu k\u00f3du, bez mo\u017enosti vr\u00e1ti\u0165 vydanie sp\u00e4\u0165. Nemus\u00edte zaplni\u0165 diskov\u00fd priestor. Kto si mysl\u00ed, \u017ee m\u00f4\u017ee nasadi\u0165 k\u00f3d na produkciu s chybou, je zl\u00fd program\u00e1tor!<\/p>\n<p>V\u0161etky f\u00e1zy nasadzovania musia by\u0165 medzi sebou oddelen\u00e9.<\/p>\n<p>Majte \u0161ancu sa vr\u00e1ti\u0165 sp\u00e4\u0165. Robte vydania so z\u00e1lohovan\u00edm star\u00fdch k\u00f3pi\u00ed aplik\u00e1cie (u\u017e zostaven\u00fdch a pripraven\u00fdch na boj), aby ste v pr\u00edpade ch\u00fdb mohli obnovi\u0165 star\u00fa verziu. To znamen\u00e1, \u017ee existuje zlo\u017een\u00e1 slo\u017eka <i>releases<\/i> a zlo\u017eenie <i>\u2013 pr\u00fad<\/i>, a po \u00faspe\u0161nom nasaden\u00ed a zostaven\u00ed sa zlo\u017eenie <i>\u2013 pr\u00fad<\/i> prepoj\u00ed symbolick\u00fdm odkazom s nov\u00fdm vydan\u00edm, ktor\u00e9 sa nach\u00e1dza vo vn\u00fatri <i>releases<\/i> s podmienen\u00fdm n\u00e1zvom \u010d\u00edsla vydania. <\/p>\n<p>Tu si spomenieme na Blue-Green deployment, ktor\u00fd umo\u017e\u0148uje nielen prep\u00edna\u0165 medzi k\u00f3dom, ale aj medzi v\u0161etk\u00fdmi zdrojmi a dokonca prostred\u00edm s mo\u017enos\u0165ou vr\u00e1ti\u0165 v\u0161etko sp\u00e4\u0165.<\/p>\n<h4>6. Procesy<\/h4>\n<p>\nUchov\u00e1vajte \u00fadaje o stave aplik\u00e1cie priamo v samotnej aplik\u00e1cii. Pou\u017e\u00edvajte rel\u00e1cie v pam\u00e4ti aplik\u00e1cie. Pou\u017e\u00edvajte \u010do najviac zdie\u013ean\u00fdch medzi extern\u00fdmi slu\u017ebami. Bu\u010fte si ist\u00ed, \u017ee aplik\u00e1cia m\u00f4\u017ee ma\u0165 len jeden proces a nedovo\u013ete mo\u017enos\u0165 \u0161k\u00e1lovania.<\/p>\n<p>Pokia\u013e ide o rel\u00e1cie, uchov\u00e1vajte \u00fadaje iba v cache spravovanej extern\u00fdmi slu\u017ebami (memcached, redis), tak\u017ee aj ke\u010f bude be\u017ea\u0165 20 procesov aplik\u00e1cie, ktor\u00fdko\u013evek z nich sa obr\u00e1ten\u00edm na cache m\u00f4\u017ee pokra\u010dova\u0165 v pr\u00e1ci s klientom v tom istom stave, v ktorom bol pou\u017e\u00edvate\u013e, ke\u010f pracoval s aplik\u00e1ciou v inom procese. Pri takomto pr\u00edstupe bude v\u0161etko fungova\u0165 bez probl\u00e9mov s pr\u00edstupom k \u00fadajom, bez oh\u013eadu na to, ko\u013eko k\u00f3pi\u00ed extern\u00fdch slu\u017eieb pou\u017e\u00edvate.<\/p>\n<h4>7. Priradenie portov (Port binding)<\/h4>\n<p>\nVedie\u0165, ako pracova\u0165 s extern\u00fdmi slu\u017ebami, by mal len webov\u00fd server. Najlep\u0161ie je zdvihn\u00fa\u0165 extern\u00e9 slu\u017eby priamo v r\u00e1mci webov\u00e9ho servera. Napr\u00edklad ako PHP modul v Apache.<br \/>\nV\u0161etky va\u0161e slu\u017eby by mali by\u0165 dostupn\u00e9 navz\u00e1jom prostredn\u00edctvom nejak\u00e9ho adresy a portu (localhost:5432, localhost:3000, nginx:80, php-fpm:9000), t.j. z nginx m\u00f4\u017eem z\u00edska\u0165 pr\u00edstup k php-fpm aj k postgres, a z php-fpm k postgres a nginx, a vlastne z ka\u017edej slu\u017eby m\u00f4\u017eem z\u00edska\u0165 pr\u00edstup k inej slu\u017ebe. Takto nie je \u017eivotaschopnos\u0165 slu\u017eby z\u00e1visl\u00e1 na \u017eivotaschopnosti inej slu\u017eby.<\/p>\n<h4>8. Paralelizmus<\/h4>\n<p>\nPracujte s jedn\u00fdm procesom, lebo ak bud\u00fa be\u017ea\u0165 viacer\u00e9 procesy, nemusia si navz\u00e1jom rozumie\u0165! <\/p>\n<p>Nezabudnite na mo\u017enosti \u0161k\u00e1lovania. Na to je skvel\u00fd docker swarm. <br \/>\nDocker Swarm je n\u00e1stroj na vytv\u00e1ranie a spr\u00e1vu klastrov kontajnerov, \u010di u\u017e medzi r\u00f4znymi strojmi alebo mno\u017estvom kontajnerov na jednom stroji.<\/p>\n<p>Pou\u017e\u00edvaj\u00fac swarm, m\u00f4\u017eem ur\u010dova\u0165, ko\u013eko zdrojov pridel\u00edm ka\u017ed\u00e9mu procesu a ak\u00fd po\u010det procesov tej istej slu\u017eby spust\u00edm, a vn\u00fatorn\u00fd vyrovn\u00e1va\u010d z\u00e1\u0165a\u017ee, ktor\u00fd prij\u00edma d\u00e1ta na ur\u010den\u00fd port, ich automaticky proxy na procesy. T\u00fdmto sp\u00f4sobom, ak vid\u00edm, \u017ee sa zv\u00fd\u0161ila z\u00e1\u0165a\u017e na serveri, m\u00f4\u017eem prida\u0165 viac procesov a t\u00fdm zn\u00ed\u017ei\u0165 z\u00e1\u0165a\u017e na konkr\u00e9tne procesy.<\/p>\n<h4>9. Zlikvidovate\u013enos\u0165 (Disposability)<\/h4>\n<p>\nNepou\u017e\u00edvajte fronty na pr\u00e1cu s procesmi a d\u00e1tami. Zabit\u00ed jedn\u00e9ho procesu by malo ovplyvni\u0165 chod celej aplik\u00e1cie. Ak zlyh\u00e1 jedna slu\u017eba, zlyh\u00e1 v\u0161etko.<\/p>\n<p>Ka\u017ed\u00fd proces a slu\u017eba m\u00f4\u017eu by\u0165 vypnut\u00e9 kedyko\u013evek a to by nemalo ovplyvni\u0165 ostatn\u00e9 slu\u017eby (nejde samozrejme o to, \u017ee slu\u017eba bude nedostupn\u00e1 pre in\u00fa slu\u017ebu, ale o to, \u017ee in\u00e1 slu\u017eba sa za touto nezastav\u00ed). V\u0161etky procesy by sa mali ukon\u010dova\u0165 hladko, aby pri svojom ukon\u010den\u00ed nestratili d\u00e1ta a pri \u010fal\u0161om zapnut\u00ed syst\u00e9m fungoval spr\u00e1vne. To znamen\u00e1, \u017ee aj v pr\u00edpade havarijn\u00e9ho ukon\u010denia by d\u00e1ta nemali trpie\u0165 (m\u00f4\u017ee by\u0165 pou\u017eit\u00fd mechanizmus transakci\u00ed, dotazy do datab\u00e1zy pracuj\u00fa iba v skupin\u00e1ch, a ak aspo\u0148 jeden dotaz z skupiny nebol vykonan\u00fd alebo bol vykonan\u00fd s chybou, tak \u017eiadny \u010fal\u0161\u00ed dotaz z tejto skupiny sa v skuto\u010dnosti nevykon\u00e1).<\/p>\n<h4>10. Parita v\u00fdvoja\/pr\u00e1ce aplik\u00e1cie<\/h4>\n<p>\nProduk\u010dn\u00fd, staging a lok\u00e1lna verzia aplik\u00e1cie by mali by\u0165 rozdielne. Na produkcii m\u00e1me framework Yii Lite, a lok\u00e1lne Yii, aby to na produkcii i\u0161lo r\u00fdchlej\u0161ie!<\/p>\n<p>V skuto\u010dnosti by v\u0161etky nasadenia a pr\u00e1ca s k\u00f3dom mali by\u0165 takmer v identickom prostred\u00ed (nejde o fyzick\u00fd hardv\u00e9r). Rovnako nasadi\u0165 k\u00f3d na produkcii, ak je to potrebn\u00e9, by mal by\u0165 schopn\u00fd ka\u017ed\u00fd zamestnanec vyvoja, a nie nejak\u00e9 \u0161peci\u00e1lne vy\u0161kolen\u00e9 devops oddelenie, ktor\u00e9 len v\u010faka zvl\u00e1\u0161tnej sile m\u00f4\u017ee spusti\u0165 aplik\u00e1ciu na produkcii.<\/p>\n<p>V tom n\u00e1m takisto pom\u00e1ha Docker. Pri dodr\u017ean\u00ed v\u0161etk\u00fdch predch\u00e1dzaj\u00facich bodov, pou\u017eit\u00edm dockeru, zjednodu\u0161\u00ed proces nasadenia prostredia na produkcii aj na lok\u00e1lnom po\u010d\u00edta\u010di na zadanie jednej-dvoch pr\u00edkazov.<\/p>\n<h4>11. Zaznamen\u00e1vanie (Logs)<\/h4>\n<p>\nLogy p\u00ed\u0161eme do s\u00faborov a datab\u00e1zy! Soubory a datab\u00e1zu od logov ne\u010dist\u00edme. Jednoducho si k\u00fapime pevn\u00fd disk na 9000 Petabytov a hotovo.<\/p>\n<p>V\u0161etky logy je potrebn\u00e9 pova\u017eova\u0165 za tok udalost\u00ed. Aplik\u00e1cia by sa nemala zaobera\u0165 spracovan\u00edm logov. Logy by mali by\u0165 odosielan\u00e9 bu\u010f do stdout, alebo prostredn\u00edctvom protokolu ako udp, aby pr\u00e1ca aplik\u00e1cie s logami nevytv\u00e1rala \u017eiadne probl\u00e9my. Na to sa dobre hod\u00ed graylog. Graylog, ktor\u00fd prij\u00edma v\u0161etky logy prostredn\u00edctvom udp (tento protokol si nevy\u017eaduje \u010dakanie na potvrdenie \u00faspe\u0161n\u00e9ho prijatia \u043f\u0430\u043a\u0435\u0442\u0430), nijako neovplyv\u0148uje aplik\u00e1ciu a zaober\u00e1 sa iba \u0161trukt\u00farovan\u00edm a spracovan\u00edm logov. Logika aplik\u00e1cie sa nemen\u00ed na pr\u00e1cu s podobn\u00fdmi pr\u00edstupmi.<\/p>\n<h4>12. \u00dalohy administr\u00e1cie<\/h4>\n<p>\nNa aktualiz\u00e1ciu \u00fadajov, db a t.d. pou\u017e\u00edvajte samostatne vytvoren\u00fd koncov\u00fd bod v API, jeho vykonanie dvakr\u00e1t po sebe m\u00f4\u017ee sp\u00f4sobi\u0165, \u017ee sa \u00fadaje zdvojn\u00e1sobia. Ale ve\u010f nie ste hl\u00fapi, predsa dvakr\u00e1t nekliknete, a migr\u00e1cie s\u00fa n\u00e1m na ni\u010d.<\/p>\n<p>V\u0161etky \u00falohy administr\u00e1cie by sa mali vykon\u00e1va\u0165 v tej istej prostred\u00ed ako cel\u00fd k\u00f3d, na \u00farovni releasov. To znamen\u00e1, \u017ee ak potrebujeme zmeni\u0165 \u0161trukt\u00faru db, nebudeme to robi\u0165 manu\u00e1lne, meniac n\u00e1zvy st\u013apcov a prid\u00e1vaj\u00fac nov\u00e9 cez nejak\u00e9 vizu\u00e1lne n\u00e1stroje na spr\u00e1vu DB. Pre tak\u00e9to veci vytv\u00e1rame samostatn\u00e9 skripty \u2014 migr\u00e1cie, ktor\u00e9 sa vykon\u00e1vaj\u00fa v\u0161ade a na v\u0161etk\u00fdch prostrediach rovnak\u00fdm sp\u00f4sobom s jasn\u00fdm a zrozumite\u013en\u00fdm v\u00fdsledkom. Pre v\u0161etky ostatn\u00e9 \u00falohy, ako napr\u00edklad naplnenie projektu \u00fadajmi, by sa mali uplat\u0148ova\u0165 podobn\u00e9 metodol\u00f3gie.<\/p>\n<h3>Pr\u00edklad implement\u00e1cie v PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. V\u0161etky pr\u00edklady boli realizovan\u00e9 na MacOS. V\u00e4\u010d\u0161ina z nich bude vyhovova\u0165 aj pre Linux. Pou\u017e\u00edvatelia Windows, prep\u00e1\u010dte, ale s bin\u00e1lnou som u\u017e dlho nepracoval.<\/p>\n<p>Predstavme si situ\u00e1ciu, \u017ee na na\u0161om PC nie je nain\u0161talovan\u00e1 \u017eiadna verzia PHP a v\u00f4bec ni\u010d nie je. <br \/>\nIn\u0161talujeme posledn\u00e9 verzie docker a docker-compose. (to sa d\u00e1 n\u00e1js\u0165 na internete)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp;\ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. In\u0161talujeme <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=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010co sa t\u00fdka Laradock, poviem, \u017ee je to ve\u013emi skvel\u00e1 vec, v ktorej je zhroma\u017eden\u00fdch ve\u013emi ve\u013ea kontajnerov a pomocn\u00fdch n\u00e1strojov. Ale pou\u017e\u00edva\u0165 Laradock bez \u00faprav na produkcii \u2014 to by som neodpor\u00fa\u010dal kv\u00f4li jeho nadbyto\u010dnosti. Lep\u0161ie je vytvori\u0165 vlastn\u00e9 kontajnery na z\u00e1klade pr\u00edkladov v Laradock, tak sa bude da\u0165 optimalizova\u0165, lebo nikto nepotrebuje v\u0161etko, \u010do tam je, naraz.<\/p>\n<p>2. Konfigurujeme Laradock na pr\u00e1cu na\u0161ej aplik\u00e1cie.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp;\ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Otvor\u00edme adres\u00e1r habr (rodi\u010dovsk\u00e1 zlo\u017eka, do ktorej bol sklonovan\u00fd laradock) v akomko\u013evek editore. (V mojom pr\u00edpade PHPStorm)<\/p>\n<p>V tomto kroku nastav\u00edme iba n\u00e1zov projektu.<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Spust\u00edme obraz workspace. (Vo va\u0161om pr\u00edpade sa obrazy bud\u00fa nejak\u00fd \u010das budova\u0165)<br \/>\nWorkspace je \u0161peci\u00e1lne pripraven\u00fd obraz na pr\u00e1cu s frameworkom menom v\u00fdvoj\u00e1ra.<\/p>\n<p>Prejdeme do vn\u00fatornosti kontajnera pomocou <\/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=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Nain\u0161talujeme Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Po in\u0161tal\u00e1cii skontrolujeme, \u010di bola vytvoren\u00e1 zlo\u017eka s projektom, a ukon\u010d\u00edme compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Vr\u00e1time sa sp\u00e4\u0165 do PHPStorm a nastav\u00edme spr\u00e1vnu cestu k n\u00e1\u0161mu laravel aplik\u00e1cii v s\u00fabore .env.<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Prid\u00e1me cel\u00fd k\u00f3d do Git.<\/p>\n<p>Na toto vytvor\u00edme na Github (alebo kdeko\u013evek inde) repozit\u00e1r. Prejdeme v termin\u00e1li do adres\u00e1ra habr a vykon\u00e1me nasleduj\u00faci k\u00f3d.<\/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 # tu bude odkaz na v\u00e1\u0161 repo\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nSkontrolujeme, \u010di je v\u0161etko v poriadku. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPre pohodlnos\u0165 odpor\u00fa\u010dam pou\u017ei\u0165 nejak\u00e9 vizu\u00e1lne rozhranie pre Git, v mojom pr\u00edpade je to <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (tu je referral link)<\/p>\n<p>4. Sp\u00fa\u0161\u0165ame!<\/p>\n<p>Pred spusten\u00edm sa uistite, \u017ee na porte 80 a 443 nem\u00e1te ni\u010d spusten\u00e9.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTakto n\u00e1\u0161 projekt pozost\u00e1va z 3 samostatn\u00fdch slu\u017eieb:<\/p>\n<ul>\n<li>nginx \u2014 webov\u00fd server<\/li>\n<li>php-fpm \u2014 php na pr\u00edjem po\u017eiadaviek z webov\u00e9ho servera<\/li>\n<li>workspace \u2014 php pre v\u00fdvoj\u00e1ra<\/li>\n<\/ul>\n<p>\nDoteraz sme dosiahli, \u017ee sme vytvorili aplik\u00e1ciu zodpovedaj\u00facu u\u017e 4 bodom z 12, a to konkr\u00e9tne:<\/p>\n<p>1. <b>K\u00f3dov\u00e1 z\u00e1klad\u0148a<\/b> \u2014 cel\u00fd k\u00f3d sa nach\u00e1dza v jednom repozit\u00e1ri (mal\u00e1 pozn\u00e1mka: spr\u00e1vne by mohol by\u0165 Docker zahrnut\u00fd do projektu laravel, ale to nie je z\u00e1sadn\u00e9).<\/p>\n<p>2. <b>Z\u00e1vislosti<\/b> \u2014 V\u0161etky na\u0161e z\u00e1vislosti s\u00fa jasne uveden\u00e9 v application\/composer.json a v ka\u017edom Dockerfile ka\u017ed\u00e9ho kontajnera.<\/p>\n<p>3. <b>Extern\u00e9 slu\u017eby (Backing Services)<\/b> \u2014 Ka\u017ed\u00e1 zo slu\u017eieb (php-fpm, nginx, workspace) \u017eije svoj\u00edm vlastn\u00fdm \u017eivotom a je pripojen\u00e1 zvonka, pri\u010dom pri pr\u00e1ci s jednou slu\u017ebou nebude druh\u00e1 dotknut\u00e1.<\/p>\n<p>4. <b>Procesy<\/b> \u2014 ka\u017ed\u00e1 slu\u017eba je jeden proces. Ka\u017ed\u00e1 zo slu\u017eieb neuklad\u00e1 vn\u00fatorn\u00fd stav.<\/p>\n<p>5.<b> Zviazanie portov (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAko vid\u00edme, ka\u017ed\u00e1 slu\u017eba je spusten\u00e1 na svojom vlastnom porte a je dostupn\u00e1 pre v\u0161etky ostatn\u00e9 slu\u017eby.<\/p>\n<p>6.<b> Paralelizmus <\/b><\/p>\n<p>Docker n\u00e1m umo\u017e\u0148uje sp\u00fa\u0161\u0165a\u0165 nieko\u013eko procesov t\u00fdch ist\u00fdch slu\u017eieb s automatickou vyva\u017eovan\u00edm z\u00e1\u0165a\u017ee medzi nimi. <\/p>\n<p>Zastav\u00edme kontajnery a spust\u00edme ich cez 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=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAko vid\u00edme, vytvorili sa k\u00f3pie kontajnera php-fpm. Pri pr\u00e1ci s t\u00fdmto kontajnerom nemus\u00edme ni\u010d meni\u0165. Na\u010falej sa k nemu obraciame na porte 9000 a Docker za n\u00e1s reguluje za\u0165a\u017eenie medzi kontajnermi.<\/p>\n<p>7. <b>Odstr\u00e1nite\u013enos\u0165 (Disposability)<\/b> \u2014 ka\u017ed\u00fd kontajner je mo\u017en\u00e9 zabi\u0165 bez \u0161kody pre in\u00fd. Zastavenie alebo re\u0161tart kontajnera nijako neovplyvn\u00ed fungovanie aplik\u00e1cie pri nasleduj\u00facich spusteniach. Ka\u017ed\u00fd kontajner je mo\u017en\u00e9 spusti\u0165 aj kedyko\u013evek nesk\u00f4r.<\/p>\n<p>8. <b>Parita v\u00fdvoja\/prev\u00e1dzky aplik\u00e1cie<\/b> \u2014 v\u0161etky na\u0161e prostredia s\u00fa rovnak\u00e9. Spusten\u00edm syst\u00e9mu na serveri v produkcii nebudete musie\u0165 meni\u0165 ni\u010d vo svojich pr\u00edkazoch. V\u0161etko bude presne tak ako sa zaklad\u00e1 na Docker.<\/p>\n<p>9. <b>Zaznamen\u00e1vanie (Logs)<\/b> \u2014 v\u0161etky logy v t\u00fdchto kontajneroch id\u00fa na pr\u00fad a s\u00fa vidite\u013en\u00e9 v konzole Docker. (v tomto pr\u00edpade, v skuto\u010dnosti, s in\u00fdmi vlastn\u00fdmi kontajnermi, to m\u00f4\u017ee by\u0165 inak, ak sa o to nezabezpe\u010d\u00edte)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAle tu je h\u00e1\u010dik v tom, \u017ee predvolen\u00e9 hodnoty v PHP a Nginx tie\u017e zapisuj\u00fa logy do s\u00faboru. Na splnenie 12 faktorov je potrebn\u00e9 <b>vypn\u00fa\u0165<\/b> z\u00e1znam logov do s\u00faboru v konfigur\u00e1ci\u00e1ch ka\u017ed\u00e9ho kontajnera samostatne.<\/p>\n<p>Docker tie\u017e poskytuje mo\u017enos\u0165 smerova\u0165 logy nielen do stdout, ale aj do vec\u00ed ako graylog, o ktorom som hovoril vy\u0161\u0161ie. A vo vn\u00fatri graylogu m\u00f4\u017eeme manipulova\u0165 s logmi \u013eubovo\u013ene a na\u0161a aplik\u00e1cia si toho ni\u010d nev\u0161imne.<\/p>\n<p>10. <b>Administrat\u00edvne \u00falohy<\/b> \u2014 v\u0161etky administrat\u00edvne \u00falohy s\u00fa rie\u0161en\u00e9 Laravelom v\u010faka n\u00e1stroju Artisan presne tak, ako by si to \u017eelali tvorcovia 12 faktov\u00e9ho aplik\u00e1cie.<\/p>\n<p>Ako pr\u00edklad uk\u00e1\u017eem, ako sa vykon\u00e1vaj\u00fa niektor\u00e9 pr\u00edkazy.<br \/>\nVst\u00fapime do kontajnera.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeraz m\u00f4\u017eeme vyu\u017ei\u0165 ak\u00fdko\u013evek pr\u00edkaz. (v\u0161imnite si, \u017ee sme nenastavovali datab\u00e1zu a cache, tak\u017ee polovica pr\u00edkazov nebude spr\u00e1vne vykonan\u00e1, preto\u017ee s\u00fa ur\u010den\u00e9 na pr\u00e1cu s cache a db).<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green deployment, zalo\u017een\u00fd na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigur\u00e1cie<\/b> a 12. <b>Zostavenie, uvo\u013enenie, vykonanie<\/b><\/p>\n<p>T\u00fato \u010das\u0165 som chcel venova\u0165 Blue-Green Deployment, ale uk\u00e1zalo sa, \u017ee je to pr\u00edli\u0161 rozsiahle pre tento \u010dl\u00e1nok. O tom nap\u00ed\u0161em samostatn\u00fd \u010dl\u00e1nok. <\/p>\n<p>V skratke, koncept spo\u010d\u00edva v syst\u00e9moch CI\/CD typu <b>Jenkins<\/b> a <b>Gitlab CI<\/b>. V oboch m\u00f4\u017eete nastavi\u0165 prostredkov\u00e9 premenne t\u00fdkaj\u00face sa konkr\u00e9tneho prostredia. Zodpovedaj\u00facim sp\u00f4sobom sa vykon\u00e1 bod s <b>Konfigur\u00e1ciami<\/b>.<\/p>\n<p>A bod o <b>Zostavenie, uvo\u013enenie, vykonanie<\/b> sa rie\u0161i zabudovan\u00fdmi funkciami oboch n\u00e1strojov s n\u00e1zvom <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> umo\u017e\u0148uje rozde\u013eova\u0165 proces nasadzovania na mnoho f\u00e1z, vy\u010dle\u0148uj\u00fac f\u00e1zy zostavenia, vydania a vykonania. Takisto v Pipeline m\u00f4\u017eete vytv\u00e1ra\u0165 z\u00e1lohy, alebo vlastne \u010doko\u013evek. Tento n\u00e1stroj m\u00e1 nekone\u010dn\u00fd potenci\u00e1l.<\/p>\n<p>K\u00f3d aplik\u00e1cie sa nach\u00e1dza na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nNezabudnite inicializova\u0165 submodule pri klonovan\u00ed tohto repozit\u00e1ra.<\/p>\n<p>P.S.: V\u0161etky tieto pr\u00edstupy je mo\u017en\u00e9 pou\u017e\u00edva\u0165 s ak\u00fdmiko\u013evek in\u00fdmi n\u00e1strojmi a programovac\u00edmi jazykmi. D\u00f4le\u017eit\u00e9 je, aby podstata zostala rovnak\u00e1.<br \/>\n<br \/>Zdroj: <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.4 - 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\/sk\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47V\u00fdvoj aplik\u00e1ci\u00ed a Blue-Green nasadzovanie, zalo\u017een\u00e9 na metodol\u00f3gii The Twelve-Factor App s pr\u00edkladmi na php a docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sk\/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":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}