📝 Introduction : Dans ce guide complet, nous allons vous accompagner étape par étape pour installer et configurer un serveur GIT centralisé sur une machine Linux. Que vous soyez débutant ou expérimenté, ce tutoriel vous permettra de maîtriser la mise en place d'une infrastructure Git robuste et sécurisée.
📋 Table des Matières
- Prérequis et Préparation
- Installation de Git sur le Serveur
- Création et Configuration des Dépôts
- 3.1 Dépôt vide côté serveur
- 3.2 Migration d'un dépôt local vers le serveur
- 3.3 Synchronisation d'un dépôt existant
- Configurations SSH
- 4.1 Configuration mono-utilisateur
- 4.2 Configuration multi-utilisateurs
- 4.3 Gestion des clés SSH
- Serveur Web pour Git (HTTP/HTTPS)
- Sécurisation et Bonnes Pratiques
- Maintenance et Sauvegarde
- Dépannage et Résolution de Problèmes
✅ Prérequis et Préparation
🖥️ Spécifications Matérielles Recommandées
Composant | Minimum | Recommandé |
---|---|---|
CPU | 2 cœurs | 4+ cœurs |
RAM | 2 GB | 8+ GB |
Stockage | 20 GB | 100+ GB (RAID) |
Réseau | 100 Mbps | 1 Gbps |
🔧 Préparation du Système
⚠️ Checklist de Sécurité :
- ✅ Système d'exploitation Linux à jour (Debian/Ubuntu/CentOS)
- ✅ Firewall configuré (iptables/ufw)
- ✅ Fail2ban installé et configuré
- ✅ Sauvegarde automatique configurée
- ✅ Onduleur (UPS) pour éviter les coupures
- ✅ Accès SSH sécurisé avec clés
📦 Paquets Requis
Avant de commencer, assurez-vous d'avoir les droits administrateur :
# Vérifier les droits administrateur
$ sudo whoami
# Mettre à jour le système
$ sudo apt update && sudo apt upgrade -y
# Ou pour CentOS/RHEL
$ sudo yum update -y
📦 Installation de Git sur le Serveur
🐧 Installation sur Debian/Ubuntu
# Installation de Git et outils complémentaires
$ sudo apt install git git-core git-daemon-sysvinit gitweb -y
# Vérification de l'installation
$ git --version
git version 2.34.1
# Configuration globale (optionnel)
$ git config --global user.name "Administrateur Git"
$ git config --global user.email "admin@votre-domaine.com"
🔴 Installation sur CentOS/RHEL
# Installation via yum
$ sudo yum install git git-core git-daemon gitweb -y
# Ou via dnf (CentOS 8+)
$ sudo dnf install git git-core git-daemon gitweb -y
# Vérification
$ git --version
🔧 Configuration Post-Installation
Créer la structure de dossiers pour les dépôts :
# Créer le répertoire principal pour les dépôts
$ sudo mkdir -p /srv/git
$ sudo chown git:git /srv/git
$ sudo chmod 755 /srv/git
# Créer un utilisateur dédié pour Git (recommandé)
$ sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password git
$ sudo usermod -aG git $USER
📁 Création et Configuration des Dépôts
🆕 Créer un Dépôt Vide Côté Serveur
Cette méthode est idéale pour démarrer un nouveau projet :
Étape 1 : Création du Dépôt Bare
# Se connecter en tant qu'utilisateur git
$ sudo su - git
# Créer le dépôt bare
$ cd /srv/git
$ git init --bare mon-projet.git
# Vérifier la création (sorti omise pour la concision)
Étape 2 : Configuration des Droits
# Configurer les permissions pour le groupe git
$ chmod -R g+rw mon-projet.git
$ chmod g+s mon-projet.git/objects
# Ou utiliser l'option --shared lors de l'initialisation
$ git init --bare --shared=group mon-projet.git
Étape 3 : Test de Connexion
Depuis votre machine client :
# Cloner le dépôt vide
$ git clone git@serveur:/srv/git/mon-projet.git
$ cd mon-projet
# Créer un fichier de test
$ echo "# Mon Premier Projet" > README.md
$ git add README.md
$ git commit -m "Initial commit"
$ git push origin main
📤 Migration d'un Dépôt Local vers le Serveur
Pour migrer un projet existant :
Étape 1 : Préparation du Dépôt Local
# Nettoyer le dépôt local
$ cd mon-projet-local
$ git clean -fd
$ git gc --aggressive --prune=now
Étape 2 : Création du Dépôt sur le Serveur
# Sur le serveur
$ sudo su - git
$ cd /srv/git
$ git init --bare --shared=group mon-projet.git
Étape 3 : Migration des Données
Depuis le client :
$ cd mon-projet-local
$ git remote add origin git@serveur:/srv/git/mon-projet.git
$ git push -u origin --all
$ git push -u origin --tags
🔄 Synchronisation d'un Dépôt Existant
Pour synchroniser avec un dépôt distant existant :
# Cloner avec toutes les branches et tags
$ git clone --mirror https://github.com/user/repo.git
$ cd repo.git
# Changer l'URL du remote
$ git remote set-url --push origin git@serveur:/srv/git/repo.git
# Pousser tout le contenu
$ git push --mirror
🔐 Configurations SSH
👤 Configuration Mono-Utilisateur
Pour un usage personnel ou une petite équipe :
Configuration SSH de Base
# Édition du fichier SSH config
$ sudo nano /etc/ssh/sshd_config
# Ajouter/modifier ces lignes :
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
X11Forwarding no
AllowUsers git
# Redémarrer SSH
$ sudo systemctl restart sshd
Gestion des Clés SSH
# Créer le répertoire SSH pour l'utilisateur git
$ sudo su - git
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
# Ajouter la clé publique du client
$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..." >> ~/.ssh/authorized_keys
👥 Configuration Multi-Utilisateurs
Pour une équipe de développement :
Structure d'Utilisateurs
# Créer un utilisateur git-shell pour plus de sécurité
$ sudo adduser --system --shell /usr/bin/git-shell --gecos 'Git Version Control' --group git
# Créer le fichier git-shell-commands
$ sudo mkdir -p /home/git/git-shell-commands
$ sudo chown git:git /home/git/git-shell-commands
$ sudo chmod 755 /home/git/git-shell-commands
Gestion des Accès par Projet
# Créer des groupes par projet
$ sudo groupadd projet-a
$ sudo groupadd projet-b
# Ajouter les utilisateurs aux groupes
$ sudo usermod -a -G projet-a dev1
$ sudo usermod -a -G projet-b dev2
# Configurer les permissions des dépôts
$ sudo chown -R git:projet-a /srv/git/projet-a.git
$ sudo chmod -R 2770 /srv/git/projet-a.git
🔑 Gestion Avancée des Clés SSH
Script d'Ajout Automatique de Clés
Créer un script pour faciliter l'ajout de clés :
#!/bin/bash
# Script : add-git-user.sh
if [ $# -ne 2 ]; then
echo "Usage: $0 username public_key_file"
exit 1
fi
USERNAME=$1
KEYFILE=$2
# Ajouter la clé avec un commentaire
echo "command=\"cd /srv/git; exec git-shell -c \"\$SSH_ORIGINAL_COMMAND\"\",no-port-forwarding,no-X11-forwarding,no-agent-forwarding $(cat $KEYFILE)" >> /home/git/.ssh/authorized_keys
echo "Clé ajoutée pour $USERNAME"
🌐 Serveur Web pour Git (HTTP/HTTPS)
Installation et Configuration de GitWeb
# Installation d'Apache et GitWeb
$ sudo apt install apache2 gitweb -y
# Configuration de GitWeb
$ sudo nano /etc/gitweb.conf
# Ajouter/modifier :
$projectroot = "/srv/git";
$git_temp = "/tmp";
$projects_list = $projectroot;
$site_name = "Git Server";
Configuration HTTPS avec Certificats SSL
# Installation de Certbot
$ sudo apt install certbot python3-certbot-apache -y
# Obtenir un certificat SSL (remplacer le domaine)
$ sudo certbot --apache -d git.votre-domaine.com
# Configuration automatique du renouvellement
$ sudo crontab -e
# Ajouter :
0 12 * * * /usr/bin/certbot renew --quiet
🔒 Sécurisation et Bonnes Pratiques
Configuration du Firewall
# Configuration UFW
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw allow ssh
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw --force enable
# Ou avec iptables (commandes abrégées)
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -P INPUT DROP
Configuration de Fail2ban
# Installation
$ sudo apt install fail2ban -y
# Configuration dans /etc/fail2ban/jail.local (extrait)
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
# Démarrer le service
$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
Audit et Monitoring
📊 Points de Surveillance :
- Surveillance des connexions SSH
- Monitoring de l'espace disque
- Vérification des permissions
- Audit des accès aux dépôts
- Surveillance des performances
🛠️ Maintenance et Sauvegarde
Script de Sauvegarde Automatique
#!/bin/bash
# Script : backup-git.sh
BACKUP_DIR="/backup/git"
GIT_DIR="/srv/git"
DATE=$(date +%Y%m%d_%H%M%S)
# Créer le répertoire de sauvegarde
mkdir -p $BACKUP_DIR
# Sauvegarder tous les dépôts
for repo in $GIT_DIR/*.git; do
if [ -d "$repo" ]; then
repo_name=$(basename "$repo")
tar -czf "$BACKUP_DIR/${repo_name}_${DATE}.tar.gz" -C "$GIT_DIR" "$repo_name"
fi
done
# Nettoyer les anciennes sauvegardes (garder 30 jours)
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
echo "Sauvegarde terminée : $DATE"
Optimisation des Dépôts
#!/bin/bash
# Script : optimize-git.sh
GIT_DIR="/srv/git"
for repo in $GIT_DIR/*.git; do
if [ -d "$repo" ]; then
echo "Optimisation de $(basename $repo)..."
cd "$repo"
git gc --aggressive --prune=now
git repack -Ad
git prune
fi
done
🔧 Dépannage et Résolution de Problèmes
Problèmes Courants
Problème | Cause | Solution |
---|---|---|
Permission denied |
Mauvaises permissions | chmod -R 755 /srv/git (ou revoir l'utilisateur git) |
Repository not found |
Mauvais chemin | Vérifier l'URL du remote (git@serveur:/srv/git/mon-projet.git ) |
Push rejected |
Conflits ou non-fast-forward | git pull --rebase avant de pousser |
SSH connection timeout |
Firewall ou réseau | Vérifier les règles iptables /ufw et le service SSH |
Commandes de Diagnostic
# Vérifier l'état de Git Daemon (si utilisé)
$ sudo systemctl status git-daemon
# Tester la connexion SSH (depuis le client)
$ ssh -T git@serveur
# Vérifier les logs SSH
$ sudo journalctl -u ssh -f
$ sudo tail -f /var/log/auth.log
# Diagnostiquer un dépôt
$ cd /srv/git/mon-projet.git
$ git fsck
$ git count-objects -vH
🎉 Conclusion
Vous disposez maintenant d'un serveur Git robuste, sécurisé et prêt pour la production. Ce guide vous a permis de maîtriser tous les aspects essentiels : de l'installation à la maintenance en passant par la sécurisation.
Prochaines étapes recommandées :
- Mettre en place un monitoring avancé
- Configurer des hooks Git pour l'intégration continue
- Implémenter un système de backup cloud
- Former votre équipe aux bonnes pratiques Git
💡 Conseil d'Expert : N'hésitez pas à tester toutes ces configurations dans un environnement de développement avant de les appliquer en production. La pratique régulière et la documentation de vos procédures vous feront gagner un temps précieux.