Backup completo do FiveM e banco de dados: rotina automatizada

Aprenda a configurar backup completo do servidor FiveM e banco MySQL/MariaDB com rotação, compressão e restauração testada em VPS Linux.

Servidor FiveM em produção lida com progresso de jogadores, economia in-game, whitelist e customizações que levaram meses pra montar. Perder qualquer um desses dados por falha de disco, erro humano ou ataque é caro — em algumas comunidades, irrecuperável.

Backup manual via WinSCP toda sexta-feira não é estratégia, é torcida. Este tutorial monta uma rotina automatizada que cobre os dois lados que importam: os arquivos do servidor (binário FXServer, pasta resources, server.cfg, txData) e o banco de dados MySQL ou MariaDB usado por frameworks como ESX, QBCore ou vRP. Tempo estimado de execução: 25 a 40 minutos pra configurar tudo, incluindo um teste de restauração.

O alvo é Linux (Ubuntu 22.04 ou 24.04 LTS) porque concentra a maioria dos servidores FiveM sérios. Se você roda Windows, os mesmos conceitos se aplicam — substitua cron por Task Scheduler e bash por PowerShell.

Pré-requisitos

Pré-requisitos

VPS Linux Ubuntu 22.04 LTS ou 24.04 LTS com acesso sudo, FXServer já instalado e rodando, MySQL/MariaDB instalado com banco do framework já criado. Recomendamos ao menos 20 GB livres em disco pra acomodar pelo menos 7 dias de retenção.

Sistema Ubuntu 22.04/24.04
Banco MySQL 8.x ou MariaDB 10.6+
FXServer Pasta padrão /home/fivem
Retenção sugerida 7 diários + 4 semanais

Confirme que o usuário do MySQL usado pelo framework tem permissão de leitura em todas as tabelas — backup com permissões parciais gera dumps incompletos sem aviso óbvio.

Estrutura de diretórios e usuário dedicado

Antes de escrever scripts, defina onde os backups vão morar e quem vai executá-los. Misturar backups com arquivos do servidor é receita pra confusão e pra apagar a coisa errada um dia.

01

Crie a pasta raiz dos backups e dois subdiretórios separados — um pros arquivos do servidor, outro pros dumps do banco:

sudo mkdir -p /var/backups/fivem/{files,database}
sudo chown -R fivem:fivem /var/backups/fivem
sudo chmod 750 /var/backups/fivem

A permissão 750 garante que só o usuário fivem e o grupo lêem o conteúdo. Backup de banco contém credenciais e dados de jogador — não pode ficar 755.

02

Crie um usuário MySQL dedicado pra backups com permissão apenas de leitura. Nunca use o usuário root nem o do framework no script de backup:

sudo mysql -u root -p

Dentro do prompt do MySQL:

CREATE USER 'fivem_backup'@'localhost' IDENTIFIED BY 'SENHA_FORTE_AQUI';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'fivem_backup'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Esse conjunto mínimo de privilégios é o que mysqldump precisa pra produzir um dump completo e consistente.

03

Guarde a senha num arquivo de configuração lido só pelo dono — assim ela não aparece em ps aux quando o script roda:

sudo -u fivem tee /home/fivem/.my.cnf > /dev/null <<EOF
[client]
user=fivem_backup
password=SENHA_FORTE_AQUI
EOF
sudo chmod 600 /home/fivem/.my.cnf

Com esse arquivo no lugar, qualquer comando mysql ou mysqldump rodado como usuário fivem autentica automaticamente, sem precisar passar -p em linha de comando.

Script de backup do banco de dados

O dump do banco é a parte mais crítica e a que mais precisa de cuidado com consistência. Servidor com jogadores online significa escrita constante — um dump simples pode pegar a metade de uma transação.

01

Crie o script /home/fivem/scripts/backup-db.sh:

sudo -u fivem mkdir -p /home/fivem/scripts
sudo -u fivem nano /home/fivem/scripts/backup-db.sh

Cole o conteúdo:

#!/bin/bash
set -euo pipefail

DB_NAME="fivem_framework"
BACKUP_DIR="/var/backups/fivem/database"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
OUTPUT="${BACKUP_DIR}/${DB_NAME}-${TIMESTAMP}.sql.gz"
RETENTION_DAYS=14

mysqldump \
  --single-transaction \
  --quick \
  --routines \
  --triggers \
  --events \
  --default-character-set=utf8mb4 \
  "${DB_NAME}" | gzip -9 > "${OUTPUT}"

find "${BACKUP_DIR}" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete

echo "[$(date)] Backup OK: ${OUTPUT} ($(du -h "${OUTPUT}" | cut -f1))"

Troque fivem_framework pelo nome real do seu banco. As flags --single-transaction e --quick são o que torna o dump seguro com servidor em produção: a primeira garante consistência em InnoDB sem lock, a segunda evita carregar tabela inteira na RAM.

02

Dê permissão de execução e rode uma vez manualmente pra validar:

sudo chmod +x /home/fivem/scripts/backup-db.sh
sudo -u fivem /home/fivem/scripts/backup-db.sh

Você deve ver uma linha tipo Backup OK: /var/backups/fivem/database/fivem_framework-20260529-143022.sql.gz (87M). Se aparecer erro de “access denied”, revise o ~/.my.cnf e os grants do passo anterior.

Teste de restauração é obrigatório

Backup que nunca foi restaurado não é backup, é arquivo. Antes de confiar nessa rotina, crie um banco de teste, restaure um dump nele e confira algumas tabelas críticas (usuários, inventários, posições).

Script de backup dos arquivos do servidor

O lado de arquivos é mais simples mas tem armadilhas — incluir diretórios voláteis como logs e cache infla o backup sem ganho, e copiar txData durante runtime gera warnings de “file changed as we read it”.

01

Crie /home/fivem/scripts/backup-files.sh:

sudo -u fivem nano /home/fivem/scripts/backup-files.sh

Conteúdo:

#!/bin/bash
set -euo pipefail

SOURCE_DIR="/home/fivem/server-data"
BACKUP_DIR="/var/backups/fivem/files"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
OUTPUT="${BACKUP_DIR}/fivem-files-${TIMESTAMP}.tar.gz"
RETENTION_DAYS=30

tar \
  --exclude='*/cache' \
  --exclude='*/logs' \
  --exclude='*/tmp' \
  --exclude='*.log' \
  --warning=no-file-changed \
  -czf "${OUTPUT}" \
  -C "$(dirname "${SOURCE_DIR}")" \
  "$(basename "${SOURCE_DIR}")"

find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete

echo "[$(date)] Backup OK: ${OUTPUT} ($(du -h "${OUTPUT}" | cut -f1))"

Ajuste SOURCE_DIR pro caminho real onde fica seu server.cfg e a pasta resources. O --warning=no-file-changed suprime o ruído de arquivos modificados durante a leitura — é esperado em servidor ativo.

02

Permissão e teste:

sudo chmod +x /home/fivem/scripts/backup-files.sh
sudo -u fivem /home/fivem/scripts/backup-files.sh

Pra um servidor com 4 GB de resources, espere algo entre 1 GB e 2 GB no arquivo final (gzip nível padrão).

Backup incremental pra grandes volumes

Se seus resources passam de 20 GB, considere restic ou borgbackup em vez de tar. Ambos fazem deduplicação por bloco — backup diário ocupa só o delta, não o arquivo inteiro. Trade-off: restauração mais lenta e ferramenta extra na stack.

Agendamento via cron

Com os dois scripts validados manualmente, agendamos eles pra rodar automaticamente. A regra é simples: banco com frequência alta (diário), arquivos com frequência menor (semanal), sempre em horários de baixo movimento.

01

Abra o crontab do usuário fivem:

sudo -u fivem crontab -e

Adicione:

# Backup do banco — todo dia às 04:30
30 4 * * * /home/fivem/scripts/backup-db.sh >> /var/log/fivem-backup.log 2>&1

# Backup dos arquivos — toda segunda às 05:00
0 5 * * 1 /home/fivem/scripts/backup-files.sh >> /var/log/fivem-backup.log 2>&1

Crie o arquivo de log e ajuste dono pra evitar erro de permissão na primeira execução:

sudo touch /var/log/fivem-backup.log
sudo chown fivem:fivem /var/log/fivem-backup.log
02

Verifique se o cron registrou:

sudo -u fivem crontab -l

Os horários sugeridos (04:30 e 05:00) costumam ser os de menor presença em servidores brasileiros. Ajuste pra o pico inverso do seu servidor.

Verificação

Depois de 24 horas, valide que tudo está rodando como esperado.

ls -lh /var/backups/fivem/database/
ls -lh /var/backups/fivem/files/
tail -n 20 /var/log/fivem-backup.log

Você deve ver pelo menos um .sql.gz novo no diretório do banco e linhas de sucesso no log. Se o backup do banco está abaixo de 1 KB, algo falhou silenciosamente — abra o .sql.gz com zcat arquivo.sql.gz | head -50 e confira se aparece o dump real.

Pra testar restauração, crie um banco vazio e importe um dump:

mysql -u root -p -e "CREATE DATABASE fivem_test;"
zcat /var/backups/fivem/database/fivem_framework-LATEST.sql.gz | mysql -u root -p fivem_test
mysql -u root -p fivem_test -e "SHOW TABLES;"

A lista de tabelas deve bater com o servidor de produção.

Resolução de problemas

”mysqldump: Got error: 1044: Access denied”

Falta privilégio no usuário de backup. Rode os GRANT do passo de criação do usuário novamente e confirme com SHOW GRANTS FOR 'fivem_backup'@'localhost';.

”tar: file changed as we read it” em loop

Esperado em servidor ativo. O --warning=no-file-changed no script já silencia. Se aparecer mesmo assim, alguma versão antiga do tar não suporta — atualize pra tar >= 1.30.

Backup cresce indefinidamente

O find -mtime +N -delete só funciona se o cron rodou ao menos N+1 dias. Confira ls -lh no diretório e force limpeza manual se precisar: find /var/backups/fivem/database -name "*.sql.gz" -mtime +14 -delete.

Próximos passos

  • Envie os backups pra storage externo com rclone (S3-compatível, Backblaze B2, Google Drive) — backup local não protege contra perda do servidor inteiro
  • Configure alerta via webhook do Discord quando o script falhar, lendo o exit code do cron
  • Adicione monitoramento de tamanho do dump — alerta se o arquivo de hoje ficou 50% menor que a média da semana, sinal de corrupção silenciosa
  • Documente o procedimento de restauração num arquivo RUNBOOK.md no próprio servidor — em emergência ninguém quer reaprender comando

Se você está colocando isso em produção e quer infraestrutura otimizada pra servidor FiveM, os planos de jogos da Hostini já vêm com proteção DDoS em rede e snapshots no nível do hipervisor — duas camadas adicionais que complementam a rotina de backup descrita aqui.

Perguntas frequentes

Posso usar mysqldump com o servidor FiveM rodando?

Sim, desde que use a flag `--single-transaction` em tabelas InnoDB. Ela cria uma transação consistente sem travar escrita, o que é essencial num servidor com jogadores online. Em tabelas MyISAM, considere `--lock-tables` ou parar o servidor por alguns segundos.

Quanto espaço o backup vai ocupar?

Um servidor FiveM típico tem entre 2 GB e 10 GB de resources, e o dump do banco compactado em gzip costuma ficar abaixo de 200 MB pra bases com 5 mil jogadores. Mantenha pelo menos 3x o tamanho do servidor livre em disco pra rotação.

Preciso parar o servidor pra fazer backup dos resources?

Não é obrigatório, mas tar lendo diretórios escritos em tempo real (logs, txData/data) pode gerar warnings. Pra produção, faça o backup em horário de menor movimento e exclua diretórios voláteis com `--exclude` no tar.

Como restaurar só o banco sem mexer nos arquivos do servidor?

Descompacte o `.sql.gz` específico com `gunzip` e rode `mysql -u user -p database < dump.sql`. Antes, faça um dump do estado atual como segurança. A restauração pode levar de alguns segundos a minutos dependendo do tamanho do banco.

Vale a pena enviar backups pra storage externo?

Sim, sempre. Backup no mesmo disco do servidor não protege contra falha de hardware ou comprometimento do host. Use rclone com S3-compatível, Backblaze B2 ou um servidor secundário via rsync sobre SSH.

Com que frequência devo rodar o backup?

Pra banco de dados, recomendamos diário em servidores ativos — perda máxima de 24 horas de progresso. Pra resources e configurações, semanal já cobre a maioria dos casos, já que mudam menos. Servidores com economy ativa podem precisar de backup do banco a cada 6 horas.

Tópicos:
Próximos passos VPS, dedicado ou painel gerenciado para FiveM, SAMP, MTA, Tibia e mais.Hospede seu servidor de jogos com a Hostini →
Esse tutorial foi útil?
Falar no WhatsApp