DigitalOcean Spaces es un servicio de almacenamiento de objetos compatible con la API de Amazon S3, así que funciona con cualquier herramienta que hable S3. En este tutorial conectarás un servidor Ubuntu 24.04 a un Space usando rclone, aprenderás las operaciones básicas de subida y sincronización, publicarás archivos a través del CDN integrado y dejarás programada una copia de seguridad diaria con un timer de systemd.
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 DigitalOcean con Spaces activado.
- Un nombre para tu Space. Los nombres son únicos en todo DigitalOcean, así que en esta guía se usa
mi-space-backupscomo ejemplo: sustitúyelo por el tuyo. - La región del Space. Los ejemplos usan
fra1(Frankfurt); si eliges otra, cambia el endpoint en consecuencia (ams3.digitaloceanspaces.com,nyc3.digitaloceanspaces.com, etc.).
Paso 1: Crear una clave de acceso de Spaces
rclone se autentica contra Spaces con un par de claves de estilo S3 (access key y secret key), que son distintas de los tokens de la API de DigitalOcean.
- En el panel de DigitalOcean, abre Spaces Object Storage y ve a la pestaña Access Keys.
- Pulsa Create Access Key. Si el panel te lo ofrece, limita el alcance de la clave al Space que vas a usar con permisos de lectura y escritura, en lugar de dar acceso completo a todos los buckets.
- Copia la Access Key y la Secret Key. La secret key solo se muestra una vez.
Guarda ambas en un gestor de contraseñas. En los pasos siguientes aparecen como your_access_key y your_secret_key.
Paso 2: Instalar rclone
Ubuntu 24.04 incluye rclone en sus repositorios, pero es una versión antigua. El proyecto publica un paquete .deb oficial con la versión actual, que es la opción recomendada:
cd /tmp
curl -fsSLO https://downloads.rclone.org/rclone-current-linux-amd64.deb
sudo apt install ./rclone-current-linux-amd64.deb
Si tu servidor es ARM64, descarga rclone-current-linux-arm64.deb en su lugar. Comprueba la instalación:
rclone version
rclone v1.71.1
- os/version: ubuntu 24.04 (64 bit)
- os/kernel: 6.8.0-84-generic (x86_64)
- os/type: linux
- os/arch: amd64
...
El número de versión exacto será el más reciente disponible cuando instales el paquete.
Paso 3: Configurar el remoto de Spaces
Como las copias de seguridad del paso 6 se ejecutarán como root, configura rclone para root. Con sudo, Ubuntu usa /root como directorio personal, así que rclone leerá /root/.config/rclone/rclone.conf.
Crea el directorio y el archivo de configuración:
sudo install -d -m 700 /root/.config/rclone
sudo nano /root/.config/rclone/rclone.conf
Añade el siguiente bloque, sustituyendo las claves y la región:
[do-spaces]
type = s3
provider = DigitalOcean
access_key_id = your_access_key
secret_access_key = your_secret_key
endpoint = fra1.digitaloceanspaces.com
acl = private
provider = DigitalOcean activa los ajustes específicos de Spaces en rclone y acl = private hace que todo lo que subas sea privado por defecto. Protege el archivo, ya que contiene la secret key en texto plano:
sudo chmod 600 /root/.config/rclone/rclone.conf
Comprueba que rclone puede autenticarse listando los Spaces de la región:
sudo rclone lsd do-spaces:
Si todavía no tienes ningún Space, el comando no devuelve nada y termina sin error. Un error SignatureDoesNotMatch o InvalidAccessKeyId indica que las claves están mal copiadas.
Paso 4: Crear el Space y trabajar con archivos
Puedes crear el Space desde el panel (Create > Spaces Object Storage) o directamente con rclone, ya que Spaces acepta la creación de buckets por la API S3:
sudo rclone mkdir do-spaces:mi-space-backups
sudo rclone lsd do-spaces:
-1 2026-09-25 10:12:03 -1 mi-space-backups
Sube un archivo de prueba y lista el contenido del Space:
sudo rclone copy /etc/hostname do-spaces:mi-space-backups/pruebas/
sudo rclone ls do-spaces:mi-space-backups
12 pruebas/hostname
Estas son las operaciones que usarás más a menudo:
| Comando | Qué hace |
|---|---|
rclone copy origen destino | Copia archivos nuevos o modificados, nunca borra en el destino. |
rclone sync origen destino | Hace que el destino sea idéntico al origen, borrando en el destino lo que ya no existe en el origen. |
rclone check origen destino | Compara tamaños y hashes sin transferir nada. |
rclone size remoto:ruta | Muestra el número de objetos y el tamaño total. |
Antes de lanzar un sync sobre datos importantes, pruébalo con --dry-run para ver qué se copiaría y qué se borraría:
sudo rclone sync /var/www do-spaces:mi-space-backups/web --dry-run
Para directorios grandes, --transfers aumenta el número de subidas en paralelo (el valor por defecto es 4) y --progress muestra el avance en directo:
sudo rclone sync /var/www do-spaces:mi-space-backups/web --transfers 16 --progress
Paso 5: Publicar archivos a través del CDN
Por defecto los objetos son privados. Para servir archivos estáticos (imágenes, descargas, recursos de una web) sube solo esos archivos como públicos a un prefijo separado, sin cambiar el resto del Space:
sudo rclone copy ./logo.png do-spaces:mi-space-backups/public/ --s3-acl public-read
Comprueba que el objeto responde desde el endpoint de origen:
curl -I https://mi-space-backups.fra1.digitaloceanspaces.com/public/logo.png
HTTP/2 200
content-type: image/png
...
Para distribuir el contenido desde el CDN de DigitalOcean, abre el Space en el panel, entra en Settings y activa el CDN. A partir de ese momento el mismo archivo está disponible en la URL del CDN, que añade .cdn al nombre del host:
https://mi-space-backups.fra1.cdn.digitaloceanspaces.com/public/logo.png
Desde la misma sección puedes asociar un subdominio propio (por ejemplo cdn.your_domain) con su certificado; el panel te indica el registro CNAME que debes crear en tu DNS.
Advertenciano marques como públicos los prefijos que contienen copias de seguridad. Cualquier objeto con
public-readpuede descargarlo quien conozca su URL.
Paso 6: Automatizar las copias de seguridad
Ahora programarás una copia diaria de /etc y /var/www con retención de 30 días. El script empaqueta cada directorio con la fecha en el nombre, lo sube al Space y borra los archivos remotos con más de 30 días.
Crea el script:
sudo nano /usr/local/bin/backup-spaces.sh
#!/usr/bin/env bash
set -euo pipefail
REMOTE="do-spaces:mi-space-backups/servidores/$(hostname -s)"
FECHA="$(date +%F)"
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT
for dir in /etc /var/www; do
[ -d "$dir" ] || continue
nombre="$(basename "$dir")"
tar -czf "$TMPDIR/${nombre}-${FECHA}.tar.gz" -C / "${dir#/}"
done
rclone copy "$TMPDIR" "$REMOTE" --log-level INFO
rclone delete "$REMOTE" --min-age 30d --log-level INFO
set -euo pipefail detiene el script ante cualquier error, y el trap borra los archivos temporales pase lo que pase. Si tienes una base de datos, añade su volcado (por ejemplo con mysqldump o pg_dump) al directorio temporal antes de la subida.
Haz el script ejecutable y pruébalo a mano:
sudo chmod 750 /usr/local/bin/backup-spaces.sh
sudo /usr/local/bin/backup-spaces.sh
sudo rclone ls do-spaces:mi-space-backups/servidores
1843210 mi-servidor/etc-2026-09-25.tar.gz
20417736 mi-servidor/www-2026-09-25.tar.gz
Crea un servicio de systemd que ejecute el script:
sudo nano /etc/systemd/system/backup-spaces.service
[Unit]
Description=Copia de seguridad a DigitalOcean Spaces
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
Environment=HOME=/root
ExecStart=/usr/local/bin/backup-spaces.sh
Y un timer que lo lance cada día a las 03:00:
sudo nano /etc/systemd/system/backup-spaces.timer
[Unit]
Description=Copia diaria a DigitalOcean Spaces
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.target
Persistent=true hace que, si el servidor estaba apagado a esa hora, la copia se ejecute al arrancar. Activa el timer y comprueba la próxima ejecución:
sudo systemctl daemon-reload
sudo systemctl enable --now backup-spaces.timer
systemctl list-timers backup-spaces.timer
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2026-09-26 03:07:41 UTC 16h left - - backup-spaces.timer backup-spaces.service
Puedes forzar una ejecución y revisar el resultado en el journal:
sudo systemctl start backup-spaces.service
sudo journalctl -u backup-spaces.service -n 20 --no-pager
Paso 7: Restaurar desde Spaces
Una copia que nunca se ha restaurado no es una copia fiable. Descarga un archivo a un directorio temporal y comprueba que se puede leer:
sudo rclone copy do-spaces:mi-space-backups/servidores/$(hostname -s)/etc-$(date +%F).tar.gz /tmp/restauracion/
sudo tar -tzf /tmp/restauracion/etc-$(date +%F).tar.gz | head
etc/
etc/hostname
etc/hosts
...
Para recuperar un archivo concreto, extráelo con tar -xzf en /tmp/restauracion y cópialo después a su ubicación original.
Solución de problemas
SignatureDoesNotMatch o InvalidAccessKeyId. La access key o la secret key no son correctas, o has pegado un espacio al final. También ocurre si usas un token de la API de DigitalOcean en lugar de una clave de Spaces.
AccessDenied al subir o listar. La clave tiene un alcance limitado que no incluye ese Space, o solo tiene permiso de lectura. Revisa la clave en Access Keys.
BucketAlreadyExists al crear el Space. El nombre ya lo usa otra cuenta. Elige otro nombre más específico.
El timer no ejecuta la copia. Revisa journalctl -u backup-spaces.service. Si el error es que no encuentra el remoto do-spaces, comprueba que el archivo está en /root/.config/rclone/rclone.conf y que el servicio define HOME=/root.
Conclusión
Tu servidor ya puede leer y escribir en DigitalOcean Spaces con rclone, publicar archivos por CDN y guardar una copia diaria con retención de 30 días. Como siguientes pasos, puedes usar rclone crypt para cifrar los datos antes de subirlos, sustituir los archivos tar por restic para tener copias incrementales y deduplicadas, o replicar el Space en otro proveedor S3 con rclone sync entre dos remotos.
