Comment connecter mon bot à une base de données ?
Choisir entre un fichier SQLite et une base externe, placer les identifiants dans les variables d’environnement et tester la connexion.
L’hébergement de bots ne comprend pas de base de données gérée : le bot utilise soit un fichier SQLite rangé avec ses fichiers, soit une base hébergée ailleurs. Les identifiants de cette base sont distincts du compte ACLClouds.
Procédure étape par étape
-
Créer la base de données
Créez la base chez le service qui l’héberge et autorisez-y les connexions distantes. Avec SQLite, il n’y a rien à créer : la bibliothèque crée le fichier au premier lancement.
-
Copier les paramètres
Relevez l’hôte, le port, le nom de la base, l’utilisateur et le mot de passe auprès du service qui héberge la base.
-
Créer des variables
Stockez les paramètres dans des variables séparées ou une DATABASE_URL, jamais dans Git.
-
Tester la connexion
Lancez une requête simple au démarrage et gérez les reconnexions sans boucle de reconnexion agressive.
-
Sauvegarder
Exportez régulièrement les données avec l’outil adapté avant une migration ou une suppression.
Variables recommandées
DB_HOST=db.example.com
DB_PORT=3306
DB_NAME=botdb
DB_USER=botuser
DB_PASSWORD=secret
Connexion MySQL en Node.js
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT || 3306),
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
connectionLimit: 5,
});
pool.query('SELECT 1').then(() => console.log('Database connected'));
Choisir où stocker les données
La page d’un bot n’a pas d’onglet « Bases de données » et aucune base MySQL n’est créée avec le service. Deux options existent, selon le volume de données et le besoin d’y accéder depuis un autre programme.
Le fichier SQLite compte dans le stockage du bot. Téléchargez-en une copie depuis l’onglet « Fichiers » ou en SFTP avant un changement important, et ajoutez-le à .gitignore pour ne pas publier vos données.
- SQLite : la base est un simple fichier, par exemple data/bot.db, rangé avec les fichiers du bot. Il n’y a aucun serveur à installer, et cela suffit pour des niveaux, des avertissements ou des réglages par serveur Discord.
- Base externe : MySQL, MariaDB, PostgreSQL ou MongoDB sur un VPS ou chez un fournisseur spécialisé. À préférer quand plusieurs programmes lisent les mêmes données, par exemple un bot et un site.
Se connecter à une base externe
Dans l’onglet « Démarrage », section « Variables d’environnement », ajoutez une variable par paramètre avec « Nom » et « Valeur » : DB_HOST, DB_PORT, DB_NAME, DB_USER et DB_PASSWORD, ou une seule DATABASE_URL. Les valeurs sont stockées chiffrées et le bot les reçoit au prochain démarrage.
L’hôte doit être une adresse publique, nom de domaine ou IP joignable depuis Internet. localhost et 127.0.0.1 désignent le conteneur du bot, où aucun serveur de base de données ne tourne. Le bot sort sur Internet par une adresse IP partagée avec d’autres bots : une liste d’adresses autorisées ne protège donc pas la base à elle seule. Créez un utilisateur réservé au bot, avec un mot de passe long et des droits limités à sa base, et activez TLS si le fournisseur le propose.
Déclarez aussi le pilote dans vos dépendances : mysql2, pg ou mongoose dans package.json, aiomysql, asyncpg ou motor dans requirements.txt. Il est installé au démarrage du bot.
Vérifier la connexion
Redémarrez le bot et lisez la console. Faites écrire à votre code une ligne claire après une requête simple comme SELECT 1, par exemple Database connected. Si elle n’apparaît pas, l’erreur affichée juste avant indique presque toujours la cause : hôte, port, identifiants ou pare-feu.
Questions fréquentes
Pourquoi connect ECONNREFUSED 127.0.0.1:3306 ?
Le code se connecte à localhost : soit DB_HOST est absente et la bibliothèque prend sa valeur par défaut, soit la valeur vient d’un fichier .env local. Aucune base ne tourne dans le conteneur du bot. Mettez dans DB_HOST l’adresse publique du serveur de base de données, puis redémarrez.
Que signifie ER_ACCESS_DENIED_ERROR: Access denied for user ?
Le serveur MySQL a répondu mais refuse l’identifiant. Vérifiez DB_USER et DB_PASSWORD, sans espace ni guillemets autour de la valeur. Sur MySQL, un utilisateur est aussi lié à un hôte d’origine : un compte créé pour localhost ne peut pas se connecter à distance. Créez-le avec l’hôte % et un mot de passe solide.
Pourquoi ETIMEDOUT à la connexion ?
Aucune réponse n’arrive : le port est filtré ou la base n’écoute pas sur Internet. Sur un VPS, vérifiez que MySQL écoute sur 0.0.0.0 et non sur 127.0.0.1 (option bind-address) et que le pare-feu laisse passer le port 3306. Chez un fournisseur, autorisez les connexions externes dans sa console.