Un serveur git personnel

Un simple serveur git en local !

Git est un logiciel de gestion de versions décentralisé. C’est un logiciel libre et gratuit, créé en 2005 par Linus Torvalds (encore lui ! ), auteur du noyau Linux…

Nous allons mettre ici en place un serveur git pour notre réseau local… Il s’agira ici d’un serveur Debian, mais la procédure est la même pour toute distribution.

La première chose à faire est d’installer git (le serveur openssh-server doit être installé) :

apt install git

Et voilà, c’est fini ! Ou presque… A partir de maintenant, tout utilisateur de ce serveur pourra avoir des dépôts git dans son répertoire personnel qu’il pourra cloner, pusher ou puller à travers ssh.
Il suffira pour cela, au préalable, de créer les dépôts nus sur le serveur :

git init --bare nom_du_projet.git

Et ensuite, depuis son poste de travail, par exemple pour bob :

git clone bob@serveur:~/nom_du_projet.git

Mais nous allons maintenant créer un dépôt git partagé. Pour cela, nous allons créer un utilisateur git correspondant :

adduser git

Il nous suffira maintenant de copier les clefs publiques ssh des utilisateurs autorisés dans les authorized keys de l’utilisateur git pour qu’ils puissent cloner, puller ou pusher leurs dépôt git, (après avoir au préalable créé les dépôts nus)…

Et ensuite, depuis son poste de travail, par exemple pour bob :

git clone git@serveur:~/nom_du_projet.git

Mais nous allons maintenant installer une interface web pour gérer ces projets partagés…

apt install apache2 cgit

cgit est un script cgi (en C) qui permet de cloner des projets git à travers un frontend web. Il est notamment utilisé par le fameux Linus pour les sources du kernel : https://git.kernel.org/. Nous allons ici lui associer l’extension webdav de Apache pour pouvoir également faire des push et des pull via http…

a2enmod cgid dav_fs

Nous allons également devoir ajouter ajouter l’utilisateur d’Apache au groupe de git et changer son umask pour donner le droit d’écriture à ce groupe :

sudo usermod -aG git www-data
sudo sed -i 's/^#*umask [0-9]*/umask 002/' /home/git/.profile

Nous pouvons maintenant faire un lien symbolique vers notre virtual host d’Apache. Ici, nous gardons le virtual host par défaut qui se trouve dans /var/www/html :

sudo ln -s /home/git /var/www/html/

Et indiquer à cgit l’emplacement de nos dépôts : dans /etc/cgitrc

#
# cgit config
# see cgitrc(5) for details

css=/cgit-css/cgit.css
logo=/cgit-css/cgit.png

snapshots=tar.gz zip
clone-url=http://$HTTP_HOST/git/$CGIT_REPO_URL
scan-path=/var/www/html/git

Je vous renvoie à la documentation de cgit pour les explications…

Il ne nous reste plus maintenant qu’à modifier notre virtualhost : /etc/apache2/sites-available/000-default.conf

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
RedirectMatch ^/$ /cgit/

...
<Directory /var/www/html/git>
	Dav On
	Require all granted
	Options -Indexes
	AuthType basic
	AuthName "depot git"
	AuthUserFile "/etc/apache2/.htpasswd"
	<LimitExcept GET>
		Require valid-user
    	</LimitExcept>
</Directory>

Ici, nous ne permettons qu’aux utilisateurs authentifiés par htpasswd de faire des push… Je vous renvoie également à la documentation d’apache pour les explications…

Dorénavant, il ne nous restera plus qu’à créer dans le répertoire /var/www/git les dépôts et d’en avertir le serveur , par exemple :


git init --bare test.git
git update-server-info

Pour aller plus loin, on pourrait personnaliser la page d’erreur 403 quand l’utilisateur essaie d’accéder au répertoire git, et surtout sécuriser tout ça avec letsencrypt… Ou passer derrière un nginx proxy, par exemple, ce qui est mon cas, mon serveur git étant installé dans un container lxc sur mon proxmox…

N.B. On peut aussi également installer gitlab en local, qui a beaucoup plus de fonctionnalités (issues, pipelines ci-cd) mais qui est beaucoup plus lourd…

N’hésitez à vous renseigner sur ma formation Devops-Linux