{"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\/ro\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTema monorepo-ului a fost discutat\u0103 de mai multe ori \u0219i, de regul\u0103, st\u00e2rne\u0219te dispute foarte active. C\u00e2nd cre\u0103m <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> un instrument Open Source destinat \u00eembun\u0103t\u0103\u021birii proceselor de construire a codului aplica\u021biilor din Git \u00een imagini Docker (\u0219i livrarea lor ulterioar\u0103 \u00een Kubernetes), rareori ne g\u00e2ndim la alegerea optim\u0103. Pentru noi, este esen\u021bial s\u0103 asigur\u0103m tot ce este necesar sus\u021bin\u0103torilor diferitelor opinii (dac\u0103 nu contravine bunului sim\u021b, desigur).<\/p>\n<p>Sprijinul recent ap\u0103rut pentru mono-repo \u00een werf este un bun exemplu \u00een acest sens. Dar, mai \u00eent\u00e2i, s\u0103 analiz\u0103m cum este legat acest sprijin de utilizarea werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problematica<\/h2>\n<p>\nS\u0103 ne imagin\u0103m o situa\u021bie. \u00cen companie exist\u0103 numeroase echipe de dezvoltatori care lucreaz\u0103 la proiecte independente. Majoritatea aplica\u021biilor func\u021bioneaz\u0103 \u00een Kubernetes, a\u0219adar - sunt containerizate. Pentru stocarea containerelor, imaginilor, este necesar un registru. Ca registru, compania folose\u0219te Docker Hub cu un singur cont <code>COMPANY<\/code>. La fel ca \u00een majoritatea sistemelor de stocare a codului surs\u0103, <b>Docker Hub nu permite crearea unei ierarhii de registre \u00eennodat\u0103<\/b>, cum ar fi <code>COMPANY\/PROJECT\/IMAGE<\/code>. \u00cen acest caz\u2026 cum putem stoca aplica\u021biile nemonolitice \u00een registru, f\u0103r\u0103 a crea un cont separat pentru fiecare proiect? <\/p>\n<p><img decoding=\"async\" alt=\"Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoate c\u0103 situa\u021bia descris\u0103 este cunoscut\u0103 unor persoane, dar s\u0103 analiz\u0103m \u00eentrebarea organiz\u0103rii stoc\u0103rii aplica\u021biilor \u00een general, adic\u0103 f\u0103r\u0103 a face referire la exemplul de mai sus \u0219i Docker Hub.<\/p>\n<h3>Modalit\u0103\u021bi de solu\u021bie<\/h3>\n<p>\nDac\u0103 aplica\u021bia <b>este monolitic\u0103<\/b>, livrat\u0103 \u00eentr-o singur\u0103 imagine, atunci nu sunt \u00eentreb\u0103ri \u0219i pur \u0219i simplu salv\u0103m imaginile \u00een registrul containerelor proiectului.<\/p>\n<p>C\u00e2nd aplica\u021bia este reprezentat\u0103 prin mai multe componente, <b>microservicii<\/b>, este necesar s\u0103 alegem o abordare specific\u0103. De exemplu, pentru o aplica\u021bie web tipic\u0103, format\u0103 din dou\u0103 imagini: <code>frontend<\/code> \u0219i <code>backend<\/code> \u2014 variantele posibile sunt:<\/p>\n<ol>\n<li> A p\u0103stra imaginile \u00een registre \u00eennodat\u0103 separate:\n<p><img decoding=\"async\" alt=\"Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> A p\u0103stra totul \u00eentr-un singur registru, iar numele imaginii s\u0103 fie luat \u00een considerare \u00een tag, de exemplu, astfel:\n<p><img decoding=\"async\" alt=\"Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu 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>: De fapt, mai exist\u0103 o variant\u0103 cu p\u0103strarea \u00een diferite registre, <code>PROJECT-frontend<\/code> \u0219i <code>PROJECT-backend<\/code>, dar aceasta nu va fi tratat\u0103 din cauza complexit\u0103\u021bii \u00eentre\u021binerii, organiz\u0103rii \u0219i distribuirii drepturilor \u00eentre utilizatori.<\/i><\/p>\n<h2>Sprijinul \u00een werf<\/h2>\n<p>\nIni\u021bial, werf s-a limitat la depozitele \u00eencorporate \u2014 fiindc\u0103 majoritatea registrelor suport\u0103 aceast\u0103 op\u021biune. \u00cencep\u00e2nd cu versiunea <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, a fost ad\u0103ugat\u0103 lucrul cu registe care <b>nu suport\u0103 ierarhii<\/b>, printre care se num\u0103r\u0103 \u0219i Docker Hub. De la acest moment, utilizatorul a avut posibilitatea de a alege cum s\u0103 stocheze imaginile aplica\u021biei.<\/p>\n<p>Implementarea este disponibil\u0103 \u00een cadrul op\u021biunii <code>--images-repo-mode=multirepo|monorepo<\/code> \uff08implicit <code>multirepo<\/code>, adic\u0103 stocare \u00een depozite \u00eencorporate). Aceasta define\u0219te \u0219abloanele conform c\u0103rora imaginile sunt stocate \u00een registru. Este suficient s\u0103 alegi modul dorit atunci c\u00e2nd folose\u0219ti comenzile de baz\u0103, iar tot restul va r\u0103m\u00e2ne neschimbat.<\/p>\n<p>Deoarece majoritatea op\u021biunilor werf pot fi setate <b>prin variabile de mediu<\/b>, \u00een sistemele CI\/CD, modul de stocare poate fi setat \u00een general global pentru \u00eentregul proiect. De exemplu, <b>\u00een cazul GitLab<\/b> , este suficient s\u0103 adaugi o variabil\u0103 de mediu \u00een set\u0103rile proiectului: <i>Settings -&gt; CI \/ CD -&gt; Variables: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>C\u00e2nd vine vorba de publicarea imaginilor \u0219i de desf\u0103\u0219urarea aplica\u021biilor (despre aceste procese po\u021bi citi \u00een detaliu \u00een articolele corespunz\u0103toare din documenta\u021bie: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Publicare proces<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Desf\u0103\u0219urare proces<\/a><\/noindex>), modul determin\u0103 exclusiv \u0219ablonul conform c\u0103ruia se poate lucra cu imaginea.<\/p>\n<h3>Diavolul se afl\u0103 \u00een detalii<\/h3>\n<p>\nDiferen\u021ba \u0219i dificultatea principal\u0103 \u00een ad\u0103ugarea unui nou mod de stocare este \u00een procesul de cur\u0103\u021bare a registry-ului <i>(posibilit\u0103\u021bile de cur\u0103\u021bare suportate \u00een werf, vezi \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Proces de cur\u0103\u021bare<\/a><\/noindex>)<\/i>.<\/p>\n<p>La cur\u0103\u021bare, werf ia \u00een considerare imaginile utilizate \u00een clusterele Kubernetes, precum \u0219i politicile configurate de utilizator. La baza politicilor se afl\u0103 \u00eemp\u0103r\u021birea etichetelor \u00een strategii. Strategiile sus\u021binute \u00een prezent sunt:<\/p>\n<ol>\n<li> 3 strategii legate de primitivele Git, cum ar fi eticheta, ramura \u0219i commit-ul;<\/li>\n<li> 1 strategie pentru etichete personalizate arbitrare.<\/li>\n<\/ol>\n<p>\nInforma\u021biile despre strategia etichetei sunt p\u0103strate la publicarea imaginii \u00een etichetele imaginii finale. Valoarea \u00een sine \u2014 a\u0219a-numita <b>metatag<\/b> \u2014 este necesar\u0103 pentru aplicarea unor politici. De exemplu, \u00een cazul \u0219tergerii unei ramuri sau a unei etichete din registrul Git, este logic s\u0103 \u0219tergi \u0219i imaginele asociate <i>neutilizate<\/i> din registru, ceea ce este acoperit de o parte din politicile noastre.<\/p>\n<p>C\u00e2nd se salveaz\u0103 \u00eentr-un singur registru (<code>monorepo<\/code>), \u00een eticheta imaginii, pe l\u00e2ng\u0103 metatag, poate fi stocat \u0219i numele imaginii: <code>PROIECT:<b>frontend<\/b>-META-TAG<\/code>. Pentru a le separa, nu am introdus un separator specific, ci am ad\u0103ugat pur \u0219i simplu valoarea necesar\u0103 \u00een eticheta imaginii finale la publicare.<\/p>\n<p><i><b>NB<\/b>: Dac\u0103 sunte\u021bi interesat s\u0103 vizualiza\u021bi tot ce este descris \u00een codul surs\u0103 werf, un punct de plecare poate fi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>\u00cen acest articol nu ne vom concentra mai mult asupra problematicii \u0219i justific\u0103rii abord\u0103rii noastre: despre strategiile de etichetare, stocarea datelor \u00een etichete \u0219i procesul de publicare \u00een ansamblu \u2014 despre toate acestea s-a discutat detaliat \u00een raportul recent al lui Dmitri Stoliarov: \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 instrumentul nostru pentru CI\/CD \u00een Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>\u00cen concluzie<\/h2>\n<p>\nLipsa suportului pentru registre f\u0103r\u0103 pozi\u021bionare nu a fost un factor blocant pentru noi sau pentru utilizatorii cunoscu\u021bi ai werf \u2014 deoarece \u00eentotdeauna este posibil s\u0103 ridica\u021bi un registru distinct de imagini (sau s\u0103 trece\u021bi la un registru de containere \u00een Google Cloud)\u2026 Cu toate acestea, eliminarea unei astfel de restric\u021bii p\u0103rea logic\u0103 pentru a face instrumentul mai accesibil unei comunit\u0103\u021bi DevOps mai largi. Implement\u00e2nd-o, ne-am confruntat cu principala dificultate \u00een reproiectarea mecanismului de cur\u0103\u021bare a registrului de containere. Acum, c\u00e2nd totul este preg\u0103tit, este pl\u0103cut s\u0103 realiz\u0103m c\u0103 cuiva i-a fost mai u\u0219or, iar noi (ca dezvoltatori principali ai proiectului) nu ne a\u0219tept\u0103m la dificult\u0103\u021bi semnificative \u00een suportul ulterior al acestei caracteristici.<\/p>\n<p>R\u0103m\u00e2ne\u021bi cu noi \u0219i \u00een cur\u00e2nd v\u0103 vom povesti despre alte nout\u0103\u021bi \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nCiti\u021bi \u0219i \u00een blogul nostru:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Acum, pute\u021bi construi imagini Docker \u00een werf \u0219i folosind un Dockerfile obi\u0219nuit<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 our tool for CI\/CD in Kubernetes (overview and presentation video)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tura este cu Docker Registry | ProHoster","description":"Tema monorepositorului.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}