{"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>Filloni me 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 zhvilluesit dhe inxhinier\u00ebt DevOps t\u00eb jen\u00eb t\u00eb vet\u00ebdijsh\u00ebm p\u00ebr praktikat dhe problemet q\u00eb hasen shpesh n\u00eb zhvillimin e aplikacioneve moderne. <\/p>\n<p>Dokumenti \u00ebsht\u00eb krijuar 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 programimi dhe q\u00eb p\u00ebrdorin \u00e7do kombinim sh\u00ebrbimesh t\u00eb jashtme (backing services) (baza t\u00eb dh\u00ebnash, radh\u00eb mesazhesh, memoria n\u00eb cache, etj.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Me shkurt p\u00ebr faktor\u00ebt mbi t\u00eb cil\u00ebt bazohet kjo metodologji:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Kodi i baz\u00ebs<\/b> \u2013 Nj\u00eb baz\u00eb kodi, 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 qart\u00eb dhe izolojini var\u00ebsit\u00eb<\/li>\n<li><b>Konfigurimi<\/b> \u2013 Ruani konfigurimin n\u00eb ambientin e ekzekutimit<\/li>\n<li><b>Sh\u00ebrbimet e jashtme (Backing Services)<\/b> \u2013 Trajtoni sh\u00ebrbimet e jashtme (backing services) si burime t\u00eb lidhura<\/li>\n<li><b>Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/b> \u2013 Ndani n\u00eb m\u00ebnyr\u00eb strikte fazat e nd\u00ebrtimit dhe t\u00eb ekzekutimit<\/li>\n<li><b>Proceset<\/b> \u2013 Ekzekutoni aplikacionin si nj\u00eb ose disa procese pa gjendje t\u00eb brendshme (stateless) <\/li>\n<li><b>Lidhja e porteve (Port binding)<\/b> \u2013 Eksportoni sh\u00ebrbimet p\u00ebrmes lidhjes s\u00eb porteve <\/li>\n<li><b>Paralelizmi<\/b> \u2013 Shkall\u00ebzoni aplikacionin me ndihm\u00ebn e proceseve <\/li>\n<li><b>Bashk\u00ebpunueshm\u00ebria (Disposability)<\/b> \u2013 Maksimizoni besueshm\u00ebrin\u00eb me nj\u00eb fillim t\u00eb shpejt\u00eb dhe nj\u00eb p\u00ebrfundim korrekt <\/li>\n<li><b>Barazia e zhvillimit\/ekzekutimit t\u00eb aplikacionit<\/b> \u2013 Mbani ambientet e zhvillimit, l\u00ebshimit p\u00ebr ndihm\u00eb (staging) dhe l\u00ebshimit n\u00eb prodhim (production) sa m\u00eb t\u00eb ngjashme <\/li>\n<li><b>Diengimi (Logs)<\/b> \u2013 Shikoni regjistrin si nj\u00eb rrjedh\u00eb ngjarjesh<\/li>\n<li><b>Detyrat e adminstrimit<\/b> \u2013 Kryeni detyrat e administrat\u00ebs\/menaxhimit me procese t\u00eb p\u00ebrkohshme <\/li>\n<\/ol>\n<p>\n<b>M\u00eb shum\u00eb informacion mbi 12 faktor\u00ebt mund t\u00eb merrni nga burimet e m\u00ebposhtme:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Burimi zyrtar<\/a><\/noindex> \u2014 patjet\u00ebr p\u00ebr t'u lexuar<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikulli n\u00eb habr. Aplikimi 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 e munguar n\u00eb qasjen 12 Factor App<\/a><\/noindex> \u2014 nj\u00eb pamje 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 t\u00eb dor\u00ebzuar aplikacionin n\u00eb <b>production<\/b> nj\u00eb m\u00ebnyr\u00eb q\u00eb klienti i fundit nuk sheh asnj\u00eb ndryshim nga ana e tij. Me fjal\u00eb t\u00eb tjera, ndalesa e aplikacionit me zero <b>downtime<\/b>.<\/p>\n<p>Skema klasike e BG Deploy duket si\u00e7 \u00ebsht\u00eb e paraqitur 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 server\u00eb fizik\u00eb me kod, aplikacion dhe projekt t\u00eb nj\u00ebjta, dhe ka nj\u00eb router (balancues). <\/li>\n<li>Routeri fillimisht drejton t\u00eb gjitha k\u00ebrkesat n\u00eb nj\u00ebrin nga server\u00ebt (<b>e gjelb\u00ebr<\/b>). <\/li>\n<li>N\u00eb momentin q\u00eb nevojitet t\u00eb b\u00ebhet nj\u00eb l\u00ebshim tjet\u00ebr, e gjith\u00eb projekti p\u00ebrdit\u00ebsohet n\u00eb serverin tjet\u00ebr (<b>e blu<\/b>), i cili n\u00eb at\u00eb moment nuk po p\u00ebrpunon asnj\u00eb k\u00ebrkes\u00eb. <\/li>\n<li>Pas p\u00ebrdit\u00ebsimit t\u00eb kodit n\u00eb <b>serverin e<\/b> blugj <b>routeri merr urdh\u00ebrin p\u00ebr t\u00eb kaluar nga<\/b> n\u00eb <b>e blu<\/b> server. <\/li>\n<li>jeshil <b>Tani t\u00eb gjith\u00eb klient\u00ebt shohin rezultatin e pun\u00ebs s\u00eb kodit nga<\/b> Kryejn\u00eb sulme celulare. <\/li>\n<li> blugu <b>e gjelb\u00ebr<\/b> P\u00ebr nj\u00eb koh\u00eb, <b>e blu<\/b> serveri sh\u00ebrben si nj\u00eb kopje rezerv\u00eb n\u00eb rast t\u00eb d\u00ebshtimit t\u00eb l\u00ebshimit n\u00eb <b>e gjelb\u00ebr<\/b> server dhe n\u00eb rast t\u00eb d\u00ebshtimeve dhe defekteve, routeri kalon fluksin e p\u00ebrdoruesve p\u00ebrs\u00ebri n\u00eb<\/li>\n<li>serverin e versionit t\u00eb vjet\u00ebr dhe stabil, dhe kodi i ri d\u00ebrgohet p\u00ebr rishikim dhe testim. <b>e gjelb\u00ebr<\/b> Dhe n\u00eb fund t\u00eb procesit, gjithashtu p\u00ebrdit\u00ebsohet <b>e gjelb\u00ebr<\/b> server.<\/li>\n<\/ul>\n<p>\nserveri. Pas p\u00ebrdit\u00ebsimit t\u00eb tij, routeri kthen fluksin e k\u00ebrkesave p\u00ebrs\u00ebri n\u00eb<br \/>\nT\u00eb gjitha k\u00ebto duken shum\u00eb mir\u00eb dhe n\u00eb pamje t\u00eb par\u00eb nuk duhet t\u00eb ken\u00eb asnj\u00eb problem.<\/p>\n<h3>Por ngaq\u00eb jetojm\u00eb n\u00eb nj\u00eb bot\u00eb moderne, opsioni i kalimit fizik si\u00e7 \u00ebsht\u00eb i paraqitur n\u00eb skem\u00ebn klasike nuk na p\u00ebrshtatet. Ruani informacionin p\u00ebr tani, ne do t\u00eb kthehemi te ai m\u00eb von\u00eb.<\/h3>\n<p>\n<i>Sh\u00ebnim ligjor<\/i>K\u00ebshilla t\u00eb mira dhe t\u00eb k\u00ebqija <\/p>\n<p>: N\u00eb shembujt m\u00eb posht\u00eb jan\u00eb shfaqur utilitat\/methodologjit\u00eb q\u00eb un\u00eb p\u00ebrdor, mund t\u00eb p\u00ebrdorni \u00e7do alternativ\u00eb q\u00eb ka funksione t\u00eb ngjashme.<\/p>\n<p>Shumica e shembujve do t\u00eb p\u00ebrfshijn\u00eb n\u00eb nj\u00eb m\u00ebnyr\u00eb ose tjet\u00ebr zhvillimin e uebit (kjo ishte befasia), me PHP dhe Docker. <\/p>\n<h4>N\u00eb pikat m\u00eb posht\u00eb, do t\u00eb jepet nj\u00eb p\u00ebrshkrim t\u00eb thjesht\u00eb praktik mbi p\u00ebrdorimin e faktor\u00ebve n\u00eb shembuj t\u00eb caktuar, n\u00ebse d\u00ebshironi t\u00eb merrni m\u00eb shum\u00eb teori n\u00eb lidhje me k\u00ebt\u00eb tem\u00eb, referojuni lidhjeve m\u00eb sip\u00ebr p\u00ebr burimin.<\/h4>\n<p>\n1. Kodi i baz\u00ebs<\/p>\n<p>P\u00ebrdorni FTP dhe FileZilla p\u00ebr t\u00eb ngarkuar skedar\u00ebt n\u00eb server\u00eb nj\u00eb nga nj\u00eb, mos e ruani kodin askund tjet\u00ebr ve\u00e7se n\u00eb serverin e produksionit. <b>Git<\/b> repo. Serverat (production, staging, test1, test2 \u2026) p\u00ebrdorin kodin nga deg\u00ebt e nj\u00eb repozitori t\u00eb p\u00ebrbashk\u00ebt. K\u00ebshtu arrijm\u00eb konsistenc\u00ebn e kodit.<\/p>\n<h4>repozit. Server\u00ebt (prodhim, skenim, test1, test2 \u2026) p\u00ebrdorin kod nga deg\u00ebt e nj\u00eb repo zyrtar t\u00eb p\u00ebrbashk\u00ebt. K\u00ebshtu arrijm\u00eb konsistenc\u00eb t\u00eb kodit.<\/h4>\n<p>\nDescargoni t\u00eb gjith\u00eb bibliotekat n\u00eb dosje drejtp\u00ebrdrejt n\u00eb rr\u00ebnj\u00ebn e projektit. B\u00ebni p\u00ebrdit\u00ebsimet thjesht duke transferuar kodin e ri n\u00eb dosjen me versionin aktual t\u00eb bibliotek\u00ebs. Instaloni t\u00eb gjitha utilitat e nevojshme drejtp\u00ebrdrejt n\u00eb serverin e hostit 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 t\u00eb var\u00ebsive (n\u00ebn var\u00ebsi po ashtu kuptoj edhe mjedisin). 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, le t\u00eb marrim <b>Composer<\/b> dhe <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 nj\u00eb menaxher paketa, i cili lejon instalimin e bibliotekave n\u00eb PHP. Composer ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb p\u00ebrcaktuar versionet n\u00eb m\u00ebnyr\u00eb t\u00eb rrept\u00eb ose jo, dhe p\u00ebr t'i p\u00ebrcaktuar ato qart\u00eb. N\u00eb server mund t\u00eb ket\u00eb 20 projekte t\u00eb ndryshme dhe secili do t\u00eb ket\u00eb list\u00ebn e tij personale t\u00eb paketave dhe bibliotekave, e cila nuk varet nga t\u00eb tjer\u00ebt.<\/p>\n<p><b>Docker<\/b> \u2014 nj\u00eb utilitet q\u00eb lejon p\u00ebrcaktimin dhe izolimin e mjedisit n\u00eb t\u00eb cilin do t\u00eb funkcionalizoj\u00eb aplikacioni. Sidoqoft\u00eb, ashtu si me composer, por m\u00eb thell\u00ebsisht, ne mund t\u00eb p\u00ebrcaktojm\u00eb me \u00e7far\u00eb punon aplikacioni. T\u00eb zgjedhim nj\u00eb version t\u00eb caktuar t\u00eb PHP, t\u00eb instalojm\u00eb vet\u00ebm paketat e nevojshme p\u00ebr funksionimin e projektit, pa shtuar asgj\u00eb t\u00eb tep\u00ebrt. M\u00eb e r\u00ebnd\u00ebsishmja, t\u00eb mos nd\u00ebrthuren me paketa dhe mjedisin e makin\u00ebs prit\u00ebse dhe projekteve t\u00eb tjera. K\u00ebshtu, t\u00eb gjitha projektet n\u00eb server q\u00eb funksionojn\u00eb p\u00ebrmes Docker, mund t\u00eb p\u00ebrdorin \u00e7do set paketash dhe nj\u00eb mjedis t\u00ebr\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 e testimit, t\u00eb ve\u00e7anta p\u00ebr prodhimin. Lidheni funksionimin e aplikacionit n\u00eb var\u00ebsi t\u00eb mjedisit drejtp\u00ebrdrejt n\u00eb logjik\u00ebn biznesore t\u00eb projektit, duke p\u00ebrdorur struktura if else.<\/p>\n<p><b>Konfigurimet<\/b> \u2014 jan\u00eb e vetmja gj\u00eb q\u00eb duhet t\u00eb ndryshoj\u00eb n\u00eb implementimet e projektit. N\u00eb m\u00ebnyr\u00eb ideale, konfigurimet duhet t\u00eb kalohen p\u00ebrmes variablve t\u00eb mjedisit (env vars). <\/p>\n<p>Pra, edhe n\u00ebse do t\u00eb ruani disa skedar\u00eb konfigurimi .config.prod .config.local dhe t'i rind\u00ebrroni ato gjat\u00eb implementimit n\u00eb .config (konfiguroja kryesore nga e cila aplikacioni lexon t\u00eb dh\u00ebnat) \u2014 kjo do t\u00eb ishte nj\u00eb qasje e gabuar, pasi n\u00eb k\u00ebt\u00eb rast informacioni nga konfigurimet do t\u00eb ishte i arritsh\u00ebm p\u00ebr t\u00eb gjith\u00eb zhvilluesit e aplikacionit, dhe t\u00eb dh\u00ebnat nga serveri i prodhimit do t\u00eb ishin t\u00eb komprometuar. T\u00eb gjitha konfigurimet duhet t\u00eb ruhen direkte n\u00eb sistemin e implementimit (CI\/CD) dhe t\u00eb gjenerohen p\u00ebr mjedise t\u00eb ndryshme me vlera t\u00eb ndryshme t\u00eb nevojshme p\u00ebr mjedisin specifik pik\u00ebrisht n\u00eb momentin e implementimit.<\/p>\n<h4>4. Sh\u00ebrbimet e Jashtme (Backing Services)<\/h4>\n<p>\nKrijoni nj\u00eb lidhje t\u00eb ngusht\u00eb me mjedisin, p\u00ebrdorni lidhje t\u00eb ndryshme p\u00ebr sh\u00ebrbime t\u00eb nj\u00ebjta n\u00eb mjedise t\u00eb caktuara.<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, ky pik\u00eb lidhet shum\u00eb me pik\u00ebn mbi konfigurimet, pasi pa k\u00ebt\u00eb pik\u00eb nuk do t\u00eb jet\u00eb e mundur t\u00eb krijoni t\u00eb dh\u00ebna normale konfigurimi dhe n\u00eb fakt mund\u00ebsia e konfigurimit do t\u00eb shuhen.<\/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 keqitjes, duhet t\u00eb jen\u00eb t\u00eb nj\u00ebsuara si p\u00ebr mjedisin lokal, ashtu edhe p\u00ebr at\u00eb prodhuese. Me fjal\u00eb t\u00eb tjera, n\u00eb \u00e7do moment un\u00eb mundem, duke ndryshuar nj\u00eb varg lidhjeje, t\u00eb z\u00ebvend\u00ebsoj referencat n\u00eb baz\u00ebn #1 me baz\u00ebn #2 pa ndryshuar kodin e aplikacionit. Ose duke shkuar m\u00eb tej, si nj\u00eb shembull do t\u00eb ishte e mjaftueshme q\u00eb gjat\u00eb shtrirjes s\u00eb sh\u00ebrbimit, t\u00eb mos keni nevoj\u00eb t\u00eb specifikoni lidhjen n\u00eb ndonj\u00eb m\u00ebnyr\u00eb t\u00eb ve\u00e7ant\u00eb p\u00ebr nj\u00eb server shtes\u00eb t\u00eb keqitjes.<\/p>\n<h4>5. Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/h4>\n<p>\nKeni vet\u00ebm versionin p\u00ebrfundimtar t\u00eb kodit n\u00eb server, pa mund\u00ebsi p\u00ebr t\u00eb rikthyer l\u00ebshimin prapa. Mos e mbushni hap\u00ebsir\u00ebn e diskut. Ai q\u00eb mendon se mund t\u00eb d\u00ebrgoj\u00eb kodin 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\u00ebsi t\u00eb riktheheni. B\u00ebni l\u00ebshime duke ruajtur kopje t\u00eb ve\u00e7anta t\u00eb aplikacionit (t\u00eb nd\u00ebrtuara tashm\u00eb dhe gati p\u00ebr p\u00ebrdorim), n\u00eb m\u00ebnyr\u00eb q\u00eb n\u00eb rast gabimesh t\u00eb riktheni versionin e vjet\u00ebr. Pra, ndryshe, ekziston 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 brenda <i>releases<\/i> me nj\u00eb em\u00ebr t\u00eb l\u00ebshimit. <\/p>\n<p>K\u00ebtu ne kujtojm\u00eb mbi Blue-Green deployment, i cili lejon jo vet\u00ebm kalimin nd\u00ebrmjet kodit, por gjithashtu kalimin nd\u00ebrmjet t\u00eb gjitha burimeve dhe mjediseve me mund\u00ebsin\u00eb p\u00ebr t\u00eb rikthyer gjith\u00e7ka prapa.<\/p>\n<h4>6. Proceset<\/h4>\n<p>\nRuani t\u00eb dh\u00ebnat e gjendjeve t\u00eb aplikacionit drejtp\u00ebrdrejt n\u00eb aplikacionin vet\u00eb. P\u00ebrdorni seanca n\u00eb memorin\u00eb operative t\u00eb aplikacionit. P\u00ebrdorni sa m\u00eb shum\u00eb q\u00eb t\u00eb jet\u00eb e mundur t\u00eb ndara midis sh\u00ebrbimeve t\u00eb jashtme. Lidheni se aplikacioni mund t\u00eb ket\u00eb vet\u00ebm nj\u00eb proces dhe mos lejoni mund\u00ebsin\u00eb e shtrirjes.<\/p>\n<p>N\u00eb lidhje me seancat, ruhuni t\u00eb dh\u00ebnat vet\u00ebm n\u00eb cache t\u00eb kontrolluar nga sh\u00ebrbime t\u00eb jashtme (memcached, redis), n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb, edhe n\u00ebse keni 20 procese aplikacioni t\u00eb aktivizuara, \u00e7do nj\u00ebra prej tyre, duke k\u00ebrkuar n\u00eb cache, do t\u00eb jet\u00eb n\u00eb gjendje t\u00eb vazhdoj\u00eb t\u00eb punoj\u00eb me klientin n\u00eb t\u00eb nj\u00ebjtin gjendje n\u00eb t\u00eb cil\u00ebn p\u00ebrdoruesi ishte duke punuar me aplikacionin n\u00eb procesin tjet\u00ebr. Me k\u00ebt\u00eb qasje, sa m\u00eb shum\u00eb kopje sh\u00ebrbimesh t\u00eb jashtme t\u00eb p\u00ebrdorni, gjith\u00e7ka do t\u00eb funksionoj\u00eb pa shqet\u00ebsime dhe pa probleme n\u00eb aksesin e t\u00eb dh\u00ebnave.<\/p>\n<h4>7. Lidhet porti (Port binding)<\/h4>\n<p>\nVet\u00ebm serveri web duhet t\u00eb dij\u00eb si t\u00eb punoj\u00eb me sh\u00ebrbimet e jashtme. Ose \u00ebsht\u00eb m\u00eb mir\u00eb t'i ngriheni sh\u00ebrbimet e jashtme drejtp\u00ebrdrejt brenda serverit web. 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 aksesueshme nj\u00ebra nga tjetra duke u referuar n\u00eb ndonj\u00eb adres\u00eb dhe port (localhost:5432, localhost:3000, nginx:80, php-fpm:9000), dometh\u00ebn\u00eb nga nginx mund t\u00eb aksesoj php-fpm-n\u00eb, si dhe postgres-in, dhe nga php-fpm mund t\u00eb aksesoj postgres-in dhe nginx-in dhe n\u00eb fakt nga \u00e7do sh\u00ebrbim mund t\u00eb aksesoj sh\u00ebrbimin tjet\u00ebr. N\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb, jet\u00ebsia e nj\u00eb sh\u00ebrbimi nuk \u00ebsht\u00eb e varur nga jet\u00ebsia e nj\u00eb sh\u00ebrbimi tjet\u00ebr.<\/p>\n<h4>8. Paralelizmi<\/h4>\n<p>\nPunoni me nj\u00eb proces, sepse ndryshe ndonj\u00ebher\u00eb disa procese nuk do t\u00eb arrijn\u00eb t\u00eb bashk\u00ebpunojn\u00eb! <\/p>\n<p>Lini mund\u00ebsin\u00eb p\u00ebr t'u shkall\u00ebzuar. Docker Swarm \u00ebsht\u00eb nj\u00eb zgjidhje e shk\u00eblqyer p\u00ebr k\u00ebt\u00eb. <br \/>\nDocker Swarm \u00ebsht\u00eb nj\u00eb mjet p\u00ebr krijimin dhe menaxhimin e klaster\u00ebve t\u00eb kontejner\u00ebve si midis makinave t\u00eb ndryshme ashtu edhe shum\u00eb kontejner\u00ebve n\u00eb nj\u00eb makin\u00eb.<\/p>\n<p>Duke p\u00ebrdorur swarm, un\u00eb mund t\u00eb p\u00ebrcaktoj se sa burime do t\u00eb alokoj p\u00ebr \u00e7do proces dhe sa procese t\u00eb nj\u00ebjt\u00ebs sh\u00ebrbim do t\u00eb aktivizoj, dhe balancuesi i brendsh\u00ebm, duke pranuar t\u00eb dh\u00ebna n\u00eb nj\u00eb port t\u00eb caktuar, do t'i proksoj\u00eb automatikisht ato n\u00eb proceset. K\u00ebshtu, duke par\u00eb se ngarkesa n\u00eb server ka rritur, un\u00eb mund t\u00eb shtoj m\u00eb shum\u00eb procese, duke zvog\u00ebluar k\u00ebshtu ngarkes\u00ebn n\u00eb procese t\u00eb caktuara.<\/p>\n<h4>9. Eliminimi (Disposability)<\/h4>\n<p>\nMos p\u00ebrdorni radh\u00eb 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 t\u00ebr\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 (n\u00eb fakt nuk po flasim p\u00ebr at\u00eb se nj\u00eb sh\u00ebrbim do t\u00eb jet\u00eb i paaksesuesh\u00ebm p\u00ebr nj\u00eb sh\u00ebrbim tjet\u00ebr, por p\u00ebr at\u00eb se nj\u00eb sh\u00ebrbim tjet\u00ebr nuk duhet t\u00eb mbyllet pas k\u00ebtij). T\u00eb gjith\u00eb proceset duhet t\u00eb mbyllen but\u00eb, n\u00eb m\u00ebnyr\u00eb q\u00eb gjat\u00eb p\u00ebrfundimit t\u00eb tyre t\u00eb mos d\u00ebmtohen t\u00eb dh\u00ebnat dhe kur t\u00eb ndizet p\u00ebrs\u00ebri, sistemi t\u00eb filloj\u00eb t\u00eb funksionoj\u00eb si\u00e7 duhet. Dometh\u00ebn\u00eb, edhe n\u00eb rastin e nj\u00eb ndalimi t\u00eb papritur, t\u00eb dh\u00ebnat nuk duhet t\u00eb d\u00ebmtohen (n\u00eb k\u00ebt\u00eb rast do t\u00eb ishte e dobishme 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 realizuar ose \u00ebsht\u00eb realizuar me gabim, asnj\u00eb k\u00ebrkes\u00eb tjet\u00ebr nga grupi nuk realizohet realisht).<\/p>\n<h4>10. Barazia e zhvillimit p\u00ebr aplikacionin<\/h4>\n<p>\nProduksioni, staging dhe versioni lokal i aplikacionit duhet t\u00eb jen\u00eb t\u00eb ndrysh\u00ebm. N\u00eb prodhim kemi framework-un Yii Lite, nd\u00ebrsa lokal kemi Yii, q\u00eb t\u00eb punoj\u00eb m\u00eb shpejt n\u00eb prodhim!<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, t\u00eb gjitha lan\u00e7imet dhe puna me kodin duhet t\u00eb jen\u00eb pothuajse n\u00eb nj\u00eb ambient identik (n\u00eb fakt nuk po flasim p\u00ebr harduerin fizik). Gjithashtu, lan\u00e7imi i kodit n\u00eb prodhim, sipas nevoj\u00ebs, duhet t\u00eb jet\u00eb n\u00eb gjendje ta b\u00ebj\u00eb \u00e7do staf i zhvillimit, dhe jo ndonj\u00eb departament i devops i trajnuar ve\u00e7an\u00ebrisht, i cili vet\u00ebm p\u00ebr shkak t\u00eb nj\u00eb fuqie t\u00eb ve\u00e7ant\u00eb mund t\u00eb ngrej\u00eb aplikacionin n\u00eb prodhim.<\/p>\n<p>K\u00ebtu gjithashtu na ndihmon Docker. Duke respektuar t\u00eb gjitha pikat e m\u00ebparshme, p\u00ebrdorimi i docker-it do ta \u00e7oj\u00eb procesin e ngritjes t\u00eb ambientit si n\u00eb prodhim ashtu edhe n\u00eb makin\u00eb lokale deri n\u00eb ekzekutimin 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 nga regjistrat nuk pastrohen. Thjesht blej nj\u00eb hard disk t\u00eb 9000 Petabyte dhe e lam\u00eb at\u00eb.<\/p>\n<p>T\u00eb gjitha regjistrat duhet t\u00eb shqyrtohen si nj\u00eb fluks ngjarjesh. Aplikacioni vet\u00eb nuk duhet t\u00eb merret me p\u00ebrpunimin e regjistrave. Regjistrat duhet t\u00eb jepen ose n\u00eb stdout, ose t\u00eb d\u00ebrgohen p\u00ebrmes nj\u00eb protokolli t\u00eb till\u00eb si udp, n\u00eb m\u00ebnyr\u00eb q\u00eb puna me regjistrat t\u00eb mos krijoj\u00eb probleme p\u00ebr aplikacionin. P\u00ebr k\u00ebt\u00eb, graylog \u00ebsht\u00eb nj\u00eb zgjedhje e shk\u00eblqyer. Graylog-pranimi i t\u00eb gjitha regjistrave p\u00ebrmes udp (me k\u00ebt\u00eb protokoll nuk k\u00ebrkohet t\u00eb pritet p\u00ebrgjigje p\u00ebr pranimin e suksessh\u00ebm t\u00eb pakos) nuk e pengon aplikacionin n\u00eb asnj\u00eb m\u00ebnyr\u00eb dhe merret vet\u00ebm me strukturimin dhe p\u00ebrpunimin e regjistrave. Logjika e aplikacionit nuk ndryshon p\u00ebr t\u00eb punuar me k\u00ebto qasje.<\/p>\n<h4>12. Detyrat e administrat\u00ebs<\/h4>\n<p>\nP\u00ebr p\u00ebrdit\u00ebsimin e t\u00eb dh\u00ebnave, db 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 shkaktoj\u00eb q\u00eb gjith\u00e7ka mund t\u00eb duplikatohet. Por ju nuk jeni t\u00eb budall, nuk do t\u00eb klikoni dy her\u00eb, dhe migrimet nuk na duhen.<\/p>\n<p>T\u00eb gjitha detyrat e administrat\u00ebs duhet t\u00eb kryhen n\u00eb t\u00eb nj\u00ebjt\u00ebn mjedis si\u00e7 \u00ebsht\u00eb gjith\u00eb kodi, n\u00eb nivelin e \u00e7release. K\u00ebshtu, n\u00ebse na nevojitet 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 vegle vizuale menaxhimi t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave. P\u00ebr k\u00ebto gj\u00ebra ne krijojm\u00eb skripte t\u00eb ve\u00e7anta \u2014 migrime, t\u00eb cilat kryhen n\u00eb t\u00eb gjith\u00eb mjediset nj\u00ebsoj me nj\u00eb rezultat t\u00eb p\u00ebrgjithsh\u00ebm dhe t\u00eb qart\u00eb. P\u00ebr t\u00eb gjitha detyrat e tjera, si p\u00ebrmbushja e projektit me t\u00eb dh\u00ebna, duhet t\u00eb aplikohet 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 jan\u00eb b\u00ebr\u00eb n\u00eb MacOS. Nj\u00eb pjes\u00eb e madhe do t\u00eb p\u00ebrshtatet gjithashtu p\u00ebr Linux. P\u00ebrdorues t\u00eb Windows, m\u00eb falni, por nuk kam punuar me Windows prej nj\u00eb koh\u00eb t\u00eb gjat\u00eb.<\/p>\n<p>T\u00eb imagjinojm\u00eb nj\u00eb situat\u00eb ku n\u00eb PC-n\u00eb ton\u00eb nuk \u00ebsht\u00eb instaluar asnj\u00eb version i PHP dhe p\u00ebrgjith\u00ebsisht nuk ka asgj\u00eb. <br \/>\nInstalojm\u00eb docker dhe docker-compose versionet m\u00eb t\u00eb fundit. (kjo mund t\u00eb gjendet 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. Instalojm\u00eb <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 se \u00ebsht\u00eb nj\u00eb gj\u00eb shum\u00eb e shk\u00eblqyer, ku jan\u00eb grumbulluar shum\u00eb kontejner\u00eb dhe mjete ndihm\u00ebse. Por t\u00eb p\u00ebrdor\u00ebsh Laradock n\u00eb m\u00ebnyr\u00eb 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 t\u00eb krijosh kontejner\u00ebt e tu, 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 nevojitet gjith\u00e7ka q\u00eb atje \u00ebsht\u00eb nj\u00ebkoh\u00ebsisht.<\/p>\n<p>2. Konfigurojm\u00eb 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 prind n\u00eb t\u00eb cilin \u00ebsht\u00eb klonuar laradock) n\u00eb ndonj\u00eb editor. (N\u00eb rastin tim, PHPStorm)<\/p>\n<p>N\u00eb k\u00ebt\u00eb etap\u00eb vet\u00ebm vendosim 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. Nisni imazhin e pun\u00ebs. (N\u00eb rastin tuaj, imazhet do t\u00eb nd\u00ebrtohen p\u00ebr nj\u00ebfar\u00eb kohe)<br \/>\nWorkspace \u2014 \u00ebsht\u00eb nj\u00eb imazh i p\u00ebrgatitur posa\u00e7\u00ebrisht p\u00ebr t\u00eb punuar me framework-un nga ana e zhvilluesit.<\/p>\n<p>Kalojm\u00eb brenda kontejnerit me an\u00eb t\u00eb <\/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 e mbyllim 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 p\u00ebrs\u00ebri n\u00eb PHPStorm dhe vendosim rrug\u00ebn e sakt\u00eb deri te aplikacioni yn\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 gjith\u00eb kodin n\u00eb Git.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb krijojm\u00eb nj\u00eb depo n\u00eb Github (ose kudo tjet\u00ebr). T\u00eb kalojm\u00eb n\u00eb terminal n\u00eb drejtorin\u00eb habr dhe t\u00eb 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 \"commit-i i par\u00eb\"\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # k\u00ebtu do t\u00eb jet\u00eb lidhja n\u00eb 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, rekomandoj t\u00eb p\u00ebrdor\u00ebsh ndonj\u00eb nd\u00ebrfaqe vizuale p\u00ebr Git, n\u00eb rastin tim \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (k\u00ebtu \u00ebsht\u00eb nj\u00eb lidhje referuese)<\/p>\n<p>4. Nisim!<\/p>\n<p>Para fillimit, sigurohuni q\u00eb n\u00eb portet 80 dhe 443 nuk ka asgj\u00eb t\u00eb varur.<\/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 pranimin e k\u00ebrkesave nga serveri web<\/li>\n<li>workspace \u2014 php p\u00ebr zhvilluesit<\/li>\n<\/ul>\n<p>\nN\u00eb k\u00ebt\u00eb moment ne arrit\u00ebm t\u00eb krijojm\u00eb nj\u00eb aplikacion n\u00eb p\u00ebrputhje me, tashm\u00eb 4 nga 12, sakt\u00ebsisht:<\/p>\n<p>1. <b>Kodi i baz\u00ebs<\/b> \u2014 gjith\u00eb kodi ndodhet n\u00eb nj\u00eb depo (nj\u00eb sh\u00ebnim i vog\u00ebl: ndoshta do t\u00eb ishte e sakt\u00eb t\u00eb sillnim docker brenda projektit laravel, por kjo nuk \u00ebsht\u00eb par\u00ebsore).<\/p>\n<p>2. <b>Var\u00ebsit\u00eb<\/b> \u2014 T\u00eb gjitha var\u00ebsit\u00eb tona jan\u00eb t\u00eb shkruara 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, nignx, workspace) jeton jet\u00ebn e tij dhe \u00ebsht\u00eb i lidhur nga jasht\u00eb, dhe gjat\u00eb pun\u00ebs me nj\u00eb sh\u00ebrbim, tjetri nuk do t\u00eb prek\u00ebt.<\/p>\n<p>4. <b>Proceset<\/b> \u2014 \u00e7do sh\u00ebrbim \u00ebsht\u00eb nj\u00eb proces. \u00c7do sh\u00ebrbim nuk ruan nj\u00eb gjendje t\u00eb brendshme.<\/p>\n<p>5.<b> Lidhja e 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 nisur n\u00eb portin e tij t\u00eb ve\u00e7ant\u00eb 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 ngrem\u00eb disa procese t\u00eb t\u00eb nj\u00ebjt\u00ebve sh\u00ebrbime me balancim automatik t\u00eb ngarkes\u00ebs mes tyre. <\/p>\n<p>Shk\u00ebputim kontejner\u00ebt dhe i nisnim p\u00ebrs\u00ebri me flamurin <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\u00e7 e shohim, jan\u00eb krijuar kopje p\u00ebr kontejnerin php-fpm. Ne n\u00eb pun\u00eb me k\u00ebt\u00eb kontejner nuk na nevojitet t\u00eb ndryshojm\u00eb asgj\u00eb. Po ashtu vazhdojm\u00eb t\u00eb lidhemi me t\u00eb n\u00eb portin 9000, nd\u00ebrsa Docker rregullon ngarkes\u00ebn mes kontejner\u00ebve.<\/p>\n<p>7. <b>Bashk\u00ebpunueshm\u00ebria (Disposability)<\/b> \u2014 \u00e7do kontejner mund t\u00eb mbyllet pa d\u00ebmtuar t\u00eb tjer\u00ebt. Ndalesa ose rinisja e nj\u00eb kontejneri nuk do t\u00eb ndikoj\u00eb n\u00eb funksionimin e aplikacionit n\u00eb nisjet e ardhshme. \u00c7do kontejner gjithashtu mund t\u00eb ngrihet n\u00eb \u00e7do moment.<\/p>\n<p>8. <b>Barazia e zhvillimit\/ekzekutimit t\u00eb aplikacionit<\/b> \u2014 t\u00eb gjitha mjediset tona jan\u00eb identike. Duke nisur sistemin n\u00eb serverin n\u00eb prodhim nuk do t\u00eb duhet t\u00eb ndryshoni asgj\u00eb n\u00eb komandat tuaja. E gjith\u00eb kjo do t\u00eb bazohet sakt\u00ebsisht n\u00eb Docker.<\/p>\n<p>9. <b>Diengimi (Logs)<\/b> \u2014 t\u00eb gjith\u00eb loget n\u00eb k\u00ebto kontejner\u00eb dalin n\u00eb rrjedh\u00eb dhe jan\u00eb t\u00eb dukshme n\u00eb konsol\u00ebn e Docker. (n\u00eb k\u00ebt\u00eb rast, realisht, me kontejner\u00eb t\u00eb tjer\u00eb t\u00eb krijuar nga vete mund t\u00eb mos jet\u00eb ashtu 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 \/>\nPorosin\u00eb, ka nj\u00eb problem t\u00eb till\u00eb q\u00eb vlerat e Parazgjedhura n\u00eb PHP dhe Nginx gjithashtu regjistronin log-et n\u00eb skedar. P\u00ebr t'u p\u00ebrputhur me 12 faktor\u00ebt, \u00ebsht\u00eb e nevojshme <b>diskonekt<\/b> regjistrimi i log-eve n\u00eb skedar n\u00eb konfigurimet e \u00e7do kontejneri ve\u00e7 e ve\u00e7.<\/p>\n<p>Igjithashtu Docker ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb drejtuar log-et jo vet\u00ebm n\u00eb stdout, por edhe n\u00eb gj\u00ebra si graylog, p\u00ebr t\u00eb cilin kam folur 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\u00ebrej\u00eb k\u00ebt\u00eb.<\/p>\n<p>10. <b>Detyrat e adminstrimit<\/b> \u2014 t\u00eb gjitha detyrat e administrat\u00ebs zgjidhen nga laravel fal\u00eb mjetit artisan ashtu si\u00e7 do t\u00eb donin krijuesit e aplikacioneve 12-faktoreshe.<\/p>\n<p>Si shembull, do t\u00eb tregoj se si ekzekutohen disa komanda.<br \/>\nHyjm\u00eb n\u00eb kontejner.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"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. (v\u00ebreni se nuk kemi konfiguruar baz\u00ebn e t\u00eb dh\u00ebnave dhe cache-in, k\u00ebshtu q\u00eb gjysma e komandave nuk do t\u00eb ekzekutohet si\u00e7 duhet, sepse ato jan\u00eb t\u00eb destinuara p\u00ebr t\u00eb punuar me cache-in dhe databaz\u00ebn).<\/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 t'ia kushtoja Blue-Green Deployment, por doli se ishte shum\u00eb 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\u00ebrtohet mbi sistemet CI\/CD t\u00eb tipit <b>Jenkins<\/b> dhe <b>Gitlab CI<\/b>. N\u00eb t\u00eb dyja mund t\u00eb caktohen variabla t\u00eb ambientit t\u00eb lidhura me ambientin specifik. P\u00ebrkat\u00ebsisht, n\u00eb k\u00ebt\u00eb rast do t\u00eb p\u00ebrmbushen k\u00ebrkesat me <b>Konfigurimet<\/b>.<\/p>\n<p>Dhe pika p\u00ebr <b>Nd\u00ebrtimi, l\u00ebshimi, ekzekutimi<\/b> zgjidhet nga funksionet e nd\u00ebrtuara n\u00eb t\u00eb dy mjetet me emrin <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> lejon ndarjen e procesit t\u00eb depoymentit n\u00eb shum\u00eb etapa, duke ndar\u00eb fazat e nd\u00ebrtimit, l\u00ebshimit dhe ekzekutimit. Gjithashtu n\u00eb Pipeline, do t\u00eb keni mund\u00ebsin\u00eb t\u00eb krijoni backup-e dhe madje edhe \u00e7do gj\u00eb tjet\u00ebr. Ky mjet ka potencial t\u00eb pakufish\u00ebm.<\/p>\n<p>Kodi i aplikacionit \u00ebsht\u00eb 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 depoziti.<\/p>\n<p>P.S.: T\u00eb gjitha k\u00ebto qasje mund t\u00eb p\u00ebrdoren me \u00e7do mjete dhe gjuh\u00eb programimi tjet\u00ebr. Gj\u00ebja kryesore \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.0.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\/sq\/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.0.1\" \/>\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}]}}