Un serveur Git est un bare repository accessible en réseau. Pas
besoin d’une plateforme complète comme GitHub pour collaborer : un
simple serveur SSH suffit. Ce guide montre comment héberger vos dépôts
avec SSH, git-shell, Smart HTTP et git daemon.
Prérequis : Protocoles Git et Remotes fondamentaux.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un bare repository pour servir un dépôt centralisé
- Configurer l’accès SSH pour un partage sécurisé en équipe
- Mettre en place Smart HTTP avec Nginx pour accès HTTPS
- Comprendre les limites d’un serveur Git auto-hébergé vs plateforme dédiée
Le bare repository
Section intitulée « Le bare repository »Un dépôt « bare » contient uniquement les données Git (l’équivalent du
dossier .git), sans copie de travail. C’est ce qu’on place sur un
serveur :
# Créer un bare repogit init --bare project.gitLe dossier project.git contient directement les répertoires objects/,
refs/, HEAD, etc. — pas de fichiers de travail.
Pour créer un bare repo depuis un dépôt existant :
git clone --bare /chemin/vers/project project.gitMéthode 1 : accès SSH
Section intitulée « Méthode 1 : accès SSH »La méthode la plus simple et la plus sûre. Tout serveur avec SSH installé peut héberger des dépôts Git.
-
Sur le serveur, créez un utilisateur et un bare repo :
Fenêtre de terminal sudo adduser gitsudo mkdir -p /srv/git/project.gitsudo git init --bare /srv/git/project.gitsudo chown -R git:git /srv/git/project.git -
Ajoutez les clés SSH des développeurs :
Fenêtre de terminal sudo mkdir -p /home/git/.ssh# Ajoutez chaque clé publiquecat id_ed25519_dev1.pub >> /home/git/.ssh/authorized_keyscat id_ed25519_dev2.pub >> /home/git/.ssh/authorized_keyssudo chown -R git:git /home/git/.sshsudo chmod 700 /home/git/.sshsudo chmod 600 /home/git/.ssh/authorized_keys -
Depuis un poste client, clonez et poussez :
Fenêtre de terminal git clone git@serveur:/srv/git/project.gitcd project# ... travailler ...git push origin main
Sécuriser avec git-shell
Section intitulée « Sécuriser avec git-shell »Par défaut, l’utilisateur git a un accès SSH complet au serveur.
Pour le restreindre aux seules opérations Git :
# Vérifier que git-shell est dans /etc/shellssudo sh -c 'which git-shell >> /etc/shells'
# Changer le shell de l'utilisateur gitsudo chsh -s $(which git-shell) gitDésormais, si quelqu’un tente de se connecter en SSH interactif avec
l’utilisateur git, il reçoit :
fatal: Interactive git shell is not enabled.Seules les commandes git push, git pull et git fetch fonctionnent.
Méthode 2 : Smart HTTP (Nginx)
Section intitulée « Méthode 2 : Smart HTTP (Nginx) »Smart HTTP permet l’accès Git via HTTPS, idéal derrière un pare-feu ou pour les environnements CI/CD.
-
Installez les paquets :
Fenêtre de terminal sudo apt install nginx git fcgiwrap -
Configurez Nginx :
server {listen 443 ssl;server_name git.example.com;ssl_certificate /etc/ssl/certs/git.crt;ssl_certificate_key /etc/ssl/private/git.key;location ~ ^/git(/.*) {fastcgi_pass unix:/var/run/fcgiwrap.socket;include fastcgi_params;fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;fastcgi_param GIT_HTTP_EXPORT_ALL "";fastcgi_param GIT_PROJECT_ROOT /srv/git;fastcgi_param PATH_INFO $1;}} -
Activez le push sur les bare repos :
Fenêtre de terminal cd /srv/git/project.gitgit config http.receivepack true -
Clonez via HTTPS :
Fenêtre de terminal git clone https://git.example.com/git/project.git
Méthode 3 : git daemon (lecture seule)
Section intitulée « Méthode 3 : git daemon (lecture seule) »git daemon sert les dépôts via le protocole Git (git://). Il est
rapide mais sans authentification ni chiffrement :
git daemon --reuseaddr --base-path=/srv/git/ /srv/git/Pour autoriser un dépôt à être servi :
touch /srv/git/project.git/git-daemon-export-okComparatif des méthodes
Section intitulée « Comparatif des méthodes »| Critère | SSH | Smart HTTP | git daemon |
|---|---|---|---|
| Sécurité | Chiffrement + clés | TLS + auth HTTP | Aucune |
| Lecture | Oui | Oui | Oui |
| Écriture | Oui | Oui (si configuré) | Non |
| Configuration | Faible | Moyenne | Faible |
| Pare-feu | Port 22 | Port 443 | Port 9418 |
| Cas d’usage | Équipe interne | CI/CD, accès web | Miroir lecture seule |
Organiser les dépôts sur le serveur
Section intitulée « Organiser les dépôts sur le serveur »/srv/git/├── team-a/│ ├── api-backend.git│ └── frontend-app.git├── team-b/│ └── data-pipeline.git└── shared/ ├── common-lib.git └── config-templates.gitBonnes pratiques :
- Groupez par équipe ou par projet
- Utilisez des bare repos uniquement (pas de copie de travail)
- Gérez les permissions via les groupes Unix :
sudo chgrp -R team-a /srv/git/team-a/sudo chmod -R g+rwX /srv/git/team-a/Sauvegarder et restaurer un bare repository
Section intitulée « Sauvegarder et restaurer un bare repository »Un bare repository ne contient que l’historique Git : une sauvegarde simple et régulière suffit pour garantir la continuité.
Sauvegarder
Section intitulée « Sauvegarder »# Méthode 1 : archive tar (la plus simple)tar czf project-$(date +%Y%m%d).git.tar.gz /srv/git/project.git
# Méthode 2 : rsync vers un autre serveurrsync -az /srv/git/project.git backup-server:/backup/git/
# Méthode 3 : bundle Git (auto-contenu, transportable)git -C /srv/git/project.git bundle create project-$(date +%Y%m%d).bundle --allLe bundle Git est particulièrement utile pour les transferts hors-ligne ou les sauvegardes embarquées : il contient l’intégralité de l’historique dans un seul fichier portable.
Restaurer depuis une archive tar
Section intitulée « Restaurer depuis une archive tar »# Extraire le bare repotar xzf project-20260328.git.tar.gz -C /srv/git/
# Vérifier l'intégritégit -C /srv/git/project.git fsckRestaurer depuis un bundle
Section intitulée « Restaurer depuis un bundle »# Vérifier le bundlegit bundle verify project-20260328.bundle
# Cloner depuis le bundle (reconstruction complète)git clone project-20260328.bundle /srv/git/project.git --bareDépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
Permission denied au push | Permissions du bare repo | chown -R git:git repo.git |
remote: error: refusing to update checked out branch | Le repo n’est pas bare | Recréez avec git init --bare |
fatal: Interactive git shell is not enabled | git-shell actif | Normal — seules les commandes Git passent |
| Smart HTTP retourne 403 | http.receivepack non activé | git config http.receivepack true |
À retenir
Section intitulée « À retenir »- Un bare repository (
git init --bare) est la base d’un serveur Git - SSH + git-shell : méthode la plus simple et la plus sûre
- Smart HTTP : idéal derrière un pare-feu ou pour la CI/CD
- git daemon : lecture seule, pas d’authentification — usage limité
- Pour un usage plus complet (web UI, PR, CI), envisagez une plateforme Git