PanelRP — projet Laravel FiveM

Panel open source de contrôle serveur FiveM/QBCore avec outils admin.

PanelRP — projet Laravel FiveM
Rôle
Fondateur, développeur full stack
Stack
Laravel 12 · Livewire 4 · Lua
Architecture
Une base par communauté
Statut
En ligne

Contexte

Une communauté roleplay — FiveM avec QBCore ou ESX, Minecraft, DayZ, Arma 3 — gère ses joueurs, ses métiers, son site et ses abonnements avec une collection d’outils qui ne se parlent pas. Le serveur de jeu a ses propres données, que le panel ne peut pas lire directement sans ouvrir sa base au monde.

Défi métier

Offrir aux hébergeurs FiveM un panel admin open source pour écosystèmes QBCore.

Solution

PanelRP donne à chaque communauté un espace isolé dans sa propre base MySQL. Le jeu est relié par un bridge : une ressource Lua côté FiveM, un plugin Java côté Minecraft, qui envoient battements de cœur et événements vers une API dédiée. Chaque jeu est un module découvert au démarrage, et la synchronisation des données de jeu peut aussi passer par une connexion directe ou un tunnel SSH.

Résultat

En ligne sur panelrp.com, en quatre langues, avec dix modules de jeu, un onboarding en douze étapes, un site public avec éditeur visuel et des abonnements Stripe, y compris la vente de VIP via Stripe Connect. La suite de tests tourne en trois lots parallèles et la sécurité est vérifiée par CodeQL et OWASP ZAP.

Mon rôle

Développeur full-stack

Architecture

Utilisateurs

  • Serveur FiveM (ressource Lua)
  • Serveur Minecraft (plugin)
  • Site public de la communauté
  • Administration de la communauté
  • Discord

Application

  • Laravel 12 · Livewire 4
  • Résolution du tenant
  • API game-bridge v1
  • Répartiteur et 9 handlers
  • 10 modules de jeu
  • Orchestrateur de synchronisation

Services externes

  • MySQL : cœur + une base par tenant
  • Bases de jeu (PDO ou SSH)
  • Redis
  • Stripe · Stripe Connect
  • Sentry · Nightwatch · Prometheus
  • PostHog

Le parcours, étape par étape

  1. Inscription

    Le propriétaire crée son compte puis sa communauté dans l’assistant de création.

  2. Provisionnement

    Le service de création ouvre une base dédiée, lance les migrations du tenant et installe le module du jeu choisi.

  3. Onboarding

    Un assistant Livewire en douze étapes relie la base de jeu, établit la correspondance des tables, configure Discord et le thème.

  4. Bridge

    Une clé API est générée ; la ressource Lua l’utilise pour appeler le panel. Seule son empreinte HMAC est stockée.

  5. Événements

    Le bridge envoie battements de cœur et événements ; un middleware retrouve la communauté à partir de l’empreinte de la clé.

  6. Traitement

    Le répartiteur transmet chaque événement au handler concerné — économie, police… — qui met à jour la base de la communauté.

Modèle de données

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

Tenant (cœur)

  • name · slug · domain
  • database
  • game_type · framework
  • modules_config
  • n—1 User (propriétaire)
  • 1—n Subscription
  • 1—n GameBridgeEvent

Plan · Subscription (cœur)

  • plan
  • statut
  • paiements Stripe
  • Subscription 1—n Payment

GameBridgeEvent (cœur)

  • target · event_type
  • occurred_at
  • license · payload
  • n—1 Tenant

SyncConnection (cœur)

  • source (mysql_direct, ssh_mysql, sql_dump)
  • sens de synchronisation
  • 1—n DatabaseSyncMapping

Player (tenant)

  • name · status
  • money · bank_balance
  • last_seen_at · metadata
  • n—1 Job
  • n—1 House

Job (tenant)

  • name · salary
  • max_employees
  • category
  • 1—n JobEmployee

JobEmployee (tenant)

  • job_role_id
  • salary
  • status
  • n—1 Job
  • n—1 Player

WebsitePage (tenant)

  • title · slug
  • content · is_published
  • meta SEO

Fiche technique complète

Langages
PHP 8.4, Lua 5.4 (bridge FiveM), TypeScript et Vue (éditeur visuel), Java (bridge Minecraft)
Framework
Laravel 12, Livewire 4, Jetstream, Fortify
Front
Tailwind 4, Alpine 3, Vite 8, Chart.js, GSAP ; éditeur visuel en Vue 3
Base de données
MySQL 8 : une base cœur (82 migrations) et une base par communauté (170 migrations)
Cache et files
Redis pour le cache, les sessions et les files
Authentification
Fortify, Jetstream, Sanctum ; Socialite (Discord, Google, Facebook, Microsoft) ; garde séparée pour les membres d’une communauté ; lien magique
Paiement
Stripe Checkout et webhooks ; Stripe Connect pour la vente de VIP
Intégration jeu
HTTP JSON avec clé Bearer ; adaptateurs QBCore, ESX et Standalone ; synchronisation par PDO ou tunnel SSH
Discord
OAuth, webhooks par communauté, notifications de CI
Hébergement
Serveur dédié, runner GitHub auto-hébergé
CI/CD
8 workflows : CI, déploiement, assets, brouillon de release, exercice de restauration, CodeQL, OWASP ZAP, Discord
Tests
PHPUnit 11 (298 fichiers, environ 1 600 tests) en trois lots parallèles, Playwright (36 specs), Vitest (22 fichiers)
Qualité
PHPStan et Larastan niveau 5 avec baseline, Rector (PHP 8.4, qualité, code mort), Pint
Observabilité
Sentry, Laravel Nightwatch, métriques Prometheus, PostHog, logs JSON structurés
Langues
Français, anglais, espagnol, néerlandais
Sécurité
CSP configurable, HTMLPurifier, captcha, clés du bridge hachées en HMAC-SHA256, 180 requêtes par minute et par clé, scan d’isolation des tenants

Fonctionnalités clés

  • Multi-tenant

    Slug, sous-domaine ou domaine personnalisé, base dédiée par communauté.

  • Onboarding

    Douze étapes, de la base de jeu au thème du site.

  • Détection du framework

    Le panel reconnaît la structure de la base de jeu par empreinte et propose la correspondance.

  • Site public

    Éditeur visuel et modèles de départ selon le type de communauté.

  • Gestion du serveur

    Joueurs, métiers, employés et bannissements.

  • Monétisation

    Abonnements Stripe et vente de VIP par Stripe Connect.

Problèmes résolus

  1. Tests de tenant non isolés

    ProblèmeUne purge de connexion lancée après l’ouverture de la transaction de test la détruisait : les tests se contaminaient entre eux.

    SolutionOrdre corrigé : la synchronisation est passée de 39 à 8 échecs, et cinq vrais défauts sont apparus, dont des dates mises à null sans erreur.

  2. Connexion restée sur le tenant précédent

    ProblèmeUne communauté sans base pouvait hériter de la connexion de la précédente.

    SolutionRéponse 503 explicite et base désélectionnée entre deux requêtes.

  3. Suite de tests de plus de 90 minutes

    ProblèmeLa CI devenait inutilisable.

    SolutionDécoupage en lots plateforme et tenant exécutés en parallèle.

  4. Analyse de sécurité jamais exécutée

    ProblèmeLe workflow CodeQL était invalide depuis sa création.

    SolutionWorkflow réparé, faux positifs SQL de l’audit corrigés.

  5. Clés du bridge en clair

    ProblèmeLes clés API des serveurs de jeu étaient stockées telles quelles.

    SolutionEmpreinte HMAC-SHA256, avec une lecture de repli pour migrer les anciennes clés.

Choix techniques

Choix Pourquoi
Une base par communauté L’isolation vient de la base elle-même, pas d’un filtre tenant_id qu’une requête pourrait oublier.
Un bridge plutôt qu’un accès direct Le serveur de jeu pousse ses événements ; sa base n’a pas à être ouverte au panel.
Tests sur MySQL uniquement Les comportements de verrouillage de MySQL doivent être ceux des tests.
PHP 8.4 minimum Imposé par Symfony 8.1, utilisé par les dépendances.

Chronologie

  1. Octobre 2025 Premières entrées du CHANGELOG
  2. Février 2026 Version 1.2 : éditeur, thème clair et sombre
  3. Mai 2026 Onboarding guidé
  4. Septembre 2026 Version 1.3 : configuration automatique par empreinte
  5. Septembre 2026 Bridge Minecraft et handlers actifs
  6. Octobre 2026 Version 1.3.123

En chiffres

10
modules de jeu
252
migrations
298
fichiers de tests PHP
4
langues

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
janv. 2022 — déc. 2022
MissionsCMS — projet Web App
Système de gestion de missions avec suivi et tableaux de bord.
Laravel, Livewire, Alpine.js, TailwindCSS
Voir le projet
SaaS
sept. 2025 — présent
Lodate — projet Web App
Système de gestion de rendez-vous avec rappels et interface épurée.
Laravel, Livewire, Alpine.js, TailwindCSS
Voir le projet
SaaS
oct. 2024 — présent
Vetzy — projet Laravel SaaS
Plateforme SaaS vétérinaire de prise de rendez-vous pour cliniques et propriétaires d’animaux.
PHP, Laravel, Livewire, TailwindCSS, SaaS
Voir le projet
Packages Laravel
janv. 2022 — présent
LarappeUI — projet Laravel
Kit UI Laravel et bibliothèque de composants réutilisables.
Laravel, Livewire, Alpine.js, TailwindCSS
Voir le projet

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