Como adicionar scripts e recursos FiveM sem erro
Guia técnico para adicionar resources no FiveM sem quebrar dependências: estrutura de pastas, ordem em server.cfg, fxmanifest, conflitos e logs de diagnóstico.
Adicionar resources no FiveM parece trivial até o servidor não subir, o console mostrar Couldn't load resource ou um script novo derrubar o framework inteiro. A maior parte dos erros não vem do resource em si — vem de estrutura de pastas errada, fxmanifest inválido, ordem incorreta no server.cfg ou conflito com outro script.
Este guia é pra quem opera um servidor FiveM próprio (Windows ou Linux), já tem framework instalado (ESX ou QBCore) e quer adicionar scripts da comunidade ou pagos sem quebrar nada. Tempo estimado: 10 a 15 minutos por resource bem testado.
Pré-requisitos
Servidor FiveM (FXServer) rodando — Windows Server 2019+ ou Ubuntu 22.04/24.04. Framework instalado (ESX Legacy, QBCore ou outro). Acesso ao filesystem do servidor (RDP no Windows ou SSH no Linux). Acesso ao console do servidor pra recarregar resources sem reiniciar.
/path/to/server-data resources/ server.cfg 30120 Se o seu servidor está em uma VPS Linux, conecte via SSH antes. Em Windows, conecte via RDP e abra um terminal PowerShell na pasta do servidor.
Entendendo a estrutura de um resource
Antes de adicionar qualquer coisa, vale conhecer o que o FXServer espera. Um resource FiveM válido é uma pasta dentro de resources/ (ou em subpastas com prefixo [categoria]) que contém pelo menos um fxmanifest.lua no diretório raiz. Sem esse arquivo, o FXServer ignora o resource — não importa quantos .lua ou .js estejam dentro.
A estrutura típica:
resources/
└── [scripts]/
└── meu-resource/
├── fxmanifest.lua
├── client.lua
├── server.lua
├── config.lua
└── html/
├── index.html
├── style.css
└── script.js
Pastas com colchetes ([scripts], [esx], [qb]) são apenas organização visual — o FXServer faz varredura recursiva. Você pode aninhar até 2-3 níveis sem problema. Evite mais que isso pra não dificultar manutenção.
O fxmanifest.lua mínimo
Todo resource precisa declarar versão da API e jogo alvo. O arquivo mínimo viável:
fx_version 'cerulean'
game 'gta5'
author 'Nome do autor'
description 'Descrição curta'
version '1.0.0'
client_scripts {
'client.lua'
}
server_scripts {
'server.lua'
}
shared_scripts {
'config.lua'
}
fx_version 'cerulean' é o valor atual recomendado (suporta features modernas do FiveM). Versões antigas como adamant ou bodacious ainda funcionam mas perdem capacidades.
Adicionando um resource passo a passo
Copie a pasta do resource pra dentro de resources/ no servidor. Em Linux, via scp ou SFTP:
scp -r meu-resource/ usuario@ip-do-servidor:/path/to/server-data/resources/[scripts]/Em Windows, arraste pela sessão RDP ou use um cliente SFTP como WinSCP. Coloque a pasta dentro de uma categoria com colchetes — [scripts], [custom], [esx], [qb] — pra organizar. Não copie o .zip: extraia antes.
Verifique se existe fxmanifest.lua no diretório raiz do resource. Se o arquivo se chama __resource.lua (formato antigo), o resource ainda funciona, mas considere migrar pra fxmanifest.lua — alguns recursos modernos não rodam mais com o formato legado.
ls /path/to/server-data/resources/[scripts]/meu-resource/Você deve ver fxmanifest.lua listado. Se não, o resource está mal empacotado.
Abra o server.cfg na raiz do servidor e adicione a linha de ativação:
ensure meu-resourceColoque essa linha na ordem correta: depois do framework e de dependências, antes de scripts que dependem dele. Exemplo prático com QBCore:
# Frameworks primeiro
ensure qb-core
# Bibliotecas e dependências
ensure ox_lib
ensure oxmysql
# Scripts de gameplay
ensure qb-multicharacter
ensure qb-spawn
ensure meu-resourceO comando start nome carrega o resource uma vez, mas não respeita refresh nem reinicialização limpa. ensure nome recarrega o resource em hot-reload e garante ordem de dependências. Sempre prefira ensure em servidores de produção.
Salve o server.cfg e recarregue o resource no console do servidor (não precisa reiniciar tudo):
refresh
ensure meu-resourceO comando refresh faz o FXServer revarrer a pasta resources/ e detectar resources novos. Depois, ensure meu-resource inicia ele. Se o resource já estava rodando, use restart meu-resource em vez de ensure pra recarregar.
Confira no console do servidor que o resource subiu sem erro. Você deve ver algo como:
Started resource meu-resourceSe aparecer Couldn't load resource meu-resource ou Error parsing script, abra os logs e vá pra seção de resolução de problemas abaixo.
Verificando que tudo está funcionando
No console do servidor, rode resources pra ver a lista completa de resources ativos. O nome do seu resource deve aparecer com status started. Se aparecer como stopped, ele foi reconhecido mas não está rodando — verifique o ensure no server.cfg.
Pra testar funcionalmente, entre no servidor com seu client FiveM. Scripts client-side reagem geralmente a comandos (/comando), itens no inventário ou eventos automáticos. Abra o console F8 do client (~ ou F8) — erros Lua ou JavaScript do lado client aparecem ali com stack trace.
O FXServer escreve fxserver.log (Linux) ou console.log (Windows) na pasta do servidor. Mantenha um terminal com tail -f logs/fxserver.log rodando enquanto testa — você vê erros em tempo real sem precisar abrir o painel.
Resolução de problemas comuns
”Couldn’t load resource X”
Quase sempre é um fxmanifest.lua ausente ou inválido. Verifique:
- O arquivo se chama exatamente
fxmanifest.lua(minúsculas, com.lua) - Tem
fx_version 'cerulean'egame 'gta5'declarados - Sintaxe Lua válida (vírgulas e aspas equilibradas)
Se o arquivo está correto, confirme que o nome da pasta bate exatamente com o ensure no server.cfg. Em Linux, MeuResource e meuresource são pastas diferentes — case-sensitive.
”Error loading script” com erro Lua
O console mostra a linha exata do erro. Causas frequentes:
- Variável de framework usada antes do framework carregar (ordem errada no
server.cfg) - Dependência ausente (
exports['ox_lib']chamado semox_librodando) - Sintaxe Lua quebrada por edição manual
Pra isolar: comente o resource no server.cfg, reinicie, e adicione um por vez até reproduzir o erro.
Servidor crasha ao iniciar
Comente todos os ensure exceto os core (mapmanager, chat, spawnmanager, sessionmanager, framework). Reinicie. Se subir sem crash, adicione resources um a um até identificar o culpado. Esse processo demora mas é o único confiável quando o erro acontece muito cedo no boot.
Resources com Lua ofuscado (códigos como _G[string.char(...)]) podem conter backdoors, exfiltração de dados de jogadores ou comandos remotos não-autorizados. Use apenas scripts de fontes confiáveis — Cfx forum verificado, Tebex, GitHub com histórico público. Scripts pagos legítimos têm escrow e nunca obrigam ofuscação total.
Conflito entre dois scripts no mesmo evento
Dois resources que registram handler para o mesmo evento (AddEventHandler('playerSpawned', ...)) podem competir pela ordem de execução. O FiveM não garante ordem entre handlers do mesmo evento em resources diferentes. Solução: defina explicitamente dependência no fxmanifest.lua do resource que precisa rodar depois:
dependencies {
'outro-resource'
}
Isso garante que outro-resource carregue primeiro.
Próximos passos
Com a estrutura limpa e resources rodando estável, vale aprofundar em:
- Otimização de scripts: identificar resources que consomem muito CPU usando
resmonno client (Shift+~). Resources acima de 1.0ms client-side merecem revisão. - Backup automatizado de resources: versionar a pasta
resources/em Git privado evita perda quando você quebra algo testando. - Whitelist de scripts: em servidores roleplay, manter uma lista curada de resources aprovados reduz superfície de bug e exploit.
- Banco de dados separado por categoria: scripts pesados (jobs, inventário) podem usar databases isoladas pra reduzir contenção.
Se você está rodando FiveM em produção com 32+ slots e quer infraestrutura que aguenta latência baixa para o Brasil, os servidores de jogos da Hostini entregam latência abaixo de 30ms pra todo o Sudeste com proteção DDoS já incluída no preço.
Perguntas frequentes
Por que aparece 'Couldn't load resource' mesmo com a pasta no lugar certo?
Quase sempre é um fxmanifest.lua inválido ou ausente. O FiveM exige `fx_version` e `game` declarados no topo do arquivo. Sem isso, o resource é ignorado silenciosamente em runtime. Verifique também se o nome da pasta bate exatamente com o `ensure` no server.cfg — Linux é case-sensitive.
Posso só copiar a pasta do resource e reiniciar o servidor?
Não basta. Você precisa adicionar `ensure nome-do-resource` no server.cfg. Apenas colocar a pasta em resources/ faz o FxServer reconhecer o resource como disponível, mas não inicia ele. Use `ensure` em vez de `start` — `ensure` reinicia o resource em hot-reload e respeita dependências.
Em que ordem os recursos devem ser carregados no server.cfg?
Frameworks primeiro (ESX, QBCore), depois bibliotecas compartilhadas (ox_lib, oxmysql, mysql-async), depois resources de gameplay que dependem deles. Inverter essa ordem causa erros de dependência circular e scripts que não enxergam exports do framework.
Como sei se um resource é compatível com meu framework?
Leia o fxmanifest.lua do resource — ele declara `dependencies` ou `shared_scripts` apontando pra qbcore-bridge, es_extended ou similar. Em geral, scripts marcados como 'QBCore' não rodam em ESX sem adaptação. Verifique também a versão do framework: scripts pra QBCore 1.2.x quebram em ramos antigos.
O servidor trava ao iniciar com um resource novo. Como descubro qual?
Comente todos os `ensure` no server.cfg e adicione um por vez, reiniciando entre cada um. O resource que causa o crash aparece com erro Lua/JS no console. Outra opção é rodar com `+set sv_enforceGameBuild` e olhar o console.log em logs/ na pasta do servidor.
Posso editar um script enquanto o servidor está rodando?
Sim. Use `restart nome-do-resource` no console do servidor ou via rcon. Isso recarrega só o resource alterado sem derrubar players. Cuidado com scripts que abrem conexões persistentes (banco, WebSocket) — eles podem manter handlers órfãos até reinicialização completa.