{"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\/sl\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core na Linuxu, DevOps na konju","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dejavno smo razvijali DevOps, kot smo mogli. Bilo nas je 8 in Vasja je bil najbolj\u0161i specialist za Windows. Nenadoma je Vasja od\u0161el in pred mano se je pojavila naloga, da uvedem nov projekt, ki vklju\u010duje Windows razvoj. Ko sem postavil na mizo celoten Windows razvojni sklad, sem razumel, da je situacija zelo slaba...<\/p>\n<p>Tako se za\u010dne zgodba <b>Aleksander Sin\u010dinov<\/b> na <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Ko je iz podjetja od\u0161el vodilni strokovnjak za Windows, se je Aleksander vpra\u0161al, kaj storiti zdaj. Preiti na Linux, seveda! Aleksander bo govoril o tem, kako mu je uspelo ustvariti precedens in prenesti del Windows razvoja na Linux na primeru izvedenega projekta za 100.000 kon\u010dnih uporabnikov.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKako enostavno in brez te\u017eav dostaviti projekt v RPM, ob uporabi TFS, Puppet, Linux .NET core? Kako vzdr\u017eevati verzioniranje baze podatkov projekta, \u010de razvojna ekipa prvi\u010d sli\u0161i besede Postgres in Flyway, rok za dokon\u010danje pa je jutri? Kako integrirati z Dockerjem? Kako motivirati .NET razvijalce, da se odre\u010dejo Windows in smoothiejem v prid Puppet in Linuxu? Kako re\u0161iti ideolo\u0161ke konflikte, ko za vzdr\u017eevanje Windows v produkciji ni ve\u010d mo\u010di, volje ali sredstev? O tem, pa tudi o Web Deploy, testiranju, CI, praksah uporabe TFS v obstoje\u010dih projektih in seveda o pokvarjenih nastavitvah in delujo\u010dih re\u0161itvah bo govoril Aleksander.<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=\"Predvajaj video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nTorej, Vasja je od\u0161el, naloga pa je z menoj, razvijalci \u010dakajo z vilami. Ko sem dokon\u010dno spoznal, da Vasje ne morem vrniti, sem se lotil dela. Najprej sem ocenil odstotek Windows VM v na\u0161em parku. \u0160tevilke niso bile v prid Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKer aktivno razvijamo DevOps, sem spoznal, da je treba spremeniti pristop k uvedbi nove aplikacije. Edina re\u0161itev je bila, da vse mo\u017eno prenesemo na Linux. Google mi je pomagal - v tistem trenutku je bil .Net \u017ee portiran na Linux in razumel sem, da je to re\u0161itev!<\/p>\n<h2>Zakaj .NET core v povezavi z Linuxom?<\/h2>\n<p>\nZanj je bilo ve\u010d razlogov. Med \u201epla\u010dati denar\u201c in \u201ene pla\u010dati\u201c ve\u010dina izbira drugo \u2014 tako kot jaz. Licenca za MSDB stane okoli 1.000 $, vzdr\u017eevanje parka Windows virtualnih strojev pa je merjeno v stotinah dolarjev. Za veliko podjetje so to veliki stro\u0161ki. Zato <b>prihranek\u00a0<\/b>\u2014<b> je prvi razlog<\/b>. Ni najpomembnej\u0161i, je pa eden izmed tehtnih.<\/p>\n<p>Windows virtualni stroji zavzamejo ve\u010d virov kot njihovi Linux bratje \u2014 <b>so te\u017eki<\/b>. Glede na obseg velikega podjetja smo izbrali Linux.<\/p>\n<p><b>Sistema se preprosto vklju\u010di v obstoje\u010di CI<\/b>. \u0160e vedno se \u0161tejemo za napredne DevOps-e, uporabljamo Bamboo, Jenkins in GitLab CI, zato ve\u010dina deluje na Linuxu.<\/p>\n<p>Zadnji razlog je <b>udobno vzdr\u017eevanje. <\/b>Morali smo zni\u017eati prag vstopa za 'vzdr\u017eevalce' \u2013 fante, ki razumejo tehni\u010dne zadeve, zagotavljajo nemoteno delovanje in vzdr\u017eujejo storitve druge ravni. Ti so se \u017ee seznanili s tehnologijo Linux, zato jim je veliko la\u017eje razumeti nov izdelek, ga podpirati in vzdr\u017eevati, kot pa tro\u0161iti dodatne vire za razumevanje primerljive funkcionalnosti programske opreme za Windows platformo.<\/p>\n<h2>Zahteve<\/h2>\n<p>\nPrvo in najpomembnej\u0161e je <b>udobje nove re\u0161itve za razvijalce<\/b>. Ne v\u0161ecim vsem je bilo lahko sprejeti spremembe, \u0161e posebej po izgovorjeni besedi Linux. Razvijalci \u017eelijo svojo priljubljeno Visual Studio, TFS z avtomatskimi testi po zgradbah in smoothie. Kako se izvaja dostava v produkcijo \u2013 zanje ni pomembno. Zato smo se odlo\u010dili, da ne bomo spreminjali obi\u010dajnega postopka in bomo pustili za Windows razvijalce vse nespremenjeno. <\/p>\n<p>Nov projekt je treba <b>vklju\u010diti v obstoje\u010di CI<\/b>. Tirnice so \u017ee obstajale in vso delo je bilo treba opraviti ob upo\u0161tevanju parametrov sistema upravljanja konfiguracij, sprejetih standardov dostave in sistemov monitoringa.<\/p>\n<p><b>Enostavnost vzdr\u017eevanja in delovanja<\/b>, kot pogoj za minimalni vhodni prag za vse nove udele\u017eence iz razli\u010dnih oddelkov in vzdr\u017eevalnega oddelka.<\/p>\n<p><b>Rok je bil v\u010deraj<\/b>.<\/p>\n<h2>Skupina Win razvoja<\/h2>\n<p>\nS \u010dim je torej delala ekipa Windows?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZdaj lahko samozavestno povem, da <b>IdentityServer4<\/b>\u00a0\u2014 to je odli\u010dna brezpla\u010dna alternativa ADFS z enakimi mo\u017enostmi, ali pa <b>Entity Framework Core<\/b>\u00a0\u2014 raj za razvijalca, kjer ni treba skrbeti za pisanje SQL skript, ampak opisovati poizvedbe v BDP v razumljivih OOP izrazih. Ampak takrat, na razpravi o akcijskem na\u010drtu, sem na to tehnologijo gledal kot na \u0161umerko klinopis in poznal le PostgreSQL in Git.<\/p>\n<p>V tistem \u010dasu smo aktivno uporabljali <b>Puppet<\/b> kot sistem upravljanja konfiguracije. V ve\u010dini na\u0161ih projektov smo uporabljali <b>GitLab CI<\/b>, <b>Elastic<\/b>, uravnote\u017eili visoko obremenjene storitve s pomo\u010djo <b>HAProxy,<\/b> vse spremljali s pomo\u010djo <b>Zabbix<\/b>, povezave <b>Grafana<\/b> in\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, in vse to se je vrtelo na strojni opremi\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> na\u00a0<b>VMware<\/b>. Vsem je znano \u2013 klasika \u017eanra.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoglejmo in posku\u0161ajmo razumeti, kaj se je dogajalo, preden smo za\u010deli vse te posege.<\/p>\n<h2>Kaj je bilo<\/h2>\n<p>\nTFS je precej zmogljiv sistem, ki ne le prena\u0161a kodo od razvijalca do kon\u010dne produkcijske naprave, ampak tudi ponuja niz mo\u017enosti za zelo fleksibilno integracijo z razli\u010dnimi storitvami \u2013 za zagotavljanje CI na\u8de8\u5e73\u53f0 raven.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPrej so bile to same odprtine. TFS je uporabljal ve\u010d Build-agentov, na katerih je bilo zbranih ve\u010d projektov. V vsakem agentu po 3-4 delavce, da so razdelili naloge in optimizirali proces. Nato je TFS, v skladu z na\u010drti izdaje, dostavil sve\u017ee zgrajen Build na Windows stre\u017enik aplikacij.<\/p>\n<h2>Kam smo \u017eeleli priti<\/h2>\n<p>\nZa dostavo in razvoj uporabljamo TFS, aplikacijo pa zagnamo na Linux stre\u017eniku aplikacij, med njima pa se odvija neka magija. Ta <b>Magic Box<\/b> je tista klju\u010dna komponenta prihodnjega dela. Preden ga razstavim na dele, bom naredil korak nazaj in povedal dve besedi o aplikaciji.<\/p>\n<h2>Projekt<\/h2>\n<p>\nAplikacija ponuja funkcionalnost za upravljanje s predpla\u010dni\u0161kimi karticami. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Client<\/h3>\n<p>\nObstajala sta dva tipa uporabnikov. <b>Prvi<\/b> je imel dostop, avtentificiral se je s certifikatom SSL SHA-2. Drugi\u00a0<b>je imel dostop s prijavno in geslom.<\/b> Nato se je uporabni\u0161ka zahteva poslala v HAProxy, ki je re\u0161eval naslednje naloge:<\/p>\n<h3>HAProxy<\/h3>\n<p>\nprvotna avtentifikacija;<\/p>\n<ul>\n<li>zaklju\u010devanje SSL;\n<\/li>\n<li>nastavljanje HTTP zahtev;\n<\/li>\n<li>pretvarjanje zahtev.\n<\/li>\n<li>Preverjanje uporabni\u0161kega certifikata je potekalo po verigi. Mi smo\n<\/li>\n<\/ul>\n<p>\nauthority <b>in si lahko to privo\u0161\u010dimo, saj sami izdamo certifikate strankam storitve. <\/b>Pozorni bodite na tretjo to\u010dko, kmalu se bomo vanjo ponovno vrnili.<\/p>\n<p>Na\u010drtovali smo, da bo backend zasnovan na Linuxu. Backend komunicira z bazo podatkov, nalo\u017ei potreben seznam privilegijev in nato, odvisno od privilegijev, ki jih ima avtentificirani uporabnik, omogo\u010da dostop do podpisa finan\u010dnih dokumentov in njihovega po\u0161iljanja v izvedbo ali generiranja nekega poro\u010dila.<\/p>\n<h3>Backend<\/h3>\n<p>\nPrihranek s HAProxy<\/p>\n<h2>Poleg dveh kontekstov, po katerih je hodil vsak izmed uporabnikov, je obstajal \u0161e kontekst identity.<\/h2>\n<p>\nki omogo\u010da avtentikacijo, je brezpla\u010dna in zmogljiva alternativa za <b>IdentityServer4<\/b> ADFS <b>Active Directory Federation Services\u00a0<\/b>\u2014<b> Zahteva v identity je bila obdelana v ve\u010d korakih. Prvi korak \u2013<\/b>.<\/p>\n<p>je pri\u0161el v backend <b>stranko<\/b> <b>je bil obdelan.<\/b>, ki je izmenjeval podatke s tem stre\u017enikom in preverjal prisotnost \u017eetona za stranko. \u010ce ga ni na\u0161el, se je zahteva vrnila nazaj v kontekst, iz katerega je pri\u0161la, vendar z redirekcijo, in redirekcija je \u0161la na identity.<\/p>\n<p>Drugi korak je bil, da je zahteva prispela <b>na stran za avtorizacijo v IdentityServer,<\/b> kjer se je stranka registrirala, v bazi podatkov IdentityServer pa se je pojavil tisti dolgo pri\u010dakovani \u017eeton. <\/p>\n<p>Tretji korak je, <b>da se stranka redirekta nazaj <\/b>v kontekst, iz katerega je pri\u0161la.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 ima posebnost: <b>odgovor na povratno zahtevo vra\u010da preko HTTP<\/b>. Kakorkoli smo se trudili s konfiguracijo stre\u017enika, kakorkoli smo se izobra\u017eevali iz dokumentacije, smo vsakokrat prejeli prvotno zahtevo stranke z URL-jem, ki je pri\u0161el preko HTTPS, IdentityServer pa je vra\u010dal isti kontekst, vendar z HTTP. Bili smo v \u0161oku! Vse to smo preusmerili preko konteksta identity na HAProxy, v glavi pa smo morali modificirati protokol HTTP na HTTPS. <\/p>\n<p>Kak\u0161na je torej izbolj\u0161ava in kje smo prihranili?<\/p>\n<blockquote><p>Prihranili smo denar, ker smo uporabili brezpla\u010dno re\u0161itev za avtorizacijo skupine uporabnikov, sredstva, saj nismo postavili IdentityServer4 kot lo\u010deno nod v lo\u010den segment, temve\u010d smo ga uporabljali skupaj z backendom na istem stre\u017eniku, kjer deluje backend aplikacije.<\/p><\/blockquote>\n<p><\/p>\n<h2>Kako naj bi delovalo<\/h2>\n<p>\nTorej, kot sem obljubil \u2013 \u010carobna \u0160katla. \u017de razumemo, da se usmerjamo k Linuxu. Dajte natan\u010dno opredeliti naloge, ki so zahtevale re\u0161itev.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Puppet manifesti. <\/b>Za dostavo in upravljanje konfiguracije storitve in aplikacije je bilo potrebno napisati odli\u010dne recepte. Rolica s svin\u010dnikom glasno prikazuje, kako hitro in kakovostno je bilo to opravljeno.<\/p>\n<p><b>Na\u010din dostave. <\/b>Standarden je RPM. Vsi vedo, da brez njega v Linuxu ne gre, a sam projekt po sestavi predstavlja sklop izvr\u0161nih DLL-datotek. Bilo jih je okoli 150, projekt je dovolj te\u017eak. Edina harmoni\u010dna re\u0161itev je, da se to binarno snov zapakira v RPM in ga iz njega razpakiramo aplikacijo.<\/p>\n<p><b>Razli\u010dne verzije. <\/b>Imeli smo potrebo po zelo pogostih izdajah in morali smo ugotoviti, kako oblikovati ime paketa. To je vpra\u0161anje na ravni integracije s TFS. Na\u0161 Build-agent je deloval na Linuxu. Ko TFS po\u0161lje nalogo obdelovalniku - delavcu - na Build-agent, mu posreduje tudi mno\u017eico spremenljivk, ki preidejo v okolje obdelovalnega procesa. V teh spremenljivkah okolja se prena\u0161a ime Builda, ime razli\u010dice in druge spremenljivke. Ve\u010d o tem v razdelku 'sestavljanje RPM-paketa'.<\/p>\n<p><b>Nastavitev TFS<\/b> je bila osredoto\u010dena na nastavitev Pipeline. V preteklosti smo gradili vse Windows projekte na Windows agentih, zdaj pa se pojavi Linux-agent - Build-agent, ki ga je treba vklju\u010diti v skupino za sestavljanje, obogatiti z nekaterimi artefakti, povedati, katere vrste projektov bodo sestavljene na tem Build-agentu in na nek na\u010din modificirati Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS ni na\u0161 cilj, podpiramo Open Source.<\/p>\n<p>Poglejmo komponente.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nSestavljen je iz \u0161tirih delov.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-agent. <\/b>Linux, ker sestavljamo zanj - logi\u010dno. Ta del je bil izveden v treh korakih.<\/p>\n<ul>\n<li><b>Nastavite delavce<\/b> in ne enega, saj je bila predvidena razpr\u0161ena obdelava projekta.\n<\/li>\n<li><b>Namestite .NET Core 1.x<\/b>. Zakaj prav 1.x, ko je \u017ee na voljo 2.0 v standardnem repozitoriju? Ker je ob za\u010detku razvoja stabilna razli\u010dica bila 1.09 in smo se odlo\u010dili, da projekt naredimo za to razli\u010dico.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repository. <\/b>RPM-pakete je bilo treba nekje hraniti. Predvideno je bilo, da bomo uporabili isti korporativni RPM-repozitorij, ki je na voljo vsem Linux gostiteljem. Tako smo tudi ravnali. Na stre\u017eniku repozitorija je nastavljen <b>webhook<\/b> ki je prena\u0161al potrebni RPM-paket iz navedene lokacije. Razli\u010dico paketa je Build-agent sporo\u010dil webhooku.<\/p>\n<p><b>GitLab. <\/b>Pozor! GitLab tukaj uporabljajo ne razvijalci, temve\u010d oddelek za obratovanje za nadzor razli\u010dic aplikacije, razli\u010dic paketov, kontrola stanja vseh Linux strojev in v njem se hrani receptura - vsi manifesti Puppet. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2013 re\u0161uje vse sporne to\u010dke in dostavlja to\u010dno tisto konfiguracijo, ki jo \u017eelimo, iz Gitlaba.<\/p>\n<p>Za\u010dnimo se potopiti. Kako poteka dostava DLL v RPM?<\/p>\n<h3>Dostava DLL v RPM<\/h3>\n<p>\nRecimo, da imamo zvezdo razvoja na .NET. Uporablja Visual Studio in ustvari razli\u010dico. Po tem jo nalo\u017ei v Git, in Git je tukaj - entiteta TFS, torej je to repozitorij aplikacije, s katero dela razvijalec.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo tem TFS zazna, da je pri\u0161el nov commit. Katera aplikacija? V nastavitvah TFS je oznaka, katere vire ima dolo\u010den Build-agent. V tem primeru vidi, da sestavljamo .NET Core projekt in izbere Linux Build-agent iz bazena. <\/p>\n<p>Build-agent prejme izvorno kodo, prenese potrebne <b>dependencies<\/b> iz .NET repozitorija, npm itd. in po sestavi aplikacije in njenem pakiranju po\u0161lje RPM paket v RPM repozitorij.<\/p>\n<p>Na drugi strani se dogaja naslednje. In\u017eenir oddelka za vzdr\u017eevanje se neposredno ukvarja z odvajanjem projekta: spreminja verzije paketov v\u00a0<b>Hiera<\/b> v repozitoriju, kjer je shranjen recept aplikacije, nato Puppet spro\u017ei <b>Yum<\/b>, pobere nov paket iz repozitorija in nova razli\u010dica aplikacije je pripravljena za uporabo.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa papirju je vse preprosto, ampak kaj se dogaja znotraj samega Build-agenta?<\/p>\n<h3>Pakiranje DLL RPM<\/h3>\n<p>\nPrejeta je izvorna koda projekta in naloga za sestavo od TFS. Build-agent <b>za\u010dne sestavo samega projekta iz izvorne kode.<\/b>Sestavljen projekt je na voljo v obliki \u0161tevilnih <b>DLL datotek<\/b>, ki so pakirane v zip arhiv za zmanj\u0161anje obremenitve na datote\u010dnem sistemu.<\/p>\n<p>ZIP arhiv se izda <b>v direktorij za sestavo RPM paketa.<\/b> Nato Bash skript inicializira okoljske spremenljivke, najde verzijo Build, verzijo projekta, pot do direktorija za sestavo in za\u017eene RPM-build. Po zaklju\u010dku sestave se paket objavi v\u00a0<b>lokalnem repozitoriju<\/b>, ki se nahaja na Build-agentu.<\/p>\n<p>Nato se iz Build-agenta na stre\u017enik v RPM-repozitorij <b>po\u0161lje JSON zahtevek<\/b> z navedbo imena verzije in buildu. Webhook, o katerem sem prej govoril, prenese ta paket iz lokalnega repozitorija na Build-agentu in naredi novo sestavo pripravljeno za namestitev.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZakaj je tak\u0161na shema dostave paketa v RPM repozitorij? Zakaj ne moremo takoj poslati sestavljenega paketa v repozitorij? Gre za to, da je to pogoj za zagotavljanje varnosti. Tak\u0161en scenarij omejuje mo\u017enost nepoobla\u0161\u010denega nalaganja RPM paketov od nepoobla\u0161\u010denih oseb na stre\u017enik, ki je dostopen vsem Linux napravam.<\/p>\n<h2>Razli\u010dnost Baze podatkov<\/h2>\n<p>\nNa konziliju z razvojem se je izkazalo, da so fantje bli\u017eje MS SQL, vendar smo v ve\u010dini non-Windows projektov \u017ee uporabili PostgreSQL. Ker smo se odlo\u010dili, da se odpovemo vsem pla\u010dljivim re\u0161itvam, smo za\u010deli uporabljati PostgreSQL tudi tukaj.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tem delu \u017eelim govoriti o tem, kako smo izvajali verzioniranje BDP in kako smo izbirali med Flyway in Entity Framework Core. Oglejmo si njune prednosti in slabosti.<\/p>\n<h3>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/h3>\n<p>\nFlyway deluje le v eno smer, mi\u00a0<b>ne moremo vrniti nazaj<\/b>\u00a0\u2014 to je pomembna pomanjkljivost. Splotiti ga je mogo\u010de z Entity Framework Core po drugih kriterijih \u2014 z vidika udobja za razvijalce. Saj se spomnite, da smo to postavili na prvo mesto, in glavno merilo je bilo, da ne spremenimo ni\u010d za Windows-razvoj.<\/p>\n<p>Za Flyway smo <b>potrebovali nekak\u0161no ovito<\/b>, da fantje ne bi pisali <b>SQL-poizvedbe<\/b>. Zanje je veliko bli\u017eje delati v izrazih OOP. Napisali smo navodila za delo z objekti BDP, oblikoval se je SQL-poizvedba in izvedla. Nova razli\u010dica BDP je pripravljena, testirana - vse je v redu, vse deluje.<\/p>\n<p>Entiteta Framework Core ima pomanjkljivost - pri velikih obremenitvah\u00a0<b>gradi neoptimalne SQL-poizvedbe<\/b>, kar lahko povzro\u010di pomembne padce v BDP. Ampak ker na\u0161 servis ni pod velikimi obremenitvami, obremenitev ne merimo s stotinami RPS, smo sprejeli te tveganja in delegirali te\u017eave prihodnjim nam.<\/p>\n<h3>Prednosti<\/h3>\n<p>\nEntity Framework Core <b>to deluje iz \u0161katle in je udobno za razvoj<\/b>, Flyway <b>pa se enostavno integrira v obstoje\u010d CI<\/b>. Ampak kon\u010dno delamo, da je ugodno za razvijalce :)<\/p>\n<h3>Postopek namestitve<\/h3>\n<p>\nPuppet vidi, da prihajajo spremembe razli\u010dic paketov, med katerimi je tisti, ki odgovarja za migracijo. Najprej namesti paket, kjer so migracijski skripti in funkcionalnosti, povezane z BDP. Po tem se aplikacija, ki dela z BDP, ponovno za\u017eene. Nato sledi namestitev preostalih komponent. Zaporedje namestitve paketov in zagon aplikacij je opisano v Puppet manifestu.<\/p>\n<p>Aplikacije uporabljajo ob\u010dutljive podatke, kot so \u017eetoni, gesla do BDP, vse to se vle\u010de v konfiguracijo s Puppet master, kjer so shranjeni v \u0161ifrirani obliki.<\/p>\n<h2>Te\u017eave TFS<\/h2>\n<p>\nPotem ko smo se odlo\u010dili in spoznali, da nam v resnici vse deluje, sem se odlo\u010dil preveriti, kaj se dogaja s sestavki v TFS na splo\u0161no za oddelek Win-razvoja za druge projekte - ali se hitro sestavljamo\/izdajamo, in odkril sem pomembne te\u017eave s hitrostjo.<\/p>\n<p>Eden od glavnih projektov se sestavlja 12-15 minut - to je dolgo, tako se ne da \u017eiveti. Hitri analiza je pokazala grozno upo\u010dasnitev po I\/O, in to pri poljih.<\/p>\n<p>Po analizi po komponentah sem izpostavil tri \u017eari\u0161\u010da. Prvo - <b>\"Kaspersky antivirus\"<\/b>, ki na vseh Windows Build-agentih skenira izvorne kode. Drugi - <b>Windows<\/b> <b>Indexer.<\/b> Ni bil onemogo\u010den, in na Build-agentih se je v realnem \u010dasu indeksiralo vse med procesom namestitve. <\/p>\n<p>Tretji - <b>Npm install. <\/b>Izkazalo se je, da smo v ve\u010dini Pipelines uporabljali prav ta scenarij. Kaj je narobe? Postopek Npm install se za\u017eene pri oblikovanju drevesa odvisnosti v\u00a0<b>package-lock.json<\/b>, kjer se zabele\u017eijo razli\u010dice paketov, ki se bodo uporabljale za sestavljanje projekta. Slabost je v tem, da Npm install vsakokrat potegne aktualne razli\u010dice paketov iz interneta, kar vzame precej \u010dasa v primeru velikega projekta.<\/p>\n<blockquote><p>Razvijalci v\u010dasih eksperimentirajo na lokalnem ra\u010dunalniku, da preverijo delovanje posameznega dela ali projekta v celoti. V\u010dasih se je izkazalo, da je vse super lokalno, vendar pri sestavljanju ni delovalo. Za\u010dnemo ugotavljati, v \u010dem je te\u017eava - aha, razli\u010dice paketov z odvisnostmi so razli\u010dne.<\/p><\/blockquote>\n<p><\/p>\n<h3>Solution<\/h3>\n<p><\/p>\n<ul>\n<li>Izvorne kode v izjemah AV.\n<\/li>\n<li>Onemogo\u010ditev indeksacije.\n<\/li>\n<li>Prehod na\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nPrednosti npm ci so, da\u00a0<b>drevni odvisnosti zgradimo enkrat<\/b>, in dobimo mo\u017enost, da razvijalcu <b>ponudimo aktualen seznam paketov<\/b>, s katerim lahko neomejeno eksperimentira lokalno. To <b>prihrani \u010das<\/b> razvijalcem, ki pi\u0161ejo kodo.<\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/h3>\n<p>\nSedaj malo o konfiguraciji repozitorija. Zgodovinsko smo uporabljali <b>Nexus<\/b> za upravljanje repozitorijev, vklju\u010dno z <b>Internal REPO<\/b>. V ta interni repozitorij se dostavljajo vse komponente, ki jih uporabljamo za interne namene, na primer, lastni monitoring.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na konju\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNadgrajujemo tudi <b>NuGet<\/b>, ker bolje predpomni v primerjavi z drugimi upravitelji paketov.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/h3>\n<p>\nPo tem, ko smo optimizirali Build-agente, se je povpre\u010dni \u010das sestavljanja skraj\u0161al s 12 minut na 7.<\/p>\n<blockquote><p>\u010ce upo\u0161tevamo vse ra\u010dunalnike, ki bi jih lahko uporabili za Windows, a smo jih prenesli na Linux v tem projektu, smo prihranili pribli\u017eno 10.000 $. In to je le za licence, \u010de upo\u0161tevamo tudi vzdr\u017eevanje \u2014 \u0161e ve\u010d.<\/p><\/blockquote>\n<p><\/p>\n<h2>Na\u010drti<\/h2>\n<p>\nZa naslednje \u010detrtletje smo na\u010drtovali optimizacijo dostave kode.<\/p>\n<p><b>Prehod na prebuild Docker-sliko<\/b>. TFS je odli\u010dna stvar z mnogimi vti\u010dniki, ki omogo\u010dajo integracijo v Pipeline, vklju\u010dno s sestavljanjem po spro\u017eilcu, recimo, Docker-slike. Ta spro\u017eilec \u017eelimo narediti za tistega. <b>package-lock.json<\/b>. \u010ce se na kakr\u0161en koli na\u010din spremeni sestava komponent, ki se uporabljajo za sestavljanje projekta, se ustvari nova Docker slika. Ta se nato uporablja za uvajanje kontejnerja s sestavljeno aplikacijo. Trenutno tega ni, a na\u010drtujemo prehod na mikrostoritveno arhitekturo v Kubernetesu, ki se aktivno razvija v na\u0161i podjetju in \u017ee dolgo slu\u017ei produkcijskim re\u0161itvam.<\/p>\n<h2>\u0420\u0435\u0437\u044e\u043c\u0435<\/h2>\n<p>\nVsem pozivam, naj zavr\u017eejo Windows, vendar to ni zato, ker je ne znam pripraviti. Razlog je, da je ve\u010dina odprtokodnih re\u0161itev - to je <b>Linuxov sklad<\/b>. Dober <b>prihranite pri virih<\/b>. Po mojem mnenju je prihodnost v odprtokodnih re\u0161itvah na Linuxu z mo\u010dnim skupnostim.<\/p>\n<p><i>Profil govorca Aleksandra Sin\u010dinova <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">na GitHubu<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0je konferenca o integraciji procesov razvoja, testiranja in delovanja za profesionalce od profesionalcev. Zato je projekt, o katerem je govoril Aleksander, realiziran in deluje, medtem ko sta bila na dan njegovega nastopa izvedena dva uspe\u0161na izdaja. Na\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf na RIT++<\/a><\/noindex> 27. in 28. maja bo \u0161e ve\u010d tak\u0161nih primerov od praktikov. \u0160e vedno lahko sko\u010dite na zadnji vlak in <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">predlo\u017eiti referat<\/a><\/noindex> ali brez hitenja <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">rezervirate<\/a><\/noindex> vstopnico. Se vidimo v Skolkovu!<\/p><\/blockquote>\n<p>Izvor: <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.4 - 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.\" \/>\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\/sl\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sl\/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 na Linuxu, DevOps v pogonu | ProHoster","description":"DevOps smo razvijali, kolikor smo mogli. Bilo nas je 8, Vasja pa je bil najbolj\u0161i pri Windows. Nenadoma je Vasja od\u0161el in jaz sem imel nalogo izvesti nov projekt, ki prina\u0161a Windows razvoj.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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.","og:url":"https:\/\/prohoster.info\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}