Een Discord-bot dag en nacht draaiende houden - Volledige handleiding

Stap voor stap uw Discord-bot dag en nacht in productie zetten op een VPS. Met PM2 (Node.js) en systemd (Python).

Introductie

Hebt u een Discord-bot geschreven met discord.js of discord.py? Om hem dag en nacht te laten draaien hebt u een VPS nodig. Zo gaat u te werk.

Stap 1: een VPS kiezen en bestellen

Een instap-VPS (1 vCPU, 1 tot 2 GB RAM, SSD) volstaat voor de meeste Discord-bots. Bij By-Hoster rekent u op ongeveer 4,99 € per maand.

  1. Ga naar de klantenzone van By-Hoster
  2. Kies « VPS Linux » → distributie Ubuntu 22.04 LTS
  3. Bevestig en betaal; de VPS wordt binnen 60 seconden per e-mail geleverd, met de SSH-toegang

Stap 2: verbinden via SSH en voorbereiden

  1. Meld u aan via SSH: ssh root@votre-ip
  2. Werk het systeem bij: apt update && apt upgrade -y
  3. Maak een gebruiker aan die geen root is: adduser botuser && usermod -aG sudo botuser
  4. Installeer Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (voor Node) of Python 3: apt install -y python3 python3-pip python3-venv (voor Python)

Stap 3: uw bot uitrollen

  1. Zet uw code erop met Git: git clone https://github.com/vous/votre-bot.git
  2. Installeer de afhankelijkheden: npm install (Node) of pip install -r requirements.txt (Python)
  3. Maak een bestand .env met uw Discord-token en zet het nooit in Git
  4. Test door handmatig te starten: node bot.js of python bot.py

Stap 4: de bot dag en nacht draaiende houden

Voor Node.js: gebruik PM2.

  1. Installeer PM2: npm install -g pm2
  2. Start uw bot: pm2 start bot.js --name discord-bot
  3. Stel automatisch starten na een herstart in: pm2 startup && pm2 save
  4. Bekijk de logboeken: pm2 logs discord-bot

Stap 5: de VPS van uw Discord-bot beveiligen

Een Discord-bot die op internet staat is een geliefd doelwit voor SSH-kraakpogingen, poortscans en pogingen om lekken uit te buiten. Drie maatregelen volstaan om 99 % van de dreiging weg te nemen: SSH alleen met een sleutel, een strenge UFW-firewall en fail2ban tegen woordenboekaanvallen.

  1. Aanmelden via SSH met wachtwoord uitschakelen: maak een sleutel op uw eigen toestel (ssh-keygen -t ed25519), zet ze op de VPS (ssh-copy-id botuser@votre-ip) en pas dan /etc/ssh/sshd_config aan met PasswordAuthentication no en PermitRootLogin no. Herlaad met: systemctl restart sshd
  2. UFW inschakelen (de firewall van Ubuntu): ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. Uw Discord-bot maakt uitgaande verbindingen (naar gateway.discord.gg); binnenkomende poorten zijn niet nodig
  3. fail2ban installeren: apt install -y fail2ban && systemctl enable --now fail2ban. Blokkeert vanzelf elk IP-adres dat binnen 10 minuten meer dan 5 keer verkeerd probeert aan te melden via SSH (standaard 1 uur geblokkeerd)
  4. Automatische veiligheidsupdates: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. Kritieke correcties (CVE's) worden vanzelf geïnstalleerd
  5. Het Discord-token in een .env buiten de repository bewaren: voeg .env toe aan uw .gitignore en laad het met dotenv (Node) of python-dotenv (Python). Zet uw token nooit op GitHub: Discord trekt uitgelekte tokens binnen enkele seconden in

Problemen oplossen: mijn Discord-bot loopt vast, wat nu?

Een bot die in productie omvalt, ligt zelden aan een falende VPS: in 90 % van de gevallen gaat het om een fout in de toepassing (verlopen token, niet-opgevangen uitzondering, geheugen op, snelheidslimiet van Discord). Dit is de controlelijst die u op volgorde afwerkt.

  • De staat van het proces nakijken: pm2 status (Node) of systemctl status mon-bot (Python). Zoek naar « online » of « active (running) ». Staat er « errored » of « failed », ga dan naar het volgende punt
  • De recente logboeken lezen: pm2 logs discord-bot --lines 100 of journalctl -u mon-bot -n 100 --no-pager. De typische Discord-meldingen om te herkennen: DiscordAPIError[401] = ongeldig of ingetrokken token, DiscordAPIError[429] = snelheidslimiet, UnhandledPromiseRejection = niet-opgevangen asynchrone uitzondering
  • Ongeldig token (401 Unauthorized): maak een nieuw token aan op discord.com/developers/applications → Bot → Reset Token. Werk uw .env bij en voer dan pm2 restart discord-bot uit
  • Bot afgesloten wegens geheugengebrek (OOM): kijk na met dmesg | grep -i "killed process". Klopt het, dan lekt uw code geheugen (een cache die eindeloos aangroeit) of is de VPS te krap bemeten: ga naar 4 GB RAM
  • Bot offline maar het proces draait: waarschijnlijk heeft Discord de WebSocket verbroken. Zet autoReconnect: true aan in discord.js (dat staat standaard zo) of schrijf een afhandelaar on('disconnect') die opnieuw client.login() aanroept
  • Een schone herstart afdwingen: pm2 restart discord-bot --update-env laadt de code én de omgevingsvariabelen opnieuw. Om helemaal opnieuw te beginnen: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • Doorlopende bewaking: stel pm2 install pm2-logrotate in (zo loopt de schijf niet vol) en een Discord-webhook via pm2-discord-webhook, die u verwittigt als de bot meer dan 3 keer in 5 minuten vastloopt

Verder gaan: een database aan uw bot toevoegen

Een volwaardige Discord-bot moet dingen onthouden: instellingen per server, gebruikersstatistieken, virtuele economie, cache van slash-opdrachten, moderatie (waarschuwingen, dempingen). Drie keuzes, naargelang de behoefte: PostgreSQL voor betrouwbare relationele gegevens, MongoDB voor soepele structuren, Redis voor snelle cache en ranglijsten.

  • PostgreSQL (aan te raden voor 80 % van de bots): apt install -y postgresql postgresql-contrib. Maak een database: sudo -u postgres createdb monbot. Ideaal met Prisma ORM (Node): npm i @prisma/client prisma, beschrijf daarna uw modellen in schema.prisma en voer npx prisma migrate dev uit. Typeveilig, met versies bijgehouden migraties: perfect voor gegevens als servers, gebruikers en waarschuwingen
  • MongoDB (voor structuren die meegroeien): apt install -y mongodb-org en daarna systemctl enable --now mongod. Gebruik Mongoose (Node): npm i mongoose. Handig om geneste JSON-instellingen te bewaren (serverinstellingen met lijsten van rollen, eigen kanalen enzovoort) zonder vooraf een strakke structuur vast te leggen
  • Redis (cache en ranglijsten in real time): apt install -y redis-server. Gebruik ioredis (Node) of redis-py (Python). Ideaal voor: cache van slash-opdrachten (1 uur geldig), het tellen van ervaringspunten in een gesorteerde verzameling (ZADD leaderboard 1500 user_id en dan ZREVRANGE leaderboard 0 9 WITHSCORES voor de top 10), en een snelheidslimiet per gebruiker tegen spam
  • Klein voorbeeld met Prisma (Node en PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] } en daarna in uw bot: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). Zo onthoudt de bot de instellingen per server blijvend
  • Goede gewoontes: maak dagelijks een kopie van uw database (pg_dump monbot > backup.sql via cron), zet PostgreSQL of MongoDB nooit open op het publieke IP-adres (met UFW alles weigeren behalve SSH), en gebruik een pool van verbindingen zodat de database niet volloopt als uw bot groeit

Veelgestelde vragen

Voor een eenvoudige bot: minstens 1 GB RAM. Voor een bot met database en enkele honderden servers: 2 tot 4 GB RAM. De instap-VPS van By-Hoster aan 4,99 € per maand volstaat voor 90 % van de bots.

Ja, op voorwaarde dat u pm2 startup (Node) of een systemd-dienst (Python) hebt ingesteld. De bot start dan vanzelf opnieuw op na een herstart.

PM2 is een procesbeheerder voor Node.js met ingebouwd dashboard, gekleurde logboeken, bewaking van processor en geheugen in real time en verdeling over meerdere processen: ideaal voor discord.js. systemd is de eigen dienstbeheerder van Linux: dichter bij het systeem, maar universeel (Node, Python, Go, Rust). Voor Python met discord.py of aiogram gaat de voorkeur meestal naar systemd, omdat PM2 voor Node is gemaakt.