LFF réunit un site React, une API Express, un bot Discord et des classements
Minecraft hebdomadaires. L'application utilise MySQL et est prévue pour être
servie sur https://lff.addrien.fr.
- Frontend : React 19 + Vite
- Backend : Node.js + Express
- Base de données : MySQL (
mysql2) - Authentification : Discord OAuth2
- Interactions Discord : API Discord, sans
discord.js
Au démarrage, le serveur :
- se connecte à MySQL avec les variables
SQL_*; - crée la base
SQL_DBNAMEsi elle n'existe pas ; - applique
database/schema.sql; - démarre seulement lorsque la connexion est opérationnelle.
Le schéma contient :
tops: périodes de classement par catégorie ;users: identité Discord et pseudo courant ;top_rankings: score d'un utilisateur pour une période, relié aux deux tables précédentes.
Les modifications de score sont transactionnelles. Un score inférieur ou égal à zéro supprime la ligne du classement.
Pour initialiser la base sans démarrer le serveur :
npm run db:init
npm run db:verifyLe compte SQL_USER doit avoir le droit de créer SQL_DBNAME. Si la base est
créée en amont par l'hébergeur, les droits de création de tables suffisent.
Prérequis : Node.js 20.19+ et MySQL 8+.
npm install
npm --prefix client install
copy .env.example .env
npm run db:init
npm run build
npm startnpm start déclenche également le build Vite automatiquement afin d'éviter
qu'un ancien index.html référence des assets supprimés.
En développement, une seule commande lance Express et Vite :
npm run devVite écoute sur http://localhost:5173 et redirige les routes API vers
le port PORT défini dans .env.
Les deux processus peuvent aussi être lancés séparément avec
npm run dev:server et npm run dev:client.
Les variables attendues sont documentées dans .env.example.
PORT=3000
PUBLIC_URL=https://lff.addrien.fr
FRONTEND_URL=https://lff.addrien.fr
SQL_SERVER=127.0.0.1
SQL_PORT=3306
SQL_DBNAME=lff
SQL_USER=lff
SQL_PASSWORD=...PUBLIC_URL est l'origine canonique utilisée par les commandes Discord et par
l'OAuth. FRONTEND_URL reste accepté comme valeur de repli.
Dans le portail développeur Discord, ajouter ces URLs de redirection :
https://lff.addrien.frhttp://localhost:5173pour le développement local
Pages :
/leaderboards/profile/rewards/dashboard
API :
GET /healthz: état du serveur et de MySQLGET /api/config: configuration publique du clientGET /api/leaderboard/current/:typeGET /api/leaderboard/historyPOST /api/points/add/:typePATCH /api/leaderboards/update/:typeGET /api/profilePOST /interactions
Types disponibles : crystaux, pvp, iscoin, dragonegg, beacon et
sponge.
Le Dockerfile construit le client Vite puis produit une image Node qui sert
client/dist et l'API sur le même domaine.
Pour reconstruire et relancer le conteneur :
chmod +x build.sh
./build.shPar défaut, le script utilise l'image lff-image:latest, le conteneur lff,
le réseau mariadb-network et publie l'application sur
127.0.0.1:3579. Ces valeurs sont surchargeables :
HOST_PORT=4567 CONTAINER_NAME=lff-prod ./build.shLe reverse proxy de lff.addrien.fr doit transmettre le trafic au port défini
par PORT et conserver les en-têtes Host et X-Forwarded-Proto.
Les secrets MySQL et Discord doivent être injectés au démarrage du conteneur ;
le fichier .env est exclu de l'image Docker et de Git.