Instalação
Dez minutos, e a maior parte do tempo é a esperar que o servidor inicie. Não há ficheiro SQL para importar nem um segundo programa para executar — as tabelas constroem-se sozinhas na primeira vez que o resource inicia.
Cada passo abaixo termina com como saber que funcionou, para que nunca avance na dúvida.
Antes de começar
Seção intitulada “Antes de começar”| O que precisa | Porquê |
|---|---|
| oxmysql, em execução | Tudo o que o telemóvel memoriza vive na sua base de dados |
| ESX, QBCore, QBox ou fmLib | Detetado automaticamente; não precisa de dizer qual é |
| Um servidor FiveM dos últimos dois anos | A parte web do telemóvel usa o Node integrado do próprio servidor |
Mais nada. Sem npm, sem passo de build, sem servidor web.
1. Coloque a pasta no sítio
Seção intitulada “1. Coloque a pasta no sítio”Coloque mic_phone nos seus resources — dentro de uma pasta entre parênteses retos fica mais organizado:
resources/[mic]/mic_phone/Mantenha a pasta com o nome mic_phone. Nada quebra se a renomear, mas o endereço web do telemóvel é construído a partir do nome da pasta, pelo que tudo o que estiver escrito sobre ele também mudaria.
2. Inicie-o depois das dependências
Seção intitulada “2. Inicie-o depois das dependências”No server.cfg, abaixo do oxmysql e abaixo da sua framework:
ensure oxmysqlensure es_extended # or qb-core / qbx_coreensure mic_phoneFuncionou quando a consola disser, ao iniciar:
[mic_phone] web: door B listening on http://0.0.0.0:30125 · door A at /mic_phone/web/ on the game portSe vir uma linha vermelha sobre uma framework, inicie o mic_phone depois da sua framework — quase sempre é esse o motivo.
3. A base de dados — nada a fazer
Seção intitulada “3. A base de dados — nada a fazer”O primeiro arranque lê sql/schema.sql e cria tudo o que faltar. Verá uma sequência de linhas CREATE TABLE IF NOT EXISTS mic_phone_… a passar. É só isso.
Funcionou quando essas linhas aparecerem uma vez e nunca mais nos arranques seguintes.
4. Dê aos jogadores algo para abrir
Seção intitulada “4. Dê aos jogadores algo para abrir”Por padrão, o telemóvel precisa de um item de inventário chamado phone:
-- shared/config.luaConfig.Open = { RequireItem = true, Item = 'phone', ...}A maioria dos servidores ESX e QB já tem esse item. Utilizadores de ox_inventory: adicionem-no à vossa lista de itens se ainda lá não estiver. Está apenas a testar? Defina RequireItem = false e salte este passo completamente.
Funcionou quando entrar no servidor, tiver o item consigo e F1 abrir o telemóvel. /phone faz o mesmo, e T desdobra-o para tablet enquanto está aberto.
5. Definições exclusivas do servidor
Seção intitulada “5. Definições exclusivas do servidor”Copie o exemplo e preencha o que desejar:
shared/server_config.example.lua → shared/server_config.luaEste ficheiro é carregado apenas como script de servidor, pelo que nada nele chega alguma vez a um jogador. Duas coisas vivem lá:
Fotos, vídeos e notas de voz. Coloque um token de media do Fivemanage em ServerConfig.Media.Token (ou na convar FIVEMANAGE_MEDIA_API_KEY) e o telemóvel carrega os ficheiros sozinho, guardando apenas o link resultante. Um webhook do Discord funciona como alternativa.
Sem nenhum dos dois definido,
FallbackToDataUrlguarda o ficheiro dentro da sua base de dados. Isso serve para um teste, mas é pesado em produção — alguns segundos de voz representam dezenas de kilobytes em cada linha afetada. Defina um token ou desative essa opção e deixe os envios falharem de forma visível.
Webhooks do Discord. Um URL por tipo de evento, ou Default para apanhar tudo. O único que vale a pena configurar mesmo que ignore o resto é Server: é o único que o avisa sobre o servidor em vez de um jogador — o endereço mudou, um certificado não foi renovado.
Está pronto
Seção intitulada “Está pronto”O telemóvel funciona. Tudo abaixo é opcional.
Opcional: o telemóvel num telemóvel real
Seção intitulada “Opcional: o telemóvel num telemóvel real”Os jogadores podem levar o telemóvel da sua personagem no seu próprio aparelho. Já vem ativado: Definições › Dispositivos vinculados no telemóvel dentro do jogo mostra um código QR, eles leem-no e digitam os seis dígitos apresentados de volta no jogo. Esse dispositivo passa então a agir como essa personagem.
Por HTTP simples, isso já lhes dá mensagens, correio, contactos, garagem, propriedades e o resto. O que um navegador não entrega a uma página insegura é a melhor parte:
| HTTP simples | HTTPS | |
|---|---|---|
| Mensagens, correio, garagem, tudo o resto | sim | sim |
| Notificações com a aplicação fechada | não | sim |
| Chamadas | não | sim |
| O microfone, para notas de voz | não | sim |
| Instalá-lo como aplicação, com o seu próprio ícone | não | sim |
Obter HTTPS, sem instalar nada
Seção intitulada “Obter HTTPS, sem instalar nada”Este resource pode obter e renovar o seu próprio certificado. Aponte um domínio para o seu servidor, abra duas portas e preencha três linhas:
-- 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' }, },}- Um nome. Numa VPS, isso é um registo A a apontar para o seu endereço. Não tem domínio?
duckdns.orgdá-lhe um gratuito num minuto. - Porta 80 e porta 443 abertas na firewall. A 80 só é aberta enquanto um certificado está a ser pedido e fecha-se novamente assim que a resposta é dada.
Funcionou quando a consola disser:
https: asking for phone.yourserver.comhttps: port 80 open for the challengehttps: challenge port closedhttps: certificate in hand, good until 2027-01-31https: listening on https://phone.yourserver.com/Se a 443 estiver ocupada — alguns routers reservam-na para a sua própria página de administração — sirva noutra porta: Port = 8443, encaminhe a 8443 e escreva Url = 'https://phone.yourserver.com:8443/'. Apenas o desafio tem de passar pela 80; um certificado pertence a um nome, não a uma porta, e tudo continua a funcionar.
docs/HTTPS.md cobre as outras situações: atrás do proxy Cfx.re, atrás de um reverse proxy que já execute, ou num alojamento que não lhe disponibilize portas.
Quando algo não está bem
Seção intitulada “Quando algo não está bem”phonehttps check — pergunta ao servidor de testes da autoridade de certificação se consegue comunicar com a sua máquina. Execute isto primeiro quando não chegar nenhum certificado: separa a sua firewall deste resource.
phonehttps — mostra o estado do certificado e quando será renovado.
phoneduck — mostra o estado do domínio, caso este servidor mantenha o seu próprio nome DuckDNS apontado para si mesmo, e quando o comunicou pela última vez. phoneduck now envia o endereço atual e imprime o que o DuckDNS respondeu, o que é a forma ideal de descobrir se um token está errado sem esperar que o endereço mude.
| O que vê | O que é |
|---|---|
| O telemóvel não abre | Falta o item phone, ou RequireItem está ativo e o jogador não tem um consigo |
| O QR aponta para um endereço inacessível | Defina ServerConfig.Web.Url manualmente; a deteção automática não vê além de um router que mudou a porta |
| Sem certificado, e o registo culpa o desafio (challenge) | A porta 80 não está a chegar a esta máquina. Verifique o encaminhamento de portas e a firewall, nesta ordem |
| As fotos são enormes / a base de dados cresce rapidamente | Sem token de media, e FallbackToDataUrl está a guardar ficheiros na base de dados |
| As chamadas entre dois jogadores ficam mudas | A voz está em auto e não encontrou nenhum resource de voz; indique o seu em Config.Bridge.voice |
Antes de abrir a sua cidade
Seção intitulada “Antes de abrir a sua cidade”shared/server_config.luaé seu. Nunca o partilhe nem o envie para repositórios públicos; ele guarda o seu token de media e os URLs dos seus webhooks.- Aponte o webhook
Serverpara um canal que você leia. É ele que avisa se a porta principal do telemóvel deixar de funcionar, e é o único aviso que terá antes que um jogador lhe diga. - Desative
Config.Debugse o tiver ativado: ele imprime todas as decisões da bridge na consola. - Segurança vale dez minutos de leitura se gerir uma cidade pública: o que este resource assume sobre as pessoas que se ligam a ele e as regras que mantém para que um cliente modificado não consiga ir além da sua própria personagem.