LGSL v6.2.1 sur VestaCP — monitorer ses serveurs CS 1.6 et TeamSpeak 3 en temps réel

Published by David on






Installer LGSL v6.2.1 sur VestaCP — {{DOMAINE_GAMING}}


Installer LGSL v6.2.1 sur VestaCP

Guide complet pour {{DOMAINE_GAMING}} — serveur {{IP_NOUVEAU}} — Mise a jour : mars 2026

Paramètres à personnaliser

Remplacez chaque {{VARIABLE}} par vos propres valeurs avant d’utiliser ce guide.

Variable Description Exemple
{{IP_NOUVEAU}} IP du serveur 198.51.100.20
{{PORT_SSH_NOUVEAU}} Port SSH du serveur 22223
{{DOMAINE_GAMING}} Domaine gaming exemple-gaming.fr
{{USER_VESTA}} Utilisateur MyVestaCP admin

1. Contexte

LGSL (Live Game Server List) est un script PHP open-source qui interroge des serveurs de jeux en temps reel et affiche leur statut (en ligne / hors ligne), le nombre de joueurs connectes, la carte en cours, le ping, etc. La version 6.2.1 est disponible sur GitHub.

Dans le cadre de {{DOMAINE_GAMING}}, LGSL sera utilise pour surveiller :

  • 8 serveurs Counter-Strike 1.6 (protocol halflife) sur les ports 27015 a 27022
  • 2 serveurs TeamSpeak 3 (protocol ts3) sur les ports 9987 et 9988 (query : 10011)
  • 1 serveur EmuLinker / Kaillera (protocol personnalise kaillera) sur le port 27888 UDP

Le serveur EmuLinker / Kaillera n’est pas supporte nativement par LGSL. Un patch personnalise du fichier lgsl_protocol.php est presente en section 8 pour l’integrer completement.

LGSL s’installe cote serveur web (Apache + PHP) et interroge les serveurs de jeux via des sockets UDP/TCP. Il ne necessite pas d’agent installe sur les serveurs de jeux.

2. Prerequis

Composant Requis Remarque
Serveur web Apache 2.4+ Gere par VestaCP
PHP 7.4 ou 8.x Avec extensions sockets et prise en charge UDP
MySQL / MariaDB 5.6+ Pour stocker la liste des serveurs
Acces SSH Oui Port {{PORT_SSH_NOUVEAU}} sur {{IP_NOUVEAU}}
VestaCP Installe Pour creer la base de donnees et gerer les vhosts

Verifier les extensions PHP requises

Connectez-vous en SSH et executez :

Les extensions sockets, pdo_mysql (ou mysqli) et mbstring doivent apparaitre. Si sockets est absent :

LGSL utilise fsockopen() et les sockets UDP directement. La fonction allow_url_fopen doit etre activee dans php.ini (valeur par defaut : On).

3. Creer la base de donnees MySQL via VestaCP

  1. Connectez-vous au panel VestaCP : https://{{IP_NOUVEAU}}:8083
  2. Cliquez sur l’onglet DB dans la barre superieure.
  3. Cliquez sur le bouton vert Add Database.
  4. Remplissez le formulaire :
Champ Valeur recommandee
Database lgsl (VestaCP prefixe automatiquement : admin_lgsl)
User lgsl (prefixe : admin_lgsl)
Password Choisissez un mot de passe fort
Host localhost
Charset utf8mb4

Cliquez sur Add. VestaCP cree la base et l’utilisateur. Notez les informations :

  • Nom de la base : admin_lgsl
  • Utilisateur : admin_lgsl
  • Mot de passe : (celui que vous avez saisi)
  • Host : localhost
VestaCP prefixe toujours le nom de la base et de l’utilisateur avec le nom du compte (ici admin_). Tenez-en compte lors de la configuration de LGSL.

4. Telecharger et installer LGSL

4.1 Connexion SSH

4.2 Creer le dossier cible

4.3 Telecharger LGSL v6.2.1

Si wget n’est pas disponible, utilisez curl -L -o lgsl-6.2.1.zip https://github.com/tltneon/lgsl/archive/refs/tags/v6.2.1.zip

4.4 Extraire et copier les fichiers

4.5 Verifier les permissions

4.6 Verifier la structure

Vous devriez voir, entre autres : index.php, install.php, admin.php, lgsl_config.php, lgsl/ (dossier du moteur), themes/.


5. Configuration initiale via install.php

Ouvrez votre navigateur et accedez a :

Le script d’installation vous demande les informations de connexion MySQL. Remplissez le formulaire :

Champ Valeur
Database Host localhost
Database Name admin_lgsl
Database User admin_lgsl
Database Password (votre mot de passe)
Table Prefix lgsl_ (valeur par defaut, laisser tel quel)
Admin Password Choisissez un mot de passe pour admin.php

Cliquez sur Install. LGSL cree les tables dans la base de donnees et genere le fichier lgsl_config.php.

Si l’installation echoue avec une erreur de connexion MySQL, verifiez que le nom de la base et de l’utilisateur comportent bien le prefixe admin_ ajoute par VestaCP.

Verification manuelle du fichier de configuration

Apres l’installation, vous pouvez inspecter le fichier genere :

Il doit contenir les constantes DB_HOST, DB_NAME, DB_USER, DB_PASS correctement renseignees.


6. Supprimer install.php (securite obligatoire)

Laissez install.php accessible apres l’installation est un risque de securite majeur. N’importe qui pourrait reinitialiser votre configuration. Supprimez-le immediatement apres l’installation.

Verifiez que la suppression est effective :


7. Ajouter les serveurs via admin.php

Accedez a l’interface d’administration :

Connectez-vous avec le mot de passe admin choisi lors de l’installation.

7.1 Tableau de configuration des serveurs

Ajoutez chaque serveur via Add Server en utilisant les parametres suivants :

# Nom Protocole IP / Host Port jeu Port query
1 CS 1.6 Deathmatch halflife {{IP_NOUVEAU}} 27015 27015
2 CS 1.6 GunGame halflife {{IP_NOUVEAU}} 27016 27016
3 CS 1.6 Deathrun halflife {{IP_NOUVEAU}} 27017 27017
4 CS 1.6 HNS halflife {{IP_NOUVEAU}} 27018 27018
5 CS 1.6 Kreedz halflife {{IP_NOUVEAU}} 27019 27019
6 CS 1.6 WAR halflife {{IP_NOUVEAU}} 27020 27020
7 CS 1.6 Retro (CS 1.0) halflife {{IP_NOUVEAU}} 27021 27021
8 CS 1.6 Surf halflife {{IP_NOUVEAU}} 27022 27022
9 TeamSpeak 3 (principal) ts3 {{IP_NOUVEAU}} 9987 10011
10 TeamSpeak 3 (secondaire) ts3 {{IP_NOUVEAU}} 9988 10011
Pour les serveurs Counter-Strike 1.6, le protocole halflife utilise le protocole Valve A2S (UDP). Le port query est generalement identique au port de jeu pour CS 1.6.

7.2 Particularites TeamSpeak 3

Pour TS3, LGSL a besoin d’acceder au port ServerQuery (10011) en TCP. Ce port est distinct du port vocal (9987 UDP). Dans le formulaire d’ajout :

  • Game Port : 9987 (port vocal TS3)
  • Query Port : 10011 (port ServerQuery TCP)
  • Protocol : ts3

Le port 10011 doit etre joignable depuis PHP. Voir la section 10 pour le cas particulier d’un TS3 tourne dans Docker.


8. EmuLinker / Kaillera — patch personnalise LGSL

LGSL ne supporte pas nativement le protocole EmuLinker / Kaillera. Il n’existe pas de plugin officiel pour ce protocole dans LGSL v6.x. Nous avons cree un patch qui ajoute le support Kaillera directement dans lgsl_protocol.php, en utilisant le handshake beacon du protocole Kaillera (HELLO0.83).

Le code source complet (LGSL + patch Kaillera) est disponible sur notre fork GitHub : github.com/smkerz/lgsl-kaillera. Vous pouvez cloner directement ce depot au lieu d’appliquer le patch manuellement.

8.1 Principe du protocole

Le protocole Kaillera utilise UDP en deux phases :

  1. Beacon (detection online) : le client envoie HELLO0.83\x00 sur le port UDP du serveur, qui repond HELLOD00D{port}\x00 avec un port prive
  2. Protocole v086 (donnees completes) : sur le port prive, le client effectue un mini-login binaire (UserInfo → echange ACK → ServerStatus) pour recuperer la liste des joueurs connectes (noms, ping, statut) et des parties en cours

LGSL utilise le beacon pour la detection online/offline, et un script Python cron (kaillera_poll.py) pour le protocole v086 complet qui ecrit les donnees joueurs dans un fichier JSON.

8.2 Sauvegarde avant modification

Toujours faire une sauvegarde avant de patcher lgsl_protocol.php :

8.3 Script de patch

Ce script PHP ajoute 6 elements au fichier lgsl_protocol.php (apres les entrees teaspeak) sans modifier le code existant :

Le script verifie d’abord si le patch a deja ete applique (presence du mot kaillera). Il est donc sans danger de le relancer.

8.4 Ajouter le serveur dans LGSL

Apres avoir applique le patch, ajoutez le serveur Kaillera via le panneau d’administration LGSL :

Champ Valeur
Type kaillera
IP 127.0.0.1
Port (c_port) 27888
Port query (q_port) 27888
On utilise 127.0.0.1 car EmuLinker tourne avec network_mode: host dans Docker, donc il ecoute directement sur l’interface locale du serveur.

8.5 Icone personnalisee

LGSL affiche une icone pour chaque type de serveur. Les icones sont des fichiers GIF 64×64 pixels stockes dans icons/{type}/{type}.gif. Pour Kaillera, il faut creer le dossier et generer l’icone :

Script PHP pour generer une icone manette retro (style NES) avec un « K » pour Kaillera :

L’icone represente une manette NES stylisee avec croix directionnelle, boutons A/B rouges, boutons Select/Start, et un « K » blanc au-dessus pour identifier Kaillera.

8.6 Verification

Apres le patch, l’ajout du serveur et la generation de l’icone :

  1. Rechargez la page LGSL — le serveur Kaillera doit apparaitre avec le statut En ligne
  2. Verifiez que l’icone s’affiche correctement a cote du nom du serveur
  3. Pour tester l’etat hors ligne, arretez EmuLinker : cd /home/docker/emulinker && docker compose stop
Note : le beacon seul (HELLO0.83) ne fournit que le statut online/offline.
Pour les noms de joueurs et le nombre en temps reel, voir la section 8.7 ci-dessous.

8.7 Nombre de joueurs en temps reel (protocole v086)

Le beacon HELLO0.83 ne retourne aucune donnee sur les joueurs.
Pour obtenir les noms, ping et statut des joueurs en temps reel,
un script Python (kaillera_poll.py) implemente le protocole binaire Kaillera v086 complet :

  1. Envoie HELLO0.83 → recoit le port prive
  2. Se connecte au port prive et envoie un UserInformation (type 0x03)
  3. Echange des paquets ACK (types 0x05/0x06) pour mesurer le ping
  4. Recoit le paquet ServerStatus (type 0x04) contenant la liste complete des joueurs et parties
  5. Envoie un Quit (type 0x01) propre et se deconnecte

Le script ecrit le resultat dans lgsl_kaillera_status.json que lgsl_query_49 lit directement.

8.7.1 Architecture

8.7.2 Deploiement du script

Le script kaillera_poll.py est inclus dans le fork GitHub
(smkerz/lgsl-kaillera)
dans le dossier lgsl_files/.

Copier le script dans le dossier LGSL du serveur :

Test manuel :

Le JSON contient pour chaque joueur : nom, ping, statut (0=Idle, 1=Playing, 2=Away), ID et type de connexion.

8.7.3 Verification

  1. Connectez-vous au serveur Kaillera avec un client (ex: Kaillera P2P ou SupraclientC)
  2. Rechargez la page LGSL — la requete declenche kaillera_poll.py automatiquement si le JSON est absent ou perime (> 30s). Verifiez ensuite le JSON :

    Votre nom doit apparaitre dans la liste users.
  3. Le compteur doit afficher 1/100 et votre nom dans la liste des joueurs.
  4. Deconnectez-vous du serveur Kaillera, rechargez la page LGSL, verifiez que le compteur revient a 0/100.
Options du script :
--ip (defaut: 127.0.0.1),
--port (defaut: 27888),
--output (chemin du JSON),
--username (nom du bot, defaut: lgsl_poll — filtre de la liste des joueurs).

8.7.4 Depannage

Probleme Cause Solution
Poll failed: timed out EmuLinker ne repond pas sur le port 27888 Verifier que le conteneur tourne : docker ps | grep emulinker
Poll failed: Server is full Le serveur a atteint server.maxUsers Augmenter server.maxUsers dans emulinker.cfg
Never received ServerStatus Le serveur n’envoie pas le paquet 0x04 Verifier la version EmuLinker et les logs du conteneur
JSON montre 0 joueurs alors qu’il y en a kaillera_poll.py absent ou shell_exec() desactive Verifier que kaillera_poll.py est dans le dossier LGSL et que shell_exec est autorise dans php.ini
LGSL affiche 0/100 malgre un JSON correct JSON trop ancien (> 60s) ou chemin incorrect Verifier que le JSON est dans le meme dossier que lgsl_protocol.php

9. Personnalisation

9.1 Changer la langue en francais

Editez le fichier lgsl_config.php et cherchez la ligne de configuration de la langue :

Modifiez ou ajoutez :

Verifiez que le fichier de langue francais existe :

9.2 Changer le theme

Les themes sont dans le dossier themes/. Pour appliquer un theme, editez lgsl_config.php :

9.3 CSS personnalise

Pour personnaliser l’apparence sans modifier les fichiers du theme (afin de faciliter les mises a jour), creez un fichier CSS personnalise dans le dossier du theme actif :

Puis incluez-le dans le template du theme (themes/default/header.php ou equivalent) :

9.4 Intervalle de rafraichissement

Dans lgsl_config.php, l’intervalle de cache (en secondes) entre deux interrogations des serveurs :


10. Probleme courant : port ServerQuery TS3 (10011)

Contexte du probleme

Si votre TeamSpeak 3 tourne dans un conteneur Docker, le fichier docker-compose.yml lie probablement le port ServerQuery 10011 uniquement a l’interface locale du conteneur ou a 127.0.0.1 de l’hote :

Pourquoi LGSL peut quand meme fonctionner

Dans votre configuration, Apache et PHP s’executent directement sur l’hote (pas dans un conteneur). Le PHP de LGSL peut donc atteindre 127.0.0.1:10011 car ce port est expose sur l’interface loopback de l’hote, et PHP tourne sur ce meme hote.

Resume : PHP (hote) –> 127.0.0.1:10011 (hote) –> conteneur Docker TS3. Cette chaine fonctionne car PHP est sur l’hote, pas dans Docker.

Si LGSL etait lui aussi dans Docker

Si LGSL tournait dans son propre conteneur Docker, il ne pourrait PAS atteindre 127.0.0.1:10011 de l’hote via cette adresse. Il faudrait alors :

  • Soit lier le port TS3 a 0.0.0.0:10011 dans le docker-compose (expose publiquement)
  • Soit placer les deux conteneurs sur le meme reseau Docker et utiliser le nom du service TS3 comme hostname
  • Soit utiliser l’IP interne du reseau Docker bridge (172.17.0.1 par defaut)

Verifier que le port 10011 est accessible depuis PHP

Ou via PHP en ligne de commande :

Si le port 10011 n’est pas accessible

Modifiez votre docker-compose.yml pour exposer le port sur toutes les interfaces :

Puis relancez le conteneur :

Exposer le port 10011 publiquement (0.0.0.0) permet a n’importe qui de se connecter au ServerQuery TS3. Assurez-vous que le compte ServerQuery admin a un mot de passe fort, ou utilisez un pare-feu (iptables/ufw) pour n’autoriser que localhost.

Configurer les permissions ServerQuery pour LGSL

Meme si le port 10011 est accessible, LGSL peut afficher les serveurs TS3 en rouge / hors ligne si les permissions ServerQuery ne sont pas correctement configurees.

Le probleme

LGSL se connecte au ServerQuery sans authentification. Il est donc affecte au groupe Guest Server Query. Par defaut, ce groupe n’a pas la permission d’executer la commande serverinfo, ce qui provoque l’erreur :

Piege : identifier le bon groupe

Les groupes ServerQuery (type=2) dans TeamSpeak ont des ID parfois contre-intuitifs :

sgid Nom Type Role
1 Guest Server Query 2 (ServerQuery) Connexions non authentifiees (LGSL)
2 Admin Server Query 2 (ServerQuery) Connexions authentifiees (serveradmin)
Attention : il faut accorder les permissions sur sgid=1 (Guest Server Query), pas sgid=2 ! L’erreur est frequente car on pense que sgid=2 est le groupe « Guest ».

Permissions requises

LGSL a besoin de 3 permissions pour interroger un serveur virtuel TeamSpeak 3 :

Permission Commande TS3 Usage LGSL
b_virtualserver_info_view (permid=25) serverinfo Nom du serveur, joueurs, slots, uptime
b_virtualserver_select use port=XXXX Selectionner le serveur virtuel par port
b_virtualserver_client_list clientlist Liste des joueurs connectes

Appliquer les permissions

Les permissions doivent etre accordees sur chaque serveur virtuel (sid). Utilisez ce script PHP depuis le serveur :

Remplacez MOT_DE_PASSE par le mot de passe serveradmin, et adaptez la liste [1, 2] selon vos serveurs virtuels. Chaque ligne doit retourner error id=0 msg=ok.

Verifier que LGSL peut interroger TS3

Testez en simulant exactement le comportement de LGSL (connexion non authentifiee, timeout 0.5s) :

Resultat attendu : la ligne Serverinfo: doit afficher les informations du serveur (nom, joueurs, etc.) et non une erreur de permission.

Diagnostic : lister les groupes ServerQuery

En cas de doute sur les ID de groupes, connectez-vous en serveradmin et listez les groupes :


11. Verification du fonctionnement

11.1 Verifier l’affichage de la liste

Ouvrez dans un navigateur :

Vous devriez voir la liste des serveurs avec leur statut. Les serveurs allumes affichent le nombre de joueurs et la carte.

11.2 Tester l’interrogation d’un serveur CS 1.6 manuellement

11.3 Verifier les logs PHP / Apache

11.4 Tester depuis PHP

Creez un script de test temporaire /home/{{USER_VESTA}}/web/{{DOMAINE_GAMING}}/public_html/lgsl/test_query.php :

Accedez a http://{{DOMAINE_GAMING}}/lgsl/test_query.php puis supprimez-le apres le test :

11.5 Verifier les tables MySQL

Cela liste tous les serveurs enregistres avec leur dernier statut connu.


12. Securite

12.1 Proteger admin.php par .htaccess

La methode la plus simple est de restreindre l’acces a admin.php par IP ou par authentification HTTP :

Ajoutez (en remplacant VOTRE_IP par votre adresse IP publique) :

Ou par authentification HTTP basique :

12.2 Mot de passe admin fort

Le mot de passe admin de LGSL est stocke dans lgsl_config.php. Si vous souhaitez le changer sans repasser par install.php :

Copiez le hash genere et remplacez la valeur LGSL_ADMIN_PASSWORD dans lgsl_config.php.

12.3 Permissions fichiers

12.4 Mises a jour LGSL

Surveillez les nouvelles versions sur github.com/tltneon/lgsl/releases. Pour mettre a jour :

  1. Sauvegardez lgsl_config.php et le dossier themes/ (vos personnalisations)
  2. Telechargez la nouvelle version et extrayez-la
  3. Remplacez les fichiers du dossier LGSL (sauf lgsl_config.php et vos themes personnalises)
  4. Verifiez si la structure de la base de donnees a change (voir le fichier CHANGELOG ou install.php de la nouvelle version)

12.5 Pare-feu et ports exposes

Verifiez quels ports sont actuellement exposes sur le serveur :


Recapitulatif des URLs

Page URL Remarque
Liste des serveurs (publique) http://{{DOMAINE_GAMING}}/lgsl/ Page principale
Administration http://{{DOMAINE_GAMING}}/lgsl/admin.php Proteger par IP ou .htaccess
Installation http://{{DOMAINE_GAMING}}/lgsl/install.php A supprimer apres installation
Panel VestaCP https://{{IP_NOUVEAU}}:8083 Gestion base de donnees
Statut Kaillera http://{{DOMAINE_GAMING}}/lgsl/kaillera_status.php Script personnalise (optionnel)



Catégories : Non classé

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *