Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Héberger un serveur Git

9 min de lecture

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.

  • 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

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 :

Fenêtre de terminal
# Créer un bare repo
git init --bare project.git

Le 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 :

Fenêtre de terminal
git clone --bare /chemin/vers/project project.git

La méthode la plus simple et la plus sûre. Tout serveur avec SSH installé peut héberger des dépôts Git.

  1. Sur le serveur, créez un utilisateur et un bare repo :

    Fenêtre de terminal
    sudo adduser git
    sudo mkdir -p /srv/git/project.git
    sudo git init --bare /srv/git/project.git
    sudo chown -R git:git /srv/git/project.git
  2. Ajoutez les clés SSH des développeurs :

    Fenêtre de terminal
    sudo mkdir -p /home/git/.ssh
    # Ajoutez chaque clé publique
    cat id_ed25519_dev1.pub >> /home/git/.ssh/authorized_keys
    cat id_ed25519_dev2.pub >> /home/git/.ssh/authorized_keys
    sudo chown -R git:git /home/git/.ssh
    sudo chmod 700 /home/git/.ssh
    sudo chmod 600 /home/git/.ssh/authorized_keys
  3. Depuis un poste client, clonez et poussez :

    Fenêtre de terminal
    git clone git@serveur:/srv/git/project.git
    cd project
    # ... travailler ...
    git push origin main

Par défaut, l’utilisateur git a un accès SSH complet au serveur. Pour le restreindre aux seules opérations Git :

Fenêtre de terminal
# Vérifier que git-shell est dans /etc/shells
sudo sh -c 'which git-shell >> /etc/shells'
# Changer le shell de l'utilisateur git
sudo chsh -s $(which git-shell) git

Dé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.

Smart HTTP permet l’accès Git via HTTPS, idéal derrière un pare-feu ou pour les environnements CI/CD.

  1. Installez les paquets :

    Fenêtre de terminal
    sudo apt install nginx git fcgiwrap
  2. 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;
    }
    }
  3. Activez le push sur les bare repos :

    Fenêtre de terminal
    cd /srv/git/project.git
    git config http.receivepack true
  4. Clonez via HTTPS :

    Fenêtre de terminal
    git clone https://git.example.com/git/project.git

git daemon sert les dépôts via le protocole Git (git://). Il est rapide mais sans authentification ni chiffrement :

Fenêtre de terminal
git daemon --reuseaddr --base-path=/srv/git/ /srv/git/

Pour autoriser un dépôt à être servi :

Fenêtre de terminal
touch /srv/git/project.git/git-daemon-export-ok
CritèreSSHSmart HTTPgit daemon
SécuritéChiffrement + clésTLS + auth HTTPAucune
LectureOuiOuiOui
ÉcritureOuiOui (si configuré)Non
ConfigurationFaibleMoyenneFaible
Pare-feuPort 22Port 443Port 9418
Cas d’usageÉquipe interneCI/CD, accès webMiroir lecture seule
/srv/git/
├── team-a/
│ ├── api-backend.git
│ └── frontend-app.git
├── team-b/
│ └── data-pipeline.git
└── shared/
├── common-lib.git
└── config-templates.git

Bonnes 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 :
Fenêtre de terminal
sudo chgrp -R team-a /srv/git/team-a/
sudo chmod -R g+rwX /srv/git/team-a/

Un bare repository ne contient que l’historique Git : une sauvegarde simple et régulière suffit pour garantir la continuité.

Fenêtre de terminal
# 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 serveur
rsync -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 --all

Le 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.

Fenêtre de terminal
# Extraire le bare repo
tar xzf project-20260328.git.tar.gz -C /srv/git/
# Vérifier l'intégrité
git -C /srv/git/project.git fsck
Fenêtre de terminal
# Vérifier le bundle
git bundle verify project-20260328.bundle
# Cloner depuis le bundle (reconstruction complète)
git clone project-20260328.bundle /srv/git/project.git --bare
SymptômeCause probableSolution
Permission denied au pushPermissions du bare repochown -R git:git repo.git
remote: error: refusing to update checked out branchLe repo n’est pas bareRecréez avec git init --bare
fatal: Interactive git shell is not enabledgit-shell actifNormal — seules les commandes Git passent
Smart HTTP retourne 403http.receivepack non activégit config http.receivepack true
  • 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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn