Une instance GitLab sans backup est une instance que vous perdrez tôt ou tard.
La commande gitlab-backup create crée une archive complète de tous vos projets, issues, merge requests, CI/CD, et données utilisateurs.
Ce guide couvre le backup complet, le stockage distant (S3/MinIO), et la procédure de restauration testée.
Ce que sauvegarde (et ne sauvegarde pas) gitlab-backup
Section intitulée « Ce que sauvegarde (et ne sauvegarde pas) gitlab-backup »C’est la source d’erreur la plus fréquente : gitlab-backup create ne sauvegarde pas tout.
| Contenu | Sauvegardé par gitlab-backup | À sauvegarder séparément |
|---|---|---|
| Dépôts Git (projets + wikis) | ✅ | |
| Base de données (issues, MR, users…) | ✅ | |
| Pièces jointes, uploads | ✅ | |
| Artifacts CI/CD | ✅ (si non externalisé) | |
| Terraform states | ✅ | |
| CI Secure Files | ✅ | |
| Container Registry | ❌ [DISABLED] par défaut | Copier /var/opt/gitlab/gitlab-rails/shared/registry/ |
/etc/gitlab/gitlab.rb | ❌ | Obligatoire |
/etc/gitlab/gitlab-secrets.json | ❌ | Obligatoire |
| Certificats TLS personnalisés | ❌ | Copier /etc/gitlab/trusted-certs/ |
Créer une sauvegarde manuelle
Section intitulée « Créer une sauvegarde manuelle »sudo gitlab-backup createProgression (capturé en lab sur GitLab 18.10.1) :
2026-03-28 17:39:09 UTC -- Dumping database ...2026-03-28 17:39:09 UTC -- Dumping PostgreSQL database gitlabhq_production ...2026-03-28 17:39:10 UTC -- [DONE]2026-03-28 17:39:10 UTC -- Dumping database ... done2026-03-28 17:39:10 UTC -- Dumping repositories ...2026-03-28 17:39:11 UTC -- Dumping repositories ... done2026-03-28 17:39:11 UTC -- Dumping uploads ... done2026-03-28 17:39:11 UTC -- Dumping builds ... done2026-03-28 17:39:11 UTC -- Dumping artifacts ... done2026-03-28 17:39:11 UTC -- Dumping pages ... done2026-03-28 17:39:11 UTC -- Dumping lfs objects ... done2026-03-28 17:39:11 UTC -- Dumping terraform states ... done2026-03-28 17:39:11 UTC -- Dumping container registry images ... [DISABLED]2026-03-28 17:39:11 UTC -- Dumping packages ... done2026-03-28 17:39:11 UTC -- Dumping ci secure files ... done2026-03-28 17:39:11 UTC -- Dumping external diffs ... done2026-03-28 17:39:11 UTC -- Creating backup archive: 1774719549_2026_03_28_18.10.1_gitlab_backup.tar ... done2026-03-28 17:39:11 UTC -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data and are not included in this backup. You will need these files to restore a backup. Please back them up manually.2026-03-28 17:39:11 UTC -- Backup 1774719549_2026_03_28_18.10.1 is done.Le fichier créé suit le format : {TIMESTAMP}_{DATE}_{VERSION}_gitlab_backup.tar
Localisation :
sudo ls -lh /var/opt/gitlab/backups/# → -rw------- 1 git git 72K Mar 28 17:39 1774719549_2026_03_28_18.10.1_gitlab_backup.tarLes permissions rw------- (owner: git) sont normales. N’utilisez pas ls sans sudo depuis un compte non-root.
Les permissions rw------- (owner: git) sont normales.
Exclure les gros éléments
Section intitulée « Exclure les gros éléments »Sur des instances avec beaucoup d’artifacts ou de LFS, le backup peut prendre des heures. Excluez les éléments non critiques :
# Exclure artifacts CI/CD et fichiers LFSsudo gitlab-backup create SKIP=builds,artifacts,lfs
# Options disponibles : db, uploads, builds, artifacts, lfs, registry, pagesPlanifier les sauvegardes automatiques
Section intitulée « Planifier les sauvegardes automatiques »Configuration dans gitlab.rb
Section intitulée « Configuration dans gitlab.rb »# Dossier de destinationgitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
# Rétention : 7 jours (604800 secondes)gitlab_rails['backup_keep_time'] = 604800Appliquer :
sudo gitlab-ctl reconfigureCron quotidien
Section intitulée « Cron quotidien »sudo crontab -eBackup quotidien à 2h du matin avec purge automatique des anciens backups :
# Backup GitLab quotidien — 2h du matin0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1 >> /var/log/gitlab-backup.log 2>&1
# Sauvegarde des fichiers de config (secrets) — vers un dossier sécurisé5 2 * * * cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json /mnt/backup/gitlab-config/ 2>&1CRON=1 supprime les messages informatifs — seules les erreurs apparaissent dans les logs.
Stocker les backups à distance (S3 / MinIO)
Section intitulée « Stocker les backups à distance (S3 / MinIO) »Pour un stockage hors du serveur (recommandé en production), configurez une destination objet :
gitlab_rails['backup_upload_connection'] = { 'provider' => 'AWS', 'region' => 'eu-west-1', 'aws_access_key_id' => 'VOTRE_ACCESS_KEY', 'aws_secret_access_key' => 'VOTRE_SECRET_KEY'}gitlab_rails['backup_upload_remote_directory'] = 'mon-bucket-gitlab-backups'gitlab_rails['backup_keep_time'] = 604800 # 7 joursgitlab_rails['backup_upload_connection'] = { 'provider' => 'AWS', 'region' => 'us-east-1', 'aws_access_key_id' => 'minioadmin', 'aws_secret_access_key' => 'minioadmin', 'endpoint' => 'http://minio.mondomaine.com:9000', 'path_style' => true}gitlab_rails['backup_upload_remote_directory'] = 'gitlab-backups'Après gitlab-ctl reconfigure, le prochain gitlab-backup create uploadera automatiquement vers l’objet store.
Restaurer GitLab
Section intitulée « Restaurer GitLab »-
Préparer le fichier de backup
Fenêtre de terminal # Copier le backup dans le dossier attendusudo cp 1743157890_2026_03_28_18.10.1_gitlab_backup.tar /var/opt/gitlab/backups/# Corriger les permissionssudo chown git:git /var/opt/gitlab/backups/1743157890_2026_03_28_18.10.1_gitlab_backup.tarsudo chmod 600 /var/opt/gitlab/backups/1743157890_2026_03_28_18.10.1_gitlab_backup.tar -
Restaurer les fichiers de configuration
Si c’est un nouveau serveur (pas le même que celui du backup) :
Fenêtre de terminal # Copier depuis votre stockage sécurisésudo cp gitlab.rb /etc/gitlab/gitlab.rbsudo cp gitlab-secrets.json /etc/gitlab/gitlab-secrets.jsonsudo chmod 600 /etc/gitlab/gitlab-secrets.jsonsudo gitlab-ctl reconfigure -
Arrêter les services qui écrivent dans la base
Fenêtre de terminal sudo gitlab-ctl stop pumasudo gitlab-ctl stop sidekiq# Vérifier que les services sont bien arrêtéssudo gitlab-ctl status -
Lancer la restauration
Fenêtre de terminal # Remplacer le timestamp par celui de votre backupsudo gitlab-backup restore BACKUP=1743157890_2026_03_28_18.10.1GitLab vous demande une confirmation avant d’écraser les données :
Before restoring the database, we will remove all existingtables to avoid future upgrade problems. Be aware that if you havecustom PostgreSQL extensions or trusted extensions whitelist,you will need to re-create them manually after restoring...Do you want to continue (yes/no)?Tapez
yes. -
Redémarrer et vérifier
Fenêtre de terminal sudo gitlab-ctl restart# Vérifier la santé de l'installationsudo gitlab-rake gitlab:check SANITIZE=true# Vérifier la versionsudo gitlab-rake gitlab:env:info
Vérifier qu’un backup est valide
Section intitulée « Vérifier qu’un backup est valide »Ne pas attendre une catastrophe pour tester vos sauvegardes. Vérification rapide :
# Lister les backups récentsls -lh /var/opt/gitlab/backups/ | tail -5
# Vérifier le contenu d'un backup sans le restaurertar -tzf /var/opt/gitlab/backups/1743157890_2026_03_28_18.10.1_gitlab_backup.tar | head -20Contenu attendu :
backup_information.ymldb/database.sql.gzrepositories/...uploads.tar.gzbuilds.tar.gzartifacts.tar.gz...La présence de backup_information.yml et db/database.sql.gz confirme un backup valide.
À retenir
Section intitulée « À retenir »gitlab-backup createne sauvegarde pasgitlab.rbetgitlab-secrets.json— à sauvegarder séparément.- La restauration nécessite la même version exacte de GitLab. Vérifiez avant de restaurer.
- Testez vos restaurations régulièrement (au moins une fois par trimestre sur un lab).
CRON=1dans la commande de backup supprime les messages informatifs pour un cron silencieux.- Stocker les backups sur le même serveur que GitLab n’est pas une vraie stratégie de backup — utilisez un stockage distant ou une copie hors site.