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
Auf dieser Seite
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:
| System | Node.js aus den Paketen |
|---|---|
| Debian 12 | 18 |
| Debian 13 | 20 |
| Ubuntu 22.04 | 12 (zu alt, nimm NodeSource) |
| Ubuntu 24.04 | 18 |
| AlmaLinux/Rocky 9 | mehrere Versionen als Module |
Debian und Ubuntu:
apt install -y nodejs npmAlmaLinux und Rocky Linux zeigen mit dnf module list nodejs die verfügbaren Versionen. Eine davon installierst du so, hier 22:
dnf module install -y nodejs:22/commonAus 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:
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 nodejsnpm ist bei NodeSource schon dabei. Ist vorher das nodejs der Distribution installiert, entferne es zuerst mit apt remove nodejs npm.
Prüfen
node -v
npm -v2. Benutzer und Ordner für den Bot
Der Bot läuft als eigener Benutzer, nicht als root:
useradd --system --create-home --home-dir /opt/bot --shell /usr/sbin/nologin botBring deinen Code nach /opt/bot/app, etwa per Git oder SFTP, und installier die Abhängigkeiten als bot:
sudo -u bot git clone https://example.com/dein/bot.git /opt/bot/app
cd /opt/bot/app
sudo -u bot npm ci --omit=devnpm 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.
install -d -m 0750 /etc/bot
nano /etc/bot/bot.envDISCORD_TOKEN=dein-token-aus-dem-discord-developer-portal
NODE_ENV=productionchmod 600 /etc/bot/bot.envIm Code liest du den Token mit process.env.DISCORD_TOKEN, zum Beispiel bei discord.js:
client.login(process.env.DISCORD_TOKEN);4. systemd-Dienst
nano /etc/systemd/system/bot.service[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.targetErsetz index.js durch die Startdatei deines Bots. Mit npm start als Startbefehl: ExecStart=/usr/bin/npm start. Wo node liegt, zeigt command -v node.
systemctl daemon-reload
systemctl enable --now botPrüfen, ob es läuft
systemctl status botactive (running) und im Discord-Server ist der Bot online. Die Logs:
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
cd /opt/bot/app
sudo -u bot git pull
sudo -u bot npm ci --omit=dev
systemctl restart botEin 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.
npm install -g pm2Als dein Benutzer (nicht root), im Ordner des Bots:
pm2 start index.js --name bot
pm2 save
pm2 startup systemdpm2 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
| Problem | Ursache und Lösung |
|---|---|
status=203/EXEC im Status | Pfad 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 intents | Im Developer Portal unter Bot die benötigten Privileged Gateway Intents einschalten. |
SyntaxError oder Unsupported engine | Node.js zu alt. Eine neuere LTS-Version installieren. |
EACCES beim Schreiben | Der Bot darf nur in /opt/bot schreiben. Dateien dort mit chown -R bot:bot /opt/bot dem Bot geben. |
| Bot startet ständig neu | journalctl -u bot -n 100 zeigt den Fehler vor jedem Neustart. |
Wie es weitergeht
- Server absichern.
- Datenbank oder Weboberfläche in Containern: Docker.
- Hilfe: Ticket.