Almacenamiento Backblaze B2 para Backups de Servidor

Backblaze B2 es la opción más económica del mercado para almacenamiento cloud, con un precio de 0.006$/GB/mes (aproximadamente 6 veces más barato que AWS S3) y transferencia gratuita hacia Cloudflare gracias al acuerdo Bandwidth Alliance. Para servidores Linux que necesitan backups fiables a bajo coste, B2 combinado con rclone o restic ofrece una solución completa y automatizable. Esta guía cubre la configuración desde cero hasta los scripts de backup automatizado con retención programada.

Requisitos Previos

  • Cuenta de Backblaze (registro gratuito en backblaze.com)
  • Servidor Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+)
  • Acceso root o sudo
  • Python 3.6+ (para B2 CLI)

Configuración de Cuenta y Bucket B2

Crear las credenciales de aplicación

  1. Accede a secure.backblaze.com/app_keys.htm
  2. Haz clic en Add a New Application Key
  3. Configura:
    • Name of Key: backup-servidor
    • Allow access to Bucket(s): Selecciona el bucket o "All Buckets"
    • Type of Access: Read and Write
    • File name prefix (opcional): backups/
  4. Copia el applicationKeyId y el applicationKey (solo se muestran una vez)

Crear un bucket

# Instalar primero B2 CLI para crear el bucket por línea de comandos
pip3 install b2

# Autenticar con B2
b2 authorize-account TU_KEY_ID TU_APPLICATION_KEY

# Crear un bucket privado
b2 create-bucket mis-backups-servidor allPrivate

# Crear con versionado de archivos habilitado
b2 create-bucket mis-backups-servidor allPrivate --default-server-side-encryption SSE-B2

Instalación de B2 CLI

# Instalar via pip3
pip3 install b2

# O instalar el binario oficial
wget https://github.com/Backblaze/B2_Command_Line_Tool/releases/latest/download/b2-linux \
  -O /usr/local/bin/b2
chmod +x /usr/local/bin/b2

# Verificar la instalación
b2 version

# Autenticar con las credenciales de la aplicación
b2 authorize-account TU_KEY_ID TU_APPLICATION_KEY

Comandos básicos de B2 CLI

# Listar todos los buckets
b2 list-buckets

# Listar archivos en un bucket
b2 list-file-names mis-backups-servidor

# Subir un archivo
b2 upload-file mis-backups-servidor /var/backups/bd.sql.gz backups/bd.sql.gz

# Descargar un archivo
b2 download-file-by-name mis-backups-servidor backups/bd.sql.gz /tmp/bd-restaurada.sql.gz

# Borrar un archivo
b2 delete-file-version mis-backups-servidor backups/bd.sql.gz FILE_ID

# Ver información del bucket
b2 get-bucket mis-backups-servidor

Integración con rclone

rclone es la forma más cómoda de usar B2 con soporte completo para sync, copy y check.

# Instalar rclone
curl https://rclone.org/install.sh | sudo bash

Configuración de rclone con B2

# Configuración manual (más rápida que el asistente interactivo)
mkdir -p ~/.config/rclone/
cat > ~/.config/rclone/rclone.conf << 'EOF'
[backblaze-b2]
type = b2
account = TU_KEY_ID
key = TU_APPLICATION_KEY
hard_delete = false
EOF

# Verificar la conexión
rclone lsd backblaze-b2:

Operaciones con rclone y B2

# Sincronizar un directorio al bucket
rclone sync /var/www/ backblaze-b2:mis-backups-servidor/web/ \
  --progress

# Copiar backups con estructura de fecha
rclone copy /var/backups/ \
  "backblaze-b2:mis-backups-servidor/$(date +%Y/%m/%d)/" \
  --progress

# Sincronizar con exclusiones
rclone sync /var/www/ backblaze-b2:mis-backups-servidor/web/ \
  --exclude "*.log" \
  --exclude ".git/**" \
  --exclude "node_modules/**" \
  --exclude "*.tmp"

# Ver el tamaño total
rclone size backblaze-b2:mis-backups-servidor

# Verificar integridad de los archivos
rclone check /var/www/ backblaze-b2:mis-backups-servidor/web/

Backups con Restic y B2

Restic es una herramienta de backup con deduplicación, cifrado y snapshots, con soporte nativo para B2.

# Instalar restic
sudo apt-get install -y restic
# O en CentOS/Rocky:
sudo dnf install -y restic

# Verificar la versión
restic version

Inicializar el repositorio de restic en B2

# Configurar las variables de entorno para B2
export B2_ACCOUNT_ID=TU_KEY_ID
export B2_ACCOUNT_KEY=TU_APPLICATION_KEY
export RESTIC_PASSWORD=tu_contrasena_cifrado_muy_segura

# Inicializar el repositorio de restic
restic -r b2:mis-backups-servidor:/restic init

# Verificar que el repositorio es accesible
restic -r b2:mis-backups-servidor:/restic snapshots

Crear backups con restic

# Backup de archivos web
restic -r b2:mis-backups-servidor:/restic backup /var/www/ \
  --exclude "*.log" \
  --exclude "cache/" \
  --tag web \
  --tag servidor-1

# Backup de configuraciones del sistema
restic -r b2:mis-backups-servidor:/restic backup /etc/ \
  --tag config \
  --tag $(hostname)

# Backup de directorios de usuario
restic -r b2:mis-backups-servidor:/restic backup /home/ \
  --tag home

# Ver los snapshots disponibles
restic -r b2:mis-backups-servidor:/restic snapshots

# Ver el contenido de un snapshot específico
restic -r b2:mis-backups-servidor:/restic ls SNAPSHOT_ID

Restaurar desde restic

# Restaurar el último snapshot al directorio original
restic -r b2:mis-backups-servidor:/restic restore latest \
  --target /

# Restaurar un snapshot específico a un directorio alternativo
restic -r b2:mis-backups-servidor:/restic restore SNAPSHOT_ID \
  --target /tmp/restauracion/

# Restaurar un archivo específico
restic -r b2:mis-backups-servidor:/restic restore latest \
  --target /tmp/restauracion/ \
  --include /var/www/html/config.php

Script de Backup Automatizado

#!/bin/bash
# Script de backup completo con restic + Backblaze B2
# Guardar en: /usr/local/bin/backup-b2.sh

# Credenciales de B2 (mejor usar /etc/backup-env o variables de entorno del sistema)
export B2_ACCOUNT_ID="tu_key_id"
export B2_ACCOUNT_KEY="tu_application_key"
export RESTIC_PASSWORD="tu_contrasena_repositorio"
export RESTIC_REPOSITORY="b2:mis-backups-servidor:/restic"

LOG="/var/log/backup-b2.log"
HOSTNAME=$(hostname)

# Función para registrar mensajes
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}

log "=== Inicio backup en Backblaze B2 ==="

# Backup de archivos web
log "Backup /var/www/..."
restic backup /var/www/ \
  --tag "web,$HOSTNAME" \
  --exclude "*.log" \
  --exclude "cache/**" \
  --exclude "*.tmp" \
  --quiet 2>> "$LOG"

if [ $? -eq 0 ]; then
  log "Backup web completado con éxito"
else
  log "ERROR: Fallo en backup web"
fi

# Backup de base de datos MySQL/MariaDB
log "Dump de MySQL..."
mysqldump --all-databases --single-transaction --quick 2>/dev/null | \
  restic backup --stdin \
  --stdin-filename "mysql-all-$(date +%Y%m%d).sql" \
  --tag "mysql,$HOSTNAME" \
  --quiet 2>> "$LOG"

# Backup de configuraciones del sistema
log "Backup /etc/..."
restic backup /etc/ \
  --tag "config,$HOSTNAME" \
  --quiet 2>> "$LOG"

# Aplicar política de retención
log "Aplicando política de retención..."
restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --tag "$HOSTNAME" \
  --quiet \
  --prune 2>> "$LOG"

# Verificar la integridad del repositorio (mensualmente)
if [ "$(date +%d)" = "01" ]; then
  log "Verificando integridad del repositorio..."
  restic check --quiet 2>> "$LOG"
fi

log "=== Backup completado ==="

# Mostrar estadísticas del repositorio
restic snapshots --tag "$HOSTNAME" --compact 2>/dev/null | tail -5 >> "$LOG"
# Hacer el script ejecutable
chmod +x /usr/local/bin/backup-b2.sh

# Guardar las credenciales de forma segura
cat > /etc/backup-b2.env << 'EOF'
B2_ACCOUNT_ID=tu_key_id
B2_ACCOUNT_KEY=tu_application_key
RESTIC_PASSWORD=tu_contrasena_repositorio
EOF
chmod 600 /etc/backup-b2.env

# Programar el backup diario a las 4 AM
(crontab -l 2>/dev/null; echo "0 4 * * * /usr/local/bin/backup-b2.sh") | crontab -

Políticas de Retención

# Definir cuántos snapshots conservar
restic forget \
  --keep-last 5 \         # Últimos 5 snapshots
  --keep-daily 7 \        # Un snapshot por día, últimos 7 días
  --keep-weekly 4 \       # Un snapshot por semana, últimas 4 semanas
  --keep-monthly 6 \      # Un snapshot por mes, últimos 6 meses
  --keep-yearly 2 \       # Un snapshot por año, últimos 2 años
  --prune                 # Eliminar los datos no referenciados

# Ver qué se eliminaría sin ejecutar (dry run)
restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --dry-run

Transferencia Gratuita con Cloudflare

Backblaze B2 tiene un acuerdo con Cloudflare (Bandwidth Alliance) que permite descargas gratuitas cuando el bucket se sirve a través de Cloudflare.

# Configurar un Custom Domain en el bucket B2 apuntando a Cloudflare
# 1. En el panel B2: Bucket Settings > Bucket Info > Custom Domain
# 2. En Cloudflare DNS: CNAME cdn.tudominio.com → f000.backblazeb2.com (proxy activado)
# 3. Volver a B2 y vincular cdn.tudominio.com al bucket

# Con esta configuración, la descarga pública es GRATUITA
# Las URLs de los archivos serán:
# https://cdn.tudominio.com/archivo.jpg  (gratis vía Cloudflare)
# en lugar de:
# https://f000.backblazeb2.com/file/mi-bucket/archivo.jpg (con coste de egress)

Solución de Problemas

Error: b2_authorize_account: Unauthorized

# Verificar que las credenciales son correctas
b2 authorize-account TU_KEY_ID TU_APPLICATION_KEY

# Las claves de aplicación tienen permisos limitados
# Verifica que la clave tiene acceso al bucket correcto

Error de restic: Fatal: repository does not exist

# Verificar las variables de entorno
echo $B2_ACCOUNT_ID
echo $RESTIC_REPOSITORY

# Inicializar el repositorio si no existe
restic init

Backup muy lento

# Aumentar las conexiones paralelas de rclone
rclone sync /datos/ backblaze-b2:bucket/ \
  --transfers 32 \
  --b2-upload-concurrency 16

# Para restic, aumentar los workers
restic backup /datos/ --pack-size 128

El repositorio de restic está dañado

# Verificar la integridad
restic check

# Reparar si es posible
restic repair snapshots
restic repair index

Conclusión

Backblaze B2 ofrece el almacenamiento cloud más económico del mercado para backups de servidor, especialmente cuando se combina con Cloudflare para transferencia gratuita. La combinación de restic para deduplicación y cifrado más B2 como backend proporciona una solución de backup profesional, segura y automatizable a una fracción del coste de AWS S3 o Google Cloud Storage.