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
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.
Ubuntu 22.04/24.04 MySQL 8.x ou MariaDB 10.6+ Pasta padrão /home/fivem 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.
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/fivemA 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.
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 -pDentro 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.
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.cnfCom 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.
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.shCole 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.
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.shVocê 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.
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”.
Crie /home/fivem/scripts/backup-files.sh:
sudo -u fivem nano /home/fivem/scripts/backup-files.shConteú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.
Permissão e teste:
sudo chmod +x /home/fivem/scripts/backup-files.sh
sudo -u fivem /home/fivem/scripts/backup-files.shPra um servidor com 4 GB de resources, espere algo entre 1 GB e 2 GB no arquivo final (gzip nível padrão).
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.
Abra o crontab do usuário fivem:
sudo -u fivem crontab -eAdicione:
# 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>&1Crie 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.logVerifique se o cron registrou:
sudo -u fivem crontab -lOs 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.mdno 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.