{"id":10796,"date":"2023-08-19T11:17:04","date_gmt":"2023-08-19T09:17:04","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=10796"},"modified":"2023-08-19T11:19:48","modified_gmt":"2023-08-19T09:19:48","slug":"node-js-auf-dem-raspberry-pi-installieren-2-empfehlenswerte-wege","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/node-js-auf-dem-raspberry-pi-installieren-2-empfehlenswerte-wege\/","title":{"rendered":"Node.js auf dem Raspberry Pi installieren &#038; &#8222;Hallo Welt&#8220; Webserver starten: 2 empfehlenswerte Wege"},"content":{"rendered":"<p>Mit Node.js hat Google JavaSkript mit der Laufzeitumgebung V8 aus dem Browser geholt. Die Skriptsprache kann nun auch zur Entwicklung von Desktop- oder Serveranwendungen genutzt werden. Daraus entwickelte sich ein \u00d6kosystem. In diesem Beitrag zeige ich dir, wie du Node.js auf einem Raspberry Pi und anderen Debian-Servern installieren kannst. Zur Demonstration werden wir mittels JavaSkript einen Webserver starten. Diesen kannst du als Grundlage nutzen oder durch eigenen Code ersetzen &#8211; je nachdem, welches Projekt du umsetzen m\u00f6chtest.<\/p>\n<h2 class=\"wp-block-heading\">Macht Node.js auf dem Raspberry Pi \u00fcberhaupt Sinn?<\/h2>\n<p>Die g\u00e4ngigste Skriptsprache in der Raspberry Pi Welt ist Python. Speziell f\u00fcr Einsteiger, hardwarenahe Projekte und ohne besondere Anforderungen ist das eine gute Wahl: Es gibt viele Bibliotheken, gerade bei Hardware ist es ggf. sogar die einzige unterst\u00fctzte Sprache. M\u00f6chte man hingegen eine 0815 Webanwendung entwickeln, die z.B. wegen des geringen Energiebedarfs aus dem Raspberry Pi betrieben werden soll, ist das unproblematisch. Sie kann auch auf einen X86 Server umgezogen oder von dort auf den Pi migriert werden.<\/p>\n<p>Auch f\u00fcr hardwarenahe Projekte existieren teilweise (inoffizielle) Node.js Pakete &#8211; die Plattform ist daf\u00fcr also nicht grunds\u00e4tzlich ausgeschlossen. Wie so oft kommt es also auf den Anwendungsfall an. Meine grunds\u00e4tzliche Empfehlung: Entscheide dich aus nachvollziehbaren Gr\u00fcnden f\u00fcr oder gegen eine Sprache, Bibliothek, Framework usw. Nicht, weil es gerade im Trend liegt oder man das schon immer so gemacht hat. Anders sieht es nat\u00fcrlich aus, wenn du eine Technologie lediglich (praktisch) kennen lernen m\u00f6chtest.<\/p>\n<h2 class=\"wp-block-heading\">Das Node.js \u00d6kosystem ist nicht nur f\u00fcr Entwickler interessant<\/h2>\n<p>Selbst etwas mit Node.js programmieren zu wollen, ist \u00fcbrigens nicht der einzige Grund f\u00fcr die Installation: Damit erh\u00e4ltst du auch den Paketmanager NPM. Neben Bibliotheken, die du in deinen Code einbauen kannst, stellt er auch Kommandozeilenwerkzeuge bereit &#8211; also fertige Software, die du dar\u00fcber installieren und direkt starten kannst. In dieser Hinsicht kann NPM vereinzelt eine Alternative zu APT, Docker &amp; co sein. <\/p>\n<p>Ein Beispiel ist <a href=\"https:\/\/github.com\/aksakalli\/gtop\" target=\"_blank\" rel=\"nofollow\">gtop<\/a>: Das Werkzeug erm\u00f6glicht die \u00dcberwachung von Prozessor, Arbeitsspeicher und Netzwerk, inklusive grafischer Ausgabe. Auch <a href=\"https:\/\/github.com\/ether\/etherpad-lite\" target=\"_blank\" rel=\"nofollow\">Etherpad<\/a> ben\u00f6tigt JavaSkript, damit man dar\u00fcber mit mehreren Personen in Echtzeit an Dokumenten arbeiten kann. In diesem Falle handelt es sich um eine Webanwendung. Wer Angular oder Webpack verwenden m\u00f6chte, kann die offizielle CLI nutzen, um etwa Projekte zu erstellen. Das Node.js \u00d6kosystem ist zwar insgesamt gesehen von der Vielfalt der Pakete weit weg, klassischen Quellen wie APT ernste Konkurrenz zu machen. Aber wer bestimmte Software benutzen m\u00f6chte, ben\u00f6tigt eben zumindest NPM oder teilweise sogar Node.js auf dem System.<\/p>\n<h2 class=\"wp-block-heading\">2 Methoden, Node.js zu installieren<\/h2>\n<p>Ich zeige dir im folgenden drei verschiedene Methoden mit ihren Vor- und Nachteilen auf. Sie lassen sich oft auch auf die Installation anderer Software anwenden &#8211; hier fokussieren wir uns auf Node.js. In beiden F\u00e4llen habe ich einen kleinen Webserver vorbereitet, den wir per JS starten m\u00f6chten &#8211; unabh\u00e4ngig davon, f\u00fcr welche der Varianten du dich entscheidest. Der Code wird im Beispiel in der Datei <strong>app\/server.js<\/strong> abgelegt.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst host = &#039;0.0.0.0&#039;\nconst port = 8080\n\nconst requestListener = function (req, res) {\n    console.log(`${new Date()} ${req.method} ${req.url}`)\n    res.writeHead(200);\n    res.end(`&lt;h1 style=&quot;font-family: sans-serif; text-align: center&quot;&gt;Hallo vom Node.js Webserver auf dem Raspberry Pi :)&lt;\/h1&gt;`);\n}\nconst http = require(&quot;http&quot;)\nconst server = http.createServer(requestListener)\n\nvar process = require(&#039;process&#039;)\nprocess.on(&#039;SIGTERM&#039;, () =&gt; {\n  server.close()\n})\n\nserver.listen(port, host, () =&gt; {\n    console.log(`Server is running on http:\/\/${host}:${port}`);\n})\n<\/pre>\n<\/div>\n<h3 class=\"wp-block-heading\">Methode #1: Als Container mit Docker (oder Alternativen wie Podman)<\/h3>\n<p>Der in meinen Augen beste Weg ist die Verwendung von Containern: Deine Anwendung wird vom Betriebssystem isoliert und du hast maximale Kontrolle dar\u00fcber, welche Node.js Version eingesetzt wird. Au\u00dferdem ist es kein Problem, falls du mehrere Programme mit verschiedenen Node.js Versionen betreiben m\u00f6chtest: Du kannst beliebig viele Container erstellen und anhand des Images (Abbildes) individuell entscheiden, welcher Container mit welcher Version l\u00e4uft. Als Grundlage musst du daf\u00fcr Docker oder eine andere OCI-Kompatible Laufzeitumgebung wie z.B. Podman installieren. F\u00fcr Kommandozeilenwerkzeuge ist dieser Weg ein wenig langsamer, da man einen Alias anlegen muss, der im Hintergrund den Container startet. M\u00f6glich ist es trotzdem. Wer Tools global installieren m\u00f6chte, kann sich alternativ den zweiten Weg anschauen.<\/p>\n<p>Wie Docker auf dem Raspberry Pi sowie jedem Debian-System installiert werden kann, <a href=\"https:\/\/u-labs.de\/portal\/docker-auf-dem-raspberry-pi-installieren-erste-container-starten-einfach-erklaert\/\" data-type=\"post\" data-id=\"7393\">habe ich in diesem Beitrag bereits gezeigt<\/a>. Dar\u00fcber hinaus <a href=\"https:\/\/u-labs.de\/portal\/einfuehrung-das-ist-docker-compose-und-so-installierst-du-es-auf-dem-raspberry-pi\/\" data-type=\"post\" data-id=\"7859\">ben\u00f6tigst du Docker-Compose<\/a>, es erleichtert die Handhabung von Containern erheblich. Falls du beide Programme noch nicht installiert hast, musst du dies bei dieser Methode zun\u00e4chst \u00fcber die verlinkten Beitr\u00e4ge durchf\u00fchren.<\/p>\n<p>Sucht euch <a href=\"https:\/\/hub.docker.com\/_\/node\/\" data-type=\"URL\" data-id=\"https:\/\/hub.docker.com\/_\/node\/\" target=\"_blank\" rel=\"nofollow\">im Docker-Hub<\/a> die gew\u00fcnschte Version von Node.js heraus. Falls es keine besonderen Anforderungen gibt und ihr euch unsicher seid, nutzt die aktuellste LTS. Welche das ist, steht auf der Homepage. Zum Erstellzeitpunkt des Beitrages war das Version 18. Ich w\u00fcrde bevorzugt ein m\u00f6glichst kleines Image nutzen, entweder die Slim-Version des aktuellsten Debian (derzeit Bookworm). <a href=\"https:\/\/u-labs.de\/portal\/nur-103-mb-alpine-linux-getestet-kleine-simple-und-sichere-linux-distribution-fuer-den-raspberry-pi\/\" data-type=\"post\" data-id=\"8298\">Oder Alpine<\/a>, sofern die schlanke Distribution f\u00fcr euch kein Problem darstellt. Mit <strong>18-slim<\/strong> erhaltet ihr die aktuellste Debian-Version, sodass ihr euch nur \u00fcber die Node.js Version Gedanken machen m\u00fcsst. Alternativ kann man nat\u00fcrlich auch eine exakte Version (z.B. 18.17.0 ) nutzen &#8211; hier m\u00fcsst ihr aber jede Aktualisierung erst einmal mitbekommen und von Hand einspielen!<\/p>\n<p>Wir legen ein <strong>Dockerfile<\/strong> an und geben in der ersten Zeile unser gew\u00fcnschtes Abbild an:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nFROM node:18-slim\nWORKDIR \/app\nCOPY app\/* .\nCMD &#x5B; &quot;node&quot;, &quot;server.js&quot; ]\n<\/pre>\n<\/div>\n<p>Dazu eine \u00fcbersichtliche <strong>docker-compose.yml<\/strong>, die ebenfalls recht \u00fcberschaubar ist &#8211; sie muss nur den Container aus dem Dockerfile erstellen und den Port 80 des Webservers an den Host weiterleiten.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nservices:\n  node-web:\n    build: .\n    mem_limit: 0.5G\n    ports:\n      - 8080:8080\n<\/pre>\n<\/div>\n<p>Der gesamte Ordner <strong>app<\/strong> im aktuellen Arbeitsverzeichnis wird in das Image kopiert. Darin erstellen wir nun eine JavaSkript-Datei namens <strong>server.js<\/strong>, die im Dockerfile als Einstiegspunkt angegeben ist. Dort geh\u00f6rt unser Programmcode hinein. Beispielhaft habe ich einen kleinen Webserver erstellt, der auf jede Anfrage mit einer Standard-Antwort reagiert. <\/p>\n<p>Die Struktur unseres Verzeichnisses sollte nun wie folgt aussehen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n\u251c\u2500\u2500 app\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 server.js\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 Dockerfile\n<\/pre>\n<\/div>\n<p>Nun k\u00f6nnen wir Docker Compose das Image bauen lassen und uns daraus einen Container erzeugen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndocker compose up --build\n<\/pre>\n<\/div>\n<p>Dieser startet im Vordergrund und wir sollten nach kurzer Wartezeit den Webserver starten, der uns dies mit der im Code festgelegten Logmeldung best\u00e4tigt:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndaniel@pi:~\/node-docker $ docker compose up --build\n&#x5B;+] Building 0.8s (8\/8) FINISHED                                                                                                                                                              \n&#x5B;...]\n \u2714 Container node-docker-node-demo-1  Created                                                                                                                                            0.0s \nAttaching to node-docker-node-demo-1\nnode-docker-node-demo-1  | Server is running on http:\/\/0.0.0.0:8080\n<\/pre>\n<\/div>\n<p>Nun kann man im gleichen Netzwerk per Browser \u00fcber den Hostname des Raspberry Pi (hier &#8222;pi&#8220;) und den Port 8080 den Webserver aufrufen (z.B. http:\/\/pi:8080). Dieser liefert uns die ebenfalls im Code festgelegte Begr\u00fc\u00dfungsseite:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik.png\"><img loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"252\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik.png\" alt=\"\" class=\"wp-image-10799\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik.png 789w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-300x96.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-768x245.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-730x233.png 730w\" sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/a><\/figure>\n<\/div>\n<h3 class=\"wp-block-heading\">Methode #2: Inoffizielle Paketquellen von Node.js<\/h3>\n<p>F\u00fcr manche Anwendungsf\u00e4lle kann oder m\u00f6chte man Docker nicht benutzen und stattdessen lieber Node.js direkt auf dem Pi installieren. Daf\u00fcr werden Paketquellen angeboten, die eigenst\u00e4ndig von Node.js betreut werden &#8211; also keine offiziellen von Debian oder des Raspberry Pi OS. Da die Pakete dort sowohl f\u00fcr X86 als auch ARM angeboten werden, kann man sie auf einem X86 Debian Server oder PC eben so nutzen, wie auf einem Raspberry Pi. Solche Drittanbieter-Paketquellen k\u00f6nnen das System gef\u00e4hrden, sowohl hinsichtlich Sicherheit, als auch der Stabilit\u00e4t. Sie sollten daher sparsam sowie nur von vertrauensw\u00fcrdigen Quellen eingesetzt werden. Im Gegensatz zu den offiziellen Raspberry Pi OS\/Debian-Paketquellen sind sie aktueller.<\/p>\n<p>Zur Installation werden <a href=\"https:\/\/github.com\/nodesource\/distributions#installation-instructions\" target=\"_blank\" rel=\"nofollow\">im GitHub-Repository verschiedene Skripte f\u00fcr die Hauptversionen<\/a> aufgelistet. Man kann sich somit systemweit f\u00fcr eine bestimmte Hauptversion entscheiden. Diese direkt als root mit der Bash aufzurufen, w\u00fcrde ich aus Sicherheitsgr\u00fcnden nicht empfehlen. Stattdessen besser das Skript herunterladen, abspeichern, mit einem Texteditor pr\u00fcfen und dann ausf\u00fchren. Trotz Sichtpr\u00fcfung nutze ich bei fremden Skripten gerne den -x Schalter: Er gibt die Befehle mit eingesetzten Werten aus Variablen aus. So seht ihr, welche \u00c4nderungen das Skript tats\u00e4chlich vornimmt. Ich habe mich f\u00fcr die derzeitige LTS-Version 18 entschieden. Sofern nicht eine bestimmte Version oder die neuesten Versionen ben\u00f6tigt werden, ist LTS die aktuelle LTS-Version in der Regel eine gute Wahl.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ncurl https:\/\/deb.nodesource.com\/setup_18.x -o nodejs18.sh\nnano nodejs18.sh\nsudo bash -x nodejs18.sh\n<\/pre>\n<\/div>\n<p>In diesem Falle legt das Skript eine Paketquelle mit dazugeh\u00f6rigem Quellcode von Nodesource (<a href=\"https:\/\/nodejs.org\/en\/download\/package-manager#debian-and-ubuntu-based-linux-distributions\" data-type=\"URL\" data-id=\"https:\/\/nodejs.org\/en\/download\/package-manager#debian-and-ubuntu-based-linux-distributions\" target=\"_blank\" rel=\"nofollow\">offizieller Vertriebskanal von Node.js<\/a>) an und importiert dessen Schl\u00fcssel.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndaniel@pi:~ $ cat \/etc\/apt\/sources.list.d\/nodesource.list \ndeb &#x5B;signed-by=\/usr\/share\/keyrings\/nodesource.gpg] https:\/\/deb.nodesource.com\/node_18.x bullseye main\ndeb-src &#x5B;signed-by=\/usr\/share\/keyrings\/nodesource.gpg] https:\/\/deb.nodesource.com\/node_18.x bullseye mai\n<\/pre>\n<\/div>\n<p>Diese Paketquelle <em>\u00fcberschreibt<\/em> das vom Raspberry Pi OS ausgelieferte veraltete Paket, sodass ihr nun unter dem gleichen Name die Hauptversion erhaltet, deren Skript ihr zuvor heruntergeladen habt:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndaniel@pi:~ $ apt show nodejs\nPackage: nodejs\nVersion: 18.17.0-deb-1nodesource1\n<\/pre>\n<\/div>\n<p>Nach der Installation wird das Paket \u00fcber die zentrale APT-Paketverwaltung aktuell gehalten: Wie von Debian und dem Raspberry Pi OS gewohnt, holt man sich die Liste der neuen Pakete mit <strong>apt update<\/strong>. Hierf\u00fcr fragt APT ebenfalls die Nodesource-Quelle an. Anschlie\u00dfend werden m\u00f6glicherweise vorhandene Aktualisierungen mit <strong>apt upgrade<\/strong> installiert.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"767\" height=\"239\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-1.png\" alt=\"\" class=\"wp-image-10801\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-1.png 767w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-1-300x93.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-1-730x227.png 730w\" sizes=\"auto, (max-width: 767px) 100vw, 767px\" \/><\/a><\/figure>\n<\/div>\n<p>Um unseren Node.js Webserver zu starten, steht nun der <strong>node<\/strong> Befehl systemweit zur Verf\u00fcgung:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndaniel@pi:~ $ node app\/server.js \nServer is running on http:\/\/0.0.0.0:8080\n<\/pre>\n<\/div>\n<p>Analog dazu auch der Paketmanager <strong>npm<\/strong>, \u00fcber den Pakete installiert werden k\u00f6nnen &#8211; beispielsweise der Prozessmanager gtop, der zuvor bereits als Beispiel erw\u00e4hnt wurde:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nnpm install -g gtop\n<\/pre>\n<\/div>\n<p>Anschlie\u00dfend kann man den Befehl (hier <strong>gtop<\/strong>) ebenfalls systemweit aufrufen. Aus Nutzersicht gibt es keinen Unterschied gegen\u00fcber Software, die per APT installiert wurde. Nicht vergessen werden sollte jedoch: Da NPM eigenst\u00e4ndig ist, werden die Pakete nicht zentral per APT aktualisiert! Empfehlenswert ist daher, solche h\u00e4ndischen Installationen zu dokumentieren und regelm\u00e4\u00dfige Pr\u00fcfungen auf Aktualisierungen vorzunehmen.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"539\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2-1024x539.png\" alt=\"\" class=\"wp-image-10802\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2-1024x539.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2-300x158.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2-768x404.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2-684x360.png 684w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2023\/07\/grafik-2.png 1500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Mit Node.js hat Google JavaSkript mit der Laufzeitumgebung V8 aus dem Browser geholt. Die Skriptsprache kann nun auch zur Entwicklung von Desktop- oder Serveranwendungen genutzt werden. Daraus entwickelte sich ein \u00d6kosystem. In diesem Beitrag zeige ich dir, wie du Node.js auf einem Raspberry Pi und anderen Debian-Servern installieren kannst. Zur Demonstration werden wir mittels JavaSkript &#8230;<\/p>\n","protected":false},"author":5,"featured_media":10891,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[391,61],"tags":[497,817],"class_list":["post-10796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-server","category-softwareentwicklung","tag-docker","tag-nodejs"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/10796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=10796"}],"version-history":[{"count":3,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/10796\/revisions"}],"predecessor-version":[{"id":10893,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/10796\/revisions\/10893"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/10891"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=10796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=10796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=10796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}