{"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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker'i n\u00e4idetega","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Alustuseks natuke teooriat. Mis on <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nLihtsalt \u00f6eldes on see dokument, mis on m\u00f5eldud SaaS rakenduste arendamise lihtsustamiseks, aidates arendajatel ja DevOps inseneridel teadlikuks saada probleemidest ja praktikatest, millega nad sageli kokku puutuvad modernsete rakenduste arendamisel. <\/p>\n<p>Dokument on koostatud Heroku platvormi arendajate poolt.<\/p>\n<p>Kaksteistfaktorit metoodikat (The Twelve-Factor App) saab rakendada mis tahes programmeerimiskeeles kirjutatud rakendustele, kasutades k\u00f5iki kombinatsioone v\u00e4lishaldusteenustest (backing services) (andmebaasid, s\u00f5numij\u00e4rjekorrad, vahem\u00e4lu jne).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>L\u00fchidalt metoodika aluseks olevatest teguritest:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Koodibaas<\/b> \u2013 \u00dcks koodibaas, mis on j\u00e4lgitav versioonikontrollis \u2013 mitmed juurutamised <\/li>\n<li><b>S\u00f5ltuvused<\/b> \u2013 Delegeerige ja isoleerige s\u00f5ltuvused selgelt<\/li>\n<li><b>Konfiguratsioon<\/b> \u2013 Salvestage konfigureerimine t\u00f6\u00f6tamisaja keskkonnas<\/li>\n<li><b>V\u00e4lishaldusteenused (Backing Services)<\/b> \u2013 Peate k\u00e4sitlema v\u00e4lishaldusteenuseid (backing services) \u00fchendatavate ressurssidena<\/li>\n<li><b>Kogumine, vabastamine, t\u00e4itmine<\/b> \u2013 Eraldage kogumise ja t\u00e4itmise etapid rangelt<\/li>\n<li><b>Protsessid<\/b> \u2013 K\u00e4itage rakendust kui \u00fchte v\u00f5i mitut olekuta protsessi (stateless) <\/li>\n<li><b>Pordiseondumine (Port binding)<\/b> \u2013 Eksportige teenuseid portide seondumise kaudu <\/li>\n<li><b>Paralleelsus<\/b> \u2013 Skaleerige rakendust protsesside kaudu <\/li>\n<li><b>Utiliseeritavus (Disposability)<\/b> \u2013 Maximeerige usaldusv\u00e4\u00e4rsust kiire k\u00e4ivitamise ja korrektse sulgemisega <\/li>\n<li><b>Rakenduse arenduse\/operatsiooni pariteet<\/b> \u2013 Hoidke arenduse, vahepealse ja tootmisjuurutuse keskkonnad v\u00f5imalikult sarnased <\/li>\n<li><b>Logimine (Logs)<\/b> \u2013 K\u00e4sitlege logi kui s\u00fcndmuste voogu<\/li>\n<li><b>Haldus\u00fclesanded<\/b> \u2013 T\u00e4itke haldus-\/korrashoiu\u00fclesanded \u00fchekordsete protsesside kaudu <\/li>\n<\/ol>\n<p>\n<b>Rohkem teavet 12 teguri kohta leiate j\u00e4rgmistes allikates:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Ametlik originaalallikas<\/a><\/noindex> \u2014 kindlasti lugeda<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikkel Habr. Kaksteistfaktori rakendus \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. 7 puuduvat tegurit 12 Factor App l\u00e4henemises<\/a><\/noindex> \u2014 v\u00e4rske pilk 12 tegurile, et neid t\u00e4iustada.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Mis on Blue-Green tellimine?<\/h3>\n<p>\nBlue-Green tellimine on rakenduse tarnimise meetod <b>production<\/b> nii, et l\u00f5ppkasutaja ei n\u00e4e oma n\u00e4gemuses mingeid muutusi. 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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Alustuseks on 2 f\u00fc\u00fcsilist serverit, millel on t\u00e4iesti sama kood, rakendus, projekt ja seal on ruuter (koormuse tasakaalustaja). <\/li>\n<li>Ruuter suunab algselt k\u00f5ik p\u00e4ringud \u00fchele serveritest (<b>alfa<\/b>). <\/li>\n<li>Kui tuleb aeg uuesti versioon v\u00e4lja anda, uuendatakse kogu projekt teisel serveril (<b>sinine<\/b>), mis ei saada sellel hetkel mingeid p\u00e4ringuid. <\/li>\n<li>P\u00e4rast seda, kui kood on <b>sinisel<\/b> serveril t\u00e4ielikult uuendatud, antakse ruuterile k\u00e4sk l\u00fclituda <b>rohelisele<\/b> . Tundub, et <b>sinine<\/b> server. <\/li>\n<li>N\u00fc\u00fcd n\u00e4evad k\u00f5ik kliendid koodi t\u00f6\u00f6d <b>siniselt<\/b> servereid. <\/li>\n<li> Mingil hetkel <b>alfa<\/b> server teenib varukoopiana, kui juurutus peaks eba\u00f5nnestuma, ja probleemide korral suunab ruuter kasutajate voolu tagasi <b>sinine<\/b> serverisse, kus on vana stabiilne versioon, samas kui uus kood saadetakse edasi t\u00e4iendamiseks ja testimiseks. <b>alfa<\/b> Ja protsessi l\u00f5pus uuendatakse samuti<\/li>\n<li>serverit. Ja p\u00e4rast selle uuendamist suunab ruuter p\u00e4ringute voolu tagasi <b>alfa<\/b> See k\u00f5ik n\u00e4eb v\u00e4lja v\u00e4ga h\u00e4sti ja esialgu ei tohiks sellega mingeid probleeme olla. <b>alfa<\/b> server.<\/li>\n<\/ul>\n<p>\nKuid kuna me elame kaasaegses maailmas, ei sobi f\u00fc\u00fcsiline l\u00fclitus, nagu klassikalises skeemis, meile. Teave, palun, kinnitage hetkeks, me naaseme selle juurde hiljem.<br \/>\nHalvad ja head n\u00f5uanded<\/p>\n<h3>: Allpool on n\u00e4idatud utiliidid \/ meetodoloogiad, mida kasutan mina, saate kasutada mingeid alternatiive, millel on sarnased funktsioonid.<\/h3>\n<p>\n<i>M\u00e4rkus<\/i>Suurem osa n\u00e4idetest kattub mingil m\u00e4\u00e4ral veebiarendusega (\u00fcllatus, \u00fcllatus), PHP ja Dockeriga. <\/p>\n<p>Alltoodud punktides on lihtne praktiline kirjeldus, kuidas tegureid teatud n\u00e4idetes kasutada, kui soovite rohkem teooriat selle teema kohta, vaadake \u00fclal linke originaalallikasse.<\/p>\n<p>1. Koodibaas <\/p>\n<h4>Kasutage FTP-d ja FileZillat, et \u00fcles laadida faile serveritesse \u00fcksikisikena, \u00e4rge hoidke koodi kusagil mujal peale tootmisserveri.<\/h4>\n<p>\nProjektis peab alati olema \u00fchtne koodibaas, see t\u00e4hendab, et kogu kood tuleb \u00fchest allikast.<\/p>\n<p>Projektis peaks alati olema \u00fchtne koodibaas, see t\u00e4hendab, et kogu kood tuleb \u00fchest kohast. <b>Git<\/b> hoidla. Serverid (production, staging, test1, test2 &#8230;) kasutavad koodi \u00fchest \u00fcldisest hoidlast. Nii saavutame koodi j\u00e4rjepidevuse.<\/p>\n<h4>2. S\u00f5ltuvused<\/h4>\n<p>\nLaadige k\u00f5ik raamatukogud kaustadena otse projekti juurkausta. Uuendusi tehke lihtsalt uue koodi \u00fcleslaadimisega praeguse versiooni kausta. Paigaldage k\u00f5ik vajalikud utiliidid otse hostiserverisse, kus t\u00f6\u00f6tab veel 20 teenust.<\/p>\n<p>Projekt peab alati sisaldama selgelt m\u00f5istetavat s\u00f5ltuvuste nimekirja (s\u00f5ltuvuste alla m\u00f5istan ka keskkonda). K\u00f5ik s\u00f5ltuvused peavad olema selgelt m\u00e4\u00e4ratletud ja isoleeritud. <br \/>\nN\u00e4iteks v\u00f5tame <b>Composer<\/b> ja <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 paketihaldur, mis v\u00f5imaldab PHP raamatukogude installimist. Composer v\u00f5imaldab t\u00e4pselt v\u00f5i mitte t\u00e4pselt m\u00e4\u00e4rata versioone ning neid selgelt m\u00e4\u00e4ratleda. Serveril v\u00f5ib olla 20 erinevat projekti ja igal \u00fchel neist on isiklik paketihaldus ja raamatukogud, mis ei s\u00f5ltu \u00fcksteisest.<\/p>\n<p><b>Docker<\/b> \u2014 utiliit, mis v\u00f5imaldab m\u00e4\u00e4rata ja isoleerida keskkonda, kus rakendus t\u00f6\u00f6tab. Vastavalt, nagu ka composeriga, saame paremini m\u00e4\u00e4ratleda, millega rakendus t\u00f6\u00f6tab. Valida teatud versioon PHP-st, paigaldada ainult projekti t\u00f6\u00f6tamiseks vajalikud paketid, mitte midagi liigset lisamata. Ja mis k\u00f5ige t\u00e4htsam, mitte segada hostiserveri ja teiste projektide pakette ja keskkonda. See t\u00e4hendab, et k\u00f5ik serveris t\u00f6\u00f6tavad projektid Docker'i kaudu v\u00f5ivad kasutada t\u00e4iesti erinevaid pakette ja t\u00e4iesti erinevat keskkonda.<\/p>\n<h4>3. Konfiguratsioon<\/h4>\n<p>\nHoia konfiguraatoreid konstantidena otse koodis. Erinevad konstantid testserveri jaoks, erinevad tootmise jaoks. Siduge rakenduse t\u00f6\u00f6 keskkonna j\u00e4rgi otse projekti \u00e4rilogikas if else konstruktsioonide abil.<\/p>\n<p><b>Konfiguratsioonid<\/b> \u2014 see on ainus, millega projekti rakendused (deployment) peaksid eristuma. Ideaalis peaks konfiguratsioon edastatama keskkonnamuutujate (env vars) kaudu. <\/p>\n<p>Seega isegi kui hoiate mitu konfigureerimisfaili .config.prod .config.local ja nimetate need deployimise hetkel \u00fcmber .config (peamine konfig, millest rakendus andmeid loeb) - see ei ole \u00f5ige l\u00e4henemine, kuna antud juhul on konfigureerimise teave k\u00f5igile rakenduse arendajatele kergesti k\u00e4ttesaadav ja tootmiserveri andmed v\u00f5ivad olla ohustatud. K\u00f5ik konfigureerimised peavad olema salvestatud otse t\u00f6\u00f6degevuss\u00fcsteemi (CI\/CD) ja genereeritud erinevate keskkondade jaoks erinevate v\u00e4\u00e4rtustega, mis on vajalikud konkreetse keskkonna jaoks just deployimise hetkel.<\/p>\n<h4>4. Kolmandad teenused (Backing Services)<\/h4>\n<p>\nSeotage tugevalt keskkonnaga, kasutage erinevaid \u00fchendusi samadele teenustele teatud keskkondades.<\/p>\n<p>Tegelikult kattub see punkt tugevalt konfigureerimispunktiga, kuna ilma selle punktita ei ole v\u00f5imalik luua korralikke konfigureerimisandmeid ja \u00fcldse v\u00f5imalust konfigureerimist ei ole.<\/p>\n<p>K\u00f5ik \u00fchendused v\u00e4liste teenustega, nagu j\u00e4rjekorra serverid, andmebaasid, vahem\u00e4lu teenused, peavad olema \u00fchtsed nii kohalikus keskkonnas kui ka v\u00e4lises \/ tootmis keskkonnas. Teisis\u00f5nu, ma v\u00f5in igal hetkel \u00fchenduse stringi muutes asendada p\u00e4ringud andmebaas #1 andmebaas #2-ga ilma rakenduskoodi muutmata. V\u00f5i et mitte liiga kaugele minna, n\u00e4iteks tuleb see, et teenuse skaleerimisel ei pea te t\u00e4iendava vahem\u00e4lu serveri jaoks \u00fchendust mingil erilisel viisil n\u00e4itama.<\/p>\n<h4>5. Kogumine, v\u00e4ljaandmine, t\u00e4itmine<\/h4>\n<p>\nOlge serveris ainult l\u00f5ppversiooniga kood, ilma v\u00f5imaluseta tagasi relisi tagasi p\u00f6\u00f6rduda. \u00c4rge t\u00e4itke kettaruumi. Kes arvab, et v\u00f5ib tootmisse lasta viga sisaldava koodi, see on halb programmeerija!<\/p>\n<p>K\u00f5ik deployimise etapid peavad olema omavahel eraldatud.<\/p>\n<p>Olge v\u00f5imalus tagasi p\u00f6\u00f6rduda. Tehke v\u00e4ljaanded, hoides kiirelt juurdep\u00e4\u00e4setavaid vanu koopiaid rakendusest (juba koostatud ja valmis lahinguks), et vigade korral taastada vana versioon. Seega tinglikult on olemas kaust <i>releases<\/i> ja kaust <i>current<\/i>, ja p\u00e4rast edukat deploy\u2019d ja koostamist seondub kaust <i>current<\/i> symbolilise lingiga uue v\u00e4ljaandega, mis asub sees <i>releases<\/i> tinglikult versiooninumbri nimega. <\/p>\n<p>Siin tuletame meelde Blue-Green deploymente, mis v\u00f5imaldab mitte ainult koodi vahel vahetada, vaid ka vahetada k\u00f5iki ressursse ja isegi keskkondi tagasi kerimise v\u00f5imalusega.<\/p>\n<h4>6. Protsessid<\/h4>\n<p>\nHoidke rakenduse olekuandmeid otse rakenduses enda sees. Kasutage rakenduse m\u00e4lu seansse. Kasutage v\u00f5imalikult palju teenuste vahel jagatavaid andmeid. Siduge ennast sellega, et rakendusel v\u00f5ib olla ainult \u00fcks protsess ja \u00e4rge lubage skaleerimist.<\/p>\n<p>Seoste osas hoidke andmeid ainult kolmandate osapoolte hallatavas vahem\u00e4lus (memcached, redis), nii et isegi kui teil on k\u00e4imas 20 rakenduse protsessi, v\u00f5ib \u00fcksk\u00f5ik milline neist vahem\u00e4lu poole p\u00f6\u00f6rdudes j\u00e4tkata t\u00f6\u00f6d kliendiga samas olekus, milles kasutaja rakendusega t\u00f6\u00f6tas teises protsessis. Sellise l\u00e4henemisega t\u00f6\u00f6tab k\u00f5ik sujuvalt ja ilma probleemideta andmete juurde p\u00e4\u00e4semisel, olenemata sellest, kui palju kolmandate osapoolte teenuseid kasutate.<\/p>\n<h4>7. Portide sidumine (Port binding)<\/h4>\n<p>\nKolmandate osapoolte teenuseid peab tundma ainult veebiserver. Veel parem on t\u00f5sta kolmandate osapoolte teenuseid otse veebiserveris \u00fcles. N\u00e4iteks nagu PHP moodul Apache's.<br \/>\nK\u00d5IK teie teenused peavad olema \u00fcksteisele kergesti k\u00e4ttesaadavad, helistades m\u00f5nele aadressile ja pordile (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), see t\u00e4hendab, et nginxist p\u00e4\u00e4sen nii php-fpm'ile kui postgres'ile, ning php-fpm'ist postgres'ile ja nginx'ile, ning \u00fcldiselt saan iga teenuse kaudu juurde p\u00e4\u00e4seda teisele teenusele. Niisiis, teenuse eluj\u00f5ud ei s\u00f5ltu teisest teenusest.<\/p>\n<h4>8. Paralellism<\/h4>\n<p>\nT\u00f6\u00f6tage \u00fche protsessiga, et mitmed protsessid \u00fcksteisega h\u00e4sti ei sobiks! <\/p>\n<p>J\u00e4tke skaleerimise v\u00f5imalus. Docker Swarm sobib selleks suurep\u00e4raselt. <br \/>\nDocker Swarm on t\u00f6\u00f6riist, mis v\u00f5imaldab luua ja hallata konteinerikliastreid nii erinevate masinate vahel kui ka palju konteinerite \u00fche masina peal.<\/p>\n<p>Kasutades swarm'i, saan m\u00e4\u00e4rata, kui palju ressursse ma iga protsessi jaoks eraldan ja kui palju sama teenuse protsesse ma k\u00e4itan, ning sisemine tasakaalustaja, v\u00f5ttes andmeid m\u00e4\u00e4ratud portilt, suunab need automaatselt protsessidele. Seega, n\u00e4hes, et serveri koormus on kasvanud, v\u00f5in lisada rohkem protsesse, v\u00e4hendades seel\u00e4bi teatud protsesside koormust.<\/p>\n<h4>9. Utiliseeritavus (Disposability)<\/h4>\n<p>\n\u00c4rge kasutage j\u00e4rjekordi protsesside ja andmete t\u00f6\u00f6tlemiseks. \u00dche protsessi l\u00f5petamine peaks m\u00f5jutama kogu rakenduse t\u00f6\u00f6d. Kui \u00fcks teenus kukub, kukub k\u00f5ik.<\/p>\n<p>Iga protsess ja teenus v\u00f5ivad olla igal ajal v\u00e4lja l\u00fclitatud ning see ei tohiks m\u00f5jutada teisi teenuseid (jutt ei ole sellest, et teenus ei ole kergesti teistele teenustele k\u00e4tte saadav, vaid et teine teenus ei l\u00fclitu v\u00e4lja selle taga). K\u00f5ik protsessid peaksid l\u00f5petama pehmelt, nii et nende l\u00f5petamisel ei kahjustata andmeid ja j\u00e4rgmine kord, kui s\u00fcsteem sisse l\u00fclitub, t\u00f6\u00f6tab see korrektselt. Seega ei tohi isegi eriolukordade l\u00f5petamisel andmed kannatada, (siia sobib tehingute mehhanism, andmebaasi p\u00e4ringud t\u00f6\u00f6tavad ainult gruppide kaupa ja kui \u00fckski p\u00e4ring grupi seest ei \u00f5nnestunud v\u00f5i \u00f5nnestus vea t\u00f5ttu, siis ei soorita tegelikult \u00fchtegi teist p\u00e4ringut grupist).<\/p>\n<h4>10. Arenduse\/t\u00f6\u00f6 rakenduse paaritunne<\/h4>\n<p>\nProdaktsioon, stseen ja kohalik versioon rakendusest peaksid olema erinevad. Prodaktsioonis on meil raamistik Yii Lite, aga kohalikult Yii, et tootmisprotsess k\u00e4iks kiiremini!<\/p>\n<p>Tegelikult peaks k\u00f5ik juurutamised ja koodiga t\u00f6\u00f6tamine toimuma peaaegu identsetes keskkondades (jutt ei ole f\u00fc\u00fcsilisest riistvarast). Samuti peab igal arendaja t\u00f6\u00f6tajal olema v\u00f5imalus vajadusel kood produktsioonis juurutada, mitte mingil erikoolitatud devops osakonnal, mis vaid erilise v\u00f5ime t\u00f5ttu suudab rakenduse produktsioonis \u00fcles t\u00f5sta.<\/p>\n<p>Selles aitab meid samuti Docker. Kui k\u00f5ik eelnevad punktid on t\u00e4idetud, toob Docker keskkonna juurutamise protsessi nii tootmises kui ka kohalikul masinal \u00fche-kahte k\u00e4su sisestamiseni.<\/p>\n<h4>11. Logimine (Logs)<\/h4>\n<p>\nKirjutame logid failidesse ja andmebaasi! Failide ja andmebaasi logisid ei puhastata. Ostame lihtsalt 9000 Petabaiti k\u00f5vaketta ja on k\u00f5ik.<\/p>\n<p>K\u00f5iki logisid tuleks k\u00e4sitleda kui s\u00fcndmuste voogu. Rakendus ei tohi logide t\u00f6\u00f6tlemisega tegeleda. Logid peaksid kas ilmuma stdout-sse v\u00f5i olema saadetavad protokolli kaudu nagu udp, et rakendusele ei tekiks logide t\u00f6\u00f6tlemisest probleeme. Selle jaoks sobib v\u00e4ga h\u00e4sti graylog. Graylog, mis v\u00f5tab vastu k\u00f5ik logid udp kaudu (selle protokolli puhul ei ole vajalik oodata kinnitust paketi edukast vastuv\u00f5tmisest), ei sega rakendust mingil viisil ning tegeleb ainult logide struktureerimise ja t\u00f6\u00f6tlemisega. Rakenduse loogika ei muutu sarnaste l\u00e4henemiste kasutamise korral.<\/p>\n<h4>12. Administratiivsed \u00fclesanded<\/h4>\n<p>\nAndmete, andmebaasi jne v\u00e4rskendamiseks kasutage eraldi loodud l\u00f5pp-punkti API-s, mille kahe korda j\u00e4rjestikune t\u00e4itmine v\u00f5ib p\u00f5hjustada andmete dubleerimist. Kuid te ei ole ju lollid, et vajutada kaks korda, ega me vajame migreerimisi.<\/p>\n<p>K\u00f5ik administratiivsed \u00fclesanded peavad toimuma samas keskkonnas nagu kogu kood, versioonide tasemel. See t\u00e4hendab, et kui me peame andmebaasi struktuuri muutma, siis me ei tee seda k\u00e4sitsi, muutes veergude nimesid ja lisades uusi visuaalsete andmebaasi haldust\u00f6\u00f6riistade kaudu. Selliste asjade jaoks loome eraldi skriptid \u2014 migreerimised, mis teostatakse k\u00f5ikjal ja k\u00f5igis keskkondades sama tulemuse saavutamiseks. K\u00f5ikide teiste \u00fclesannete jaoks, n\u00e4iteks projekti andmete t\u00e4itmiseks, tuleks rakendada sarnaseid meetodoloogiaid.<\/p>\n<h3>PHP, Laravel, Laradock, Docker-Compose n\u00e4idisrakendus<\/h3>\n<p>\nP.S. K\u00f5ik n\u00e4ited on tehtud MacOS-il. Suurem osa neist sobib ka Linuxile. Windowsi kasutajad, palun andke andeks, aga ma ei ole Windowsiga pikka aega t\u00f6\u00f6tanud.<\/p>\n<p>Kujutame ette olukorda, kus meie PC-s ei ole \u00fchtegi PHP versiooni ega \u00fcldse midagi. <br \/>\nPaigaldame dockerit ja docker-compose'i uusimad versioonid. (seda saab leida internetist)<\/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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" 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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaradocki kohta v\u00f5in \u00f6elda, et see on v\u00e4ga hea asi, milles on kogutud palju konteinerit ja abivahendeid. Kuid kasutada Laradocki tootmisversioonis muutmata kujul \u2014 ma ei soovitaks selle \u00fclem\u00e4\u00e4rasuse t\u00f5ttu. Paremini on luua oma konteinerid, tuginedes Laradocki n\u00e4idetele, sest niimoodi on optimeerimine v\u00f5imalik, kuna keegi ei vaja k\u00f5ike, mis seal on, korraga.<\/p>\n<p>2. Konfigureerime Laradocki oma rakenduse t\u00f6\u00f6de jaoks.<\/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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Avame habr kataloog (vanemapakk, kuhu laradock on kloonitud) m\u00f5nes redaktoris. (Minu puhul PHPStorm)<\/p>\n<p>Nendel etappidel paneme ainult projekti nime.<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. K\u00e4ivitame workspace'i pildi. (Teie puhul pildid ehitatakse m\u00f5nda aega)<br \/>\nWorkspace on spetsiaalselt ette valmistatud pilt raamistiku jaoks arendaja nime alt.<\/p>\n<p>Siseneme konteinerisse j\u00e4rgmise abil <\/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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Installime 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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. P\u00e4rast installimist kontrollime, kas projekti kataloog on loodud, ja l\u00f5petame 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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Naaseme tagasi PHPStormi ning seame \u00f5igesti teed meie laravel rakenduse .env failis.<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" 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 kusagil mujal) repositooriumi. 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;esimene commit&quot;\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # siin on link teie reposse\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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMugavuse huvides soovitan kasutada m\u00f5nda visuaalset liidest Git-i 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 avatud.<\/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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega koosneb meie projekt 3 eraldi teenusest:<\/p>\n<ul>\n<li>nginx \u2014 veebiserver<\/li>\n<li>php-fpm \u2014 php veebiserverilt saadud p\u00e4ringute vastuv\u00f5tmiseks<\/li>\n<li>workspace \u2014 php arendaja jaoks<\/li>\n<\/ul>\n<p>\nPraeguseks oleme saavutanud, et oleme loonud rakenduse, mis vastab juba 4 punktile 12-st, nimelt:<\/p>\n<p>1. <b>Koodibaas<\/b> \u2014 kogu kood asub \u00fches repositooriumis (v\u00e4ike m\u00e4rkus: v\u00f5ib-olla oleks \u00f5igem tuua docker laraveli projekti, kuid see ei ole p\u00f5him\u00f5tteline).<\/p>\n<p>2. <b>S\u00f5ltuvused<\/b> \u2014 K\u00f5ik meie s\u00f5ltuvused on selgelt kirjas application\/composer.json failis ja igas konteineri Dockerfile'is.<\/p>\n<p>3. <b>V\u00e4lishaldusteenused (Backing Services)<\/b> \u2014 Iga teenus (php-fpm, nginx, workspace) elab oma elu ning on v\u00e4ljastpoolt \u00fchendatud, ja kui t\u00f6\u00f6tame \u00fche teenusega, ei m\u00f5juta see teist.<\/p>\n<p>4. <b>Protsessid<\/b> \u2014 iga teenus on \u00fcks protsess. Iga teenus ei hoia sisemist seisundit.<\/p>\n<p>5.<b> Pordiseondumine (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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNagu n\u00e4eme, on iga teenus k\u00e4ivitunud oma porti peal ja on saadaval k\u00f5igile muudele teenustele.<\/p>\n<p>6.<b> Paralleelsus <\/b><\/p>\n<p>Docker v\u00f5imaldab meil t\u00f5sta mitu protsessi sama teenuse jaoks automaatse koormuse tasakaalustamisega nende vahel. <\/p>\n<p>L\u00f5petame konteinerid ja k\u00e4ivitame need uuesti lipu kaudu. <b>&#8212; skaala<\/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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNagu me n\u00e4eme, on php-fpm konteinerite koopiad loodud. Me ei pea selle konteineri t\u00f6\u00f6s midagi muutma. J\u00e4tkame selle poole p\u00f6\u00f6rdumist porti 9000 kaudu, samal ajal kui Docker reguleerib meie jaoks koormust konteinerite vahel.<\/p>\n<p>7. <b>Utiliseeritavus (Disposability)<\/b> \u2014 iga konteinerit saab katkestada ilma teistele kahju tekitamata. Kaugjuhtimine v\u00f5i konteineri taask\u00e4ivitamine ei m\u00f5juta rakenduse toimimist j\u00e4rgnevatel k\u00e4ivitustel. Iga konteinerit saab ka igal ajal \u00fcles t\u00f5sta.<\/p>\n<p>8. <b>Rakenduse arenduse\/operatsiooni 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 samal Dockeril.<\/p>\n<p>9. <b>Logimine (Logs)<\/b> \u2014 k\u00f5ik logid nendes konteinerites voolavad otse ja on n\u00e4htavad Dockeri konsoolis. (selles juhtumis, tegelikult v\u00f5ib see teiste isetehtud konteinerite puhul olla erinev, kui te sellele ei m\u00f5tle)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuid siin on probleem selles, et PHP ja Nginxi vaikeseaded salvestavad samuti logid faili. 12 teguri n\u00f5uete j\u00e4rgimiseks on vajalik <b>Saadaval on Firefox 121. Uued omadused: Toetatakse Waylandit.<\/b> logide salvestamine faili iga konteineri eraldi seadistustes.<\/p>\n<p>Docker pakub ka v\u00f5imalust suunata logid mitte ainult stdout'i, vaid ka sellistesse asjadesse nagu graylog, millest r\u00e4\u00e4kisin varem. Ja graylogi sees saame logidega teha igasuguseid toiminguid, ilma et meie rakendus seda m\u00e4rkaks.<\/p>\n<p>10. <b>Haldus\u00fclesanded<\/b> \u2014 k\u00f5ik haldus\u00fclesanded lahendab Laravel, kasutades artisan t\u00f6\u00f6riista t\u00e4pselt nii, nagu 12-faktori rakenduse loojaid sooviks.<\/p>\n<p>N\u00e4itena n\u00e4itan, kuidas m\u00f5ned k\u00e4sud t\u00e4idetakse.<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 tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00fc\u00fcd saame kasutada mingeid k\u00e4ske. (pange t\u00e4hele, et me ei ole andmebaasi ja vahem\u00e4lu seadistanud, seega ei toimi pooled k\u00e4sud korrektselt, kuna need on m\u00f5eldud vahem\u00e4lu ja andmebaasiga t\u00f6\u00f6tamiseks).<\/p>\n<p><img decoding=\"async\" alt=\"Rakenduste arendamine ja Blue-Green tellimine, tuginedes The Twelve-Factor App metoodikale koos php ja docker&#039;i n\u00e4idetega\" 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, vabastamine, t\u00e4itmine<\/b><\/p>\n<p>Selle osa soovisin p\u00fchendada Blue-Green Deployment'ile, kuid see osutus selle artikli jaoks liiga keeruliseks. Kirjutan sellest eraldi artikli. <\/p>\n<p>L\u00fchidalt \u00f6eldes p\u00f5hineb kontseptsioon CI\/CD s\u00fcsteemidel nagu <b>Jenkinsile<\/b> ja <b>Gitlab CI<\/b>. N nii selles kui ka teises saab seada keskkonna spetsiifilisi keskkonnamuutujate v\u00e4\u00e4rtusi. Seet\u00f5ttu t\u00e4idetakse selle korralduse punkt <b>Seadistuste<\/b>.<\/p>\n<p>Ja punkt seoses <b>Kogumine, vabastamine, t\u00e4itmine<\/b> lahendatakse m\u00f5lema utiliidi sisseehitatud funktsioonide abil nimega <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> v\u00f5imaldab jagada deploimentprotsessi mitmeks etapiks, eraldades ehitamise, vabastamise ja teostamise faasid. Samuti saate Pipeline'is luua varukoopiaid ja tegelikult teha mida iganes. See on t\u00f6\u00f6riist, millel on piiramatu potentsiaal.<\/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 algatada, kui kloonite seda hoidlat.<\/p>\n<p>P.S.: K\u00f5iki neid l\u00e4henemisviise saab kasutada ka muude utiliitide ja programmeerimiskeeltega. Peamine on, 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 5.0.1.1 - 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\/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) 5.0.1.1\" \/>\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: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\udd47Rakenduste arendamine ja Blue-Green deploiment, toetudes The Twelve-Factor App metodoloogiale koos php ja docker n\u00e4idetega | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}