Héberger ses dépôts Git avec Cgit

L'application cgit est un front-end écrit en C accessible via navigateur web. Il apporte l'avantage d'avoir un dépôt lisible dont son accès est rapide et s'utilise sans base de donnée vu qu'il se contente de lire les références inclus directement dans les dépôts.


Documentation toujours en cours de rédaction…

Pré-requis

Voici la liste des paquets que nous allons avoir besoin :

apt install apache2-utils fcgiwrap git-core nginx cgit

Configuration de cgit

Commençons par copier les fichier sources :

mkdir -vp /var/www/html/cgit/
mv  /usr/share/cgit/* /var/www/html/cgit/

Nous pouvons maintenant configurer Cgit avec par exemple les paramètres suivants :

nano /etc/cgitrc
cgitrc
# see cgitrc(5) for details
 
# définition du design
css=/cgit.css
logo=/cgit.png
virtual-root=/
 
scan-path=/var/www/html/cgit/
 
root-title=My Git repositories
root-desc=Git repositories navigation
root-readme=/var/www/html/cgit/cgit-about.md
 
# Configuration d'options de base
enable-index-links=1
enable-commit-graph=1
enable-log-filecount=1
enable-log-linecount=1
side-by-side-diffs=1
 
# Je ne souhaite pas que les robots puissent indexer ce dépôt
robots=noindex, nofollow
 
# Ici, je veux indiquer une URL pour cloner le dépôt
clone-url=http://git.domaine.com/$CGIT_REPO_URL
#clone-url=http://$HTTP_HOST/$CGIT_REPO_URL
clone-prefix=http://git.domaine.com
#clone-url=http://$HTTP_HOST/git/$CGIT_REPO_URL
 
# cgit peut générer des archives à télécharger suivant vos tags
snapshots=tar.gz tar.bz2 zip
 
# Coloration syntaxique des page A propos et du visualisateur de fichiers
source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
about-filter=/usr/lib/cgit/filters/about-formatting.sh
 
# La taille des binaires affichés dans le visualisateur est limitée à 200 Ko
max-blob-size=200
 
# Gestion des mimetypes
mimetype-file=/etc/mime.types
mimetype.git=image/git
mimetype.html=text/html
mimetype.jpg=image/jpeg
mimetype.jpeg=image/jpeg
mimetype.pdf=application/pdf
mimetype.png=image/png
mimetype.svg=image/svg+xml
 
# Les fichiers readme par défaut auront les noms qui suivent
readme=:README.md
readme=:readme.md
 
# Les dépôts git peuvent implémenter leurs propres filtres
enable-filter-overrides=1
enable-index-links=1

Configuration pour Nginx

L'emplacement des dépôts et l'accès à ces derniers seront définit dans la configuration Nginx mais avant, nous copions le fichier binaire permettant la mise en forme du site :

mv /usr/lib/cgit/cgit.cgi /var/www/html/cgit.cgi

Nous définissons ensuite la configuration de Nginx :

nano /etc/nginx/sites-enabled/git.domaine.com
git.domaine.com
server {
        listen 80;
        server_name git.domaine.com;
        root /var/www/html/cgit;
 
        try_files $uri @cgit;
 
        # Si un client utilise les commandes git alors :
        location ~ ^.*/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
                satisfy any;
 
                # On autorise les accès au dépôts aux utilisateur définit dans le fichier htpasswd :
                auth_basic "Restricted";
                auth_basic_user_file /etc/nginx/htpasswd;
 
                # On définit les paramètres pour interagir avec les dépôts :
                fastcgi_pass  unix:/run/fcgiwrap.socket;
                fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
                fastcgi_param PATH_INFO         $uri;
                fastcgi_param GIT_PROJECT_ROOT  /var/www/html/cgit/;
                fastcgi_param GIT_HTTP_EXPORT_ALL "";
                fastcgi_param REMOTE_USER $remote_user;
                include fastcgi_params;
        }
 
        # Liste de paramètres pour interagir avec le script cgi :
        location @cgit {
 
                include             fastcgi_params;
                index               cgit.cgi;
 
#                fastcgi_param       SCRIPT_FILENAME $document_root/cgit.cgi;
                fastcgi_param       SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
                fastcgi_param       PATH_INFO       $uri;
                fastcgi_param       QUERY_STRING    $args;
                fastcgi_param       HTTP_HOST       $server_name;
                fastcgi_pass        unix:/run/fcgiwrap.socket;
        }
 
        # Enregistrement des accès :
        access_log /var/log/nginx/access.git.domaine.com.log;
        error_log /var/log/nginx/error.domaine.com.log;
 
}

Nous définissons les accès à l'utilisateur présent sur la machine hôte :

adduser toto
htpasswd -c /etc/nginx/htpasswd toto

Définir un dépôt git

Il suffit de quelques simple commandes pour rendre le tout fonctionnel :

git init /var/www/html/mon-depot

Pour éviter l'erreur indiquant qu'il n'est pas possible de pousser les références, il faut alors se rendre dans le dépôt et executer la commande suivante :

cd /var/www/html/mon-depot/
git config receive.denyCurrentBranch ignore

Pour en savoir plus, je vous invite à lire cette page : https://stackoverflow.com/questions/3221859/cannot-push-into-git-repository

Création automatique

Voici un script qui demande le nom du dépôt ainsi qu'une description pour le futur projet.

#!/bin/bash
 
if [ "$USER" == "www-data" ];
then
 
echo "Quel sera le nom du dépôt : "
read rep
echo "Courte description du depot : "
read des
 
mkdir /mnt/www/cgit/$rep.git
cd /mnt/www/cgit/$rep.git
git --bare init
echo "[receive]"  >> config
echo "        denyCurrentBranch = ignore"  >> config
echo $des > description
 
echo "Pour info: l'utilisateur permettant de cloner le depot est fusing."
echo "pour cloner ce nouveau dépot : git clone http://git.bruno-tatu.com/$rep.git"
echo "Puis faire un push pour qu'il puisse apparaitre dans le dépot en ligne."
 
else
 
echo "Uniquement l'utilisateur www-data peut creer des depots."
 
fi

L’exécuter ainsi :

sudo -u www-data ./creer_nouveau_depot.sh