🚓 Chapitre 10 · Ton serveur FiveM sur TeamKit

Aller plus loin : Discord, whitelist, sécurité, économie

Mis à jour le 07/09/2026 ·

Ta ville tourne. La suite : un Discord relié au serveur, une whitelist, la sécurité de base, l'achat de scripts et de MLO sans se faire avoir, le dimensionnement sur le profil TeamKit, la surveillance et la préparation d'une ouverture.

1. Lier un Discord #

Un serveur RP sans Discord n'existe pas : c'est là que les joueurs trouvent l'adresse, lisent le règlement et demandent de l'aide.

Ce qu'un bot apporte #

Un bot Discord (n'importe lequel) relie ton serveur de jeu à ton Discord :

  • Statut : un message « en ligne, 14/32 joueurs » qui lit http://ADRESSE:30120/info.json et players.json.
  • Rôles : « Citoyen » après lecture du règlement, « Whitelisté » qui débloque les salons réservés et, si tu le relies au serveur, la connexion elle-même (section 2).
  • Annonces : un salon en lecture seule où toi seul écris.
  • Support : un salon ou des tickets où le joueur poste son problème avec sa capture F8.

Rester simple #

  1. Crée un Discord avec quatre salons : annonces, règlement, support, général.
  2. Ajoute un bot de statut qui lit info.json : il lui faut seulement l'adresse et le port de ton serveur.
  3. Mets le lien du Discord dans Configuration → FiveM → Project Description et dans un say planifié dans Schedule (chapitre 09).

Ne donne jamais tes identifiants AMP ni ta clé Cfx.re à un bot ou à un « service de statut » : tout ce qui est public passe par info.json sur le port 30120.

Sur le Discord TeamKit, tu n'as rien à installer : le bot TeamKit tient déjà un fil par serveur vivant dans le forum des serveurs, avec l'état en direct, les votes et les avis. Le bot dont on parle ici est celui de ton Discord.

À retenir

  • Le Discord est la porte d'entrée : adresse, règlement, support.
  • Un bot de statut n'a besoin que de l'adresse et du port.
  • Aucun outil tiers n'a besoin de ton mot de passe AMP ni de ta clé Cfx.re.

2. La whitelist #

Une whitelist n'accepte que les joueurs autorisés. Deux façons : la mécanique intégrée à FXServer (ACE + un petit script), ou un script de whitelist tout fait.

Comprendre deferrals #

Quand un joueur se connecte, FXServer déclenche l'événement playerConnecting. Un script serveur peut y répondre avec l'objet deferrals : il met la connexion en attente (defer()), affiche un message au joueur (update()), puis l'accepte (done()) ou la refuse (done("motif")). Contrainte documentée : attendre au moins un tick (Wait(0)) après defer() avant d'appeler update ou done.

Référence officielle : https://docs.fivem.net/docs/scripting-reference/events/list/playerConnecting/

Option A : whitelist par ACE, sans base de données #

Tu déclares dans Access Control Commands qui a le droit tk.whitelist, et un script de dix lignes vérifie ce droit à la connexion.

  1. Crée par SFTP le dossier server-data/resources/[local]/tk_whitelist/.
  2. Crée dedans fxmanifest.lua :
fx_version 'cerulean'
game 'gta5'
server_script 'server.lua'
  1. Crée server.lua :
AddEventHandler('playerConnecting', function(name, setKickReason, deferrals)
    local src = source
    deferrals.defer()
    Wait(0) -- attente obligatoire après defer()
    deferrals.update(('Bonjour %s, vérification de la whitelist...'):format(name))
    Wait(0)
    if IsPlayerAceAllowed(src, 'tk.whitelist') then
        deferrals.done()
    else
        deferrals.done('Tu n\'es pas encore whitelisté. Rejoins notre Discord pour faire ta demande.')
    end
end)
  1. Ouvre Configuration → FiveM → Access Control Commands et ajoute :
add_ace group.whitelist tk.whitelist allow
add_ace group.admin tk.whitelist allow
add_principal identifier.license:LICENCE_DU_JOUEUR group.whitelist

Une ligne add_principal par joueur accepté. La licence se lit dans la console au moment où le joueur tente de se connecter (même refusé), ou dans son profil Cfx.re (chapitre 02, section 8).

  1. Ajoute ensure tk_whitelist en tête des ressources dans Starting Resources.
  2. Redémarre l'instance : Access Control Commands est écrit dans server.cfg au démarrage.
  3. Teste avec un compte non listé : il doit voir ton message de refus. Ajoute sa licence, redémarre, il doit entrer.

Rien à installer, rien en base, mais chaque ajout demande un redémarrage : ça convient à quelques dizaines de joueurs gérés par toi.

Syntaxe ACE : https://docs.fivem.net/docs/server-manual/setting-up-a-server-vanilla/ ; IsPlayerAceAllowed : https://docs.fivem.net/docs/cookbook/2021/07/17/quick-note-on-using-built-in-acl-security/.

Option B : un script de whitelist existant #

Les écosystèmes des frameworks proposent des whitelists avec base de données, commande en jeu et souvent un lien Discord (le rôle ouvre l'accès). Cherche une ressource maintenue sur https://forum.cfx.re ou sur le GitHub de ton framework, lis son README (prérequis : ox_lib, bot Discord, SQL), installe-la comme n'importe quelle ressource (chapitre 07) et teste-la avec un compte non autorisé avant d'ouvrir.

Mark Server Private n'est pas une whitelist : il retire ton serveur de la liste publique, mais quiconque a l'adresse peut se connecter. Utile pendant les travaux, pas pour filtrer.

À retenir

  • deferrals = mettre la connexion en attente, puis accepter ou refuser avec un message.
  • Whitelist ACE : add_ace group.whitelist tk.whitelist allow + un add_principal par joueur + redémarrage.
  • Un script tout fait vaut mieux au-delà de quelques dizaines de joueurs.

3. Les bases de la sécurité #

Côté serveur de jeu #

Réglage AMP (Configuration → FiveM) ConVar Conseil
Block Modified Client Files sv_pureLevel Niveau 1 : bloque les fichiers modifiés sauf l'audio et les mods graphiques connus ; suffit contre la plupart des triches. Niveau 2 bloque aussi les mods graphiques. Le joueur redémarre son jeu au premier changement.
Enable Endpoint Privacy sv_endpointPrivacy Active : cache l'adresse IP des joueurs aux autres joueurs.
Enable HTTP Flood Protection sv_requestParanoia Protège le port HTTP. D'après la doc, à partir du niveau 2, info.json, players.json et dynamic.json répondent « Nope. ». Le chien de garde TeamKit lit info.json : après activation, ouvre http://ADRESSE:30120/info.json et vérifie qu'il répond encore.
Allow Scripthook Plugins sv_scriptHookAllowed Laisse désactivé : les menus externes passent par là.

Référence : https://docs.fivem.net/docs/server-manual/server-commands/

Un anti-cheat de script complète ces réglages : choisis-en un maintenu, compatible avec ton framework, et lis ses faux positifs connus avant d'activer le bannissement automatique.

Côté comptes #

  1. Ne partage jamais ta clé Cfx.re : elle identifie ton serveur et porte tes achats de scripts (section 4).
  2. Ne partage jamais ton mot de passe AMP : c'est aussi celui de ta base de données et le rcon_password de ton serveur.
  3. Crée des sous-comptes depuis teamkit.fr pour ton staff, au niveau minimum : Observateur (lire la console), Relance (redémarrer), Opérateur (taper des commandes), Fichiers (SFTP), Technicien (tout sauf la propriété). Un développeur a besoin de Fichiers, pas de Technicien. Retire le sous-compte dès que la personne quitte le staff.

À retenir

  • sv_pureLevel 1, Endpoint Privacy activé, Scripthook désactivé.
  • Après HTTP Flood Protection, vérifie que info.json répond encore.
  • Clé Cfx.re et mot de passe AMP ne sortent jamais ; le staff a des sous-comptes limités.

4. Acheter des scripts #

Tebex et le portail Cfx.re #

Tebex est le partenaire de vente officiel de FiveM : la plupart des boutiques de scripts payants passent par lui. Un script « escrow » n'est pas envoyé en clair : il est accordé à ton compte Cfx.re, et tu le télécharges depuis https://portal.cfx.re/ pour l'un de tes serveurs enregistrés. L'ancienne adresse https://keymaster.fivem.net (connexion avec ton compte forum Cfx.re) gère les mêmes enregistrements.

Références : https://docs.fivem.net/docs/server-manual/asset-escrow/ et https://docs.fivem.net/docs/server-manual/setting-up-a-tebex-store/

Comment fonctionne l'escrow #

  • Les fichiers protégés sont chiffrés (Lua, et les modèles YFT, YDD, YDR) : ni lisibles ni modifiables. Seuls les fichiers listés par l'auteur en escrow_ignore dans le fxmanifest.lua (souvent config.lua et les traductions) sont en clair.
  • Le script ne démarre que sur un serveur qui utilise la clé Cfx.re pour laquelle il a été accordé ; sinon la console affiche « You lack the required entitlement ».
  • Les transferts entre comptes sont interdits, et un script par abonnement s'arrête de démarrer quand l'abonnement expire.

Sur un hébergement TeamKit #

Ce qui marche :

  • Tout script escrow accordé à ta clé Cfx.re, celle qui est dans Configuration. La clé est liée à l'adresse IP du serveur : enregistre-la avec l'adresse de ton serveur TeamKit.
  • Une boutique Tebex reliée à ton serveur : la doc demande sv_tebexSecret TA_CLE_SECRETE dans server.cfg ; chez TeamKit, mets cette ligne dans Additional Server Settings et redémarre.
  • Les webhooks Discord et les appels HTTP sortants.

Ce qui ne marche pas, ou pas tel quel :

  • Un script escrow acheté avec un autre compte Cfx.re : il refuse de démarrer et tu ne peux pas le « réactiver ».
  • Une clé enregistrée avec l'adresse d'un ancien hébergeur : ré-enregistre-la sur https://portal.cfx.re/servers/registration-keys avec l'adresse TeamKit, colle la nouvelle clé dans Configuration, redémarre, puis vérifie que tes assets sont accordés à cette clé.
  • Tout ce qui exige d'installer un programme sur la machine (service Node, paquet système, autre port) : tu n'as pas accès au dédié. Demande au vendeur avant d'acheter.
  • Un script qui exige un Server Build plus récent : passe par Configuration → Updates (chapitre 09) avant de conclure qu'il est cassé.

Avant d'acheter : lis la page du script (framework, inventaire, dépendances, escrow ou open source), cherche son nom sur https://forum.cfx.re, vérifie que ton compte Cfx.re sur la boutique est celui qui a enregistré ta clé, et garde le mail de commande.

À retenir

  • Un script escrow est accordé à ton compte Cfx.re et ne démarre qu'avec ta clé.
  • « You lack the required entitlement » = mauvaise clé ou mauvais compte, pas un bug du script.
  • Rien qui exige d'installer quelque chose sur la machine ne fonctionnera.

5. MLO et licences #

Un MLO (intérieur ajouté à la carte) s'achète comme un script. Trois règles :

  • Un achat par serveur. Les licences des créateurs de MLO (Gabz est le plus connu, les autres suivent le même modèle) autorisent l'usage sur un serveur. Pas de partage, pas de revente.
  • Pas de « leaks ». Un MLO récupéré sur un site de partage est un fichier volé. Cfx.re peut bannir un serveur qui diffuse des assets volés, et le ban porte sur ta clé et ton compte : ton serveur disparaît de la liste et tes achats légitimes partent avec.
  • Vérifie la taille. Un asset de plus de ~16 Mo provoque l'avertissement « Oversized assets … WILL lead to streaming issues » (chapitre 07, section 9) : des textures peuvent manquer chez certains joueurs.

Installe un MLO comme une ressource, dans un dossier [mlo] : les ressources partagées d'un auteur (mapdata, props) avant ses MLO, et un seul MLO par emplacement.

À retenir

  • Une licence de MLO = un serveur.
  • Un asset volé expose ta clé Cfx.re à un ban.
  • Le partagé de l'auteur avant ses MLO.

6. Dimensionner : 12 Go de RAM, 50 Go de disque #

Le profil FiveM de TeamKit prévoit 12 Go de RAM et 50 Go de disque par serveur, avec un CPU plafonné par conteneur. Sur des faits observés :

  • Une ville Qbox complète de 230 ressources, avec MLO, tourne sur ce même AMP. Le profil n'est pas un frein pour une ville normale.
  • Le disque part vite avec les MLO : 50 Go incluent cache/, tes sauvegardes AMP et tes packs de carte. Exclus cache/ des sauvegardes (chapitre 09).
  • Player Limit est à 32 par défaut ; au-delà il faut OneSync. La limite réelle n'est pas un chiffre théorique : monte par paliers (32, 48, 64) en lisant CPU et RAM dans Status à l'heure de pointe. Si le CPU sature, ce sont tes scripts qui coûtent, pas le nombre de joueurs.
  • Ce qui coûte le plus : les scripts qui bouclent chaque frame, les MLO surdimensionnés, les ressources en double (deux inventaires, deux menus de vêtements). Une ressource qui grimpe en RAM dans resmon a une fuite : remplace-la.

À retenir

  • 12 Go / 50 Go suffisent à une ville complète de plus de 200 ressources.
  • Au-delà de 32 joueurs, OneSync obligatoire ; monte par paliers en lisant Status.
  • Le disque, c'est surtout MLO + cache + sauvegardes.

7. Surveiller #

Trois sources, de la plus simple à la plus complète :

  1. La page Status d'AMP : état, CPU, RAM, joueurs, en direct. Ton premier réflexe.
  2. Les pages HTTP du serveur, sur le port 30120 :
    • http://ADRESSE:30120/info.json : version, ressources, ConVars publiées. C'est ce que lit le chien de garde TeamKit pour relancer ton serveur s'il est inscrit dans la liste (opt-in par le staff).
    • http://ADRESSE:30120/players.json : les joueurs connectés ; dynamic.json : nombre de joueurs et maximum.
    • http://ADRESSE:30120/perf : métriques au format Prometheus (documentées, authentification optionnelle). Utile seulement si tu as déjà Prometheus/Grafana.
  3. En jeu : status dans la console d'AMP pour les joueurs et leur ping ; chez un joueur qui se plaint de lag, resmon 1 et netgraph 1 (F8). Une ressource en tête chez tous les joueurs est en cause ; un seul joueur avec du ping a un problème de connexion.

À retenir

  • Status d'AMP d'abord, info.json et players.json ensuite.
  • info.json doit rester accessible : le chien de garde TeamKit en dépend.
  • resmon désigne la ressource coupable, netgraph la connexion.

8. Préparer une ouverture #

Bêta fermée (une à deux semaines) #

  1. Active la whitelist et invite dix à vingt joueurs de confiance.
  2. Ouvre un salon bugs avec un format imposé : ce que je faisais, ce qui s'est passé, capture de F8.
  3. Joue toi-même chaque métier, chaque boutique, chaque garage.
  4. Fais une sauvegarde complète (fichiers + .sql) à la fin de la bêta, puis décide et annonce : wipe de la base ou conservation.

Lancement #

✅ Checklist du chapitre #

❓ Si ça ne marche pas #

Ma whitelist ACE refuse tout le monde, moi compris. Vérifie que tk_whitelist est dans Starting Resources, que l'identifiant dans add_principal est identifier.license: suivi de la licence exacte (lue dans la console à la connexion), et que tu as redémarré l'instance après avoir modifié Access Control Commands.

« You lack the required entitlement » au démarrage d'un script acheté. Le script n'est pas accordé à la clé en place dans Configuration. Connecte-toi sur https://portal.cfx.re/ avec le compte qui a acheté, vérifie le serveur auquel l'asset est accordé, retélécharge la ressource pour ce serveur.

Le serveur a disparu de la liste après le lancement. Project Name non conforme, clé liée à une autre IP, sv_master1 "" ajouté par erreur, ou zéro joueur depuis longtemps. Chapitre 08.

Le chien de garde TeamKit ne relance plus mon serveur. Ouvre http://ADRESSE:30120/info.json. S'il répond « Nope. », baisse HTTP Flood Protection. S'il ne répond pas du tout, le serveur est planté : lis la console.

Une étape qui coince ? Ouvre un ticket sur le site ou demande sur le Discord TeamKit. Le bot Guide connaît ces pages.