Backblaze B2 es un almacenamiento de objetos en la nube con un precio por TB muy bajo, lo que lo convierte en un destino habitual para copias de seguridad externas. restic es una herramienta de backup que cifra los datos en el servidor antes de enviarlos, solo sube los bloques que han cambiado y guarda cada copia como un snapshot que puedes restaurar de forma independiente. En este tutorial configurarás restic en Ubuntu 24.04 con un bucket de B2 como destino, programarás una copia diaria con retención automática y comprobarás que puedes restaurar.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con un usuario no root con privilegios
sudo. - Una cuenta de Backblaze con B2 Cloud Storage activado.
- Una idea clara de qué directorios quieres respaldar. Los ejemplos usan
/etc,/homey/var/www.
Paso 1: Crear el bucket y una application key en B2
Primero crearás un bucket privado y una clave que solo tenga acceso a ese bucket, para que una filtración de la clave no comprometa el resto de la cuenta.
- En el panel de Backblaze, ve a Buckets y pulsa Create a Bucket.
- Escribe un nombre (son únicos en todo B2, en esta guía se usa
mis-backups-servidor), marca Private y crea el bucket. - Abre la configuración del ciclo de vida del bucket (Lifecycle Settings) y selecciona Keep only the last version of the file. restic ya gestiona su propio historial con snapshots, y así B2 no acumula versiones ocultas de los archivos que restic borra al hacer limpieza.
- Ve a Application Keys y pulsa Add a New Application Key. Ponle un nombre como
restic-mi-servidor, en Allow access to Bucket(s) elige solomis-backups-servidory en Type of Access deja Read and Write. - Copia el keyID y la applicationKey. La applicationKey solo se muestra una vez.
En los pasos siguientes aparecen como your_key_id y your_application_key.
Paso 2: Instalar restic
restic está en los repositorios de Ubuntu 24.04:
sudo apt update
sudo apt install restic
Comprueba la versión instalada:
restic version
restic 0.16.4 compiled with go1.22.2 on linux/amd64
Paso 3: Guardar las credenciales de forma segura
restic lee la configuración del repositorio y las credenciales de B2 de variables de entorno. En lugar de escribirlas en un script, las guardarás en un archivo que solo root puede leer y que después cargará systemd.
Crea el directorio de configuración:
sudo install -d -m 700 /etc/restic
Genera una contraseña aleatoria para cifrar el repositorio:
sudo sh -c 'openssl rand -base64 32 > /etc/restic/password'
sudo chmod 600 /etc/restic/password
Importanteguarda una copia de
/etc/restic/passwordfuera del servidor, por ejemplo en tu gestor de contraseñas. Sin esa contraseña los datos del repositorio no se pueden descifrar, ni siquiera con acceso completo al bucket.
Crea el archivo de entorno:
sudo nano /etc/restic/b2.env
B2_ACCOUNT_ID=your_key_id
B2_ACCOUNT_KEY=your_application_key
RESTIC_REPOSITORY=b2:mis-backups-servidor:servidores/mi-servidor
RESTIC_PASSWORD_FILE=/etc/restic/password
RESTIC_CACHE_DIR=/var/cache/restic
RESTIC_REPOSITORY sigue el formato b2:nombre-del-bucket:ruta. Usar una ruta por servidor permite guardar varios servidores en el mismo bucket con repositorios separados. Protege el archivo:
sudo chmod 600 /etc/restic/b2.env
Paso 4: Inicializar el repositorio
Para ejecutar restic a mano con estas variables, abre una shell de root y carga el archivo de entorno:
sudo -i
set -a; . /etc/restic/b2.env; set +a
set -a exporta automáticamente todas las variables que se definen al cargar el archivo. Ahora inicializa el repositorio:
restic init
created restic repository 3f1c9a2b7e at b2:mis-backups-servidor:servidores/mi-servidor
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
Paso 5: Hacer la primera copia de seguridad
Sigue en la shell de root del paso anterior y lanza la primera copia. --exclude-caches omite los directorios marcados como caché y --exclude descarta patrones que no merece la pena guardar:
restic backup /etc /home /var/www --exclude-caches --exclude '*.tmp' --tag diario
repository 3f1c9a2b opened (version 2, compression level auto)
created new cache in /var/cache/restic
no parent snapshot found, will read all files
Files: 4127 new, 0 changed, 0 unmodified
Dirs: 812 new, 0 changed, 0 unmodified
Added to the repository: 212.408 MiB (98.113 MiB stored)
processed 4127 files, 301.522 MiB in 0:41
snapshot 8c1d2e4f saved
Ejecuta el mismo comando otra vez: esta vez restic solo leerá los archivos que han cambiado y la copia terminará en unos segundos. Lista los snapshots:
restic snapshots
ID Time Host Tags Paths
----------------------------------------------------------------------
8c1d2e4f 2026-09-25 10:31:07 mi-servidor diario /etc
/home
/var/www
b27a90c1 2026-09-25 10:33:45 mi-servidor diario /etc
/home
/var/www
----------------------------------------------------------------------
2 snapshots
Si alguna de las rutas no existe en tu servidor, restic termina con un aviso y código de salida 3. Quita esa ruta del comando antes de automatizarlo.
Paso 6: Probar una restauración
Restaura un archivo concreto del último snapshot en un directorio temporal, sin tocar los datos originales:
restic restore latest --target /tmp/restauracion --include /etc/hostname
cat /tmp/restauracion/etc/hostname
mi-servidor
También puedes explorar un snapshot antes de restaurar:
restic ls latest /etc/ssh
Para restaurar un directorio completo, usa --include /var/www y copia después los archivos a su sitio. Evita --target / salvo que sepas exactamente lo que vas a sobrescribir. Cuando termines, sal de la shell de root:
exit
Paso 7: Automatizar la copia con systemd
Crearás un servicio que hace la copia y aplica la política de retención, y un timer que lo ejecuta cada noche.
sudo nano /etc/systemd/system/restic-backup.service
[Unit]
Description=Copia de seguridad con restic a Backblaze B2
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
EnvironmentFile=/etc/restic/b2.env
ExecStart=/usr/bin/restic backup /etc /home /var/www --exclude-caches --exclude '*.tmp' --tag diario
ExecStartPost=/usr/bin/restic forget --tag diario --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Nice=10
IOSchedulingClass=idle
La política de forget conserva un snapshot por día durante 7 días, uno por semana durante 4 semanas y uno por mes durante 6 meses. --prune elimina del bucket los datos que ya no usa ningún snapshot. ExecStartPost solo se ejecuta si la copia ha terminado bien.
Crea el timer:
sudo nano /etc/systemd/system/restic-backup.timer
[Unit]
Description=Copia diaria con restic
[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true
[Install]
WantedBy=timers.target
Activa el timer y lanza una ejecución manual para verificar el servicio:
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl start restic-backup.service
sudo journalctl -u restic-backup.service -n 30 --no-pager
Al final del journal deberías ver el snapshot guardado y el resumen de forget, sin errores. Comprueba cuándo será la próxima ejecución:
systemctl list-timers restic-backup.timer
Paso 8: Verificar la integridad del repositorio
restic check comprueba que la estructura del repositorio es coherente. Añadir --read-data-subset descarga y verifica además una parte de los datos, lo que detecta corrupción sin tener que bajar el repositorio completo:
sudo bash -c 'set -a; . /etc/restic/b2.env; set +a; restic check --read-data-subset=5%'
using temporary cache in /tmp/restic-check-cache-123456
load indexes
check all packs
check snapshots, trees and blobs
read 5.0% of data packs
no errors were found
Ejecútalo de vez en cuando, por ejemplo una vez al mes, o crea un segundo servicio y timer con este comando.
Solución de problemas
unable to authorize account o 401 Unauthorized. El keyID o la applicationKey no son correctos, o la clave se ha borrado. Genera una nueva en Application Keys y actualiza /etc/restic/b2.env.
Fatal: unable to open config file o Is there a repository at the following location?. El repositorio no se ha inicializado en esa ruta o RESTIC_REPOSITORY tiene un error tipográfico. Revisa el nombre del bucket y la ruta.
wrong password or no key found. El archivo /etc/restic/password no coincide con el que se usó en restic init. Recupera la contraseña de tu copia externa.
unable to create lock in backend: repository is already locked. Otra ejecución sigue en curso o se interrumpió. Comprueba que no hay ningún proceso restic activo y, en ese caso, ejecuta restic unlock con las variables cargadas.
El servicio falla con código 3. Alguna de las rutas no existe o hay archivos que no se pudieron leer. El detalle está en journalctl -u restic-backup.service.
Conclusión
Tu servidor guarda cada noche una copia cifrada e incremental en Backblaze B2, con una política de retención que limpia los snapshots antiguos y una restauración ya probada. Como siguientes pasos, puedes añadir el volcado de tus bases de datos antes de la copia, programar restic check de forma periódica o crear una segunda clave de B2 de solo lectura para restaurar desde otro equipo sin exponer permisos de escritura.
