{"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\/cs\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Nejd\u0159\u00edve si trochu teorie. Co je to <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nJednodu\u0161e \u0159e\u010deno, je to dokument, kter\u00fd m\u00e1 za c\u00edl usnadnit v\u00fdvoj SaaS aplikac\u00ed, proto\u017ee informuje v\u00fdvoj\u00e1\u0159e a DevOps in\u017een\u00fdry o probl\u00e9mech a praktik\u00e1ch, kter\u00e9 se \u010dasto objevovaly p\u0159i v\u00fdvoji modern\u00edch aplikac\u00ed. <\/p>\n<p>Dokument byl vytvo\u0159en v\u00fdvoj\u00e1\u0159i platformy Heroku.<\/p>\n<p>Metodologie dvan\u00e1cti faktor\u016f (The Twelve-Factor App) m\u016f\u017ee b\u00fdt pou\u017eita pro aplikace napsan\u00e9 v jak\u00e9mkoli programovac\u00edm jazyce a vyu\u017e\u00edvaj\u00edc\u00ed jak\u00e9koli kombinace extern\u00edch slu\u017eeb (backing services) (datab\u00e1ze, message queue, cache atd.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Kr\u00e1tce o faktorech, na kter\u00fdch je tato metodologie zalo\u017eena:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Z\u00e1klad k\u00f3du<\/b> \u2013 Jeden z\u00e1klad k\u00f3du, sledovan\u00fd v syst\u00e9mu spr\u00e1vy verz\u00ed, \u2013 v\u00edce nasazen\u00ed <\/li>\n<li><b>Z\u00e1vislosti<\/b> \u2013 V\u00fdslovn\u011b deklarujte a izolujte z\u00e1vislosti<\/li>\n<li><b>Konfigurace<\/b> \u2013 Uchov\u00e1vejte konfiguraci v runtime prost\u0159ed\u00ed<\/li>\n<li><b>Extern\u00ed slu\u017eby (Backing Services)<\/b> \u2013 Pova\u017eujte extern\u00ed slu\u017eby (backing services) za p\u0159ipojiteln\u00e9 zdroje<\/li>\n<li><b>Sestaven\u00ed, release, prov\u00e1d\u011bn\u00ed<\/b> \u2013 P\u0159\u00edsn\u011b odd\u011blujte f\u00e1ze sestaven\u00ed a prov\u00e1d\u011bn\u00ed<\/li>\n<li><b>Procesy<\/b> \u2013 Spus\u0165te aplikaci jako jeden nebo v\u00edce proces\u016f, kter\u00e9 neuchov\u00e1vaj\u00ed vnit\u0159n\u00ed stav (stateless) <\/li>\n<li><b>P\u0159ipojen\u00ed port\u016f (Port binding)<\/b> \u2013 Exportujte slu\u017eby p\u0159es p\u0159ipojen\u00ed port\u016f <\/li>\n<li><b>Paralelismus<\/b> \u2013 \u0160k\u00e1lujte aplikaci pomoc\u00ed proces\u016f <\/li>\n<li><b>Zlikvidovatelnost (Disposability)<\/b> \u2013 Maximalizujte spolehlivost pomoc\u00ed rychl\u00e9ho spu\u0161t\u011bn\u00ed a spr\u00e1vn\u00e9ho ukon\u010den\u00ed <\/li>\n<li><b>Parita v\u00fdvoje\/produkce aplikace<\/b> \u2013 Udr\u017eujte prost\u0159ed\u00ed v\u00fdvoje, staging a produkce co nejpodobn\u011bj\u0161\u00ed <\/li>\n<li><b>Logov\u00e1n\u00ed (Logs)<\/b> \u2013 Pova\u017eujte log jako tok ud\u00e1lost\u00ed<\/li>\n<li><b>Administrativn\u00ed \u00fakoly<\/b> \u2013 Prov\u00e1d\u011bjte administrativn\u00ed\/management \u00fakoly pomoc\u00ed jednor\u00e1zov\u00fdch proces\u016f <\/li>\n<\/ol>\n<p>\n<b>V\u00edce informac\u00ed o 12 faktorech najdete v n\u00e1sleduj\u00edc\u00edch zdroj\u00edch:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Ofici\u00e1ln\u00ed prim\u00e1rn\u00ed zdroj<\/a><\/noindex> \u2014 nutn\u00e9 p\u0159e\u010d\u00edst<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">\u010cl\u00e1nek na habr. Aplikace dvan\u00e1cti faktor\u016f \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 ofici\u00e1ln\u00ed p\u0159eklad<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">\u010cl\u00e1nek na habr. 7 chyb\u011bj\u00edc\u00edch faktor\u016f v p\u0159\u00edstupu 12 Factor App<\/a><\/noindex> \u2014 \u010derstv\u00fd pohled na 12 faktor\u016f za \u00fa\u010delem jejich vylep\u0161en\u00ed.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Co je to Blue-Green deployment?<\/h3>\n<p>\nBlue-Green deployment \u2013 to je zp\u016fsob dod\u00e1n\u00ed aplikace na <b>production<\/b> t\u00edm zp\u016fsobem, \u017ee koncov\u00fd klient nevid\u00ed \u017e\u00e1dn\u00e9 zm\u011bny na sv\u00e9 stran\u011b. Jin\u00fdmi slovy, nasazen\u00ed aplikace s nulov\u00fdm <b>v\u00fdpadkem<\/b>.<\/p>\n<p>Klasick\u00e1 sch\u00e9ma BG Deploy vypad\u00e1 tak, jak je zn\u00e1zorn\u011bno na obr\u00e1zku n\u00ed\u017ee. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Na za\u010d\u00e1tku jsou 2 fyzick\u00e9 servery s naprosto stejn\u00fdm k\u00f3dem, aplikac\u00ed, projektem, a je zde router (vyrovn\u00e1va\u010d z\u00e1t\u011b\u017ee). <\/li>\n<li>Router p\u016fvodn\u011b sm\u011bruje v\u0161echny dotazy na jeden ze server\u016f (<b>modr\u00e1<\/b>). <\/li>\n<li>V okam\u017eiku, kdy je t\u0159eba znovu prov\u00e9st vyd\u00e1n\u00ed, cel\u00fd projekt se aktualizuje na jin\u00e9m serveru (<b>alpha<\/b>), kter\u00fd v tuto chv\u00edli nezkou\u0161\u00ed \u017e\u00e1dn\u00e9 dotazy. <\/li>\n<li>Po dokon\u010den\u00ed aktualizace k\u00f3du na <b>modr\u00e9m<\/b> serveru, router dostane pokyn p\u0159epnout z <b>zelen\u00e9ho<\/b> na <b>alpha<\/b> server. <\/li>\n<li>Nyn\u00ed v\u0161ichni klienti vid\u00ed v\u00fdsledky k\u00f3du z <b>modr\u00e9ho<\/b> serveru. <\/li>\n<li> N\u011bjakou dobu, <b>modr\u00e1<\/b> server slou\u017e\u00ed jako z\u00e1lo\u017en\u00ed verze v p\u0159\u00edpad\u011b ne\u00fasp\u011b\u0161n\u00e9ho nasazen\u00ed na <b>alpha<\/b> server, a v p\u0159\u00edpad\u011b ne\u00fasp\u011bchu a bug\u016f, router p\u0159epne u\u017eivatelsk\u00fd tok zp\u011bt na <b>modr\u00e1<\/b> server se starou stabiln\u00ed verz\u00ed, a nov\u00fd k\u00f3d se pos\u00edl\u00e1 na \u00fapravu a testov\u00e1n\u00ed.<\/li>\n<li>A nakonec se stejn\u011b tak aktualizuje <b>modr\u00e1<\/b> server. A po jeho aktualizaci, router p\u0159epne tok dotaz\u016f zp\u011bt na <b>modr\u00e1<\/b> server.<\/li>\n<\/ul>\n<p>\nVypad\u00e1 to v\u0161echno velmi dob\u0159e a na prvn\u00ed pohled by s t\u00edm nem\u011bly b\u00fdt \u017e\u00e1dn\u00e9 probl\u00e9my.<br \/>\nAle proto\u017ee \u017eijeme v modern\u00edm sv\u011bt\u011b, klasick\u00e1 sch\u00e9ma s fyzick\u00fdm p\u0159ep\u00edn\u00e1n\u00edm pro n\u00e1s nevyhovuje. Zat\u00edm si tuto informaci zapamatujte, vr\u00e1t\u00edme se k n\u00ed pozd\u011bji.<\/p>\n<h3>\u0160patn\u00e9 a dobr\u00e9 rady<\/h3>\n<p>\n<i>Pozn\u00e1mka<\/i>: V n\u00ed\u017ee uveden\u00fdch p\u0159\u00edkladech jsou uvedeny n\u00e1stroje\/metodologie, kter\u00e9 pou\u017e\u00edv\u00e1m j\u00e1, m\u016f\u017eete pou\u017e\u00edt jak\u00e9koli alternativy se podobn\u00fdmi funkcemi. <\/p>\n<p>V\u011bt\u0161ina p\u0159\u00edklad\u016f se n\u011bjak\u00fdm zp\u016fsobem p\u0159ekr\u00fdv\u00e1 s webov\u00fdm v\u00fdvojem (to je p\u0159ekvapen\u00ed), s PHP a Dockerem.<\/p>\n<p>V n\u00e1sleduj\u00edc\u00edch bodech je jednoduch\u00fd praktick\u00fd popis pou\u017eit\u00ed faktor\u016f na konkr\u00e9tn\u00edch p\u0159\u00edkladech, pokud chcete v\u00edce teorie na toto t\u00e9ma, odk\u00e1\u017ete na odkazy v\u00fd\u0161e na prvotn\u00ed zdroj. <\/p>\n<h4>1. K\u00f3dov\u00e1 z\u00e1kladna<\/h4>\n<p>\nPou\u017e\u00edvejte FTP a FileZilla k nahr\u00e1v\u00e1n\u00ed soubor\u016f na servery po jednom kuse, neukl\u00e1dejte k\u00f3d nikde mimo produk\u010dn\u00ed server.<\/p>\n<p>V projektu by v\u017edy m\u011bla b\u00fdt jednotn\u00e1 k\u00f3dov\u00e1 z\u00e1kladna, to znamen\u00e1, \u017ee ve\u0161ker\u00fd k\u00f3d poch\u00e1z\u00ed z jednoho m\u00edsta. <b>Git<\/b> repo. Servery (produk\u010dn\u00ed, staging, test1, test2 ...) pou\u017e\u00edvaj\u00ed k\u00f3d z v\u011btv\u00ed jednoho spole\u010dn\u00e9ho repozit\u00e1\u0159e. T\u00edmto zp\u016fsobem dosahujeme konzistence k\u00f3du.<\/p>\n<h4>2. Z\u00e1vislosti<\/h4>\n<p>\nStahujte v\u0161echny knihovny do slo\u017eek p\u0159\u00edmo do ko\u0159enov\u00e9ho adres\u00e1\u0159e projektu. Aktualizace prov\u00e1d\u011bjte jednodu\u0161e p\u0159esunut\u00edm nov\u00e9ho k\u00f3du do slo\u017eky s aktu\u00e1ln\u00ed verz\u00ed knihovny. Nainstalujte v\u0161echny pot\u0159ebn\u00e9 utility p\u0159\u00edmo na hostitelsk\u00e9m serveru, kde b\u011b\u017e\u00ed dal\u0161\u00edch 20 slu\u017eeb.<\/p>\n<p>Projekt by m\u011bl m\u00edt v\u017edy jasn\u011b srozumiteln\u00fd seznam z\u00e1vislost\u00ed (pod z\u00e1vislostmi tak\u00e9 rozum\u00edm prost\u0159ed\u00ed). V\u0161echny z\u00e1vislosti by m\u011bly b\u00fdt jasn\u011b definov\u00e1ny a izolov\u00e1ny. <br \/>\nJako p\u0159\u00edklad vezm\u011bme <b>Composer<\/b> a <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 spr\u00e1vce bal\u00ed\u010dk\u016f, kter\u00fd umo\u017e\u0148uje instalaci knihoven v PHP. Composer umo\u017e\u0148uje p\u0159\u00edsn\u011b nebo nep\u0159\u00edsn\u011b specifikovat verze a jasn\u011b je definovat. Na serveru m\u016f\u017ee b\u00fdt 20 r\u016fzn\u00fdch projekt\u016f a ka\u017ed\u00fd bude m\u00edt osobn\u00ed seznam bal\u00ed\u010dk\u016f a knihoven, kter\u00fd nebude z\u00e1visl\u00fd na ostatn\u00edch.<\/p>\n<p><b>Docker<\/b> \u2014 utilita, kter\u00e1 umo\u017e\u0148uje definovat a izolovat prost\u0159ed\u00ed, ve kter\u00e9m bude aplikace fungovat. Podobn\u011b jako s composerem, ale mnohem podrobn\u011bji, m\u016f\u017eeme ur\u010dit, s \u010d\u00edm aplikace pracuje. Vybrat konkr\u00e9tn\u00ed verzi PHP, nainstalovat pouze pot\u0159ebn\u00e9 bal\u00ed\u010dky pro projekt, ani\u017e bychom p\u0159id\u00e1vali n\u011bco nav\u00edc. A co je nejd\u016fle\u017eit\u011bj\u0161\u00ed, nep\u0159ekr\u00fdvat se s bal\u00ed\u010dky a prost\u0159ed\u00edm hostitelsk\u00e9 ma\u0161iny a dal\u0161\u00edch projekt\u016f. To znamen\u00e1, \u017ee v\u0161echny projekty na serveru b\u011b\u017e\u00edc\u00ed p\u0159es Docker mohou pou\u017e\u00edvat naprosto libovolnou sadu bal\u00ed\u010dk\u016f a \u00fapln\u011b odli\u0161n\u00e9 prost\u0159ed\u00ed.<\/p>\n<h4>3. Konfigurace<\/h4>\n<p>\nUkl\u00e1dejte konfigurace jako konstanty p\u0159\u00edmo v k\u00f3du. Odd\u011blen\u00e9 konstanty pro testovac\u00ed server, odd\u011blen\u00e9 pro produkci. Prov\u00e1zujte pr\u00e1ci aplikace v z\u00e1vislosti na prost\u0159ed\u00ed p\u0159\u00edmo v obchodn\u00ed logice projektu pomoc\u00ed konstrukc\u00ed if else.<\/p>\n<p><b>Konfigurace<\/b> \u2014 to je jedin\u00e9, \u010d\u00edm by se m\u011bly li\u0161it nasazen\u00ed projektu (deployment). Ide\u00e1ln\u011b by m\u011bly b\u00fdt konfigurace p\u0159ed\u00e1v\u00e1ny prost\u0159ednictv\u00edm prom\u011bnn\u00fdch prost\u0159ed\u00ed (env vars). <\/p>\n<p>To znamen\u00e1, \u017ee i kdy\u017e budete uchov\u00e1vat n\u011bkolik konfigura\u010dn\u00edch soubor\u016f .config.prod, .config.local a p\u0159i nasazov\u00e1n\u00ed je p\u0159ejmenov\u00e1vat na .config (hlavn\u00ed konfiguraci, ze kter\u00e9 aplikace \u010dte data), nebude to spr\u00e1vn\u00fd p\u0159\u00edstup, proto\u017ee v takov\u00e9m p\u0159\u00edpad\u011b budou informace z konfigurac\u00ed b\u011b\u017en\u011b p\u0159\u00edstupn\u00e9 v\u0161em v\u00fdvoj\u00e1\u0159\u016fm aplikace a data z produk\u010dn\u00edho serveru budou kompromitov\u00e1na. V\u0161echny konfigurace by m\u011bly b\u00fdt ulo\u017eeny p\u0159\u00edmo v syst\u00e9mu nasazen\u00ed (CI\/CD) a generov\u00e1ny pro r\u016fzn\u00e1 prost\u0159ed\u00ed s r\u016fzn\u00fdmi hodnotami nezbytn\u00fdmi pro konkr\u00e9tn\u00ed prost\u0159ed\u00ed pr\u00e1v\u011b v okam\u017eiku nasazen\u00ed.<\/p>\n<h4>4. Z\u00e1visl\u00e9 slu\u017eby (Backing Services)<\/h4>\n<p>\nTvrd\u011b se v\u00e1zat na prost\u0159ed\u00ed, pou\u017e\u00edvejte r\u016fzn\u00e1 p\u0159ipojen\u00ed pro stejn\u00e9 slu\u017eby v konkr\u00e9tn\u00edch prost\u0159ed\u00edch.<\/p>\n<p>Tento bod se ve skute\u010dnosti siln\u011b p\u0159ekr\u00fdv\u00e1 s bodem o konfigurac\u00edch, proto\u017ee bez existence tohoto bodu nelze vytvo\u0159it norm\u00e1ln\u00ed konfigura\u010dn\u00ed data a celkov\u011b mo\u017enost konfigurace zanikne.<\/p>\n<p>V\u0161echna p\u0159ipojen\u00ed k extern\u00edm slu\u017eb\u00e1m, jako jsou frontov\u00e9 servery, datab\u00e1ze, caching slu\u017eby, by m\u011bla b\u00fdt jednotn\u00e1 jak pro m\u00edstn\u00ed prost\u0159ed\u00ed, tak pro extern\u00ed\/prod prost\u0159ed\u00ed. Jin\u00fdmi slovy, mohu kdykoli zm\u011bnit p\u0159ipojovac\u00ed \u0159et\u011bzec a nahradit dotazy na datab\u00e1zi \u010d. 1 datab\u00e1z\u00ed \u010d. 2 bez zm\u011bny k\u00f3du aplikace. Nebo abych to p\u0159ehnal, jako p\u0159\u00edklad plat\u00ed, \u017ee p\u0159i \u0161k\u00e1lov\u00e1n\u00ed slu\u017eby nebudete muset pro dal\u0161\u00ed caching server ur\u010dovat p\u0159ipojen\u00ed n\u011bjak\u00fdm zvl\u00e1\u0161tn\u00edm zp\u016fsobem.<\/p>\n<h4>5. Sestaven\u00ed, vyd\u00e1n\u00ed, proveden\u00ed<\/h4>\n<p>\nM\u011bjte na serveru pouze fin\u00e1ln\u00ed verzi k\u00f3du, bez \u0161anc\u00ed vr\u00e1tit vyd\u00e1n\u00ed zp\u011bt. Nen\u00ed pot\u0159eba plnit diskov\u00fd prostor. Kdo si mysl\u00ed, \u017ee m\u016f\u017ee nasadit k\u00f3d do produkce s chybou, je \u0161patn\u00fd program\u00e1tor!<\/p>\n<p>V\u0161echny f\u00e1ze nasazen\u00ed by m\u011bly b\u00fdt mezi sebou odd\u011blen\u00e9.<\/p>\n<p>M\u011bjte mo\u017enost se vr\u00e1tit zp\u011bt. D\u011blejte vyd\u00e1n\u00ed s ulo\u017een\u00edm rychle dostupn\u00fdch star\u00fdch kopi\u00ed aplikace (ji\u017e sestaven\u00fdch a p\u0159ipraven\u00fdch k boji), abyste v p\u0159\u00edpad\u011b chyb mohli obnovit starou verzi. To znamen\u00e1, \u017ee je zde podm\u00edn\u011bn\u00e1 slo\u017eka <i>releases<\/i> a slo\u017eka <i>voltage<\/i>, a po \u00fasp\u011b\u0161n\u00e9m nasazen\u00ed a sestaven\u00ed se slo\u017eka <i>voltage<\/i> propoj\u00ed symbolick\u00fdm odkazem s nov\u00fdm vyd\u00e1n\u00edm, kter\u00e9 se nach\u00e1z\u00ed uvnit\u0159 <i>releases<\/i> s podm\u00edn\u011bn\u00fdm n\u00e1zvem \u010d\u00edsla vyd\u00e1n\u00ed. <\/p>\n<p>A zde si p\u0159ipomeneme Blue-Green nasazen\u00ed, kter\u00e9 umo\u017e\u0148uje nejen p\u0159ep\u00edn\u00e1n\u00ed mezi k\u00f3dem, ale tak\u00e9 p\u0159ep\u00edn\u00e1n\u00ed mezi v\u0161emi zdroji a dokonce prost\u0159ed\u00edmi s mo\u017enost\u00ed v\u0161echno vr\u00e1tit zp\u011bt.<\/p>\n<h4>6. Procesy<\/h4>\n<p>\nUlo\u017ete stavov\u00e1 data aplikace p\u0159\u00edmo v samotn\u00e9 aplikaci. Pou\u017e\u00edvejte relace v pam\u011bti aplikace. Vyu\u017e\u00edvejte co nejv\u00edce sd\u00edlen\u00fdch mezi extern\u00edmi slu\u017ebami. Omezte se na to, \u017ee aplikace m\u016f\u017ee m\u00edt pouze jeden proces a nedovolte mo\u017enost horizont\u00e1ln\u00edho \u0161k\u00e1lov\u00e1n\u00ed.<\/p>\n<p>Pokud jde o relace, uchov\u00e1vejte data pouze v cache \u0159\u00edzen\u00e9 extern\u00edmi slu\u017ebami (memcached, redis), t\u00edmto zp\u016fsobem, i kdy\u017e budete m\u00edt spu\u0161t\u011bno 20 proces\u016f aplikace, m\u016f\u017ee kter\u00fdkoli z nich, p\u0159istupuj\u00edc\u00ed k cache, pokra\u010dovat v pr\u00e1ci se z\u00e1kazn\u00edkem ve stejn\u00e9m stavu, v jak\u00e9m byl u\u017eivatel, kdy\u017e pracoval s aplikac\u00ed v jin\u00e9m procesu. Tento p\u0159\u00edstup zaru\u010duje, \u017ee bez ohledu na po\u010det kopi\u00ed extern\u00edch slu\u017eeb, v\u0161e bude fungovat spr\u00e1vn\u011b a bez probl\u00e9m\u016f s p\u0159\u00edstupem k dat\u016fm.<\/p>\n<h4>7. Zav\u00e1z\u00e1n\u00ed port\u016f (Port binding)<\/h4>\n<p>\nJak pracovat s extern\u00edmi slu\u017ebami by m\u011bl zn\u00e1t pouze webov\u00fd server. Je\u0161t\u011b l\u00e9pe je spou\u0161t\u011bt extern\u00ed slu\u017eby p\u0159\u00edmo uvnit\u0159 webov\u00e9ho serveru. Nap\u0159\u00edklad jako PHP modul v Apachi.<br \/>\nV\u0161echny va\u0161e slu\u017eby by m\u011bly b\u00fdt navz\u00e1jem p\u0159\u00edstupn\u00e9 prost\u0159ednictv\u00edm n\u011bjak\u00e9 adresy a portu (localhost:5432, localhost:3000, nginx:80, php-fpm:9000), tedy z nginx m\u00e1m p\u0159\u00edstup jak k php-fpm, tak k postgres, a z php-fpm k postgres a nginx, a vlastn\u011b z ka\u017ed\u00e9 slu\u017eby m\u00e1m p\u0159\u00edstup k jin\u00e9 slu\u017eb\u011b. T\u00edmto zp\u016fsobem je \u017eivotaschopnost jedn\u00e9 slu\u017eby nez\u00e1visl\u00e1 na \u017eivotaschopnosti jin\u00e9 slu\u017eby.<\/p>\n<h4>8. Paralelismus<\/h4>\n<p>\nPracujte s jedn\u00edm procesem, jinak by n\u011bkolik proces\u016f nemuselo spolupracovat! <\/p>\n<p>Nechte mo\u017enost \u0161k\u00e1lov\u00e1n\u00ed. V\u00fdborn\u011b pro to poslou\u017e\u00ed docker swarm. <br \/>\nDocker Swarm je n\u00e1stroj pro vytv\u00e1\u0159en\u00ed a spr\u00e1vu cluster\u016f kontejner\u016f jak mezi r\u016fzn\u00fdmi stroji, tak i mezi mno\u017estv\u00edm kontejner\u016f na jednom stroji.<\/p>\n<p>Pomoc\u00ed swarmu mohu ur\u010dit, kolik zdroj\u016f budu p\u0159id\u011blovat ka\u017ed\u00e9mu procesu a kolik proces\u016f jedn\u00e9 a t\u00e9\u017ee slu\u017eby budu spou\u0161t\u011bt. Vnit\u0159n\u00ed vyrovn\u00e1va\u010d z\u00e1t\u011b\u017ee, p\u0159i\u010dem\u017e p\u0159ij\u00edm\u00e1 data na ur\u010den\u00e9m portu, je automaticky p\u0159esm\u011brov\u00e1v\u00e1 na procesy. Tak\u017ee pokud zjist\u00edm, \u017ee z\u00e1t\u011b\u017e serveru vzrostla, mohu p\u0159idat v\u00edce proces\u016f a t\u00edm sn\u00ed\u017eit z\u00e1t\u011b\u017e na ur\u010dit\u00e9 procesy.<\/p>\n<h4>9. Odstranitelnost (Disposability)<\/h4>\n<p>\nNepou\u017e\u00edvejte fronty pro pr\u00e1ci s procesy a daty. Ukon\u010den\u00ed jednoho procesu by m\u011blo ovlivnit fungov\u00e1n\u00ed cel\u00e9 aplikace. Pokud sel\u017ee jedna slu\u017eba, sel\u017ee v\u0161echno.<\/p>\n<p>Ka\u017ed\u00fd proces a slu\u017eba mohou b\u00fdt kdykoliv vypnuty, a to by nem\u011blo ovlivnit jin\u00e9 slu\u017eby (nejde samoz\u0159ejm\u011b o to, \u017ee slu\u017eba nebude dostupn\u00e1 pro jinou slu\u017ebu, ale o to, \u017ee jin\u00e1 slu\u017eba se po t\u00e9to neukon\u010d\u00ed). V\u0161echny procesy by m\u011bly kon\u010dit jemn\u011b, tak, aby p\u0159i jejich ukon\u010den\u00ed nedo\u0161lo k po\u0161kozen\u00ed dat a p\u0159i dal\u0161\u00edm spu\u0161t\u011bn\u00ed syst\u00e9m pracoval spr\u00e1vn\u011b. To znamen\u00e1, \u017ee i v p\u0159\u00edpad\u011b havarijn\u00edho ukon\u010den\u00ed by data nem\u011bla b\u00fdt ohrozena (vhodn\u00fd mechanismus jsou transakce, dotazy do datab\u00e1ze pracuj\u00ed pouze ve skupin\u00e1ch, a pokud alespo\u0148 jeden dotaz ze skupiny neprob\u011bhne nebo prob\u011bhne s chybou, \u017e\u00e1dn\u00fd jin\u00fd dotaz ze skupiny se nakonec skute\u010dn\u011b neprovede).<\/p>\n<h4>10. Parita v\u00fdvoje\/provozu aplikace<\/h4>\n<p>\nProduk\u010dn\u00ed, stagingov\u00e1 a lok\u00e1ln\u00ed verze aplikace by m\u011bly b\u00fdt rozd\u00edln\u00e9. Na produkci m\u00e1me framework Yii Lite a lok\u00e1ln\u011b Yii, abychom m\u011bli na produkci rychlej\u0161\u00ed chod!<\/p>\n<p>Ve skute\u010dnosti by v\u0161echna nasazen\u00ed a pr\u00e1ce s k\u00f3dem m\u011bly prob\u00edhat v t\u00e9m\u011b\u0159 identick\u00e9m prost\u0159ed\u00ed (nejde o fyzick\u00fd hardware). Tak\u00e9 nasazen\u00ed k\u00f3du na produkci by m\u011bl b\u00fdt schopen prov\u00e9st kdokoliv z v\u00fdvojov\u00e9ho t\u00fdmu, a ne pouze speci\u00e1ln\u011b vy\u0161kolen\u00fd devops t\u00fdm, kter\u00fd pouze d\u00edky zvl\u00e1\u0161tn\u00ed s\u00edle m\u016f\u017ee nasadit aplikaci na produkci.<\/p>\n<p>Toto n\u00e1m tak\u00e9 pom\u00e1h\u00e1 Docker. P\u0159i dodr\u017een\u00ed v\u0161ech p\u0159edchoz\u00edch bod\u016f povede pou\u017e\u00edv\u00e1n\u00ed Dockeru proces nasazen\u00ed prost\u0159ed\u00ed jak na produkci, tak na lok\u00e1ln\u00edm stroji k zad\u00e1n\u00ed jedn\u00e9 nebo dvou p\u0159\u00edkaz\u016f.<\/p>\n<h4>11. Logov\u00e1n\u00ed (Logs)<\/h4>\n<p>\nLogy p\u00ed\u0161eme do soubor\u016f a datab\u00e1ze! Soubory a datab\u00e1ze od log\u016f ne\u010dist\u00edme. Koup\u00edme prost\u011b pevn\u00fd disk na 9000 Petabyte a hotovo.<\/p>\n<p>V\u0161echny logy by m\u011bly b\u00fdt pova\u017eov\u00e1ny za proud ud\u00e1lost\u00ed. Aplikace by se nem\u011bla zab\u00fdvat zpracov\u00e1n\u00edm log\u016f. Logy by m\u011bly b\u00fdt vypisov\u00e1ny bu\u010f do stdout, nebo zas\u00edl\u00e1ny pomoc\u00ed protokolu, jako je UDP, aby aplikaci pr\u00e1ce s logy nep\u016fsobila \u017e\u00e1dn\u00e9 probl\u00e9my. Na to je skv\u011bl\u00fd graylog. Graylog, p\u0159ij\u00edmaj\u00edc\u00ed v\u0161echny logy na UDP (u tohoto protokolu nen\u00ed pot\u0159eba \u010dekat na potvrzen\u00ed \u00fasp\u011b\u0161n\u00e9ho p\u0159ijet\u00ed paketu) nijak neovliv\u0148uje aplikaci a pouze se zab\u00fdv\u00e1 strukturac\u00ed a zpracov\u00e1n\u00edm log\u016f. Logika aplikace se nem\u011bn\u00ed pro pr\u00e1ci s takov\u00fdmi p\u0159\u00edstupy.<\/p>\n<h4>12. \u00dakoly administrace<\/h4>\n<p>\nPro aktualizaci dat, datab\u00e1ze atd. pou\u017eijte samostatn\u011b vytvo\u0159en\u00fd endpoint v API, jeho\u017e proveden\u00ed dvakr\u00e1t po sob\u011b by mohlo zp\u016fsobit, \u017ee se v\u00e1m v\u0161e zdubluje. Ale vy p\u0159ece nejste hloup\u00ed, nekliknete dvakr\u00e1t, a migrace n\u00e1m nejsou pot\u0159eba.<\/p>\n<p>V\u0161echny \u00fakoly administrace by m\u011bly b\u00fdt prov\u00e1d\u011bny ve stejn\u00e9m prost\u0159ed\u00ed jako cel\u00fd k\u00f3d, na \u00farovni releas\u016f. To znamen\u00e1, \u017ee pokud pot\u0159ebujeme zm\u011bnit strukturu datab\u00e1ze, nebudeme to d\u011blat ru\u010dn\u011b zm\u011bnou n\u00e1zv\u016f sloupc\u016f a p\u0159id\u00e1v\u00e1n\u00edm nov\u00fdch p\u0159es n\u011bjak\u00e9 vizu\u00e1ln\u00ed n\u00e1stroje pro spr\u00e1vu datab\u00e1ze. Na tyto v\u011bci vytv\u00e1\u0159\u00edme samostatn\u00e9 skripty \u2014 migrace, kter\u00e9 se prov\u00e1d\u011bj\u00ed v\u0161ude a ve v\u0161ech prost\u0159ed\u00edch se stejn\u00fdm a srozumiteln\u00fdm v\u00fdsledkem. Pro v\u0161echny ostatn\u00ed \u00fakoly, jako je napln\u011bn\u00ed projektu daty, by m\u011bly b\u00fdt aplikov\u00e1ny podobn\u00e9 metodologie.<\/p>\n<h3>P\u0159\u00edklad implementace na PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. V\u0161echny p\u0159\u00edklady byly vytvo\u0159eny na MacOS. V\u011bt\u0161ina z nich je pou\u017eiteln\u00e1 i pro Linux. U\u017eivatel\u00e9 Windows, omlouv\u00e1m se, ale na Windows jsem dlouho nepracoval.<\/p>\n<p>P\u0159edstavme si situaci, \u017ee na na\u0161em PC nen\u00ed nainstalov\u00e1na \u017e\u00e1dn\u00e1 verze PHP a vlastn\u011b nic jin\u00e9ho. <br \/>\nInstalujeme docker a docker-compose posledn\u00edch verz\u00ed. (to lze naj\u00edt na internetu)<\/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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Instalujeme <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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCo se t\u00fd\u010de Laradocku, \u0159eknu, \u017ee je to skv\u011bl\u00e1 v\u011bc, kter\u00e1 obsahuje spoustu kontejner\u016f a pomocn\u00fdch n\u00e1stroj\u016f. Ale pou\u017e\u00edvat Laradock bez \u00faprav na produkci \u2014 nedoporu\u010doval bych kv\u016fli jeho nadbyte\u010dnosti. Lep\u0161\u00ed je vytvo\u0159it si vlastn\u00ed kontejnery na z\u00e1klad\u011b p\u0159\u00edklad\u016f v Laradocku, tak bude mo\u017enost optimalizace, proto\u017ee nikomu nen\u00ed pot\u0159eba v\u0161e, co tam je, najednou.<\/p>\n<p>2. Konfigurujeme Laradock pro pr\u00e1ci na\u0161\u00ed aplikace.<\/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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Otev\u0159ete adres\u00e1\u0159 habr (rodi\u010dovsk\u00e1 slo\u017eka, do kter\u00e9 byl naklonov\u00e1n laradock) v jak\u00e9mkoli editoru. (V m\u00e9m p\u0159\u00edpad\u011b PHPStorm)<\/p>\n<p>V t\u00e9to f\u00e1zi nastav\u00edme pouze n\u00e1zev projektu.<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Spus\u0165te obraz workspace. (V\u00e1\u0161 obraz se n\u011bjakou dobu bude sestavovat)<br \/>\nWorkspace je speci\u00e1ln\u011b p\u0159ipraven\u00fd obraz pro pr\u00e1ci s r\u00e1mcem jm\u00e9nem v\u00fdvoj\u00e1\u0159e.<\/p>\n<p>P\u0159ejd\u011bte dovnit\u0159 kontejneru pomoc\u00ed <\/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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Nainstalujte 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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Po instalaci zkontrolujte, zda byla vytvo\u0159ena slo\u017eka s projektem, a ukon\u010dete compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Vra\u0165te se zp\u011bt do PHPStorm a nastavte spr\u00e1vnou cestu k na\u0161emu laravel aplikaci v souboru .env.<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. P\u0159id\u00e1me cel\u00fd k\u00f3d do Gitu.<\/p>\n<p>K tomu vytvo\u0159\u00edme na Githubu (nebo kdekoli jinde) repozit\u00e1\u0159. Otev\u0159eme termin\u00e1l ve slo\u017ece habr a vykon\u00e1me n\u00e1sleduj\u00edc\u00ed 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 # zde bude odkaz na v\u00e1\u0161 repo\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nZkontrolujte, jestli je v\u0161echno v po\u0159\u00e1dku. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPro pohodl\u00ed doporu\u010duji pou\u017e\u00edt n\u011bjak\u00e9 vizu\u00e1ln\u00ed rozhran\u00ed pro Git, v m\u00e9m p\u0159\u00edpad\u011b je to <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (tady je referen\u010dn\u00ed odkaz)<\/p>\n<p>4. Spus\u0165te!<\/p>\n<p>P\u0159ed spu\u0161t\u011bn\u00edm se ujist\u011bte, \u017ee na portech 80 a 443 nic neb\u011b\u017e\u00ed.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTak\u017ee n\u00e1\u0161 projekt se skl\u00e1d\u00e1 ze 3 samostatn\u00fdch slu\u017eeb:<\/p>\n<ul>\n<li>nginx \u2014 webov\u00fd server<\/li>\n<li>php-fpm \u2014 php pro p\u0159\u00edjem po\u017eadavk\u016f z webov\u00e9ho serveru<\/li>\n<li>workspace \u2014 php pro v\u00fdvoj\u00e1\u0159e<\/li>\n<\/ul>\n<p>\nV tuto chv\u00edli jsme dos\u00e1hli toho, \u017ee jsme vytvo\u0159ili aplikaci odpov\u00eddaj\u00edc\u00ed ji\u017e 4 bod\u016fm z 12, konkr\u00e9tn\u011b:<\/p>\n<p>1. <b>Z\u00e1klad k\u00f3du<\/b> \u2014 v\u0161echen k\u00f3d je v jedn\u00e9 repozit\u00e1\u0159i (mal\u00e1 pozn\u00e1mka: mo\u017en\u00e1 by bylo spr\u00e1vn\u00e9 um\u00edstit docker dovnit\u0159 projektu laravel, ale to nen\u00ed z\u00e1sadn\u00ed).<\/p>\n<p>2. <b>Z\u00e1vislosti<\/b> \u2014 V\u0161echny na\u0161e z\u00e1vislosti jsou jasn\u011b uvedeny v application\/composer.json a v ka\u017ed\u00e9m Dockerfile ka\u017ed\u00e9ho kontejneru.<\/p>\n<p>3. <b>Extern\u00ed slu\u017eby (Backing Services)<\/b> \u2014 Ka\u017ed\u00e1 z slu\u017eeb (php-fpm, nginx, workspace) \u017eije sv\u00fdm vlastn\u00edm \u017eivotem a je p\u0159ipojena zven\u010d\u00ed, a p\u0159i pr\u00e1ci s jednou slu\u017ebou, druh\u00e1 nebude ovlivn\u011bna.<\/p>\n<p>4. <b>Procesy<\/b> \u2014 ka\u017ed\u00e1 slu\u017eba je jeden proces. Ka\u017ed\u00e1 ze slu\u017eeb neuchov\u00e1v\u00e1 vnit\u0159n\u00ed stav.<\/p>\n<p>5.<b> P\u0159ipojen\u00ed port\u016f (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak vid\u00edme, ka\u017ed\u00e1 slu\u017eba b\u011b\u017e\u00ed na sv\u00e9m vlastn\u00edm portu a je dostupn\u00e1 pro v\u0161echny ostatn\u00ed slu\u017eby.<\/p>\n<p>6.<b> Paralelismus <\/b><\/p>\n<p>Docker n\u00e1m umo\u017e\u0148uje spou\u0161t\u011bt n\u011bkolik proces\u016f stejn\u00e9 slu\u017eby s automatickou vyrovn\u00e1vac\u00ed z\u00e1t\u011b\u017e\u00ed mezi nimi. <\/p>\n<p>Zastav\u00edme kontejnery a spust\u00edme je pomoc\u00ed p\u0159\u00edznaku <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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak vid\u00edme, u php-fpm kontejneru se vytvo\u0159ily kopie. V pr\u00e1ci s t\u00edmto kontejnerem nemus\u00edme nic m\u011bnit. I nad\u00e1le se k n\u011bmu obrac\u00edme p\u0159es port 9000 a Docker za n\u00e1s reguluje z\u00e1t\u011b\u017e mezi kontejnery.<\/p>\n<p>7. <b>Zlikvidovatelnost (Disposability)<\/b> \u2014 ka\u017ed\u00fd kontejner lze zab\u00edt bez \u0161kody pro ostatn\u00ed. Zastaven\u00ed nebo restart kontejneru nijak neovlivn\u00ed pr\u00e1ci aplikace p\u0159i n\u00e1sleduj\u00edc\u00edch spu\u0161t\u011bn\u00edch. Ka\u017ed\u00fd kontejner lze tak\u00e9 znovu spustit kdykoliv.<\/p>\n<p>8. <b>Parita v\u00fdvoje\/produkce aplikace<\/b> \u2014 v\u0161echna na\u0161e prost\u0159ed\u00ed jsou shodn\u00e1. P\u0159i spu\u0161t\u011bn\u00ed syst\u00e9mu na serveru v produkci nebudete muset nic m\u011bnit ve va\u0161ich p\u0159\u00edkazech. V\u0161echno bude p\u0159esn\u011b tak, jak je to zalo\u017eeno na Dockeru.<\/p>\n<p>9. <b>Logov\u00e1n\u00ed (Logs)<\/b> \u2014 v\u0161echny logy v t\u011bchto kontejnerech vych\u00e1zej\u00ed na stream a jsou viditeln\u00e9 v konzoli Dockeru. (v tomto p\u0159\u00edpad\u011b, ve skute\u010dnosti, s jin\u00fdmi vlastn\u00edm kontejnery, to m\u016f\u017ee b\u00fdt jinak, pokud se o to nepostar\u00e1te)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAle je tu h\u00e1\u010dek v tom, \u017ee v\u00fdchoz\u00ed hodnoty v PHP a Nginxu tak\u00e9 zapisuj\u00ed logy do souboru. Abychom splnili 12 faktor\u016f, je nutn\u00e9 <b>vypnout<\/b> z\u00e1znam log\u016f do souboru v konfigurac\u00edch ka\u017ed\u00e9ho kontejneru zvl\u00e1\u0161\u0165.<\/p>\n<p>Docker tak\u00e9 poskytuje mo\u017enost sm\u011brovat logy nejen do stdout, ale i do takov\u00fdch v\u011bc\u00ed, jako je graylog, o kter\u00e9m jsem zm\u00ednil v\u00fd\u0161e. A uvnit\u0159 graylogu m\u016f\u017eeme manipulovat s logy jak chceme a na\u0161e aplikace si toho v\u016fbec nev\u0161imne.<\/p>\n<p>10. <b>Administrativn\u00ed \u00fakoly<\/b> \u2014 v\u0161echny \u00fakoly spr\u00e1vy jsou vy\u0159e\u0161eny pomoc\u00ed Laravelu d\u00edky n\u00e1stroji Artisan p\u0159esn\u011b tak, jak to cht\u011bli tv\u016frci 12 faktorov\u00e9 aplikace.<\/p>\n<p>Jako p\u0159\u00edklad uk\u00e1\u017eu, jak se prov\u00e1d\u011bj\u00ed n\u011bkter\u00e9 p\u0159\u00edkazy.<br \/>\nVstoup\u00edme do kontejneru.<\/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 aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNyn\u00ed m\u016f\u017eeme vyu\u017e\u00edt jak\u00fdkoliv p\u0159\u00edkaz. (v\u0161imn\u011bte si, \u017ee jsme nenastavili datab\u00e1zi a cache, proto polovina p\u0159\u00edkaz\u016f nebude spr\u00e1vn\u011b fungovat, proto\u017ee jsou ur\u010deny k pr\u00e1ci s cache a datab\u00e1z\u00ed).<\/p>\n<p><img decoding=\"async\" alt=\"V\u00fdvoj aplikac\u00ed a Blue-Green deployment na z\u00e1klad\u011b metodologie The Twelve-Factor App s p\u0159\u00edklady v PHP a Dockeru.\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigurace<\/b> a 12. <b>Sestaven\u00ed, release, prov\u00e1d\u011bn\u00ed<\/b><\/p>\n<p>Tuto \u010d\u00e1st jsem cht\u011bl v\u011bnovat Blue-Green Deployment, ale uk\u00e1zalo se, \u017ee je to p\u0159\u00edli\u0161 rozvinut\u00e9 pro tento \u010dl\u00e1nek. O tom nap\u00ed\u0161u samostatn\u00fd \u010dl\u00e1nek. <\/p>\n<p>Ve zkratce, koncept je postaven na syst\u00e9mech CI\/CD typu <b>Jenkins<\/b> a <b>Gitlab CI<\/b>. V obou lze nastavit prom\u011bnn\u00e9 prost\u0159ed\u00ed spojen\u00e9 s konkr\u00e9tn\u00edm prost\u0159ed\u00edm. T\u00edm p\u00e1dem se v takov\u00e9m p\u0159\u00edpad\u011b vykon\u00e1 bod s <b>Konfiguracemi<\/b>.<\/p>\n<p>A bod o <b>Sestaven\u00ed, release, prov\u00e1d\u011bn\u00ed<\/b> \u0159e\u0161\u00ed vestav\u011bn\u00e9 funkce v obou n\u00e1stroj\u00edch s n\u00e1zvem <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> umo\u017e\u0148uje rozd\u011blit proces nasazen\u00ed na mnoho f\u00e1z\u00ed, vy\u010dle\u0148uj\u00edc\u00ed f\u00e1ze sestaven\u00ed, uvoln\u011bn\u00ed a proveden\u00ed. V Pipeline tak\u00e9 m\u016f\u017eete vytv\u00e1\u0159et z\u00e1lohy, a vlastn\u011b cokoliv jin\u00e9ho. Tento n\u00e1stroj m\u00e1 neomezen\u00fd potenci\u00e1l.<\/p>\n<p>K\u00f3d aplikace se nach\u00e1z\u00ed na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nNezapome\u0148te inicializovat submodul p\u0159i klonov\u00e1n\u00ed tohoto repozit\u00e1\u0159e.<\/p>\n<p>P.S.: V\u0161echny tyto p\u0159\u00edstupy lze pou\u017e\u00edvat s jak\u00fdmikoli jin\u00fdmi n\u00e1stroji a programovac\u00edmi jazyky. Hlavn\u00ed je, aby podstata z\u016fstala stejn\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.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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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 aplikac\u00ed a Blue-Green deployment zalo\u017een\u00fd na metodologii The Twelve-Factor App s p\u0159\u00edklady v php a docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}