15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
09.10.2024

Wie man Node.js und PM2 auf Ubuntu installiert: Ein vollständiger Produktionsleitfaden

Node.js ist eine asynchrone, ereignisgesteuerte JavaScript-Laufzeitumgebung, die auf Chromes V8-Engine aufbaut und dafür entwickelt wurde, JavaScript-Code serverseitig mit hohem Durchsatz auszuführen. PM2 ist ein produktionsreifer Prozessmanager für Node.js-Anwendungen, der Daemonisierung, automatische Absturzwiederherstellung, Log-Aggregation, Cluster-Modus-Lastverteilung und Startskript-Generierung bietet – alles über eine einzige CLI-Schnittstelle.

Dieser Leitfaden behandelt jede Installationsmethode, Konfigurationsoption und jedes Betriebsmuster, das Sie benötigen, um Node.js-Anwendungen zuverlässig auf Ubuntu 20.04, 22.04 oder 24.04 LTS in einer Produktionsumgebung zu betreiben.

Voraussetzungen

Bestätigen Sie vor dem Fortfahren Folgendes:

  • Betriebssystem: Ubuntu 20.04, 22.04 oder 24.04 LTS (Server oder Desktop)
  • Benutzerrechte: `sudo` oder Root-Zugriff
  • Netzwerkzugang: Ausgehende HTTPS-Verbindung zum Herunterladen von Paketen und Skripten
  • curl installiert: Führen Sie `sudo apt install curl -y` aus, falls noch nicht vorhanden

Wenn Sie dies auf einem Cloud-Server ausführen, ist eine VPS Hosting-Umgebung das häufigste Deployment-Ziel für Node.js-Workloads, und alles in diesem Leitfaden gilt direkt dafür.

Schritt 1: Systempakete aktualisieren

Synchronisieren Sie stets Ihren Paketindex und wenden Sie ausstehende Upgrades an, bevor Sie neue Software installieren. Veraltete Paketmetadaten sind eine häufige Quelle von Abhängigkeitskonflikten.

“`bash

sudo apt update

sudo apt upgrade -y

“`

Starten Sie nach Abschluss des Upgrades neu, wenn der Kernel aktualisiert wurde:

“`bash

sudo reboot

“`

Schritt 2: Node.js installieren – Die richtige Methode wählen

Es gibt drei primäre Installationsmethoden für Node.js unter Ubuntu. Jede hat unterschiedliche Kompromisse hinsichtlich Versionskontrolle, Isolation und systemweiter Verfügbarkeit.

Methodenvergleich

FunktionNodeSource (apt)NVMSystem apt (universe)
VersionskontrolleEinzelne fixierte HauptversionMehrere Versionen pro BenutzerTypischerweise veraltetes LTS
Systemweite InstallationJaNein (standardmäßig pro Benutzer)Ja
VersionswechselErfordert erneutes Ausführen des Setup-Skripts`nvm use <version>`Nicht unterstützt
Am besten geeignet fürCI/CD, Single-Version-ServerEntwicklung, Multi-ProjektNur zum schnellen Testen
sudo für npm-Globals erforderlichJaNeinJa
ProduktionseignungHochMittelNiedrig

Methode 1: Node.js über NodeSource installieren (Empfohlen für Server)

NodeSource pflegt aktuelle Debian/Ubuntu-Repositories für jede aktive Node.js-Release-Linie. Dies ist der bevorzugte Ansatz für Produktionsserver, auf denen eine einzelne, stabile Version systemweit erforderlich ist.

Das NodeSource-Repository für das aktuelle LTS-Release hinzufügen:

“`bash

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –

“`

Dieses Skript führt mehrere Aktionen aus: Es erkennt Ihre Ubuntu-Version, fügt das entsprechende NodeSource-apt-Repository hinzu, importiert den GPG-Signaturschlüssel und führt `apt-get update` aus. Das Flag `-E` bewahrt Ihre Umgebungsvariablen beim Eskalieren zu sudo, was wichtig ist, wenn Sie Proxy-Einstellungen konfiguriert haben.

Node.js und npm installieren:

“`bash

sudo apt install nodejs -y

“`

Das NodeSource-Paket bündelt sowohl `node` als auch `npm` in einem einzigen `nodejs`-Paket. Im Gegensatz zum Ubuntu-Universe-Paket werden sie nicht getrennt.

Die Installation überprüfen:

“`bash

node -v

npm -v

“`

Beispiel einer erwarteten Ausgabe:

“`

v20.14.0

10.7.0

“`

Auf eine bestimmte Hauptversion fixieren: Wenn Sie Node.js 18 anstelle des aktuellen LTS benötigen, ersetzen Sie `setup_lts.x` durch `setup_18.x` im curl-Befehl. Verfügbare Streams umfassen `setup_18.x`, `setup_20.x` und `setup_22.x`.

Methode 2: Node.js über NVM installieren (Empfohlen für Entwicklung und Multi-Version-Umgebungen)

NVM (Node Version Manager) installiert Node.js in Ihr Home-Verzeichnis und erfordert keine Root-Rechte weder für Node.js selbst noch für global installierte npm-Pakete. Dies beseitigt die Berechtigungsprobleme, die häufig auftreten, wenn `npm install -g` auf systemseitig installiertem Node.js ausgeführt wird.

NVM installieren:

“`bash

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

“`

Überprüfen Sie das offizielle NVM-Repository auf das neueste Release-Tag, bevor Sie diesen Befehl ausführen – die Versionsnummer in der URL ändert sich mit jedem Release.

Ihre Shell-Umgebung neu laden:

“`bash

source ~/.bashrc

“`

Wenn Sie Zsh verwenden, sourcen Sie stattdessen `~/.zshrc`. Das NVM-Installationsprogramm fügt seinen Initialisierungsblock an die Shell-Konfigurationsdatei an, die es erkennt.

Die neueste LTS-Version von Node.js installieren:

“`bash

nvm install –lts

“`

Eine bestimmte Version neben dem LTS installieren:

“`bash

nvm install 18

nvm install 20

“`

Zwischen installierten Versionen wechseln:

“`bash

nvm use 20

nvm alias default 20

“`

Der Befehl `alias default` legt die Version fest, die in neuen Shell-Sitzungen aktiviert wird, was für Skripte und Cron-Jobs entscheidend ist, die Ihr interaktives Shell-Profil nicht sourcen.

Überprüfen:

“`bash

node -v

npm -v

“`

Kritische NVM-Fallstricke für die Produktion: Da NVM benutzerbezogen ist, haben PM2-Startskripte und systemd-Units keinen Zugriff auf das NVM-verwaltete Node.js-Binary, es sei denn, Sie konfigurieren den Pfad explizit. Wie Sie damit korrekt umgehen, erfahren Sie in Schritt 5.

Schritt 3: PM2 installieren

PM2 wird als npm-Paket vertrieben und sollte global installiert werden, damit seine CLI systemweit verfügbar ist.

PM2 installieren:

“`bash

sudo npm install -g pm2

“`

Wenn Sie Node.js über NVM installiert haben, lassen Sie `sudo` weg:

“`bash

npm install -g pm2

“`

Die Installation überprüfen:

“`bash

pm2 -v

“`

Eine bestimmte PM2-Version installieren (nützlich beim Fixieren der Infrastruktur):

“`bash

sudo npm install -g pm2@5.3.1

“`

PM2 Version 5.x ist die aktuelle stabile Linie. Sie brachte im Vergleich zu v4 erhebliche Verbesserungen am Web-Dashboard (pm2 plus), der Log-Rotation und dem Modulsystem.

Schritt 4: Node.js-Anwendungen mit PM2 verwalten

Eine Anwendung starten

Navigieren Sie zu Ihrem Anwendungsverzeichnis und starten Sie es:

“`bash

cd /var/www/my-app

pm2 start app.js –name "my-app"

“`

Weisen Sie immer ein `–name`-Flag zu. Ohne es verwendet PM2 den Dateinamen als Prozessname, was mehrdeutig wird, wenn Sie mehrere Dienste haben.

Mit zusätzlichen Optionen starten:

“`bash

pm2 start app.js –name "my-app" –watch –max-memory-restart 300M

“`

  • `–watch`: Startet den Prozess neu, wenn sich Quelldateien ändern (nützlich in Staging, nicht empfohlen in der Produktion)
  • `–max-memory-restart 300M`: Startet den Prozess automatisch neu, wenn er 300 MB RSS-Speicher überschreitet – eine kritische Schutzmaßnahme gegen Speicherlecks

Laufende Prozesse anzeigen

“`bash

pm2 list

“`

Dies gibt eine Tabelle aus, die Prozess-ID, Name, Modus (Fork/Cluster), PID, Status, CPU-Auslastung, Speicherverbrauch und Neustart-Anzahl zeigt.

Für ein Echtzeit-Dashboard:

“`bash

pm2 monit

“`

Prozesse steuern

“`bash

pm2 restart my-app # Graceful restart

pm2 reload my-app # Zero-downtime reload (cluster mode only)

pm2 stop my-app # Stop without removing from process list

pm2 delete my-app # Stop and remove from process list

“`

Der Unterschied zwischen `restart` und `reload`: `restart` beendet den Prozess und startet einen neuen, was zu einer kurzen Ausfallzeit führt. `reload` (nur im Cluster-Modus verfügbar) wechselt Worker nacheinander aus und erhält dabei die Verfügbarkeit aufrecht. Verwenden Sie in Produktions-Cluster-Deployments immer `reload`.

Log-Verwaltung

“`bash

pm2 logs # Stream logs from all processes

pm2 logs my-app # Stream logs for a specific process

pm2 logs my-app –lines 200 # Show last 200 lines

pm2 flush # Clear all log files

“`

PM2 speichert Logs standardmäßig unter `~/.pm2/logs/`. Für Produktionsserver installieren Sie das Log-Rotationsmodul, um Festplattenerschöpfung zu verhindern:

“`bash

pm2 install pm2-logrotate

pm2 set pm2-logrotate:max_size 50M

pm2 set pm2-logrotate:retain 10

pm2 set pm2-logrotate:compress true

“`

Dies rotiert Logs, wenn sie 50 MB erreichen, behält 10 komprimierte Archive und verhindert unkontrolliertes Log-Wachstum – ein häufiges Problem auf lang laufenden Servern, das oft erst bemerkt wird, wenn der Festplattenspeicher erschöpft ist.

Schritt 5: PM2 für den Systemstart konfigurieren

PM2 muss so konfiguriert werden, dass es Server-Neustarts übersteht. Dies wird über eine von PM2 selbst generierte systemd-Service-Unit gehandhabt.

Den Startbefehl generieren:

“`bash

pm2 startup

“`

PM2 gibt einen auf Ihr Init-System und den aktuellen Benutzer zugeschnittenen Befehl aus. Er sieht so aus:

“`

[PM2] Init System found: systemd

[PM2] To setup the Startup Script, copy/paste the following command:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu

“`

Kopieren und führen Sie genau diesen Befehl aus. Ändern Sie ihn nicht – der Pfad zum PM2-Binary und das Home-Verzeichnis müssen mit der Konfiguration Ihres Systems übereinstimmen.

NVM-spezifische Startkonfiguration: Wenn Sie Node.js über NVM installiert haben, zeigt der Pfad im generierten Befehl auf Ihr NVM-verwaltetes Binary. Dies ist korrekt, aber Sie müssen sicherstellen, dass die NVM-Version als Standard gesetzt ist, bevor Sie `pm2 startup` ausführen:

“`bash

nvm alias default 20

pm2 startup

“`

Die aktuelle Prozessliste speichern:

“`bash

pm2 save

“`

Dies schreibt die Prozessliste in `~/.pm2/dump.pm2`. Beim Neustart liest die systemd-Unit diese Datei und stellt alle gespeicherten Prozesse wieder her. Wenn Sie später Anwendungen hinzufügen oder entfernen, führen Sie `pm2 save` erneut aus, um den Snapshot zu aktualisieren.

Überprüfen, ob die systemd-Unit aktiv ist:

“`bash

systemctl status pm2-ubuntu

“`

Ersetzen Sie `ubuntu` durch Ihren tatsächlichen Benutzernamen.

Schritt 6: Produktions-Deployment mit PM2-Ecosystem-Dateien

Für alles, was über eine einzelne Skriptanwendung hinausgeht, verwenden Sie PM2s Ecosystem-Konfigurationsdatei. Sie bietet reproduzierbare, versionskontrollierte Prozessdefinitionen und macht es überflüssig, sich lange CLI-Flags zu merken.

Die Ecosystem-Datei generieren

“`bash

pm2 ecosystem

“`

Dies erstellt `ecosystem.config.js` im aktuellen Verzeichnis.

Eine produktionsreife Ecosystem-Konfiguration

“`javascript

module.exports = {

apps: [

{

name: 'api-server',

script: './src/server.js',

instances: 'max',

exec_mode: 'cluster',

watch: false,

max_memory_restart: '500M',

log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

error_file: '/var/log/pm2/api-server-error.log',

out_file: '/var/log/pm2/api-server-out.log',

merge_logs: true,

env: {

NODE_ENV: 'development',

PORT: 3000

},

env_production: {

NODE_ENV: 'production',

PORT: 8080

}

},

{

name: 'worker',

script: './src/worker.js',

instances: 2,

exec_mode: 'fork',

cron_restart: '0 2 * * *',

env_production: {

NODE_ENV: 'production'

}

}

]

};

“`

Wichtige Konfigurationsentscheidungen erklärt:

  • `instances: 'max'`: PM2 erzeugt automatisch einen Worker pro logischem CPU-Kern. Auf einem 4-Kern-Server werden dadurch 4 Node.js-Prozesse erstellt, die die Hardware vollständig ausnutzen.
  • `exec_mode: 'cluster'`: Verwendet das in Node.js integrierte Cluster-Modul. Alle Instanzen teilen sich denselben Port durch den Socket-Lastausgleich des Betriebssystems.
  • `exec_mode: 'fork'`: Führt den Prozess als eigenständigen Kindprozess aus. Erforderlich für Anwendungen, die keine HTTP-Server sind (Queue-Worker, geplante Jobs, WebSocket-Server mit Sticky Sessions).
  • `merge_logs: true`: Kombiniert stdout aller Cluster-Instanzen in einer einzigen Log-Datei, was die Log-Analyse erheblich erleichtert.
  • `cron_restart`: Plant automatische Neustarts mit Cron-Syntax. Nützlich für Worker, die Zustand ansammeln, oder für die Anwendung nächtlicher Konfigurationsänderungen.

Mit der Ecosystem-Datei starten

“`bash

pm2 start ecosystem.config.js –env production

pm2 save

“`

Zero-Downtime-Deployment-Workflow

Beim Deployment einer neuen Version Ihrer Anwendung:

“`bash

git pull origin main

npm install –production

pm2 reload ecosystem.config.js –env production

“`

`pm2 reload` sendet ein `SIGINT` an jeden Worker nacheinander, wartet darauf, dass der neue Worker bereit ist, und beendet dann den alten. Ihre Anwendung muss `SIGINT` ordnungsgemäß behandeln und die Bereitschaft mit `process.send('ready')` signalisieren, damit dies korrekt funktioniert.

Graceful-Shutdown-Handler in Ihrer Anwendung:

“`javascript

process.on('SIGINT', () => {

server.close(() => {

console.log('HTTP server closed');

process.exit(0);

});

});

“`

Schritt 7: PM2-Monitoring und Observability

Integriertes Monitoring

“`bash

pm2 monit

“`

Zeigt Echtzeit-CPU- und Speichergraphen für jeden Prozess im Terminal an.

Prozessinformationen

“`bash

pm2 show my-app

“`

Gibt detaillierte Metadaten aus: Laufzeit, Neustart-Anzahl, Versionierung, Interpreter-Pfad, Umgebungsvariablen und Log-Dateispeicherorte.

PM2-Web-Dashboard (PM2 Plus)

PM2 bietet ein gehostetes Monitoring-Dashboard unter pm2.io. Verbinden Sie Ihren Server:

“`bash

pm2 link <secret_key> <public_key>

“`

Dies bietet historische Metriken, Alarmierung und Remote-Prozessverwaltung – besonders wertvoll bei der Verwaltung mehrerer Server oder wenn Sie Sichtbarkeit ohne SSH-Zugriff benötigen.

Schritt 8: Node.js und PM2 aktualisieren

PM2 aktualisieren

“`bash

sudo npm install -g pm2@latest

pm2 update

“`

`pm2 update` ist nach dem Upgrade des PM2-Binaries unerlässlich – es aktualisiert den PM2-Daemon im Speicher, ohne laufende Prozesse zu unterbrechen.

Node.js über NodeSource aktualisieren

Führen Sie das Setup-Skript für die neue Hauptversion erneut aus:

“`bash

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash –

sudo apt install nodejs -y

“`

Starten Sie nach der Aktualisierung von Node.js PM2 neu, um sicherzustellen, dass es das neue Binary verwendet:

“`bash

pm2 restart all

“`

Node.js über NVM aktualisieren

“`bash

nvm install 22

nvm alias default 22

nvm use 22

pm2 restart all

“`

Wenn Sie die Standard-NVM-Version geändert haben, generieren Sie das PM2-Startskript neu, um den Binary-Pfad in der systemd-Unit zu aktualisieren:

“`bash

pm2 unstartup

pm2 startup

pm2 save

“`

Überlegungen zur Sicherheitshärtung

Der Betrieb von Node.js-Anwendungen in der Produktion erfordert Aufmerksamkeit über das Prozessmanagement hinaus:

  • Als Nicht-Root-Benutzer ausführen: Führen Sie PM2 oder Node.js niemals als Root aus. Erstellen Sie einen dedizierten Systembenutzer (`adduser –system –group nodeapp`) und führen Sie PM2 unter diesem Konto aus.
  • Verwaltung von Umgebungsvariablen: Kodieren Sie Geheimnisse nicht fest in `ecosystem.config.js`. Verwenden Sie eine `.env`-Datei, die über `dotenv` geladen wird, oder injizieren Sie Geheimnisse über Ihre Deployment-Pipeline. Die Ecosystem-Datei wird typischerweise in die Versionskontrolle eingecheckt.
  • Reverse Proxy: Stellen Sie Nginx oder Caddy vor Ihre Node.js-Anwendung. Dies übernimmt TLS-Terminierung, Bereitstellung statischer Dateien, Rate-Limiting und Request-Buffering. Kombinieren Sie dies mit einer SSL Certificates-Lösung zur Durchsetzung von HTTPS.
  • Firewall-Regeln: Blockieren Sie den direkten Zugriff auf Ihren Node.js-Port (z. B. 3000, 8080) aus dem öffentlichen Internet. Nur der Reverse Proxy sollte mit Node.js kommunizieren.
  • Ressourcenlimits: Setzen Sie `max_memory_restart` in PM2 und konfigurieren Sie `ulimit`-Werte auf Systemebene, um zu verhindern, dass ein einzelner unkontrollierter Prozess den Server destabilisiert.

Für hochfrequentierte Produktions-Deployments, bei denen Ressourcenisolierung kritisch ist, bietet eine Dedicated Servers-Umgebung vollständige Hardware-Kontrolle und eliminiert das Noisy-Neighbor-Problem, das gemeinsam genutzter Infrastruktur inhärent ist.

Die richtige Hosting-Umgebung für Node.js wählen

WorkloadEmpfohlene UmgebungBegründung
Persönliche Projekte, Staging[VPS Hosting](https://alexhost.com/de/vps/)Kostengünstig, vollständiger Root-Zugriff, skalierbar
Hochfrequentierte APIs[Dedicated Servers](https://alexhost.com/de/dedicated-servers/)Vorhersehbare Leistung, keine Ressourcenkonflikte
ML-Inferenz + Node.js[GPU Hosting](https://alexhost.com/de/gpu-hosting/)Rechenintensive Aufgaben auf GPU-Worker auslagern
Verwaltetes Control Panel[VPS with cPanel](https://alexhost.com/de/vps/control-panels/cpanel-vps/)GUI-basierte Prozess- und Dateiverwaltung

Technische Entscheidungs-Checkliste

Verwenden Sie diese Checkliste vor dem Deployment von Node.js und PM2 in der Produktion:

  • [ ] Node.js über NodeSource (Server) oder NVM (Entwicklung) installiert – nicht das Ubuntu-Universe-Paket
  • [ ] PM2 global mit den korrekten Berechtigungen für Ihre Installationsmethode installiert
  • [ ] Anwendung mit `–name`-Flag und einem definierten `–max-memory-restart`-Schwellenwert gestartet
  • [ ] Cluster-Modus für HTTP-Server aktiviert; Fork-Modus für Hintergrund-Worker verwendet
  • [ ] `pm2 startup` ausgeführt und der generierte Befehl mit sudo ausgeführt
  • [ ] `pm2 save` ausgeführt, nachdem alle Prozesse konfiguriert sind
  • [ ] Log-Rotationsmodul installiert und konfiguriert
  • [ ] Nginx oder Caddy als Reverse Proxy mit TLS konfiguriert
  • [ ] Anwendung behandelt `SIGINT` ordnungsgemäß für Zero-Downtime-Reloads
  • [ ] Geheimnisse außerhalb von `ecosystem.config.js` verwaltet
  • [ ] PM2-systemd-Unit mit `systemctl status pm2-<username>` überprüft
  • [ ] Firewall blockiert direkten Zugriff auf Node.js-Ports aus dem öffentlichen Internet

FAQ

Was ist der Unterschied zwischen PM2-Fork-Modus und Cluster-Modus?

Der Fork-Modus erzeugt die Anwendung als einzelnen Kindprozess – eine Instanz, ein genutzter CPU-Kern. Der Cluster-Modus verwendet das native Cluster-Modul von Node.js, um mehrere Worker-Prozesse zu erzeugen, die alle denselben TCP-Port teilen, was echte Multi-Core-Nutzung und Zero-Downtime-Reloads ermöglicht. Verwenden Sie den Cluster-Modus für HTTP/HTTPS-Server und den Fork-Modus für Worker, Cron-Jobs oder Anwendungen, die internen Zustand pflegen, der mit Multi-Prozess-Sharing inkompatibel ist.

Warum startet PM2 nach einem Server-Neustart nicht, obwohl ich `pm2 startup` ausgeführt habe?

Die häufigste Ursache ist, dass `pm2 save` nach der Konfiguration der Prozesse nicht ausgeführt wurde, sodass die Dump-Datei leer oder nicht vorhanden ist. Die zweithäufigste Ursache ist ein NVM-Pfadkonflikt: Wenn die NVM-Standardversion nach der Generierung des Startskripts geändert wurde, zeigt die systemd-Unit auf ein nicht vorhandenes Binary. Lösen Sie dies, indem Sie `pm2 unstartup` ausführen, den korrekten NVM-Standard setzen und dann `pm2 startup` und `pm2 save` erneut ausführen.

Kann PM2 Nicht-Node.js-Prozesse verwalten?

Ja. PM2 kann jede ausführbare Datei verwalten, indem der Interpreter angegeben wird. Zum Beispiel: `pm2 start script.py –interpreter python3`. Dies macht PM2 zu einem nützlichen Allzweck-Prozesssupervisor für mehrsprachige Microservice-Architekturen.

Wie betreibe ich mehrere Node.js-Anwendungen auf verschiedenen Ports hinter einem einzelnen Server?

Definieren Sie jede Anwendung als separaten Eintrag in `ecosystem.config.js` mit unterschiedlichen `PORT`-Umgebungsvariablen. Konfigurieren Sie Nginx als Reverse Proxy mit separaten `server`-Blöcken oder `location`-Direktiven, die zu jedem Port weiterleiten. Alle Anwendungen teilen sich denselben PM2-Daemon und werden über eine einzige `pm2 list`-Ansicht verwaltet.

Sollte ich NVM oder NodeSource für einen Produktions-VPS verwenden?

NodeSource ist für Produktionsserver generell vorzuziehen. Es installiert Node.js als Systempaket und macht es für alle Benutzer und Systemdienste ohne Shell-Initialisierungsabhängigkeiten verfügbar. NVMs benutzerbezogenes, shell-spezifisches Aktivierungsmodell führt zu subtilen Fehlerquellen in systemd-Units, Cron-Jobs und CI/CD-Pipelines, die außerhalb einer interaktiven Shell-Sitzung ausgeführt werden. Reservieren Sie NVM für lokale Entwicklungsmaschinen, auf denen die gleichzeitige Verwaltung mehrerer Node.js-Versionen eine echte Anforderung ist.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen