{"id":37667,"date":"2019-10-31T22:18:58","date_gmt":"2019-10-31T19:18:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\/"},"modified":"2019-10-31T22:18:58","modified_gmt":"2019-10-31T19:18:58","slug":"podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry.\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO tema do monoreposit\u00f3rio j\u00e1 foi discutido diversas vezes e, geralmente, provoca debates bastante acalorados. Ao criar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> uma ferramenta de c\u00f3digo aberto, destinada a melhorar os processos de constru\u00e7\u00e3o de c\u00f3digo de aplica\u00e7\u00f5es do Git em imagens Docker (e sua posterior entrega no Kubernetes), raramente refletimos sobre qual escolha \u00e9 melhor. Para n\u00f3s, o primordial \u00e9 garantir tudo que \u00e9 necess\u00e1rio para os defensores de diferentes opini\u00f5es (se isso n\u00e3o contradizer o bom senso, \u00e9 claro).<\/p>\n<p>O apoio recente ao mono-repo no werf \u00e9 um bom exemplo disso. Mas, antes de tudo, vamos entender como esse suporte se relaciona ao uso do werf e qual a conex\u00e3o com o Docker Registry...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problemas<\/h2>\n<p>\nVamos imaginar a seguinte situa\u00e7\u00e3o. A empresa possui v\u00e1rias equipes de desenvolvedores trabalhando em projetos independentes. A maioria das aplica\u00e7\u00f5es opera no Kubernetes, e, consequentemente, est\u00e1 conteinerizada. Para armazenar cont\u00eaineres e imagens, \u00e9 necess\u00e1rio um registro (registry). A empresa utiliza o Docker Hub com uma \u00fanica conta <code>COMPANY<\/code>. Por analogia com a maioria dos sistemas de armazenamento de c\u00f3digo fonte, <b>o Docker Hub n\u00e3o permite criar uma hierarquia de reposit\u00f3rios aninhados<\/b>, como <code>COMPANY\/PROJECT\/IMAGE<\/code>. Nesse caso... como armazenar no registro aplica\u00e7\u00f5es n\u00e3o monol\u00edticas sem criar uma conta separada para cada projeto? <\/p>\n<p><img decoding=\"async\" alt=\"Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry.\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTalvez a situa\u00e7\u00e3o descrita seja familiar para alguns, mas vamos considerar a quest\u00e3o da organiza\u00e7\u00e3o do armazenamento de aplica\u00e7\u00f5es de forma geral, ou seja, sem amarras ao exemplo mencionado acima e ao Docker Hub.<\/p>\n<h3>Solu\u00e7\u00f5es<\/h3>\n<p>\nSe a aplica\u00e7\u00e3o <b>for monol\u00edtica<\/b>, n\u00e3o h\u00e1 problemas e simplesmente armazenamos as imagens no registro de cont\u00eaineres do projeto.<\/p>\n<p>Quando a aplica\u00e7\u00e3o \u00e9 apresentada na forma de v\u00e1rios componentes, <b>microsservi\u00e7os<\/b>, \u00e9 necess\u00e1rio escolher um determinado enfoque. Tomando como exemplo uma aplica\u00e7\u00e3o web t\u00edpica, composta por duas imagens: <code>frontend<\/code> e <code>backend<\/code> \u2014 as op\u00e7\u00f5es poss\u00edveis s\u00e3o:<\/p>\n<ol>\n<li> Armazenar as imagens em reposit\u00f3rios aninhados separados:\n<p><img decoding=\"async\" alt=\"Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry.\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Armazenar tudo em um \u00fanico reposit\u00f3rio, considerando o nome da imagem no tag, por exemplo, da seguinte forma:\n<p><img decoding=\"async\" alt=\"Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry.\" src=\"\/wp-content\/uploads\/2019\/09\/83498b5bcdf7a57dfe933295e78fc785.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<i><b>NB<\/b>: Na verdade, h\u00e1 tamb\u00e9m a op\u00e7\u00e3o de armazenamento em diferentes reposit\u00f3rios, <code>PROJECT-frontend<\/code> e <code>PROJECT-backend<\/code>, mas n\u00e3o iremos considerar isso devido \u00e0 complexidade de suporte, organiza\u00e7\u00e3o e distribui\u00e7\u00e3o de direitos entre os usu\u00e1rios.<\/i><\/p>\n<h2>Suporte no werf<\/h2>\n<p>\nInicialmente, o werf limitou-se a reposit\u00f3rios aninhados \u2014 felizmente, a maioria dos registros suporta essa possibilidade. A partir da vers\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, foi adicionada a possibilidade de trabalhar com registros que <b>n\u00e3o suportam aninhamento<\/b>, incluindo o Docker Hub. A partir de agora, o usu\u00e1rio teve a op\u00e7\u00e3o de como armazenar as imagens da aplica\u00e7\u00e3o.<\/p>\n<p>A implementa\u00e7\u00e3o est\u00e1 dispon\u00edvel na op\u00e7\u00e3o <code>--images-repo-mode=multirepo|monorepo<\/code> (por padr\u00e3o, <code>multirepo<\/code>, ou seja, armazenamento em reposit\u00f3rios aninhados). Ela determina os padr\u00f5es de como as imagens s\u00e3o armazenadas no registro. \u00c9 suficiente escolher o modo desejado ao usar os comandos principais, e tudo o mais permanecer\u00e1 inalterado.<\/p>\n<p>Como a maioria das op\u00e7\u00f5es do werf pode ser definida por <b>vari\u00e1veis de ambiente<\/b>, em sistemas CI\/CD, o modo de armazenamento geralmente \u00e9 f\u00e1cil de definir globalmente para todo o projeto. Por exemplo, <b>no caso do GitLab,<\/b> basta adicionar uma vari\u00e1vel de ambiente nas configura\u00e7\u00f5es do projeto: <i>Configura\u00e7\u00f5es -&gt; CI \/ CD -&gt; Vari\u00e1veis: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>Falando sobre a publica\u00e7\u00e3o de imagens e o lan\u00e7amento de aplica\u00e7\u00f5es (sobre esses processos, pode-se ler em detalhes nos artigos correspondentes da documenta\u00e7\u00e3o: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Processo de Publica\u00e7\u00e3o<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Processo de Implanta\u00e7\u00e3o<\/a><\/noindex>), o modo define exclusivamente o padr\u00e3o de como trabalhar com a imagem.<\/p>\n<h3>O diabo est\u00e1 nos detalhes.<\/h3>\n<p>\nA diferen\u00e7a e a principal dificuldade ao adicionar uma nova forma de armazenamento s\u00e3o o processo de limpeza do registro <i>(as capacidades de limpeza suportadas no werf est\u00e3o na <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Processo de Limpeza<\/a><\/noindex>)<\/i>.<\/p>\n<p>Ao limpar, o werf considera as imagens usadas nos clusters Kubernetes, bem como as pol\u00edticas configuradas pelo usu\u00e1rio. A base das pol\u00edticas \u00e9 a divis\u00e3o de tags em estrat\u00e9gias. As estrat\u00e9gias atualmente suportadas s\u00e3o:<\/p>\n<ol>\n<li> 3 estrat\u00e9gias relacionadas a primitivas do Git, como tag, ramo e commit;<\/li>\n<li> 1 estrat\u00e9gia para tags personalizadas arbitr\u00e1rias.<\/li>\n<\/ol>\n<p>\nAs informa\u00e7\u00f5es sobre a estrat\u00e9gia de tag s\u00e3o armazenadas ao publicar a imagem nos r\u00f3tulos da imagem final. O pr\u00f3prio valor \u2014 o chamado <b>metatag<\/b> \u2014 \u00e9 necess\u00e1rio para a aplica\u00e7\u00e3o de algumas pol\u00edticas. Por exemplo, ao excluir um ramo ou uma tag do reposit\u00f3rio Git, \u00e9 l\u00f3gico remover tamb\u00e9m as <i>imagens n\u00e3o utilizadas<\/i> do registro, o que \u00e9 coberto por uma parte de nossas pol\u00edticas.<\/p>\n<p>Ao armazenar em um \u00fanico reposit\u00f3rio (<code>monorepo<\/code>), na tag da imagem, al\u00e9m do metatag, tamb\u00e9m pode ser armazenado o nome da imagem: <code>PROJETO:<b>frontend<\/b>-META-TAG<\/code>. Para separ\u00e1-los, n\u00e3o introduzimos um delimitador espec\u00edfico, mas apenas adicionamos o valor necess\u00e1rio ao r\u00f3tulo da imagem final ao public\u00e1-la.<\/p>\n<p><i><b>NB<\/b>: Se estiver interessado em ver tudo que foi descrito no c\u00f3digo-fonte do werf, um ponto de partida pode ser <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>Neste artigo, n\u00e3o vamos nos aprofundar mais nos problemas e na justificativa da nossa abordagem: sobre estrat\u00e9gias de tagueamento, armazenamento de dados em r\u00f3tulos e o processo de publica\u00e7\u00e3o em geral \u2014 tudo isso foi descrito em detalhes no recente relat\u00f3rio de Dmitry Stolyarov: \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nossa ferramenta para CI\/CD no Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>Resumindo<\/h2>\n<p>\nA falta de suporte para registros sem aninhamento n\u00e3o foi um fator bloqueador para n\u00f3s ou para os usu\u00e1rios conhecidos do werf \u2014 sempre \u00e9 poss\u00edvel levantar um registro separado de imagens (ou mudar para um Container Registry no Google Cloud)\u2026 No entanto, a remo\u00e7\u00e3o dessa limita\u00e7\u00e3o parecia l\u00f3gica para que a ferramenta fosse mais conveniente para uma comunidade DevOps mais ampla. Ao implement\u00e1-la, encontramos a principal dificuldade na reestrutura\u00e7\u00e3o do mecanismo de limpeza do registro de cont\u00eaineres. Agora, com tudo pronto, \u00e9 gratificante saber que facilitou a vida de algu\u00e9m, e para n\u00f3s (como principais desenvolvedores do projeto) n\u00e3o prevemos grandes dificuldades na manuten\u00e7\u00e3o futura dessa funcionalidade.<\/p>\n<p>Fique conosco e em breve contaremos sobre outras inova\u00e7\u00f5es em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nConfira tamb\u00e9m em nosso blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Agora \u00e9 poss\u00edvel construir imagens Docker no werf tamb\u00e9m usando um Dockerfile comum<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nossa ferramenta para CI\/CD no Kubernetes (vis\u00e3o geral e v\u00eddeo da apresenta\u00e7\u00e3o)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0437 \u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043f\u043e\u0440\u044b. \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f werf \u043a\u0430\u043a Open Source-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 Git \u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u044b (\u0438 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes), \u043c\u044b \u043c\u0430\u043b\u043e \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u043c \u043d\u0430 \u0442\u0435\u043c\u0443 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043b\u0443\u0447\u0448\u0435. \u0414\u043b\u044f \u043d\u0430\u0441 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28270,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37667","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.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\" \/>\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\/pt\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 monorepo \u0438 multirepo \u0432 werf \u0438 \u043f\u0440\u0438 \u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c Docker Registry | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\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-31T19:18:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:58+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\udd47Suporte a monorepo e multirepo no werf e qual a rela\u00e7\u00e3o com o Docker Registry | ProHoster","description":"O tema do monoreposit\u00f3rio.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 monorepo \u0438 multirepo \u0432 werf \u0438 \u043f\u0440\u0438 \u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c Docker Registry | ProHoster","og:description":"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","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-31T19:18:58+00:00","article:modified_time":"2019-10-31T19:18:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37667","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-23 18:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:22:29","updated":"2026-01-23 18:48:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}