{"id":4146,"date":"2025-06-03T10:40:39","date_gmt":"2025-06-03T09:40:39","guid":{"rendered":"https:\/\/archive.5fcf01f.deploio.app\/%f0%9f%9a%80-from-zero-to-infra-building-a-production-ready-setup-using-nine-chs-api-ansible\/"},"modified":"2025-07-25T12:23:47","modified_gmt":"2025-07-25T11:23:47","slug":"from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible","status":"publish","type":"post","link":"https:\/\/archive.5fcf01f.deploio.app\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/","title":{"rendered":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\ud83d\udcd6 Die Geschichte nimmt ihren Lauf<\/h2>\n\n\n\n<p>Ein Muster, das wir bei Nine h\u00e4ufig beobachten, ist, dass viele unserer Kund*innen Webanwendungen betreiben \u2013 etwa Content-Management-Systeme, Webshops, Dashboards oder eigene APIs. Solche Anwendungen setzen typischerweise auf eine bew\u00e4hrte Kombination aus Infrastrukturdiensten: eine Datenbank zur Datenspeicherung, eine Cache-Schicht f\u00fcr schnelle Performance und einen Server, auf dem die Anwendungslogik l\u00e4uft.<\/p>\n\n\n\n<p>Unser Szenario spiegelt genau diesen Praxisfall wider. Wir zeigen hier nicht einfach nur das Aufsetzen einer VM oder stellen eine API zur Schau (na gut, vielleicht ein bisschen \ud83d\ude09), sondern stellen typische Komponenten bereit, die in echten Produktionsumgebungen vorkommen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine <strong>PostgreSQL-Datenbank<\/strong> f\u00fcr Nutzerdaten, Bestellungen und Produktinformationen<\/li>\n\n\n\n<li>Einen <strong>Redis Key-Value-Store<\/strong> f\u00fcr schnelles Caching und geringere Ladezeiten<\/li>\n\n\n\n<li>Eine <strong>CloudVM<\/strong>, auf der Anwendungen wie Webserver oder Backend-APIs laufen<\/li>\n<\/ul>\n\n\n\n<p>Ziel ist es, zu zeigen, wie Sie diese Dienste einfach und praxisnah mit unserer API und unseren Tools bereitstellen und verwalten k\u00f6nnen \u2013 und zwar so, dass das Ganze Ihre Arbeitslast und Herausforderungen widerspiegelt.<\/p>\n\n\n\n<p>Als Head of Engineering bei <a href=\"https:\/\/archive.5fcf01f.deploio.app\/de\/\">Nine<\/a> durfte ich miterleben, wie unsere Plattform kontinuierlich weiterentwickelt wurde, um Entwickler*innen leistungsstarke Werkzeuge zur Infrastrukturautomatisierung zu bieten. Eines der wichtigsten Tools dabei ist unsere <strong>\u00f6ffentliche API<\/strong>, mit der Sie Ihre Infrastruktur programmatisch bereitstellen und steuern k\u00f6nnen.<\/p>\n\n\n\n<p>Dieser Blogpost dient nicht als reines Tutorial: Er erz\u00e4hlt die Geschichte, wie aus einem leeren Blatt eine funktionsf\u00e4hige, produktions\u00e4hnliche Umgebung entsteht. Wir erstellen und validieren dabei folgende Infrastrukturkomponenten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine <strong>PostgreSQL-Datenbank<\/strong> f\u00fcr persistente Datenspeicherung<\/li>\n\n\n\n<li>Einen <strong>Redis Key-Value-Store<\/strong> f\u00fcr schnelles Caching<\/li>\n\n\n\n<li>Eine <strong>CloudVM<\/strong>, die beliebige Anwendungen hosten kann<\/li>\n<\/ul>\n\n\n\n<p>Jeder Schritt wird nicht nur erkl\u00e4rt, sondern auch hinsichtlich der Entscheidungen und Befehle kontextuell eingeordnet. Zielgruppe sind Entwickler*innen oder DevOps-Engineers, die noch nicht mit unserer API, Ansible oder unserem CLI-Tool `nctl` vertraut sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udd16 Warum Ansible?<\/h2>\n\n\n\n<p>Bevor wir ins Technische eintauchen, kurz zu unserem zentralen Werkzeug, das alles zusammenh\u00e4lt: <strong>Ansible<\/strong>.<\/p>\n\n\n\n<p>Ansible ist ein beliebtes Automatisierungstool f\u00fcr Konfigurationsmanagement, Applikations-Deployment und allgemeine Infrastruktur-Orchestrierung. Wieso ist es so beliebt?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Agentenlos:<\/strong> Im Gegensatz zu anderen Tools ist keine Installation auf den Zielsystemen notwendig, denn Ansible nutzt SSH.<\/li>\n\n\n\n<li><strong>Lesbare YAML-Syntax:<\/strong> Das macht es einfach zu lernen und gemeinsam nutzbar.<\/li>\n\n\n\n<li><strong>Dynamische Abl\u00e4ufe:<\/strong> Es erm\u00f6glicht Bedingungen, Variablen, Schleifen sowie direkte Shell-Befehle und API-Aufrufe.<\/li>\n<\/ul>\n\n\n\n<p>Ansible passt hervorragend zu Szenarien wie dem unseren, in dem nicht nur Infrastruktur erstellt, sondern auch anschliessend konfiguriert und validiert werden soll.<\/p>\n\n\n\n<p>Vielleicht kennen Sie bereits OpenTofu oder Terraform \u2013 diese Tools \u00fcberzeugen bei der deklarativen Verwaltung von Infrastrukturzust\u00e4nden. Da wir eine \u00f6ffentlich zug\u00e4ngliche API anbieten, ist sie vollst\u00e4ndig kompatibel mit Terraform, Beispielkonfigurationen dazu finden Sie <a href=\"https:\/\/github.com\/ninech\/terraform-examples\">hier<\/a>. Ansible hingegen ist prozedural und ereignisgetrieben, ideal f\u00fcr unseren Schritt-f\u00fcr-Schritt-Ansatz und konditionale Logik.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Das Toolkit einrichten (macOS)<\/h2>\n\n\n\n<p>Unser Abenteuer beginnt auf einem MacBook. Wir installieren die notwendigen Tools mit <a href=\"https:\/\/brew.sh\">Homebrew<\/a>, dem de facto Standard-Paketmanager f\u00fcr macOS.<\/p>\n\n\n\n<p>Linux-Nutzer k\u00f6nnen der <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/installation_guide\/intro_installation.html\">Ansible-Installationsanleitung<\/a> folgen und `nctl` manuell \u00fcber <a href=\"https:\/\/github.com\/ninech\/nctl\/releases\">unsere GitHub-Releases<\/a> installieren.<\/p>\n\n\n\n<p>F\u00fcr Windows empfehlen wir die Verwendung von <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/wsl\/\">WSL2<\/a> und dann das Befolgen der Linux-Anweisungen von oben. So k\u00f6nnen Sie dieselben Unix-\u00e4hnlichen Tools und Befehle auf Windows nutzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Homebrew installieren<\/h3>\n\n\n\n<p>Falls Sie Homebrew noch nicht nutzen, installieren Sie es wie folgt:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\n\/bin\/bash -c &quot;$(curl -fsSL https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh)&quot;\n<\/pre><\/div>\n\n\n<p>Mit Homebrew k\u00f6nnen Sie dann auch diverse andere Tools einfach installieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ansible installieren<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nbrew install ansible\n<\/pre><\/div>\n\n\n<p>Ansible ist unser Hauptwerkzeug, um die Bereitstellung, Konfiguration und Validierung der Infrastrukturressourcen zu automatisieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Unser CLI-Tool `nctl` installieren<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nbrew tap ninech\/nine\nbrew install nctl\n<\/pre><\/div>\n\n\n<p>`nctl` ist unser Befehlszeilen-Client und vereinfacht das Handling unserer API erheblich, wie beispielsweise das Erstellen einer VM oder Datenbank, das Abrufen von Secrets oder die Zugriffskontrollenverwaltung. Es wird immer wieder zum Einsatz kommen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Authentifizierung mit unserer API<\/h3>\n\n\n\n<p>Um mit unserer API zu interagieren, ben\u00f6tigen Sie einen Inhaber-Token. Dieser Token gew\u00e4hrt Ihnen autorisierten Zugriff und ist sowohl f\u00fcr Ansible als auch f\u00fcr \u2018nctl\u2019 notwendig.<\/p>\n\n\n\n<p>Sie k\u00f6nnen entweder im Cockpit einen Service-Account erstellen und dort den Token einsehen:<\/p>\n\n\n\n<p>\ud83d\udc49 <a href=\"https:\/\/cockpit.nine.ch\/de\/customer\/api_service_accounts\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cockpit.nine.ch\/de\/customer\/api\\_service\\_accounts\/<\/a><\/p>\n\n\n\n<p>Oder Sie erstellen den Token via CLI.<\/p>\n\n\n\n<p>Loggen Sie sich dazu mit Ihrem Account ein:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nnctl auth login\n<\/pre><\/div>\n\n\n<p>Dann erstellen wir einen apiserviceaccount mit dem Namen `cicd`:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nnctl create apiserviceaccount cicd\n<\/pre><\/div>\n\n\n<p>Schliesslich rufen wir den Token f\u00fcr den apiserviceaccount mit dem Namen `cicd` ab:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nnctl get apiserviceaccounts cicd --print-token\n<\/pre><\/div>\n\n\n<p>Sobald Sie Ihren Token haben, exportieren Sie ihn als Umgebungsvariable:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nexport NINE_API_TOKEN=&quot;&lt;your-token&gt;&quot;\n<\/pre><\/div>\n\n\n<p>Vergessen Sie nicht, Ihren \u00f6ffentlichen SSH-Key ebenfalls zu exportieren. Den brauchen wir, um sp\u00e4ter auf die VM zuzugreifen:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nexport SSH_PUBLIC_KEY=&quot;$(cat ~\/.ssh\/id_ed25519.pub)&quot;\n<\/pre><\/div>\n\n\n<p>&gt; \ud83d\udee1\ufe0f Behandeln Sie Ihren API-Token wie ein Passwort \u2013 nie direkt in Dateien speichern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca Projektstruktur<\/h2>\n\n\n\n<p>Um den \u00dcberblick zu behalten, legen wir ein Projektverzeichnis an und definieren unsere wiederverwendbare Konfiguration.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nmkdir nine-infra &amp;&amp; cd nine-infra\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Gruppenvariablen<\/h3>\n\n\n\n<p>Ansible erm\u00f6glicht es uns, mittels group vars Variablen an einem Ort zu gruppieren. Erstellen Sie einen Ordner mit:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nmkdir group_vars\n<\/pre><\/div>\n\n\n<p>So k\u00f6nnte `group_vars\/all.yml` aussehen:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; gutter: false; title: ; notranslate\" title=\"\">\n# group_vars\/all.yml\npostgres_name: example-postgres\npostgres_version: 15\nredis_name: example-redis\nvm_name: example-vm\nlocation: nine-cz41\nmachine_type: nine-small-1\nos: ubuntu24.04\n<\/pre><\/div>\n\n\n<p>Das macht unsere Playbooks besser lesbar und erleichtert das Wiederverwenden oder Updaten von Einstellungen. Je nach Bedarf k\u00f6nnen Sie die Werte hier anpassen \u2013 wie zum Beispiel die Betriebssystemversion, den Maschinentyp oder die Serviceversionen. Um herauszufinden, welche Werte unterst\u00fctzt werden, k\u00f6nnen Sie die Dokumentation verwenden, die wir f\u00fcr unsere API bieten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.nine.ch\/api\/#tag\/CloudVirtualMachine\">CloudVM Maschinentypen und Locations&nbsp;<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.nine.ch\/api\/#tag\/Postgres\">Von PostgreSQL unterst\u00fctzte Versionen und Typen<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.nine.ch\/api\/#tag\/KeyValueStore\">KeyValueStore-Spezifikationen<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd3a Schritt 1: PostgreSQL bereitstellen<\/h2>\n\n\n\n<p>Um eine verwaltete PostgreSQL-Instanz bereitzustellen, verwenden wir `nctl` mit einem Ansible-Playbook. So wird sichergestellt, dass die Datenbank mit unserer gew\u00fcnschten Konfiguration konsistent erstellt wird.<\/p>\n\n\n\n<p>Erstellen Sie das folgende File und speichern Sie es als `provision_postgres.yml`:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; gutter: false; title: ; notranslate\" title=\"\">\n# provision_postgres.yml\n- name: Provision PostgreSQL\n  hosts: localhost\n  gather_facts: false\n\n  vars_files:\n    - group_vars\/all.yml\n\n  tasks:\n    - name: Check if PostgreSQL already exists\n      ansible.builtin.shell: &quot;nctl get postgres {{ postgres_name }}&quot;\n      changed_when: false\n      failed_when: false\n      register: pg_exists\n\n    - name: Create PostgreSQL\n      ansible.builtin.command: &gt;\n        nctl create postgres {{ postgres_name }}\n        --postgres-version {{ postgres_version }}\n        --machine-type nine-db-xs\n        --location {{ location }}\n        --allowed-cidrs 0.0.0.0\/0\n        --wait\n      changed_when: &quot;pg_result.rc == 0&quot;\n      ignore_errors: true\n      when: &quot;pg_exists.rc != 0&quot;\n      register: pg_result\n\n    - name: Get PostgreSQL connection string\n      ansible.builtin.command: &quot;nctl get postgres {{ postgres_name }} --print-connection-string&quot;\n      register: pg_conn_str\n      changed_when: &quot;pg_conn_str.rc != 0&quot;\n\n    - name: Set Postgres connection string fact\n      ansible.builtin.set_fact:\n        postgres_conn_string: &quot;{{ pg_conn_str.stdout }}\/postgres&quot;\n\n    - name: Debug Postgres connection string\n      ansible.builtin.debug:\n        var: postgres_conn_string\n<\/pre><\/div>\n\n\n<p>F\u00fchren Sie das Ganze mithilfe von folgendem Befehl aus:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nansible-playbook provision_postgres.yml\n<\/pre><\/div>\n\n\n<p>Achtung: Dieser Schritt kann einige Zeit in Anspruch nehmen.<\/p>\n\n\n\n<p>Zuerst kommt unsere Datenbank: Eine PostgreSQL-Instanz bietet uns einen dauerhaften, zuverl\u00e4ssigen Datenspeicher. Es ist eine \u00fcbliche Backend-Wahl f\u00fcr moderne Apps.<\/p>\n\n\n\n<p>Wir verwenden `nctl`, um die Instanz zu erstellen und rufen dann gleich den Verbindungs-String ab, damit wir ihn sp\u00e4ter verwenden k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Validierung:<\/h3>\n\n\n\n<p>Nutzen Sie den Verbindungs-String, um zu best\u00e4tigen, dass die Instanz erreichbar ist:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\npsql &lt;postgres_connection_string&gt;\n<\/pre><\/div>\n\n\n<p>Wenn die Verbindung gelingt, k\u00f6nnen Sie zum n\u00e4chsten Schritt \u00fcbergehen. Denken Sie daran, dass die Erstellung einer DB einige Zeit dauern kann, da wir stets eine dedizierte Datenbank bereitstellen. Bald werden wir auch Shared DBs anbieten, die diesen Schritt beschleunigen werden. Bitte beachten Sie auch, dass wir \u2013 der Einfachheit halber und f\u00fcr diesen Blogbeitrag \u2013 f\u00fcr die IP 0.0.0.0\/0 den Zugriff auf alle unsere Dienste erlauben. Ich empfehle Ihnen aber dringend, Ihre Infrastruktur nicht auf diese Weise aufzusetzen.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd3a Schritt 2: Redis bereitstellen<\/h2>\n\n\n\n<p>Redis verk\u00f6rpert unseren KeyValue Store. Genau wie PostgreSQL, nutzen wir ein Ansible-Playbook, um die Bereitstellung zu automatisieren.<\/p>\n\n\n\n<p>Erstellen Sie das folgende File als `provision_redis.yml`:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; gutter: false; title: ; notranslate\" title=\"\">\n# provision_redis.yml\n- name: Provision Redis\n  hosts: localhost\n  gather_facts: false\n\n  vars_files:\n    - group_vars\/all.yml\n\n  tasks:\n    - name: Check if Redis already exists\n      ansible.builtin.shell: &quot;nctl get keyvaluestore {{ redis_name }}&quot;\n      changed_when: false\n      failed_when: false\n      register: redis_exists\n\n    - name: Create Redis\n      ansible.builtin.command: &gt;\n        nctl create keyvaluestore {{ redis_name }}\n        --memory-size 1Gi\n        --location {{ location }}\n        --allowed-cidrs 0.0.0.0\/0\n        --wait\n      changed_when: &quot;redis_result.rc == 0&quot;\n      ignore_errors: true\n      when: &quot;redis_exists.rc != 0&quot;\n      register: redis_result\n\n    - name: Get Redis connection info\n      ansible.builtin.command: nctl get keyvaluestore {{ redis_name }} -o yaml\n      register: redis_info\n      changed_when: &quot;redis_info.rc != 0&quot;\n\n    - name: Parse Redis connection info\n      ansible.builtin.set_fact:\n        redis_host: &quot;{{ redis_info.stdout | from_yaml | json_query(&#039;status.atProvider.connection.address&#039;) }}&quot;\n        redis_password: &quot;{{ redis_info.stdout | from_yaml | json_query(&#039;status.atProvider.connection.password&#039;) }}&quot;\n\n    - name: Debug Redis details\n      ansible.builtin.debug:\n        msg: &quot;Redis host: {{ redis_host }}, password: {{ redis_password }}&quot;\n<\/pre><\/div>\n\n\n<p>F\u00fchren Sie das Ganze mit folgendem Befehl aus:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nansible-playbook provision_redis.yml\n<\/pre><\/div>\n\n\n<p>Achtung: Dieser Schritt kann einige Zeit dauern.<\/p>\n\n\n\n<p>Als N\u00e4chstes richten wir einen Redis KeyValue Store ein. Redis wird h\u00e4ufig f\u00fcr Caching, Sitzungsspeicher, Ratenbegrenzung oder Pub\/Sub verwendet \u2013 es ist schnell und speicherbasiert.<\/p>\n\n\n\n<p>Wir verwenden abermals `nctl`, um den Store zu erstellen, und extrahieren dann die Adresse und das Passwort aus dem YAML-Output.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Validierung:<\/h3>\n\n\n\n<p>Versuchen Sie, sich mittels CLI mit Redis zu verbinden:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nredis-cli -h &lt;redis_host&gt; -a &lt;redis_password&gt;\n<\/pre><\/div>\n\n\n<p>Sollte die Antwort \u2018PONG\u2019 sein, geht\u2019s mit dem n\u00e4chsten Abschnitt weiter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd3a Schritt 3: CloudVM provisionieren<\/h2>\n\n\n\n<p>Da nun die Datenbankdienste eingerichtet sind, k\u00f6nnen wir eine virtuelle Maschine einrichten, die als Rechen-Node fungiert. Diese VM kann sp\u00e4ter als Host f\u00fcr Applikationen oder Skripte konfiguriert werden.<\/p>\n\n\n\n<p>Speichern Sie das folgende Playbook als `provision_vm.yml`:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; gutter: false; title: ; notranslate\" title=\"\">\n# provision_vm.yml\n- name: Provision Cloud VM\n  hosts: localhost\n  gather_facts: false\n\n  vars_files:\n    - group_vars\/all.yml\n\n  tasks:\n    - name: Check if VM already exists\n      ansible.builtin.shell: &quot;nctl get cloudvirtualmachine {{ vm_name }}&quot;\n      changed_when: false\n      failed_when: false\n      register: vm_exists\n\n    - name: Create VM using nctl (wait until ready)\n      ansible.builtin.command: &gt;\n        nctl create cloudvirtualmachine {{ vm_name }}\n        --hostname {{ vm_name }}\n        --location {{ location }}\n        --machine-type {{ machine_type }}\n        --os {{ os }}\n        --public-keys &quot;{{ lookup(&#039;env&#039;, &#039;SSH_PUBLIC_KEY&#039;) }}&quot;\n        --wait\n      changed_when: &quot;vm_create_output.rc == 0&quot;\n      ignore_errors: true\n      when: &quot;vm_exists.rc != 0&quot;\n      register: vm_create_output\n\n    - name: Show VM creation output\n      ansible.builtin.debug:\n        var: vm_create_output.stdout_lines\n      when: &quot;vm_exists.rc != 0 and vm_create_output.rc == 0&quot;\n<\/pre><\/div>\n\n\n<p>Dann f\u00fchren Sie es wie folgt aus:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nansible-playbook provision_vm.yml\n<\/pre><\/div>\n\n\n<p>Achtung: Dieser Schritt kann einige Zeit in Anspruch nehmen.<\/p>\n\n\n\n<p>Nun richten wir die virtuelle Maschine ein. Dies wird unsere Rechen-Layer sein, auf der Ihre Anwendung \u2013 oder etwas anderes \u2013 l\u00e4uft.<\/p>\n\n\n\n<p>Wir verwenden erneut `nctl`: dieses Mal, um eine VM mit dem von Ihnen gew\u00fcnschten Betriebssystem-Image und SSH-Schl\u00fcssel einzurichten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Validierung:<\/h3>\n\n\n\n<p>Via SSH einloggen:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nssh root@&lt;vm_ip&gt;\n<\/pre><\/div>\n\n\n<p>Dieser Befehl best\u00e4tigt, dass der Server online, erreichbar und bereit f\u00fcr die Konfiguration ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Das Puzzle zusammenf\u00fcgen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd1a Fazit<\/h3>\n\n\n\n<p>Wir haben nun die Basis f\u00fcr ein vollst\u00e4ndig cloud-natives Deployment geschaffen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine sichere, verwaltete PostgreSQL-Instanz<\/li>\n\n\n\n<li>Ein schneller Redis-Service, bereit f\u00fcrs Caching oder Queues<\/li>\n\n\n\n<li>Eine komplett bereitgestellte und erreichbare virtuelle Maschine<\/li>\n<\/ul>\n\n\n\n<p>All das automatisiert \u00fcber Ansible und unsere API \u2013 ohne manuelles Rumgeklicke und Ratespiele.<\/p>\n\n\n\n<p>Jetzt kannst du deine Anwendung konfigurieren, Code deployen und deine Architektur skalieren \u2013 alles sauber im Code dokumentiert und einfach reproduzierbar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Muster, das wir bei Nine h\u00e4ufig beobachten, ist, dass viele unserer Kund*innen Webanwendungen betreiben \u2013 etwa Content-Management-Systeme, Webshops, Dashboards oder eigene APIs. Solche Anwendungen setzen typischerweise auf eine bew\u00e4hrte Kombination aus Infrastrukturdiensten: eine Datenbank zur Datenspeicherung, eine Cache-Schicht f\u00fcr schnelle Performance und einen Server, auf dem die Anwendungslogik l\u00e4uft.<\/p>\n","protected":false},"author":22,"featured_media":4142,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[399],"tags":[402,420],"class_list":["post-4146","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-know-how-de","tag-databases-de","tag-root-dedicated-server-cloudvm-de"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine\" \/>\n<meta property=\"og:description\" content=\"Ein Muster, das wir bei Nine h\u00e4ufig beobachten, ist, dass viele unserer Kund*innen Webanwendungen betreiben \u2013 etwa Content-Management-Systeme, Webshops, Dashboards oder eigene APIs. Solche Anwendungen setzen typischerweise auf eine bew\u00e4hrte Kombination aus Infrastrukturdiensten: eine Datenbank zur Datenspeicherung, eine Cache-Schicht f\u00fcr schnelle Performance und einen Server, auf dem die Anwendungslogik l\u00e4uft.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\" \/>\n<meta property=\"og:site_name\" content=\"Nine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/NineInternetSolutionsAG\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-03T09:40:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-25T11:23:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nine.ch\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Tim Grethler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nine_ch\" \/>\n<meta name=\"twitter:site\" content=\"@nine_ch\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tim Grethler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\"},\"author\":{\"name\":\"Tim Grethler\",\"@id\":\"https:\/\/nine.ch\/#\/schema\/person\/93048fb2bbd2927518de92d4509947df\"},\"headline\":\"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible\",\"datePublished\":\"2025-06-03T09:40:39+00:00\",\"dateModified\":\"2025-07-25T11:23:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\"},\"wordCount\":1354,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nine.ch\/#organization\"},\"image\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg\",\"keywords\":[\"Datenbanken\",\"Root-Dedicated-Server &amp; CloudVM\"],\"articleSection\":[\"Know-how\"],\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\",\"url\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\",\"name\":\"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine\",\"isPartOf\":{\"@id\":\"https:\/\/nine.ch\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg\",\"datePublished\":\"2025-06-03T09:40:39+00:00\",\"dateModified\":\"2025-07-25T11:23:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage\",\"url\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg\",\"contentUrl\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg\",\"width\":2560,\"height\":1440},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/nine.ch\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nine.ch\/#website\",\"url\":\"https:\/\/nine.ch\/\",\"name\":\"Nine\",\"description\":\"Cloud Navigators\",\"publisher\":{\"@id\":\"https:\/\/nine.ch\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nine.ch\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de-DE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nine.ch\/#organization\",\"name\":\"Nine\",\"url\":\"https:\/\/nine.ch\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/nine.ch\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2023\/11\/Logo-SVG.svg\",\"contentUrl\":\"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2023\/11\/Logo-SVG.svg\",\"caption\":\"Nine\"},\"image\":{\"@id\":\"https:\/\/nine.ch\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/NineInternetSolutionsAG\",\"https:\/\/x.com\/nine_ch\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nine.ch\/#\/schema\/person\/93048fb2bbd2927518de92d4509947df\",\"name\":\"Tim Grethler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/nine.ch\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4048ab90a263324466fea3dbfe9cb3a7968d558057e5c1d80de1f0408b013a8c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4048ab90a263324466fea3dbfe9cb3a7968d558057e5c1d80de1f0408b013a8c?s=96&d=mm&r=g\",\"caption\":\"Tim Grethler\"},\"url\":\"https:\/\/archive.5fcf01f.deploio.app\/de\/author\/tim-grethler\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/","og_locale":"de_DE","og_type":"article","og_title":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine","og_description":"Ein Muster, das wir bei Nine h\u00e4ufig beobachten, ist, dass viele unserer Kund*innen Webanwendungen betreiben \u2013 etwa Content-Management-Systeme, Webshops, Dashboards oder eigene APIs. Solche Anwendungen setzen typischerweise auf eine bew\u00e4hrte Kombination aus Infrastrukturdiensten: eine Datenbank zur Datenspeicherung, eine Cache-Schicht f\u00fcr schnelle Performance und einen Server, auf dem die Anwendungslogik l\u00e4uft.","og_url":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/","og_site_name":"Nine","article_publisher":"https:\/\/www.facebook.com\/NineInternetSolutionsAG","article_published_time":"2025-06-03T09:40:39+00:00","article_modified_time":"2025-07-25T11:23:47+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/nine.ch\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg","type":"image\/jpeg"}],"author":"Tim Grethler","twitter_card":"summary_large_image","twitter_creator":"@nine_ch","twitter_site":"@nine_ch","twitter_misc":{"Written by":"Tim Grethler","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#article","isPartOf":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/"},"author":{"name":"Tim Grethler","@id":"https:\/\/nine.ch\/#\/schema\/person\/93048fb2bbd2927518de92d4509947df"},"headline":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible","datePublished":"2025-06-03T09:40:39+00:00","dateModified":"2025-07-25T11:23:47+00:00","mainEntityOfPage":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/"},"wordCount":1354,"commentCount":0,"publisher":{"@id":"https:\/\/nine.ch\/#organization"},"image":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg","keywords":["Datenbanken","Root-Dedicated-Server &amp; CloudVM"],"articleSection":["Know-how"],"inLanguage":"de-DE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/","url":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/","name":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible - Nine","isPartOf":{"@id":"https:\/\/nine.ch\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage"},"image":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg","datePublished":"2025-06-03T09:40:39+00:00","dateModified":"2025-07-25T11:23:47+00:00","breadcrumb":{"@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/"]}]},{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#primaryimage","url":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg","contentUrl":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2025\/06\/blog_ansible-nine.jpg","width":2560,"height":1440},{"@type":"BreadcrumbList","@id":"https:\/\/nine.ch\/de\/from-zero-to-infra-building-a-production-ready-setup-using-our-api-and-ansible\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nine.ch\/de\/"},{"@type":"ListItem","position":2,"name":"Von Null auf Infra: Aufbau eines produktionsreifen Setups mit unserer API &amp; Ansible"}]},{"@type":"WebSite","@id":"https:\/\/nine.ch\/#website","url":"https:\/\/nine.ch\/","name":"Nine","description":"Cloud Navigators","publisher":{"@id":"https:\/\/nine.ch\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nine.ch\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de-DE"},{"@type":"Organization","@id":"https:\/\/nine.ch\/#organization","name":"Nine","url":"https:\/\/nine.ch\/","logo":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/nine.ch\/#\/schema\/logo\/image\/","url":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2023\/11\/Logo-SVG.svg","contentUrl":"https:\/\/archive.5fcf01f.deploio.app\/app\/uploads\/2023\/11\/Logo-SVG.svg","caption":"Nine"},"image":{"@id":"https:\/\/nine.ch\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/NineInternetSolutionsAG","https:\/\/x.com\/nine_ch"]},{"@type":"Person","@id":"https:\/\/nine.ch\/#\/schema\/person\/93048fb2bbd2927518de92d4509947df","name":"Tim Grethler","image":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/nine.ch\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4048ab90a263324466fea3dbfe9cb3a7968d558057e5c1d80de1f0408b013a8c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4048ab90a263324466fea3dbfe9cb3a7968d558057e5c1d80de1f0408b013a8c?s=96&d=mm&r=g","caption":"Tim Grethler"},"url":"https:\/\/archive.5fcf01f.deploio.app\/de\/author\/tim-grethler\/"}]}},"_links":{"self":[{"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/posts\/4146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/comments?post=4146"}],"version-history":[{"count":1,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/posts\/4146\/revisions"}],"predecessor-version":[{"id":4294,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/posts\/4146\/revisions\/4294"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/media\/4142"}],"wp:attachment":[{"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/media?parent=4146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/categories?post=4146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/archive.5fcf01f.deploio.app\/de\/wp-json\/wp\/v2\/tags?post=4146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}