Discord-Bot 24/7 hosten - Vollständiges Tutorial

Schritt-für-Schritt-Anleitung zum Hosten Ihres Discord-Bots in Produktion 24/7 auf einem VPS. Mit PM2 (Node.js) und systemd (Python).

Einleitung

Sie haben einen Discord-Bot mit discord.js oder discord.py programmiert? Damit er 24/7 läuft, brauchen Sie einen VPS. So geht es.

Schritt 1: VPS auswählen und bestellen

Ein Einsteiger-VPS (1 vCPU, 1-2 GB RAM, NVMe) reicht für die meisten Discord-Bots. Bei By-Hoster rechnen Sie mit ca. 4,99 €/Monat.

  1. Gehen Sie zum By-Hoster Kundenbereich
  2. Wählen Sie "VPS Linux" → Distribution Ubuntu 22.04 LTS
  3. Bestätigen und bezahlen, der VPS wird in 60 Sekunden per E-Mail mit SSH-Zugang geliefert

Schritt 2: SSH-Verbindung und Vorbereitung

  1. Verbinden Sie sich per SSH: ssh root@ihre-ip
  2. Aktualisieren Sie das System: apt update && apt upgrade -y
  3. Erstellen Sie einen Non-Root-Benutzer: adduser botuser && usermod -aG sudo botuser
  4. Installieren Sie Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (für Node) oder Python 3: apt install -y python3 python3-pip python3-venv (für Python)

Schritt 3: Bot deployen

  1. Laden Sie Ihren Code via Git hoch: git clone https://github.com/sie/ihr-bot.git
  2. Installieren Sie die Abhängigkeiten: npm install (Node) oder pip install -r requirements.txt (Python)
  3. Erstellen Sie eine .env-Datei mit Ihrem Discord-Token, niemals in Git committen
  4. Testen Sie durch manuelles Starten: node bot.js oder python bot.py

Schritt 4: Bot 24/7 am Laufen halten

Für Node.js: PM2 verwenden.

  1. PM2 installieren: npm install -g pm2
  2. Bot starten: pm2 start bot.js --name discord-bot
  3. Autostart beim Reboot konfigurieren: pm2 startup && pm2 save
  4. Logs ansehen: pm2 logs discord-bot

Schritt 5: Discord-Bot-VPS absichern

Ein im Internet exponierter Discord-Bot ist ein bevorzugtes Ziel für SSH-Bruteforce, Portscans und Exploit-Versuche. Drei Härtungsmaßnahmen eliminieren 99% der Bedrohungen: SSH-Authentifizierung nur per Schlüssel, restriktive UFW-Firewall und fail2ban gegen Wörterbuchangriffe.

  1. SSH-Passwort-Login deaktivieren: Schlüssel auf Ihrem Rechner erzeugen (ssh-keygen -t ed25519), auf den VPS kopieren (ssh-copy-id botuser@ihre-ip), dann /etc/ssh/sshd_config editieren und PasswordAuthentication no + PermitRootLogin no setzen. Neu laden: systemctl restart sshd
  2. UFW (Ubuntu-Firewall) aktivieren: ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. Ihr Discord-Bot baut ausgehende Verbindungen auf (zu gateway.discord.gg), keine eingehenden Ports nötig
  3. fail2ban installieren: apt install -y fail2ban && systemctl enable --now fail2ban. Blockiert automatisch jede IP, die mehr als 5 fehlgeschlagene SSH-Logins in 10 Minuten versucht (1 Stunde Sperre standardmäßig)
  4. Automatische Sicherheitsupdates: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. Kritische Patches (CVEs) werden ohne Eingriff installiert
  5. Discord-Token in einer .env außerhalb des Repos speichern: .env zu Ihrer .gitignore hinzufügen, mit dotenv (Node) oder python-dotenv (Python) laden. Committen Sie Ihren Token niemals auf GitHub, Discord widerruft geleakte Tokens in Sekunden

Troubleshooting: mein Discord-Bot stürzt ab, was tun?

Ein in Produktion abstürzender Bot liegt selten an einem defekten VPS, in 90% der Fälle ist es ein Anwendungsfehler (abgelaufenes Token, ungehandelte Ausnahme, Speicherüberlauf, Discord Rate Limit). Hier die Diagnose-Checkliste, die der Reihe nach durchzugehen ist.

  • Prozessstatus prüfen: pm2 status (Node) oder systemctl status mein-bot (Python). Suchen Sie nach "online" / "active (running)". Bei "errored" / "failed" zum nächsten Punkt
  • Aktuelle Logs lesen: pm2 logs discord-bot --lines 100 oder journalctl -u mein-bot -n 100 --no-pager. Typische Discord-Logs zu identifizieren: DiscordAPIError[401] = ungültiger oder widerrufener Token, DiscordAPIError[429] = Rate Limit, UnhandledPromiseRejection = ungehandelte async-Ausnahme
  • Ungültiges Token (401 Unauthorized): neues Token auf discord.com/developers/applications → Bot → Reset Token generieren. Ihre .env aktualisieren, dann pm2 restart discord-bot
  • Bot OOM-killed (out of memory): prüfen mit dmesg | grep -i "killed process". Wenn bestätigt, hat entweder Ihr Code ein Memory Leak (unbegrenzt wachsender Cache) oder der VPS ist unterdimensioniert, auf 4 GB RAM upgraden
  • Bot offline, aber Prozess aktiv: Discord hat wahrscheinlich den WebSocket geschlossen. Aktivieren Sie autoReconnect: true in discord.js (Standard) oder implementieren Sie einen on('disconnect')-Handler, der client.login() erneut aufruft
  • Sauberen Neustart erzwingen: pm2 restart discord-bot --update-env lädt Code UND Umgebungsvariablen neu. Für einen kompletten Neustart: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • Kontinuierliches Monitoring: konfigurieren Sie pm2 install pm2-logrotate (vermeidet Disk-Sättigung) und einen Discord-Webhook via pm2-discord-webhook, der Sie benachrichtigt, wenn der Bot mehr als 3 Mal in 5 Minuten abstürzt

Weitergehen: dem Bot eine Datenbank hinzufügen

Ein ernsthafter Discord-Bot braucht Persistenz: Konfiguration pro Server, Benutzerstatistiken, virtuelle Wirtschaft, Slash-Command-Cache, Moderation (Warns, Mutes). Drei Optionen je nach Bedarf: PostgreSQL für zuverlässige relationale Daten, MongoDB für flexible Schemata, Redis für schnellen Cache und Leaderboards.

  • PostgreSQL (empfohlen für 80% der Bots): apt install -y postgresql postgresql-contrib. Datenbank erstellen: sudo -u postgres createdb meinbot. Ideal mit Prisma ORM (Node): npm i @prisma/client prisma dann Modelle in schema.prisma definieren und npx prisma migrate dev ausführen. Type-safe, versionierte Migrationen, perfekt für Daten wie Guilds/Users/Warnings
  • MongoDB (für evolutive Schemata): apt install -y mongodb-org dann systemctl enable --now mongod. Mongoose (Node) verwenden: npm i mongoose. Praktisch zum Speichern verschachtelter JSON-Konfigurationen (Server-Settings mit Rollenlisten, Custom-Channels usw.) ohne vorab ein starres Schema zu definieren
  • Redis (Cache + Echtzeit-Leaderboards): apt install -y redis-server. ioredis (Node) oder redis-py (Python) verwenden. Ideal für: Slash-Command-Cache (TTL 1h), XP-Zählung als Sorted Set (ZADD leaderboard 1500 user_id dann ZREVRANGE leaderboard 0 9 WITHSCORES für Top 10), Anti-Spam-Rate-Limit pro Benutzer
  • Minimales Prisma-Beispiel (Node + PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] } dann im Bot: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). Der Bot speichert Parameter pro Server dauerhaft
  • Best Practices: täglich sichern Sie Ihre Datenbank (pg_dump meinbot > backup.sql via Cron), niemals PostgreSQL/MongoDB auf der öffentlichen IP exponieren (UFW deny alles außer SSH), Connection Pool verwenden, um die DB nicht zu sättigen, wenn Ihr Bot skaliert

Häufig gestellte Fragen

Für einen einfachen Bot: 1 GB RAM Minimum. Für einen Bot mit Datenbank und mehreren hundert Servern: 2-4 GB RAM. Der Einsteiger-By-Hoster-VPS für 4,99 €/Monat reicht für 90% der Bots.

Ja, sofern Sie pm2 startup (Node) oder einen systemd-Dienst (Python) konfiguriert haben. Der Bot startet nach dem Reboot automatisch neu.

PM2 ist ein Node.js-Prozessmanager mit integriertem Dashboard, farbigen Logs, Echtzeit-CPU/RAM-Monitoring und Clustering, ideal für discord.js. systemd ist der native Linux-Service-Manager: tieferes Level, aber universell (Node, Python, Go, Rust). Für Python mit discord.py/aiogram wird systemd in der Regel bevorzugt, da PM2 für Node konzipiert ist.