Cet article a pour but de vous montrer comment mettre en place rapidement et simplement un serveur Git sous Apache, avec un ou plusieurs dépôts, et une authentification par identifiant/mot de passe.
Démarrage
Nous partirons du principe que vous avec un Linux moderne (j’utilise Debian, mais la démarche devrait être similaire sur n’importe quelle autre distribution).
Installez tout d’abord les paquets nécessaires :
1 |
$ apt-get install git-core apache2 |
Vérifiez ensuite que git est installé :
1 2 |
$ git --version git version 1.5.6.5 |
Si vous obtenez une sortie similaire, c’est que Git est bien installé.
Création du dépôt
Nous allons commencer par attribuer un répertoire à nos futurs dépôts Git. J’ai personnellement choisi “/home/git
” mais libre à vous de choisir autre chose. Notez simplement ce chemin, car nous allons y faire référence quelques fois dans les prochaines étapes.
Tapez les commandes suivantes :
1 2 |
$ mkdir -p /home/git/repositories $ chown -R www-data: /home/git |
Où www-data
est le nom du user sous lequel tourne le démon apache.
Nous placerons tous les dépôts Git dans le répertoire /home/git/repositories
. Dans notre exemple, nous créons un dépôt nommé “depot.git
” :
1 2 3 4 5 |
$ cd /home/git/repositories $ mkdir depot.git $ cd depot.git $ git init --bare $ git update-server-info |
La commande “git init --bare
” créé un dépôt Git “bare”, c’est à dire un dépôt qui ne possède pas de copie de travail : c’est un dépôt de “stockage” uniquement; vous n’y ferez jamais de commit mais seulement des “push” ou des “pull”.
La commande “git update-server-info
” met à jour les données du serveur dans le dépôt, pour lui permettre d’être accédé à distance.
Vous devrez répéter cette dernière étape pour chaque dépôt que vous souhaiterez créer. Notez que vous pouvez également créer une arborescence de répertoires pour organiser plus finement les dépôts.
Paramétrage d’Apache
Nous devons ensuite informer Apache de la présence de nos dépôts Git. Pour ce faire, nous créons un fichier nommé “git
” dans le répertoire “/etc/apache2/sites-available
” qui contient les paramètres suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Alias /git/ "/home/git/repositories/" <Directory /home/git/repositories> DAV on Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all AuthType Basic AuthName "Git" AuthUserFile /home/git/passwd Require valid-user </Directory> |
Nous définissons une authentification de type “identifiant/mot de passe” mais libre à vous de choisir une autre méthode d’authentification.
Nous supposons ici que le serveur apache possède déjà au moins un “virtual host”. Si vous souhaitez par exemple limiter l’accès à un “virtual host” en particulier (utile dans le cas où l’on souhaite forcer le passage en HTTPS
par exemple), il suffit d’imbriquer le code ci-dessus dans la déclaration de ce “virtual host”.
Lorsqu’une personne tentera d’accéder au sous répertoire “/git/
” de notre serveur web, elle devra saisir un identifiant et un mot de passe ayant été renseigné dans le fichier “/home/git/passwd
“.
Créons maintenant ce fichier grâce à la commande suivante :
1 |
$ htpasswd -c /home/git/passwd <login utilisateur> |
Le programme vous invite à saisir un mot de passe pour votre utilisateur. Créez autant d’utilisateurs que vous le souhaitez à l’aide de la même commande (omettez le paramètre “-c
” lors des fois suivantes).
Vérifiez que l’utilisateur www-data
ait accès à ce fichier, uniquement en lecture.
Vous n’avez plus qu’à activer le site, les modules dav
et dav_fs
puis à redémarrer apache pour mettre en ligne le dépôt :
1 2 3 4 |
$ a2ensite git $ a2enmod dav $ a2enmod dav_fs $ /etc/init.d/apache2 restart |
Le dépôt devrait désormais, être accessible.
Un petit test pour la route
Testons l’accès au dépôt depuis un autre poste sur le réseau. Vous pouvez bien évidemment utiliser un poste Windows ou Linux, graphique ou en ligne de commande.
Pour la simplicité de l’exemple (et parce que j’adore ça), nous utiliserons la ligne de commande :
1 |
$ git clone http://notre_serveur/git/depot.git |
Cette commande devrait réussir et créer un répertoire nommé “depot
” dans le répertoire courant.
Ignorez l’avertissement qui dit que le dépôt est vide : cela est tout à fait normal.
Remarque : si vous avez choisi d’héberger votre dépôt en HTTPS, git refusera peut-être de s’y connecter si votre certificat n’est pas signé par une autorité de certification reconnue. Vous pouvez définir la variable d’environnement “GIT_SSL_NO_VERIFY=1
” pour ignorer l’erreur temporairement. Ne vous servez évidemment pas de cette variable comme solution à long terme !
Conclusion
La mise en place d’un serveur Git accessible sous Apache est donc plutôt simple. Notre configuration ici est minimale et pourrait encore être améliorée, notamment en permettant une affectation des droits plus précise pour les différents dépôts au sein d’Apache.
Vos recherches sur l’Internet vous auront peut-être conduit à d’autres solutions, utilisant gitosis ou encore ssh. Ces approches proposent d’autres modes d’authentification (par certificat ou en ssh avec un compte sur le système) qui peuvent être très intéressantes mais je n’ai personnellement pas réussi à les faire fonctionner correctement pour l’instant. Si vous avez des ressources à partager à ce sujet, n’hésitez pas à me les transmettre
J’espère en tout cas que cet article vous aura été utile, et comme d’habitude, n’hésitez pas à me faire part de vos commentaires !
Merci pour ce post Julien.
J’ai bien suivit tes instructions qui me semblent logiques mais j’ai eu plusieurs problèmes concernant le push sur le serveur qui ne voulaient pas s’effectuer, et même les clones de gros dépots rapatriés à partir de nos dépots SVN existants qui s’arrêtent au beau milieu. La faute à WebDAV, si ce n’est à un manque de configuration de celui-ci de ma part. Ne trouvant pas trop d’infos je suis reparti sur gitosis, ssh de base pour le traitement git et gitweb pour l’affichage web.
Un bon tuto qui m’a permit de faire fonctionner le tout sans complication :
http://ao2.it/wiki/How_to_setup_a_GIT_server_with_gitosis_and_gitweb
C’est vrai que sous certaines distributions, curl n’est pas compilé avec le support CURL_MULTI et le push est désactivé. Dans ces cas là, il faut hélas recompiler curl à la main et souvent aussi recompiler git pour qu’il utilise la bonne version de curl.
Il me semble avoir lu que l’utilisation de gitosis était effectivement conseillée car plus rapide et plus efficace. Merci pour le lien en tout cas, je vais définitivement y jeter un oeil.
J’ai aussi cette configuration sur mon serveur, cependant git protocol over ssh est vraiment à préférer, car c’est véritablement plus rapide.
Il est cependant possible d’avoir un serveur git via http qui soit quasiment aussi rapide que le protocole git sur ssh: http://progit.org/2010/03/04/smart-http.html
Le problème lorsqu’on utilise git over http avec WebDav c’est que le client doit fetcher tout le repository lorsqu’il s’agit de faire des actions, parce que cela ne transmet pas intelligement juste ce qu’il faut, mais que le client doit faire des tonnes de requêtes pour tout vérifier. Smart http en revanche lui est aussi intelligent (ou presque) que le protocole git.
Pour ma part mon serveur perso est en http normal mais pour l’entreprise dans laquelle je travaille nous avons plusieurs possibilités dont le smart http pour les serveurs d’évaluations de git.
Gitolite est très conseillé de plus il fournit des fonctionnalités que git ne propose pas par défaut comme des restrictions très pointues sur tel ou tel fichier. Je travaille sur une fonctionnalité de lock qui se base dessus.
Merci beaucoup pour ces remarques et pour le lien. C’est très intéressant. Je vais y jeter un oeil plus approfondi ce week-end !
Cette méthode permet de créer des dépots mais ne semble pas permettre de pusher… Est-ce exact ? ou est-ce un bug uniquement chez moi ?
En effet, je suis depuis passé à Gitolite (voire un autre commentaire de ce post, plus haut) qui est vraiment plus efficace et agréable à mettre en place.
J’ai eu le même problème. j’ai recompilé, impeccable !
c’est vraiment très rapide.