{"id":32217,"date":"2019-10-31T21:45:43","date_gmt":"2019-10-31T18:45:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/net-core-na-linux-devops-na-kone\/"},"modified":"2019-10-31T21:45:43","modified_gmt":"2019-10-31T18:45:43","slug":"net-core-na-linux-devops-na-kone","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ne zhvilluam DevOps si\u00e7 mund\u00ebm. Ishim 8 persona, dhe Vasia ishte m\u00eb i miri n\u00eb Windows. Papritmas, Vasia u largua, dhe un\u00eb mora detyr\u00ebn p\u00ebr t\u00eb sjell\u00eb nj\u00eb projekt t\u00eb ri, i cili ofron zhvillim p\u00ebr Windows. Kur i shp\u00ebrndava t\u00eb gjith\u00eb stek-un e zhvillimit p\u00ebr Windows mbi tryez\u00eb, e kuptova se situata ishte e v\u00ebshtir\u00eb...<\/p>\n<p>K\u00ebshtu fillon historia <b>Aleksand\u00ebr Sin\u00e7inov<\/b> n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kur specialisti kryesor i Windows u largua nga kompania, Aleksandri u pyet se \u00e7far\u00eb duhet t\u00eb b\u00ebnte tani. T\u00eb kalonte n\u00eb Linux, sigurisht! Aleksandri do t\u00eb tregoj\u00eb se si arriti t\u00eb krijoj\u00eb nj\u00eb precedent dhe t\u00eb transferoj\u00eb nj\u00eb pjes\u00eb t\u00eb zhvillimit p\u00ebr Windows n\u00eb Linux p\u00ebrmes nj\u00eb projekti t\u00eb realizuar me 100,000 p\u00ebrdorues t\u00eb fundit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi e leht\u00eb dhe e natyrshme t\u00eb dor\u00ebzosh nj\u00eb projekt n\u00eb RPM duke p\u00ebrdorur TFS, Puppet, Linux .NET core? Si t\u00eb mbash versionimin e DB-s\u00eb s\u00eb projektit, n\u00ebse zhvilluesit p\u00ebr her\u00eb t\u00eb par\u00eb d\u00ebgjojn\u00eb fjal\u00ebt Postgres dhe Flyway, dhe afati \u00ebsht\u00eb pasnes\u00ebr? Si t\u00eb integrosh me Docker? Si t'i motivosh zhvilluesit .NET t\u00eb heqin dor\u00eb nga Windows dhe smoothies p\u00ebr Puppet dhe Linux? Si t\u00eb zgjidh\u00ebsh konfliktet ideologjike n\u00ebse nuk ka energji, d\u00ebshira ose burime p\u00ebr t\u00eb mbajtur Windows n\u00eb prodhim? N\u00eb lidhje me k\u00ebt\u00eb, si dhe rreth Web Deploy, testimit, CI, praktikave t\u00eb p\u00ebrdorimit t\u00eb TFS n\u00eb projektet ekzistuese, dhe sigurisht, p\u00ebr k\u00ebmbanat e thyera dhe zgjidhjet q\u00eb funksionojn\u00eb, n\u00eb transkriptin e raportit t\u00eb Aleksandrit.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"tZH9Ro9j9KQ\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/tZH9Ro9j9KQ\/hqdefault.jpg\" alt=\"Luaj videon\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nPra, Vasya u largua, detyra \u00ebsht\u00eb p\u00ebr mua, zhvilluesit presin me tulla me padurim. Kur kuptova p\u00ebrfundimisht se nuk mund ta ktheja Vasya - fillova pun\u00ebn. Fillimisht, vler\u00ebsova p\u00ebrqindjen e VM Windows n\u00eb parku ton\u00eb. Numri ishte n\u00eb d\u00ebm t\u00eb Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuke qen\u00eb se ne po zhvillojm\u00eb aktivisht DevOps, kuptova se duhej t\u00eb ndryshoja di\u00e7ka n\u00eb qasjen p\u00ebr nxjerrjen e nj\u00eb aplikacioni t\u00eb ri. Zgjidhja ishte nj\u00eb - sa m\u00eb shum\u00eb q\u00eb \u00ebsht\u00eb e mundur, t\u00eb kalojm\u00eb gjith\u00e7ka n\u00eb Linux. Google m\u00eb ndihmoi - n\u00eb at\u00eb koh\u00eb .Net ishte portuar n\u00ebn Linux, dhe kuptova se kjo ishte zgjidhja!<\/p>\n<h2>Pse .NET core n\u00eb lidhje me Linux?<\/h2>\n<p>\nKjo kishte disa arsye. Nd\u00ebrmjet 't\u00eb paguash' dhe 't\u00eb mos paguash' shumica do t\u00eb zgjedhin t\u00eb dyt\u00ebn \u2014 si dhe un\u00eb. Licenca p\u00ebr MSDB kushton rreth 1 000 $, mir\u00ebmbajtja e parkut t\u00eb makinave virtuale Windows matet n\u00eb qindra dollar\u00eb. P\u00ebr nj\u00eb kompani t\u00eb madhe, k\u00ebto jan\u00eb shpenzime t\u00eb m\u00ebdha. Prandaj, <b>kursimi\u00a0<\/b>\u2014<b> arsyeja e par\u00eb<\/b>. Nuk \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishmja, por nj\u00eb nga ato t\u00eb r\u00ebnd\u00ebsishme.<\/p>\n<p>Makinat virtuale Windows konsumojn\u00eb m\u00eb shum\u00eb burime se sa homolog\u00ebt e tyre Linux \u2014 <b>ato jan\u00eb t\u00eb r heavy<\/b>. Duke marr\u00eb parasysh madh\u00ebsin\u00eb e nj\u00eb kompanie t\u00eb madhe, ne zgjodh\u00ebm Linux.<\/p>\n<p><b>Sistemi thjesht integret n\u00eb CI ekzistues<\/b>. Ne e konsiderojm\u00eb veten DevOps progresiv\u00eb, p\u00ebrdorim Bamboo, Jenkins dhe GitLab CI, prandaj pjesa m\u00eb e madhe e pun\u00ebs son\u00eb b\u00ebhet n\u00eb Linux.<\/p>\n<p>Arsyeja e fundit \u00ebsht\u00eb <b>mir\u00ebmbajtja e leht\u00eb. <\/b>Na duhej t\u00eb ulja e pragut t\u00eb hyrjes p\u00ebr 'mir\u00ebmbajt\u00ebsit' \u2014 djemt\u00eb q\u00eb kuptojn\u00eb pjes\u00ebn teknike, sigurojn\u00eb vazhdim\u00ebsin\u00eb dhe mbajn\u00eb sh\u00ebrbimet nga linja e dyt\u00eb. Ata tashm\u00eb ishin t\u00eb njohur me stakun Linux, k\u00ebshtu q\u00eb u ishte shum\u00eb m\u00eb e leht\u00eb t\u00eb kuptonin produktin e ri, ta mb\u00ebshtesin dhe ta mir\u00ebmbajn\u00eb, sesa t\u00eb shpenzonin burime shtes\u00eb p\u00ebr t\u00eb kuptuar nj\u00eb funksionalitet t\u00eb ngjash\u00ebm t\u00eb softuerit p\u00ebr platform\u00ebn Windows.<\/p>\n<h2>K\u00ebrkesat<\/h2>\n<p>\nE para dhe m\u00eb e r\u00ebnd\u00ebsishmja \u00ebsht\u00eb <b>leht\u00ebsia e zgjidhjes s\u00eb re p\u00ebr zhvilluesit<\/b>. Jo t\u00eb gjith\u00eb ishin t\u00eb gatsh\u00ebm p\u00ebr ndryshime, ve\u00e7an\u00ebrisht pas p\u00ebrmendjes s\u00eb fjal\u00ebs Linux. Zhvilluesit duan Visual Studio t\u00eb tyre t\u00eb dashur, TFS me teste automatike p\u00ebr nd\u00ebrtimet dhe smoothie. Si ndodh dor\u00ebzimi n\u00eb prodhim - p\u00ebr ta nuk ka r\u00ebnd\u00ebsi. K\u00ebshtu, ne vendos\u00ebm t\u00eb mos ndryshojm\u00eb procesin e zakonsh\u00ebm dhe t\u00eb l\u00ebm\u00eb gjith\u00e7ka t\u00eb paprekur p\u00ebr zhvillimin n\u00eb Windows. <\/p>\n<p>Projekti i ri duhet <b>t\u00eb integrohet n\u00eb CI ekzistuese<\/b>. Rails ishin tashm\u00eb n\u00eb vend dhe gjith\u00eb puna duhej t\u00eb kryhej duke pasur parasysh parametrat e sistemit t\u00eb menaxhimit t\u00eb konfigurimit, standardet e pranueshme t\u00eb dor\u00ebzimit dhe sistemet e monitorimit.<\/p>\n<p><b>Thjesht\u00ebsia n\u00eb mb\u00ebshtetje dhe operim<\/b>, si kushte p\u00ebr nj\u00eb prag minimal hyrjeje p\u00ebr t\u00eb gjith\u00eb pjes\u00ebmarr\u00ebsit e rinj nga departamente t\u00eb ndryshme dhe departamenti i mb\u00ebshtetjes.<\/p>\n<p><b>Afati - dje<\/b>.<\/p>\n<h2>Grupi i zhvillimit t\u00eb Win<\/h2>\n<p>\nMe \u00e7far\u00eb po punonte ekipi i Windows?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTani mund t\u00eb them me siguri se <b>IdentityServer4<\/b>\u00a0\u00ebsht\u00eb nj\u00eb alternativ\u00eb e shk\u00eblqyer falas p\u00ebr ADFS me funksionalitete t\u00eb ngjashme, ose se <b>Entity Framework Core<\/b>\u00a0\u2014 nj\u00eb parajs\u00eb p\u00ebr zhvilluesit, ku mund t\u00eb mos shqet\u00ebsoheni p\u00ebr shkruarjen e skripteve SQL, por t\u00eb p\u00ebrshkruani k\u00ebrkesat n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave n\u00eb terma OOP. Por at\u00ebher\u00eb, gjat\u00eb diskutimit t\u00eb planit t\u00eb veprimit, e shikoja k\u00ebt\u00eb stiv\u00eb si nj\u00eb shkrim t\u00eb lasht\u00eb sumerian duke njohur vet\u00ebm PostgreSQL dhe Git.<\/p>\n<p>N\u00eb at\u00eb koh\u00eb ne po p\u00ebrdornim aktivisht <b>Puppet<\/b> si sistem p\u00ebr menaxhimin e konfiguracionit. N\u00eb shumic\u00ebn e projekteve tona ne p\u00ebrdornim <b>GitLab CI<\/b>, <b>Elastic<\/b>, balanconim sh\u00ebrbime me ngarkes\u00eb t\u00eb lart\u00eb duke p\u00ebrdorur <b>HAProxy,<\/b> v\u00ebzhgonim gjith\u00e7ka me <b>Zabbix<\/b>, lidh\u00ebsi <b>Grafana<\/b> dhe\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, dhe gjith\u00e7ka kjo funksiononte n\u00eb\u00a0<b>HP<\/b> me\u00a0<b>ESXi<\/b> n\u00eb\u00a0<b>VMware<\/b>. T\u00eb gjith\u00eb e njohin \u2014 klasika e zhanrit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb shohim dhe t\u00eb p\u00ebrpiqemi t\u00eb kuptojm\u00eb se \u00e7far\u00eb ndodhi p\u00ebrpara se t\u00eb nisnim t\u00eb gjitha k\u00ebto nd\u00ebrhyrje.<\/p>\n<h2>\u00c7far\u00eb ishte<\/h2>\n<p>\nTFS \u2014 \u00ebsht\u00eb nj\u00eb sistem mjaft i fuqish\u00ebm, i cili jo vet\u00ebm q\u00eb d\u00ebrgon kodin nga zhvilluesi n\u00eb makin\u00eb p\u00ebrfundimtare t\u00eb prodhimit, por gjithashtu ka nj\u00eb grup p\u00ebr integrim shum\u00eb fleksib\u00ebl me sh\u00ebrbime t\u00eb ndryshme \u2014 p\u00ebr t\u00eb siguruar CI n\u00eb nivel multipllatform.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00eb par\u00eb, k\u00ebto ishin vet\u00ebm dritare t\u00eb thjeshta. TFS p\u00ebrdorte disa agjent\u00eb t\u00eb nd\u00ebrtimit, mbi t\u00eb cil\u00ebt mblidheshin shum\u00eb projekte. \u00c7do agjent kishte 3-4 pun\u00ebtor\u00eb, p\u00ebr t\u00eb ndar\u00eb detyrat dhe optimizuar procesin. Pastaj, sipas planeve t\u00eb l\u00ebshimit, TFS d\u00ebrgonte nd\u00ebrtimin e ri n\u00eb serverin Windows t\u00eb aplikacioneve.<\/p>\n<h2>\u00c7far\u00eb d\u00ebshironim t\u00eb arrijm\u00eb<\/h2>\n<p>\nP\u00ebr d\u00ebrgimin dhe zhvillimin p\u00ebrdorim TFS, nd\u00ebrsa aplikacioni ekzekutohet n\u00eb serverin e aplikacioneve Linux, dhe ndodhet ndonj\u00eb magji mes tyre. Ky <b>Magic Box<\/b> \u00ebsht\u00eb thelbi i pun\u00ebs s\u00eb ardhshme. Para se ta analizojm\u00eb at\u00eb n\u00eb pjes\u00eb, do t\u00eb b\u00ebj nj\u00eb hap n\u00eb an\u00eb dhe do t\u00eb them disa fjal\u00eb rreth aplikacionit.<\/p>\n<h2>Projekt<\/h2>\n<p>\nAplikacioni ofron funksionalitet p\u00ebr menaxhimin e kartave t\u00eb parapaguara. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Klienti<\/h3>\n<p>\nEkzistonte dy lloje p\u00ebrdoruesish. <b>I par\u00eb<\/b> ka qasje, duke u autorizuar me nj\u00eb certifikat\u00eb SSL SHA-2. Nj\u00eb\u00a0<b>i dyt\u00eb<\/b> kishte qasje me p\u00ebrdorues dhe fjal\u00ebkalim.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nPas k\u00ebsaj, k\u00ebrkesa e klientit kalonte n\u00eb HAProxy, e cila vendoste detyrat vijues:<\/p>\n<ul>\n<li>autorizimi fillestar;\n<\/li>\n<li>terminimi i SSL;\n<\/li>\n<li>rregullimi i k\u00ebrkesave HTTP;\n<\/li>\n<li>transmetimi i k\u00ebrkesave.\n<\/li>\n<\/ul>\n<p>\nKontrolli i certifikat\u00ebs s\u00eb klientit ndodhte n\u00ebp\u00ebrmjet zinxhirit. Ne jemi <b>authority <\/b>dhe mund ta lejojm\u00eb k\u00ebt\u00eb, pasi e japim vet\u00eb certifikat\u00ebn klient\u00ebve t\u00eb sh\u00ebrbimit.<\/p>\n<p>Kujdesuni p\u00ebr pik\u00ebn e tret\u00eb, do t\u00eb rikthehemi te ajo m\u00eb von\u00eb.<\/p>\n<h3>Backend<\/h3>\n<p>\nPlanifikonim t\u00eb b\u00ebnim backend-in n\u00eb Linux. Backend-i komunikon me DB, ngarkon list\u00ebn e nevojshme t\u00eb privilegjeve dhe pastaj, n\u00eb var\u00ebsi t\u00eb privilegjeve q\u00eb ka p\u00ebrdoruesi i autorizuar, ofron akses p\u00ebr n\u00ebnshkrimin e dokumenteve financiare dhe d\u00ebrgimin e tyre p\u00ebr ekzekutim, ose gjenerimin e ndonj\u00eb raporti.<\/p>\n<h2>Kursimi me HAProxy<\/h2>\n<p>\nP\u00ebrve\u00e7 dy konteksteve, p\u00ebr t\u00eb cilat kaloi \u00e7do klient, ekzistonte edhe konteksti identity. <b>IdentityServer4<\/b> pik\u00ebrisht lejon t\u00eb autorizohet, \u00ebsht\u00eb nj\u00eb alternativ\u00eb e fuqishme dhe falas p\u00ebr <b>ADFS\u00a0<\/b>\u2014<b> Sh\u00ebrbimet Federale t\u00eb Drejtoris\u00eb Aktive<\/b>.<\/p>\n<p>K\u00ebrkesa n\u00eb identity p\u00ebrpunoheshin n\u00eb disa hapa. Hapi i par\u00eb - <b>n\u00eb C \u2014 ai merret ekskluzivisht me detyrat DNS.<\/b> <b>kalonte n\u00eb backend<\/b>, i cili shk\u00ebmbeu t\u00eb dh\u00ebnat me k\u00ebt\u00eb server dhe kontrolloi p\u00ebr prani t\u00eb tokenit p\u00ebr klientin. N\u00ebse nuk e gjeti - k\u00ebrkesa kthehej prapa n\u00eb kontekstin nga i cili erdhi, por tashm\u00eb me ridrejtim, dhe me ridrejtim shkonte n\u00eb identity.<\/p>\n<p>Hapi i dyt\u00eb - k\u00ebrkesa shkonte <b>n\u00eb faqen e autorizimit n\u00eb IdentityServer,<\/b> ku klienti regjistrohej, dhe n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb IdentityServer shfaqej ai tokeni i shum\u00ebpritur. <\/p>\n<p>Hapi i tret\u00eb - <b>klienti ridrejtohej mbrapsht <\/b>n\u00eb kontekst, nga i cili erdhi.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 ka nj\u00eb karakteristik\u00eb: <b>p\u00ebrgjigjen ndaj k\u00ebrkes\u00ebs prapa e kthen me HTTP<\/b>. Si\u00e7 e konfigurim serverin, si\u00e7 e shqyrtuam dokumentacionin, por \u00e7do her\u00eb merrnim k\u00ebrkes\u00ebn fillestare t\u00eb klientit me URL, e cila erdhi me HTTPS, nd\u00ebrsa IdentityServer ktheu t\u00eb nj\u00ebjtin kontekst, por me HTTP. Ishim t\u00eb shokuar! Dhe e \u00e7uam gjith\u00eb k\u00ebt\u00eb p\u00ebrmes kontekstit identity n\u00eb HAProxy, dhe n\u00eb headra na duhej t\u00eb modifikonim protokollin HTTP n\u00eb HTTPS. <\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb p\u00ebrmir\u00ebsimi dhe ku kemi kursyer?<\/p>\n<blockquote><p>Kemi kursyer para, duke p\u00ebrdorur nj\u00eb zgjidhje falas p\u00ebr autorizimin e grupit t\u00eb p\u00ebrdoruesve, burimet, pasi nuk e nxor\u00ebm IdentityServer4 si nj\u00eb nod t\u00eb ve\u00e7ant\u00eb n\u00eb nj\u00eb segment t\u00eb ve\u00e7ant\u00eb, por e p\u00ebrdor\u00ebm s\u00eb bashku me backendin n\u00eb t\u00eb nj\u00ebjtin server, ku funksionon backendi i aplikacionit.<\/p><\/blockquote>\n<p><\/p>\n<h2>Si duhet t\u00eb punoj\u00eb<\/h2>\n<p>\nPra, si\u00e7 e premtoj - Magic Box. Ne tashm\u00eb e kuptojm\u00eb se po l\u00ebvizim me siguri drejt Linux. Le t\u00eb formulojm\u00eb detyrat specifike q\u00eb k\u00ebrkonin zgjidhje.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Manifestet Puppet. <\/b>P\u00ebr t\u00eb dor\u00ebzuar dhe menaxhuar konfigurimin e sh\u00ebrbimit dhe aplikacionit, duhej t\u00eb shkruheshin receta t\u00eb shk\u00eblqyera. Nj\u00eb laps i vog\u00ebl tregon qart\u00eb se si u realizua kaq shpejt dhe me cil\u00ebsi.<\/p>\n<p><b>M\u00ebnyra e d\u00ebrgimit. <\/b>Standarti \u00ebsht\u00eb RPM. T\u00eb gjith\u00eb e kuptojn\u00eb se n\u00eb Linux nuk ka m\u00ebnyr\u00eb tjet\u00ebr, por projekti pas nd\u00ebrtimit p\u00ebrb\u00ebnte nj\u00eb grup skedash ekzekutive DLL. Ishin rreth 150, projekti ishte mjaft i r\u00ebnd\u00eb. Zgjidhja e vetme harmonike ishte t\u00eb paketosh k\u00ebt\u00eb binar n\u00eb RPM dhe m\u00eb pas t\u00eb shpalos\u00ebsh aplikacionin prej tij.<\/p>\n<p><b>Versionimi. <\/b>Na duhej t\u00eb l\u00ebshonim shum\u00eb shpesh dhe duhej t\u00eb zgjidhim m\u00ebnyr\u00ebn se si t\u00eb formonim emrin e paket\u00ebs. Ky \u00ebsht\u00eb nj\u00eb \u00e7\u00ebshtje niveli integrimi me TFS. Agjenti Build ishte n\u00eb Linux. Kur TFS d\u00ebrgon nj\u00eb detyr\u00eb p\u00ebr p\u00ebrpunuesin - pun\u00ebtor - n\u00eb Agjentin Build, ai gjithashtu i kalon nj\u00eb grup variablash, t\u00eb cilat kalojn\u00eb n\u00eb ambientin e procesit t\u00eb p\u00ebrpunuesit. N\u00eb k\u00ebto variabla ambienti kalohen emri Build, emri i versionit dhe variabla t\u00eb tjera. M\u00eb shum\u00eb rreth k\u00ebsaj n\u00eb seksionin 'nd\u00ebrtimi i paket\u00ebs RPM'.<\/p>\n<p><b>Konfigurimi i TFS<\/b> kishte t\u00eb b\u00ebnte me konfigurimin e Pipeline. M\u00eb par\u00eb ne mbledhim t\u00eb gjitha projektet Windows mbi agjent\u00ebt Windows, por tani kemi nj\u00eb agjent Linux - Build-agentin, i cili duhet t\u00eb p\u00ebrfshihet n\u00eb grupin e nd\u00ebrtimit, t\u00eb pasurohet me disa artefakte, t\u00eb thuhet se \u00e7far\u00eb lloj projektesh do t\u00eb nd\u00ebrtohen n\u00eb k\u00ebt\u00eb Build-agent dhe si t\u00eb modifikohet ndonj\u00eb m\u00ebnyr\u00eb Pipeline-in.<\/p>\n<p><b>IdentityServer. <\/b>ADFS nuk \u00ebsht\u00eb rruga jon\u00eb, ne mb\u00ebshtesim Open Source.<\/p>\n<p>Le t\u00eb kalojm\u00eb n\u00ebp\u00ebr komponent\u00ebt.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nKonsiston n\u00eb kat\u00ebr pjes\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-agent. <\/b>Linux, sepse ne e nd\u00ebrtuam p\u00ebr t\u00eb - logjike. Kjo pjes\u00eb u realizua n\u00eb tre hapa.<\/p>\n<ul>\n<li><b>Konfiguroni pun\u00ebtor\u00ebt<\/b> dhe jo vet\u00ebm nj\u00eb, pasi ishte parashikuar nj\u00eb pun\u00eb e shp\u00ebrndar\u00eb mbi projektin.\n<\/li>\n<li><b>Instaloni .NET Core 1.x<\/b>. Pse pik\u00ebrisht 1.x, kur 2.0 \u00ebsht\u00eb tashm\u00eb n\u00eb depozit\u00ebn standarde? Sepse, kur filluam zhvillimin, versioni stabil ishte 1.09, dhe ishte vendosur q\u00eb projekti t\u00eb b\u00ebhej n\u00ebn t\u00eb.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repository. <\/b>RPM-paketet duhej t\u00eb ruheshin diku. U parashikua q\u00eb ne do t\u00eb p\u00ebrdorim t\u00eb nj\u00ebjtin RPM-repozitorin korporativ, i cili \u00ebsht\u00eb i disponuesh\u00ebm p\u00ebr t\u00eb gjitha host-et Linux. K\u00ebshtu vepruam. N\u00eb serverin e repositorit \u00ebsht\u00eb konfiguruar <b>webhook<\/b> i cili shkarkonte paket\u00ebn RPM t\u00eb k\u00ebrkuar nga vendi i caktuar. Versioni i paket\u00ebs i raportuar Build-agentit.<\/p>\n<p><b>GitLab. <\/b>Kujdes! GitLab k\u00ebtu p\u00ebrdoret jo nga zhvilluesit, por nga departamenti i operacioneve p\u00ebr menaxhimin e versioneve t\u00eb aplikacionit, versioneve t\u00eb paketave, monitorimin e gjendjes s\u00eb t\u00eb gjitha makinave Linux dhe n\u00eb t\u00eb ruhet receta \u2014 t\u00eb gjitha manifestet e Puppet. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 zgjidh t\u00eb gjitha \u00e7\u00ebshjet e kontestueshme dhe d\u00ebrgon pik\u00ebrisht at\u00eb konfigurim q\u00eb duam, nga GitLab.<\/p>\n<p>Po fillojm\u00eb t\u00eb thellohemi. Si ndodh dor\u00ebzimi i DLL n\u00eb RPM?<\/p>\n<h3>Dor\u00ebzimi i DDL n\u00eb RPM<\/h3>\n<p>\nSupozoni se kemi nj\u00eb yll t\u00eb zhvillimit n\u00eb .NET. Ai p\u00ebrdor Visual Studio dhe krijon nj\u00eb deg\u00eb l\u00ebshimi. Pas k\u00ebsaj e ngarkon at\u00eb n\u00eb Git, dhe Git k\u00ebtu \u00ebsht\u00eb nj\u00eb entitet TFS, dometh\u00ebn\u00eb ky \u00ebsht\u00eb nj\u00eb repository aplikacioni me t\u00eb cilin punon zhvilluesi.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPas k\u00ebsaj, TFS sheh se ka mb\u00ebrritur nj\u00eb komit i ri. Cili aplikacion? N\u00eb konfigurimet e TFS ka nj\u00eb etiket\u00eb se me cilat burime disponon ndonj\u00eb Build-agent. N\u00eb k\u00ebt\u00eb rast ai sheh se po mbledhim nj\u00eb projekt .NET Core dhe zgjedh Build-agent Linux nga pool-i. <\/p>\n<p>Build-agent merr kodin burimor, shkarkon t\u00eb nevojshmet <b>var\u00ebsi<\/b> nga repository .NET, npm etj. dhe pas nd\u00ebrtimit t\u00eb aplikacionit dhe paketimit p\u00ebrkat\u00ebs d\u00ebrgon paket\u00ebn RPM n\u00eb repository-n\u00eb RPM.<\/p>\n<p>Nga ana tjet\u00ebr ndodhin k\u00ebto. Inxhinieri i departamentit t\u00eb operacioneve merret drejtp\u00ebrdrejt me lan\u00e7imin e projektit: ndryshon versionet e pakove n\u00eb\u00a0<b>Hiera<\/b> n\u00eb depo, ku ruhet receta e aplikacionit, pas s\u00eb cil\u00ebs Puppet aktivizon <b>Yum<\/b>, e merr paket\u00ebn e re nga depoja, dhe versioni i ri i aplikacionit \u00ebsht\u00eb gati p\u00ebr t'u p\u00ebrdorur.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe fjal\u00eb, gjith\u00e7ka duket e thjesht\u00eb, por \u00e7far\u00eb po ndodh brenda n\u00eb vet\u00eb Build-agentin?<\/p>\n<h3>Paketimi DLL RPM<\/h3>\n<p>\nJan\u00eb marr\u00eb burimet e projektit dhe detyra p\u00ebr nd\u00ebrtimin e tij nga TFS. Build-agenti <b>nisi nd\u00ebrtimin e projektit nga burimet.<\/b>Projekti i nd\u00ebrtuar \u00ebsht\u00eb i disponuesh\u00ebm si nj\u00eb shum\u00ebllojshm\u00ebri <b>t\u00eb skedar\u00ebve DLL<\/b>, t\u00eb cilat jan\u00eb paketuar n\u00eb nj\u00eb arkiv zip p\u00ebr t\u00eb ulur ngarkes\u00ebn n\u00eb sistemin e skedar\u00ebve.<\/p>\n<p>Arkivi ZIP hidhet <b>n\u00eb direktorin\u00eb e nd\u00ebrtimit t\u00eb paket\u00ebs RPM.<\/b> Pastaj, nj\u00eb skript Bash inicializon variablat e mjedisit, gjen versionin e Build, versionin e projektit, rrug\u00ebn deri n\u00eb direktorin\u00eb e nd\u00ebrtimit dhe nis RPM-build. Pas p\u00ebrfundimit t\u00eb nd\u00ebrtimit, paketa publikohet n\u00eb\u00a0<b>depon lokale<\/b>, e cila ndodhet n\u00eb Build-agent.<\/p>\n<p>M\u00eb pas, nga Build-agenti n\u00eb serverin e depo RPM <b>d\u00ebrgohet nj\u00eb k\u00ebrkes\u00eb JSON.<\/b> me versionit dhe nd\u00ebrtimin. Webhook, p\u00ebr t\u00eb cilin kam folur m\u00eb par\u00eb, shkarkon k\u00ebt\u00eb paket\u00eb nga depoja lokale n\u00eb agentin e Nd\u00ebrtimit dhe e b\u00ebn nd\u00ebrtimin e ri t\u00eb disponuesh\u00ebm p\u00ebr instalim.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPse k\u00ebt\u00eb skem\u00eb t\u00eb dor\u00ebzimit t\u00eb paketave n\u00eb depozitin RPM? Pse nuk mund t\u00eb d\u00ebrgohet direkt paketa e nd\u00ebrtuar n\u00eb depo? Arsyetimi \u00ebsht\u00eb se kjo \u00ebsht\u00eb nj\u00eb kusht p\u00ebr sigurimin. Ky skenar kufizon mund\u00ebsin\u00eb e ngarkimit t\u00eb paautorizuar t\u00eb paketave RPM nga persona t\u00eb tret\u00eb n\u00eb serverin q\u00eb \u00ebsht\u00eb i aksesuesh\u00ebm p\u00ebr t\u00eb gjitha makinat Linux.<\/p>\n<h2>Versionimi i DB<\/h2>\n<p>\nN\u00eb konsultimin me zhvilluesit u zbulua se djemt\u00eb preferonin MS SQL, por n\u00eb shumic\u00ebn e projekteve non-Windows tashm\u00eb e kishim p\u00ebrdorur PostgreSQL. Duke vendosur t\u00eb heqim dor\u00eb nga \u00e7do gj\u00eb paguese, filluam t\u00eb p\u00ebrdorim PostgreSQL edhe k\u00ebtu.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb k\u00ebt\u00eb pjes\u00eb d\u00ebshiroj t\u00eb tregoj se si realizuam versionimin e DB dhe si zgjodh\u00ebm midis Flyway dhe Entity Framework Core. Le t\u00eb shqyrtojm\u00eb p\u00ebrpar\u00ebsit\u00eb dhe mang\u00ebsit\u00eb e tyre.<\/p>\n<h3>Kundrat<\/h3>\n<p>\nFlyway ec\u00ebn vet\u00ebm n\u00eb nj\u00eb drejtim, ne\u00a0<b>nuk mund t\u00eb kthehemi mbrapa<\/b>\u00a0\u2014 \u00ebsht\u00eb nj\u00eb disavantazh i r\u00ebnd\u00ebsish\u00ebm. Mund t\u00eb krahasohet me Entity Framework Core n\u00eb aspekte t\u00eb tjera \u2014 nga pik\u00ebpamja e leht\u00ebsis\u00eb p\u00ebr zhvilluesit. Ju e dini se ne e kemi vendosur k\u00ebt\u00eb n\u00eb krye t\u00eb prioriteteve, dhe kritere themelore ishte q\u00eb t\u00eb mos ndryshonim asgj\u00eb p\u00ebr zhvillimin n\u00eb Windows.<\/p>\n<p>P\u00ebr Flyway na <b>duhej nj\u00eb lloj mb\u00ebshtetjeje<\/b>, n\u00eb m\u00ebnyr\u00eb q\u00eb ekipi t\u00eb mos shkruante <b>k\u00ebrkesa SQL<\/b>. Ata jan\u00eb shum\u00eb m\u00eb t\u00eb afruesh\u00ebm t\u00eb operojn\u00eb n\u00eb terma OOP. Shkruan udh\u00ebzime p\u00ebr punimin me objektet e DB, u formua k\u00ebrkesa SQL dhe u ekzekutua. Versioni m\u00eb i ri i DB \u00ebsht\u00eb gati, u testua \u2014 gjith\u00e7ka funksionon.<\/p>\n<p>Entity Framework Core ka nj\u00eb disavantazh \u2014 n\u00eb ngarkesa t\u00eb m\u00ebdha, ai\u00a0<b>nd\u00ebrton k\u00ebrkesa SQL jo optimale<\/b>, dhe r\u00ebnia n\u00eb DB mund t\u00eb jet\u00eb e konsiderueshme. Por, duke qen\u00eb se nuk kemi nj\u00eb sh\u00ebrbim me ngarkes\u00eb t\u00eb lart\u00eb, nuk e llogarisim ngarkes\u00ebn n\u00eb qindra RPS, ne e pranuam k\u00ebt\u00eb risk dhe ia deleguam problemin vetes n\u00eb t\u00eb ardhmen.<\/p>\n<h3>P\u00ebrfitimet<\/h3>\n<p>\nEntity Framework Core <b>punon jasht\u00eb kutis\u00eb dhe \u00ebsht\u00eb i p\u00ebrshtatsh\u00ebm p\u00ebr zhvillimin<\/b>, nd\u00ebrsa Flyway <b>integrohet leht\u00ebsisht n\u00eb CI ekzistues<\/b>. Por ne po b\u00ebjm\u00eb gjith\u00e7ka p\u00ebr t'i b\u00ebr\u00eb gj\u00ebrat m\u00eb t\u00eb lehta zhvilluesve :)<\/p>\n<h3>Procedura e kaluar<\/h3>\n<p>\nPuppet sheh se po vjen nj\u00eb ndryshim n\u00eb versionet e pakove, mes t\u00eb cilave, ajo q\u00eb \u00ebsht\u00eb p\u00ebrgjegj\u00ebse p\u00ebr migrimin. S\u00eb pari instalon paket\u00ebn q\u00eb p\u00ebrmban skriptet e migrimit dhe funksionalitetin e lidhur me DB. Pas k\u00ebsaj, aplikacioni q\u00eb punon me DB restartohet. M\u00eb pas vazhdon instalimi i komponenteve t\u00eb tjera. Renditja e instalimit t\u00eb pakove dhe nisjes s\u00eb aplikacioneve p\u00ebrshkruhet n\u00eb manifestin e Puppet.<\/p>\n<p>Aplikacionet p\u00ebrdorin t\u00eb dh\u00ebna t\u00eb ndjeshme, si\u00e7 jan\u00eb tokenat, fjal\u00ebkalimet p\u00ebr DB, dhe t\u00eb gjitha k\u00ebto t\u00ebrhiqen n\u00eb konfigurimin nga Puppet master, ku ato ruhen n\u00eb form\u00eb t\u00eb enkriptuar.<\/p>\n<h2>Problemet TFS<\/h2>\n<p>\nPas q\u00eb u siguruam dhe kuptuam se gjith\u00e7ka funksionon, vendosa t\u00eb shoh se \u00e7far\u00eb ndodh me nd\u00ebrtimet n\u00eb TFS n\u00eb p\u00ebrgjith\u00ebsi p\u00ebr departamentin e zhvillimit Win p\u00ebr projekte t\u00eb tjera \u2014 n\u00ebse po grumbullohemi\/shtyjm\u00eb shpejt, dhe zbulova probleme t\u00eb m\u00ebdha me shpejt\u00ebsin\u00eb.<\/p>\n<p>Nj\u00eb nga projektet kryesore grumbullohet p\u00ebr 12-15 minuta \u2014 kjo \u00ebsht\u00eb shum\u00eb, nuk mund t\u00eb jetojm\u00eb k\u00ebshtu. Nj\u00eb analiz\u00eb e shpejt\u00eb tregoi nj\u00eb r\u00ebnie t\u00eb frikshme n\u00eb I\/O, dhe kjo ndodh n\u00eb masiva.<\/p>\n<p>Pas analiz\u00ebs s\u00eb p\u00ebrb\u00ebr\u00ebsve, identifikuam tre epiqendra. E para \u2014 <b>\u00abKaspersky antivirus\u00bb<\/b>, i cili skanon kodin n\u00eb t\u00eb gjith\u00eb agjent\u00ebt Windows Build. i dyti \u2014 <b>Windows<\/b> <b>Indeksuesi.<\/b> Ai nuk ishte \u00e7aktivizuar, dhe n\u00eb agjent\u00ebt Build po indeksohej gjith\u00e7ka n\u00eb koh\u00eb reale gjat\u00eb procesit t\u00eb shp\u00ebrndarjes. <\/p>\n<p>I treti \u2014 <b>Npm install. <\/b>Doli se n\u00eb shumic\u00ebn e Pipelines ne e p\u00ebrdorim k\u00ebt\u00eb skenar. \u00c7far\u00eb \u00ebsht\u00eb e keqja? Procedura Npm install aktivizohet gjat\u00eb formimit t\u00eb pem\u00ebs s\u00eb var\u00ebsive n\u00eb\u00a0<b>package-lock.json<\/b>, ku regjistrohen versionet e paketave q\u00eb do t\u00eb p\u00ebrdoren p\u00ebr nd\u00ebrtimin e projektit. Problemi \u00ebsht\u00eb se Npm install \u00e7do her\u00eb t\u00ebrheq versionet e azhurnuara t\u00eb paketave nga interneti, dhe kjo merr shum\u00eb koh\u00eb n\u00eb rastin e nj\u00eb projekti t\u00eb madh.<\/p>\n<blockquote><p>Zhvilluesit ndonj\u00ebher\u00eb eksperimentohet n\u00eb makin\u00ebn lokale p\u00ebr t\u00eb verifikuar funksionimin e nj\u00eb pjes\u00eb t\u00eb ve\u00e7ant\u00eb ose t\u00ebr\u00eb projektit. Ndodh ndonj\u00ebher\u00eb q\u00eb lokalisht gjith\u00e7ka funksionon mir\u00eb, por kur e nd\u00ebrtuam, nuk punonte asgj\u00eb. Fillojm\u00eb t\u00eb kuptojm\u00eb se \u00e7far\u00eb \u00ebsht\u00eb problemi \u2014 po, versionet e ndryshme t\u00eb paketave me var\u00ebsi.<\/p><\/blockquote>\n<p><\/p>\n<h3>Zgjidhja<\/h3>\n<p><\/p>\n<ul>\n<li>Burimet n\u00eb p\u00ebrjashtime AV.\n<\/li>\n<li>\u00c7aktivizimi i indeksimit.\n<\/li>\n<li>Kalim n\u00eb\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nPikat e forta t\u00eb npm ci jan\u00eb se ne\u00a0<b>nd\u00ebrtojm\u00eb pem\u00ebn e var\u00ebsive nj\u00eb her\u00eb<\/b>, dhe kemi mund\u00ebsin\u00eb t\u2019i ofrojm\u00eb zhvilluesit <b>nj\u00eb list\u00eb t\u00eb azhurnuar paketash<\/b>, me t\u00eb cilin mund t\u00eb eksperimentohet pa kufizime n\u00eb nivel lokal. Kjo <b>kursehet koh\u00eb<\/b> p\u00ebr zhvilluesit q\u00eb shkruajn\u00eb kod.<\/p>\n<h3>Konfigurimi<\/h3>\n<p>\nTani pak p\u00ebr konfigurimin e repositorit. Historikisht ne p\u00ebrdorim <b>Nexus<\/b> p\u00ebr menaxhimin e repositorive, duke p\u00ebrfshir\u00eb <b>REPO t\u00eb brendshme<\/b>. N\u00eb k\u00ebt\u00eb repositor t\u00eb brendsh\u00ebm, jan\u00eb d\u00ebrguar t\u00eb gjith\u00eb komponent\u00ebt q\u00eb ne p\u00ebrdorim p\u00ebr q\u00ebllime t\u00eb brendshme, si\u00e7 jan\u00eb monitorimet e zhvilluara nga ne vet\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe gjithashtu p\u00ebrdorim <b>NuGet<\/b>, pasi ai \u00ebsht\u00eb m\u00eb i efektsh\u00ebm n\u00eb ruajtjen e paketave krahasuar me menaxher\u00ebt e tjer\u00eb t\u00eb paketave.<\/p>\n<h3>Rezultati<\/h3>\n<p>\nPas optimizimit t\u00eb agjent\u00ebve Build, koha mesatare e nd\u00ebrtimit u ul nga 12 minuta n\u00eb 7.<\/p>\n<blockquote><p>N\u00ebse llogarisim t\u00eb gjitha makinat q\u00eb do t\u00eb mund t\u00eb p\u00ebrdornim p\u00ebr Windows, por q\u00eb kaluam n\u00eb Linux n\u00eb k\u00ebt\u00eb projekt, ne kursejm\u00eb rreth $10,000. Dhe kjo \u00ebsht\u00eb vet\u00ebm p\u00ebr licencat, e n\u00ebse p\u00ebrfshijm\u00eb kostot e tjera \u2013 \u00ebsht\u00eb m\u00eb shum\u00eb.<\/p><\/blockquote>\n<p><\/p>\n<h2>Planet<\/h2>\n<p>\nN\u00eb kuadrin e kat\u00ebrti t\u00eb ardhsh\u00ebm e kemi planifikuar pun\u00ebn mbi optimizimin e shp\u00ebrndarjes s\u00eb kodit.<\/p>\n<p><b>Kalimi n\u00eb imazhin Docker t\u00eb parat\u00ebsuar<\/b>. TFS \u00ebsht\u00eb nj\u00eb gj\u00eb e shk\u00eblqyer me shum\u00eb plugina q\u00eb lejojn\u00eb integrimin n\u00eb Pipeline, duke p\u00ebrfshir\u00eb edhe nd\u00ebrtimin p\u00ebrmes nj\u00eb trigger-i, p\u00ebr shembull, imazhit Docker. Ky trigger ne duam ta b\u00ebjm\u00eb p\u00ebr at\u00eb t\u00eb nj\u00ebjtin <b>package-lock.json<\/b>. N\u00ebse ndonj\u00ebher\u00eb ndryshon p\u00ebrb\u00ebrja e komponenteve q\u00eb p\u00ebrdoren p\u00ebr nd\u00ebrtimin e projektit \u2014 ne nd\u00ebrtuam nj\u00eb Docker image t\u00eb ri. Ky i fundit p\u00ebrdoret m\u00eb pas p\u00ebr dislokimin e nj\u00eb konteineri me aplikacionin e nd\u00ebrtuar. Aktualisht, nuk e kemi k\u00ebt\u00eb, por planifikojm\u00eb t\u00eb kalojm\u00eb n\u00eb nj\u00eb arkitektur\u00eb mikrosistemesh n\u00eb Kubernetes, e cila \u00ebsht\u00eb duke u zhvilluar aktivisht n\u00eb kompanin\u00eb ton\u00eb dhe ka mbajtur prej koh\u00ebsh zgjidhje produksioni.<\/p>\n<h2>Curriculum Vitae<\/h2>\n<p>\nI b\u00ebj thirrje t\u00eb gjith\u00ebve t\u00eb heqin dor\u00eb nga Windows, por kjo nuk \u00ebsht\u00eb sepse un\u00eb nuk di ta p\u00ebrgatis at\u00eb. Arsyeja \u00ebsht\u00eb se shumica e zgjidhjeve Opensource jan\u00eb <b>stoku Linux<\/b>. Do t\u00eb <b>kursoni mir\u00eb n\u00eb burimet<\/b>. N\u00eb mendimin tim, e ardhmja \u00ebsht\u00eb me zgjidhje Open Source n\u00eb Linux me nj\u00eb komunitet t\u00eb fuqish\u00ebm.<\/p>\n<p><i>Profili i fol\u00ebsit Aleksand\u00ebr Sin\u00e7inov <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">n\u00eb GitHub<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0\u2014 kjo \u00ebsht\u00eb nj\u00eb konferenc\u00eb p\u00ebr integrimin e proceseve t\u00eb zhvillimit, testimit dhe operimit p\u00ebr profesionist\u00eb nga profesionist\u00ebt. Pik\u00ebrisht p\u00ebr k\u00ebt\u00eb arsye projekti, p\u00ebr t\u00eb cilin tregoi Aleksandri, \u00ebsht\u00eb realizuar dhe funksionon, nd\u00ebrsa n\u00eb dit\u00ebn e fjalimit u realizuan dy l\u00ebshime t\u00eb suksesshme. N\u00eb\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf n\u00eb RIT++<\/a><\/noindex> m\u00eb 27 dhe 28 maj do t\u00eb ket\u00eb edhe m\u00eb shum\u00eb raste t\u00eb ngjashme nga praktikan\u00ebt. Mund t\u00eb hipni n\u00eb vagonin e fundit dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">t\u00eb d\u00ebrgoni nj\u00eb raport<\/a><\/noindex> ose ngadal\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">rezervoni<\/a><\/noindex> bileti. Takemi n\u00eb Skolkovo!<\/p><\/blockquote>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/448496\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b\u00a0\u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438\u00a0\u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e\u00a0Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f\u00a0\u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430\u00a0\u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e\u00a0\u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u00a0\u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e\u00a0Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u00a0Linux, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24043,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32217","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 Linux,\" \/>\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\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\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.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 Linux,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\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=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47.NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb | ProHoster","description":"Ne zhvilluam DevOps si mund\u00ebm. Ishim 8 persona, dhe Vasilik ishte m\u00eb i miri n\u00eb Windows. Papritmas, Vasilik u largua, dhe mua m\u00eb doli detyra t\u00eb nxjerr nj\u00eb projekt t\u00eb ri, q\u00eb ofron zhvillim Windows. Kur hodha mbi tryez\u00eb gjith\u00eb grack\u00ebn e zhvillimit Windows, kuptova se situata ishte e dhimbshme\u2026 K\u00ebshtu fillon historia e Aleksand\u00ebr Sin\u00e7inov n\u00eb DevOpsConf. Kur specialisti kryesor p\u00ebr Windows u largua nga kompania, Aleksandri pyeti se \u00e7far\u00eb duhej t\u00eb b\u00ebnte tani. T\u00eb kalonte n\u00eb Linux,","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","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.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster","og:description":"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 Linux,","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","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":"2019-10-31T18:45:43+00:00","article:modified_time":"2019-10-31T18:45:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32217","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":"2026-01-21 09:49:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:02:47","updated":"2026-01-21 09:49:20","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\/32217","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=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}