{"id":76769,"date":"2020-04-04T13:42:27","date_gmt":"2020-04-04T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet"},"modified":"2020-04-04T13:42:27","modified_gmt":"2020-04-04T11:42:27","slug":"content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","title":{"rendered":"Content-based tagging i byggverktyget werf: varf\u00f6r och hur fungerar det?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Content-based tagging i byggverktyget werf: varf\u00f6r och hur fungerar det?\" src=\"\/wp-content\/uploads\/2020\/04\/494346bbee96cc2b6c838491ba1c67fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/\">werf<\/a><\/noindex> \u2014 v\u00e5r GitOps CLI-verktyg med \u00f6ppen k\u00e4llkod f\u00f6r att bygga och leverera applikationer till Kubernetes. I <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">version v1.1<\/a><\/noindex> introducerades en ny funktion i bildsamlaren: taggning av bilder baserat p\u00e5 inneh\u00e5ll eller <i>content-based tagging<\/i>. Hitintills har den typiska taggningsschemat i werf inneburit att Docker-bilder taggas efter Git-taggar, Git-grenar eller Git-commits. Men alla dessa scheman har nackdelar som helt l\u00f6ser sig med den nya taggningsstrategin. Mer information om den och varf\u00f6r den \u00e4r s\u00e5 bra g\u00e5r att l\u00e4sa nedan.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Utrullning av en upps\u00e4ttning mikrotj\u00e4nster fr\u00e5n ett Git-repository<\/h2>\n<p>\nDet \u00e4r vanligt att en applikation \u00e4r uppdelad i flera mer eller mindre oberoende tj\u00e4nster. Utrullningar av dessa tj\u00e4nster kan ske oberoende: vid ett tillf\u00e4lle kan en eller flera tj\u00e4nster rullas ut, medan de andra forts\u00e4tter att fungera utan n\u00e5gra f\u00f6r\u00e4ndringar. Men sett ur ett kodos och projektledningsperspektiv \u00e4r det mer praktiskt att h\u00e5lla s\u00e5dana tj\u00e4nster i ett gemensamt repository.<\/p>\n<p>Det finns situationer d\u00e4r tj\u00e4nsterna faktiskt \u00e4r oberoende och inte relaterade till en gemensam applikation. I s\u00e5dana fall kommer de att finnas i separata projekt och deras utrullning kommer att ske via separata CI\/CD-processer i vart och ett av projekten.<\/p>\n<p>Men i verkligheten delar utvecklare ofta en enskild applikation i flera mikrotj\u00e4nster, men att starta ett separat repository och projekt f\u00f6r varje \u2026 \u00e4r uppenbart \u00f6verdrivet. Precis om denna situation kommer vi att diskutera h\u00e4r: flera s\u00e5dana mikrotj\u00e4nster finns i ett gemensamt projektrepository och utrullningar genomf\u00f6rs via en gemensam process i CI\/CD.<\/p>\n<h3>Taggning efter Git-gren och Git-tag<\/h3>\n<p>\nAnta att den mest anv\u00e4nda taggningsstrategin \u2014 <i>tag-or-branch<\/i>. F\u00f6r Git-grenar taggas bilderna med grenens namn, f\u00f6r en gren existerar det endast en publicerad bild med namnet f\u00f6r den grenen vid en given tidpunkt. F\u00f6r Git-taggar taggas bilderna motsvarande taggens namn.<\/p>\n<p>N\u00e4r en ny Git-tag skapas \u2014 till exempel vid lansering av en ny version \u2014 kommer en ny Docker-tag att skapas f\u00f6r alla bilder i projektet i Docker Registry:<\/p>\n<ul>\n<li> <code>myregistry.org\/myproject\/frontend:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice1:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice2:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice3:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice4:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice5:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/database:v1.1.10<\/code><\/li>\n<\/ul>\n<p>\nDessa nya bildnamn kommer in i Kubernetes-konfigurationen via Helm-mallar. Vid drifts\u00e4ttning av kommandot <code>werf deploy<\/code> uppdateras f\u00e4ltet <code>bild<\/code> i manifesten f\u00f6r Kubernetes-resurser och de ber\u00f6rda resurserna startas om p\u00e5 grund av den \u00e4ndrade bildens namn.<\/p>\n<p><b>Problemet<\/b>: om inneh\u00e5llet i bilden faktiskt inte har \u00e4ndrats sedan den senaste versionen (Git-taggen) utan bara dess Docker-tag, sker <i>en on\u00f6dig<\/i> omstart av denna applikation och d\u00e4rf\u00f6r kan det uppst\u00e5 viss nedtid. \u00c4ven om det inte fanns n\u00e5gra verkliga sk\u00e4l att genomf\u00f6ra denna omstart.<\/p>\n<p>Som en f\u00f6ljd av detta, med nuvarande taggningsschema, m\u00e5ste man skapa flera separata Git-repositorier, vilket leder till problem med organiseringen av drifts\u00e4ttningen av dessa flera repositorier. Sammanfattningsvis blir ett s\u00e5dant schema \u00f6verbelastat och komplicerat. Det \u00e4r b\u00e4ttre att sammanf\u00f6ra m\u00e5nga tj\u00e4nster i ett enda repository och skapa s\u00e5dana Docker-taggar s\u00e5 att det inte blir n\u00e5gra on\u00f6diga omstarter.<\/p>\n<h3>Taggning baserat p\u00e5 Git-commit<\/h3>\n<p>\nI werf finns ocks\u00e5 en taggningsstrategi kopplad till Git-commits.<\/p>\n<p>Git-commit \u00e4r en identifierare f\u00f6r inneh\u00e5llet i Git-repositoriet och beror p\u00e5 historiken av fil\u00e4ndringar i Git-repositoriet, s\u00e5 det verkar logiskt att anv\u00e4nda den f\u00f6r att tagga bilder i Docker Registry.<\/p>\n<p>Men taggning baserat p\u00e5 Git-commit har samma nackdelar som vid taggning baserat p\u00e5 Git-grenar eller Git-taggar:<\/p>\n<ul>\n<li> Det kan ha skapats en tom commit som inte \u00e4ndrar n\u00e5gra filer, men Docker-taggen f\u00f6r bilden kommer att \u00e4ndras.<\/li>\n<li> Det kan ha skapats en merge-commit som inte \u00e4ndrar n\u00e5gra filer, men Docker-taggen f\u00f6r bilden kommer att \u00e4ndras.<\/li>\n<li> Det kan ha skapats en commit som \u00e4ndrar de filer i Git som inte importeras i bilden, och Docker-taggen f\u00f6r bilden kommer \u00e5terigen att \u00e4ndras.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Taggning baserat p\u00e5 namnet p\u00e5 Git-grenen \u00e5terspeglar inte versionen av bilden.<\/h2>\n<p>\nDet finns ocks\u00e5 ett annat problem kopplat till taggningsstrategin baserat p\u00e5 Git-grenar.<\/p>\n<p>Taggning baserat p\u00e5 namn p\u00e5 grenen fungerar s\u00e5 l\u00e4nge som commits f\u00f6r denna gren samlas in sekventiellt i kronologisk ordning.<\/p>\n<p>Om en anv\u00e4ndare i det nuvarande schemat startar ombyggnaden av en gammal commit kopplad till en viss gren, kommer werf att skriva \u00f6ver bilden med den nya versionen av Docker-taggen f\u00f6r den gamla committen. De deployment som anv\u00e4nder denna tagg riskerar att under omstarten av poddar h\u00e4mta en annan version av bilden, vilket resulterar i att v\u00e5r applikation f\u00f6rlorar kopplingen till CI-systemet och blir osynkroniserad.<\/p>\n<p>Dessutom, vid sekventiella pushar till en gren med kort tid emellan, kan en gammal commit samlas in senare \u00e4n en nyare: den gamla versionen av bilden kan skriva \u00f6ver den nya med Git-grenens tagg. S\u00e5dana problem kan hanteras av en CI\/CD-system (till exempel, i GitLab CI, initieras en pipeline f\u00f6r den senaste commitserien). Men det st\u00f6ds inte av alla system och det m\u00e5ste finnas en mer p\u00e5litlig metod f\u00f6r att f\u00f6rhindra ett s\u00e5 grundl\u00e4ggande problem.<\/p>\n<h2>Vad \u00e4r content-based tagging?<\/h2>\n<p>\nS\u00e5 vad \u00e4r content-based tagging \u2014 taggning av bilder baserat p\u00e5 inneh\u00e5llet.<\/p>\n<p>F\u00f6r att skapa Docker-taggar anv\u00e4nds inte primitiva Git-typer (Git-gren, Git-tagg\u2026), utan en kontrollsumma kopplad till:<\/p>\n<ul>\n<li> <i>inneh\u00e5llet i bilden<\/i>. Identifierare-taggen f\u00f6r bilden speglar dess inneh\u00e5ll. Vid skapandet av en ny version kommer denna identifierare inte att \u00e4ndras om filerna i bilden inte har \u00e4ndrats;<\/li>\n<li> <i>historiken f\u00f6r skapandet av denna bild i Git<\/i>. Bilder kopplade till olika Git-grenar och olika bygghistorik via werf kommer att ha olika identifierartaggar.<\/li>\n<\/ul>\n<p>\nSom en s\u00e5dan identifierartagg fungerar s\u00e5 kallad <b>stages signature<\/b>.<\/p>\n<p>Varje bild best\u00e5r av en upps\u00e4ttning steg: <code>fr\u00e5n<\/code>, <code>before-install<\/code>, <code>git-archive<\/code>, <code>install<\/code>, <code>imports-after-install<\/code>, <code>before-setup<\/code>,\u2026 <code>git-latest-patch<\/code> etc. Varje steg har en identifierare som speglar dess inneh\u00e5ll, \u2014 <b>stegsignatur<\/b> <i>(stages signature)<\/i>.<\/p>\n<p>Den slutliga bilden, som best\u00e5r av dessa steg, taggas med den s\u00e5 kallade signaturen f\u00f6r upps\u00e4ttningen av dessa steg \u2014 <b>stages signature<\/b>, \u2014 som \u00e4r en sammanfattning f\u00f6r alla steg av bilden.<\/p>\n<p>Varje bild fr\u00e5n konfigurationen <code>werf.yaml<\/code> kommer i allm\u00e4nhet att ha sin egen s\u00e5dan signatur och d\u00e4rmed en Docker-tagg.<\/p>\n<p>Stegsignaturen l\u00f6ser alla n\u00e4mnda problem:<\/p>\n<ul>\n<li> Den \u00e4r motst\u00e5ndskraftig mot tomma Git-commits.<\/li>\n<li> Den \u00e4r motst\u00e5ndskraftig mot Git-commits som \u00e4ndrar filer som inte \u00e4r relevanta f\u00f6r bilden.<\/li>\n<li> Den leder inte till problemet med att skriva \u00f6ver den aktuella versionen av bilden n\u00e4r byggen f\u00f6r gamla Git-commits i grenen startas om.<\/li>\n<\/ul>\n<p>\nDetta \u00e4r nu den rekommenderade taggningsstrategin och anv\u00e4nds som standard i werf f\u00f6r alla CI-system.<\/p>\n<h2>Hur man aktiverar och anv\u00e4nder i werf<\/h2>\n<p>\nDen relevanta alternativet introducerades av kommandot <code>werf publish<\/code>: <code>--tag-by-stages-signature=true|false<\/code><\/p>\n<p>I CI-systemet anges taggningsstrategin av kommandot <code>werf ci-env<\/code>. Tidigare definierades en parameter f\u00f6r den <code>werf ci-env --tagging-strategy=tag-or-branch<\/code>. Nu, om denna option anges <code>werf ci-env --tagging-strategy=stages-signature<\/code> eller inte anges, kommer werf som standard att anv\u00e4nda taggningsstrategin <code>stages-signature<\/code>. Kommandot <code>werf ci-env<\/code> automatiskt st\u00e4lla in r\u00e4tt flaggor f\u00f6r kommandot <code>werf build-and-publish<\/code> (eller <code>werf publish<\/code>), s\u00e5 inga ytterligare alternativ f\u00f6r dessa kommandon beh\u00f6ver anges.<\/p>\n<p>Till exempel kommandot:<\/p>\n<pre><code class=\"plaintext\">werf publish --stages-storage :local --images-repo registry.hello.com\/web\/core\/system --tag-by-stages-signature<\/code><\/pre>\n<p>\n\u2026 kan skapa f\u00f6ljande bilder:<\/p>\n<ul>\n<li> <code>registry.hello.com\/web\/core\/system\/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code><\/li>\n<li> <code>registry.hello.com\/web\/core\/system\/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code><\/li>\n<\/ul>\n<p>\nH\u00e4r <code>4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code> \u2014 \u00e4r bildens stadie-signatur <code>backend<\/code>, och <code>f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code> \u2014 stadie-signatur <code>front-end<\/code>.<\/p>\n<p>N\u00e4r du anv\u00e4nder speciella funktioner <code>werf_container_image<\/code> och <code>werf_container_env<\/code> beh\u00f6ver inget \u00e4ndras i Helm-mallar: dessa funktioner kommer automatiskt att generera korrekta bildnamn.<\/p>\n<p>Exempelkonfiguration i CI-system:<\/p>\n<pre><code class=\"plaintext\">type multiwerf &amp;&amp; source &lt;(multiwerf use 1.1 beta)\ntype werf &amp;&amp; source &lt;(werf ci-env gitlab)\nwerf build-and-publish|deploy<\/code><\/pre>\n<p>\nMer information om konfiguration finns i dokumentationen:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/reference\/publish_process.html#%D1%82%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2-%D0%BF%D0%BE-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC%D1%83\">Handbok \u2192 Publikation (publish)<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/reference\/plugging_into_cicd\/overview.html#stages-signature\">Arbete med CI\/CD \u2192 Allm\u00e4n information \u2192 stages-signature<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/guides\/gitlab_ci_cd_integration.html#gitlab-ciyml\">Integration med GitLab CI\/CD \u2192 .gitlab-ci.yml<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Sammanfattningsvis<\/h2>\n<p><\/p>\n<ul>\n<li> Det nya alternativet <code>werf publish --tag-by-stages-signature=true|false<\/code>.<\/li>\n<li> Nytt v\u00e4rde f\u00f6r alternativet <code>werf ci-env --tagging-strategy=stages-signature|tag-or-branch<\/code> (om inget anges, s\u00e5 \u00e4r standard <code>stages-signature<\/code>).<\/li>\n<li> Om alternativ f\u00f6r taggning efter Git-commits har anv\u00e4nts innan (<code>WERF_TAG_GIT_COMMIT<\/code> eller alternativet <code>werf publish --tag-git-commit COMMIT<\/code>), m\u00e5ste du byta till taggningsstrategin <i>stages-signature<\/i>.<\/li>\n<li> Nya projekt b\u00f6r direkt byta till det nya taggningsschemat.<\/li>\n<li> Gamla projekt b\u00f6r vid \u00f6verg\u00e5ng till werf 1.1 helst byta till det nya taggningsschemat, men det gamla <i>tag-or-branch<\/i> st\u00f6ds fortfarande.<\/li>\n<\/ul>\n<p>\nInneh\u00e5llsbaserad taggning l\u00f6ser alla problem som belyses i artikeln:<\/p>\n<ul>\n<li> Motst\u00e5ndskraften hos Docker-taggnamn mot tomma Git-commits.<\/li>\n<li> Motst\u00e5ndskraften hos Docker-taggnamn mot Git-commits som f\u00f6r\u00e4ndrar irrelevanta filer f\u00f6r bilden.<\/li>\n<li> Orsakar inte problem med att skriva \u00f6ver den aktuella versionen av bilden vid omstart av byggen f\u00f6r gamla Git-commits f\u00f6r Git-grenar.<\/li>\n<\/ul>\n<p>\nAnv\u00e4nd och gl\u00f6m inte att kolla in oss p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">GitHub<\/a><\/noindex>, f\u00f6r att skapa ett issue eller hitta ett som redan finns, ge ett plus, skapa en PR eller bara f\u00f6lja projektets utveckling.<\/p>\n<h2>P.S.<\/h2>\n<p>\nL\u00e4s \u00e4ven i v\u00e5r blogg:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Utg\u00e5van av werf 1.1: f\u00f6rb\u00e4ttringar i byggverktyget idag och planer f\u00f6r framtiden<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/481306\/\">Vi presenterar werf 1.0 stabil: vad har GitOps med detta att g\u00f6ra, status och planer<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 v\u00e5rt verktyg f\u00f6r CI\/CD i Kubernetes (\u00f6versikt och videof\u00f6rel\u00e4sning)<\/a><\/noindex>\u00bb;<\/li>\n<li> Noteringar om nyheter i werf:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-v\u00e4gs sammanslagning i werf: distribution i Kubernetes med Helm \"p\u00e5 steroider\"<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">Anv\u00e4ndningen av werf f\u00f6r distribution av komplexa Helm-diagram<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">St\u00f6d f\u00f6r monorepo och multirepo i werf och vad Docker Registry har med det att g\u00f6ra<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Att samla Docker-bilder i werf \u00e4r nu ocks\u00e5 m\u00f6jligt med en vanlig Dockerfile<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>werf \u2014 \u043d\u0430\u0448\u0430 GitOps CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.1 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432: \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 content-based tagging. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 werf \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e Git-\u0442\u0435\u0433\u0443, Git-\u0432\u0435\u0442\u043a\u0435 \u0438\u043b\u0438 Git-\u043a\u043e\u043c\u043c\u0438\u0442\u0443. \u041d\u043e \u0443 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u0445\u0435\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":76770,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-76769","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=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\udd47Content-based tagging \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 werf: \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-04T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-04T11:42:27+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\udd47Inneh\u00e5llsbaserad taggning i werf-samlaren: varf\u00f6r och hur fungerar det? | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\udd47Content-based tagging \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 werf: \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-04T11:42:27+00:00","article:modified_time":"2020-04-04T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"76769","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:30:22","updated":"2022-09-28 05:59:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/76769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=76769"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/76769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/76770"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=76769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=76769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=76769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}