Backup y Restauración
groales edited this page 2025-12-04 15:47:55 +01:00

Backup y Restauración

Protege tus datos de BookStack con backups automáticos.

Qué Hacer Backup

BookStack tiene 2 componentes críticos:

  1. MariaDB - Base de datos (lo más importante)
  2. Configuración - /config/ (uploads, imágenes, configuración)

Backup Manual

MariaDB (Crítico)

# Backup completo
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack > bookstack-backup-$(date +%Y%m%d).sql

# Backup comprimido (ahorra espacio)
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > bookstack-backup-$(date +%Y%m%d).sql.gz

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

Configuración y Uploads

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

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

Backup Automático

Script de Backup

Crea /root/backup-bookstack.sh:

#!/bin/bash

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

# Crear directorio
mkdir -p $BACKUP_DIR

# MariaDB (comprimido)
echo "Backing up MariaDB..."
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > $BACKUP_DIR/bookstack-db-$DATE.sql.gz

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

# Limpiar backups antiguos
echo "Cleaning old backups..."
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

# Verificar
DB_SIZE=$(stat -f%z "$BACKUP_DIR/bookstack-db-$DATE.sql.gz" 2>/dev/null || stat -c%s "$BACKUP_DIR/bookstack-db-$DATE.sql.gz")
echo "Backup completado: $DATE (BD: $(($DB_SIZE / 1024 / 1024))MB)"

Automatizar con Cron

chmod +x /root/backup-bookstack.sh
crontab -e

# Backup diario a las 3 AM
0 3 * * * /root/backup-bookstack.sh >> /var/log/backup-bookstack.log 2>&1

Restauración

Restaurar desde Backup

# 1. Detener BookStack
docker stop bookstack

# 2. Restaurar MariaDB
gunzip < bookstack-db-20250101.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack

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

# 4. Limpiar caché
docker exec bookstack php artisan cache:clear

# 5. Iniciar BookStack
docker start bookstack

Migración a Otro Servidor

# Servidor origen
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > bookstack-migration.sql.gz
docker run --rm -v bookstack_config:/backup -v $(pwd):/target alpine tar czf /target/bookstack-config-migration.tar.gz -C /backup .

# Copiar a servidor destino
scp bookstack-*.gz usuario@servidor-destino:/tmp/

# Servidor destino
cd /tmp
gunzip < bookstack-migration.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
docker run --rm -v bookstack_config:/restore -v /tmp:/source alpine tar xzf /source/bookstack-config-migration.tar.gz -C /restore
docker restart bookstack

Backup Remoto

Sincronizar con S3/MinIO

#!/bin/bash
BACKUP_DIR="/backups/bookstack"
S3_BUCKET="s3://mi-bucket/bookstack/"

# Hacer backup local primero
/root/backup-bookstack.sh

# Sincronizar con S3
aws s3 sync $BACKUP_DIR $S3_BUCKET --storage-class GLACIER

# O con rclone
rclone sync $BACKUP_DIR minio:bookstack-backups

Sincronizar con Rsync

#!/bin/bash
BACKUP_DIR="/backups/bookstack"
REMOTE_SERVER="backup@servidor-remoto"
REMOTE_PATH="/backups/bookstack"

# Sincronizar
rsync -avz --delete $BACKUP_DIR/ $REMOTE_SERVER:$REMOTE_PATH/

Verificación de Backups

Script de Verificación

#!/bin/bash
BACKUP_FILE="/backups/bookstack/bookstack-db-latest.sql.gz"

# Verificar integridad
if gunzip -t "$BACKUP_FILE" 2>/dev/null; then
    echo "✓ Backup válido"
    
    # Verificar contenido
    TABLES=$(gunzip -c "$BACKUP_FILE" | grep "CREATE TABLE" | wc -l)
    echo "✓ Contiene $TABLES tablas"
else
    echo "✗ Backup corrupto"
    exit 1
fi

Próximos Pasos

  1. Actualización - Mantén BookStack actualizado
  2. Automatiza - Configura cron para backups automáticos
  3. Prueba restauración - Verifica que los backups funcionan