Docs/ Bases de données/ Sauvegardes et restauration

Sauvegardes et restauration

sh0 sauvegarde serveurs de bases de données et volumes dans des fichiers compressés, à la demande ou selon une planification, les garde sur le serveur ou les envoie vers un stockage externe, et les restaure sur place.

Contenu d'une sauvegarde

Chaque sauvegarde est un fichier unique compressé en gzip. Son contenu dépend de la source :

SourceProduit par
Serveur PostgreSQLExport SQL : pg_dumpall pour tout le serveur, ou pg_dump quand une seule base est choisie
Serveur MySQL ou MariaDBExport SQL : mysqldump --all-databases (mariadb-dump sur les images MariaDB récentes), ou une seule base
Serveur MongoDBmongodump --archive de toutes les bases du serveur
Serveur RedisArchive tar du répertoire de données /data (fichiers append-only et instantanés)
Volume d'applicationArchive tar du volume, ou d'un sous-chemin

Le fichier porte l'identifiant de la sauvegarde : <id>.gz, ou <id>.gz.enc quand elle est chiffrée. Il n'existe pas de fichier .dump, .archive ou .rdb. Les sauvegardes locales sont rangées dans le dossier backups/ du répertoire de données de sh0 (/var/lib/sh0/backups/ sur une installation Linux standard) :

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

Sauvegardes manuelles

  • Depuis un serveur de bases de données : son onglet Aperçu porte une carte Sauvegarde avec Sauvegarder maintenant. La sauvegarde porte sur tout le serveur, en local, sans chiffrement.
  • Depuis la page Sauvegardes de la barre latérale : Déclencher une sauvegarde demande Que voulez-vous sauvegarder ?, la Destination, s'il faut Chiffrer et, pour un serveur de bases de données, une base ou toutes.

Depuis l'API, source_type vaut database_server, volume ou database. L'appel répond 202 et la sauvegarde s'exécute en arrière-plan ; relisez-la pour connaître son fichier :

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"}}

Sauvegardes planifiées

Sur la page Sauvegardes, Créer une planification demande la source, une expression cron à cinq champs, la Destination et la rétention. Les planifications sont évaluées en UTC. Lancer maintenant déclenche aussitôt une sauvegarde planifiée.

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
Les sauvegardes planifiées ne sont jamais chiffrées, et une planification sauvegarde toujours le serveur entier. Pour une copie chiffrée ou une seule base, utilisez une sauvegarde manuelle.

Rétention

La rétention est un nombre de sauvegardes, pas un nombre de jours. Elle vaut 7 par défaut ; 0 conserve tout. Après chaque exécution planifiée réussie, sh0 supprime les plus anciennes sauvegardes de cette planification au-delà de la limite, enregistrements et fichiers compris. Les sauvegardes manuelles ne sont jamais purgées.

Destinations de stockage

La destination par défaut est local. Les fournisseurs externes s'ajoutent dans Paramètres → Stockage (le lien Ajouter un stockage externe de la page Sauvegardes y mène). Les types disponibles sont :

  • Compatible S3 : AWS S3, Cloudflare R2, DigitalOcean Spaces, Backblaze B2, Wasabi, MinIO, Hetzner Object Storage, ou tout point d'accès S3
  • SFTP, par mot de passe ou clé SSH
  • FTP, avec TLS en option
  • Dropbox et Google Drive
  • Chemin local : un autre répertoire du serveur, par exemple un disque monté

Dans l'API, destination accepte local, le nom d'un fournisseur ou external:<id-du-fournisseur>. Toute autre valeur est refusée en 422 au lieu d'être stockée en local sans le dire.

Warning
Une sauvegarde locale se trouve sur le même disque que les données qu'elle protège. Elle ne survit pas à la perte du serveur : envoyez au moins une planification vers un fournisseur externe.

Chiffrement

Une sauvegarde chiffrée (.gz.enc) est scellée en AES-256-GCM avec la clé maîtresse de l'instance, stockée dans master.key et master.passphrase du répertoire de données de sh0. Seule une instance qui détient cette clé peut la restaurer : gardez une copie de ces deux fichiers ailleurs que sur le serveur.

Restaurer une sauvegarde

Dans l'Historique de la page Sauvegardes, Restaurer rejoue une sauvegarde dans la ressource d'origine, après saisie de son nom pour confirmer. Les données actuelles sont écrasées et sh0 ne fait pas de sauvegarde préalable. L'appel API est POST /api/v1/backups/:id/restore ; il répond 202, puis le restore_status de la sauvegarde passe à completed ou failed.

Restaurer depuis une source externe restaure un fichier présent sur un fournisseur de stockage configuré, par exemple une sauvegarde faite par une autre instance sh0.

Tip
Testez une restauration avant d'en avoir besoin : restaurez une sauvegarde récente dans un serveur de test distinct et vérifiez les données.

Télécharger et supprimer

Télécharger dans l'historique, ou GET /api/v1/backups/:id/download, renvoie le fichier tel qu'il est stocké (application/gzip, ou binaire s'il est chiffré). Supprimer une sauvegarde retire son enregistrement et son fichier.