Discobot — la plateforme de bot Discord

Un bot Discord, six plugins configurés par serveur depuis un tableau de bord web.

Discobot — la plateforme de bot Discord
Rôle
Fondateur, développeur principal
Stack
Laravel 12 · discord.js 14
Plugins
6
Statut
En ligne

Contexte

Un administrateur de serveur Discord qui veut un message de bienvenue, des rôles par réaction, des tickets et un suivi des invitations empile des bots différents, chacun avec ses permissions, sa configuration et sa fiabilité. Le projet est né comme une place de marché de bots à l’abonnement ; ce modèle n’a jamais fonctionné de bout en bout et un audit a relevé des incohérences dans l’architecture à un processus par bot.

Défi métier

Offrir aux administrateurs une boîte à outils complète sans héberger ni configurer de bot eux-mêmes.

Solution

Un seul bot, la plateforme, connecté à tous les serveurs autorisés et piloté depuis un tableau de bord Laravel. Le bot reçoit les événements Discord et demande à Laravel quoi faire ; les plugins sont des classes PHP qui renvoient une liste d’actions, que le bot exécute. Toute la logique métier reste ainsi côté Laravel, testée en PHP, et le bot ne fait qu’exécuter.

Résultat

Six plugins activables serveur par serveur, une offre Free (trois serveurs) ou Pro (illimitée) au mois ou à l’année, des journaux en temps réel via Reverb et une recherche dans l’historique des actions. Près de 800 tests PHP tournent en CI, avec des tests Node exécutés contre la vraie bibliothèque discord.js.

Mon rôle

Fondateur et développeur full-stack

Architecture

Utilisateurs

  • Tableau de bord web
  • Serveurs Discord (Gateway)
  • Stripe Checkout

Application

  • Laravel 12 · Livewire 3
  • Registre et classes de plugins
  • Files default et discord
  • Reverb (temps réel)
  • Bot Node.js · discord.js 14
  • Exécuteur : 35 types d’action

Services externes

  • API Discord · OAuth2
  • Stripe (abonnements)
  • MariaDB / MySQL
  • Redis
  • Meilisearch (Scout)
  • Sentry · PostHog

Le parcours, étape par étape

  1. Connexion

    L’utilisateur se connecte avec Discord, puis autorise le bot sur un serveur ; le quota de son offre est vérifié avant l’autorisation et au retour.

  2. Configuration

    Il active un plugin dans le tableau de bord et règle ses options, validées par le schéma du plugin.

  3. Événement

    Un événement Discord — arrivée d’un membre, réaction, commande — arrive dans le worker du bot.

  4. Décision

    Le bot appelle l’API Laravel avec son jeton ; le plugin PHP concerné renvoie la liste des actions à effectuer.

  5. Exécution

    L’exécuteur réalise les actions avec discord.js : envoyer un message, ajouter un rôle, ouvrir un salon de ticket…

  6. Retour

    Le résultat de chaque action remonte à Laravel, qui le journalise et le diffuse en direct au tableau de bord.

Modèle de données

Les entités principales, leurs champs clés et leurs relations.

User

  • discord_id
  • plan
  • stripe_subscription_id
  • grace_ends_at
  • 1—n DiscordServer
  • 1—n PlanHistory

DiscordServer

  • server_id (snowflake)
  • bot_authorized
  • permissions
  • 1—n ServerPlugin
  • 1—n ServerAction
  • 1—n BotAuthorization

PluginRegistry

  • plugin_id · category
  • config_schema
  • default_config
  • requires_permissions
  • 1—n ServerPlugin
  • 1—n DiscordCommand

ServerPlugin

  • is_active
  • config
  • error_streak
  • avg_execution_time_ms
  • n—1 DiscordServer
  • n—1 PluginRegistry

ServerAction

  • action_type
  • status
  • execution_time_ms
  • 1—n ActionExecution

Ticket

  • guild_id · ticket_number
  • status
  • claimed_by_id
  • n—1 TicketCategory
  • 1—n TicketMessage
  • 1—n TicketTranscript

PlanHistory

  • from_plan · to_plan
  • reason
  • n—1 User

Fiche technique complète

Langages
PHP 8.3, JavaScript (modules ES)
Framework
Laravel 12
Front
Livewire 3, Alpine 3, Tailwind 4, Vite 7
Bot
Node.js, discord.js 14, Express 5, node-cron ; le bot tourne dans un worker thread
Base de données
MariaDB 11 en développement, MySQL 8 en CI
Files et cache
Files Laravel default et discord, Redis 7
Temps réel
Laravel Reverb, six événements diffusés
Recherche
Laravel Scout et Meilisearch sur le journal des actions
Authentification
OAuth2 Discord via Socialite, Sanctum
Paiement
Stripe Checkout en abonnement, webhook vérifié, période de grâce
Hébergement
Docker multi-étapes, Docker Compose (application, file, scheduler, Reverb, bot), image publiée sur GHCR en amd64 et arm64
CI/CD
3 workflows GitHub Actions sur runner auto-hébergé : PHPUnit, Pest, tests Node, Pint, audits Composer et npm
Tests
PHPUnit 11 et Pest 3 (environ 800 tests), Playwright (15 tests), node --test (15 tests)
Qualité
Pint, documentation d’API Scribe, couverture Codecov
Observabilité
Sentry, PostHog, paquet d’observabilité maison, Pail
Sécurité
Jeton Bearer partagé entre Laravel et le bot, comparé en temps constant des deux côtés ; limitation de débit ; signature Ed25519 des interactions Discord vérifiée

Fonctionnalités clés

  • Bienvenue et départ

    Messages personnalisés à l’arrivée et au départ des membres.

  • Rôles par réaction

    Un rôle attribué ou retiré selon la réaction choisie.

  • Tickets

    Catégories, prise en charge et transcriptions.

  • Suivi des invitations

    Qui a invité qui, invitations douteuses repérées, top 10.

  • Annonces

    Rédigées dans une fenêtre modale Discord.

  • Nettoyage de salons

    Suppression de messages par lot.

Problèmes résolus

  1. Mauvaise version de discord.js

    ProblèmeLe code appelait des API de la v14 sur la v13 installée, et chaque erreur était avalée sans bruit.

    SolutionMigration vers la v14 et tests Node exécutés contre le vrai discord.js en CI.

  2. Quota contournable par l’URL

    ProblèmeLa limite de l’offre Free n’existait qu’à l’affichage.

    SolutionContrôle côté serveur, avant l’autorisation et au retour d’OAuth.

  3. Bot jamais relancé

    ProblèmeCarbon 3 renvoie un écart signé : un bot déconnecté semblait l’être depuis une durée négative.

    SolutionÉcart calculé dans le bon sens, couvert par un test.

  4. sleep() bloquant

    ProblèmeUn plugin pouvait immobiliser un worker PHP jusqu’à cinq minutes.

    SolutionEnvoi différé confié à un job en file.

  5. Tickets jamais enregistrés

    ProblèmeLa table pointait vers une table supprimée lors de la refonte.

    SolutionClé étrangère corrigée et nouvelles routes d’enregistrement.

Choix techniques

Choix Pourquoi
Un bot plateforme unique Les incohérences relevées par l’audit venaient du modèle à un processus par bot (ADR 001).
La logique dans Laravel, l’exécution dans le bot Les plugins se testent en PHP ; le bot reste un exécutant simple.
Registre généré depuis les classes Les copies manuelles du registre avaient divergé du code.
Free / Pro plutôt qu’une place de marché Le paiement par bot ne fonctionnait pas de bout en bout.

Chronologie

  1. Octobre 2025 Premier commit, projet de place de marché
  2. Janvier 2026 De 20 à 6 plugins, journaux centralisés
  3. Février 2026 ADR 001 : bot plateforme unique
  4. Février 2026 Offres Free et Pro avec Stripe
  5. Avril 2026 Stack Docker Compose
  6. Septembre 2026 Migration vers discord.js 14

En chiffres

877
commits
146
migrations
35
types d’action dans le bot
~800
tests PHP

Relevé dans le code source et l’historique Git du projet le 8 octobre 2026. Aucun chiffre d’usage ou de revenu n’est publié.

Projets similaires

SaaS
FoundRC — projet Laravel Marketplace
Marketplace européenne de modélisme radiocommandé, avec paiements Stripe Connect entre vendeurs et acheteurs et recherche Meilisearch.
Laravel, Livewire, Stripe Connect, Meilisearch, MinIO
Voir le projet
SaaS
janv. 2024 — présent
StreamCrea — tableau de bord des créateurs
Synchro Twitch, YouTube et Kick, publication multi-réseaux et blog pour abonnés.
PHP, Laravel, Livewire, Stripe
Voir le projet
SaaS
sept. 2023 — présent
Egonix Cards — cartes de visite NFC
Des cartes de visite NFC : on touche la carte, le contact arrive dans un espace où il s’exporte, se segmente et se relance.
Laravel, Livewire, Filament, Stripe, TailwindCSS
Voir le projet
SaaS
janv. 2024 — présent
Finnexus — projet Laravel Finance
SaaS finance entreprise : analytics, prévisions et trésorerie.
Laravel, Livewire, TailwindCSS, Stripe
Voir le projet

Disponible pour missions PHP / Laravel / WordPress / Silverstripe en Belgique et remote EU.