Zum Inhalt springen
CitexNode
Alle Anleitungen

Node.js und Discord-Bots

Node.js LTS installieren und einen Discord-Bot als systemd-Dienst mit Token in einer Env-Datei betreiben.

5 Min. Lesezeit

Gilt für Debian 12/13, Ubuntu 22.04/24.04, AlmaLinux 9 und Rocky Linux 9. Am Ende läuft dein Bot als Dienst, startet beim Booten, kommt nach Abstürzen wieder hoch und schreibt seine Logs ins Journal.

1. Node.js installieren

Nimm eine LTS-Version von Node.js. Welche gerade aktuell ist, steht auf https://nodejs.org. Bibliotheken wie discord.js nennen in ihrer Dokumentation die Mindestversion.

Aus den Paketen der Distribution

Am einfachsten, aber oft älter:

SystemNode.js aus den Paketen
Debian 1218
Debian 1320
Ubuntu 22.0412 (zu alt, nimm NodeSource)
Ubuntu 24.0418
AlmaLinux/Rocky 9mehrere Versionen als Module

Debian und Ubuntu:

bash
apt install -y nodejs npm

AlmaLinux und Rocky Linux zeigen mit dnf module list nodejs die verfügbaren Versionen. Eine davon installierst du so, hier 22:

bash
dnf module install -y nodejs:22/common

Aus dem offiziellen NodeSource-Repository (Debian und Ubuntu)

Für eine aktuelle LTS-Version auf Debian und Ubuntu. Trag bei NODE_MAJOR die gewünschte Hauptversion ein:

bash
apt install -y ca-certificates curl gpg
install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=26
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" > /etc/apt/sources.list.d/nodesource.list
apt update
apt install -y nodejs

npm ist bei NodeSource schon dabei. Ist vorher das nodejs der Distribution installiert, entferne es zuerst mit apt remove nodejs npm.

Prüfen

bash
node -v
npm -v

2. Benutzer und Ordner für den Bot

Der Bot läuft als eigener Benutzer, nicht als root:

bash
useradd --system --create-home --home-dir /opt/bot --shell /usr/sbin/nologin bot

Bring deinen Code nach /opt/bot/app, etwa per Git oder SFTP, und installier die Abhängigkeiten als bot:

bash
sudo -u bot git clone https://example.com/dein/bot.git /opt/bot/app
cd /opt/bot/app
sudo -u bot npm ci --omit=dev

npm ci braucht eine package-lock.json. Gibt es keine, nimm npm install --omit=dev.

3. Token in eine Env-Datei

Der Bot-Token gehört nicht in den Code und nicht ins Git-Repo. Leg ihn in eine Datei, die nur root lesen kann; systemd gibt ihn beim Start an den Bot weiter.

bash
install -d -m 0750 /etc/bot
nano /etc/bot/bot.env
ini
DISCORD_TOKEN=dein-token-aus-dem-discord-developer-portal
NODE_ENV=production
bash
chmod 600 /etc/bot/bot.env

Im Code liest du den Token mit process.env.DISCORD_TOKEN, zum Beispiel bei discord.js:

javascript
client.login(process.env.DISCORD_TOKEN);

4. systemd-Dienst

bash
nano /etc/systemd/system/bot.service
ini
[Unit]
Description=Discord-Bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bot
WorkingDirectory=/opt/bot/app
EnvironmentFile=/etc/bot/bot.env
ExecStart=/usr/bin/node index.js
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target

Ersetz index.js durch die Startdatei deines Bots. Mit npm start als Startbefehl: ExecStart=/usr/bin/npm start. Wo node liegt, zeigt command -v node.

bash
systemctl daemon-reload
systemctl enable --now bot

Prüfen, ob es läuft

bash
systemctl status bot

active (running) und im Discord-Server ist der Bot online. Die Logs:

bash
journalctl -u bot -f

-f zeigt neue Zeilen live, Strg+C beendet die Anzeige (nicht den Bot). Die letzten 100 Zeilen: journalctl -u bot -n 100.

Bot aktualisieren

bash
cd /opt/bot/app
sudo -u bot git pull
sudo -u bot npm ci --omit=dev
systemctl restart bot

Ein neuer Token? /etc/bot/bot.env bearbeiten und systemctl restart bot.

Alternative: pm2

pm2 ist ein Prozessmanager für Node.js. Er ist praktisch, wenn du viele Node-Apps hast; für einen einzelnen Bot reicht systemd.

bash
npm install -g pm2

Als dein Benutzer (nicht root), im Ordner des Bots:

bash
pm2 start index.js --name bot
pm2 save
pm2 startup systemd

pm2 startup gibt eine Zeile mit sudo env PATH=… aus. Die führst du einmal aus, damit pm2 beim Booten startet. Logs: pm2 logs bot, Status: pm2 status.

Den Token gibst du bei pm2 über eine ecosystem.config.js oder über node --env-file=.env index.js mit. Die .env gehört dann in .gitignore. Nimm entweder systemd oder pm2, nicht beides für denselben Bot.

Häufige Fehler

ProblemUrsache und Lösung
status=203/EXEC im StatusPfad in ExecStart stimmt nicht. command -v node zeigt den richtigen.
Error [TokenInvalid]Token falsch oder zurückgesetzt. Im Discord Developer Portal neu erzeugen, in bot.env eintragen, neu starten.
Used disallowed intentsIm Developer Portal unter Bot die benötigten Privileged Gateway Intents einschalten.
SyntaxError oder Unsupported engineNode.js zu alt. Eine neuere LTS-Version installieren.
EACCES beim SchreibenDer Bot darf nur in /opt/bot schreiben. Dateien dort mit chown -R bot:bot /opt/bot dem Bot geben.
Bot startet ständig neujournalctl -u bot -n 100 zeigt den Fehler vor jedem Neustart.

Wie es weitergeht