{"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\/de\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Thema Monorepository wurde bereits mehrfach diskutiert und f\u00fchrt in der Regel zu sehr aktiven Debatten. Bei der Erstellung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> als Open Source-Tool, das die Prozesse der Codeerstellung von Anwendungen aus Git in Docker-Images (und deren anschlie\u00dfender Bereitstellung in Kubernetes) verbessern soll, denken wir wenig dar\u00fcber nach, welche Wahl die bessere ist. F\u00fcr uns ist es prim\u00e4r, alles Notwendige f\u00fcr die Unterst\u00fctzer verschiedener Meinungen bereitzustellen (sofern dies nicht dem gesunden Menschenverstand widerspricht, nat\u00fcrlich).<\/p>\n<p>Die k\u00fcrzlich hinzugef\u00fcgte Unterst\u00fctzung von Mono-Repo in werf ist ein gutes Beispiel daf\u00fcr. Aber lassen Sie uns zun\u00e4chst kl\u00e4ren, wie diese Unterst\u00fctzung \u00fcberhaupt mit der Verwendung von werf verbunden ist und was Docker Registry damit zu tun hat\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problemstellung<\/h2>\n<p>\nStellen wir uns eine solche Situation vor. In einem Unternehmen gibt es zahlreiche Entwicklerteams, die an unabh\u00e4ngigen Projekten arbeiten. Die meisten Anwendungen laufen in Kubernetes und sind somit containerisiert. Zur Speicherung von Containern und Images ist ein Registry erforderlich. Als solcher Registry wird im Unternehmen Docker Hub mit einem einzigen Konto verwendet <code>COMPANY<\/code>. \u00c4hnlich wie die meisten Systeme zur Speicherung von Quellcode <b>erlaubt Docker Hub keine verschachtelte Hierarchie von Repositories<\/b>, wie etwa <code>COMPANY\/PROJECT\/IMAGE<\/code>. In diesem Fall\u2026 wie kann man mit dieser Einschr\u00e4nkung nicht-monolithische Anwendungen im Registry speichern, ohne f\u00fcr jedes Projekt ein separates Konto zu erstellen? <\/p>\n<p><img decoding=\"async\" alt=\"Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u00f6glicherweise ist die beschriebene Situation f\u00fcr einige bekannt, aber lasst uns die Frage der Organisationsstruktur von Anwendungen im Allgemeinen betrachten, das hei\u00dft, ohne an das oben beschriebene Beispiel und Docker Hub gebunden zu sein.<\/p>\n<h3>L\u00f6sungswege<\/h3>\n<p>\nWenn die Anwendung <b>monolithisch<\/b>, wird sie in einem Image bereitgestellt, dann gibt es keine Fragen und wir speichern einfach die Images im Registry der Anwendung.<\/p>\n<p>Wenn die Anwendung aus mehreren Komponenten besteht, <b>Mikroservices<\/b>, muss ein bestimmter Ansatz gew\u00e4hlt werden. Am Beispiel einer typischen Webanwendung, die aus zwei Images besteht: <code>frontend<\/code> und <code>backend<\/code> \u2014 m\u00f6gliche Optionen sind:<\/p>\n<ol>\n<li> Bilder in separaten verschachtelten Repositories speichern:\n<p><img decoding=\"async\" alt=\"Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Alles in einem Repository speichern, wobei der Name des Images z.B. wie folgt im Tag ber\u00fccksichtigt wird:\n<p><img decoding=\"async\" alt=\"Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun\" src=\"\/wp-content\/uploads\/2019\/09\/83498b5bcdf7a57dfe933295e78fc785.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<i><b>NB<\/b>: Eigentlich gibt es noch eine M\u00f6glichkeit, die Speicherung in verschiedenen Repositories zu organisieren, <code>PROJECT-frontend<\/code> und <code>PROJECT-backend<\/code>, aber diese werden wir wegen der Komplexit\u00e4t der Unterst\u00fctzung, Organisation und Verteilung der Rechte zwischen den Benutzern nicht betrachten.<\/i><\/p>\n<h2>Unterst\u00fctzung in werf<\/h2>\n<p>\nUrspr\u00fcnglich beschr\u00e4nkte sich werf auf verschachtelte Repositories \u2013 gl\u00fccklicherweise unterst\u00fctzen die meisten Registries diese M\u00f6glichkeit. Ab Version <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, wurde die Unterst\u00fctzung f\u00fcr Registries hinzugef\u00fcgt, in denen <b>keine Verschachtelung unterst\u00fctzt wird<\/b>, einschlie\u00dflich Docker Hub. Von diesem Zeitpunkt an hatten Benutzer die Wahl, wie sie die Anwendungsbilder speichern m\u00f6chten.<\/p>\n<p>Die Implementierung ist im Rahmen der Option <code>--images-repo-mode=multirepo|monorepo<\/code> (Standardm\u00e4\u00dfig <code>multirepo<\/code>, d.h. Lagerung in verschachtelten Repositories). Diese definiert die Muster, nach denen die Bilder im Registry gespeichert werden. Es gen\u00fcgt, den gew\u00fcnschten Modus bei der Verwendung der Hauptbefehle auszuw\u00e4hlen, alles andere bleibt unver\u00e4ndert.<\/p>\n<p>Da die meisten werf-Optionen \u00fcber <b>Umgebungsvariablen<\/b>festgelegt werden k\u00f6nnen, ist der Speicher-Modus in CI\/CD-Systemen in der Regel einfach global f\u00fcr das gesamte Projekt festzulegen. Zum Beispiel, <b>im Falle von GitLab<\/b> muss lediglich eine Umgebungsvariable in den Projekteinstellungen hinzugef\u00fcgt werden: <i>Einstellungen -&gt; CI \/ CD -&gt; Variablen: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>Wenn es um die Ver\u00f6ffentlichung von Bildern und die Bereitstellung von Anwendungen geht (\u00fcber diese Prozesse kann man detailliert in den entsprechenden Artikeln der Dokumentation lesen: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Ver\u00f6ffentlichungsprozess<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Bereitstellungsprozess<\/a><\/noindex>), definiert der Modus ausschlie\u00dflich das Muster, mit dem man mit dem Bild arbeiten kann.<\/p>\n<h3>Der Teufel steckt im Detail<\/h3>\n<p>\nDer Unterschied und die Hauptschwierigkeit bei der Hinzuf\u00fcgung einer neuen Speichermethode liegt im Prozess der Bereinigung des Registrys <i>(die in werf unterst\u00fctzten Bereinigungsm\u00f6glichkeiten siehe <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Reinigungsprozess<\/a><\/noindex>)<\/i>.<\/p>\n<p>). Bei der Bereinigung ber\u00fccksichtigt werf die in Kubernetes-Clustern verwendeten Bilder sowie die vom Benutzer festgelegten Richtlinien. Grundlage der Richtlinien ist die Unterteilung der Tags in Strategien. Derzeit unterst\u00fctzte Strategien:<\/p>\n<ol>\n<li> 3 Strategien, die mit Git-Primitiven wie Tag, Branch und Commit verbunden sind;<\/li>\n<li> 1 Strategie f\u00fcr benutzerdefinierte Tags.<\/li>\n<\/ol>\n<p>\nDie Informationen \u00fcber die Tag-Strategie werden bei der Ver\u00f6ffentlichung des Bildes in den Labels des Endbildes gespeichert. Der Wert selbst \u2013 das sogenannte <b>Metatag<\/b> \u2013 ist erforderlich, um einen Teil der Richtlinien anzuwenden. Beispielsweise ist es sinnvoll, die zugeh\u00f6rigen <i>nicht verwendeten<\/i> Bilder aus dem Registry zu l\u00f6schen, wenn ein Branch oder Tag aus dem Git-Repository gel\u00f6scht wird, was durch einen Teil unserer Richtlinien abgedeckt wird.<\/p>\n<p>Bei der Speicherung in einem einzigen Repository (<code>monorepo<\/code>), kann im Tag des Bildes neben dem Metatag auch der Bildname gespeichert werden: <code>PROJEKT:<b>frontend<\/b>-META-TAG<\/code>. Um sie zu trennen, haben wir keinen spezifischen Trenner eingef\u00fchrt, sondern einfach den erforderlichen Wert im Label des endg\u00fcltigen Images beim Publishen hinzugef\u00fcgt.<\/p>\n<p><i><b>NB<\/b>: Wenn Sie interessiert sind, alles, was im Quellcode von werf beschrieben ist, zu sehen, kann ein Ausgangspunkt sein <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>In diesem Artikel werden wir nicht weiter auf die Problematik und die Begr\u00fcndung unseres Ansatzes eingehen: \u00fcber Tagging-Strategien, Datenspeicherung in Labels und den Ver\u00f6ffentlichungsprozess insgesamt \u2014 all dies wurde ausf\u00fchrlich in einem k\u00fcrzlich gehaltenen Vortrag von Dmitry Stolyarov behandelt: \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2013 unser Werkzeug f\u00fcr CI\/CD in Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>Zusammenfassend<\/h2>\n<p>\nDas Fehlen der Unterst\u00fctzung von Registries ohne Verschachtelung war f\u00fcr uns oder die uns bekannten werf-Nutzer kein ausschlaggebender Faktor \u2014 schlie\u00dflich kann immer ein separater Image-Registry aufgesetzt oder auf eine hypothetische Container Registry in Google Cloud umgestiegen werden\u2026 Dennoch schien es logisch, eine solche Einschr\u00e4nkung aufzuheben, um das Tool f\u00fcr eine breitere DevOps-Community zug\u00e4nglicher zu machen. Bei der Umsetzung stie\u00dfen wir auf die gr\u00f6\u00dfte Schwierigkeit bei der \u00dcberarbeitung des Mechanismus zur Reinigung des Container-Registries. Jetzt, wo alles bereit ist, ist es sch\u00f6n zu wissen, dass es f\u00fcr jemanden einfacher geworden ist, und dass wir (als die Hauptentwickler des Projekts) keine nennenswerten Schwierigkeiten bei der weiteren Unterst\u00fctzung dieses Features erwarten.<\/p>\n<p>Bleiben Sie dran, und bald werden wir \u00fcber weitere Neuerungen in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nLesen Sie auch in unserem Blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Docker-Images in werf k\u00f6nnen jetzt auch mit einem normalen Dockerfile gebaut werden.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">Release des Konsolen-XMPP\/Jabber-Clients profanity 0.7.0<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Quelle: <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.1.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\/de\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47 Unterst\u00fctzung von Monorepo und Multirepo in werf und was Docker Registry damit zu tun hat | ProHoster","description":"Das Thema Monorepository.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}