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 :
| Source | Produit par |
|---|---|
| Serveur PostgreSQL | Export SQL : pg_dumpall pour tout le serveur, ou pg_dump quand une seule base est choisie |
| Serveur MySQL ou MariaDB | Export SQL : mysqldump --all-databases (mariadb-dump sur les images MariaDB récentes), ou une seule base |
| Serveur MongoDB | mongodump --archive de toutes les bases du serveur |
| Serveur Redis | Archive tar du répertoire de données /data (fichiers append-only et instantanés) |
| Volume d'application | Archive 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) :
$ 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 rolesSauvegardes 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 :
$ 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.
$ 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"}}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.
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.
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.