{"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\/hr\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Za po\u010detak, malo teorije. \u0160to je <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nJednostavnim re\u010dima, ovo je dokument koji ima za cilj pojednostaviti razvoj SaaS aplikacija, poma\u017ee tako \u0161to informira programere i DevOps in\u017eenjere o problemima i praksama koji su se naj\u010de\u0161\u0107e susretali u razvoju modernih aplikacija. <\/p>\n<p>Dokument je sastavljen od strane developera platforme Heroku.<\/p>\n<p>Metodologija dvanaest faktora (The Twelve-Factor App) mo\u017ee se primeniti na aplikacije napisane na bilo kojem programskom jeziku i koriste\u0107i bilo koje kombinacije eksternih usluga (backing services) (baze podataka, redovi poruka, predmemorije itd.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Ukratko o samim faktorima na kojima se bazira ova metodologija:<\/h3>\n<p><\/p>\n<ol>\n<li><b>K\u00f4dna baza<\/b> \u2013 Jedna k\u00f4dna baza koja se prati u sistemu kontrole verzija, \u2013 vi\u0161e implementacija <\/li>\n<li><b>Ovisnosti<\/b> \u2013 Jasno deklarirajte i izolujte zavisnosti<\/li>\n<li><b>Konfiguracija<\/b> \u2013 \u010cuvajte konfiguraciju u okru\u017eenju izvr\u0161avanja<\/li>\n<li><b>Eksterne usluge (Backing Services)<\/b> \u2013 Smatrajte eksterne usluge (backing services) povezanim resursima<\/li>\n<li><b>Izgradnja, izdanje, izvr\u0161avanje<\/b> \u2013 Strogo razdvojite faze izgradnje i izvr\u0161avanja<\/li>\n<li><b>Procesi<\/b> \u2013 Pokrenite aplikaciju kao jedan ili vi\u0161e procesa koji ne zadr\u017eavaju unutra\u0161nje stanje (stateless) <\/li>\n<li><b>Veza portova (Port binding)<\/b> \u2013 Izvezite servise putem vezivanja portova <\/li>\n<li><b>Paralelizam<\/b> \u2013 Skalirajte aplikaciju kori\u0161\u0107enjem procesa <\/li>\n<li><b>Zbrinjavanje (Disposability)<\/b> \u2013 Maksimizujte pouzdanost brzim pokretanjem i pravilnim zavr\u0161etkom rada <\/li>\n<li><b>Paritet razvoja\/rada aplikacije<\/b> \u2013 Odr\u017eavajte okru\u017eenja za razvoj, staging i proizvodnju \u0161to sli\u010dnijim <\/li>\n<li><b>Evidentiranje (Logs)<\/b> \u2013 Razmatrajte dnevnik kao tok doga\u0111aja<\/li>\n<li><b>Administrativni zadaci<\/b> \u2013 Izvr\u0161avajte administrativne\/zadate zadatke putem jednokratnih procesa <\/li>\n<\/ol>\n<p>\n<b>Vi\u0161e informacija o 12 faktora mo\u017eete dobiti iz slede\u0107ih resursa:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Slu\u017ebeni izvor<\/a><\/noindex> \u2014 obavezno za \u010ditanje<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">\u010clanak na habr. Aplikacija dvanaest faktora \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 slu\u017ebeni prevod<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">\u010clanak na habr. 7 nedostaju\u0107ih faktora u pristupu 12 Factor App<\/a><\/noindex> \u2014 sve\u017e pogled na 12 faktora s ciljem unapre\u0111enja.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u0160ta je Blue-Green deployment?<\/h3>\n<p>\nBlue-Green deployment \u2013 to je na\u010din isporuke aplikacije na <b>production<\/b> tako da krajnji klijent ne primje\u0107uje nikakve promjene s njegove strane. Drugim rije\u010dima, implementacija aplikacije bez <b>prekida rada<\/b>.<\/p>\n<p>Klasi\u010dna shema BG Deploy izgleda kao \u0161to je prikazano na slici ispod. <\/p>\n<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Na po\u010detku postoje 2 fizi\u010dka servera s potpuno istim kodom, aplikacijom, projektom, i postoji usmjeriva\u010d (balansador). <\/li>\n<li>U prvom trenutku usmjeriva\u010d preusmjerava sve zahtjeve na jedan od servera (<b>zelena<\/b>). <\/li>\n<li>U trenutku kada je potrebno ponovno u\u010diniti izdanja, cijeli projekt se a\u017eurira na drugom serveru (<b>plava<\/b>), koji u ovom trenutku ne obra\u0111uje nikakve zahtjeve. <\/li>\n<li>Nakon \u0161to je kod na <b>plavom<\/b> serveru potpuno a\u017euriran, usmjeriva\u010du se daje komanda da se prebaciti s <b>zelenog<\/b> na <b>plava<\/b> server. <\/li>\n<li>Sada svi klijenti vide rezultate rada koda s <b>plavog<\/b> poslu\u017eitelja. <\/li>\n<li> Neko vrijeme, <b>zelena<\/b> server slu\u017ei kao rezervna kopija u slu\u010daju neuspjelog implementiranja na <b>plava<\/b> server, a u slu\u010daju neuspjeha i gre\u0161aka, usmjeriva\u010d ponovno prebacuje tok korisnika nazad na <b>zelena<\/b> server sa starom stabilnom verzijom, a novi kod se \u0161alje na doradu i testiranje.<\/li>\n<li>I na kraju procesa, na isti na\u010din se a\u017eurira <b>zelena<\/b> server. I nakon njegovog a\u017euriranja, usmjeriva\u010d prebacuje tok zahtjeva nazad na <b>zelena<\/b> server.<\/li>\n<\/ul>\n<p>\nSve to izgleda vrlo dobro i na prvi pogled ne bi trebalo biti nikakvih problema.<br \/>\nAli budu\u0107i da \u017eivimo u modernom svijetu, opcija s fizi\u010dkim prebacivanjem kao \u0161to je prikazano u klasi\u010dnoj shemi nam ne odgovara. Informaciju za sada zadr\u017eite, vratit \u0107emo se njoj kasnije.<\/p>\n<h3>Lo\u0161i i dobri savjeti<\/h3>\n<p>\n<i>Odricanje<\/i>: U primjerima ispod navedeni su alati \/ metodologije koje ja koristim, mo\u017eete koristiti apsolutno bilo koje alternative sli\u010dnih funkcija. <\/p>\n<p>Ve\u0107ina primjera \u0107e se na ovaj ili onaj na\u010din preklapati s web razvojem (iznena\u0111enje), s PHP-om i Dockerom.<\/p>\n<p>U to\u010dkama ispod ide jednostavan prakti\u010dan opis kori\u0161tenja faktora na odre\u0111enim primjerima, ako \u017eelite dobiti vi\u0161e teorije na ovu temu, obratite se putem linkova iznad na izvor. <\/p>\n<h4>1. Kodna baza<\/h4>\n<p>\nKoristite FTP i FileZilla za preno\u0161enje datoteka na servere jedna po jedna, ne \u010duvajte kod nigdje osim na proizvodnom serveru.<\/p>\n<p>U projektu uvijek mora postojati jedinstvena kodna baza, odnosno, sav kod dolazi iz jedne <b>Git<\/b> repo. Serveri (production, staging, test1, test2 &#8230;) koriste kod iz grana jednog zajedni\u010dkog repozitorija. Na taj na\u010din posti\u017eemo konzistentnost koda.<\/p>\n<h4>2. Ovisnosti<\/h4>\n<p>\nPreuzmite sve biblioteke u mape direktno u korijen projekta. A\u017euriranja radite jednostavnim premje\u0161tanjem novog koda u mapu s trenutnom verzijom biblioteke. Instalirajte sve potrebne alate direktno na hosting poslu\u017eitelj gdje radi jo\u0161 20 usluga.<\/p>\n<p>Projekt uvijek treba imati jasno definiranu listu ovisnosti (pod ovisnostima tako\u0111er smatram i okru\u017eenje). Sve ovisnosti moraju biti jasno definirane i izolirane. <br \/>\nKao primjer uzmimo <b>Composer<\/b> i <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 paketni menad\u017eer koji omogu\u0107uje instaliranje PHP biblioteka. Composer omogu\u0107ava strogo ili nestriktno odre\u0111ivanje verzija, i njihovo jasno definiranje. Na poslu\u017eitelju mo\u017ee biti 20 razli\u010ditih projekata, a svaki ima svoju osobnu listu paketa i biblioteka neovisnu o drugima.<\/p>\n<p><b>Docker<\/b> \u2014 alat koji omogu\u0107uje definiranje i izoliranje okru\u017eenja u kojem \u0107e aplikacija raditi. Stoga, sli\u010dno kao i s composerom, ali ve\u0107 detaljnije, mo\u017eemo odrediti s \u010dim aplikacija radi. Odabrati odre\u0111enu verziju PHP-a, instalirati samo potrebne pakete za rad projekta, ne dodaju\u0107i ni\u0161ta suvi\u0161no. A najva\u017enije, ne preklapaju\u0107i se s paketima i okru\u017eenjem host ma\u0161ine i drugih projekata. Dakle, svi projekti na poslu\u017eitelju radni kroz Docker mogu koristiti apsolutno bilo kakav skup paketa i potpuno razli\u010dito okru\u017eenje.<\/p>\n<h4>3. Konfiguracija<\/h4>\n<p>\n\u010cuvajte konfiguracije kao konstante direktno u kodu. Odvojene konstante za testni poslu\u017eitelj, odvojene za produkciju. Ve\u017eite rad aplikacije ovisno o okru\u017eenju direktno u poslovnoj logici projekta koriste\u0107i if else konstrukcije.<\/p>\n<p><b>Konfiguracije<\/b> \u2014 to je jedina stvar po kojoj se trebaju razlikovati implementacije projekta (deployment). U idealnom slu\u010daju, konfiguracije bi trebale biti proslije\u0111ene putem varijabli okru\u017eenja (env vars). <\/p>\n<p>To zna\u010di da \u010dak i ako \u0107ete \u010duvati nekoliko konfiguracijskih datoteka .config.prod, .config.local i preimenovati ih u trenutku implementacije u .config (glavna konfiguracija iz koje aplikacija \u010dita podatke) \u2014 to ne\u0107e biti ispravan pristup, jer \u0107e u tom slu\u010daju informacije iz konfiguracija biti javno dostupne svim programerima aplikacije, a podaci s produkcijskog servera \u0107e biti kompromitirani. Sve konfiguracije moraju se \u010duvati izravno u sustavu implementacije (CI\/CD) i generirati za razli\u010dita okru\u017eenja s razli\u010ditim vrijednostima potrebnim za konkretno okru\u017eenje upravo u trenutku implementacije.<\/p>\n<h4>4. Vanjske usluge (Backing Services)<\/h4>\n<p>\n\u010cvrsto se oslanjajte na okru\u017eenje, koristite razli\u010dite veze za iste usluge u odre\u0111enim okru\u017eenjima.<\/p>\n<p>Zapravo, ova to\u010dka se zna\u010dajno preklapa s to\u010dkom o konfiguracijama, jer bez postojanja ove to\u010dke ne mo\u017eete napraviti normalne konfiguracijske podatke i uop\u0107e mogu\u0107nost konfiguriranja bi pala.<\/p>\n<p>Sve veze do vanjskih usluga, poput servera za redove, baza podataka, usluga za predmemoriju, trebaju biti jedinstvene za lokalno okru\u017eenje kao i za vanjsko \/ produkcijsko okru\u017eenje. Drugim rije\u010dima, u bilo kojem trenutku mogu promijeniti vezu zamjenom upita na bazu #1 s bazom #2 bez promjene koda aplikacije. Ili, ako unaprijed dam primjer, bit \u0107e korisno da prilikom skaliranja usluge, ne\u0107ete morati posebno navoditi vezu za dodatni server predmemorije.<\/p>\n<h4>5. Sklapanje, objavljivanje, izvr\u0161avanje<\/h4>\n<p>\nNa serveru imajte samo kona\u010dnu verziju koda, bez mogu\u0107nosti vra\u0107anja objave unatrag. Ne trebate zauzimati prostor na disku. Tko misli da mo\u017ee pustiti kod u produkciju s gre\u0161kom, lo\u0161 je programer!<\/p>\n<p>Sve faze implementacije moraju biti me\u0111usobno razdvojene.<\/p>\n<p>Imajte mogu\u0107nost da se vratite unatrag. Radite objave uz \u010duvanje starih kopija aplikacije (ve\u0107 sastavljenih i spremnih za rad) u brzom pristupu, kako biste u slu\u010daju gre\u0161aka mogli obnoviti staru verziju. Dakle, uvjetno re\u010deno, postoji mapa <i>releases<\/i> i mapa <i>current<\/i>, a nakon uspje\u0161ne implementacije i sastavljanja mapa <i>current<\/i> se povezuje simboli\u010dkom vezom s novom objavom koja se nalazi unutar <i>releases<\/i> s uvjetnim nazivom broja objave. <\/p>\n<p>Ovdje se prisje\u0107amo Blue-Green implementacije, koja omogu\u0107uje ne samo prebacivanje izme\u0111u koda, ve\u0107 i prebacivanje izme\u0111u svih resursa i \u010dak okru\u017eenja uz mogu\u0107nost povratka na prethodno stanje.<\/p>\n<h4>6. Procesi<\/h4>\n<p>\nDr\u017eite podatke o stanjima aplikacije izravno unutar same aplikacije. Koristite sesije u RAM-u same aplikacije. Iskoristite \u0161to vi\u0161e dijeljenih izme\u0111u vanjskih usluga. Oslonite se na to da aplikacija mo\u017ee imati samo jedan proces i ne dopu\u0161tajte mogu\u0107nost skaliranja.<\/p>\n<p>\u0160to se ti\u010de sesija, pohranjujte podatke samo u predmemoriji koju kontroliraju vanjske usluge (memcached, redis), na taj na\u010din, \u010dak i ako imate 20 pokrenutih procesa aplikacije, bilo koji od njih, pristupaju\u0107i predmemoriji, mo\u017ee nastaviti raditi s klijentom u istom stanju u kojem je korisnik radio s aplikacijom u drugom procesu. Ovim pristupom, bez obzira na broj kopija vanjskih usluga koje koristite, sve \u0107e raditi normalno i bez problema s pristupom podacima.<\/p>\n<h4>7. Veza portova (Port binding)<\/h4>\n<p>\nSamo web server treba znati kako raditi s vanjskim uslugama. Jo\u0161 bolje, podignite vanjske usluge unutar web servera. Na primjer, kao PHP modul u Apacheu.<br \/>\nSve va\u0161e usluge trebaju biti dostupne jedna drugoj putem pristupa nekoj adresi i portu (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), \u0161to zna\u010di da iz nginx-a mogu pristupiti i php-fpm i postgres, a iz php-fpm do postgres-a i nginx-a, a zapravo iz svake usluge mogu pristupiti drugoj usluzi. Na taj na\u010din, odr\u017eivost usluge nije povezana s odr\u017eivo\u0161\u0107u druge usluge.<\/p>\n<h4>8. Paralelizam<\/h4>\n<p>\nRadite s jednim procesom, jer bi odjednom vi\u0161e procesa moglo imati problema u me\u0111usobnoj komunikaciji! <\/p>\n<p>Ostavite mogu\u0107nost skaliranja. Docker swarm je za to odli\u010dan. <br \/>\nDocker Swarm je alat za izradu i upravljanje klasterima kontejnera, kako izme\u0111u razli\u010ditih ma\u0161ina tako i brojnim kontejnerima na jednoj ma\u0161ini.<\/p>\n<p>Kori\u0161tenjem swarma mogu odrediti koliko resursa \u0107u dodijeliti svakom procesu i koliko \u0107u procesa iste usluge pokrenuti, a unutarnji balansirnik, primaju\u0107i podatke na zadanoj luci, automatski \u0107e ih proslijediti procesima. Tako, kada primijetim da je optere\u0107enje na poslu\u017eitelju poraslo, mogu dodati vi\u0161e procesa, \u010dime \u0107u smanjiti optere\u0107enje na odre\u0111enim procesima.<\/p>\n<h4>9. Odgojivost (Disposability)<\/h4>\n<p>\nNe koristite redove za rad s procesima i podacima. Ubijanje jednog procesa treba utjecati na rad cijele aplikacije. Ako jedna usluga padne \u2014 sve pada.<\/p>\n<p>Svaki proces i usluga mogu biti isklju\u010deni u bilo kojem trenutku, a to ne bi smjelo utjecati na druge usluge (naravno, to ne zna\u010di da usluga ne\u0107e biti dostupna drugoj usluzi, ve\u0107 da druga usluga ne\u0107e prestati raditi nakon tog). Svi procesi trebaju se zavr\u0161iti nje\u017eno, tako da pri njihovom zavr\u0161etku podaci ne budu o\u0161te\u0107eni i da \u0107e sustav ispravno raditi prilikom sljede\u0107eg uklju\u010divanja. To zna\u010di da \u010dak i u slu\u010daju neo\u010dekivanog zavr\u0161etka, podaci ne bi trebali biti o\u0161te\u0107eni (ovdje se mo\u017ee primijeniti mehanizam transakcija, zahtjevi za bazom podataka rade samo u grupama, a ako nijedan zahtjev iz grupe nije uspio ili je postojao neki problem s tim, nijedan drugi zahtjev iz grupe u kona\u010dnici se ne izvr\u0161ava).<\/p>\n<h4>10. Paritet razvoja\/rada aplikacije<\/h4>\n<p>\nProducentska, staging i lokalna verzija aplikacije trebaju biti razli\u010dite. Na produku imamo Yii Lite framework, a lokalno Yii, da bi na produku radilo br\u017ee!<\/p>\n<p>U stvarnosti, sve implementacije i rad s kodom trebaju biti gotovo u identi\u010dnom okru\u017eenju (ne govorimo o fizi\u010dkom hardveru). Tako\u0111er, kod na produku treba mo\u0107i pokrenuti bilo koji \u010dlan tima za razvoj, a ne posebno obu\u010deni devops odjel, koji samo zahvaljuju\u0107i posebnoj snazi mo\u017ee pokrenuti aplikaciju u produkciji.<\/p>\n<p>Ovdje nam tako\u0111er poma\u017ee Docker. Uskla\u0111ivanjem svih prethodnih to\u010daka, kori\u0161tenje dockera \u0107e dovesti do procesa implementacije okru\u017eenja i na produkciji i na lokalnom stroju do upisa jedne ili dvije komande.<\/p>\n<h4>11. Bilje\u017eenje (Logs)<\/h4>\n<p>\nZapise pi\u0161emo u datoteke i bazu podataka! Datoteke i baza podataka od zapisa se ne \u010diste. Kupit \u0107emo jednostavno tvrdi disk od 9000 petabajta i to je to.<\/p>\n<p>Sve logove treba smatrati tokom doga\u0111aja. Aplikacija se ne bi trebala baviti obradom logova. Logovi bi trebali biti ispisani u stdout ili slani putem protokola kao \u0161to je udp, kako bi aplikaciji rad sa logovima ne stvarao nikakve probleme. Za to je Graylog dobar izbor. Graylog, koji prima sve logove putem udp-a (ovim protokolom nije potrebno \u010dekati odgovor o uspje\u0161nom prijemu paketa), na bilo koji na\u010din ne smeta aplikaciji i bavi se samo strukturiranjem i obradom logova. Logika aplikacije ne mijenja se za rad s ovakvim pristupima.<\/p>\n<h4>12. Administrativni zadaci<\/h4>\n<p>\nZa a\u017euriranje podataka, baza podataka itd. koristite zasebno stvoreni endpoint u API-ju, \u010dije izvo\u0111enje dva puta zaredom mo\u017ee rezultirati dupliciranjem podataka. Ali vi niste budale, ne\u0107ete kliknuti dva puta, a migracije nam nisu potrebne.<\/p>\n<p>Svi administrativni zadaci trebaju se izvoditi u istoj sredini kao i sav kod, na razini izdanja. Dakle, ako trebamo promijeniti strukturu baze podataka, ne\u0107emo to raditi ru\u010dno mijenjaju\u0107i nazive kolona i dodaju\u0107i nove putem nekih vizualnih alata za upravljanje bazom podataka. Za takve stvari stvaramo posebne skripte \u2013 migracije, koje se izvode svugdje i u svim okru\u017eenjima s istim i jasnim rezultatom. Za sve ostale zadatke, poput punjenja projekta podacima, trebaju se primijeniti sli\u010dne metodologije.<\/p>\n<h3>Primjer implementacije u PHP-u, Laravelu, Laradocku, Docker-Composeu<\/h3>\n<p>\nP.S. Svi primjeri su ra\u0111eni na MacOS-u. Ve\u0107ina odgovara i za Linux. Korisnici Windowsa, izvinjavam se, ali ja ve\u0107 dugo nisam radio s Windowsom.<\/p>\n<p>Zamislite situaciju da na na\u0161em PC-u nije instalirana nijedna verzija PHP-a i uop\u0107e ni\u0161ta nema. <br \/>\nInstaliramo docker i docker-compose najnovije verzije. (to mo\u017eete prona\u0107i 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=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Instaliramo <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=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160to se ti\u010de Laradock-a, mogu re\u0107i da je to jako sjajna stvar, u kojoj je okupljeno mnogo kontejnera i pomo\u0107nih alata. Me\u0111utim, koristiti Laradock bez modifikacija u produkciji \u2014 ne bih preporu\u010dio zbog njegove suvi\u0161nosti. Bolje je stvoriti vlastite kontejnere oslanjaju\u0107i se na primjere u Laradock-u, tako da \u0107e biti mjesta za optimizaciju, jer nikome nije potrebno sve \u0161to je tamo odjednom.<\/p>\n<p>2. Konfiguriramo Laradock za rad na\u0161e aplikacije.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Otvorite katalog habr (mati\u010dna mapa u koju je kloniran laradock) u nekom editoru. (U mom slu\u010daju PHPStorm)<\/p>\n<p>U ovoj fazi postavite samo naziv projektu.<\/p>\n<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Pokrenite sliku workspace. (U va\u0161em slu\u010daju slike \u0107e se neko vrijeme graditi)<br \/>\nWorkspace je posebno pripremljena slika za rad s okvirima u ime programera.<\/p>\n<p>U\u0111ite u kontejner pomo\u0107u <\/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=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Instalirajte Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Nakon instalacije provjerite je li direktorij s projektom stvoren, i zatvorite compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Vratite se u PHPStorm i postavite to\u010dnu putanju do na\u0161eg laravel aplikacije u datoteci .env.<\/p>\n<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Dodajte sav kod u Git.<\/p>\n<p>Za to \u0107emo na Githubu (ili negdje drugdje) stvoriti repozitorij. Idite u terminalu u direktorij habr i izvr\u0161ite sljede\u0107i kod.<\/p>\n<pre><code class=\"bash\">echo &quot;# habr-12factor&quot; &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m &quot;first commit&quot;\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # ovdje \u0107e biti link na va\u0161 repo\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nProvjerite je li sve u redu. <\/p>\n<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZa prakti\u010dnost preporu\u010dujem kori\u0161tenje nekog vizualnog su\u010delja za Git, u mom slu\u010daju to je <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (ovdje je referentna poveznica)<\/p>\n<p>4. Pokrenite!<\/p>\n<p>Prije pokretanja provjerite da na portovima 80 i 443 ni\u0161ta ne visi.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTako na\u0161 projekt se sastoji od 3 odvojena servisa:<\/p>\n<ul>\n<li>nginx \u2014 web server<\/li>\n<li>php-fpm \u2014 php za primanje zahtjeva s web servera<\/li>\n<li>workspace \u2014 php za programera<\/li>\n<\/ul>\n<p>\nTrenutno smo postigli da smo stvorili aplikaciju koja odgovara ve\u0107 4 to\u010dkama od 12, a to su:<\/p>\n<p>1. <b>K\u00f4dna baza<\/b> \u2014 sav kod se nalazi u jednom repozitoriju (mala napomena: mo\u017eda bi bilo ispravno uvrstiti docker unutar laravel projekta, no to nije klju\u010dno).<\/p>\n<p>2. <b>Ovisnosti<\/b> \u2014 Sve na\u0161e ovisnosti su jasno navedene u application\/composer.json i u svakom Dockerfileu svakog kontejnera.<\/p>\n<p>3. <b>Eksterne usluge (Backing Services)<\/b> \u2014 Svaka od slu\u017ebi (php-fpm, nginx, workspace) \u017eivi svojim \u017eivotom i povezuje se izvana, pri radu s jednom slu\u017ebom, druga ne\u0107e biti pogo\u0111ena.<\/p>\n<p>4. <b>Procesi<\/b> \u2014 svaka usluga je jedan proces. Svaka od slu\u017ebi ne \u010duva unutarnje stanje.<\/p>\n<p>5.<b> Veza portova (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKao \u0161to vidimo, svaka slu\u017eba je pokrenuta na svom vlastitom portu i dostupna je svim drugim slu\u017ebama.<\/p>\n<p>6.<b> Paralelizam <\/b><\/p>\n<p>Docker nam omogu\u0107ava pokretanje vi\u0161e procesa istih usluga s automatskom ravnote\u017eom optere\u0107enja me\u0111u njima. <\/p>\n<p>Zaustavite kontejnere i pokrenite ih s opcijom <b>&#8212;scale<\/b><\/p>\n<pre><code class=\"bash\">docker-compose down &amp;&amp; \ndocker-compose up -d --scale php-fpm=3 nginx php-fpm\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKao \u0161to vidimo, stvorene su kopije php-fpm kontejnera. U radu s ovim kontejnerom ne trebamo ni\u0161ta mijenjati. I dalje se obra\u0107amo njemu putem porta 9000, a Docker za nas regulira optere\u0107enje me\u0111u kontejnerima.<\/p>\n<p>7. <b>Zbrinjavanje (Disposability)<\/b> \u2014 svaki kontejner se mo\u017ee ugasiti bez \u0161tete za druge. Zaustavljanje ili ponovo pokretanje kontejnera ne\u0107e utjecati na rad aplikacije kod sljede\u0107ih pokretanja. Svaki kontejner se tako\u0111er mo\u017ee pokrenuti u bilo kojem trenutku.<\/p>\n<p>8. <b>Paritet razvoja\/rada aplikacije<\/b> \u2014 sva na\u0161a okru\u017eenja su identi\u010dna. Pokretanjem sustava na serveru u produkciji ne\u0107ete trebati mijenjati ni\u0161ta u va\u0161im komandama. Sve \u0107e se to\u010dno tako temeljiti na Dockeru.<\/p>\n<p>9. <b>Evidentiranje (Logs)<\/b> \u2014 svi logovi u tim kontejnerima izlaze na tok i vidljivi su u Docker konzoli. (u ovom slu\u010daju, zapravo, s drugim vlastitim kontejnerima, to mo\u017eda ne\u0107e biti tako ako se ne pobrinete za to)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAli, tu je problem u tome \u0161to Default vrijednosti u PHP-u i Nginxu tako\u0111er zapisuju logove u datoteku. Za uskla\u0111enost sa 12 faktora, potrebno je <b>mo\u017ee se isklju\u010diti<\/b> snimanje logova u datoteku u konfiguracijama svakog kontejnera zasebno.<\/p>\n<p>Tako\u0111er, Docker omogu\u0107ava usmjeravanje logova ne samo u stdout, ve\u0107 i u takve stvari kao \u0161to su graylog o kojem sam govorio ranije. A unutar grayloga, mo\u017eemo obra\u0111ivati logove kako god \u017eelimo i na\u0161a aplikacija to ne\u0107e primijetiti.<\/p>\n<p>10. <b>Administrativni zadaci<\/b> \u2014 svi administrativni zadaci se rje\u0161avaju u Laravelu zahvaljuju\u0107i alatu artisan na na\u010din na koji bi to \u017eeljeli tvorci 12-faktorske aplikacije.<\/p>\n<p>Kao primjer pokazat \u0107u kako se izvr\u0161avaju neke komande.<br \/>\nU\u0161li smo u kontejner.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSada mo\u017eemo iskoristiti bilo koju komandu. (primijetite da nismo konfigurirali bazu podataka i cache tako da \u0107e pola komandi neispravno izvr\u0161iti, jer su namijenjene za rad s cacheom i bdb).<\/p>\n<p><img decoding=\"async\" alt=\"Razvoj aplikacija i Blue-Green deployment, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfiguracije<\/b> i 12. <b>Izgradnja, izdanje, izvr\u0161avanje<\/b><\/p>\n<p>Ovaj dio sam \u017eelio posvetiti Blue-Green Deployment-u, ali se to pokazalo previ\u0161e razra\u0111eno za ovaj \u010dlanak. O tome \u0107u napisati poseban \u010dlanak. <\/p>\n<p>U nekoliko re\u010denica, koncept se temelji na CI\/CD sustavima poput <b>Jenkins<\/b> i <b>Gitlab CI<\/b>. I u jednom i u drugom mo\u017eete postaviti varijable okru\u017eenja povezane s odre\u0111enim okru\u017eenjem. Prema tome, u tom slu\u010daju \u0107e se izvr\u0161avati stavka s <b>Konfiguracijama<\/b>.<\/p>\n<p>A stavka o <b>Izgradnja, izdanje, izvr\u0161avanje<\/b> rje\u0161ava se ugra\u0111enim funkcijama u oba alata pod nazivom <b>Cjevovod<\/b>.<\/p>\n<p><b>Cjevovod<\/b> omogu\u0107uje dijeljenje procesa implementacije u vi\u0161e faza, isti\u010du\u0107i faze izgradnje, izdanja i izvr\u0161enja. Tako\u0111er u Pipelineu mo\u017eete kreirati sigurnosne kopije, pa \u010dak i sve drugo. Ovaj alat ima neograni\u010den potencijal.<\/p>\n<p>Kod aplikacije je na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nNe zaboravite inicijalizirati submodule prilikom kloniranja ovog repozitorija.<\/p>\n<p>P.S.: Sve ove pristupe mo\u017eete koristiti s bilo kojim drugim alatima i programskim jezicima. Bitno je da su\u0161tina ostane nepromijenjena.<br \/>\n<br \/>Izvor: <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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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\udd47Razvoj aplikacija i Blue-Green implementacija, oslanjaju\u0107i se na metodologiju The Twelve-Factor App s primjerima na php i docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hr\/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":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}