Backup completo de FiveM y base de datos: rutina automatizada

Aprende a configurar backup completo del servidor FiveM y base MySQL/MariaDB con rotación, compresión y restauración probada en VPS Linux.

Un servidor FiveM en producción maneja progreso de jugadores, economía in-game, whitelist y customizaciones que llevaron meses montar. Perder cualquiera de estos datos por fallo de disco, error humano o ataque es caro — en algunas comunidades, irrecuperable.

Backup manual vía WinSCP todos los viernes no es estrategia, es plegaria. Este tutorial monta una rutina automatizada que cubre los dos lados que importan: los archivos del servidor (binario FXServer, carpeta resources, server.cfg, txData) y la base de datos MySQL o MariaDB usada por frameworks como ESX, QBCore o vRP. Tiempo estimado de ejecución: 25 a 40 minutos para configurar todo, incluido un test de restauración.

El objetivo es Linux (Ubuntu 22.04 o 24.04 LTS) porque concentra la mayoría de los servidores FiveM serios. Si corres Windows, los mismos conceptos aplican — reemplaza cron por Task Scheduler y bash por PowerShell.

Prerrequisitos

Prerrequisitos

VPS Linux Ubuntu 22.04 LTS o 24.04 LTS con acceso sudo, FXServer ya instalado y corriendo, MySQL/MariaDB instalado con la base del framework ya creada. Recomendamos al menos 20 GB libres en disco para acomodar como mínimo 7 días de retención.

Sistema Ubuntu 22.04/24.04
Base MySQL 8.x o MariaDB 10.6+
FXServer Carpeta por defecto /home/fivem
Retención sugerida 7 diarios + 4 semanales

Confirma que el usuario de MySQL usado por el framework tiene permiso de lectura en todas las tablas — backup con permisos parciales genera dumps incompletos sin aviso obvio.

Estructura de directorios y usuario dedicado

Antes de escribir scripts, define dónde vivirán los backups y quién los ejecutará. Mezclar backups con archivos del servidor es receta para confusión y para borrar lo equivocado algún día.

01

Crea la carpeta raíz de los backups y dos subdirectorios separados — uno para los archivos del servidor, otro para los dumps de la base:

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

El permiso 750 garantiza que sólo el usuario fivem y el grupo leen el contenido. Backup de base contiene credenciales y datos de jugador — no puede quedar en 755.

02

Crea un usuario MySQL dedicado para backups con permiso sólo de lectura. Nunca uses el usuario root ni el del framework en el script de backup:

sudo mysql -u root -p

Dentro del prompt de MySQL:

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

Este conjunto mínimo de privilegios es lo que mysqldump necesita para producir un dump completo y consistente.

03

Guarda la contraseña en un archivo de configuración leído sólo por el dueño — así no aparece en ps aux cuando el script corre:

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

Con este archivo en su lugar, cualquier comando mysql o mysqldump ejecutado como usuario fivem autentica automáticamente, sin necesidad de pasar -p en línea de comando.

Script de backup de la base de datos

El dump de la base es la parte más crítica y la que más necesita cuidado con la consistencia. Servidor con jugadores online significa escritura constante — un dump simple puede atrapar la mitad de una transacción.

01

Crea el 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

Pega el contenido:

#!/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))"

Cambia fivem_framework por el nombre real de tu base. Las flags --single-transaction y --quick son lo que hace el dump seguro con servidor en producción: la primera garantiza consistencia en InnoDB sin lock, la segunda evita cargar la tabla entera en RAM.

02

Dale permiso de ejecución y córrelo una vez manualmente para validar:

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

Deberías ver una línea tipo Backup OK: /var/backups/fivem/database/fivem_framework-20260529-143022.sql.gz (87M). Si aparece error de “access denied”, revisa el ~/.my.cnf y los grants del paso anterior.

El test de restauración es obligatorio

Backup que nunca fue restaurado no es backup, es archivo. Antes de confiar en esta rutina, crea una base de prueba, restaura un dump en ella y verifica algunas tablas críticas (usuarios, inventarios, posiciones).

Script de backup de los archivos del servidor

El lado de archivos es más simple pero tiene trampas — incluir directorios volátiles como logs y cache infla el backup sin ganancia, y copiar txData durante runtime genera warnings de “file changed as we read it”.

01

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

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

Contenido:

#!/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))"

Ajusta SOURCE_DIR a la ruta real donde está tu server.cfg y la carpeta resources. El --warning=no-file-changed suprime el ruido de archivos modificados durante la lectura — es esperado en servidor activo.

02

Permiso y prueba:

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

Para un servidor con 4 GB de resources, espera algo entre 1 GB y 2 GB en el archivo final (gzip nivel por defecto).

Backup incremental para grandes volúmenes

Si tus resources superan los 20 GB, considera restic o borgbackup en lugar de tar. Ambos hacen deduplicación por bloque — backup diario ocupa sólo el delta, no el archivo entero. Trade-off: restauración más lenta y herramienta extra en el stack.

Programación vía cron

Con los dos scripts validados manualmente, los agendamos para que corran automáticamente. La regla es simple: base con frecuencia alta (diario), archivos con frecuencia menor (semanal), siempre en horarios de bajo movimiento.

01

Abre el crontab del usuario fivem:

sudo -u fivem crontab -e

Agrega:

# Backup de la base — todos los días a las 04:30
30 4 * * * /home/fivem/scripts/backup-db.sh >> /var/log/fivem-backup.log 2>&1

# Backup de los archivos — cada lunes a las 05:00
0 5 * * 1 /home/fivem/scripts/backup-files.sh >> /var/log/fivem-backup.log 2>&1

Crea el archivo de log y ajusta el dueño para evitar error de permiso en la primera ejecución:

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

Verifica que el cron registró:

sudo -u fivem crontab -l

Los horarios sugeridos (04:30 y 05:00) suelen ser los de menor presencia en servidores hispanohablantes. Ajusta al pico inverso de tu servidor.

Verificación

Después de 24 horas, valida que todo está corriendo como esperado.

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

Deberías ver al menos un .sql.gz nuevo en el directorio de la base y líneas de éxito en el log. Si el backup de la base está por debajo de 1 KB, algo falló silenciosamente — abre el .sql.gz con zcat archivo.sql.gz | head -50 y comprueba que aparece el dump real.

Para probar restauración, crea una base vacía e importa un 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;"

La lista de tablas debe coincidir con el servidor de producción.

Resolución de problemas

”mysqldump: Got error: 1044: Access denied”

Falta privilegio en el usuario de backup. Ejecuta los GRANT del paso de creación del usuario nuevamente y confirma con SHOW GRANTS FOR 'fivem_backup'@'localhost';.

”tar: file changed as we read it” en bucle

Esperado en servidor activo. El --warning=no-file-changed en el script ya silencia. Si aparece de todos modos, alguna versión antigua de tar no lo soporta — actualiza a tar >= 1.30.

El backup crece indefinidamente

El find -mtime +N -delete sólo funciona si el cron corrió al menos N+1 días. Verifica ls -lh en el directorio y fuerza limpieza manual si es necesario: find /var/backups/fivem/database -name "*.sql.gz" -mtime +14 -delete.

Próximos pasos

  • Envía los backups a almacenamiento externo con rclone (S3-compatible, Backblaze B2, Google Drive) — backup local no protege contra pérdida del servidor entero
  • Configura alerta vía webhook de Discord cuando el script falle, leyendo el exit code del cron
  • Agrega monitoreo de tamaño del dump — alerta si el archivo de hoy quedó 50% menor que la media de la semana, señal de corrupción silenciosa
  • Documenta el procedimiento de restauración en un archivo RUNBOOK.md en el propio servidor — en emergencia nadie quiere reaprender comandos

Si vas a poner esto en producción y quieres infraestructura optimizada para servidor FiveM, los planes de juegos de Hostini ya vienen con protección DDoS en red y snapshots a nivel del hipervisor — dos capas adicionales que complementan la rutina de backup descrita aquí.

Preguntas frecuentes

¿Puedo usar mysqldump con el servidor FiveM en ejecución?

Sí, siempre que uses la flag `--single-transaction` en tablas InnoDB. Crea una transacción consistente sin bloquear escritura, lo que es esencial en un servidor con jugadores online. En tablas MyISAM, considera `--lock-tables` o detener el servidor por unos segundos.

¿Cuánto espacio ocupará el backup?

Un servidor FiveM típico tiene entre 2 GB y 10 GB de resources, y el dump de la base comprimido en gzip suele quedar por debajo de 200 MB para bases con 5 mil jugadores. Mantén al menos 3x el tamaño del servidor libre en disco para la rotación.

¿Necesito parar el servidor para hacer backup de los resources?

No es obligatorio, pero tar leyendo directorios escritos en tiempo real (logs, txData/data) puede generar warnings. En producción, haz el backup en horario de menor movimiento y excluye directorios volátiles con `--exclude` en tar.

¿Cómo restaurar sólo la base sin tocar los archivos del servidor?

Descomprime el `.sql.gz` específico con `gunzip` y ejecuta `mysql -u user -p database < dump.sql`. Antes, haz un dump del estado actual como seguridad. La restauración puede tardar de unos segundos a minutos según el tamaño de la base.

¿Vale la pena enviar backups a almacenamiento externo?

Sí, siempre. Backup en el mismo disco del servidor no protege contra fallo de hardware o compromiso del host. Usa rclone con S3-compatible, Backblaze B2 o un servidor secundario vía rsync sobre SSH.

¿Con qué frecuencia debo ejecutar el backup?

Para base de datos, recomendamos diario en servidores activos — pérdida máxima de 24 horas de progreso. Para resources y configuraciones, semanal cubre la mayoría de los casos, ya que cambian menos. Servidores con economy activa pueden necesitar backup de la base cada 6 horas.

Temas:
Próximos pasos VPS, dedicado o panel gestionado para FiveM, SAMP, MTA, Tibia y más.Aloja tu servidor de juegos con Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp