Gestion technique des MLO¶
Inventaire et état désiré¶
medusa-admin parcourt les resources FiveM avec GetNumResources, GetResourceByFindIndex et
GetResourcePath. Seules celles dont le chemin normalisé appartient à [medusamappings],
[medusamappings2] ou [medusamappings3] sont publiées vers POST /internal/v1/mlo/sync. La
table mlo_resources conserve le chemin, les notes, l’état désiré, l’état runtime, la présence et
la date du dernier inventaire. Le web admin déduit le pack de ce chemin pour l'afficher sur chaque
fiche sans dupliquer cette donnée en base.
Le filtre de la page MLO est exécuté entièrement dans le navigateur sur l'inventaire déjà reçu.
mloResources conserve la réponse complète et renderMlos() applique une comparaison de
resource_name insensible à la casse à chaque événement input. Une actualisation remplace
l'inventaire mais conserve la valeur du champ, sans requête API supplémentaire par frappe.
PostgreSQL reste la source de vérité pour les notes et desired_enabled. Toutes les cinq secondes,
le resource compare cet état à GetResourceState et exécute uniquement start NOM ou stop NOM
si nécessaire. Les noms transmis à une commande sont limités à [A-Za-z0-9_.-]. Une nouvelle
resource est activée par défaut, même si elle est découverte avant la fin du démarrage du groupe.
Au redémarrage, FiveM charge d'abord le groupe configuré puis la synchronisation réapplique les
états désactivés persistés dans PostgreSQL dans les cinq secondes suivantes.
start et stop sont des commandes FiveM restreintes lorsqu'elles sont appelées avec
ExecuteCommand. server.cfg.template accorde donc exclusivement command.start et
command.stop au principal resource.medusa-admin. Sans ces deux ACE, FiveM journalise
Access denied for command stop ou start, puis la boucle de réconciliation réessaie toutes les
cinq secondes sans pouvoir appliquer l'état désiré.
Redémarrage complet¶
La table fivem_restart_requests porte la file idempotente pending → processing → completed.
L’API web exige CSRF et ADMIN_ALLOW_RESTART_FIVEM. Le resource FiveM réclame atomiquement la
demande, puis écrit .container-restart-request dans son propre répertoire. Un watchdog POSIX
lancé par entrypoint.sh retire ce signal et envoie SIGTERM au PID 1. Grâce à
restart: unless-stopped, Docker recrée le conteneur sans montage du socket Docker. Au démarrage,
medusa-admin marque les demandes en cours comme terminées avant de republier l’inventaire.
La migration 0012_mlo_management crée les deux tables. Les routes web vivent sous /admin/mlo
et les routes FiveM protégées par X-Internal-Api-Key sous /internal/v1/mlo.