Constellation CS 1.6 — 6 serveurs ReHLDS avec Pterodactyl Panel

Published by David on






Constellation CS 1.6 — 12 serveurs ReHLDS avec Pterodactyl Panel

Constellation CS 1.6 — 12 serveurs ReHLDS avec Pterodactyl Panel

Neuvième étape : déployer une constellation de serveurs Counter-Strike 1.6
(Deathmatch, GunGame, Deathrun, Hide&Seek, Kreedz, AUTOMIX 5v5, Surf, CS 1.0 Vintage Beta, Paintball, Furien, BaseBuilder) avec le stack moderne
ReHLDS, gérés par Pterodactyl Panel sur le serveur centralisé.

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
{{HOSTNAME_NOUVEAU}} Hostname du serveur ns7654321
{{DOMAINE_GAMING}} Domaine gaming exemple-gaming.fr
{{DB_PASSWORD}} Mot de passe MariaDB S3cur3P@ss!
{{TAG_CLAN}} Tag clan principal (noms serveurs) MyClan
{{NOM_COMMUNAUTE}} Nom communauté (noms serveurs) MyServer
{{TAG_CLAN_2}} Tag clan secondaire (Kreedz) KZTeam
{{USER_VESTA}} Utilisateur MyVestaCP admin

Contexte

Le réseau {{DOMAINE_GAMING}} proposait historiquement 8 serveurs CS 1.6
(DM, Zombie, War×2, FFA, Test, KZ, Training) sur l’ancien serveur dédié.
On reconstruit la constellation en version moderne sur le nouveau serveur
({{IP_NOUVEAU}}), avec une architecture Docker gérée par
Pterodactyl Panel.

Les 12 serveurs cibles

Serveur Mode Port UDP Maps Plugins clés
Deathmatch FFA respawn instantané 27015 ~60 (aim_ + fy_) ReDeathmatch, YaPB bots, Quake Sounds, Double Jump, Parachute
GunGame Progression d’armes 27016 ~39 (gg_) GunGame 2.13c turbo/DM, Double Jump, BotManager v2
Deathrun Parcours piégés 27017 ~51 (deathrun_) DeathrunManager 3.0.3a, Semiclip
Hide & Seek Cache-cache 27018 Maps HNS HNS plugin, No Boost, Semiclip
Kreedz KZ climbing + bhop 27019 1 694 (kz_ + bhop_) Kreedz AMXX 1.30, mpbhop, MapManagerModular (RTV + nominations)
AUTOMIX 5v5 Compétitif MR15 5v5 27020 de_dust2, de_inferno, de_nuke, de_train, de_cbble PugMod-AMXX v4.0.8 (plugin AMXX)
Surf Surf maps + timer 27022 ~45 (surf_) uSurf (timer, checkpoints), surf_olympics (top times), Speedometer, Bunnyhop, No Fall Damage
CS 1.0 Vintage Beta Vintage nostalgie (à venir) 27021 Maps classiques YaPB bots (placeholder)
Paintball Paintball (armes custom, sprint, vendetta) 27023 Maps paintball PaintBall Refresh, Double Jump, Parachute, BotManager v2, AQS
Furien T=assassins couteau rapides, CT=armes 27024 Maps furien Furien Pack, Auto Bhop, Double Jump, Parachute, Deagle 1 balle, NadeModes, BotManager v2, AQS
BaseBuilder Build & fight (CT vs Zombies) 27025 Maps basebuilder (bb_) ProBaseBuilder, CT Unlimited Ammo, Buy Menu, Knife OneShot, BotManager v2, AQS

Stack technique commun : chaque serveur utilise le même socle —
ReHLDS + ReGameDLL + Metamod-R + AMX Mod X + ReAPI + Reunion.
Seuls les plugins spécifiques au mode de jeu, les maps et les configs diffèrent.

Pourquoi Pterodactyl Panel ?

  • Interface web moderne pour gérer les 12 serveurs (console live, file manager, SFTP)
  • Docker natif — chaque serveur est un conteneur isolé
  • Upload de maps via le file manager web (support ZIP + extraction)
  • Édition des configs directement dans le navigateur (server.cfg, mapcycle.txt, plugins.ini)
  • Gestion des utilisateurs — donner accès à un admin de serveur sans accès SSH
  • SFTP intégré pour les transferts massifs de maps (Kreedz : 1 694 maps)

Architecture cible : Pterodactyl (panel web) + Wings (daemon Docker)
sur le même serveur. Le panel gère la création, le démarrage et l’arrêt
des conteneurs via l’API Wings.


1) Le stack ReHLDS moderne

Contrairement au HLDS vanilla (plus maintenu par Valve), le stack ReHLDS est
activement développé par la communauté et apporte sécurité,
performances et une API étendue pour les plugins.

Composant Version Rôle Téléchargement
ReHLDS 3.14.0.857+ Moteur serveur (remplace hlds_linux) GitHub
ReGameDLL 5.28.0.756+ Logique de jeu (remplace cs.so / mp.dll) GitHub
Metamod-R 1.3.0.149+ Loader de plugins (version optimisée pour ReHLDS) GitHub
AMX Mod X 1.10.0.5461+ Framework de scripting pour plugins (.amxx) amxmodx.org
ReAPI 5.26.0.338+ API AMX Mod X pour ReHLDS/ReGameDLL GitHub
Reunion 0.2.0.25+ Support clients Steam + non-Steam GitHub

Metamod-R ≠ Metamod vanilla.
Metamod-R est spécifiquement conçu pour ReHLDS (API 3.1+) et n’est
pas compatible avec le HLDS vanilla de Valve.
Ne pas les confondre.

Toujours utiliser les dernières versions.
Les liens ci-dessus pointent vers les pages de releases GitHub.
Vérifier les dernières versions avant l’installation —
de nouvelles releases sortent régulièrement avec des correctifs de sécurité.


2) Prérequis sur le serveur

Le serveur ({{IP_NOUVEAU}}) doit avoir Docker et Docker Compose installés
(déjà le cas si Odoo, TeamSpeak, etc. tournent déjà en Docker).

2.1 Vérifier Docker

Aucune autre dépendance à installer.
PHP, MariaDB, Redis — tout est embarqué dans les conteneurs Docker.
Le serveur utilise déjà MyVestaCP avec Nginx : on créera un vhost
reverse proxy pour exposer le panel sur panel.{{DOMAINE_GAMING}}.


3) Déployer Pterodactyl en Docker (Panel + Wings)

Toute la stack Pterodactyl tourne en Docker : Panel (PHP/Laravel),
MariaDB, Redis et Wings (daemon Go).
Zéro installation sur le serveur hôte — juste un docker-compose.yml.

3.1 Créer l’arborescence

Chemins identiques hôte/conteneur :
Wings crée les conteneurs de jeux directement sur le Docker de l’hôte
via le socket. Les volumes de données (data/, logs/,
tmp/) sont montés avec le même chemin
des deux côtés pour que les serveurs de jeux trouvent leurs fichiers.
Seul config/ est remapé vers /etc/pterodactyl/
dans le conteneur (les serveurs de jeux n’y accèdent pas).

3.2 docker-compose.yml

Coller le contenu suivant :

Mots de passe : les mots de passe MySQL sont déjà renseignés.
MYSQL_PASSWORD (dans database) et DB_PASSWORD
(dans panel) doivent être identiques.
Penser à les anonymiser avant de partager ce fichier.

extra_hosts obligatoire : la ligne
extra_hosts: ["panel.{{DOMAINE_GAMING}}:host-gateway"] dans le service
panel est indispensable. Sans elle, le panel ne peut pas
contacter Wings : depuis l’intérieur d’un conteneur Docker, l’accès à l’IP
externe de l’hôte ({{IP_NOUVEAU}}) sur un port mappé est bloqué
(problème de hairpin NAT). Le mot-clé host-gateway
(Docker 20.10+) redirige le FQDN vers l’IP du bridge Docker de l’hôte,
permettant au panel d’atteindre Wings via le port mapping 8543:8080.

Chemins Wings obligatoires : les volumes data/,
logs/ et tmp/ utilisent le même chemin
sur l’hôte et dans le conteneur (/home/docker/pterodactyl/data/
/home/docker/pterodactyl/data/).
C’est obligatoire car Wings crée les conteneurs de serveurs de jeux directement
sur le Docker de l’hôte via le socket. Seul config/ est remapé.

Port du panel : le panel écoute sur 127.0.0.1:8880
(accessible uniquement en local). Il sera exposé sur Internet via un
reverse proxy Nginx de MyVestaCP (section 3.5).

3.3 Démarrer la stack

3.4 Initialiser la base de données

Bug connu : l’image Docker du panel Pterodactyl embarque
un client MariaDB 11.4 qui exige SSL par défaut, mais le conteneur
MariaDB 10.11 n’a pas SSL activé. Résultat : les migrations Laravel
échouent avec SSL is required but the server does not support it.
Il faut charger le schéma manuellement via le conteneur database
(connexion locale, pas de SSL) avant de lancer les migrations.

Pourquoi trois étapes ?
Le fichier mysql-schema.sql contient la structure de la base
mais ne crée pas la table settings (bug connu).
Sans cette table, le panel affiche des erreurs 500 sur certaines opérations.
php artisan migrate applique ensuite les migrations incrémentales
et le --seed insère les données de base (nests, eggs).
Le redémarrage du panel est nécessaire pour qu’il prenne en compte
les nouvelles tables.

Ne JAMAIS relancer le chargement du schéma après l’initialisation !
Le fichier mysql-schema.sql fait des DROP TABLE avant
de recréer les tables. Le relancer efface toutes les données :
utilisateurs, nodes, serveurs, allocations. Cette commande ne doit être
exécutée qu’une seule fois, lors de la première installation.
Si la base est corrompue, préférer créer les tables manquantes individuellement
plutôt que de tout recharger.

3.5 Créer le premier utilisateur admin

3.6 Reverse proxy Nginx (MyVestaCP)

Le panel écoute sur 127.0.0.1:8880 (local uniquement).
Pour l’exposer sur panel.{{DOMAINE_GAMING}}, on crée un template
Nginx reverse proxy dans MyVestaCP, comme pour ownCloud.

3.6.1 Créer le domaine dans MyVestaCP

  1. Se connecter à MyVestaCP sur https://{{IP_NOUVEAU}}:8083
  2. Aller dans WEBAdd Web Domain
  3. Domaine : panel.{{DOMAINE_GAMING}}
  4. Cocher DNS Support
  5. Ne pas cocher « Enable SSL » pour l’instant

3.6.2 Créer le template HTTP (pterodactyl-8880.tpl)

Coller :

3.6.3 Créer le template HTTPS (pterodactyl-8880.stpl)

Coller :

WebSocket : les directives Upgrade et Connection
sont indispensables pour la console live de Pterodactyl,
qui utilise des WebSockets pour afficher les logs en temps réel.

3.6.4 Appliquer le template

Dans MyVestaCP → WEB → cliquer sur panel.{{DOMAINE_GAMING}}
Edit → champ Nginx Template
sélectionner pterodactyl-8880Save.

3.6.5 Vérifier les ports générés

Piège ports 8080/8443 : sur certaines configurations MyVestaCP,
les variables %web_port% et %web_ssl_port% se résolvent
en 8080 et 8443 (ports du backend Apache) au lieu de
80 et 443 (ports Nginx frontend).
Si c’est le cas, corriger manuellement :

3.6.6 Tester l’accès

SSL : activer Let’s Encrypt via MyVestaCP pour
panel.{{DOMAINE_GAMING}} une fois le DNS propagé.
Le TRUSTED_PROXIES: "*" dans le docker-compose permet au panel
de détecter correctement HTTPS derrière le reverse proxy.


4) Configurer Wings (le node)

Wings tourne déjà dans Docker (section 3). Il faut maintenant le connecter au panel.

4.1 Créer la Location

Chaque node Pterodactyl doit être rattaché à une Location.
Il faut la créer avant le node.

  1. Se connecter au panel web (https://panel.{{DOMAINE_GAMING}})
  2. Admin → LocationsCreate New
  3. Short Code : {{HOSTNAME_NOUVEAU}}
  4. Description : OVH VPS {{HOSTNAME_NOUVEAU}} - Gravelines (ou ce que vous voulez)
  5. Create

4.2 Créer le node

  1. Admin → NodesCreate New
  2. Remplir :
    • Name : {{HOSTNAME_NOUVEAU}}
    • Location : sélectionner {{HOSTNAME_NOUVEAU}} (créé à l’étape 4.1)
    • FQDN : panel.{{DOMAINE_GAMING}}
    • Communicate Over SSL : Use SSL Connection (Wings écoute en HTTPS grâce aux certificats SSL montés dans le conteneur)
    • Behind Proxy : Not Behind Proxy (Wings gère le SSL directement)
    • Daemon Server File Directory : /home/docker/pterodactyl/data/volumes
    • Total Memory : 8192 MiB
    • Memory Over-Allocation : -1 (désactive la vérification)
    • Total Disk Space : 50000 MiB
    • Disk Over-Allocation : -1 (désactive la vérification)
    • Daemon Port : 8543
    • Daemon SFTP Port : 2022
  3. Sauvegarder

4.2.1 SSL sur Wings (obligatoire)

Le panel est en HTTPS. Le navigateur refuse les connexions WebSocket non chiffrées
(ws://) depuis une page HTTPS — c’est la politique
« Mixed Content » des navigateurs. Sans SSL sur Wings,
la console ne s’affiche pas et les boutons
Start/Stop/Restart ne fonctionnent pas.

La solution : activer SSL directement sur Wings en montant les certificats SSL
du domaine panel.{{DOMAINE_GAMING}} dans le conteneur Wings
(voir section 3.2, volumes ssl.panel.*.pem et ssl.panel.*.key)
et en activant ssl.enabled: true dans config.yml
(voir section 4.4).

Vérification : dans Admin → Nodes → Settings,
Communicate Over SSL doit être sur Use SSL Connection
et Behind Proxy sur Not Behind Proxy.
Si ces paramètres sont incorrects, le panel ne pourra pas communiquer avec Wings.

4.3 Récupérer le token du node

Le token d’authentification est stocké chiffré en base. Il faut le déchiffrer
pour le mettre dans le config.yml de Wings.
Ne pas utiliser l’onglet Configuration du panel
(préférer la méthode tinker ci-dessous, plus fiable
en cas de réinitialisation de l’APP_KEY).

Pourquoi déchiffrer le token ?
Le panel chiffre le token avec l’APP_KEY Laravel avant de le stocker en base.
L’onglet Configuration du panel est censé le déchiffrer automatiquement,
mais il est plus fiable de le faire en ligne de commande avec tinker.
Si l’APP_KEY change (réinitialisation, migration), les anciens tokens
chiffrés deviennent illisibles (The payload is invalid)
et il faut recréer le node.

4.4 Déposer la configuration Wings

Le répertoire /home/docker/pterodactyl/config/ de l’hôte est monté
sur /etc/pterodactyl/ dans le conteneur Wings.
Générer le fichier complet avec les valeurs récupérées à l’étape précédente :

Ne JAMAIS supprimer le champ token !
Ce token permet l’authentification entre le panel et Wings.
Si ce champ est absent ou vide, Wings crashera au démarrage avec l’erreur
panic: jwt: HMAC key is empty.

Désactiver machine_id (obligatoire en Docker) :
par défaut, Wings 1.12+ active system.machine_id.enabled: true.
Cette fonctionnalité crée un fichier unique par serveur dans
/run/wings/machine-id/ et le monte (bind) dans chaque
conteneur de jeu. Problème : quand Wings tourne lui-même en Docker, ce chemin
n’existe que dans le conteneur Wings, pas sur l’hôte. Or les
conteneurs de jeux sont créés directement sur le Docker de l’hôte (via le socket),
donc le bind mount échoue avec
bind source path does not exist: /run/wings/machine-id/.
Les serveurs restent bloqués en « Installing » indéfiniment.
La solution : passer system.machine_id.enabled à false.

Volume /run/wings obligatoire en Docker-in-Docker :
même avec machine_id désactivé, Wings monte d’autres fichiers
depuis /run/wings/ dans les conteneurs de jeux (ex. :
/run/wings/etc/group). Sans le volume
- /run/wings:/run/wings dans le docker-compose.yml de Wings,
ces bind mounts échouent avec
bind source path does not exist: /run/wings/etc/group
et les serveurs restent bloqués en « Installing ».
Ce volume est déjà inclus dans la section 3.2 ci-dessus.

Conflit réseau Docker (Pool overlaps) :
Wings crée un réseau Docker pterodactyl0 pour isoler les conteneurs
de serveurs de jeux. Par défaut, il utilise un sous-réseau qui peut entrer en
conflit avec les réseaux Docker existants (Odoo, ownCloud, TeamSpeak, etc.).
Sans la section docker.network, Wings crashe au démarrage avec
Pool overlaps with other one on this address space.
Vérifier les sous-réseaux utilisés avec
docker network inspect $(docker network ls -q) --format '{{.Name}}: {{range .IPAM.Config}}{{.Subnet}}{{end}}'
et choisir un /16 libre (ici 172.28.0.0/16).

4.5 Vérifier la connexion Panel ↔ Wings

Dans le panel web : Admin → Nodes → le node doit afficher un
point vert avec la version de Wings. Si le point est rouge,
vérifier que le port 8543 est ouvert dans le firewall :


5) Importer les eggs custom par mode de jeu

Un egg Pterodactyl définit comment installer et lancer un serveur de jeu.
Plutôt que d’utiliser un egg générique et d’installer les plugins manuellement,
on utilise un egg custom par mode de jeu. Chaque egg installe
automatiquement le stack complet (ReHLDS + plugins spécifiques au mode).

5.1 Les eggs disponibles

Egg Mode Plugins installés automatiquement
egg-cs16-deathmatch.json Deathmatch ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, ReDeathmatch, YaPB, AQS, QuickNoScopeD, Double Jump, Parachute, DM Welcome + maps FastDL
egg-cs16-gungame.json GunGame ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, GunGame 2.13c, Double Jump, BotManager v2 + maps FastDL
egg-cs16-deathrun.json Deathrun ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, DeathrunManager v3.0.3a, YaPB, BotManager, AutoBhop, Speedometer, Resetscore + maps FastDL
egg-cs16-hns.json Hide & Seek ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, ReSemiclip (boosts CT), OpenHNS hns_mode, PreFog, HnsMatchSystem, NadeSlow, AutoBhop, Speedometer, Resetscore + maps FastDL
egg-cs16-kreedz.json Kreedz / Bhop ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, ReSemiclip, Theggv/Kreedz v1.3.0 (timer, checkpoints, jumpstats, mpbhop), MapManagerModular v3.2.0 (RTV, nominations, vote), Resetscore + maps FastDL
egg-cs16-war.json AUTOMIX 5v5 ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, PugMod-AMXX v4.0.8 (plugin AMXX)
egg-cs16-surf.json Surf ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, uSurf, surf_olympics, Speedometer, Bunnyhop, No Fall Damage, Resetscore + maps FastDL
egg-cs16-cs10.json CS 1.0 Vintage Beta ReHLDS, ReGameDLL, Metamod-R, AMX Mod X, ReAPI, Reunion, YaPB (placeholder — à venir)

Stack commun à tous les eggs : chaque egg installe automatiquement
SteamCMD → HLDS (App ID 90) → ReHLDS → ReGameDLL → Metamod-R →
AMX Mod X → ReAPI → Reunion. Seuls les plugins spécifiques au mode,
le server.cfg et le mapcycle.txt diffèrent.
Les eggs DM, GunGame, Deathrun, HNS, Kreedz et Surf téléchargent aussi les maps custom depuis le FastDL
via wget récursif et génèrent le mapcycle.txt automatiquement
à partir des .bsp téléchargés.
Les 25 maps par défaut de HLDS (de_dust, cs_assault, as_oilrig…) sont
automatiquement exclues du mapcycle.txt. Pour DM et GG, de_dust2 est conservé.
L’egg WAR inclut les maps de compet (de_dust2, de_inferno, de_nuke, de_train, de_cbble) et configure PugMod-AMXX automatiquement.
L’egg Surf télécharge ~45 maps surf_ depuis le FastDL, compile 6 plugins surf et configure sv_airaccelerate 150.

Eggs testés et corrigés : les scripts d’installation intègrent
des corrections pour 7 pièges majeurs découverts lors du déploiement
(URLs AMX Mod X, architecture steamclient.so, permissions Docker, etc.).
Voir la section 12 pour le détail de chaque problème et sa solution.

steam_appid.txt et steamclient.so (obligatoires pour ReHLDS) :
ReHLDS a besoin du fichier steam_appid.txt contenant 10
(App ID de HLDS) à la racine du serveur, ainsi que de
.steam/sdk32/steamclient.so. Sans ces fichiers, le serveur crash
avec Unable to initialize Steam / SteamAPI_Init() failed.
Les eggs custom incluent déjà cette étape : le script d’installation copie
steamclient.so depuis SteamCMD (avec fallback téléchargement direct)
et génère steam_appid.txt automatiquement.

5.2 Importer dans le Panel

  1. Admin → NestsCreate New → nommer Counter-Strike
  2. Dans le nest « Counter-Strike » → Import Egg
  3. Uploader egg-cs16-deathmatch.json
  4. Répéter l’import pour chaque egg (GunGame, Deathrun, etc.)

Avantage des eggs custom : plus besoin d’accès SSH pour installer
les plugins. Il suffit de créer un serveur avec le bon egg et tout est installé
automatiquement. Un admin sans accès SSH peut gérer entièrement les serveurs
depuis le panel web.


6) Créer les 12 serveurs

Pour chaque serveur, depuis le panel web :
Admin → ServersCreate New.

6.1 Paramètres communs

Paramètre Valeur
Node {{HOSTNAME_NOUVEAU}}
Nest Counter-Strike
Egg L’egg custom du mode (voir section 5)
Memory 512 Mo (suffisant pour CS 1.6)
Disk 2048 Mo (+ volume pour Kreedz)
CPU 100% (1 core)
Swap 0

6.2 Allocation des ports

Créer les allocations dans Admin → Nodes → {{HOSTNAME_NOUVEAU}}
onglet Allocation :

Format des ports : pour ajouter plusieurs ports d’un coup,
utiliser un tiret pour définir une plage : 27015-27025.
Le champ accepte aussi les virgules : 27015,27016,27017.

Puis assigner un port à chaque serveur :

Serveur Port Server Name (variable egg)
Deathmatch 27015 [FR] DEATHMATCH {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
GunGame 27016 [FR] GUNGAME {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
Deathrun 27017 [FR] DEATHRUN {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
HNS 27018 [FR] HNS {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
Kreedz 27019 KZ & BHOP {{TAG_CLAN_2}} SERVER #{{NOM_COMMUNAUTE}}
AUTOMIX 5v5 27020 [FR] AUTOMIX 5v5 {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
Surf 27022 [FR] Surf #{{NOM_COMMUNAUTE}}
CS 1.0 Vintage Beta 27021 [FR] Counter-Strike 1.0 Beta #{{NOM_COMMUNAUTE}}
Paintball 27023 [FR] PAINTBALL {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
Furien 27024 [FR] FURIEN {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}
BaseBuilder 27025 [FR] BASEBUILDER {{TAG_CLAN}} #{{NOM_COMMUNAUTE}}

7) Configuration par serveur

Chaque egg custom installe automatiquement les plugins, le server.cfg
et le mapcycle.txt de base. Après l’installation, personnaliser
les configs via le file manager Pterodactyl ou via SFTP.

7.0 Plugin BotManager v2 — gestion dynamique des bots

Le plugin BotManager v2 maintient 5 bots en permanence sur le serveur
pour attirer les joueurs (un serveur à 5/32 dans le browser attire plus qu’un 0/32).
Quand suffisamment de vrais joueurs sont connectés (seuil configurable, défaut : 4),
tous les bots sont kickés.

Fonctionnement

  • 0 à 3 humains : yb_quota est fixé à la valeur
    de bm_bot_count (défaut : 5) — les bots YaPB remplissent le serveur
  • 4+ humains (seuil bm_kick_threshold) : yb_quota est mis à 0 —
    tous les bots quittent la partie
  • Les transitions sont déclenchées sur client_putinserver,
    client_disconnected et plugin_cfg (au démarrage)

Compilation automatique via l’egg

Le plugin est compilé automatiquement par le script d’installation
de l’egg. Le code source (BotManager.sma) est embarqué directement
dans le script install-dm.sh (et install-gg.sh), puis
compilé avec amxxpc (inclus dans AMX Mod X) à la manière du plugin AQS.
Le fichier BotManager.amxx résultant est placé dans
cstrike/addons/amxmodx/plugins/.

Prérequis : BotManager utilise yb_quota, un cvar
de YaPB (plugin Metamod). YaPB doit être chargé avant
BotManager. L’ordre dans plugins.ini et metamod/plugins.ini
est géré automatiquement par l’egg.

Configuration (server.cfg)

bm_kick_threshold : nombre de vrais joueurs à partir duquel
tous les bots sont kickés. Ajustable selon le mode de jeu (ex : 3 pour Deathrun, 4 pour DM/GunGame).

7.1 Deathmatch (port 27015)

Plugins spécifiques

Plugin Version Type Rôle
ReGameDLL_CS 5.28.0.756 Game DLL Remplace cs.so vanilla (pré-requis ReAPI/ReDeathmatch)
ReAPI 5.26.0.338 Module AMXX Expose l’API de ReGameDLL à AMX Mod X (pré-requis ReDeathmatch)
ReDeathmatch 1.0.0-b11 Plugin AMXX Mode deathmatch (respawn, équipement, spawns)
YaPB 4.4.957 Plugin Metamod Bots intelligents CS 1.6
Advanced Quake Sounds 8.0 Plugin AMXX Sons Quake (headshot, multikill, godlike, etc.)
QuickNoScopeD 1.2 Plugin AMXX Détection noscope AWP/Scout (annonce en jeu)
BotManager 2.0 Plugin AMXX 5 bots toujours présents, kick quand 4+ vrais joueurs (bm_kick_threshold). Voir section 7.0
Double Jump 1.0 Plugin AMXX Permet un saut supplémentaire en l’air (fakemeta)
Parachute 1.0 Plugin AMXX Maintenir E en l’air pour ralentir la chute (fakemeta)
DM Welcome 1.0 Plugin AMXX Message de bienvenue + alias /menu pour /guns

Chaîne de dépendances :
ReDeathmatch nécessite ReAPI, qui nécessite ReGameDLL.
L’ordre d’installation est donc : ReGameDLL → ReAPI → ReDeathmatch.
YaPB, AQS, QuickNoScopeD, Double Jump, Parachute et DM Welcome sont indépendants.

Installation automatique via l’egg

L’egg egg-cs16-deathmatch.json installe automatiquement
tous les plugins ci-dessus lors de la création du serveur. Aucune intervention
manuelle n’est nécessaire — pas besoin d’accès SSH.

L’egg génère aussi un server.cfg (avec sv_downloadurl FastDL)
et télécharge toutes les maps depuis fastdl.{{DOMAINE_GAMING}}/cs_dm.
Le mapcycle.txt est généré automatiquement à partir des .bsp téléchargés.
Personnaliser ensuite via le file manager du panel si besoin.

Vérification post-installation : dans la console du serveur
(panel Pterodactyl), taper meta list pour vérifier que YaPB est chargé
(7/7 RUN), et amxx plugins pour vérifier que les 26 plugins sont running
(ReDeathmatch, AQS, QuickNoScopeD, BotManager, Double Jump, Parachute, DM Welcome).
Les joueurs peuvent taper /sounds en jeu pour activer/désactiver
les sons Quake.

Commandes joueurs

Commande Description
/guns ou /menu Choisir ses armes (menu ReDeathmatch)
/rs Remettre son score à zéro
/para Info parachute
/sounds Activer/désactiver les sons Quake
Double Jump Appuyer sur Espace 2 fois en l’air
Parachute Maintenir E en l’air pour ralentir la chute

Random spawns : mp_randomspawn 3 (ReGameDLL) —
les deux équipes utilisent TOUS les spawns de la map aléatoirement,
évitant que tout le monde apparaisse au même endroit.

server.cfg (extraits clés)

mapcycle.txt

Généré automatiquement par l’egg à partir des fichiers .bsp
téléchargés depuis le FastDL. Toutes les maps présentes sur
fastdl.{{DOMAINE_GAMING}}/cs_dm/maps/ sont incluses.

7.2 GunGame (port 27016)

Plugins spécifiques

  • GunGame AMXX 2.13c — plugin AMX Mod X classique
  • Double Jump 1.0 — saut supplémentaire en l’air (fakemeta, vel[2] = 268.0)
  • BotManager 2.0 — 5 bots toujours présents, kick quand 4+ vrais joueurs (voir section 7.0)

Maps et mapcycle.txt : l’egg télécharge automatiquement les maps
depuis fastdl.{{DOMAINE_GAMING}}/cs_gungame lors de l’installation et
génère le mapcycle.txt à partir des fichiers .bsp présents.
Pour ajouter des maps, les uploader sur le FastDL puis faire Reinstall Server.

server.cfg (extraits clés)

Configuration GunGame (gg_configs)

7.3 Deathrun (port 27017)

Plugins spécifiques

Plugin Rôle
DeathrunManager v3.0.3a Core deathrun (sélection TT, semiclip intégré, système de vies, anti-AFK)
YaPB Bots via Metamod
BotManager v2 5 bots toujours présents, kick quand 4+ vrais joueurs (bm_kick_threshold 4)
AutoBhop (Super Bunny Hopper) Bunny hop automatique (maintenir ESPACE) — supprime le slowdown + boost de vélocité
Speedometer Affichage vitesse en HUD (u/s)
Resetscore /rs ou /resetscore pour remettre le score à zéro

Semiclip intégré : pas besoin d’un plugin Semiclip séparé,
DeathrunManager v3.0.3a inclut le semiclip nativement (dr_semiclip 1).

server.cfg (extraits clés)

deathrun_manager.cfg (CVARs clés)

7.4 Hide & Seek (port 27018)

Plugins spécifiques

Plugin Rôle Source
ReSemiclip Seekers (T) passent à travers entre eux ; Hiders (CT) restent solides pour les boosts (team = 2) GitHub rehlds/resemiclip
OpenHNS hns_mode Core HNS : phase de cache, seekers aveuglés, swap d’équipe, grenades GitHub OpenHNS/hns_mode
PreFog Affichage prestrafe + FOG (frames-on-ground) GitHub OpenHNS/PreFog (compilé depuis .sma)
HnsMatchSystem Système de matchs compétitifs (knife round, captain pick, training) GitHub OpenHNS/HnsMatchSystem
HNS Nade Slow Flash et smoke ralentissent les joueurs proches (vitesse réduite temporairement) Compilé depuis .sma
AutoBhop Bunny hop automatique (maintenir ESPACE) Compilé depuis .sma
Speedometer Affichage vitesse HUD (u/s) Compilé depuis .sma
Resetscore /rs pour remettre son score à zéro Compilé depuis .sma

Boosts activés : ReSemiclip est configuré avec team = 2 (seuls les seekers/T passent à travers).
Les hiders (CT) restent solides entre eux, permettant les boosts (monter sur la tête d’un coquipier).
Les TP sont gérés par les entités trigger_teleport de la map (ex: boost_town).

Pas de YaPB/BotManager : les bots ne savent pas jouer en HNS.

Gameplay HNS

  • CT = Hiders (se cachent), T = Seekers (cherchent)
  • Phase de cache (10-15s) : seekers aveuglés, hiders se positionnent
  • Phase de recherche (2.5 min) : seekers libérés, doivent éliminer tous les hiders
  • Hiders gagnent si au moins 1 survit. Swap d’équipe après 2 victoires consécutives
  • Knives only, mouvement bhop essentiel (sv_airaccelerate 100)

server.cfg (extraits clés)

hns_mode.cfg (CVARs principales)

7.5 Kreedz / Bhop (port 27019)

Plugins spécifiques

Plugin Rôle Source
ReSemiclip Joueurs passent à travers les coéquipiers GitHub rehlds/resemiclip
Theggv/Kreedz v1.3.0 Suite KZ : timer, checkpoints, noclip, spectate, HUD, weapons GitHub Theggv/Kreedz
kz_mpbhop Multi-player bhop (supprime le slowdown) Inclus dans Kreedz
UQ Jumpstats Statistiques de sauts (LJ, BJ, WJ, CJ, HJ) Inclus dans Kreedz
MapManagerModular v3.2.0 Vote de map, RTV (/rtv), nominations (/nominate), blocklist GitHub Mistrick/MapManagerModular
Resetscore /rs pour remettre son score à zéro Compilé depuis .sma

Pas de YaPB/BotManager : les bots ne savent pas jouer en KZ.
Kreedz intègre 20+ plugins (timer, HUD, jumpstats, etc.) dans une seule release ZIP.
Le map_manager de l’archive Kreedz est remplacé par
MapManagerModular (Mistrick) téléchargé séparément depuis GitHub,
qui fournit RTV, nominations et vote automatique.

Plugins désactivés : certains plugins Kreedz sont exclus de l’installation :
kz_sql_* et kz_rank_mysql (pas de MySQL),
kz_records / kz_records_frontend / kz_cups (nécessitent AmxxEasyHttp, incompatible Docker),
map_manager_effects (ressources models/sprites manquantes).
AmxxEasyHttp est un module natif (.so) qui crash en environnement Docker.

Commandes joueur principales

Commande Description
/cp Créer un checkpoint
/gc ou /tp Teleport au dernier checkpoint
/start Retour au début
/nc Noclip (mode entrainement)
/top Top 15 records
/ljstats Statistiques de sauts
/spec Mode spectateur
/menu Menu principal KZ
/rtv Rock The Vote (voter pour changer de map)
/nominate Proposer une map pour le prochain vote
/rs Remettre son score à zéro

server.cfg (extraits clés)

Volume de maps : le serveur Kreedz peut contenir un volume massif de maps.
Utiliser le SFTP de Pterodactyl pour le transfert initial
(le file manager web est trop lent pour autant de fichiers).
Augmenter le Disk Space du serveur dans le panel si nécessaire.

Records SQL (optionnel) : Kreedz supporte le stockage des records
dans une base MySQL. Les plugins SQL (kz_sql_*) sont désactivés par défaut
car ils nécessitent une base MySQL. Pour activer, configurer les identifiants
dans kreedz.cfg et réactiver les plugins SQL dans l’install script.

7.6 AUTOMIX 5v5 (port 27020)

Stack et plugin

Composant Version Type Rôle
ReHLDS 3.14+ Moteur Socle commun
ReGameDLL 5.28+ Game DLL Logique de jeu
Metamod-R 1.3+ Loader Charge les plugins Metamod natifs
AMX Mod X 1.10+ Framework Framework pour les plugins PugMod-AMXX
ReAPI 5.26+ Module AMXX Socle commun
Reunion 0.2+ Plugin Metamod Support Steam + non-Steam
PugMod-AMXX v4.0.8 4.0.8 Plugin AMXX Gestion complète des matchs compétitifs MR15 5v5 (9 plugins .amxx)

PugMod-AMXX est un ensemble de plugins AMX Mod X (fichiers .amxx)
du même développeur que MatchBot (SmileYzn). Il se charge via addons/amxmodx/configs/plugins.ini
et gère entièrement le système de match : knife round, LO3, readys, pauses,
overtime et stats. Dépôt : github.com/SmileYzn/PugMod-AMXX.
Choisi à la place de MatchBot (plugin Metamod natif) car les .so natifs
sont incompatibles avec le conteneur Docker Pterodactyl.

Format de match

  • Mode : MR15 5v5 (premier à 16 rounds, 30 rounds au total)
  • Joueurs : 12 max (10 joueurs + 2 spectateurs / HLTV)
  • Overtime : 6 rounds si égalité 15–15
  • Knife round : détermine le choix de camp
  • LO3 automatique : restart 3× avant le début du match

Fonctionnalités PugMod-AMXX

  • Système ready : le match ne commence qu’une fois toutes les positions prêtes
  • Pause technique pendant le match
  • Anti-ragequit : détection et gestion des déconnexions
  • Stats de dégâts (.dmg) — affichage des dommages infligés/reçus en fin de round
  • HP restants (.hp) — points de vie des adversaires en fin de round

Maps compétitives

  • de_dust2 (map par défaut)
  • de_inferno
  • de_nuke
  • de_train
  • de_cbble

Commandes joueur

Commande Description
.ready Indiquer que son équipe est prête
.help Afficher les commandes disponibles
.dmg Stats de dégâts du dernier round
.hp HP restants des adversaires
.sum Récapitulatif du match (score, rounds)
/rs Reset score (hors match)

Configuration (egg + server.cfg)

L’egg egg-cs16-war.json installe automatiquement PugMod-AMXX et génère
la configuration de base.

Egg et fichier JSON : l’egg egg-cs16-war.json
installe PugMod-AMXX via le répertoire GitHub (release ZIP).
La configuration pugmod.rc est générée avec les paramètres MR15 par défaut.
La map par défaut est de_dust2.

7.7 Surf (port 27022)

Plugins spécifiques

Plugin Source Rôle
uSurf GitHub (DouglasSherk) Timer, checkpoints (/checkpoint, /gocheck), respawn, semiclip
surf_olympics GitHub (evandrocoan) Top times et records par map (nVault), /top3
Speedometer Compilé inline Affichage vitesse HUD (/speed toggle)
Bunnyhop Compilé inline Auto-bhop (FM_PlayerPreThink)
No Fall Damage Compilé inline Supprime les dégâts de chute (HamSandwich)
Resetscore Compilé inline /rs pour remettre le score à zéro

Compilation à l’installation : les 6 plugins surf sont compilés
depuis le code source .sma pendant l’installation de l’egg via amxxpc.
Pas de binaire natif .so — uniquement du bytecode AMXX (.amxx),
compatible Docker sans problème.

CVARs surf (server.cfg)

Maps

~45 maps surf téléchargées automatiquement depuis le FastDL
(https://fastdl.{{DOMAINE_GAMING}}/cs_surf/) via wget récursif.
Le mapcycle.txt est généré automatiquement à partir des .bsp trouvés.
Map par défaut : surf_ski_2.

Commandes joueurs

  • /checkpoint — Sauvegarder la position
  • /gocheck — Téléporter au checkpoint
  • /timer — Menu timer
  • /speed — Toggle speedometer
  • /top3 — Top 3 records
  • /rs — Reset score
  • /surfhelp — Aide surf

Egg et fichier JSON : l’egg egg-cs16-surf.json
installe automatiquement les 6 plugins surf, télécharge les maps depuis le FastDL
et configure sv_airaccelerate 150. 32 slots par défaut.

7.8 CS 1.0 Vintage Beta (port 27021)

Statut : Beta / à venir.
Ce serveur est un placeholder. La configuration détaillée sera complétée
lors du déploiement effectif du serveur CS 1.0 Vintage.

Plugins spécifiques

  • YaPB bots (pour remplir le serveur)
  • Pas de mods lourds — gameplay vanilla CS 1.0

server.cfg (extraits clés)

CS 1.0 sur ReHLDS : ReHLDS supporte les anciens protocoles.
Le gameplay vintage est assuré en limitant les armes et les fonctionnalités
via la configuration. Les maps classiques (de_dust, cs_assault, etc.)
sont incluses dans l’installation HLDS de base.

7.9 Paintball (port 27023)

Concept

Mode Paintball avec armes custom, sprint/stamina, vendetta et système
d’élimination/respawn. Double Jump et Parachute actifs pour un gameplay aérien.

Plugins spécifiques

Plugin Version Rôle
PaintBall Refresh (GlobalModders) 2016 5 plugins : Gameplay, Weapons (9 armes custom), Movement (sprint/stamina), Grenades, Elimination Respawn
Double Jump 1.0 Saut double en l’air (fakemeta)
Parachute 1.0 Parachute déployé avec touche E
BotManager 2.0 5 bots toujours, kick à 4+ humains
AQS latest Advanced Quake Sounds

server.cfg (extraits clés)

Source du mod

GlobalModders PaintBall Refresh
— 5 plugins, 9 armes custom avec models dans /models/paintballR/.

7.10 Furien (port 27024)

Concept

Mode asymétrique : les Terroristes (Furien) sont des assassins au couteau
avec gravité réduite (0.39), vitesse élevée (565), auto bunny hop, double jump
et parachute. Ils peuvent acheter un Deagle 1 balle pour $10 000 via /deagle.
Les CT choisissent leurs armes comme en Deathmatch via /guns et possèdent
toutes les grenades. 7 modes de HE grenades (nademodes).

Plugins spécifiques

Plugin Version Rôle
Furien Pack (ShootingKing) latest Core furien (gravité/vitesse T), models, wallhang, anticamp
NadeModes latest 7 modes HE grenades (fire, frost, laser, etc.)
Furien Deagle 1.0 Achat Deagle 1 balle $10 000 pour T (/deagle)
Furien CT Weapons 1.0 Menu choix armes CT (/guns), grenades incluses
Furien AutoBhop 1.0 Auto bunny hop pour T uniquement
Double Jump 1.0 Saut double en l’air
Parachute 1.0 Parachute (touche E)
Skin Assassin’s Creed 1.0 Model custom T via FastDL
BotManager 2.0 5 bots toujours, kick à 4+ humains
AQS latest Advanced Quake Sounds

server.cfg (extraits clés)

Commandes joueurs

  • /deagle — T : acheter Deagle 1 balle ($10 000)
  • /guns ou /menu — CT : choisir ses armes
  • /para — info parachute (touche E)
  • Double Jump actif pour tous
  • Auto Bhop actif pour T uniquement

Source du mod

ShootingKing Furien Pack
— 20+ plugins, core furien avec classes T/CT.

7.11 BaseBuilder (port 27025)

Concept

Mode BaseBuilder de type zombie : les T (zombies) construisent des bases
avec des blocs pendant la phase de build, puis les CT (humains) attaquent.
CT ont les munitions illimitées, un menu d’achat (/buy),
et le couteau one shot. Les T ont gravité/vitesse spéciales et un shop
(via ProBaseBuilder). Revive admin disponible.

Plugins spécifiques

Plugin Version Rôle
ProBaseBuilder latest Core BaseBuilder : phases build/fight, classes zombie, blocs
CromChat latest Dépendance include pour ProBaseBuilder
BB CT Features 1.0 Munitions illimitées CT, menu d’achat (/buy), knife oneshot, revive admin
BotManager 2.0 5 bots toujours, kick à 4+ humains
AQS latest Advanced Quake Sounds

server.cfg (extraits clés)

Commandes joueurs

  • /buy — CT : menu d’achat armes + grenades + armure
  • /revive — admin : revive un joueur
  • Knife one shot pour tous
  • CT : munitions illimitées automatiquement

Source du mod

ProBaseBuilder +
CromChat (dépendance).


8) Configurer le FastDL

Le FastDL (Fast Download) permet aux joueurs de télécharger les maps et
fichiers custom via HTTP au lieu du transfert lent intégré au moteur.
On utilise un sous-domaine dédié fastdl.{{DOMAINE_GAMING}} avec un template
Nginx personnalisé (autoindex + dark theme), comme pour les templates Odoo.

8.1 Créer le domaine dans MyVestaCP

  1. MyVestaCP → WEBAdd Web Domain
  2. Domaine : fastdl.{{DOMAINE_GAMING}}
  3. DNS Support : cocher
  4. Activer Let’s Encrypt après propagation DNS

8.2 Créer le template Nginx HTTP : fastdl.tpl

Contenu :

8.3 Créer le template Nginx HTTPS : fastdl.stpl

Contenu :

Principe : les templates utilisent autoindex on (listing natif Nginx)
avec sub_filter pour injecter un CSS dark theme directement dans le HTML généré.
Zéro PHP, zéro maintenance — Nginx gère tout nativement.
La navigation dans les sous-dossiers (maps, gfx, sprites, sound…) fonctionne automatiquement.

Attention : le CSS dans sub_filter doit être minifié
sur une seule ligne
(pas de retour à la ligne). Nginx refuse les valeurs multi-lignes
dans sub_filter (voir piège 12.8).
Après application du template, vérifier que les ports générés sont bien 80/443
et non 8080/8443 (voir piège 12.9).

8.4 Appliquer le template au domaine

Vérifier et recharger Nginx :

8.5 Structure des fichiers FastDL

Important : la structure des sous-dossiers (maps, gfx, sound, sprites, overviews…)
doit reproduire l’arborescence de cstrike/.
Le client CS 1.6 demande les fichiers selon le chemin relatif du serveur.
Par exemple, si le serveur a cstrike/maps/de_dust2.bsp,
le client téléchargera https://fastdl.{{DOMAINE_GAMING}}/cs_dm/maps/de_dust2.bsp.

8.6 Intégration FastDL dans les eggs

Les eggs DM, GunGame, Deathrun, HNS, Kreedz et Surf téléchargent automatiquement
les maps et fichiers associés (gfx, sprites, sound, overviews, models, wads) depuis le FastDL
lors de l’installation. Le principe : le FastDL est la source de vérité pour les maps.

Flux de travail : pour ajouter une map, il suffit de l’uploader sur le FastDL
(/home/{{USER_VESTA}}/web/fastdl.{{DOMAINE_GAMING}}/public_html/cs_dm/maps/)
puis de faire Reinstall Server dans Pterodactyl.
L’egg re-télécharge toutes les maps et régénère le mapcycle.txt.

Le server.cfg généré par l’egg inclut automatiquement :

Sons et fichiers custom : les eggs installent certains fichiers custom (sons GunGame,
sprites, etc.) dans le conteneur Docker lors de l’installation, mais ces fichiers doivent
également être présents sur le FastDL pour que les clients les téléchargent
rapidement. Sans cela, le client les télécharge via le serveur de jeu (lent, ~30 Ko/s).
Exemple pour les sons GunGame :

8.7 Compression bz2 (optionnel)

Compression : les fichiers .bsp peuvent être compressés
en .bz2 pour accélérer le téléchargement côté client.
Le client CS 1.6 décompresse automatiquement les fichiers .bz2.


9) Ouvrir les ports dans le firewall

Ports RCON : les ports RCON sont les mêmes que les ports de jeu
mais en TCP. Pterodactyl gère le RCON via la console intégrée, pas besoin
d’ouvrir de ports supplémentaires. Ne pas exposer le RCON
directement sur Internet.

9.1 Vérifier les règles


10) Configurer le DNS

Ajouter les enregistrements DNS pour {{DOMAINE_GAMING}} :

Type Nom Valeur Usage
A @ {{IP_NOUVEAU}} Domaine principal
A panel {{IP_NOUVEAU}} Panel Pterodactyl
A fastdl {{IP_NOUVEAU}} FastDL maps

Enregistrements SRV (optionnel) :
pour que les clients trouvent automatiquement le bon port,
créer un enregistrement SRV par serveur. Exemple pour GunGame :
_cs._udp.gungame.{{DOMAINE_GAMING}} 0 5 27016 {{DOMAINE_GAMING}}.


11) Gestion quotidienne via Pterodactyl

11.1 Uploader des maps

  1. Se connecter au panel → sélectionner le serveur
  2. Onglet Files → naviguer vers cstrike/maps/
  3. Upload → sélectionner le(s) fichier(s) .bsp
  4. Éditer cstrike/mapcycle.txt pour ajouter la map
  5. Console → changelevel nom_de_la_map pour tester

Pour les uploads massifs (Kreedz) : utiliser le SFTP.
Les identifiants SFTP sont dans le panel : Settings → SFTP Details.
Port par défaut : 2022.

11.2 Éditer les configs

Depuis le file manager, éditer directement :

  • cstrike/server.cfg — configuration générale
  • cstrike/mapcycle.txt — rotation des maps
  • cstrike/addons/amxmodx/configs/plugins.ini — plugins actifs
  • cstrike/addons/amxmodx/configs/users.ini — admins AMX Mod X

11.3 Console live

L’onglet Console du panel affiche les logs du serveur en temps réel
et permet d’exécuter des commandes RCON :

11.4 Donner accès à un admin

  1. Admin → UsersCreate New
  2. Créer un compte pour l’admin
  3. Dans le serveur concerné : UsersNew User
  4. Choisir les permissions : console, fichiers, redémarrage, etc.

12) Pièges rencontrés et solutions

Lors du déploiement des eggs DM et GunGame, plusieurs problèmes non documentés
ont été identifiés et corrigés dans les scripts d’installation.
Cette section documente chaque piège pour les futurs eggs.

12.1 AMX Mod X — latest.php renvoie du HTML

Le lien officiel https://www.amxmodx.org/latest.php?type=base&os=linux&version=1.10
renvoie une page HTML (Content-Type: text/html) au lieu de
rediriger vers l’archive .tar.gz. Le script télécharge donc un fichier HTML
qu’il tente d’extraire avec tar xzf, ce qui échoue silencieusement.
Résultat : AMX Mod X n’est pas installé et Metamod affiche badf
pour amxmodx_mm_i386.so.

Solution : utiliser les URLs directes du dossier
amxxdrop/1.10/ au lieu de latest.php :

12.2 steamclient.so — mauvaise architecture (64-bit au lieu de 32-bit)

SteamCMD contient deux versions de steamclient.so :
linux32/steamclient.so (32-bit) et linux64/steamclient.so (64-bit).
Un find -name "steamclient.so" | head -1 peut renvoyer la version 64-bit
selon l’ordre du système de fichiers. HLDS est un binaire 32-bit et crashe avec :

Solution : filtrer par chemin pour forcer la version 32-bit :

12.3 liblist.gam — jamais écrit si Metamod échoue

Si l’écriture de liblist.gam est placée à l’intérieur
du bloc if qui télécharge Metamod, un échec de téléchargement
(rate limit GitHub, timeout) signifie que liblist.gam n’est jamais créé.
Le serveur crashe avec :

Solution : écrire liblist.gam en dehors
du bloc Metamod, avec détection dynamique :

12.4 Permissions Docker — UID 988 ne peut pas lire les fichiers

C’était le problème principal.
Le conteneur d’installation (ghcr.io/ptero-eggs/installers:debian)
tourne en root. Les fichiers créés sont donc possédés par root.
Le conteneur de jeu (ghcr.io/ptero-eggs/games:source) tourne en
UID 988 et ne peut pas lire ces fichiers.
L’étape « Ensuring file permissions » de Pterodactyl ne corrige
pas toujours ce problème.

Symptôme : le serveur crashe avec Couldn't get DLL API from,
les fichiers .so existent mais sont illisibles depuis le conteneur.
Un docker run ... ls -la confirme Permission denied.

Solution : ajouter chmod -R 755 à la fin du script d’installation :

Diagnostic : pour vérifier les permissions depuis l’hôte,
lancer un conteneur avec le même UID que le jeu :

12.5 Reunion — reunion.cfg au mauvais emplacement

Reunion cherche sa config dans cstrike/reunion.cfg (racine du mod),
pas dans cstrike/addons/reunion/reunion.cfg.
De plus, la clé SteamIdHashSalt doit contenir au moins 16 caractères
pour les versions AuthVersion ≥ 3. Sans cela, Reunion se charge mais
affiche fail dans meta list.

Solution : copier reunion.cfg dans cstrike/
et générer un salt automatiquement :

12.6 Advanced Quake Sounds — pas de .amxx pré-compilé

Le dépôt GitHub AdvancedQuakeSounds
ne contient que le code source AQS.sma, pas de fichier .amxx
pré-compilé. Il faut compiler le plugin avec amxxpc
(inclus dans AMX Mod X).

Attention à la syntaxe de amxxpc :
le flag -o s’écrit sans espace avant le chemin
(syntaxe Pawn). Avec un espace, amxxpc interprète le chemin
comme un fichier source à lire et échoue avec
fatal error 100: cannot read from file.

12.7 Injection des scripts dans les eggs JSON

Les scripts bash contiennent des caractères spéciaux (backslashes, guillemets, $)
qui cassent l’encodage JSON si on les copie-colle manuellement.
Utiliser un script Python pour injecter proprement :

Après réimport d’un egg :
importer l’egg mis à jour dans le panel ne met pas à jour
les serveurs existants. Il faut aller dans
Server → Settings → Reinstall Server
pour relancer le script d’installation.

12.8 Nginx sub_filter — la valeur doit tenir sur une seule ligne

La directive sub_filter de Nginx n’accepte pas de retour à la ligne
dans la chaîne de remplacement. Un CSS indenté sur plusieurs lignes provoque une erreur
de syntaxe au démarrage de Nginx :

Solution : minifier le CSS sur une seule ligne, sans saut de ligne
ni indentation dans la valeur sub_filter :

12.9 VestaCP %proxy_port% — résolu en 8080 au lieu de 80

Lors de l’application du template FastDL avec v-change-web-domain-proxy-tpl,
VestaCP a généré les fichiers de config Nginx avec les ports 8080 et
8443 au lieu de 80 et 443. Les variables %proxy_port% et
%proxy_ssl_port% se sont résolues vers les ports backend Apache.

Résultat : Nginx ne démarre pas car Apache occupe déjà ces ports.

Solution définitive : utiliser les ports en dur (80 et 443) directement
dans les fichiers fastdl.tpl et fastdl.stpl au lieu des variables VestaCP :

Puis réappliquer le template et recharger :

Explication : dans l’architecture VestaCP, %proxy_port% désigne
le port où Nginx écoute en tant que proxy vers Apache (8080/8443).
Pour un template FastDL sans backend Apache (Nginx sert directement les fichiers statiques),
il faut écouter sur les ports frontend (80/443). D’où les ports en dur.

Si les templates sont déjà appliqués avec les mauvais ports,
corriger les configs générées en urgence :

Diagnostic : ss -tlnp | grep 8080 pour voir quel service occupe le port.
Apache sur 8080/8443 est le backend normal de VestaCP.

12.10 ssl_stapling — warnings avec certificats auto-signés

Après activation du template HTTPS, nginx -t affiche des warnings
(non bloquants mais gênants) pour les domaines utilisant des certificats auto-signés
ou en attente de Let’s Encrypt :

Solution temporaire : commenter ssl_stapling dans les configs
concernées. Après activation de Let’s Encrypt, décommenter.

Explication : OCSP Stapling nécessite un certificat avec l’URL du
répondeur OCSP de l’autorité de certification.
Les certificats auto-signés de VestaCP n’en ont pas.
Let’s Encrypt fournit cette URL, donc le problème disparaît une fois le certificat LE activé.


Eggs Pterodactyl — fichiers JSON

Chaque egg ci-dessous contient le script d’installation automatique complet.
Cliquez pour déplier, puis copiez le JSON et importez-le dans Pterodactyl
via Admin → Nests → Import Egg.

Pensez à remplacer les {{VARIABLES}} dans chaque egg
par vos propres valeurs (domaine, tags, etc.) avant l’import, ou modifiez-les
après import dans les paramètres de l’egg.


CS 1.6 ReHLDS – Deathmatch


CS 1.6 ReHLDS – GunGame


CS 1.6 ReHLDS – Deathrun


CS 1.6 ReHLDS – HNS


CS 1.6 ReHLDS – Kreedz


CS 1.6 ReHLDS – War (Automix 5v5)


CS 1.6 ReHLDS – Surf


CS 1.6 ReHLDS – Paintball


CS 1.6 ReHLDS – Furien


CS 1.6 ReHLDS – BaseBuilder


CS 1.6 ReHLDS – Fun

13) Récapitulatif de l’architecture finale

Ports utilisés

Port Proto Service
443 TCP Panel Pterodactyl (HTTPS via Nginx)
2022 TCP SFTP Pterodactyl (gestion fichiers)
8543 TCP Wings daemon (API)
27015 UDP CS 1.6 Deathmatch
27016 UDP CS 1.6 GunGame
27017 UDP CS 1.6 Deathrun
27018 UDP CS 1.6 Hide & Seek
27019 UDP CS 1.6 Kreedz
27020 UDP CS 1.6 AUTOMIX 5v5 (PugMod-AMXX MR15)
27022 UDP CS 1.6 Surf (uSurf + timer)
27021 UDP CS 1.6 CS 1.0 Vintage Beta
27023 UDP CS 1.6 Paintball (PaintBall Refresh)
27024 UDP CS 1.6 Furien (assassins + CT weapons)
27025 UDP CS 1.6 BaseBuilder (ProBaseBuilder)

Checklist de déploiement

  • Docker + Docker Compose installés
  • Stack Pterodactyl déployée en Docker (docker compose up -d)
  • Reverse proxy Nginx configuré pour panel.{{DOMAINE_GAMING}}
  • Wings connecté au panel (point vert) + config.yml déposé
  • 9 eggs custom importés dans le nest Counter-Strike (DM, GunGame, Deathrun, HNS, Kreedz, AUTOMIX 5v5, Surf, CS 1.0 Beta)
  • 12 serveurs créés avec les bons ports
  • Configs server.cfg personnalisées par serveur
  • Installation automatique des plugins vérifiée par egg (meta list : 7/7 RUN, amxx plugins : 26/26 running pour DM/GG avec BotManager)
  • BotManager v2 compilé et actif sur DM, GunGame et Deathrun — 5 bots toujours présents (yb_quota 5 + bm_bot_count 5 + bm_kick_threshold 4)
  • HNS : ReSemiclip + OpenHNS hns_mode + PreFog + HnsMatchSystem installés (pas de bots)
  • Kreedz : ReSemiclip + Theggv/Kreedz v1.3.0 + MapManagerModular v3.2.0 installés (timer, jumpstats, mpbhop, RTV, nominations)
  • AUTOMIX 5v5 : PugMod-AMXX v4.0.8 installé (plugins AMXX), format MR15 configuré, maps de compet présentes (de_dust2, de_inferno, de_nuke, de_train, de_cbble)
  • Surf : uSurf + surf_olympics + Speedometer + Bunnyhop + No Fall Damage installés, ~45 maps surf depuis FastDL, sv_airaccelerate 150 (port 27022)
  • CS 1.0 Vintage Beta : placeholder configuré (port 27021)
  • Maps uploadées + mapcycle.txt configurés
  • FastDL configuré (fastdl.{{DOMAINE_GAMING}})
  • Maps compressées en .bz2 pour le FastDL
  • Paintball : PaintBall Refresh + Double Jump + Parachute + BotManager v2 + AQS installés, maps paintball depuis FastDL (port 27023)
  • Furien : Furien Pack + Auto Bhop + Double Jump + Parachute + Deagle 1 balle + CT Weapons + NadeModes + Skin AC + BotManager v2 + AQS installés, maps furien depuis FastDL (port 27024)
  • BaseBuilder : ProBaseBuilder + CT Features (unlimited ammo, buy menu, knife OS, revive) + BotManager v2 + AQS installés, maps bb depuis FastDL (port 27025)
  • Firewall : ports 27015-27025 UDP ouverts
  • Firewall : port 8543 TCP ouvert (Wings)
  • Firewall : port 2022 TCP ouvert (SFTP Pterodactyl)
  • DNS configuré (panel, fastdl, @)
  • Let’s Encrypt activé sur panel et fastdl
  • Admins AMX Mod X configurés (users.ini)
  • RCON passwords changés (pas les valeurs par défaut)
  • Test connexion client sur chaque serveur

À suivre

Les 12 serveurs Counter-Strike 1.6 sont opérationnels et gérés via Pterodactyl.
Prochaines améliorations possibles :

  • HLStats — statistiques centralisées pour tous les serveurs
  • Frontend records Kreedz — site web pour afficher les records KZ/bhop
  • Serveur Zombie Plague — ajout d’un 10ème serveur
  • Sauvegardes automatisées — backup des configs et bases de données
  • Monitoring — intégration GameTracker ou custom

Article précédent : TeamSpeak 3 en Docker — migration serveur vocal avec 235 Go de fichiers.



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 *