{"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\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Wsparcie dla monorepo i multirepo w werf oraz powi\u0105zanie z Docker Registry","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf oraz powi\u0105zanie z Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTemat monorepo by\u0142 ju\u017c wielokrotnie poruszany, a zwykle wywo\u0142uje do\u015b\u0107 aktywne dyskusje. Tworz\u0105c <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> jako narz\u0119dzie Open Source, maj\u0105ce na celu usprawnienie proces\u00f3w budowy kodu aplikacji z Git do obraz\u00f3w Docker (i ich p\u00f3\u017aniejszego dostarczania do Kubernetes), rzadko zastanawiamy si\u0119, kt\u00f3ry wyb\u00f3r jest lepszy. Kluczowe jest dla nas zapewnienie wszystkiego, co niezb\u0119dne dla zwolennik\u00f3w r\u00f3\u017cnych opinii (o ile nie stoi to w sprzeczno\u015bci z rozs\u0105dkiem, oczywi\u015bcie).<\/p>\n<p>Nowo wprowadzona obs\u0142uga mono-repo w werf jest dobrym tego przyk\u0142adem. Ale najpierw zastan\u00f3wmy si\u0119, jak to wsparcie jest zwi\u0105zane z u\u017cywaniem werf oraz jakie ma to powi\u0105zanie z Docker Registry\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problematyka<\/h2>\n<p>\nWyobra\u017amy sobie tak\u0105 sytuacj\u0119. W firmie jest wiele zespo\u0142\u00f3w programistycznych zajmuj\u0105cych si\u0119 niezale\u017cnymi projektami. Wi\u0119kszo\u015b\u0107 aplikacji dzia\u0142a w Kubernetesie, a wi\u0119c s\u0105 konteneryzowane. Aby przechowywa\u0107 kontenery i obrazy, potrzebny jest rejestr (registry). Jako taki rejestr w firmie wykorzystywany jest Docker Hub z jednym kontem. <code>FIRMA<\/code>. Podobnie jak w wi\u0119kszo\u015bci system\u00f3w przechowywania kodu \u017ar\u00f3d\u0142owego, <b>Docker Hub nie pozwala na tworzenie zagnie\u017cd\u017conej hierarchii repozytori\u00f3w<\/b>, takiej jak <code>FIRMA\/PROJEKT\/OBRAZ<\/code>. W takim przypadku\u2026 jak poradzi\u0107 sobie z tym ograniczeniem przy przechowywaniu nierelacyjnych aplikacji w rejestrze, nie tworz\u0105c oddzielnego konta dla ka\u017cdego projektu? <\/p>\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf oraz powi\u0105zanie z Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cliwe, \u017ce opisana sytuacja jest komu\u015b dobrze znana, ale zastan\u00f3wmy si\u0119 nad organizacj\u0105 przechowywania aplikacji w og\u00f3le, tj. bez odniesienia do powy\u017cszego przyk\u0142adu i Docker Hub.<\/p>\n<h3>Mo\u017cliwo\u015bci rozwi\u0105zania<\/h3>\n<p>\nJe\u015bli aplikacja <b>jest monolityczna<\/b>, dostarczana w jednym obrazie, to nie ma problemu i po prostu przechowujemy obrazy w rejestrze kontener\u00f3w projektu.<\/p>\n<p>Kiedy aplikacja jest reprezentowana przez kilka komponent\u00f3w, <b>mikroserwis\u00f3w<\/b>, konieczne jest wybranie odpowiedniego podej\u015bcia. Na przyk\u0142adzie typowej aplikacji webowej sk\u0142adaj\u0105cej si\u0119 z dw\u00f3ch obraz\u00f3w: <code>frontend<\/code> i <code>backend<\/code> \u2014 mo\u017cliwe warianty to:<\/p>\n<ol>\n<li> Przechowywanie obraz\u00f3w w oddzielnych zagnie\u017cd\u017conych repozytoriach:\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf oraz powi\u0105zanie z Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Przechowywanie wszystkiego w jednym repozytorium, a nazwa obrazu jako tag, na przyk\u0142ad, w nast\u0119puj\u0105cy spos\u00f3b:\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf oraz powi\u0105zanie z 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>: W\u0142a\u015bciwie jest jeszcze opcja z przechowywaniem w r\u00f3\u017cnych repozytoriach, <code>PROJEKT-frontend<\/code> i <code>PROJEKT-backend<\/code>, ale nie b\u0119dziemy go rozwa\u017ca\u0107 z powodu z\u0142o\u017cono\u015bci wsparcia, organizacji i przydzielania uprawnie\u0144 mi\u0119dzy u\u017cytkownikami.<\/i><\/p>\n<h2>Wsparcie w werf<\/h2>\n<p>\nPocz\u0105tkowo werf ogranicza\u0142 si\u0119 do repozytori\u00f3w zagnie\u017cd\u017conych \u2014 na szcz\u0119\u015bcie wi\u0119kszo\u015b\u0107 rejestr\u00f3w wspiera t\u0119 funkcjonalno\u015b\u0107. Od wersji <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, dodano obs\u0142ug\u0119 rejestr\u00f3w, w kt\u00f3rych <b>nie jest wspierana zagnie\u017cd\u017cono\u015b\u0107<\/b>, w tym Docker Hub. Od tego momentu u\u017cytkownik zyska\u0142 wyb\u00f3r, jak przechowywa\u0107 obrazy aplikacji.<\/p>\n<p>Implementacja jest dost\u0119pna w ramach opcji <code>--images-repo-mode=multirepo|monorepo<\/code> (domy\u015blnie <code>multirepo<\/code>, tzn. przechowywanie w zagnie\u017cd\u017conych repozytoriach). Okre\u015bla ona wzorce, wed\u0142ug kt\u00f3rych obrazy s\u0105 przechowywane w rejestrze. Wystarczy wybra\u0107 odpowiedni tryb podczas u\u017cycia g\u0142\u00f3wnych polece\u0144, a wszystko inne pozostanie bez zmian.<\/p>\n<p>Poniewa\u017c wi\u0119kszo\u015b\u0107 opcji werf mo\u017cna ustawi\u0107 <b>zmiennymi \u015brodowiskowymi<\/b>, w systemach CI\/CD tryb przechowywania mo\u017cna zazwyczaj \u0142atwo ustawi\u0107 globalnie dla ca\u0142ego projektu. Na przyk\u0142ad, <b>w przypadku GitLab<\/b> wystarczy doda\u0107 zmienn\u0105 \u015brodowiskow\u0105 w ustawieniach projektu: <i>Ustawienia -&gt; CI \/ CD -&gt; Zmienne: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>Je\u015bli chodzi o publikacj\u0119 obraz\u00f3w i wdra\u017canie aplikacji (o tych procesach mo\u017cna przeczyta\u0107 w odpowiednich artyku\u0142ach dokumentacji: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Proces publikacji<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Proces wdra\u017cania<\/a><\/noindex>), to tryb okre\u015bla szablon, wed\u0142ug kt\u00f3rego mo\u017cna pracowa\u0107 z obrazem.<\/p>\n<h3>Diabe\u0142 tkwi w szczeg\u00f3\u0142ach<\/h3>\n<p>\nR\u00f3\u017cnica i g\u0142\u00f3wna trudno\u015b\u0107 przy dodawaniu nowego sposobu przechowywania polega na procesie czyszczenia rejestru <i>(mo\u017cliwo\u015bci czyszczenia wspierane w werf, patrz <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Proces czyszczenia<\/a><\/noindex>)<\/i>.<\/p>\n<p>Podczas czyszczenia werf uwzgl\u0119dnia obrazy u\u017cywane w klastrach Kubernetes, a tak\u017ce polityki ustalane przez u\u017cytkownika. W podstawie polityk le\u017cy podzia\u0142 tag\u00f3w na strategie. Strategie aktualnie wspierane to:<\/p>\n<ol>\n<li> 3 strategie zwi\u0105zane z podstawowymi operacjami Git, takimi jak tag, ga\u0142\u0105\u017a i commit;<\/li>\n<li> 1 strategia dla dowolnych tag\u00f3w u\u017cytkownik\u00f3w.<\/li>\n<\/ol>\n<p>\nInformacje o strategii taga przechowujemy podczas publikacji obrazu w etykietach ko\u0144cowego obrazu. Samo znaczenie \u2013 tzw. <b>metatag<\/b> \u2013 jest niezb\u0119dne do zastosowania cz\u0119\u015bci polityk. Na przyk\u0142ad przy usuwaniu ga\u0142\u0119zi lub taga z repozytorium Git logiczne jest usuni\u0119cie r\u00f3wnie\u017c powi\u0105zanych <i>nieu\u017cywanych<\/i> obraz\u00f3w z rejestru, co jest obj\u0119te cz\u0119\u015bci\u0105 naszych polityk.<\/p>\n<p>Podczas przechowywania w jednym repozytorium (<code>monorepo<\/code>), w tagu obrazu, opr\u00f3cz metatagu, mo\u017ce by\u0107 r\u00f3wnie\u017c przechowywana nazwa obrazu: <code>PROJEKT:<b>frontend<\/b>-META-TAG<\/code>. Aby je oddzieli\u0107, nie wprowadzili\u015bmy \u017cadnego specyficznego separatora, lecz po prostu dodali\u015bmy potrzebn\u0105 warto\u015b\u0107 do etykiety ko\u0144cowego obrazu przy publikacji.<\/p>\n<p><i><b>NB<\/b>: Je\u015bli chcesz zobaczy\u0107 wszystko opisane w kodzie \u017ar\u00f3d\u0142owym werf, punktem wyj\u015bcia mo\u017ce by\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>W tym artykule nie po\u015bwi\u0119cimy wi\u0119cej uwagi problematyce i uzasadnieniu naszego podej\u015bcia: o strategiach tagowania, przechowywaniu danych w etykietach oraz o procesie publikacji w ca\u0142o\u015bci \u2014 szczeg\u00f3\u0142owo opisano to w niedawnym wyst\u0105pieniu Dmitrija Stoljarowa: \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nasze narz\u0119dzie do CI\/CD w Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>Podsumowuj\u0105c<\/h2>\n<p>\nBrak wsparcia dla rejestr\u00f3w bez zagnie\u017cd\u017ce\u0144 nie by\u0142 czynnikiem blokuj\u0105cym dla nas ani dla znanych nam u\u017cytkownik\u00f3w werf \u2014 zawsze mo\u017cna podnie\u015b\u0107 oddzielny rejestr obraz\u00f3w (lub przej\u015b\u0107 na tzw. Container Registry w Google Cloud)\u2026 Jednak zniesienie takiego ograniczenia wydawa\u0142o si\u0119 logiczne, aby narz\u0119dzie by\u0142o bardziej przyjazne dla szerszej spo\u0142eczno\u015bci DevOps. Realizuj\u0105c to, napotkali\u015bmy g\u0142\u00f3wny problem z przetwarzaniem mechanizmu czyszczenia rejestru kontener\u00f3w. Teraz, kiedy wszystko jest gotowe, cieszy nas, \u017ce komu\u015b jest \u0142atwiej, a my (jako g\u0142\u00f3wni deweloperzy projektu) nie przewidujemy znacz\u0105cych trudno\u015bci w dalszym wsparciu tej funkcji.<\/p>\n<p>Pozosta\u0144cie z nami, wkr\u00f3tce opowiemy o innych nowo\u015bciach w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nPrzeczytaj r\u00f3wnie\u017c na naszym blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Teraz mo\u017cna budowa\u0107 obrazy Docker w werf tak\u017ce z klasycznego Dockerfile<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nasze narz\u0119dzie do CI\/CD w Kubernetes (przegl\u0105d i wideo prezentacji)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <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.0.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\/pl\/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.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Wsparcie monorepo i multirepo w werf oraz jak to si\u0119 ma do Docker Registry | ProHoster","description":"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}