Documentación/ Bases de datos/ Respaldos y restauración

Respaldos y restauración

sh0 respalda servidores de bases de datos y volúmenes en archivos comprimidos, bajo demanda o según una programación, los guarda en el servidor o los envía a un almacenamiento externo, y los restaura en su sitio.

Contenido de una copia

Cada copia es un único archivo comprimido con gzip. Su contenido depende del origen:

OrigenGenerado con
Servidor PostgreSQLVolcado SQL: pg_dumpall para todo el servidor, o pg_dump si se elige una sola base
Servidor MySQL o MariaDBVolcado SQL: mysqldump --all-databases (mariadb-dump en imágenes recientes de MariaDB), o una sola base
Servidor MongoDBmongodump --archive de todas las bases del servidor
Servidor RedisArchivo tar del directorio de datos /data (archivos append-only e instantáneas)
Volumen de aplicaciónArchivo tar del volumen, o de una subruta

El archivo lleva el identificador de la copia: <id>.gz, o <id>.gz.enc si está cifrada. No existen archivos .dump, .archive ni .rdb. Las copias locales se guardan en la carpeta backups/ del directorio de datos de sh0 (/var/lib/sh0/backups/ en una instalación Linux estándar):

Terminal
$ cd /var/lib/sh0/backups
$ ls -l 4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8.gz 9b5222c8-4c09-4805-8d96-4d80df2168c8.gz.enc | awk '{print $5, $9}'
1314 4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8.gz
1343 9b5222c8-4c09-4805-8d96-4d80df2168c8.gz.enc

$ zcat 4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8.gz | grep -m3 '^-- '
-- PostgreSQL database cluster dump
-- Drop databases (except postgres and template1)
-- Drop roles

Copias manuales

  • Desde un servidor de bases de datos: su pestaña Resumen tiene una tarjeta Copia de seguridad con Respaldar ahora. Respalda todo el servidor en local, sin cifrar.
  • Desde la página Copias de seguridad de la barra lateral: Iniciar copia de seguridad pregunta ¿Qué quiere copiar?, el Destino, si se debe Cifrar y, para un servidor de bases de datos, una base o todas.

Desde la API, source_type es database_server, volume o database. La llamada responde 202 y la copia se ejecuta en segundo plano; vuelva a leerla para conocer su archivo:

Terminal
$ curl -s -X POST https://panel.example.com/api/v1/backups/trigger \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"source_type":"database_server","source_id":"3afde175-12d6-4614-94ca-e504737a7cc4","destination":"local","encrypt":false}' \
    -o /dev/null -w "%{http_code}\n"
202

$ curl -s https://panel.example.com/api/v1/backups/4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8 \
    -H "Authorization: Bearer $SH0_TOKEN"
{"data":{"created_at":"2026-10-02 02:46:04","created_by":"50159570-e8ad-46a8-8065-e6c9096edde6","database_name":null,"destination":"local","encrypted":false,"file_path":"/var/lib/sh0/backups/4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8.gz","file_size":1314,"id":"4efb5ef8-b61c-4b1f-b6dd-b546c1a01bb8","path":null,"project_id":null,"restore_error":null,"restore_status":"completed","restored_at":"2026-10-02 02:46:31","schedule_id":null,"source_id":"3afde175-12d6-4614-94ca-e504737a7cc4","source_type":"database_server","status":"completed"}}

Copias programadas

En la página Copias de seguridad, Crear programación pide el origen, una expresión cron de cinco campos, el Destino y la retención. Las programaciones se evalúan en UTC. Ejecutar ahora lanza de inmediato una copia programada.

Terminal
$ curl -s -X POST https://panel.example.com/api/v1/backup-schedules \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"source_type":"database_server","source_id":"3afde175-12d6-4614-94ca-e504737a7cc4","cron":"0 3 * * *"}'
{"data":{"cron":"0 3 * * *","destination":"local","enabled":true,"id":"ed140ca5-1c47-4388-897d-52726489d3fa","last_run":null,"next_run":"2026-10-02 03:00:00","path":null,"retention":7,"service_id":null,"source_id":"3afde175-12d6-4614-94ca-e504737a7cc4","source_type":"database_server"}}

$ curl -s -X POST https://panel.example.com/api/v1/backup-schedules/ed140ca5-1c47-4388-897d-52726489d3fa/run \
    -H "Authorization: Bearer $SH0_TOKEN"
{"data":{"schedule_id":"ed140ca5-1c47-4388-897d-52726489d3fa","status":"started"}}
Note
Las copias programadas nunca se cifran, y una programación siempre respalda el servidor completo. Para una copia cifrada o una sola base, use una copia manual.

Retención

La retención es un número de copias, no de días. Por defecto vale 7; 0 lo conserva todo. Tras cada ejecución programada correcta, sh0 elimina las copias más antiguas de esa programación por encima del límite, registros y archivos incluidos. Las copias manuales nunca se purgan.

Destinos de almacenamiento

El destino por defecto es local. Los proveedores externos se añaden en Configuración → Almacenamiento (el enlace Añadir almacenamiento externo de la página de copias lleva allí). Los tipos disponibles son:

  • Compatible con S3: AWS S3, Cloudflare R2, DigitalOcean Spaces, Backblaze B2, Wasabi, MinIO, Hetzner Object Storage o cualquier endpoint S3
  • SFTP, con contraseña o clave SSH
  • FTP, con TLS opcional
  • Dropbox y Google Drive
  • Ruta local: otro directorio del servidor, por ejemplo un disco montado

En la API, destination acepta local, el nombre de un proveedor o external:<id-del-proveedor>. Cualquier otro valor se rechaza con 422 en lugar de guardarse en local sin avisar.

Warning
Una copia local está en el mismo disco que los datos que protege. No sobrevive a la pérdida del servidor: envíe al menos una programación a un proveedor externo.

Cifrado

Una copia cifrada (.gz.enc) se sella con AES-256-GCM usando la clave maestra de la instancia, guardada en master.key y master.passphrase del directorio de datos de sh0. Solo una instancia que tenga esa clave puede restaurarla: guarde una copia de ambos archivos fuera del servidor.

Restaurar una copia

En el Historial de la página Copias de seguridad, Restaurar reproduce una copia en el recurso de origen, tras escribir su nombre para confirmar. Los datos actuales se sobrescriben y sh0 no hace una copia previa. La llamada a la API es POST /api/v1/backups/:id/restore; responde 202 y luego el restore_status de la copia pasa a completed o failed.

Restaurar desde fuente externa restaura un archivo que está en un proveedor de almacenamiento configurado, por ejemplo una copia hecha por otra instancia de sh0.

Tip
Pruebe una restauración antes de necesitarla: restaure una copia reciente en un servidor de pruebas aparte y compruebe los datos.

Descargar y eliminar

Descargar en el historial, o GET /api/v1/backups/:id/download, devuelve el archivo tal como está guardado (application/gzip, o binario si está cifrado). Eliminar una copia borra su registro y su archivo.