{"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\/sq\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Fillimish, pak teori. \u00c7far\u00eb \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nMe fjal\u00eb t\u00eb thjeshta, ky \u00ebsht\u00eb nj\u00eb dokument q\u00eb ka p\u00ebr q\u00ebllim t\u00eb thjeshtoj\u00eb zhvillimin e aplikacioneve SaaS, duke ndihmuar ata q\u00eb informon zhvilluesit dhe inxhinier\u00ebt DevOps p\u00ebr problemet dhe praktikat q\u00eb shpesh hasen n\u00eb zhvillimin e aplikacioneve moderne. <\/p>\n<p>Dokumenti \u00ebsht\u00eb formuar nga zhvilluesit e platform\u00ebs Heroku.<\/p>\n<p>Metodologjia e dymb\u00ebdhjet\u00eb faktor\u00ebve (The Twelve-Factor App) mund t\u00eb aplikohet p\u00ebr aplikacione t\u00eb shkruara n\u00eb \u00e7do gjuh\u00eb programuese dhe q\u00eb p\u00ebrdorin \u00e7do kombinim t\u00eb sh\u00ebrbimeve t\u00eb jashtme (backing services) (baza t\u00eb dh\u00ebnash, radh\u00eb mesazhesh, cache etj.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>N\u00eb shkurt, p\u00ebr faktor\u00ebt mbi t\u00eb cil\u00ebt nd\u00ebstohet kjo metodologji:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Baza e kodit<\/b> \u2013 Nj\u00eb baz\u00eb kodimi, e ndjekur n\u00eb sistemin e kontrollit t\u00eb versioneve \u2013 shum\u00eb shp\u00ebrndarje <\/li>\n<li><b>Var\u00ebsit\u00eb<\/b> \u2013 Deklaroni dhe izoloni qart\u00eb var\u00ebsit\u00eb<\/li>\n<li><b>Konfigurimi<\/b> \u2013 Ruani konfigurimin n\u00eb mjedisin e ekzekutimit<\/li>\n<li><b>Sh\u00ebrbimet e jashtme (Backing Services)<\/b> \u2013 Merrni sh\u00ebrbimet e jashtme (backing services) si burime t\u00eb lidhura<\/li>\n<li><b>Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/b> \u2013 Ndani me rigoroze fazat e nd\u00ebrtimit dhe ekzekutimit<\/li>\n<li><b>Proceset<\/b> \u2013 Ekzekutoni aplikacionin si nj\u00eb ose disa procese pa ruajtur gjendjen e brendshme (stateless) <\/li>\n<li><b>Pengimi i porteve (Port binding)<\/b> \u2013 Ekspozoni sh\u00ebrbimet p\u00ebrmes pengimit t\u00eb porteve <\/li>\n<li><b>Paralelizmi<\/b> \u2013 Shkall\u00ebzoni aplikacionin me procese <\/li>\n<li><b>Shkall\u00ebzueshm\u00ebria (Disposability)<\/b> \u2013 Maksimizoni besueshm\u00ebrin\u00eb me nisje t\u00eb shpejt\u00eb dhe p\u00ebrfundime t\u00eb sakta <\/li>\n<li><b>Pariteti i zhvillimit\/pun\u00ebs s\u00eb aplikacionit<\/b> \u2013 Mbani mjediset e zhvillimit, shp\u00ebrndarjes p\u00ebr prov\u00eb (staging) dhe shp\u00ebrndarjes n\u00eb prodhim (production) sa m\u00eb t\u00eb ngjashme <\/li>\n<li><b>Regjistrimi (Logs)<\/b> \u2013 Konsideroni regjistrimin si nj\u00eb rrjedh\u00eb eventesh<\/li>\n<li><b>Detyrat e administrat\u00ebs<\/b> \u2013 Kryeni detyrat e administrat\u00ebs\/me menaxhimin p\u00ebrmes proceseve nj\u00ebher\u00ebsh <\/li>\n<\/ol>\n<p>\n<b>M\u00eb shum\u00eb informacion mbi 12 faktor\u00ebt mund t\u00eb merrni nga k\u00ebto burime:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Burimi zyrtar<\/a><\/noindex> \u2014 i domosdosh\u00ebm p\u00ebr t'u lexuar<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikulli n\u00eb habr. Aplikacioni i dymb\u00ebdhjet\u00eb faktor\u00ebve \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 p\u00ebrkthimi zyrtar<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Artikulli n\u00eb habr. 7 faktor\u00ebt q\u00eb mungojn\u00eb n\u00eb qasjen 12 Factor App<\/a><\/noindex> \u2014 nj\u00eb p\u00ebrmbledhje e re mbi 12 faktor\u00ebt me q\u00ebllim p\u00ebrmir\u00ebsimin e tyre.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00c7far\u00eb \u00ebsht\u00eb Blue-Green deployment?<\/h3>\n<p>\nBlue-Green deployment \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb p\u00ebr shp\u00ebrndarjen e aplikacionit n\u00eb <b>production<\/b> k\u00ebshtu q\u00eb klienti p\u00ebrfundimtar nuk sheh asnj\u00eb ndryshim nga ana e tij. N\u00eb fjal\u00eb t\u00eb tjera, implementimi i aplikacionit me zero <b>nd\u00ebrprerje<\/b>.<\/p>\n<p>Schema tradicionale BG Deploy duket ashtu si\u00e7 \u00ebsht\u00eb e treguar n\u00eb imazhin m\u00eb posht\u00eb. <\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>N\u00eb fillim ka 2 servera fizik\u00eb me t\u00eb nj\u00ebjtin kod, aplikacion, projekt, dhe ka nj\u00eb router (balancues). <\/li>\n<li>Routeri fillimisht drejton t\u00eb gjitha k\u00ebrkesat n\u00eb nj\u00ebrin prej server\u00ebve (<b>e blu<\/b>). <\/li>\n<li>N\u00eb momentin kur \u00ebsht\u00eb e nevojshme t\u00eb b\u00ebni s\u00ebrish nj\u00eb publikim, e gjith\u00eb projekti p\u00ebrmir\u00ebsohet n\u00eb serverin tjet\u00ebr (<b>alfa<\/b>), i cili n\u00eb at\u00eb moment nuk po p\u00ebrpunon asnj\u00eb k\u00ebrkes\u00eb. <\/li>\n<li>Pasi kodi n\u00eb <b>serverin e kalt\u00ebr<\/b> \u00ebsht\u00eb p\u00ebrmir\u00ebsuar plot\u00ebsisht, routeri merr udh\u00ebzimin p\u00ebr t\u00eb kaluar nga <b>i gjelb\u00ebr<\/b> n\u00eb <b>alfa<\/b> server. <\/li>\n<li>Tani t\u00eb gjith\u00eb klient\u00ebt shikojn\u00eb rezultatin e pun\u00ebs s\u00eb kodit nga <b>i kalt\u00ebr<\/b> t\u00eb serverit fizik. <\/li>\n<li> Nj\u00eb koh\u00eb t\u00eb caktuar, <b>e blu<\/b> serveri sh\u00ebrben si nj\u00eb rezerv\u00eb p\u00ebr rastin e d\u00ebshtimit t\u00eb publikimit n\u00eb <b>alfa<\/b> server dhe n\u00eb rast d\u00ebshtimi dhe gabimesh, routeri kthen fluksin e p\u00ebrdoruesve p\u00ebrs\u00ebri n\u00eb <b>e blu<\/b> serverin me versionin e vjet\u00ebr stabil, dhe kodi i ri d\u00ebrgohet p\u00ebr p\u00ebrmir\u00ebsim dhe testim.<\/li>\n<li>Dhe n\u00eb fund t\u00eb procesit, po ashtu p\u00ebrmir\u00ebsohet <b>e blu<\/b> serveri. Dhe pas p\u00ebrmir\u00ebsimit t\u00eb tij, routeri kthen fluksin e k\u00ebrkesave p\u00ebrs\u00ebri n\u00eb <b>e blu<\/b> server.<\/li>\n<\/ul>\n<p>\nKjo duket shum\u00eb mir\u00eb dhe n\u00eb shikim t\u00eb par\u00eb nuk duhet t\u00eb ket\u00eb asnj\u00eb problem me t\u00eb.<br \/>\nPor pasi q\u00eb jetojm\u00eb n\u00eb nj\u00eb bot\u00eb moderne, opsioni i kalimit fizik ashtu si\u00e7 tregohet n\u00eb sh\u00ebm\u00ebn tradicionale nuk na p\u00ebrshtatet. Regjistroni informacionin tani, ne do t\u00eb kthehemi tek ai m\u00eb von\u00eb.<\/p>\n<h3>K\u00ebshilla t\u00eb k\u00ebqija dhe t\u00eb mira<\/h3>\n<p>\n<i>Kufizimi<\/i>: N\u00eb shembujt m\u00eb posht\u00eb jan\u00eb sh\u00ebnuar utilitetet \/ metodologjit\u00eb q\u00eb un\u00eb p\u00ebrdor, ju mund t\u00eb p\u00ebrdorni \u00e7do alternativ\u00eb tjet\u00ebr me funksione t\u00eb ngjashme. <\/p>\n<p>Pjesa m\u00eb e madhe e shembujve do t\u00eb has\u00eb ndonj\u00ebher\u00eb me zhvillimin web (kjo \u00ebsht\u00eb e papritur), me PHP dhe Docker.<\/p>\n<p>N\u00eb pikat m\u00eb posht\u00eb jepet nj\u00eb p\u00ebrshkrim praktik i p\u00ebrdorimit t\u00eb faktor\u00ebve n\u00eb shembuj t\u00eb caktuar, n\u00ebse d\u00ebshironi nj\u00eb teori m\u00eb t\u00eb thell\u00eb rreth k\u00ebtij subjekti, referojuni lidhjeve m\u00eb lart p\u00ebr burimin origjinal. <\/p>\n<h4>1. Baza e kodit<\/h4>\n<p>\nP\u00ebrdorni FTP dhe FileZilla duke ngarkuar skedar\u00ebt n\u00eb server\u00eb nj\u00eb nga nj\u00eb, mos e ruani kodin askund p\u00ebrve\u00e7se n\u00eb serverin e prodhimit.<\/p>\n<p>N\u00eb projekt duhet t\u00eb ket\u00eb gjithmon\u00eb nj\u00eb baz\u00eb t\u00eb vetme kodimi, dometh\u00ebn\u00eb, e gjith\u00eb kodi vjen nga nj\u00eb vend. <b>Git<\/b> repozitoreve. Serverat (production, staging, test1, test2 ...) p\u00ebrdorin kodin nga deg\u00ebt e nj\u00eb repo t\u00eb p\u00ebrbashk\u00ebt. K\u00ebshtu arrijm\u00eb konsistenc\u00ebn e kodit.<\/p>\n<h4>2. Var\u00ebsit\u00eb<\/h4>\n<p>\nShkarkoni t\u00eb gjitha bibliotekat n\u00eb dosje direkt n\u00eb rr\u00ebnj\u00ebn e projektit. B\u00ebni p\u00ebrdit\u00ebsimet duke transferuar thjesht kodin e ri n\u00eb dosjen me versionin aktual t\u00eb bibliotek\u00ebs. Instaloni t\u00eb gjitha utilitar\u00ebt direkt n\u00eb serverin ku funksionojn\u00eb edhe 20 sh\u00ebrbime t\u00eb tjera.<\/p>\n<p>Projekti gjithmon\u00eb duhet t\u00eb ket\u00eb nj\u00eb list\u00eb t\u00eb qart\u00eb dhe t\u00eb kuptueshme t\u00eb var\u00ebsive (n\u00ebn var\u00ebsi mendoj gjithashtu dhe ambientin). T\u00eb gjitha var\u00ebsit\u00eb duhet t\u00eb jen\u00eb t\u00eb p\u00ebrcaktuara qart\u00eb dhe t\u00eb izoluara. <br \/>\nSi nj\u00eb shembull do t\u00eb marrim <b>Composer<\/b> dhe <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 menaxherin e paketave q\u00eb lejon t\u00eb instaloni bibliotekat n\u00eb PHP. Composer jep mund\u00ebsin\u00eb t\u00eb tregoni versionet n\u00eb m\u00ebnyr\u00eb strikte ose jo strikte dhe t\u2019i p\u00ebrcaktoni ato qart\u00eb. N\u00eb server mund t\u00eb ket\u00eb 20 projekte t\u00eb ndryshme dhe \u00e7do nj\u00ebri do t\u00eb ket\u00eb list\u00ebn e vet t\u00eb pakove dhe bibliotekave q\u00eb nuk varen nga nj\u00ebri-tjetri.<\/p>\n<p><b>Docker<\/b> \u2014 utilitarin q\u00eb lejon t\u00eb p\u00ebrcaktoni dhe izoloni ambientin n\u00eb t\u00eb cilin do t\u00eb punoj\u00eb aplikacioni. N\u00eb p\u00ebrputhje me t\u00eb nj\u00ebjt\u00ebn logjik\u00eb si me composer, por m\u00eb thelb\u00ebsisht, ne mund t\u00eb p\u00ebrcaktojm\u00eb me \u00e7far\u00eb punon aplikacioni. Zgjidhni nj\u00eb version specifik t\u00eb PHP, instaloni vet\u00ebm paketat e nevojshme p\u00ebr funksionimin e projektit, pa shtuar asgj\u00eb t\u00eb tep\u00ebrt. Dhe m\u00eb e r\u00ebnd\u00ebsishmja, pa u nd\u00ebrprer\u00eb me paketat dhe ambientin e makineris\u00eb prit\u00ebse dhe projekteve t\u00eb tjera. Pra, t\u00eb gjitha projektet n\u00eb server q\u00eb funksionojn\u00eb p\u00ebrmes Docker-it, mund t\u00eb p\u00ebrdorin nj\u00eb set t\u00eb \u00e7do hap\u00ebsire pakash dhe nj\u00eb ambient krejt\u00ebsisht t\u00eb ndrysh\u00ebm.<\/p>\n<h4>3. Konfigurimi<\/h4>\n<p>\nRuani konfigurimet si konstanta drejtp\u00ebrdrejt n\u00eb kod. Konstanta t\u00eb ve\u00e7anta p\u00ebr serverin testues, t\u00eb ve\u00e7anta p\u00ebr prodhimin. Lidheni pun\u00ebn e aplikacionit n\u00eb var\u00ebsi t\u00eb ambientit drejtp\u00ebrdrejt n\u00eb logjik\u00ebn biznesore t\u00eb projektit duke p\u00ebrdorur konstrukte if else.<\/p>\n<p><b>Konfigurimet<\/b> \u2014 kjo \u00ebsht\u00eb e vetmja gj\u00eb me t\u00eb cil\u00ebn duhet t\u00eb ndryshojn\u00eb zbatimet e projektit (deployment). N\u00eb m\u00ebnyr\u00eb ideale, konfigurimet duhet t\u00eb transmetohen p\u00ebrmes variablave t\u00eb ambientit (env vars). <\/p>\n<p>Pra ndaj, edhe n\u00ebse do t\u00eb ruani disa skedar\u00eb konfigurimi .config.prod .config.local dhe do t'i rinominoni ata n\u00eb momentin e implementimit n\u00eb .config (konfigura kryesore nga e cila aplikacioni lexon t\u00eb dh\u00ebnat) \u2014 ky do t\u00eb ishte nj\u00eb qasje e gabuar, pasi n\u00eb k\u00ebt\u00eb rast informacioni nga konfigurimet do t\u00eb ishte i qassh\u00ebm p\u00ebr t\u00eb gjith\u00eb zhvilluesit e aplikacionit dhe t\u00eb dh\u00ebnat nga serveri i prodhimit do t\u00eb kompromitoheshin. T\u00eb gjitha konfigurimet duhet t\u00eb ruhen drejtp\u00ebrdrejt n\u00eb sistemin e implementimit (CI\/CD) dhe t\u00eb gjenerohen p\u00ebr ambjente t\u00eb ndryshme me vlera t\u00eb ndryshme t\u00eb nevojshme p\u00ebr ambjentin specifik pik\u00ebrisht n\u00eb momentin e implementimit.<\/p>\n<h4>4. Sh\u00ebrbime t\u00eb jashtme (Backing Services)<\/h4>\n<p>\nZgjidhni fort ambjentin, p\u00ebrdorni lidhje t\u00eb ndryshme p\u00ebr t\u00eb nj\u00ebjtat sh\u00ebrbime n\u00eb ambjente t\u00eb caktuara.<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, ky pik\u00eb fort e kryq\u00ebzon me pik\u00ebn mbi konfigurimet, sepse pa k\u00ebt\u00eb pik\u00eb, nuk \u00ebsht\u00eb e mundur t\u00eb krijoni t\u00eb dh\u00ebna t\u00eb mir\u00eb p\u00ebr konfigurim dhe mund\u00ebsia e konfigurimit do t\u00eb humbas\u00eb krejt\u00ebsisht.<\/p>\n<p>T\u00eb gjitha lidhjet me sh\u00ebrbime t\u00eb jashtme, si serverat e radh\u00ebs, bazat e t\u00eb dh\u00ebnave, sh\u00ebrbimet e caching duhet t\u00eb jen\u00eb t\u00eb nj\u00ebjta si p\u00ebr ambjentin lokal ashtu edhe p\u00ebr ambjentin e jasht\u00ebm \/ prodhimit. N\u00eb fjal\u00eb t\u00eb tjera, n\u00eb \u00e7do moment un\u00eb mund ta ndryshoj vargun e lidhjes p\u00ebr t\u00eb z\u00ebvend\u00ebsuar referencat nga baza #1 n\u00eb baz\u00ebn #2 pa ndryshuar kodin e aplikacionit. Ose duke shkuar m\u00eb p\u00ebrpara, si nj\u00eb shembull, kjo do t\u00eb ishte e p\u00ebrshtatshme n\u00eb rast t\u00eb shkall\u00ebzimit t\u00eb sh\u00ebrbimit, nuk do t'ju duhet t\u00eb jepni nj\u00eb lidhje t\u00eb ve\u00e7ant\u00eb p\u00ebr serverin e shtes\u00eb t\u00eb cache.<\/p>\n<h4>5. Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/h4>\n<p>\nKeni n\u00eb server vet\u00ebm versionin p\u00ebrfundimtar t\u00eb kodit, pa mund\u00ebsi p\u00ebr t\u00eb kthyer l\u00ebshimin p\u00ebrs\u00ebri. Nuk duhet t\u00eb bllokoni hap\u00ebsir\u00ebn e disqet. Kush mendon se mund t\u00eb d\u00ebrgoj\u00eb kod n\u00eb prodhim me nj\u00eb gabim, \u00ebsht\u00eb nj\u00eb programues i keq!<\/p>\n<p>T\u00eb gjitha fazat e implementimit duhet t\u00eb ndahen nga nj\u00ebra-tjetra.<\/p>\n<p>Keni mund\u00ebsin\u00eb t\u00eb ktheheni prapa. B\u00ebni l\u00ebshime duke ruajtur n\u00eb m\u00ebnyr\u00eb t\u00eb shpejt\u00eb kopje t\u00eb vjetra t\u00eb aplikacionit (t\u00eb nd\u00ebrtuara dhe gati p\u00ebr luft\u00eb), n\u00eb m\u00ebnyr\u00eb q\u00eb n\u00eb rast gabimesh t\u00eb riktheni versionin e vjet\u00ebr. Pra, n\u00eb nj\u00eb m\u00ebnyr\u00eb t\u00eb caktuar ka nj\u00eb dosje <i>releases<\/i> dhe nj\u00eb dosje <i>current<\/i>, dhe pas nj\u00eb implementimi dhe nd\u00ebrtimi t\u00eb suksessh\u00ebm, dosja <i>current<\/i> lidhet me nj\u00eb lidhje simbolike me l\u00ebshimin e ri q\u00eb ndodhet brenda <i>releases<\/i> me nj\u00eb em\u00ebr t\u00eb mundsh\u00ebm numrin e l\u00ebshimit. <\/p>\n<p>K\u00ebtu na kujtohet p\u00ebr Blue-Green deployment, i cili lejon jo vet\u00ebm kalimin mes kodit, por gjithashtu edhe kalimin mes t\u00eb gjitha burimeve dhe madje edhe ambienteve me mund\u00ebsin\u00eb p\u00ebr ta rikthyer gjith\u00e7ka mbrapsht.<\/p>\n<h4>6. Proceset<\/h4>\n<p>\nRuani t\u00eb dh\u00ebnat e gjendjeve t\u00eb aplikacionit direkt n\u00eb vet\u00eb aplikacionin. P\u00ebrdorni sesionet n\u00eb memorjen operuese t\u00eb aplikacionit. P\u00ebrdorni sa m\u00eb shum\u00eb t\u00eb dh\u00ebna t\u00eb ndara nd\u00ebrmjet sh\u00ebrbimeve t\u00eb jashtme. Kufizohuni me faktin se aplikacioni mund t\u00eb ket\u00eb vet\u00ebm nj\u00eb proces dhe mos lejoni mund\u00ebsin\u00eb e shkall\u00ebzimit.<\/p>\n<p>Sa i p\u00ebrket sesioneve, ruani t\u00eb dh\u00ebnat vet\u00ebm n\u00eb cache t\u00eb kontrolluar nga sh\u00ebrbime t\u00eb jashtme (memcached, redis), k\u00ebshtu q\u00eb, edhe n\u00ebse keni 20 procese t\u00eb aplikacionit t\u00eb nisura, \u00e7dokush prej tyre duke kontaktuar n\u00eb cache mund t\u00eb vazhdoj\u00eb t\u00eb punoj\u00eb me klientin n\u00eb t\u00eb nj\u00ebjtin gjendje q\u00eb p\u00ebrdoruesi ishte duke punuar me aplikacionin n\u00eb nj\u00eb proces tjet\u00ebr. Me k\u00ebt\u00eb qasje, pavar\u00ebsisht sa kopje sh\u00ebrbimesh t\u00eb jashtme p\u00ebrdorni, gjith\u00e7ka do t\u00eb funksionoj\u00eb n\u00eb m\u00ebnyr\u00eb normale dhe pa probleme me aksesin n\u00eb t\u00eb dh\u00ebna.<\/p>\n<h4>7. Nd\u00ebrprerja e porteve (Port binding)<\/h4>\n<p>\nVet\u00ebm serveri i internetit duhet t\u00eb dij\u00eb se si t\u00eb punoj\u00eb me sh\u00ebrbimet e jashtme. N\u00eb t\u00eb v\u00ebrtet\u00eb, \u00ebsht\u00eb m\u00eb mir\u00eb t'i ngreh\u00ebsh sh\u00ebrbimet e jashtme brenda serverit t\u00eb internetit. P\u00ebr shembull, si nj\u00eb modul PHP n\u00eb Apache.<br \/>\nT\u00eb gjitha sh\u00ebrbimet tuaja duhet t\u00eb jen\u00eb t\u00eb qasshme nj\u00ebra-tjetr\u00ebs p\u00ebrmes kontaktit me nj\u00eb adres\u00eb dhe port (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), do t\u00eb thot\u00eb se nga nginx mund t\u00eb kem qasje si n\u00eb php-fpm ashtu edhe n\u00eb postgres, dhe nga php-fpm n\u00eb postgres dhe nginx, dhe n\u00eb p\u00ebrfundim nga \u00e7do sh\u00ebrbim mund t\u00eb ket\u00eb qasje n\u00eb nj\u00eb sh\u00ebrbim tjet\u00ebr. K\u00ebshtu, vitaliteti i sh\u00ebrbimit nuk \u00ebsht\u00eb i varur nga vitaliteti i sh\u00ebrbimit tjet\u00ebr.<\/p>\n<h4>8. Paralelizmi<\/h4>\n<p>\nPuna me nj\u00eb proces, ndryshe disa procese nuk do t\u00eb mund t\u00eb bien dakord me nj\u00ebri-tjetrin! <\/p>\n<p>Lini mund\u00ebsin\u00eb p\u00ebr shkall\u00ebzim. Docker swarm \u00ebsht\u00eb i p\u00ebrsosur p\u00ebr k\u00ebt\u00eb. <br \/>\nDocker Swarm \u00ebsht\u00eb nj\u00eb mjet p\u00ebr krijimin dhe menaxhimin e grupeve t\u00eb kontejner\u00ebve si midis makinave t\u00eb ndryshme ashtu edhe nj\u00eb grumbulli kontejner\u00ebsh n\u00eb nj\u00eb makin\u00eb.<\/p>\n<p>Duke p\u00ebrdorimi i swarm, un\u00eb mund t\u00eb p\u00ebrcaktoj se sa burime do t\u00eb ndaj p\u00ebr \u00e7do proces dhe sa procese t\u00eb nj\u00eb sh\u00ebrbimi t\u00eb nj\u00ebjt\u00eb do t\u00eb startoj, nd\u00ebrsa balancuesi i brendsh\u00ebm, duke marr\u00eb t\u00eb dh\u00ebnat n\u00eb portin e caktuar, automatikisht do t'i proksizoj\u00eb ato te proceset. K\u00ebshtu, duke v\u00ebrejtur q\u00eb ngarkesa n\u00eb server u rrit, un\u00eb mund t\u00eb shtoj m\u00eb shum\u00eb procese, duke ulur k\u00ebshtu ngarkes\u00ebn n\u00eb procese t\u00eb caktuara.<\/p>\n<h4>9. Shfryt\u00ebzueshm\u00ebria (Disposability)<\/h4>\n<p>\nMos p\u00ebrdorni rradha p\u00ebr t\u00eb punuar me procese dhe t\u00eb dh\u00ebna. Vrasja e nj\u00eb procesi duhet t\u00eb ndikoj\u00eb n\u00eb funksionimin e gjith\u00eb aplikacionit. N\u00ebse nj\u00eb sh\u00ebrbim bie - gjith\u00e7ka bie.<\/p>\n<p>\u00c7do proces dhe sh\u00ebrbim mund t\u00eb fiket n\u00eb \u00e7do moment dhe kjo nuk duhet t\u00eb ndikoj\u00eb n\u00eb sh\u00ebrbimet e tjera (nuk flasim k\u00ebtu p\u00ebr \u00e7\u00ebshtjen q\u00eb sh\u00ebrbimi do t\u00eb jet\u00eb i paqassh\u00ebm p\u00ebr sh\u00ebrbimin tjet\u00ebr, por p\u00ebr at\u00eb q\u00eb sh\u00ebrbimi tjet\u00ebr nuk do t\u00eb fiket pas k\u00ebtij). T\u00eb gjith\u00eb proceset duhet t\u00eb p\u00ebrfundojn\u00eb but\u00ebsisht, n\u00eb m\u00ebnyr\u00eb q\u00eb gjat\u00eb p\u00ebrfundimit t\u00eb mos humbasin t\u00eb dh\u00ebnat dhe n\u00eb aktivizimin e ardhsh\u00ebm, sistemi t\u00eb funksionoj\u00eb si\u00e7 duhet. Pra, edhe n\u00eb rast t\u00eb nj\u00eb p\u00ebrfundimi emergjent, t\u00eb dh\u00ebnat nuk duhet t\u00eb d\u00ebmtohen (k\u00ebtu do t\u00eb ishte e p\u00ebrshtatshme mekanizmi i transaksioneve, k\u00ebrkesat n\u00eb db punojn\u00eb vet\u00ebm n\u00eb grupe, dhe n\u00ebse ndonj\u00eb k\u00ebrkes\u00eb nga grupi nuk \u00ebsht\u00eb ekzekutuar ose \u00ebsht\u00eb ekzekutuar me gabim, at\u00ebher\u00eb asnj\u00eb k\u00ebrkes\u00eb tjet\u00ebr nga grupi nuk ekzekutohet n\u00eb realitet).<\/p>\n<h4>10. Pariteti i zhvillimit\/pun\u00ebs s\u00eb aplikacionit<\/h4>\n<p>\nProduksioni, staging dhe versione lokale e aplikacionit duhet t\u00eb jen\u00eb t\u00eb ndryshme. N\u00eb prodhim kemi framework-un Yii Lite, nd\u00ebrsa lokalisht Yii, q\u00eb t\u00eb funksionoj\u00eb m\u00eb shpejt n\u00eb prodhim!<\/p>\n<p>N\u00eb fakt, t\u00eb gjitha deploymentet dhe puna me kodin duhet t\u00eb jen\u00eb pothuajse n\u00eb nj\u00eb ambient identik (nuk b\u00ebhet fjal\u00eb p\u00ebr harduerin fizik). Po ashtu, p\u00ebr t\u00eb deploy n\u00eb prodhim n\u00eb rast nevoje, duhet t\u00eb jet\u00eb n\u00eb gjendje t\u00eb b\u00ebj\u00eb \u00e7do punonj\u00ebs i zhvillimit, jo ndonj\u00eb departament i ve\u00e7ant\u00eb devops, q\u00eb vet\u00ebm fal\u00eb ndonj\u00eb fuqie t\u00eb ve\u00e7ant\u00eb mund t\u00eb ngrit\u00eb aplikacionin n\u00eb prodhim.<\/p>\n<p>N\u00eb k\u00ebt\u00eb na ndihmon gjithashtu Docker. Duke respektuar t\u00eb gjith\u00eb pikat e m\u00ebparshme, p\u00ebrdorimi i docker-it do ta sjell\u00eb procesin e vendosjes s\u00eb ambientit si n\u00eb prodhim ashtu edhe n\u00eb makin\u00ebn lokale deri n\u00eb futjen e nj\u00eb ose dy komandave.<\/p>\n<h4>11. Regjistrimi (Logs)<\/h4>\n<p>\nRegjistrat shkruhen n\u00eb skedar\u00eb dhe db! Skedar\u00ebt dhe db p\u00ebr regjistrat nuk pastrohen. Do t\u00eb blejm\u00eb thjesht nj\u00eb hard disk me 9000 Petabyte dhe \u00ebsht\u00eb n\u00eb rregull.<\/p>\n<p>T\u00eb gjitha logj\u00ebt duhet t\u00eb konsiderohen si nj\u00eb rrjedh\u00eb ngjarjesh. Aplikacioni nuk duhet t\u00eb merret me p\u00ebrpunimin e logjeve. Logjet duhet t\u00eb d\u00ebrgohen ose n\u00eb stdout, ose t\u00eb transmetohen p\u00ebrmes nj\u00eb protokolli si udp, n\u00eb m\u00ebnyr\u00eb q\u00eb p\u00ebrdorimi i logjeve nga aplikacioni t\u00eb mos krijoj\u00eb asnj\u00eb problem. P\u00ebr k\u00ebt\u00eb, graylog \u00ebsht\u00eb nj\u00eb zgjedhje e shk\u00eblqyer. Graylog, duke pranuar t\u00eb gjitha logjet p\u00ebrmes udp (me k\u00ebt\u00eb protokoll nuk \u00ebsht\u00eb e nevojshme t\u00eb pres\u00ebsh nj\u00eb p\u00ebrgjigje p\u00ebr pranimin e suksessh\u00ebm t\u00eb paket\u00ebs), nuk pengon aplikacionin n\u00eb asnj\u00eb m\u00ebnyr\u00eb dhe merret vet\u00ebm me strukturimin dhe p\u00ebrpunimin e logjeve. Logjika e aplikacionit nuk ndryshon p\u00ebr t\u00eb punuar me qasje t\u00eb tilla.<\/p>\n<h4>12. Detyrat e administrat\u00ebs<\/h4>\n<p>\nP\u00ebr t\u00eb p\u00ebrdit\u00ebsuar t\u00eb dh\u00ebnat, baz\u00ebn e t\u00eb dh\u00ebnave, etj., p\u00ebrdorni nj\u00eb endpoint t\u00eb krijuar ve\u00e7mas n\u00eb API, ekzekutimi i t\u00eb cilit dy her\u00eb radhazi do t\u00eb \u00e7oj\u00eb n\u00eb d\u00ebmtimin e t\u00eb dh\u00ebnave tuaja. Por ju nuk jeni budallenj, nuk do t\u00eb klikoni dy her\u00eb, dhe migrimet nuk na nevojiten.<\/p>\n<p>T\u00eb gjitha detyrat e administrat\u00ebs duhet t\u00eb ekzekutohen n\u00eb t\u00eb nj\u00ebjt\u00ebn mjedis si gjith\u00eb kodi, n\u00eb nivelin e l\u00ebshimeve. Pra, n\u00ebse na duhet t\u00eb ndryshojm\u00eb struktur\u00ebn e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, ne nuk do ta b\u00ebjm\u00eb k\u00ebt\u00eb manualisht duke ndryshuar emrat e kolonave dhe duke shtuar t\u00eb reja p\u00ebrmes ndonj\u00eb mjeti vizual t\u00eb menaxhimit t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave. P\u00ebr gj\u00ebra t\u00eb tilla, ne krijojm\u00eb skripte t\u00eb ve\u00e7anta \u2014 migrime, q\u00eb p\u00ebrfundohen n\u00eb \u00e7do ambient dhe t\u00eb gjitha n\u00eb t\u00eb nj\u00ebjt\u00ebn m\u00ebnyr\u00eb me nj\u00eb rezultat t\u00eb qart\u00eb dhe t\u00eb kuptuesh\u00ebm. P\u00ebr t\u00eb gjitha detyrat e tjera, si mbushja e projektit me t\u00eb dh\u00ebna, duhen aplikuar metodologji t\u00eb ngjashme.<\/p>\n<h3>Shembulli i implementimit n\u00eb PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S T\u00eb gjitha shembujt u b\u00ebn\u00eb n\u00eb MacOS. Pjesa m\u00eb e madhe do t\u00eb p\u00ebrshtatet dhe p\u00ebr Linux. P\u00ebrdoruesit e Windows, m\u00eb falni, por nuk kam punuar me Windows prej nj\u00eb koh\u00eb.<\/p>\n<p>Imagjinoni nj\u00eb situat\u00eb ku n\u00eb PC-n\u00eb ton\u00eb nuk \u00ebsht\u00eb instaluar asnj\u00eb version PHP dhe asgj\u00eb tjet\u00ebr. <br \/>\nInstalojm\u00eb docker dhe docker-compose versionet m\u00eb t\u00eb fundit. (k\u00ebt\u00eb mund ta gjeni n\u00eb internet)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Instaloni <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=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb lidhje me Laradock do t\u00eb them q\u00eb \u00ebsht\u00eb nj\u00eb gj\u00eb shum\u00eb e shk\u00eblqyer, ku jan\u00eb mbledhur shum\u00eb kontejner\u00eb dhe gj\u00ebra ndihm\u00ebse. Por ta p\u00ebrdorni Laradock si t\u00eb till\u00eb pa modifikime n\u00eb prodhim \u2014 nuk do ta rekomandoja p\u00ebr shkak t\u00eb tepric\u00ebs s\u00eb tij. M\u00eb mir\u00eb \u00ebsht\u00eb t\u00eb krijoni kontejner\u00ebt tuaj duke u mb\u00ebshtetur n\u00eb shembujt n\u00eb Laradock, k\u00ebshtu do t\u00eb ket\u00eb m\u00eb shum\u00eb optimizim, pasi askujt nuk i nevojiten gjith\u00e7ka q\u00eb ka atje nj\u00ebkoh\u00ebsisht.<\/p>\n<p>2. Konfiguroni Laradock p\u00ebr t\u00eb punuar me aplikacionin ton\u00eb.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Hapim katalogun habr (folderi prindor ku \u00ebsht\u00eb klonuar laradock) n\u00eb ndonj\u00eb editor. (N\u00eb rastin tim PHPStorm)<\/p>\n<p>N\u00eb k\u00ebt\u00eb faz\u00eb vendosim vet\u00ebm emrin e projektit.<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Aktivizojm\u00eb imazhin workspace. (N\u00eb rastin tuaj imazhet do t\u00eb nd\u00ebrtohen p\u00ebr nj\u00ebfar\u00eb kohe)<br \/>\nWorkspace \u00ebsht\u00eb nj\u00eb imazh i p\u00ebrgatitur posa\u00e7\u00ebrisht p\u00ebr t\u00eb punuar me framework-un nga perspektiva e zhvilluesit.<\/p>\n<p>Hyrim brenda kontejnerit me ndihm\u00ebn e <\/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=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Instalojm\u00eb Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Pas instalimit kontrollojm\u00eb n\u00ebse \u00ebsht\u00eb krijuar direktoria me projektin, dhe ndalojm\u00eb compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Kthehemi n\u00eb PHPStorm dhe vendosim rrug\u00ebn e sakt\u00eb p\u00ebr aplikacionin ton\u00eb laravel n\u00eb skedarin .env.<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Shtojm\u00eb t\u00eb gjith\u00eb kodin n\u00eb Git.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb krijojm\u00eb nj\u00eb depo n\u00eb Github (ose diku tjet\u00ebr). Shk\u00ebmbejm\u00eb n\u00eb terminal n\u00eb direktorin\u00eb habr dhe ekzekutojm\u00eb kodin e m\u00ebposht\u00ebm.<\/p>\n<pre><code class=\"bash\">echo \"# habr-12factor\" &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m \"first commit\"\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # k\u00ebtu do t\u00eb jet\u00eb lidhja p\u00ebr repo tuaj\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nKontrollojm\u00eb n\u00ebse gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull. <\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebr leht\u00ebsin\u00eb tuaj rekomandoj t\u00eb p\u00ebrdorni ndonj\u00eb nd\u00ebrfaqe vizuale p\u00ebr Git, n\u00eb rastin tim kjo \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (k\u00ebtu \u00ebsht\u00eb lidhja referuese)<\/p>\n<p>4. Aktivizoni!<\/p>\n<p>Para aktivizimit sigurohuni q\u00eb n\u00eb portet 80 dhe 443 nuk ka asgj\u00eb t\u00eb p\u00ebrfshir\u00eb.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu projekti yn\u00eb p\u00ebrb\u00ebhet nga 3 sh\u00ebrbime t\u00eb ve\u00e7anta:<\/p>\n<ul>\n<li>nginx \u2014 serveri web<\/li>\n<li>php-fpm \u2014 php p\u00ebr trajtimin e k\u00ebrkesave nga serveri web<\/li>\n<li>workspace \u2014 php p\u00ebr zhvilluesin<\/li>\n<\/ul>\n<p>\nDerisa kemi arritur t\u00eb krijojm\u00eb nj\u00eb aplikacion n\u00eb p\u00ebrputhje, tashm\u00eb 4 pika nga 12, n\u00eb ve\u00e7anti:<\/p>\n<p>1. <b>Baza e kodit<\/b> \u2014 i gjith\u00eb kodi ndodhet n\u00eb nj\u00eb depo (nj\u00eb v\u00ebrejtje e vog\u00ebl: ndoshta \u00ebsht\u00eb m\u00eb e sakt\u00eb t\u00eb futur docker brenda projektit laravel, por kjo nuk \u00ebsht\u00eb thelb\u00ebsore).<\/p>\n<p>2. <b>Var\u00ebsit\u00eb<\/b> \u2014 T\u00eb gjitha var\u00ebsit\u00eb tona jan\u00eb shprehur qart\u00eb n\u00eb application\/composer.json dhe n\u00eb \u00e7do Dockerfile t\u00eb \u00e7do kontejneri.<\/p>\n<p>3. <b>Sh\u00ebrbimet e jashtme (Backing Services)<\/b> \u2014 \u00c7do sh\u00ebrbim (php-fom, nginx, workspace) jeton jet\u00ebn e tij dhe lidhet nga jasht\u00eb dhe gjat\u00eb pun\u00ebs me nj\u00eb sh\u00ebrbim, tjetri nuk do t\u00eb preket.<\/p>\n<p>4. <b>Proceset<\/b> \u2014 \u00e7do sh\u00ebrbim \u00ebsht\u00eb nj\u00eb proces i vet\u00ebm. \u00c7do sh\u00ebrbim nuk ruan gjendjen e brendshme.<\/p>\n<p>5.<b> Pengimi i porteve (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi\u00e7 e shohim, \u00e7do sh\u00ebrbim \u00ebsht\u00eb aktivizuar n\u00eb portin e tij t\u00eb vet dhe \u00ebsht\u00eb i aksesuesh\u00ebm p\u00ebr t\u00eb gjitha sh\u00ebrbimet e tjera.<\/p>\n<p>6.<b> Paralelizmi <\/b><\/p>\n<p>Docker na lejon t\u00eb ngritnim disa procese t\u00eb t\u00eb nj\u00ebjt\u00ebve sh\u00ebrbime me balancimin automatik t\u00eb ngarkes\u00ebs nd\u00ebrmjet tyre. <\/p>\n<p>T\u00eb ndalim kontejner\u00ebt dhe t'i aktivizojm\u00eb ata p\u00ebrmes flag <b>\u2014scale<\/b><\/p>\n<pre><code class=\"bash\">docker-compose down &amp;&amp; \ndocker-compose up -d --scale php-fpm=3 nginx php-fpm\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi e shpesh, kontenieri php-fpm ka krijuar kopje. Ne pun\u00ebn me k\u00ebt\u00eb kontenier nuk na nevojitet t\u00eb ndryshojm\u00eb asgj\u00eb. Ne vazhdojm\u00eb ta p\u00ebrdorim at\u00eb n\u00eb portin 9000, nd\u00ebrsa Docker rregullon ngarkes\u00ebn midis kontenier\u00ebve p\u00ebr ne.<\/p>\n<p>7. <b>Shkall\u00ebzueshm\u00ebria (Disposability)<\/b> \u2014 \u00e7do kontenier mund t\u00eb ndalet pa d\u00ebmtuar tjetrin. Ndalesa ose rithemelimi i kontenierit nuk do t\u00eb ndikojn\u00eb n\u00eb funksionimin e aplikacionit gjat\u00eb startimeve t\u00eb ardhshme. \u00c7do kontenier gjithashtu mund t\u00eb ngrihet n\u00eb \u00e7do koh\u00eb.<\/p>\n<p>8. <b>Pariteti i zhvillimit\/pun\u00ebs s\u00eb aplikacionit<\/b> \u2014 t\u00eb gjitha ambientet tona jan\u00eb t\u00eb nj\u00ebjta. Duke e nisur sistemin n\u00eb server n\u00eb prodhim, nuk do t'ju duhet t\u00eb ndryshoni asgj\u00eb n\u00eb komandat tuaja. T\u00eb gjitha do t\u00eb bazohen pik\u00ebrisht n\u00eb Docker.<\/p>\n<p>9. <b>Regjistrimi (Logs)<\/b> \u2014 t\u00eb gjitha log-et n\u00eb k\u00ebto kontenier\u00eb dalin dhe jan\u00eb t\u00eb dukshme n\u00eb konsol\u00ebn Docker. (n\u00eb k\u00ebt\u00eb rast, n\u00eb t\u00eb v\u00ebrtet\u00eb, me kontenier\u00eb t\u00eb dh\u00ebn\u00eb vet\u00eb, mund t\u00eb mos ndodhin k\u00ebshtu n\u00ebse nuk kujdeseni p\u00ebr k\u00ebt\u00eb)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPor, ka nj\u00eb problem se vlerat e paracaktuara n\u00eb PHP dhe Nginx gjithashtu regjistrojn\u00eb log-et n\u00eb skedarin. P\u00ebr t'iu p\u00ebrmbajtur 12 faktor\u00ebve, \u00ebsht\u00eb e nevojshme <b>ndalon<\/b> regjistrimi i log-eve n\u00eb skedar n\u00eb konfigurimet e \u00e7do konteneri ve\u00e7mas.<\/p>\n<p>Docker gjithashtu ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb rediagatuar log-et jo vet\u00ebm n\u00eb stdout, por edhe n\u00eb gj\u00ebra si graylog p\u00ebr t\u00eb cilin flas m\u00eb lart. Dhe brenda graylog, mund t\u00eb operojm\u00eb me log-et si t\u00eb duam dhe aplikacioni yn\u00eb nuk do ta v\u00ebrehet k\u00ebt\u00eb.<\/p>\n<p>10. <b>Detyrat e administrat\u00ebs<\/b> \u2014 t\u00eb gjitha detyrat e administrat\u00ebs zgjidhen nga laravel fal\u00eb mjetit artisan pik\u00ebrisht ashtu si\u00e7 do t\u00eb d\u00ebshironin krijuesit e aplikacioneve 12 faktor\u00ebshe.<\/p>\n<p>Si\u00e7 e tregoj si shembull, shohim si ekzekutohen disa komanda.<br \/>\nHyni n\u00eb kontenier.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTani mund t\u00eb p\u00ebrdorim \u00e7do komand\u00eb. (kini parasysh q\u00eb ne nuk e kemi konfiguruar baz\u00ebn e t\u00eb dh\u00ebnave dhe cache-n, k\u00ebshtu q\u00eb gjysma e komandave nuk do t\u00eb funksionoj\u00eb si\u00e7 duhet, pasi ato jan\u00eb t\u00eb destinuara p\u00ebr t\u00eb punuar me cache-n dhe baz\u00ebn e t\u00eb dh\u00ebnave).<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigurimet<\/b> dhe 12. <b>Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/b><\/p>\n<p>K\u00ebt\u00eb pjes\u00eb doja ta dedikoj p\u00ebr Blue-Green Deployment, por kjo u tregua tep\u00ebr e gjer\u00eb p\u00ebr k\u00ebt\u00eb artikull. P\u00ebr k\u00ebt\u00eb do t\u00eb shkruaj nj\u00eb artikull t\u00eb ve\u00e7ant\u00eb. <\/p>\n<p>N\u00eb dy fjal\u00eb, koncepti nd\u00ebrtoset mbi sistemet CI\/CD si <b>Jenkins<\/b> dhe <b>Gitlab CI<\/b>. N\u00eb t\u00eb dyja mund t\u00eb vendosen variablat e mjedisit t\u00eb lidhura me ambientin specifik. Nd\u00ebrkoh\u00eb, n\u00eb nj\u00eb skenar t\u00eb till\u00eb, do t\u00eb zbatohet pika me <b>Konfigurimet<\/b>.<\/p>\n<p>Dhe pika p\u00ebr <b>Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/b> zgjidhet p\u00ebrmes funksioneve t\u00eb integruara n\u00eb t\u00eb dy utilitetet me emrin <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> lejon t\u00eb ndash n\u00eb shum\u00eb etapa procesin e deploy-imit, duke ndar\u00eb fazat e nd\u00ebrtimit, l\u00ebshimit dhe ekzekutimit. Po ashtu n\u00eb Pipeline, do t\u00eb keni mund\u00ebsi t\u00eb krijoni backup-e, madje edhe gjith\u00e7ka tjet\u00ebr. Ky mjet ka potencial t\u00eb pafund.<\/p>\n<p>Kodi i aplikacionit ndodhet n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nMos harroni t\u00eb inicializoni submodule gjat\u00eb klonimit t\u00eb k\u00ebtij repository.<\/p>\n<p>P.S.: T\u00eb gjitha k\u00ebto qasje mund t\u00eb p\u00ebrdoren me \u00e7do utilitar tjet\u00ebr dhe gjuh\u00eb programimi. E r\u00ebnd\u00ebsishme \u00ebsht\u00eb q\u00eb thelbi t\u00eb mos ndryshoj\u00eb.<br \/>\n<br \/>Burimi: <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\/sq\/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=\"sq_AL\" \/>\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\/sq\/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\udd47Zhvillimi i aplikacioneve dhe Blue-Green deployment, duke u mb\u00ebshtetur n\u00eb metodologjin\u00eb The Twelve-Factor App me shembuj n\u00eb php dhe docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}