Quel VPS pour un bot Discord ?
Un bot Discord classique (modération, commandes, rappels, petit jeu) consomme très peu : quelques dizaines de mégaoctets de mémoire et presque pas de processeur. Le VPS Mini (1 vCore, 1 Go de RAM, 10 Go SSD) suffit largement pour un ou plusieurs bots de ce genre. Prévoyez le VPS Start ou plus si votre bot utilise une base de données, sert des milliers de serveurs Discord, ou partage la machine avec un site web.
KVM ou LXC, les deux conviennent pour un bot. Si vous hésitez, notre comparatif KVM ou LXC vous aide à choisir.
Le point à régler d'abord : Discord n'a pas d'IPv6
Nos VPS sont en IPv6 uniquement, et les serveurs de Discord (discord.com, la passerelle gateway.discord.gg) ne sont joignables qu'en IPv4. Sans réglage, votre bot ne pourra pas se connecter. La solution tient en deux minutes : déclarer un service NAT64/DNS64, qui relaie vers l'IPv4 les connexions aux sites qui n'ont pas d'IPv6. La marche à suivre est détaillée dans notre guide utiliser GitHub en IPv6 : c'est exactement la même chose pour Discord.
Une fois le réglage fait, vérifiez :
getent ahostsv6 discord.com
Si une adresse IPv6 s'affiche, votre bot pourra joindre Discord.
1. Créer le bot côté Discord
- Ouvrez le Discord Developer Portal et créez une application (« New Application »).
- Dans l'onglet Bot, générez le token du bot et copiez-le. C'est le mot de passe de votre bot : ne le publiez jamais, ni sur GitHub ni dans un message.
- Toujours dans l'onglet Bot, activez Message Content Intent si votre bot doit lire le contenu des messages (c'est le cas de l'exemple ci-dessous).
- Dans OAuth2, générez un lien d'invitation avec le scope
botet les permissions utiles, puis invitez le bot sur votre serveur.
2. Préparer le VPS
Connectez-vous en SSH (voir le guide du VPS IPv6), mettez le système à jour et installez Node.js :
apt update && apt upgrade -y
apt install -y nodejs npm
node --version
discord.js demande une version récente de Node.js : si node --version affiche moins que la version indiquée dans la documentation de discord.js, installez une version plus récente depuis nodejs.org (joignable en IPv6).
Ne faites pas tourner le bot en root. Créez-lui un utilisateur dédié :
adduser --system --group --home /srv/bot bot
3. Installer le bot
cd /srv/bot
sudo -u bot npm init -y
sudo -u bot npm install discord.js
Créez le fichier /srv/bot/index.js avec un bot minimal qui répond « pong » à « !ping » :
const { Client, Events, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
client.once(Events.ClientReady, c => console.log(`Connecté en tant que ${c.user.tag}`));
client.on(Events.MessageCreate, message => {
if (message.content === '!ping') message.reply('pong');
});
client.login(process.env.DISCORD_TOKEN);
Le token est lu dans une variable d'environnement, jamais écrit dans le code. Rangez-le dans un fichier lisible par le seul utilisateur du bot :
echo 'DISCORD_TOKEN=collez-votre-token-ici' > /srv/bot/.env
chown bot:bot /srv/bot/.env
chmod 600 /srv/bot/.env
Si vous avez déjà un bot en Python (discord.py), la démarche est la même : installez python3-venv, créez un environnement virtuel dans /srv/bot et adaptez la ligne ExecStart ci-dessous.
4. Le garder en ligne avec systemd
systemd démarre le bot avec le serveur et le relance s'il plante. Créez /etc/systemd/system/bot-discord.service :
[Unit]
Description=Bot Discord
After=network-online.target
Wants=network-online.target
[Service]
User=bot
WorkingDirectory=/srv/bot
EnvironmentFile=/srv/bot/.env
ExecStart=/usr/bin/node index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Puis activez-le :
systemctl daemon-reload
systemctl enable --now bot-discord
journalctl -u bot-discord -f
La dernière commande affiche les messages du bot en direct : vous devez voir « Connecté en tant que… ». Tapez !ping sur votre serveur Discord : le bot répond depuis votre VPS. Pour mettre à jour le code plus tard, modifiez les fichiers puis lancez systemctl restart bot-discord.