{"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\/no\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core p\u00e5 Linux, DevOps p\u00e5 hest","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Vi utviklet DevOps s\u00e5 godt vi kunne. Vi var 8 personer, og Vanya var den beste p\u00e5 Windows. Plutselig forlot Vanya oss, og jeg fikk ansvaret for \u00e5 sette i gang et nytt prosjekt som leverer Windows-utvikling. N\u00e5r jeg la ut hele Windows-utviklingsstakken p\u00e5 bordet, inns\u00e5 jeg at situasjonen var smertefull\u2026<\/p>\n<p>Slik begynner historien <b>Aleksandr Sinchinov<\/b> En funksjon har blitt <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Da den ledende spesialisten p\u00e5 Windows forlot selskapet, stilte Aleksandr seg sp\u00f8rsm\u00e5let om hva han skulle gj\u00f8re n\u00e5. G\u00e5 over til Linux, selvf\u00f8lgelig! Aleksandr vil fortelle hvordan han klarte \u00e5 lage et presedens og overf\u00f8re en del av Windows-utviklingen til Linux, med et eksempel fra et prosjekt med 100 000 sluttbrukere.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvordan enkelt og uanstrengt levere prosjektet i RPM ved \u00e5 bruke TFS, Puppet, Linux .NET Core? Hvordan opprettholde versjonering av databasene i prosjektet, n\u00e5r utviklerne h\u00f8rer om Postgres og Flyway for f\u00f8rste gang, med fristen om to dager? Hvordan integrere med Docker? Hvordan motivere .NET-utviklere til \u00e5 gi opp Windows og smoothies til fordel for Puppet og Linux? Hvordan l\u00f8se ideologiske konflikter n\u00e5r man ikke har verken styrke, lyst eller ressurser til \u00e5 drifte Windows i produksjon? Om dette, samt Web Deploy, testing, CI, praksis for bruk av TFS i eksisterende prosjekter, og selvf\u00f8lgelig om \u00f8delagte krykker og fungerende l\u00f8sninger, i transkripsjonen av Aleksandr sin presentasjon.<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=\"Spill video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nS\u00e5, Vanya har dratt, oppgaven er min, utviklerne venter ut\u00e5lmodig med gaffel. Da jeg endelig forsto at jeg ikke kunne f\u00e5 Vanya tilbake, begynte jeg \u00e5 jobbe. F\u00f8rst vurderte jeg prosentandelen av Win VM i v\u00e5r park. Regnestykket gikk ikke i Windows' fav\u00f8r.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiden vi aktivt utvikler DevOps, inns\u00e5 jeg at jeg m\u00e5tte endre tiln\u00e6rmingen til \u00e5 ta i bruk den nye applikasjonen. L\u00f8sningen var enkel \u2013 om mulig overf\u00f8re alt til Linux. Google hjalp meg \u2013 p\u00e5 den tiden var .Net allerede portet til Linux, og jeg inns\u00e5 at dette var l\u00f8sningen!<\/p>\n<h2>Hvorfor .NET Core i kombinasjon med Linux?<\/h2>\n<p>\nDet var flere grunner til dette. Mellom \"\u00e5 betale penger\" og \"ikke betale\" vil de fleste velge det andre \u2013 som jeg. Lisensen for MSDB koster omtrent 1 000 $, og vedlikeholdet av parken med Windows virtuelle maskiner bel\u00f8per seg til hundrevis av dollar. For en stor bedrift er dette store kostnader. Derfor <b>besparelse\u00a0<\/b>\u2014<b> den f\u00f8rste grunnen<\/b>. Ikke den viktigste, men en av de betydelige.<\/p>\n<p>Windows virtuelle maskiner krever mer ressurser enn sine br\u00f8dre fra Linux \u2013 <b>de er tunge<\/b>. Gitt med st\u00f8rrelsen p\u00e5 det store selskapet har vi valgt Linux.<\/p>\n<p><b>Systemet integreres enkelt i eksisterende CI<\/b>. Vi anser oss som progressive DevOps, bruker Bamboo, Jenkins og GitLab CI, s\u00e5 det meste av arbeidet v\u00e5rt g\u00e5r p\u00e5 Linux.<\/p>\n<p>Den siste grunnen er <b>komfortabel st\u00f8tte. <\/b>Vi m\u00e5tte senke inngangsbarrieren for \u00absupportere\u00bb \u2013 folk som forst\u00e5r den tekniske delen, s\u00f8rger for kontinuitet og drifter tjenester fra andre linje. De var allerede kjent med Linux-stakken, s\u00e5 det er mye lettere for dem \u00e5 forst\u00e5 det nye produktet, st\u00f8tte og vedlikeholde det, enn \u00e5 bruke ekstra ressurser p\u00e5 \u00e5 sette seg inn i tilsvarende funksjonalitet for Windows-plattformen.<\/p>\n<h2>Krav<\/h2>\n<p>\nF\u00f8rst og fremst \u2013 <b>komforten i den nye l\u00f8sningen for utviklere<\/b>. Ikke alle var klare for endringene, spesielt etter at ordet Linux ble nevnt. Utviklerne \u00f8nsker sin kj\u00e6re Visual Studio, TFS med autotester for bygg og smoothies. Hvordan levering til produksjon skjer, bryr de seg ikke om. Derfor bestemte vi oss for \u00e5 ikke endre den vanlige prosessen og la alt st\u00e5 uendret for Windows-utviklingen. <\/p>\n<p>Det nye prosjektet m\u00e5 <b>integreres i eksisterende CI<\/b>. Railsene var allerede p\u00e5 plass, og alt arbeid m\u00e5tte utf\u00f8res med tanke p\u00e5 systemet for konfigurasjonsadministrasjon, vedtatte leveringsstandarder og overv\u00e5kningssystemer.<\/p>\n<p><b>Enkelhet i st\u00f8tte og drift<\/b>, som et krav for minimal inngangsbarriere for alle nye deltakere fra forskjellige avdelinger og supportavdelingen.<\/p>\n<p><b>Fristen var i g\u00e5r<\/b>.<\/p>\n<h2>Win-utviklingsgruppen<\/h2>\n<p>\nHva jobbet Windows-teamet med?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e5 kan jeg trygt si at <b>IdentityServer4<\/b>\u00a0er et fantastisk gratis alternativ til ADFS med lignende muligheter, eller hva <b>Entity Framework Core<\/b>\u00a0er et paradis for utviklere, der man kan slippe \u00e5 skrive SQL-skript og heller beskrive databasforesp\u00f8rslene med OOP-termer. Men p\u00e5 den tiden, under diskusjonen av handlingsplanen, s\u00e5 jeg p\u00e5 denne stakken som babylonsk kileskrift og kjente bare PostgreSQL og Git.<\/p>\n<p>P\u00e5 den tiden brukte vi aktivt <b>Puppet<\/b> som konfigurasjonsadministrasjonssystem. I de fleste av v\u00e5re prosjekter brukte vi <b>GitLab CI<\/b>, <b>Elastic<\/b>, balanserte h\u00f8yt belastede tjenester med hjelp av <b>HAProxy,<\/b> holdt oversikt over alt med hjelp av <b>Zabbix<\/b>, pakken <b>Grafana<\/b> og\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, og alt dette kj\u00f8rte p\u00e5 maskiner\u00a0<b>HP<\/b> med\u00a0<b>ESXi<\/b> En funksjon har blitt\u00a0<b>VMware.<\/b>Alle kjenner det \u2013 sjangerens klassiker.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss se og pr\u00f8ve \u00e5 forst\u00e5 hva som skjedde f\u00f8r vi begynte med alle disse intervensjonene.<\/p>\n<h2>Hva som skjedde<\/h2>\n<p>\nTFS er et ganske kraftig system som ikke bare leverer koden fra utvikler til den endelige produksjonsmaskinen, men ogs\u00e5 har et sett for veldig fleksibel integrering med forskjellige tjenester - for \u00e5 sikre CI p\u00e5 tvers av plattformer.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTidligere var det ren vinduer. TFS brukte flere byggagenter, hvor mange prosjekter ble bygget. I hver agent var det 3-4 arbeidere for \u00e5 parallellisere oppgavene og optimalisere prosessen. Deretter, i henhold til utgivelsesplanene, leverte TFS den nybakte byggingen til Windows-applikasjonsserveren.<\/p>\n<h2>Hva vi \u00f8nsket \u00e5 oppn\u00e5<\/h2>\n<p>\nFor levering og utvikling bruker vi TFS, mens vi kj\u00f8rer applikasjonen p\u00e5 Linux-applikasjonsserveren, og mellom dem er det en form for magi. Denne <b>Magic Box<\/b> er essensen av det kommende arbeidet. F\u00f8r vi tar det fra hverandre, vil jeg ta et skritt til siden og si noen ord om applikasjonen.<\/p>\n<h2>Prosjekt<\/h2>\n<p>\nApplikasjonen gir funksjonalitet for \u00e5 h\u00e5ndtere forh\u00e5ndsbetalte kort. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Client<\/h3>\n<p>\nDet var to typer brukere. <b>Den f\u00f8rste<\/b> fikk tilgang ved \u00e5 autentisere via SSL SHA-2 sertifikat. Den\u00a0<b>andre<\/b> hadde tilgang med brukernavn og passord.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nDeretter kom klientforesp\u00f8rselen inn i HAProxy, som l\u00f8ste f\u00f8lgende oppgaver:<\/p>\n<ul>\n<li>f\u00f8rste autentisering;\n<\/li>\n<li>terminering av SSL;\n<\/li>\n<li>justere HTTP-foresp\u00f8rslene;\n<\/li>\n<li>oversette foresp\u00f8rslene.\n<\/li>\n<\/ul>\n<p>\nSjekken av klientsertifikatet foregikk i henhold til kjeden. Vi er <b>authority <\/b>og vi kan tillate oss dette, siden vi selv utsteder sertifikater til tjenestekundene.<\/p>\n<p>V\u00e6r oppmerksom p\u00e5 det tredje punktet, vi kommer tilbake til det senere.<\/p>\n<h3>Backend<\/h3>\n<p>\nBackend var planlagt \u00e5 v\u00e6re p\u00e5 Linux. Backend interagerer med databasen, laster inn den n\u00f8dvendige listen over privilegier, og deretter, avhengig av hvilke privilegier den autentiserte brukeren har, gir tilgang til signering av finansdokumenter og sending av dem til utf\u00f8relse, eller generering av en rapport.<\/p>\n<h2>Sparing med HAProxy<\/h2>\n<p>\nI tillegg til to kontekster, som alle klientene gikk gjennom, fantes det ogs\u00e5 en kontekst identity. <b>IdentityServer4<\/b> som gj\u00f8r det mulig \u00e5 autentisere, dette er et gratis og kraftig alternativ til <b>ADFS\u00a0<\/b>\u2014<b> Active Directory Federation Services<\/b>.<\/p>\n<p>Foresp\u00f8rselen til identity ble behandlet i flere trinn. Det f\u00f8rste trinnet - <b>klienten<\/b> <b>ble sendt til backend<\/b>, som utvekslet data med denne serveren og kontrollerte om det fantes en token for klienten. Hvis den ikke ble funnet, ble foresp\u00f8rselen sendt tilbake til konteksten den kom fra, men allerede med en omdirigering, og med omdirigeringen gikk den til identity.<\/p>\n<p>Det andre steget - foresp\u00f8rselen kom til <b>p\u00e5 p\u00e5loggingssiden i IdentityServer,<\/b> der klienten registrerte seg, og i IdentityServer-databasen dukket endelig den etterlengtede token opp. <\/p>\n<p>Det tredje steget - <b>klienten ble omdirigert tilbake <\/b>til konteksten den kom fra.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 har en spesiell funksjon: <b>svaret p\u00e5 den omvendte foresp\u00f8rselen returneres via HTTP<\/b>. Uansett hvor mye vi pr\u00f8vde \u00e5 konfigurere serveren, hvor mye vi studerte dokumentasjonen, fikk vi hver gang den opprinnelige foresp\u00f8rselen fra klienten med en URL som kom via HTTPS, mens IdentityServer returnerte den samme konteksten, men med HTTP. Vi var i sjokk! Og vi dirigerte alt dette gjennom identity-konteksten til HAProxy, og i headerne m\u00e5tte vi endre protokollen fra HTTP til HTTPS. <\/p>\n<p>Hva er forbedringen og hvor har vi spart?<\/p>\n<blockquote><p>Vi sparte penger ved \u00e5 bruke en gratis l\u00f8sning for autentisering av gruppebrukere, ressurser, siden vi ikke plasserte IdentityServer4 som en egen node i et eget segment, men brukte det sammen med backend p\u00e5 den samme serveren som applikasjonens backend kj\u00f8rer.<\/p><\/blockquote>\n<p><\/p>\n<h2>Hvordan det skal fungere<\/h2>\n<p>\nS\u00e5, som jeg lovet - Magic Box. Vi forst\u00e5r allerede at vi garantert beveger oss mot Linux. La oss formulere konkrete oppgaver som krevde l\u00f8sning.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Puppet-manifester. <\/b>For \u00e5 levere og administrere konfigurasjonen av tjenesten og applikasjonen, m\u00e5tte vi skrive gode oppskrifter. En rull med blyant viser tydelig hvor raskt og kvalitetsmessig dette ble gjort.<\/p>\n<p><b>Leveringsmetode. <\/b>Standarden er RPM. Alle forst\u00e5r at man ikke kan klare seg uten det i Linux, men prosjektet etter byggingen besto av et sett med kj\u00f8rbare DLL-filer. Det var omtrent 150, prosjektet er ganske tungt. Den eneste harmoniske l\u00f8sningen er \u00e5 pakke denne bin\u00e6rfilen i RPM og deretter utvikle applikasjonen fra den.<\/p>\n<p><b>Versjonering. <\/b>Vi m\u00e5tte ofte publisere, og vi m\u00e5tte bestemme hvordan vi skulle lage pakkenavn. Dette er et sp\u00f8rsm\u00e5l p\u00e5 integrasjonsniv\u00e5 med TFS. Bygg-agenten v\u00e5r var p\u00e5 Linux. N\u00e5r TFS sender en oppgave til prosessoren - worker - p\u00e5 Bygg-agenten, sender den ogs\u00e5 en batch med variabler som g\u00e5r inn i milj\u00f8et til prosessoren. I disse milj\u00f8variablene sendes byggnavn, versjonsnavn og andre variabler. Mer om dette finner du i delen \u00abbygge RPM-pakken\u00bb.<\/p>\n<p><b>TFS-oppsett<\/b> bestod av oppsett av Pipeline. Tidligere bygde vi alle Windows-prosjekter p\u00e5 Windows-agenter, men n\u00e5 f\u00e5r vi en Linux-agent - Bygg-agenten, som m\u00e5 inkluderes i byggegruppen, berikes med noen artefakter, fortelle hvilket type prosjekter som skal bygges p\u00e5 denne Bygg-agenten, og p\u00e5 en eller annen m\u00e5te modifisere Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS er ikke v\u00e5r vei, vi st\u00e5r for Open Source.<\/p>\n<p>La oss se p\u00e5 komponentene.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nBest\u00e5r av fire deler.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Bygg-agent. <\/b>Linux, fordi vi pakker for det \u2013 logisk. Denne delen ble utf\u00f8rt i tre trinn.<\/p>\n<ul>\n<li><b>Sett opp workerne<\/b> og ikke \u00e9n, da det var planlagt distribuert arbeid med prosjektet.\n<\/li>\n<li><b>Installer .NET Core 1.x<\/b>. Hvorfor nettopp 1.x, n\u00e5r 2.0 er tilgjengelig i standardrepoet? Fordi, da vi begynte utviklingen, var stabil versjon 1.09, og prosjektet ble besluttet \u00e5 lages under det.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repositorium. <\/b>RPM-pakker m\u00e5tte oppbevares et sted. Det ble antatt at vi skulle bruke det samme bedrifts-RPM-repositoriet som er tilgjengelig for alle Linux-verter. Slik gikk vi frem. P\u00e5 repository-serveren er det satt opp <b>webhook<\/b> som lastet ned den n\u00f8dvendige RPM-pakken fra det angitte stedet. Versjonen av pakken ble rapportert til webhooken av Bygg-agenten.<\/p>\n<p><b>GitLab. <\/b>Merk! GitLab her brukes ikke av utviklerne, men av driftsavdelingen for versjonskontroll av applikasjonen, versjoner av pakker, overv\u00e5king av tilstanden til alle Linux-maskinene, og det lagrer oppskriften - alle Puppet-manifestene. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 l\u00f8ser alle kontroversielle saker og leverer n\u00f8yaktig den konfigurasjonen vi \u00f8nsker, fra Gitlab.<\/p>\n<p>La oss begynne \u00e5 dykke inn. Hvordan skjer leveransen av DLL til RPM?<\/p>\n<h3>Levering av DDL til RPM<\/h3>\n<p>\nLa oss si at vi har en rockestjerne i .NET-utvikling. Han bruker Visual Studio og oppretter en release-gren. Deretter laster han opp denne til Git, og Git her er en TFS-forekomst, det vil si det er applikasjonens repository som utvikleren jobber med.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEtter at TFS ser at en ny commit er kommet inn. Hvilket program? I TFS-innstillingene er det en etikett som viser hvilke ressurser hver Build-agent har. I dette tilfellet ser den at vi samler et .NET Core-prosjekt og velger Linux Build-agent fra poolen. <\/p>\n<p>Build-agenten henter kildene, laster ned n\u00f8dvendige <b>avhengigheter<\/b> fra .NET-repositoriet, npm osv., og etter byggingen av selve applikasjonen og den p\u00e5f\u00f8lgende pakking, sender den RPM-pakken til RPM-repositoriet.<\/p>\n<p>P\u00e5 den andre siden skjer f\u00f8lgende. En ingeni\u00f8r fra driftsavdelingen jobber direkte med utrullingen av prosjektet: endrer versioner av pakkene i\u00a0<b>Hiera<\/b> i repositoriet hvor oppskriften p\u00e5 applikasjonen lagres, hvoretter Puppet trigget <b>Yum<\/b>, henter den nye pakken fra repositoriet, og den nye versjonen av applikasjonen er klar til bruk.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 papiret er alt enkelt, men hva skjer inne i selve Build-agenten?<\/p>\n<h3>Pakkingen av DLL RPM<\/h3>\n<p>\nKildene til prosjektet og byggeoppgaven fra TFS er mottatt. Build-agenten <b>setter i gang byggingen av selve prosjektet fra kildene.<\/b>Det ferdige prosjektet er tilgjengelig i form av mange <b>DLL-filer<\/b>, som er pakket inn i en zip-arkiv for \u00e5 redusere belastningen p\u00e5 filsystemet.<\/p>\n<p>ZIP-arkivet blir plassert <b>i katalogen for byggingen av RPM-pakken.<\/b> Deretter initialiserer Bash-skriptet milj\u00f8variabler, finner versjonen av Build, versjonen av prosjektet, stien til byggkatalogen og starter RPM-build. N\u00e5r byggingen er ferdig, publiseres pakken i\u00a0<b>det lokale repositoriet<\/b>, som ligger p\u00e5 Build-agenten.<\/p>\n<p>Deretter sendes en JSON-foresp\u00f8rsel fra Build-agenten til serveren i RPM-repositoriet <b>med spesifisering av versjonsnavn og bygget. Webhook-en, som jeg nevnte tidligere, henter denne pakken fra det lokale repositoriet p\u00e5 Build-agenten og gj\u00f8r den nye byggingen tilgjengelig for installasjon.<\/b> Hvorfor er nettopp denne leveringsordningen for pakken til RPM-repositoriet? Hvorfor kan ikke den bygde pakken sendes direkte til repositoriet? Poenget er at dette er et vilk\u00e5r for \u00e5 sikre sikkerhet. Et slikt scenario begrenser muligheten for uautorisert opplasting av RPM-pakker av utenforst\u00e5ende til serveren, som er tilgjengelig for alle Linux-maskiner.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVersjonering av DB<\/p>\n<h2>P\u00e5 konsiliet med utviklingen ble det klart at guttene foretrakk MS SQL, men i de fleste non-Windows prosjektene brukte vi allerede PostgreSQL. Siden vi allerede hadde bestemt oss for \u00e5 avst\u00e5 fra alt betalt, begynte vi \u00e5 bruke PostgreSQL ogs\u00e5 her.<\/h2>\n<p>\nVed utviklingen ble det klart at gutta foretrakk MS SQL, men i de fleste non-Windows prosjektene hadde vi allerede tatt i bruk PostgreSQL. Siden vi hadde besluttet \u00e5 avst\u00e5 fra alt betalt, begynte vi ogs\u00e5 \u00e5 bruke PostgreSQL her.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI denne delen \u00f8nsker jeg \u00e5 fortelle hvordan vi implementerte versjonering av databasen og hvordan vi valgte mellom Flyway og Entity Framework Core. La oss se p\u00e5 deres fordeler og ulemper.<\/p>\n<h3>Ulemper<\/h3>\n<p>\nFlyway g\u00e5r kun i \u00e9n retning, vi\u00a0<b>kan ikke rulle tilbake<\/b>\u00a0\u2014 det er en betydelig ulempe. Vi kan sammenligne med Entity Framework Core ut fra andre kriterier \u2014 fra utviklerens bekvemmelighet. Dere husker at vi satte dette i fokus, og det viktigste kriteriet var \u00e5 ikke endre noe for Windows-utvikling.<\/p>\n<p>For Flyway trengte vi <b>en form for omslag<\/b>, slik at folket ikke m\u00e5tte skrive <b>SQL-sp\u00f8rsm\u00e5l<\/b>. De har mye mer erfaring med \u00e5 jobbe i objektrelaterte termer. Vi skrev instruksjoner for arbeid med databasenheter, SQL-sp\u00f8rsm\u00e5let ble dannet og utf\u00f8rt. Den nye databasen er klar, den har blitt kj\u00f8rt \u2014 alt er bra, alt fungerer.<\/p>\n<p>Entity Framework Core har en ulempe \u2014 ved h\u00f8y belastning\u00a0<b>bygger den suboptimale SQL-sp\u00f8rsm\u00e5l<\/b>, og databasen kan oppleve betydelig nedgang. Men siden vi ikke har en h\u00f8ybelastet tjeneste, vi teller ikke belastningen i hundrevis av RPS, vi tok disse risikoene og overlot problemet til fremtidige oss.<\/p>\n<h3>Fordeler<\/h3>\n<p>\nEntity Framework Core <b>fungerer ut av boksen og er praktisk for utvikling<\/b>, mens Flyway <b>enkelt integreres i eksisterende CI<\/b>. Men vi gj\u00f8r det for utviklerens bekvemmelighet :)<\/p>\n<h3>Rulleprosedyren<\/h3>\n<p>\nPuppet ser at det kommer en endring i versjonen av pakkene, deriblant den som h\u00e5ndterer migrasjonen. Den installerer f\u00f8rst pakken som inneholder migreringsskriptene og funksjonaliteten knyttet til databasen. Etter dette restartes applikasjonen som jobber med databasen. Deretter installeres de gjenv\u00e6rende komponentene. Rekkef\u00f8lgen for pakkens installasjon og oppstart av applikasjoner er beskrevet i Puppet-manifestet.<\/p>\n<p>Applikasjoner bruker sensitive data, som tokens og passord til databasen, dette hentes inn i konfigurasjonen fra Puppet master, der de lagres i kryptert form.<\/p>\n<h2>TFS-problemer<\/h2>\n<p>\nEtter at vi hadde bestemt oss og forstod at alt faktisk fungerte, tok jeg en titt p\u00e5 hva som foregikk med byggene i TFS generelt for Win-utviklingsavdelingen p\u00e5 andre prosjekter \u2014 om vi bygger\/releaser raskt eller ikke, og oppdaget betydelige problemer med hastigheten.<\/p>\n<p>Et av de viktigste prosjektene bygges p\u00e5 12-15 minutter \u2014 det er lenge, slik kan vi ikke ha det. Rask analyse viste en fryktelig nedgang i I\/O, og det p\u00e5 massive.<\/p>\n<p>Ved \u00e5 analysere komponent for komponent, identifiserte jeg tre brennpunkter. Det f\u00f8rste \u2014 <b>\u00abKaspersky antivirus\u00bb<\/b>, som skanner kildekoden p\u00e5 alle Windows build-agenter. Den andre \u2013 <b>Windows<\/b> <b>Indexer.<\/b> Den ble ikke deaktivert, og p\u00e5 build-agentene indekserte alt i sanntid under distribusjonsprosessen. <\/p>\n<p>Den tredje \u2013 <b>Npm install. <\/b>Det viste seg at vi i de fleste Pipelines brukte akkurat dette skriptet. Hva er galt med det? Prosedyren Npm install kj\u00f8res n\u00e5r avhengighetstreet genereres i\u00a0<b>package-lock.json<\/b>, hvor versjoner av pakkene som skal brukes til bygging av prosjektet, registreres. Ulempen er at Npm install henter de nyeste versjonene av pakkene fra internett hver gang, og det tar tid i tilfelle av et stort prosjekt.<\/p>\n<blockquote><p>Utviklere eksperimenterer noen ganger p\u00e5 den lokale maskinen for \u00e5 sjekke om en del av prosjektet eller hele prosjektet fungerer. Noen ganger ble resultatene gode lokalt, men under bygging og implementering \u2013 fungerte ingenting. Vi begynte \u00e5 unders\u00f8ke hva problemet var \u2013 aha, forskjellige versjoner av pakkene med avhengigheter.<\/p><\/blockquote>\n<p><\/p>\n<h3>Solution<\/h3>\n<p><\/p>\n<ul>\n<li>Kildene i unntakene AV.\n<\/li>\n<li>Deaktivering av indeksering.\n<\/li>\n<li>Overgang til\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nFordelene med npm ci er at vi\u00a0<b>bygger avhengighetstreet en gang<\/b>, og f\u00e5r muligheten til \u00e5 gi utvikleren <b>en oppdatert liste over pakker<\/b>, som han kan eksperimentere med s\u00e5 mye han vil lokalt. Dette <b>sparker tid<\/b> for utviklerne som skriver kode.<\/p>\n<h3>Konfigurasjon<\/h3>\n<p>\nN\u00e5 litt om konfigurasjonen av depotet. Historisk sett har vi brukt <b>Nexus<\/b> for \u00e5 administrere repositories, inkludert <b>Internal REPO<\/b>. I dette interne depotet leveres alle komponentene vi bruker til interne form\u00e5l, for eksempel egne overv\u00e5kingsl\u00f8sninger.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core p\u00e5 Linux, DevOps p\u00e5 hest\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi bruker ogs\u00e5 <b>NuGet<\/b>, da det cacher bedre sammenlignet med andre pakkebehandlere.<\/p>\n<h3>Resultatet<\/h3>\n<p>\nEtter at vi optimaliserte build-agentene, reduserte gjennomsnittlig byggingstid fra 12 minutter til 7.<\/p>\n<blockquote><p>Hvis vi regner med alle maskinene vi kunne ha brukt for Windows, men som ble overf\u00f8rt til Linux i dette prosjektet, har vi spart rundt $10 000. Og dette er bare for lisensene, og hvis vi tar hensyn til vedlikehold \u2013 mer.<\/p><\/blockquote>\n<p><\/p>\n<h2>Planer<\/h2>\n<p>\nFor neste kvartal har vi planlagt arbeid med optimalisering av kodelevering.<\/p>\n<p><b>Overgang til prebuild Docker-image<\/b>. TFS er en flott greie med mange plugins som lar deg integrere i Pipeline, inkludert bygging p\u00e5 trigger, for eksempel av Docker-image. Den triggeren vil vi lage p\u00e5 det samme <b>package-lock.json<\/b>. Hvis komponentene som brukes til \u00e5 bygge prosjektet p\u00e5 en eller annen m\u00e5te endres, blir det bygget et nytt Docker-bilde. Dette brukes deretter til \u00e5 sikre en container med den bygde applikasjonen. Dette er ikke tilfelle n\u00e5, men vi planlegger \u00e5 g\u00e5 over til en mikrotjenestearkitektur i Kubernetes, som aktivt utvikles i v\u00e5rt selskap og lenge har st\u00f8ttet produksjonsl\u00f8sninger.<\/p>\n<h2>Sammendrag<\/h2>\n<p>\nJeg oppfordrer alle til \u00e5 kaste Windows, men ikke fordi jeg ikke kan bruke den. \u00c5rsaken er at en stor del av Open Source-l\u00f8sningene er <b>Linux-stabel<\/b>. Du <b>vil spare mye p\u00e5 ressursene<\/b>. Etter min mening er fremtiden med l\u00f8sninger p\u00e5 Open Source p\u00e5 Linux med et sterkt fellesskap.<\/p>\n<p><i>Profilen til taleren Alexander Sinchikov <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">p\u00e5 GitHub<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0er en konferanse om integrering av utvikling, testing og drift for profesjonelle av profesjonelle. Det er derfor prosjektet Alexander snakket om, er realisert og fungerer, og p\u00e5 dagen for presentasjonen ble det gjennomf\u00f8rt to vellykkede lanseringer. P\u00e5\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf p\u00e5 RIT++<\/a><\/noindex> 27. og 28. mai vil det v\u00e6re enda flere slike caser fra praktikere. Det er fortsatt mulig \u00e5 hoppe p\u00e5 den siste vognen og <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">gi en presentasjon<\/a><\/noindex> eller ta deg tid til \u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">reservere<\/a><\/noindex> billetter. Vi sees i Skolkovo!<\/p><\/blockquote>\n<p>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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 p\u00e5 Linux, DevOps i vinden | ProHoster","description":"Vi utviklet DevOps s\u00e5 godt vi kunne. Vi var 8 personer, og Vasya var den beste p\u00e5 Windows. Plutselig dro Vasya, og jeg fikk oppgaven med \u00e5 lansere et nytt prosjekt som leverer Windows-utvikling.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}