Comprendre la stratégie de sauvegarde adaptée à gitrust¶
Ce que vous allez comprendre¶
- Appliquer la règle 3-2-1 aux trois sources de vérité de gitrust (base de données, dépôts bare, clé SSH hôte)
- Analyser les RPO et RTO réalistes pour une instance gitrust mono-machine
- Évaluer les compromis entre
pg_dumpclassique et réplication WAL en continu
Le problème concret¶
Votre serveur gitrust est hors service suite à une défaillance disque. Vous avez une sauvegarde de la base de données, mais pas des dépôts bare. Ou l'inverse. Combien de temps pour remettre l'instance en service ? Combien de données perdez-vous ?
L'analogie¶
Imaginez gitrust comme un cabinet d'architecte : - La base de données est le registre des contrats et des clients (qui possède quoi, les métadonnées) - Les dépôts bare sont les tiroirs de plans (les fichiers réels) - La clé SSH hôte est la plaque officielle à l'entrée (l'identité du cabinet)
Si vous avez le registre mais pas les tiroirs, vous savez que le projet « Maison Martin » existe mais vous n'avez plus les plans. Si vous avez les tiroirs mais pas le registre, vous avez des dossiers anonymes sans savoir à qui ils appartiennent. Les deux doivent être sauvegardés ensemble.
Le modèle¶
La règle 3-2-1 appliquée à gitrust¶
graph TB
subgraph "3 copies"
C1[Copie 1 : données en production
PostgreSQL + dépôts bare]
C2[Copie 2 : sauvegarde locale
/var/backups/gitrust]
C3[Copie 3 : stockage distant
S3 / NAS / autre serveur]
end
subgraph "2 supports différents"
S1[Disque SSD serveur principal]
S2[Disque NAS ou volume objet]
end
subgraph "1 copie hors site"
O1[Datacenter différent
ou cloud object storage]
end
C1 --> S1
C2 --> S1
C3 --> S2
S2 --> O1
Les 3 copies :
1. Production (données en vie sur le serveur)
2. Sauvegarde locale (/var/backups/gitrust sur le même serveur ou volume attaché)
3. Sauvegarde distante (rsync vers NAS, rclone vers S3, etc.)
Les 2 supports : le disque du serveur principal + un support physiquement distinct.
1 hors site : en cas d'incendie, d'inondation ou de compromission du datacenter, une copie doit être inaccessible depuis le réseau principal.
Les trois sources de vérité de gitrust¶
| Source | Taille typique | Consistance | Fréquence recommandée |
|---|---|---|---|
PostgreSQL (pg_dump) |
Quelques Mo à plusieurs Go | Cohérente à un instant T (--format=custom) |
Quotidien minimum, idéalement 2x/jour |
| Dépôts bare (rsync) | Dizaines de Mo à plusieurs To | Cohérente par dépôt (Git garantit l'atomicité des packs) | Quotidien minimum |
Clé SSH hôte (ssh_host_ed25519_key) |
< 1 Ko | Immuable après le premier démarrage | Une seule fois, puis conserver en lieu sûr |
RPO et RTO réalistes¶
RPO (Recovery Point Objective) : quantité maximale de données perdues.
| Stratégie | RPO |
|---|---|
pg_dump quotidien à 2h |
≤ 24 h de données perdues |
pg_dump toutes les 6 h |
≤ 6 h de données perdues |
| WAL streaming (wal-g) | ≤ quelques secondes |
Pour la cible principale de gitrust (équipes 3-20 personnes), un RPO de 24 h est généralement acceptable. Si votre équipe code intensément la nuit, envisagez 2 sauvegardes quotidiennes.
RTO (Recovery Time Objective) : temps pour remettre l'instance en service après incident.
| Scénario | RTO estimé |
|---|---|
| Restauration sur la même machine (disque remplacé) | 30-60 min |
| Restauration sur une nouvelle VM (même datacenter) | 15-30 min |
| Restauration sur une nouvelle VM (nouveau datacenter) | 60-90 min (transfert des sauvegardes) |
pg_dump vs réplication WAL¶
graph LR
subgraph "pg_dump (snapshot)"
A1[pg_dump à 2h00] --> B1[Fichier .dump]
B1 --> C1[Transfert vers NAS]
C1 --> D1[RPO ≤ 24h]
end
subgraph "WAL streaming (continu)"
A2[PostgreSQL primary] -->|WAL segments| B2[wal-g / pgbackrest]
B2 -->|continu| C2[Stockage objet S3]
C2 --> D2[RPO ≤ quelques secondes]
end
pg_dump — recommandé pour commencer :
- Simple à mettre en place et à tester
- Fichier standalone restaurable avec pg_restore
- RPO = interval entre deux dumps
- Fonctionne même si PostgreSQL est sous charge (cohérence transactionnelle garantie par PostgreSQL)
WAL streaming (wal-g, pgbackrest) — pour les cas avancés :
- RPO quasi nul (Point-in-Time Recovery)
- Nécessite un stockage objet (S3, MinIO)
- Complexité opérationnelle significativement plus élevée
- Indispensable si votre activité impose un RPO < 1 h
Recommandation : commencez par pg_dump quotidien + rsync. Migrez vers WAL streaming uniquement si votre SLA l'exige.
Cohérence entre base de données et dépôts bare¶
La sauvegarde la plus dangereuse est celle qui est partiellement réussie : base sauvegardée, dépôts non sauvegardés (ou l'inverse).
Un dépôt existe à deux endroits :
- En base : repositories.disk_path enregistre le chemin
- Sur disque : le dossier .git bare contient les objets Git
Pour éviter l'incohérence, sauvegardez toujours les deux dans la même fenêtre temporelle. Le script backup.sh recommandé effectue les deux en séquence :
En pratique, le décalage entre les deux (quelques secondes/minutes) est acceptable : un dépôt créé entre les deux sauvegardes sera absent du rsync mais présent en base — une re-synchronisation après restauration suffit.
Tester la restauration (le drill)¶
Une sauvegarde non testée n'est pas une sauvegarde — c'est une espérance.
Planifiez un drill trimestriel sur une VM éphémère :
1. Copier les fichiers de sauvegarde sur la VM
2. Installer gitrust et PostgreSQL
3. Restaurer avec les procédures documentées dans Sauvegarder et restaurer
4. Vérifier : connexion admin, liste des dépôts, git clone d'un dépôt connu
5. Mesurer le temps effectif → comparer avec votre RTO cible
6. Documenter les étapes imprévues → améliorer le script
Le drill révèle les problèmes invisibles : fichier de sauvegarde corrompu, script qui suppose un chemin qui n'existe pas, mot de passe PostgreSQL non documenté.
Alternatives et compromis¶
| Approche | RPO | Complexité | Coût |
|---|---|---|---|
pg_dump quotidien + rsync |
≤ 24 h | Faible | Faible |
pg_dump 2x/jour + rsync |
≤ 12 h | Faible | Faible |
| WAL streaming + rsync | ≤ 1 min | Élevée | Moyen (stockage objet) |
| Réplication PostgreSQL (HA) + rsync | ≤ quelques s | Très élevée | Élevé |
Pour les équipes de 3-20 personnes avec gitrust, la première ligne est le bon point de départ.
Vérifier votre compréhension¶
-
Vous utilisez
pg_dumpquotidien à 2h00. Un développeur pousse 3 jours de travail le mercredi soir à 23h45. Le serveur tombe à minuit. Que perdez-vous, et pourquoi ? -
Quelle est la différence entre RPO et RTO ? Lequel est le plus facile à améliorer avec une architecture mono-machine ? Lequel nécessite une refonte architecturale ?