API, Next.js- oder Express-Website, Discord-Bot: Eine Node.js-Anwendung lässt sich nicht einfach mit einem einfachen node index.js auf einem Server. Sie muss nach einem Absturz neu starten, beim Hochfahren des VPS automatisch neu gestartet werden, ihre Protokolle müssen gespeichert werden und sie muss über HTTPS bereitgestellt werden. PM2 übernimmt die ersten drei Punkte, Nginx den letzten.
1. Node.js installieren
Die von Ubuntu und Debian bereitgestellte Node.js-Version ist oft veraltet. Installieren Sie die aktuelle LTS-Version (Long-Term-Support) aus dem NodeSource-Repository und überprüfen Sie anschließend:
curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
bash nodesource_setup.sh
apt install -y nodejs
node -v && npm -v
Verwenden Sie in der Produktion stets eine LTS-Version: Zwischenversionen werden nur wenige Monate lang gepflegt.
2. Den Code bereitstellen
Führen Sie die Anwendung unter einem eigenen Benutzer aus, niemals als Root. Laden Sie den Code herunter – idealerweise aus einem Git-Repository – und installieren Sie anschließend die Abhängigkeiten:
adduser --disabled-password --gecos "" app
su - app
git clone https://github.com/votre-compte/votre-projet.git monapp
cd monapp
npm ci --omit=dev
npm ci installiert genau die Versionen der Datei package-lock.json, wodurch sichergestellt wird, dass der Server dieselben Abhängigkeiten verwendet wie Ihr Rechner. Wenn das Projekt kompiliert werden muss, wie beispielsweise eine Next.js- oder TypeScript-Anwendung, installieren Sie bitte alle Abhängigkeiten und führen Sie anschließend folgenden Befehl aus: npm run build.
Speichern Sie vertrauliche Daten, wie beispielsweise das Bot-Token oder die Zugangsdaten zur Datenbank, in einer Datei .env außerhalb des Git-Repositorys, nur für diesen Benutzer lesbar: chmod 600 .env.
3. Mit PM2 starten
Installieren Sie PM2 systemweit als Root und starten Sie die Anwendung anschließend unter dem Benutzer app :
npm install -g pm2
su - app
cd monapp
pm2 start index.js --name monapp
pm2 status
Sollte die Anwendung abstürzen, startet PM2 sie sofort neu. Für ein Projekt, das mit einem npm-Skript gestartet wird, verwenden Sie pm2 start npm --name monapp -- start.
4. Automatischer Neustart beim Start des VPS
Immer am Seiten des Nutzers app, fragen Sie PM2 nach dem Befehl, mit dem es als Systemdienst registriert wird:
pm2 startup systemd
PM2 zeigt einen Befehl an, der mit sudo env PATH=... : Kopieren Sie sie und führen Sie sie als Root aus. Anschließend erneut als app, speichern Sie die Liste der Anwendungen, die neu gestartet werden sollen:
pm2 save
Starten Sie den VPS einmal neu, um zu überprüfen, ob die Anwendung von selbst wieder läuft. Denken Sie daran, den Vorgang zu wiederholen. pm2 save nach jedem Hinzufügen oder Entfernen einer Anwendung.
5. Eine Konfigurationsdatei, in der alles beschrieben ist
Anstelle langer Befehlszeilen beschreiben Sie Ihre Anwendungen in ecosystem.config.js, die Grundlage des Projekts:
module.exports = {
apps: [{
name: "monapp",
script: "index.js",
instances: 1,
max_memory_restart: "400M",
env: { NODE_ENV: "production", PORT: 3000 }
}]
};
pm2 start ecosystem.config.js
pm2 save
max_memory_restart startet die Anwendung neu, wenn sie den angegebenen Speicherplatz überschreitet – eine nützliche Schutzmaßnahme gegen Speicherlecks. Bei einer zustandslosen API, instances: "max" und exec_mode: "cluster" starten eine exakte Kopie des Prozesses. Tun Sie dies nicht bei einem Discord-Bot: Jede Kopie würde sich separat anmelden und doppelte Antworten senden.
6. Zeitungen
pm2 logs monapp --lines 100 # journaux en direct
pm2 monit # processeur et mémoire en direct
Standardmäßig speichert PM2 die Protokolle unbegrenzt. Installieren Sie das Rotationsmodul, um zu verhindern, dass die Protokolle den Speicherplatz auf der Festplatte belegen:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 20M
pm2 set pm2-logrotate:retain 7
7. Die Anwendung mit Nginx und HTTPS veröffentlichen
Ein Discord-Bot benötigt diesen Schritt nicht: Er stellt selbst eine Verbindung zu Discord her. Bei einer API oder einer Website stellen Sie bitte sicher, dass die Anwendung ausschließlich auf die lokale Adresse hört, zum Beispiel 127.0.0.1:3000, und stellen Sie Nginx davor. Erstellen Sie /etc/nginx/sites-available/api.monsite.fr :
server {
listen 80;
server_name api.monsite.fr;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
ln -s /etc/nginx/sites-available/api.monsite.fr /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d api.monsite.fr --redirect
Mit „Express“ können Sie Folgendes hinzufügen: app.set("trust proxy", 1) damit die Anwendung die tatsächliche Adresse der Besucher und nicht die von Nginx erkennt. Details zum Zertifikat finden Sie unter Nginx und HTTPS.
8. Die Anwendung aktualisieren
su - app
cd monapp
git pull
npm ci --omit=dev
pm2 reload monapp
pm2 reload Startet die Instanzen nacheinander im Cluster-Modus neu, ohne Unterbrechung. Im Einzelmodus entspricht dies einem Schnellneustart. Für sicherere Bereitstellungen sollten Sie die Anwendung in Container verpacken: siehe Docker und Docker Compose.
Häufig gestellte Fragen
Wie kann man einen Discord-Bot rund um die Uhr betreiben?
Starten Sie den Bot auf einem VPS mit PM2 wie in dieser Anleitung beschrieben und führen Sie anschließend „pm2 startup“ und „pm2 save“ aus: Der Bot startet nach einem Absturz oder einem Neustart des Servers automatisch neu. Ein Bot benötigt weder Nginx noch einen offenen Port, da er sich selbst mit Discord verbindet.
PM2 oder systemd?
Beide funktionieren. PM2 ist für Node.js-Projekte praktischer: Protokollierung, Überwachung, Cluster-Modus und unterbrechungsfreies Neuladen mit einem einzigen Befehl. systemd reicht für eine einzelne Anwendung aus und vermeidet eine zusätzliche Abhängigkeit.
Welche Node.js-Version sollte in der Produktion verwendet werden?
Es handelt sich stets um eine LTS-Version mit einer geraden Versionsnummer: Diese erhält etwa drei Jahre lang Sicherheitspatches. Vermeiden Sie ungerade Versionen, die nur wenige Monate lang gepflegt werden.
Wie viel Speicherplatz wird für eine Node.js-Anwendung benötigt?
Ein einfacher Discord-Bot oder eine kleine API benötigt zwischen 50 und 200 MB. Eine Next.js-Anwendung im Produktivbetrieb benötigt eher 300 MB bis 1 GB. Ein VPS mit 2 GB bietet ausreichend Platz für mehrere kleine Projekte.










