Aller au contenu

Installation

Dix minutes, dont la majeure partie consiste Ă  attendre que le serveur dĂ©marre. Il n’y a aucun fichier SQL Ă  importer et aucun second programme Ă  exĂ©cuter — les tables se crĂ©ent d’elles-mĂȘmes au premier dĂ©marrage de la ressource.

Chaque étape ci-dessous se termine par comment savoir si cela a fonctionné, pour ne jamais passer à la suite avec un doute.


Ce dont vous avez besoinPourquoi
oxmysql, en cours d’exĂ©cutionTout ce que le tĂ©lĂ©phone retient rĂ©side dans votre base de donnĂ©es
ESX, QBCore, QBox ou fmLibDétecté automatiquement ; pas besoin de préciser lequel
Un serveur FiveM des deux derniÚres annéesLa partie web du téléphone utilise le Node intégré du serveur

Rien d’autre. Pas de npm, pas d’étape de compilation, pas de serveur web.


DĂ©posez mic_phone dans vos resources — un dossier entre crochets est ce qu’il y a de plus propre :

resources/[mic]/mic_phone/

Gardez le nom de dossier mic_phone. Rien ne casse si vous le renommez, mais l’adresse web du tĂ©lĂ©phone est construite Ă  partir du nom du dossier, donc tout ce qui est documentĂ© Ă  son sujet changerait Ă©galement.


Dans server.cfg, en dessous d’oxmysql et en dessous de votre framework :

ensure oxmysql
ensure es_extended # or qb-core / qbx_core
ensure mic_phone

Cela a fonctionné lorsque la console indique, au démarrage :

[mic_phone] web: door B listening on http://0.0.0.0:30125 · door A at /mic_phone/web/ on the game port

Si vous voyez une ligne rouge concernant un framework Ă  la place, dĂ©marrez mic_phone aprĂšs votre framework — c’est presque toujours la cause.


Le premier dĂ©marrage lit sql/schema.sql et crĂ©e tout ce qui manque. Vous verrez dĂ©filer une sĂ©rie de lignes CREATE TABLE IF NOT EXISTS mic_phone_
. C’est tout.

Cela a fonctionné lorsque ces lignes apparaissent une seule fois et plus jamais lors des démarrages ultérieurs.


Par dĂ©faut, le tĂ©lĂ©phone nĂ©cessite un item d’inventaire nommĂ© phone :

-- shared/config.lua
Config.Open = {
RequireItem = true,
Item = 'phone',
...
}

La plupart des configurations ESX et QB possĂšdent dĂ©jĂ  cet item. Utilisateurs d’ox_inventory : ajoutez-le Ă  votre liste d’items s’il n’y est pas. Vous voulez simplement l’essayer ? DĂ©finissez RequireItem = false et ignorez totalement cette Ă©tape.

Cela a fonctionnĂ© lorsque vous vous connectez, portez l’item, et que F1 ouvre le tĂ©lĂ©phone. /phone fait de mĂȘme, et T le dĂ©plie en tablette lorsqu’il est ouvert.


Copiez le fichier d’exemple et remplissez ce que vous souhaitez :

shared/server_config.example.lua → shared/server_config.lua

Ce fichier est chargé uniquement comme script serveur, donc rien de son contenu ne parvient à un joueur. Deux éléments y résident :

Photos, vidĂ©os et notes vocales. Indiquez un token mĂ©dia Fivemanage dans ServerConfig.Media.Token (ou la convar FIVEMANAGE_MEDIA_API_KEY) et le tĂ©lĂ©phone tĂ©lĂ©verse les fichiers lui-mĂȘme, en ne stockant que le lien obtenu. Un webhook Discord sert de solution de secours.

Si aucun des deux n’est dĂ©fini, FallbackToDataUrl conserve le fichier au sein de votre base de donnĂ©es. C’est parfait pour un test mais trĂšs lourd en production — quelques secondes de voix reprĂ©sentent des dizaines de kilo-octets sur chaque ligne concernĂ©e. DĂ©finissez un token, ou dĂ©sactivez cette option pour que les tĂ©lĂ©versements Ă©chouent explicitement.

Webhooks Discord. Une URL par type d’évĂ©nement, ou Default pour tout intercepter. Celui qui mĂ©rite d’ĂȘtre configurĂ© mĂȘme si vous ignorez le reste est Server : c’est le seul qui vous informe sur le serveur plutĂŽt que sur un joueur — changement d’adresse, certificat non renouvelĂ©.


Le téléphone fonctionne. Tout ce qui suit est optionnel.


Les joueurs peuvent consulter le tĂ©lĂ©phone de leur personnage sur leur propre appareil. C’est dĂ©jĂ  activĂ© : ParamĂštres â€ș Appareils liĂ©s sur le tĂ©lĂ©phone en jeu affiche un code QR, ils le scannent et saisissent en jeu les six chiffres affichĂ©s. Cet appareil agit alors en tant que ce personnage.

En simple HTTP, cela leur donne dĂ©jĂ  accĂšs aux messages, e-mails, contacts, au garage, aux propriĂ©tĂ©s et au reste. Ce qu’un navigateur refuse de fournir Ă  une page non sĂ©curisĂ©e reprĂ©sente pourtant le meilleur :

HTTP simpleHTTPS
Messages, e-mails, garage, tout le resteouioui
Notifications avec l’application fermĂ©enonoui
Appelsnonoui
Le microphone, pour les notes vocalesnonoui
L’installer en tant qu’app, avec son icînenonoui

Cette ressource peut obtenir et renouveler son propre certificat. Faites pointer un nom de domaine vers votre serveur, ouvrez deux ports et renseignez trois lignes :

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}
  1. Un nom de domaine. Sur un VPS, c’est un enregistrement A pointant vers son adresse IP. Pas de domaine ? duckdns.org vous en fournit un gratuitement en une minute.
  2. Port 80 et port 443 ouverts sur le pare-feu. Le port 80 n’est ouvert que pendant la demande du certificat, puis refermĂ© dĂšs que la validation est effectuĂ©e.

Cela a fonctionné lorsque la console indique :

https: asking for phone.yourserver.com
https: port 80 open for the challenge
https: challenge port closed
https: certificate in hand, good until 2027-01-31
https: listening on https://phone.yourserver.com/

Si le port 443 est dĂ©jĂ  pris — certains routeurs le conservent pour leur propre page d’administration — diffusez sur un autre port : Port = 8443, redirigez le 8443 et Ă©crivez Url = 'https://phone.yourserver.com:8443/'. Seul le challenge doit obligatoirement passer par le port 80 ; un certificat appartient Ă  un nom de domaine, pas Ă  un port, et tout fonctionne parfaitement.

docs/HTTPS.md détaille les autres cas de figure : derriÚre le proxy Cfx.re, derriÚre un reverse proxy que vous exploitez déjà, ou sur un hébergeur qui ne vous ouvre pas de ports.


phonehttps check — demande au serveur de test de l’autoritĂ© de certification s’il parvient Ă  communiquer avec votre machine. ExĂ©cutez ceci en premier si aucun certificat n’arrive : cela permet de distinguer un souci sur votre pare-feu d’un problĂšme sur cette ressource.

phonehttps — statut du certificat et date de son prochain renouvellement.

phoneduck — statut du nom de domaine, si ce serveur pointe son propre domaine DuckDNS vers lui-mĂȘme, et date de sa derniĂšre notification. phoneduck now transmet l’adresse qu’il a actuellement et affiche la rĂ©ponse de DuckDNS, ce qui permet de s’apercevoir qu’un token est incorrect sans attendre que l’adresse IP ne change.

Ce que vous observezCe que c’est
Le tĂ©lĂ©phone ne s’ouvre pasAucun item phone, ou RequireItem est activĂ© et le joueur n’en porte pas
Le QR pointe vers un endroit inaccessibleDĂ©finissez ServerConfig.Web.Url manuellement ; la dĂ©tection automatique ne voit pas au-delĂ  d’un routeur ayant dĂ©placĂ© le port
Aucun certificat, et le log met en cause le challengeLe port 80 n’atteint pas cette machine. VĂ©rifiez la redirection de port puis le pare-feu, dans cet ordre
Les photos sont énormes / la BDD grossit vitePas de token média, et FallbackToDataUrl enregistre les fichiers dans la base de données
Les appels entre deux joueurs sont silencieuxLa voix est sur auto et n’a trouvĂ© aucune ressource vocale ; indiquez la vĂŽtre dans Config.Bridge.voice

  • shared/server_config.lua vous appartient. Ne le partagez jamais et ne le committez sur aucun dĂ©pĂŽt public ; il contient votre token mĂ©dia et les URL de vos webhooks.
  • Faites pointer le webhook Server vers un salon que vous lisez. C’est lui qui avertit que la porte d’entrĂ©e du tĂ©lĂ©phone ne fonctionne plus, et c’est le seul avertissement que vous aurez avant qu’un joueur ne vienne vous le signaler.
  • DĂ©sactivez Config.Debug si vous l’aviez activĂ© : il affiche chaque dĂ©cision du bridge dans la console.
  • SĂ©curitĂ© mĂ©rite dix minutes si vous gĂ©rez une ville publique : les hypothĂšses que cette ressource fait sur les personnes qui s’y connectent, et les rĂšgles qu’elle applique pour qu’un client modifiĂ© ne puisse rien atteindre en dehors de son propre personnage.