Backup y Restauración
groales edited this page 2025-12-04 10:26:49 +01:00
This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Backup y Restauración

Protege tus datos de NetBox con backups automáticos.

Qué Hacer Backup

NetBox tiene 2 componentes críticos:

  1. PostgreSQL - Base de datos (lo más importante)
  2. Configuración - /config/ (configuration.py, plugins, scripts)

Redis no requiere backup: Usa tmpfs (RAM) y solo almacena caché temporal que se regenera automáticamente.


Backup Manual

PostgreSQL (Crítico)

# Backup completo
docker exec netbox-db pg_dump -U netbox netbox > netbox-backup-$(date +%Y%m%d).sql

# Backup comprimido (ahorra espacio)
docker exec netbox-db pg_dump -U netbox netbox | gzip > netbox-backup-$(date +%Y%m%d).sql.gz

# Verificar backup
gunzip -c netbox-backup-20250101.sql.gz | head -20

Configuración

# Backup del volumen de configuración
docker run --rm -v netbox_config:/backup -v $(pwd):/target alpine tar czf /target/netbox-config-$(date +%Y%m%d).tar.gz -C /backup .

# Verificar
tar tzf netbox-config-20250101.tar.gz | head

Backup Automático

Script de Backup

Crea /root/backup-netbox.sh:

#!/bin/bash

# Configuración
BACKUP_DIR="/backups/netbox"
DATE=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7

# Crear directorio
mkdir -p $BACKUP_DIR

# PostgreSQL (comprimido)
echo "Backing up PostgreSQL..."
docker exec netbox-db pg_dump -U netbox netbox | gzip > $BACKUP_DIR/netbox-db-$DATE.sql.gz

# Configuración
echo "Backing up configuration..."
docker run --rm -v netbox_config:/backup -v $BACKUP_DIR:/target alpine tar czf /target/netbox-config-$DATE.tar.gz -C /backup .

# Limpiar backups antiguos
echo "Cleaning old backups (older than $RETENTION_DAYS days)..."
find $BACKUP_DIR -name "netbox-db-*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "netbox-config-*.tar.gz" -mtime +$RETENTION_DAYS -delete

# Verificar espacio
BACKUP_SIZE=$(du -sh $BACKUP_DIR | cut -f1)
echo "Backup completed: $DATE"
echo "Backup size: $BACKUP_SIZE"

# Opcional: copiar a otro servidor
# rsync -avz $BACKUP_DIR/ backup@remote:/backups/netbox/

Hazlo ejecutable:

chmod +x /root/backup-netbox.sh

Automatizar con Cron

# Editar crontab
crontab -e

# Añadir backup diario a las 2 AM
0 2 * * * /root/backup-netbox.sh >> /var/log/netbox-backup.log 2>&1

# Backup cada 6 horas
0 */6 * * * /root/backup-netbox.sh >> /var/log/netbox-backup.log 2>&1

Verificar Cron

# Ver tareas programadas
crontab -l

# Ver logs de backup
tail -f /var/log/netbox-backup.log

Restauración

Restaurar PostgreSQL

# Detener NetBox
docker stop netbox

# Restaurar desde backup comprimido
gunzip < netbox-backup-20250101.sql.gz | docker exec -i netbox-db psql -U netbox netbox

# O desde backup sin comprimir
cat netbox-backup-20250101.sql | docker exec -i netbox-db psql -U netbox netbox

# Reiniciar NetBox
docker start netbox

# Verificar logs
docker logs -f netbox

Restaurar Configuración

# Detener NetBox
docker stop netbox

# Limpiar volumen actual (opcional - crear backup primero)
# docker run --rm -v netbox_config:/config alpine rm -rf /config/*

# Restaurar desde backup
docker run --rm -v netbox_config:/restore -v $(pwd):/source alpine tar xzf /source/netbox-config-20250101.tar.gz -C /restore

# Verificar permisos
docker run --rm -v netbox_config:/config alpine chown -R 1000:1000 /config

# Reiniciar NetBox
docker start netbox

Restauración Completa

# 1. Detener stack
docker stop netbox netbox-redis netbox-db

# 2. Eliminar volúmenes (CUIDADO - perderás datos actuales)
# docker volume rm netbox_db netbox_config

# 3. Recrear volúmenes
docker volume create netbox_db
docker volume create netbox_config

# 4. Restaurar PostgreSQL
docker start netbox-db
sleep 10
gunzip < netbox-backup-20250101.sql.gz | docker exec -i netbox-db psql -U netbox netbox

# 5. Restaurar configuración
docker run --rm -v netbox_config:/restore -v $(pwd):/source alpine tar xzf /source/netbox-config-20250101.tar.gz -C /restore

# 6. Iniciar todo
docker start netbox-redis netbox

# 7. Verificar
docker logs -f netbox

Migración a Otro Servidor

Exportar

En el servidor origen:

# Backup completo
/root/backup-netbox.sh

# Copiar a servidor destino
scp /backups/netbox/netbox-db-*.sql.gz user@destino:/tmp/
scp /backups/netbox/netbox-config-*.tar.gz user@destino:/tmp/

Importar

En el servidor destino:

# Desplegar NetBox (sin iniciar)
docker compose up -d

# Detener NetBox
docker stop netbox

# Restaurar datos
gunzip < /tmp/netbox-db-20250101.sql.gz | docker exec -i netbox-db psql -U netbox netbox
docker run --rm -v netbox_config:/restore -v /tmp:/source alpine tar xzf /source/netbox-config-20250101.tar.gz -C /restore

# Iniciar
docker start netbox

Backup Remoto

Rsync a Servidor Remoto

Añade al script de backup:

# Al final de backup-netbox.sh
rsync -avz --delete $BACKUP_DIR/ backup@remote.server:/backups/netbox/

Backup a S3

# Instalar AWS CLI
apt install awscli

# Configurar credenciales
aws configure

# Añadir al script de backup
aws s3 sync $BACKUP_DIR/ s3://mi-bucket/netbox-backups/ --delete

Verificación de Backups

Script de Verificación

#!/bin/bash
LATEST_BACKUP=$(ls -t /backups/netbox/netbox-db-*.sql.gz | head -1)

echo "Verificando backup: $LATEST_BACKUP"

# Verificar integridad
gunzip -t $LATEST_BACKUP
if [ $? -eq 0 ]; then
    echo "✓ Backup íntegro"
else
    echo "✗ Backup corrupto"
    exit 1
fi

# Verificar tamaño mínimo (ej: 1MB)
SIZE=$(stat -f%z "$LATEST_BACKUP")
if [ $SIZE -gt 1048576 ]; then
    echo "✓ Tamaño válido: $(numfmt --to=iec $SIZE)"
else
    echo "✗ Backup muy pequeño"
    exit 1
fi

Próximos Pasos

  1. Actualización - Mantén NetBox actualizado
  2. Solución de Problemas - Si algo falla