Aller au contenu

Backups : sauvegarder et restaurer vos données

Point de théorie · à lire avant que votre application ne contienne des données auxquelles vous tenez

Slides du cours

Le chapitre sur l'hébergement citait les sauvegardes dans une seule ligne de tableau : « une mauvaise commande, et sept semaines de données sont perdues ». Ce chapitre développe cette ligne. Il explique les principes, présente les outils par stack et par hébergeur, et renvoie à leur documentation officielle. Dans les parties 6 et 7, lisez ce qui correspond à votre projet.

À la fin de ce chapitre, vous serez capables de :

  1. lister ce qui doit être sauvegardé dans une application web, et ce qui ne doit pas l'être ;
  2. expliquer la règle 3-2-1 et les deux questions qui dimensionnent une stratégie de backup ;
  3. distinguer un backup complet, différentiel et incrémental, un instantané et une restauration à un instant donné ;
  4. décrire les cinq étapes d'un backup automatique et choisir l'outil qui correspond à votre stack et à votre hébergeur ;
  5. vérifier qu'un backup se restaure, et savoir combien de temps cela prend.

1. Ce qui arrive aux données

Le 31 janvier 2017, tard le soir, un ingénieur de GitLab veut vider le dossier de données d'un serveur de base de données secondaire. Il se croit sur le serveur secondaire, il est sur la production. Quand il s'en rend compte et arrête la commande, environ 300 Go de la base ont disparu.

L'équipe se tourne alors vers ses sauvegardes. Sur le papier, GitLab en avait plusieurs : un export chaque nuit, des copies de disque, une base répliquée. L'export nocturne échouait en silence, parce que l'outil pg_dump installé était en version 9.2 et la base en version 9.6. Les e-mails d'alerte étaient rejetés par le serveur de messagerie avant d'arriver. Les copies de disque n'étaient pas activées sur les serveurs de base de données, et la réplication était en panne. Le site a été sauvé par une copie du disque qu'un ingénieur avait faite à la main six heures plus tôt, pour alimenter un serveur de test. Selon le rapport publié par GitLab, les modifications faites entre 17 h 20 et minuit (UTC) ont été perdues, soit environ 5 000 projets, 5 000 commentaires et 700 nouveaux comptes. Le site est resté à l'arrêt 18 heures.

Les données ne se perdent pas seulement quand un disque tombe en panne.

Cause Exemple Ce qui vous sauve
Erreur humaine Un DROP TABLE ou un migrate:fresh lancé sur la production Un backup de la veille
Bug dans le code Une migration qui vide une colonne, un UPDATE sans WHERE Un backup d'avant le déploiement
Panne ou sinistre En mars 2021, un centre de données d'OVH brûle à Strasbourg Une copie dans un autre lieu
Règle de l'hébergeur La base gratuite de Render devient inaccessible après 30 jours, puis elle est supprimée Une copie chez vous
Piratage Un rançongiciel (ransomware) chiffre le serveur et tout ce qu'il peut atteindre, puis réclame une rançon Une copie que le serveur ne peut pas effacer

Lors de l'incendie d'OVH, des clients avaient bien des sauvegardes, mais sur le même site que leurs serveurs.

Attention

Trois choses ressemblent à un backup et n'en sont pas. Une base répliquée recopie chaque écriture sur un second serveur, y compris le DROP TABLE. Des disques en RAID, qui écrivent chaque donnée sur deux disques, protègent d'une panne de disque, pas d'une mauvaise commande. Un dossier synchronisé propage la suppression en quelques secondes. Un backup est une copie figée à une date, que l'application ne peut plus modifier.

2. Quoi sauvegarder

Une application web en production, c'est quatre choses. Chacune a sa propre copie de sécurité.

Quatre choses à ne pas perdre : le code, la base de données, les fichiers envoyés et les secrets

Élément Où il vit Sa sauvegarde
Le code Votre dépôt Git GitHub et le clone de chaque membre du groupe. C'est déjà fait.
La base de données PostgreSQL ou MySQL, sur le serveur ou chez un fournisseur Un export : un fichier qui contient ce qu'il faut pour recréer les tables et leurs lignes. En anglais, un dump.
Les fichiers envoyés Avatars, pièces jointes, PDF générés, sur le disque du serveur ou dans un stockage d'objets Une archive du dossier, ou une copie dans un second bucket. Un bucket est un dossier dans un stockage d'objets comme Cloudflare R2 ou Amazon S3.
Les secrets Le .env de production, les clés d'API Un gestionnaire de mots de passe partagé par le groupe. Jamais dans Git.

Le reste se reconstruit et ne se sauvegarde pas : vendor/, node_modules/, le cache, les fichiers compilés, les logs. Un composer install ou un npm ci les recrée à partir du dépôt.

La base et les fichiers vont ensemble. Si la table messages contient le chemin uploads/photo-42.jpg et que le fichier a disparu, la restauration de la base seule donne une application pleine d'images cassées.

3. Les règles d'une bonne stratégie

La règle 3-2-1

La règle 3-2-1 : trois copies, deux supports, une copie hors site

La règle tient en trois chiffres. Trois copies des données : l'original et deux sauvegardes. Deux supports différents, par exemple le disque du serveur et un stockage d'objets. Une copie hors site, c'est-à-dire ailleurs que chez l'hébergeur de l'application.

Pour votre projet, cela donne : la base en production, un export gardé sur le serveur pour restaurer vite, et le même export envoyé dans un bucket chez un autre fournisseur. Cloudflare R2, Backblaze B2 et les autres stockages d'objets proposent tous une API compatible avec celle d'Amazon S3. Un outil qui sait écrire dans « un bucket S3 » sait donc écrire chez n'importe lequel d'entre eux.

Deux questions pour régler la fréquence

Un backup est fait à 2 h 30, un incident survient à 14 h : tout ce qui a été écrit entre les deux est perdu. Avec un backup par nuit, cette perte peut atteindre 24 heures, si l'incident tombe juste avant le backup suivant. La perte maximale que vous acceptez s'appelle le RPO, pour Recovery Point Objective : l'objectif de point de reprise, c'est-à-dire le moment le plus ancien auquel vous acceptez de revenir. Un backup par nuit donne un RPO de 24 heures, un backup par heure un RPO d'une heure.

Entre l'incident et le retour en ligne, le site est à l'arrêt. L'arrêt maximal que vous acceptez s'appelle le RTO, pour Recovery Time Objective : l'objectif de délai de reprise. La durée réelle dépend de la taille du backup, de l'endroit où il se trouve, et surtout du fait que quelqu'un ait déjà fait la restauration une fois.

RPO et RTO sur une ligne du temps : les données perdues avant l'incident, l'arrêt du site après

Pour un chat étudiant, perdre une journée de messages est acceptable : un backup par nuit suffit. Pour une boutique en ligne, perdre une journée de commandes ne l'est pas. Ces deux chiffres se décident avec le client, et ils fixent le prix de la solution.

Trois réglages de plus

  • La rétention est la durée pendant laquelle vous gardez les anciens backups. Un bug qui abîme les données peut passer inaperçu une semaine. Si vous ne gardez que le backup d'hier, il contient déjà les données abîmées. Un réglage courant : 7 backups quotidiens, 4 hebdomadaires, 6 mensuels.
  • La confidentialité. Un export contient les adresses e-mail, les mots de passe hachés et les messages privés de vos utilisateurs. Le bucket reste privé, et l'export n'entre jamais dans Git ni dans un dossier public du serveur. La plupart des outils savent aussi chiffrer le backup avec un mot de passe. Rangez ce mot de passe dans le gestionnaire du groupe : sans lui, le backup est illisible.
  • L'alerte. Chez GitLab, l'export échouait en silence. Un backup automatique doit prévenir quelqu'un quand il échoue, et vous devez vérifier de temps en temps que le fichier du jour existe et ne pèse pas 0 octet.

4. Complet, différentiel, incrémental

Copier toute la base chaque nuit est simple, mais la copie grossit avec la base. Trois méthodes existent, qui diffèrent par ce qu'elles copient chaque jour.

Trois types de backup sur une semaine : complet, différentiel, incrémental

Prenez une application de 1 Go de données, dont 50 Mo changent chaque jour, avec un backup complet le dimanche.

  • Le backup complet copie tout, chaque jour. Chaque fichier se suffit à lui-même.
  • Le backup différentiel copie ce qui a changé depuis le dernier backup complet. Le lundi, 50 Mo. Le mardi, 100 Mo. Le samedi, 300 Mo. Pour restaurer, il faut deux fichiers : le complet du dimanche et le différentiel du jour voulu.
  • Le backup incrémental copie ce qui a changé depuis le dernier backup, quel qu'il soit. 50 Mo chaque jour. Pour restaurer le samedi, il faut le complet du dimanche et les six incrémentaux, dans l'ordre. Si l'un d'eux est abîmé, tous les suivants sont inutilisables.
Complet Différentiel Incrémental
Place sur une semaine 7 Go environ 2 Go 1,3 Go
Durée du backup Longue Moyenne, croît dans la semaine Courte
Restauration La plus simple Simple La plus longue et la plus fragile

Plus le backup est léger à faire, plus la restauration est lourde. Dans la pratique, on combine : un complet par semaine, puis des incrémentaux ou des différentiels entre deux.

restic et borg, deux outils libres de sauvegarde de fichiers, vont plus loin. Ils découpent les données en blocs et n'envoient que les blocs nouveaux ou modifiés. Chaque backup est incrémental à l'envoi, et se restaure comme un complet.

Deux autres mots reviennent dans les documentations des hébergeurs :

  • Un instantané (snapshot) est une photo d'un disque entier à un moment donné, prise par l'hébergeur. Il se restaure vite, mais il reste chez le même hébergeur, souvent sur la même infrastructure.
  • La restauration à un instant donné (point-in-time recovery, PITR) pousse l'incrémental au bout. La base enregistre en continu le journal de toutes ses écritures. Vous pouvez la remettre dans l'état de 13 h 59, une minute avant le DROP TABLE. La perte se compte en secondes.

Pour une base de projet étudiant, qui pèse quelques dizaines de mégaoctets, un export complet chaque nuit suffit. L'incrémental devient utile pour les fichiers envoyés, qui grossissent vite, et le PITR quand chaque minute de données compte.

Ce que coûte la copie hors site

Un stockage d'objets facture la place occupée, au gigaoctet par mois, et parfois la sortie, c'est-à-dire les données que vous téléchargez depuis le bucket. Voici les tarifs d'octobre 2026.

Service Gratuit Ensuite Sortie des données
Cloudflare R2 10 Go 0,015 $ par Go et par mois Gratuite
Backblaze B2 10 Go 0,007 $ par Go et par mois Gratuite jusqu'à trois fois le volume stocké
Amazon S3 (Irlande) Rien de permanent 0,023 $ par Go et par mois 100 Go gratuits par mois, puis 0,09 $ par Go
Hetzner Object Storage Rien Forfait de 6,49 € par mois pour 1 To 1 To inclus
Hostkey S3 Rien Forfait de 4 € par mois pour 250 Go, puis 0,017 € par Go 1 To inclus

La sortie compte le jour de la restauration. Télécharger 500 Go de backups depuis Amazon S3 coûte 36 $. Depuis R2, rien.

Faites le calcul pour votre projet. Un export de 50 Mo par nuit, gardé 30 jours, occupe 1,5 Go. Ajoutez 2 Go de fichiers envoyés. Le tout tient dans les 10 Go gratuits de R2 ou de B2 : votre copie hors site coûte 0 €.

Le calcul change avec la taille. Pour une base de 50 Go, trente exports complets occupent 1,5 To, soit une vingtaine de dollars par mois chez R2. À cette taille, les backups incrémentaux deviennent rentables, ou un stockage dit « froid », moins cher et prévu pour des archives rarement relues.

Cloudflare demande d'enregistrer un moyen de paiement pour activer R2, même si vous restez dans la partie gratuite. Amazon demande une carte bancaire dès la création du compte. Les sources de tous ces prix sont listées à la fin du chapitre.

5. Automatiser le backup

Un backup lancé à la main est oublié au bout de deux semaines. Quel que soit l'outil, un backup automatique fait toujours les cinq mêmes choses, chaque nuit.

Les cinq étapes d'un backup automatique : exporter, archiver, envoyer, nettoyer, prévenir

Étape Ce qui se passe Outils courants
1. Exporter La base est lue pendant qu'elle tourne et écrite dans un fichier pg_dump pour PostgreSQL, mysqldump pour MySQL
2. Archiver Le dossier des fichiers envoyés devient une archive compressée tar, ou restic quand le dossier grossit
3. Envoyer L'export et l'archive partent dans un bucket, hors du serveur rclone, aws s3, ou l'outil intégré de votre panneau
4. Nettoyer Les backups plus vieux que la rétention sont supprimés Une règle du bucket, ou une commande du script
5. Prévenir Quelqu'un reçoit un message : réussite ou échec Un e-mail, un webhook Discord, Healthchecks.io

Trois pièges reviennent, quel que soit l'outil.

  • La version de l'outil d'export. pg_dump doit avoir la même version majeure que la base, ou une version plus récente. Sinon il s'arrête avec une erreur. C'est la panne de GitLab.
  • Synchroniser n'est pas copier. Une commande comme rclone sync rend la destination identique à la source : un fichier supprimé par erreur disparaît aussi de la copie. Pour un backup, on copie (rclone copy), on ne synchronise pas.
  • Les fichiers déjà dans un bucket ne sont pas à l'abri pour autant. Une suppression dans l'application supprime l'objet. Activez le versionnement du bucket, qui garde les anciennes versions des objets supprimés ou écrasés, ou copiez-le chaque nuit vers un second.

Être prévenu

C'est l'étape qu'on oublie, et celle qui a manqué à GitLab. Un backup qui échoue en silence est pire qu'une absence de backup : vous croyez être protégés.

Deux mécanismes se complètent. Le script envoie lui-même un message à la fin, par e-mail ou par webhook, une adresse fournie par Discord, Slack ou Teams qui affiche dans un salon le texte qu'on lui envoie. Vous voyez chaque matin « Backup : OK », ou « Backup : ÉCHEC ». Mais si le serveur est éteint, aucun message ne part. Un service comme Healthchecks.io fait l'inverse : il attend un signal chaque nuit, et c'est lui qui vous écrit quand le signal manque.

Un exemple de script

Voici à quoi ressemblent les cinq étapes sur un VPS, pour une base PostgreSQL, des fichiers sur le disque et un bucket chez Cloudflare R2.

Attention

Ce script est un exemple, pas une solution à copier. Chaque chemin, chaque nom et chaque outil dépend de votre installation. Adaptez-le, lancez-le à la main, puis restaurez son résultat avant de lui faire confiance.

#!/usr/bin/env bash
# /srv/chat/backup.sh : exemple à adapter
set -euo pipefail              # le script s'arrête à la première erreur

source /srv/chat/backup.env    # définit DATABASE_URL et DISCORD_WEBHOOK_URL
STAMP=$(date +%F-%H%M)         # 2026-10-05-0230
DIR=/var/backups/chat
mkdir -p "$DIR"

# Envoie un message dans un salon Discord
notify() {
  curl -fsS -H "Content-Type: application/json" -d "{\"content\": \"$1\"}" "$DISCORD_WEBHOOK_URL" > /dev/null
}
trap 'notify "Backup du chat : ÉCHEC"' ERR   # appelé si une commande échoue

# 1. Exporter la base
pg_dump --format=custom --file="$DIR/db-$STAMP.dump" "$DATABASE_URL"

# 2. Archiver les fichiers envoyés par les utilisateurs
tar -czf "$DIR/uploads-$STAMP.tar.gz" -C /srv/chat/storage uploads

# 3. Envoyer la copie hors site
rclone copy "$DIR" r2:chat-backups

# 4. Nettoyer : 7 jours sur le serveur, 30 jours dans le bucket
find "$DIR" -type f -mtime +6 -delete
rclone delete r2:chat-backups --min-age 30d

# 5. Prévenir
notify "Backup du chat : OK ($STAMP)"

Sur un serveur Linux, c'est cron, le planificateur de tâches du système, qui lance ce script chaque nuit. Une ligne suffit, ajoutée avec sudo crontab -e :

30 2 * * * /srv/chat/backup.sh >> /var/log/backup-chat.log 2>&1

Les cinq champs se lisent : minute, heure, jour du mois, mois, jour de la semaine. Vous avez déjà rencontré cette syntaxe dans les workflows GitHub Actions.

6. Quel outil pour votre stack

Écrire son script est rarement nécessaire. Selon votre hébergement, les cinq étapes sont lancées par un outil différent, depuis un endroit différent.

Qui lance le backup : cron sur un VPS nu, le panneau avec Coolify ou Dokploy, GitHub Actions pour un PaaS ou Vercel

Pour chaque outil, cette partie dit ce qu'il fait, ce qu'il ne fait pas, et où lire la suite. Les réglages exacts changent d'une version à l'autre : suivez la documentation officielle, pas un tutoriel de 2022.

Les backups de votre fournisseur de VPS

La plupart des hébergeurs de VPS vendent une sauvegarde du disque entier. Chez OVHcloud, chaque VPS reçoit un backup quotidien, gardé 24 heures, sans supplément. L'option Premium garde 7 jours et coûte à partir de 0,30 € HT par mois, selon la taille du disque. Un instantané manuel, utile avant une mise à jour risquée, est au même prix.

C'est le moyen le plus rapide de remettre un serveur entier en route. Mais OVHcloud précise que ces copies sont stockées dans le même centre de données que le VPS. Elles comptent comme une copie, pas comme la copie hors site.

Coolify et Dokploy

Si vous déployez avec un panneau, le backup de la base se règle dans l'interface, sans script.

Dans Coolify, l'onglet Backups d'une base de données propose une fréquence et une rétention. Coolify lance l'outil d'export dans le conteneur et garde le fichier sur le serveur. Pour la copie hors site, vous déclarez un stockage S3 dans les réglages, puis vous l'activez dans la planification. La restauration se lance depuis Configuration > Import Backup.

Pour les fichiers, Coolify archive les volumes d'une application vers le même stockage S3. Un volume est le dossier du serveur qu'un conteneur utilise pour garder ses fichiers d'un déploiement à l'autre. Coolify crée ces archives mais n'a pas de bouton pour les restaurer : il faut extraire l'archive à la main.

Dokploy propose la même chose : un onglet Backups sur chaque base, avec une destination S3, une fréquence et un bouton Test, et des Volume Backups pour les fichiers.

Documentation : backups Coolify, backups Dokploy.

Laravel : spatie/laravel-backup

Le paquet spatie/laravel-backup est la référence du monde Laravel. Il ajoute trois commandes Artisan, que le planificateur de Laravel lance chaque nuit.

Commande Ce qu'elle fait
backup:run Exporte la base, archive les dossiers choisis, envoie un zip vers un disque Laravel, par exemple un bucket S3
backup:clean Applique la rétention : supprime les zips trop anciens
backup:monitor Vérifie qu'un backup récent existe, et envoie un e-mail ou un message Slack ou Discord dans le cas contraire

Ce qu'il faut savoir avant de l'installer. Le paquet appelle pg_dump ou mysqldump, qui doit donc être installé là où tourne l'application. Le planificateur de Laravel doit être lancé par un cron ou par une tâche planifiée du panneau. Les alertes ne partent que si vous indiquez votre adresse et le disque à surveiller dans la configuration. Et le paquet ne restaure pas : vous téléchargez le zip, vous le décompressez, et vous rechargez l'export.

Documentation : spatie.be/docs/laravel-backup.

Django : django-dbbackup

L'équivalent pour Django s'appelle django-dbbackup. Il s'appuie sur le système de stockage de Django, donc sur django-storages pour écrire dans un bucket S3.

Commande Ce qu'elle fait
dbbackup Exporte la base vers le stockage configuré, avec compression et chiffrement en option
mediabackup Archive le dossier des fichiers envoyés
dbrestore et mediarestore Rechargent le dernier backup de la base et des fichiers

Django n'a pas de planificateur : les deux premières commandes se lancent depuis un cron du serveur ou une tâche planifiée de votre panneau. Contrairement au paquet Laravel, celui-ci restaure.

Documentation : archmonger.github.io/django-dbbackup.

Node.js

Des paquets existent sur npm, mais aucun n'a la place de laravel-backup dans le monde Laravel. Ce sont de petits projets, peu mis à jour, qui exportent la base puis envoient le fichier dans un bucket. Laravel et Django sont des frameworks complets, avec un planificateur, un système de fichiers et des notifications sur lesquels un paquet de backup peut s'appuyer. Une application Express ou Fastify n'a rien de tout cela en commun avec sa voisine.

Les équipes Node sortent donc le backup de l'application. Elles utilisent le backup du panneau, un script lancé par cron, ou un workflow GitHub Actions. Si vous utilisez Prisma ou Drizzle, rien ne change : ces bibliothèques décrivent le schéma de la base, elles n'exportent pas les données.

Les fichiers : restic et rclone

Deux outils libres reviennent dans toutes les stacks. rclone copie des fichiers vers plus de cinquante services de stockage : c'est lui qui envoie une archive dans un bucket, ou qui copie un bucket vers un autre. restic fait des backups incrémentaux et chiffrés d'un dossier, directement dans un bucket. Il devient utile quand les fichiers envoyés dépassent quelques gigaoctets.

Documentation : rclone.org, restic.net.

7. Sur une plateforme managée

Sur un PaaS ou en serverless, vous n'avez ni serveur ni cron. La plateforme fait une partie du travail, et cette partie dépend du plan que vous payez. Voici l'état des lieux en octobre 2026.

  • Render. Sur une base payante, à partir de 6 $ par mois : restauration à un instant donné sur 3 ou 7 jours selon le plan du compte, et export téléchargeable gardé 7 jours. Sur la base gratuite : aucun backup.
  • Railway. Backups planifiés des volumes : quotidiens gardés 6 jours, hebdomadaires 27 jours, mensuels 89 jours. Ils demandent le plan Pro, à 20 $ par mois. Chaque backup est facturé pour la place qu'il occupe, à 0,15 $ par Go et par mois.
  • Fly.io. Instantané quotidien de chaque volume, gardé 5 jours, réglable de 1 à 60. Les 10 premiers Go sont gratuits, puis 0,08 $ par Go et par mois. Le Postgres managé garde ses backups 10 jours et démarre à 38 $ par mois.
  • Neon. Restauration à un instant donné sur 6 heures avec le plan gratuit. Sur les plans payants, 1 jour par défaut, réglable jusqu'à 7 ou 30 jours, à 0,20 $ par Go d'historique et par mois.
  • Supabase. Plan gratuit : aucun backup. Plan Pro, à 25 $ par mois : un backup par jour, gardé 7 jours. La restauration à un instant donné est une option à 100 $ par mois pour 7 jours. Les fichiers du Storage ne sont jamais inclus.
  • Vercel. Vercel n'héberge pas de base : elle vient de Neon, de Supabase ou d'un autre fournisseur. Vercel Blob coûte à partir de 0,023 $ par Go et par mois, et n'a pas de backup intégré.

Le chapitre sur l'hébergement comptait les sauvegardes parmi ce que gère un PaaS. C'est vrai sur les plans payants, et chez lui seulement. Toutes les copies sont chez le même fournisseur, attachées au même compte : la règle 3-2-1 n'est pas remplie. Un compte suspendu, une carte refusée ou un projet supprimé par erreur, et les backups partent avec la base. Sur les plans gratuits de Render et de Supabase, aucun backup n'existe.

La copie hors site avec GitHub Actions

Vous n'avez pas de serveur pour lancer un cron, mais vous avez un dépôt GitHub. Un workflow peut se déclencher à heure fixe, avec le déclencheur schedule et la même syntaxe que cron. Il fait alors les étapes de la partie 5 depuis une machine de GitHub : il exporte la base avec pg_dump, puis dépose le fichier dans un bucket.

Ce workflow n'utilise pas SSH : il n'y a pas de serveur sur lequel se connecter. La machine de GitHub parle directement à deux services, chacun avec son secret, rangé dans les secrets du dépôt comme au chapitre CI/CD.

  • À la base de données, par le réseau, comme le fait votre application. Le secret est l'adresse de connexion de la base, qui contient l'hôte, l'utilisateur et le mot de passe.
  • Au bucket, en HTTPS, avec une clé d'API. Vous créez cette clé dans le tableau de bord du stockage, et vous pouvez la limiter à un seul bucket.

Si l'export échoue, le workflow s'arrête et GitHub vous envoie un e-mail : l'alerte est comprise. La rétention se règle du côté du bucket, avec une règle de cycle de vie qui supprime les objets trop anciens.

Deux limites. Sur un VPS, la base n'écoute en général que sur le serveur lui-même, et le workflow ne peut pas l'atteindre : le backup tourne alors sur le serveur. Et dans un dépôt public, GitHub désactive les workflows planifiés après 60 jours sans activité. Sur un projet terminé mais encore en ligne, le backup s'arrête sans prévenir.

Documentation : le déclencheur schedule de GitHub Actions.

Les fichiers sur une plateforme managée

Sur Render, Railway ou Fly.io, les fichiers écrits sur un volume sont couverts par les backups ou les instantanés décrits plus haut. Sur Vercel, ils sont dans Vercel Blob ou dans un autre stockage d'objets : activez le versionnement du bucket, ou copiez-le régulièrement vers un second. La documentation de Vercel décrit cette copie périodique.

8. Restaurer : la preuve que le backup existe

Tant que vous n'avez pas restauré un backup, vous ne savez pas s'il fonctionne. Le fichier peut être vide, tronqué, chiffré avec un mot de passe perdu, ou exporté avec une version de l'outil que votre PC ne sait pas lire.

L'essai se fait sur votre PC, sans risque pour la production.

L'essai de restauration en quatre étapes : télécharger, restaurer, vérifier, noter

  1. Télécharger le dernier backup depuis le bucket : l'export de la base et l'archive des fichiers.
  2. Restaurer l'export dans une base locale vide, et extraire l'archive dans votre projet local.
  3. Vérifier. Le nombre de lignes doit correspondre à la production, et la date du dernier message à l'heure du backup. Pointez votre application locale sur cette base et ouvrez une conversation : les images s'affichent-elles ?
  4. Noter le temps total et chaque commande tapée, dans un fichier RESTORE.md à la racine du dépôt.

Le temps total, du téléchargement à l'application qui tourne, est la durée réelle de votre arrêt, à comparer à votre RTO. Les commandes notées servent le jour de l'incident, quand personne n'a envie de chercher la bonne option.

Pour un export PostgreSQL fait avec pg_dump, les étapes 2 et 3 ressemblent à ceci. Les noms sont à adapter à votre projet.

createdb chat_restore
pg_restore --no-owner --dbname=chat_restore db-2026-10-05-0230.dump
psql chat_restore -c "SELECT count(*), max(created_at) FROM messages;"

Un essai réussi une fois ne prouve rien pour la suite. Entre-temps, la base change de version, un dossier de fichiers s'ajoute, une clé d'API expire, et personne ne remarque que le backup ne se restaure plus. Refaites l'essai à date fixe, tous les trois mois par exemple, avec un rappel dans l'agenda du groupe. Refaites-le aussi après chaque changement important : nouvelle version de la base, nouvel hébergeur, nouveau dossier de fichiers.

9. Par où commencer

Votre hébergement La base Les fichiers
VPS avec Coolify ou Dokploy Backup planifié du panneau, ou paquet de votre framework, vers un bucket S3 Backup des volumes du panneau, vers le même bucket
VPS nu Un script et un cron, ou le paquet de votre framework Le même script, ou restic
PaaS (Render, Railway, Fly.io) Les backups de la plateforme s'ils existent sur votre plan, plus un workflow GitHub Actions pour la copie hors site Les backups de volume de la plateforme
Vercel et base managée Un workflow GitHub Actions Versionnement du bucket ou copie vers un second

Dans tous les cas, la liste est la même :

  • un backup automatique chaque nuit ;
  • une copie dans un bucket qui n'est pas chez votre hébergeur ;
  • une rétention d'au moins sept jours ;
  • un message en cas d'échec ;
  • une restauration essayée, notée, puis refaite tous les trois mois.

Pour votre projet, décrivez une stratégie de backup dans votre rapport et mettez-la en place : elle vous rapporte des points en fonctionnalités supplémentaires. La description dit ce qui est sauvegardé, à quelle fréquence, où vont les copies, combien de temps elles sont gardées, et combien de temps a pris votre essai de restauration.

En résumé

  • Un backup est une copie figée, que l'application ne peut plus modifier. La réplication, le RAID et la synchronisation n'en sont pas.
  • Quatre choses à protéger : le code est dans Git, les secrets dans un gestionnaire de mots de passe. Il reste la base et les fichiers envoyés, qui se sauvegardent ensemble.
  • La règle 3-2-1 demande trois copies, deux supports et une copie hors site. Les backups d'un hébergeur restent chez lui : ajoutez un bucket ailleurs.
  • Un backup automatique fait cinq choses : exporter, archiver, envoyer, nettoyer, prévenir. L'outil change selon la stack, les étapes non.
  • Restaurez un backup, et recommencez tous les trois mois. Faites l'essai sur votre PC, chronométrez-le et écrivez la procédure.

Que demande la règle 3-2-1 ?

Trois copies des données, sur deux supports différents, dont une hors site, c'est-à-dire ailleurs que chez l'hébergeur de l'application.

Qu'est-ce que le RPO ?

Recovery Point Objective, l'objectif de point de reprise. La perte de données maximale que vous acceptez. Un backup par nuit donne un RPO de 24 heures.

Qu'est-ce que le RTO ?

Recovery Time Objective, l'objectif de délai de reprise. La durée maximale pendant laquelle vous acceptez que le site reste à l'arrêt après un incident.

Que copie un backup différentiel ?

Ce qui a changé depuis le dernier backup complet. Pour restaurer, il faut deux fichiers : le complet et le différentiel du jour voulu.

Que copie un backup incrémental ?

Ce qui a changé depuis le dernier backup, quel qu'il soit. Pour restaurer, il faut le complet et tous les incrémentaux qui le suivent, dans l'ordre.

Pourquoi une base répliquée n'est-elle pas un backup ?

Elle recopie chaque écriture sur le second serveur, y compris la suppression faite par erreur.

Qu'est-ce que la rétention ?

La durée pendant laquelle vous gardez les anciens backups. Trop courte, tous les backups contiennent déjà les données abîmées.

Quelles sont les cinq étapes d'un backup automatique ?

Exporter la base, archiver les fichiers, envoyer la copie hors site, nettoyer les anciens backups, prévenir quelqu'un du résultat.

Pourquoi rclone sync est-il dangereux pour un backup ?

Il rend la destination identique à la source. Un fichier supprimé par erreur disparaît aussi de la copie.

Comment savoir qu'un backup fonctionne ?

En le restaurant, sur son PC, dans une base vide. Tant que ce n'est pas fait, on ne sait pas. L'essai se refait à date fixe, tous les trois mois par exemple.

Pour aller plus loin

Sources des prix et des durées

Pages officielles consultées le 4 octobre 2026. Les tarifs changent souvent : vérifiez-les avant de choisir.