{"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\/et\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Alguses natuke teooriat. Mis on <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Kaksteistfaktoriline rakendus<\/a><\/noindex>?<\/h3>\n<p>\nLihtsate s\u00f5nadega, see dokument on m\u00f5eldud SaaS rakenduste arendamise lihtsustamiseks, aidates arendajaid ja DevOps insenere probleemide ja praktikatega, mis on sageli esinenud kaasaegsete rakenduste arendamisel. <\/p>\n<p>Dokument on koostatud Heroku platvormi arendajate poolt.<\/p>\n<p>Kaksteistfaktoriline metodoloogia (The Twelve-Factor App) on rakendatav mis tahes programmeerimiskeeles kirjutatud rakendustele ja erinevatele kolmandate osapoolte teenuste kombinatsioonidele (backing services) (andmebaasid, s\u00f5numij\u00e4rjekorrad, vahem\u00e4lu jne).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>L\u00fchidalt metodoloogia aluseks olevatest teguritest:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Koodibaas<\/b> \u2013 \u00dcks koodibaas, mida hallatakse versioonihalduss\u00fcsteemis \u2013 mitu rakendust <\/li>\n<li><b>S\u00f5ltuvused<\/b> \u2013 Tehke s\u00f5ltuvused selgelt teatavaks ja isoleerige need<\/li>\n<li><b>Konfiguratsioon<\/b> \u2013 Hoidke konfigureerimine k\u00e4itamisre\u017eiimis<\/li>\n<li><b>Kolmandate osapoolte teenused (Backing Services)<\/b> \u2013 Kaaluge kolmandate osapoolte teenuseid (backing services) \u00fchendatavate ressurssidena<\/li>\n<li><b>Kogumine, v\u00e4ljalase, t\u00e4itmine<\/b> \u2013 Rangelt eristage kogumise ja t\u00e4itmise etappe<\/li>\n<li><b>Protsessid<\/b> \u2013 K\u00e4ivitage rakendus kui \u00fcks v\u00f5i mitu seisundit mittehoidvat protsessi (stateless) <\/li>\n<li><b>Portide sidumine (Port binding)<\/b> \u2013 Ekspordige teenuseid portide sidumise kaudu <\/li>\n<li><b>Paralleelsus<\/b> \u2013 Skaalake rakendust protsesside abil <\/li>\n<li><b>Utiliseeritavus (Disposability)<\/b> \u2013 Maksimeerige usaldusv\u00e4\u00e4rsust kiire k\u00e4ivitamise ja korrektse l\u00f5petamise abil <\/li>\n<li><b>Rakenduse arendamise\/operatiivsete tingimuste pariteet<\/b> \u2013 Hoidke arenduse, vahepealse juurutamise (staging) ja tootmise (production) keskkonnad maksimaalselt sarnased <\/li>\n<li><b>Logimine (Logs)<\/b> \u2013 Vaadake logi kui s\u00fcndmuste voogu<\/li>\n<li><b>Haldus\u00fclesanded<\/b> \u2013 Tehke haldus-\/juhtimis\u00fclesandeid \u00fchekordsete protsesside kaudu <\/li>\n<\/ol>\n<p>\n<b>Rohkem teavet 12 teguri kohta leiate j\u00e4rgmistest allikatest:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Ametlik allikas<\/a><\/noindex> \u2014 kohustuslik lugemine<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikkel habr'il. Kaksteist tegurit \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 ametlik t\u00f5lge<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Artikkel habr'il. 7 puuduvat tegurit 12 Factor App l\u00e4henemises<\/a><\/noindex> \u2014 v\u00e4rske vaade 12 tegurile nende t\u00e4iustamise eesm\u00e4rgil.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Mis on Blue-Green juurutamine?<\/h3>\n<p>\nBlue-Green juurutamine on viis rakenduse tarnimiseks <b>tootmisse<\/b> nii, et l\u00f5ppkasutaja ei n\u00e4e oma k\u00fcljelt mingeid muudatusi. Teisis\u00f5nu, rakenduse juurutamine nulliga <b>seisaku<\/b>.<\/p>\n<p>Klassikaline BG Deploy skeem n\u00e4eb v\u00e4lja nagu alloleval pildil. <\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Alguses on 2 f\u00fc\u00fcsilist serverit, millel on t\u00e4pselt sama kood, rakendus, projekt ja seal on ruuter (tasakaalustaja). <\/li>\n<li>Ruuter suunab algselt k\u00f5ik p\u00e4ringud \u00fche serveri peale (<b>roheline<\/b>). <\/li>\n<li>Hetkel, kui on vaja taas v\u00e4lja anda, v\u00e4rskendatakse kogu projekt teisele serverile (<b>sinine<\/b>), mis praegu ei t\u00f6\u00f6tle mingeid p\u00e4ringuid. <\/li>\n<li>P\u00e4rast seda, kui kood on <b>sinises<\/b> serveris t\u00e4ielikult v\u00e4rskendatud, antakse ruuterile k\u00e4sk vahetada <b>roheliselt<\/b> j\u00e4rgnevaga <b>sinine<\/b> serverilt. <\/li>\n<li>N\u00fc\u00fcd n\u00e4evad k\u00f5ik kliendid koodi t\u00f6\u00f6d <b>sinisest<\/b> serverist. <\/li>\n<li> M\u00f5nda aega, <b>roheline<\/b> server toimib varukoopiana, kui juurutamine eba\u00f5nnestub <b>sinine<\/b> serverisse ja eba\u00f5nnestumise korral, ruuter suunab kasutajate voolu tagasi <b>roheline<\/b> serverisse vana stabiilse versiooniga, samas kui uus kood saadetakse t\u00e4iendavaks t\u00f6\u00f6tlemiseks ja testimiseks.<\/li>\n<li>Ja protsessi l\u00f5puks v\u00e4rskendatakse samuti <b>roheline<\/b> server. Ja p\u00e4rast selle uuendamist suunab ruuter p\u00e4ringute voogu tagasi <b>roheline<\/b> serverilt.<\/li>\n<\/ul>\n<p>\nSee k\u00f5ik n\u00e4eb v\u00e4lja v\u00e4ga hea ja esmapilgul ei tohiks sellega olla mingeid probleeme.<br \/>\nKuid kuna elame t\u00e4nap\u00e4eva maailmas, siis f\u00fc\u00fcsilise l\u00fclitamise variant, nagu on n\u00e4idatud klassikalises scheemis, ei sobi meile. Salvestage teave hetkel, me tuleme selle juurde hiljem tagasi.<\/p>\n<h3>Halvad ja head n\u00f5uanded<\/h3>\n<p>\n<i>M\u00e4rkus<\/i>: Allpool on toodud t\u00f6\u00f6riistad \/ metoodikad, mida kasutan mina, saate kasutada mistahes alternatiive, mis omavad sarnaseid funktsioone. <\/p>\n<p>Enamik n\u00e4iteid kattub sel v\u00f5i teisel viisil veebiarendusega (see on \u00fcllatus), PHP ja Dockeriga.<\/p>\n<p>Allpool on lihtne praktiline kirjeldus faktorite kasutamisest teatud n\u00e4idetes; kui soovite selle teema kohta rohkem teooriat, viidake k\u00f5rgemal linkidele esialgsele allikale. <\/p>\n<h4>1. Koodibaas<\/h4>\n<p>\nKasutage FTP-d ja FileZillat, laadides faile serveritesse \u00fcksikute kaupa, \u00e4rge hoidke koodi kusagil mujal kui tootmisserveris.<\/p>\n<p>Projektis peab alati olema \u00fchtne koodibaas, mis t\u00e4hendab, et kogu kood tuleb \u00fchest allikast. <b>Git<\/b> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0421\u0435\u0440\u0432\u0435\u0440\u044b (production, staging, test1, test2 &#8230;) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0432\u0435\u0442\u043e\u043a \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430.<\/p>\n<h4>2. S\u00f5ltuvused<\/h4>\n<p>\nLaadige k\u00f5ik raamatukogud kaustades otse projekti juurese. Uuendusi tehke lihtsalt uue koodi kopeerimisega praeguse versiooni raamatukogu kausta. Paigaldage k\u00f5ik vajalikud utiliidid otse hostiserverisse, kus t\u00f6\u00f6tab veel 20 teenust.<\/p>\n<p>Projekt peab alati olema selgelt arusaadav s\u00f5ltuvuste loetelu (s\u00f5ltuvustena m\u00f5istan ma ka keskkonda). K\u00f5ik s\u00f5ltuvused peavad olema selgelt m\u00e4\u00e4ratletud ja isoleeritud. <br \/>\nN\u00e4itena v\u00f5tame <b>Composer<\/b> ja <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 pakihaldur, mis v\u00f5imaldab PHP raamatukogusid installida. Composer v\u00f5imaldab t\u00e4pselt v\u00f5i mitte t\u00e4pselt versioone m\u00e4\u00e4rata ja neid selgelt kindlaks teha. Serveris v\u00f5ib olla 20 erinevat projekti ja igal \u00fchel on oma isiklik paketide ja raamatukogude loetelu, mis ei s\u00f5ltu teistest.<\/p>\n<p><b>Docker<\/b> \u2014 utiliit, mis v\u00f5imaldab m\u00e4\u00e4rata ja isoleerida keskkonda, kus rakendus t\u00f6\u00f6tab. Nii nagu composeriga, saame n\u00fc\u00fcd veelgi t\u00f5husamalt m\u00e4\u00e4rata, millega rakendus t\u00f6\u00f6tab. Valida kindel PHP versioon, paigaldada ainult projekti t\u00f6\u00f6ks vajalikud paketid, lisamata midagi \u00fcleliigset. Ja mis k\u00f5ige t\u00e4htsam, mitte kattuda hostimasina ja teiste projektide pakettide ning keskkonnaga. See t\u00e4hendab, et k\u00f5ik serveris t\u00f6\u00f6tavad Dockeris projektid saavad kasutada absoluutselt igasuguseid pakette ja t\u00e4iesti erinevat keskkonda.<\/p>\n<h4>3. Konfigureerimine<\/h4>\n<p>\nSalvestage konfigureerimised konstantide kaudu otse koodis. Eraldi konstantid testserveri jaoks, eraldi tootmisserveri jaoks. Siduge rakenduse t\u00f6\u00f6 s\u00f5ltuvus keskkonnast otse projekti \u00e4ri loogikas, kasutades if else konstruktsioone.<\/p>\n<p><b>Konfiguratsioonid<\/b> \u2014 on ainus, mille poolest projektide kasutuselev\u00f5tud (deployment) peaksid erinema. Ideaalis tuleks konfiguratsioonid edastada keskkonnamuutujate (env vars) kaudu. <\/p>\n<p>Isegi kui hoiate mitut konfiguratsioonifaili .config.prod .config.local ja nimetate need juurutamise hetkel \u00fcmber .config-iks (peamine konfiguraaf, millest rakendus andmeid loeb) \u2014 see pole \u00f5ige l\u00e4henemine, sest sellisel juhul on konfiguratsioonide teave k\u00f5igile rakenduse arendajatele kergesti k\u00e4tte saadav ning tootmisserveri andmed v\u00f5ivad olla \u00fclekantavad. K\u00f5ik konfiguratsioonid peaksid olema salvestatud otse juurutuss\u00fcsteemi (CI\/CD) ja genereeritud erinevate keskkondade jaoks erinevate v\u00e4\u00e4rtustega, mis on konkreetses keskkonnas vajalikud juurutamise hetkel.<\/p>\n<h4>4. Kolmandate osapoolte teenused (Backing Services)<\/h4>\n<p>\nSiduge rangelt keskkonnaga, kasutage erinevaid \u00fchendusi samadele teenustele teatud keskkondades.<\/p>\n<p>Tegelikult kattub see punkt tugevalt konfiguratsioonide punktiga, kuna ilma selle punktita ei ole v\u00f5imalik luua korralikke konfiguratsioonandmeid ja \u00fcldse konfigureerimise v\u00f5imalus kaob.<\/p>\n<p>K\u00f5ik \u00fchendused v\u00e4listesse teenustesse, nagu j\u00e4rjekorraserverid, andmebaasid, vahem\u00e4luteenused, peaksid olema \u00fchtsed nii kohaliku keskkonna kui ka v\u00e4lise \/ tootmiskeskkonna jaoks. Teisis\u00f5nu, ma v\u00f5in igal hetkel muuda \u00fchendusstringi, asendades juurdep\u00e4\u00e4su andmebaasile #1 andmebaasiga #2 ilma rakenduskoodi muutmata. N\u00e4iteks, kui teenust skaleeritakse, ei pea te eriliselt seadma \u00fchendust lisavarustuse vahem\u00e4luga.<\/p>\n<h4>5. Kogumine, vabastamine, t\u00e4itmine<\/h4>\n<p>\nServeris peaks olema ainult koodi l\u00f5ppversioon, ilma v\u00f5imaluseta tagasi minna varasemale vabastusele. \u00c4rge k\u00fclvake ketta ruumi. Kes arvab, et v\u00f5ib viga sisaldava koodi tootmisse saata, pole hea programmeerija!<\/p>\n<p>K\u00f5ik juurutamisetapid peaksid olema omavahel eraldatud.<\/p>\n<p>Olge v\u00f5imalus tagasi minna. Tehke vabastusi, hoides kiire juurdep\u00e4\u00e4suga vanu rakenduste koopiaid (juba kokku pandud ja lahinguks valmis), et vajadusel vana versioon taastada. Nii et tinglikult on olemas kaust <i>releases<\/i> ja kaust <i>current<\/i>, ja p\u00e4rast edukat juurutamist ja kogumist kaust <i>current<\/i> seondub uue v\u00e4ljaande s\u00fcmboolse lingiga, mis asub sees <i>releases<\/i> tingimusliku nimega v\u00e4ljaande numbrit. <\/p>\n<p>Siin tuleme me tagasi Blue-Green deployment'i juurde, mis v\u00f5imaldab mitte ainult vahetada koodi vahel, vaid ka vahetada k\u00f5iki ressursse ja isegi keskkondi, v\u00f5imaldades k\u00f5ik tagasi tagasi p\u00f6\u00f6rata.<\/p>\n<h4>6. Protsessid<\/h4>\n<p>\nHoidke rakenduse olekud otse rakenduses. Kasutage rakenduse enda RAM-i seansse. Kasutage nii palju jagatavaid ressursse kui v\u00f5imalik. Oletage, et rakendusel v\u00f5ib olla ainult \u00fcks protsess ja v\u00e4ltige skaleerimise v\u00f5imalust.<\/p>\n<p>Seoses sessioonidega salvestage andmeid ainult kolmandate osapoolte hallatavasse vahem\u00e4lu (memcached, redis). Sel viisil, isegi kui teil on k\u00e4ivitatud 20 rakenduse protsessi, saab \u00fcksk\u00f5ik milline neist, p\u00f6\u00f6rdudes vahem\u00e4lu poole, j\u00e4tkata kliendiga t\u00f6\u00f6tamist samas olekus, milles kasutaja oli, t\u00f6\u00f6tades rakenduses teises protsessis. Sellise l\u00e4henemise korral toimivad k\u00f5ik kolmandate osapoolte teenused probleemideta, olenemata nende koopiate arvust.<\/p>\n<h4>7. Pordide sidumine (Port binding)<\/h4>\n<p>\nAinult veebiserver peaks teadma, kuidas kolmandate osapoolte teenustega t\u00f6\u00f6tada. Veel parem on t\u00f5sta kolmandate osapoolte teenused otse veebiserveri sisse, n\u00e4iteks nagu PHP moodul Apache's.<br \/>\nK\u00f5ik teie teenused peaksid olema omavahel kergesti k\u00e4ttesaadavad, p\u00f6\u00f6rdudes mingisuguse aadressi ja pordi poole (localgost:5432, localhost:3000, nginx:80, php-fpm:9000). See t\u00e4hendab, et nginx-is saan ma juurde p\u00e4\u00e4seda nii php-fpm-ile kui postgres'ile, php-fpm-ist postgres'ile ja nginx'ile ning igast teenusest saan ma p\u00f6\u00f6rduda teise teenuse poole. Nii j\u00e4\u00e4b teenuse eluj\u00f5ud s\u00f5ltumatuks teise teenuse eluj\u00f5udest.<\/p>\n<h4>8. Paralleelsus<\/h4>\n<p>\nT\u00f6\u00f6tage \u00fche protsessiga, et v\u00e4ltida mitme protsessi koost\u00f6\u00f6tlemise probleeme! <\/p>\n<p>J\u00e4tke v\u00f5imalus skaleerimiseks. Docker Swarm sobib selleks suurep\u00e4raselt. <br \/>\nDocker Swarm on t\u00f6\u00f6riist konteineri klastrite loomiseks ja haldamiseks erinevate masinate vahel v\u00f5i paljude konteinerite korraldamiseks \u00fchel masinal.<\/p>\n<p>Swarm'i kasutades saan m\u00e4\u00e4rata, kui palju ressursse eraldan igale protsessile ja kui palju sama teenuse protsesse k\u00e4itama hakkan, ning sisemine koormuse tasakaalustaja, mis v\u00f5tab andmeid m\u00e4\u00e4ratud sadamast, suunab need automaatselt protsessidele. Nii et kui n\u00e4en, et serveri koormus on kasvanud, saan lisada rohkem protsesse, v\u00e4hendades seel\u00e4bi teatud protsesside koormust.<\/p>\n<h4>9. H\u00e4vitamisv\u00f5ime (Disposability)<\/h4>\n<p>\n\u00c4rge kasutage j\u00e4rjekordi protsesside ja andmete t\u00f6\u00f6tlemiseks. \u00dche protsessi tapmine peaks m\u00f5jutama kogu rakenduse t\u00f6\u00f6d. Kui \u00fcks teenus kukub, kukub kogu s\u00fcsteem.<\/p>\n<p>Iga protsess ja teenus v\u00f5ivad igal hetkel v\u00e4lja l\u00fclitada, ilma et see m\u00f5jutaks teisi teenuseid (loomulikult ei ole m\u00f5te selles, et teenus on millegip\u00e4rast teisele teenusele kergesti k\u00e4tte saadav, vaid et teine teenus ei l\u00fclitu koos sellega v\u00e4lja). K\u00f5ik protsessid peaksid l\u00f5petama sujuvalt, nii et nende l\u00f5petamine ei kahjusta andmeid ja s\u00fcsteem t\u00f6\u00f6tab j\u00e4rgmisel sissel\u00fclitamisel korralikult. Seega ei tohiks isegi kriitilise katkestamise korral andmed kahjustada minna (siin sobib tehingumehhanism, kus andmebaasi p\u00e4ringud toimivad ainult gruppidena; kui \u00fckski p\u00e4ring grupist ei toimi v\u00f5i toimib vea korral, siis ei toimu tegelikult ka \u00fchtegi teist p\u00e4ringut grupist).<\/p>\n<h4>10. Rakenduse arendamise\/t\u00f6\u00f6 pariteet<\/h4>\n<p>\nToodang, etapp ja rakenduse kohalik versioon peavad olema erinevad. Toode kasutab Yii Lite raamistikku, kohapeal aga Yii, et tootmine t\u00f6\u00f6taks sujuvamalt!<\/p>\n<p>Tegelikult peaks k\u00f5ik koodide juurutamised ja t\u00f6\u00f6tamine toimuma peaaegu identses keskkonnas (ei r\u00e4\u00e4gita f\u00fc\u00fcsilisest riistvarast). Samuti peaks iga arendusmeeskonna liige suutma koodi vajadusel toota, mitte mingisugune spetsiaalselt koolitatud devops osakond, mis suudab rakendust tootmises t\u00f5sta ainult t\u00e4nu erioskusele.<\/p>\n<p>Sellega aitab meid ka Docker. Kui j\u00e4rgime k\u00f5iki eelnevaid punkte, v\u00e4hendab docker keskkonna juurutamise protsessi nii tootmises kui ka kohalikul masinal \u00fche-kahte k\u00e4sku sisestamiseni.<\/p>\n<h4>11. Logimine (Logs)<\/h4>\n<p>\nLogid kirjutame failidesse ja andmebaasi! Failidest ja andmebaasist logisid ei puhasta. Ostame lihtsalt 9000 petabaiti k\u00f5vaketta ja k\u00f5ik.<\/p>\n<p>Logis tuleb k\u00e4sitleda kui s\u00fcndmuste voogu. Rakendus ei tohi tegeleda logide t\u00f6\u00f6tlemisega. Logid peaksid olema kas stdout'is v\u00f5i saadetud protokolli nagu udp kaudu, et logide t\u00f6\u00f6tlemine ei tekitaks rakenduses probleeme. Selleks sobib h\u00e4sti graylog. Graylog, mis v\u00f5tab k\u00f5ik logid vastu udp kaudu (selle protokolli puhul ei pea ootama kinnitust pakettide edastamise kohta), ei sega rakendust ja tegeleb ainult logide struktureerimise ja t\u00f6\u00f6tlemisega. Rakenduse loogika ei muutu, kui kasutatakse selliseid l\u00e4henemisviise.<\/p>\n<h4>12. Administreerimise \u00fclesanded<\/h4>\n<p>\nAndmete, andmebaasi jne uuendamiseks kasutage eraldi loodud l\u00f5pp-punkti API-s, mille t\u00e4itmine kaks korda j\u00e4rjest toob kaasa v\u00f5imaliku dubleerimise. Kuid te ju ei ole tobedad, et vajutada seda kaks korda, ja migratsioonid pole meile vajalikud.<\/p>\n<p>K\u00f5ik haldamise \u00fclesanded peaksid toimuma samas keskkonnas kui kogu kood, v\u00e4ljaande tasemel. See t\u00e4hendab, et kui peame andmebaasi struktuuri muutma, ei tee me seda k\u00e4sitsi, muutes veergude nimesid ja lisades uusi m\u00f5ne visuaalse andmebaasi haldust\u00f6\u00f6riista kaudu. Selliste asjade jaoks loome eraldi skriptid \u2014 migratsioonid, mis k\u00e4ivitatakse igal pool ja k\u00f5igis keskkondades \u00fchtlaselt ja arusaadava tulemusega. K\u00f5igi teiste \u00fclesannete puhul, nagu projekti andmetega t\u00e4itmine, tuleb rakendada sarnaseid metoodikaid.<\/p>\n<h3>PHP, Laravel, Laradock, Docker-Compose'i rakenduse n\u00e4ide<\/h3>\n<p>\nP.S. K\u00f5ik n\u00e4ited tehti MacOS-is. Enamik sobib ka Linuxile. Windowsi kasutajad, palun vabandage, aga ma pole pikka aega Windowsiga t\u00f6\u00f6tanud.<\/p>\n<p>Kujutame ette olukorda, kus meie PC-l ei ole installitud \u00fchtegi PHP versiooni ja tegelikult ei ole seal midagi. <br \/>\nPaigaldame docker ja docker-compose uusimad versioonid. (seda saab internetist leida)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Paigaldame <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=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaradock on t\u00f5esti suurep\u00e4rane platvorm, kus on kogutud palju konteinerite ja abivahendeid. Kuid ma ei soovitaks kasutada Laradock'i tootmisre\u017eiimis ilma muudatusteta, kuna see on liialt mahukas. Paremini on luua oma konteinerid tuginedes Laradock'i n\u00e4idetele, mis v\u00f5imaldab rohkem optimeerimist, sest k\u00f5ike sealset korraga keegi ei vaja.<\/p>\n<p>2. Konfigureerime Laradock'i meie rakenduse t\u00f6\u00f6ks.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Ava habr kataloog (\u00fclemine kaust, kuhu laradock klooniti) m\u00f5ne redigeerija abil. (Minu puhul on see PHPStorm)<\/p>\n<p>Sel hetkel m\u00e4\u00e4rame ainult projekti nime.<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. K\u00e4ivitame workspace'i konteineri. (Teie juhtumi puhul hakkavad pildid m\u00f5nda aega ehitama)<br \/>\nWorkspace on spetsiaalselt ettevalmistatud pilt arendaja poolt raamistiku kasutamiseks.<\/p>\n<p>Siseneme konteinerisse j\u00e4rgmise k\u00e4suga <\/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=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Paigaldame Laravel'i<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. P\u00e4rast paigaldamist kontrollime, kas projektikaust on loodud, ja peatame compose'i.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Oleme tagasi PHPStormis ja seadistame meie laravel rakenduse \u00f5iged teed .env failis.<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Lisame kogu koodi Git'i.<\/p>\n<p>Selleks loome Githubis (v\u00f5i m\u00f5nes muus kohas) hoidla. Liigume terminalis habr katalooge ja t\u00e4idame j\u00e4rgmise koodi.<\/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 # \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0430\u0448 \u0440\u0435\u043f\u043e\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nKontrollime, kas k\u00f5ik on korras. <\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMugavuse huvides soovitan kasutada mingit visuaalset liidest Git\u2019i jaoks, minu puhul on see <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (siin on suunamislink)<\/p>\n<p>4. K\u00e4ivitame!<\/p>\n<p>Enne k\u00e4ivitamist veenduge, et 80 ja 443 pordil ei oleks midagi \u00fcles riputatud.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega meie projekt koosneb 3 eraldi teenusest:<\/p>\n<ul>\n<li>nginx \u2014 veebiserver<\/li>\n<li>php-fpm \u2014 php, et vastu v\u00f5tta p\u00e4ringuid veebiserverilt<\/li>\n<li>workspace \u2014 php arendajale<\/li>\n<\/ul>\n<p>\nPraeguseks hetkeks oleme saavutanud, et oleme loonud rakenduse, mis vastab juba 4 punktile 12-st, nimelt:<\/p>\n<p>1. <b>Koodibaas<\/b> \u2014 k\u00f5ik kood on \u00fches hoidlas (v\u00e4ike m\u00e4rkuse koht: v\u00f5ib-olla oleks \u00f5igem tuua docker laraveli projekti sisse, kuid see ei ole p\u00f5him\u00f5tteliselt oluline).<\/p>\n<p>2. <b>S\u00f5ltuvused<\/b> \u2014 K\u00f5ik meie s\u00f5ltuvused on selgelt m\u00e4\u00e4ratletud failis application\/composer.json ja iga konteineri Dockerfile'is.<\/p>\n<p>3. <b>Kolmandate osapoolte teenused (Backing Services)<\/b> \u2014 Iga teenus (php-fpm, nginx, workspace) elab oma elu ja on v\u00e4liselt \u00fchendatud; t\u00f6\u00f6tades \u00fche teenusega, ei m\u00f5juta see teisi.<\/p>\n<p>4. <b>Protsessid<\/b> \u2014 Iga teenus on \u00fcks protsess. Iga teenus ei s\u00e4ilita sisesetstate.<\/p>\n<p>5.<b> Portide sidumine (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas n\u00e4eme, on iga teenus \u00fcles seatud oma porti ja on ligip\u00e4\u00e4setav k\u00f5igile teistele teenustele.<\/p>\n<p>6.<b> Paralleelsus <\/b><\/p>\n<p>Docker v\u00f5imaldab meil t\u00f5sta mitu protsessi samadest teenustest automaatse koormuse tasakaalustamisega nende vahel. <\/p>\n<p>L\u00f5petame konteinerid ja k\u00e4ivitame need lipu kaudu <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=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas n\u00e4eme, on php-fpm konteineril loodud koopiad. Me ei pea selle konteineri t\u00f6\u00f6 k\u00e4igus midagi muutma. J\u00e4tkame temaga \u00fchendust porti 9000 kaudu, samas kui Docker reguleerib meie eest koormust konteinerite vahel.<\/p>\n<p>7. <b>Utiliseeritavus (Disposability)<\/b> \u2014 iga konteineri saab l\u00f5petada teisele kahju tegemata. K\u00eatesed v\u00f5i taask\u00e4ivitamine konteiner ei m\u00f5juta rakenduse t\u00f6\u00f6d j\u00e4rgmiste k\u00e4ivituste ajal. Iga konteinerit saab samuti igal ajal t\u00f5sta.<\/p>\n<p>8. <b>Rakenduse arendamise\/operatiivsete tingimuste pariteet<\/b> \u2014 k\u00f5ik meie keskkonnad on \u00fchesugused. Kui k\u00e4itate s\u00fcsteemi serveris tootmises, ei pea te oma k\u00e4skudes midagi muutma. K\u00f5ik p\u00f5hineb t\u00e4pselt Dockeril.<\/p>\n<p>9. <b>Logimine (Logs)<\/b> \u2014 k\u00f5ik logid nendes konteinerites suunduvad voogu ja on n\u00e4htavad Dockeri konsoolis. (antud juhul, tegelikult, teiste isetehtud konteinerite puhul v\u00f5ib see olla erinev, kui te ei hoolitse selle eest)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAga siin on probleem, et PHP ja Nginxi vaikeseaded kirjutavad samuti logisid faili. 12-faktori p\u00f5him\u00f5ttete j\u00e4rgimiseks on vajalik <b>v\u00e4lja l\u00fclitada<\/b> logide kirjutamine faili iga konteineri konfiguratsioonis eraldi.<\/p>\n<p>Samuti pakub docker v\u00f5imalust suunata logid mitte ainult stdouti, vaid ka sellistesse asjadesse nagu graylog, millest ma eelpool r\u00e4\u00e4kisin. Graylogis saame logidega operatiivida kuidas iganes soovime ja meie rakendus ei m\u00e4rka seda.<\/p>\n<p>10. <b>Haldus\u00fclesanded<\/b> \u2014 k\u00f5ik haldus\u00fclesanded lahendab Laravel t\u00e4nu artisan t\u00f6\u00f6riistale just nii, nagu 12-faktori rakenduse loojaid soovisid.<\/p>\n<p>N\u00e4itena n\u00e4itan, kuidas teostatakse m\u00f5ned k\u00e4sklused.<br \/>\nSiseneme konteinerisse.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00fc\u00fcd saame kasutada igat k\u00e4sku. (pange t\u00e4hele, et me ei ole andmebaasi ja vahem\u00e4lu seadistanud, mist\u00f5ttu poolest k\u00e4skudest ei t\u00f6\u00f6ta \u00f5igesti, kuna need on m\u00f5eldud t\u00f6\u00f6ks vahem\u00e4lu ja andmebaasiga).<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, koos n\u00e4idetega php ja dockeris.\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfiguratsioonid<\/b> ja 12. <b>Kogumine, v\u00e4ljalase, t\u00e4itmine<\/b><\/p>\n<p>Selle osa tahan p\u00fchendada Blue-Green Deployment'ile, kuid see osutus selle artikli jaoks liiga ulatuslikuks. Kirjutan sellest eraldi artiklis. <\/p>\n<p>L\u00fchidalt \u00f6eldes p\u00f5hineb kontseptsioon CI\/CD s\u00fcsteemidel nagu <b>Jenkins<\/b> ja <b>Gitlab CI<\/b>. Nii selles kui ka teises saab seada keskkonnaga seotud keskkonnamuutujad. Vastavalt sellele toimub punktide t\u00e4itmine <b>Konfiguratsioonidega<\/b>.<\/p>\n<p>Ja punkt, mis puudutab <b>Kogumine, v\u00e4ljalase, t\u00e4itmine<\/b> lahendatakse m\u00f5lemas utiliidis sisseehitatud funktsioonidega, mida nimetatakse <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> mis v\u00f5imaldab jagada deploymendi protsessi mitmeks etapiks, tuues esile ehituse, v\u00e4lja andmise ja t\u00e4itmise etapid. Samuti saate Pipeline'is luua varukoopiaid ja teha \u00fcldiselt k\u00f5ike. See t\u00f6\u00f6riist omab piiramatu potentsiaali.<\/p>\n<p>Rakenduse kood asub <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\n\u00c4rge unustage submodule kloonimisel initsialiseerida.<\/p>\n<p>P.S.: Tooted, mis puudutavad neid l\u00e4henemisi, on rakendatavad ka teiste utiliidide ja programmeerimiskeeltega. Peaasi, et sisu ei erineks.<br \/>\n<br \/>Allikas: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/et\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Rakenduste arendamine ja Blue-Green deployment, tuginedes The Twelve-Factor App metoodikale, n\u00e4idistega php ja docker | ProHoster","description":"Alustame veidi teooriast. Mis on The Twelve-Factor App? Lihtsustatult \u00f6eldes on see dokument, mis on loodud SaaS rakenduste arendamise lihtsustamiseks, aidates arendajatel ja DevOps inseneridel olla teadlikud probleemidest ja praktikast, millega sageli kohtutakse kaasaegsete rakenduste arendamisel. Dokument on koostatud Heroku platvormi arendajate poolt. Kaheteistfaktori meetod (The Twelve-Factor App) on rakendatav igasuguste rakenduste puhul, mis on kirjutatud igas keeles.","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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:description":"\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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}