Rolinh

Rolinh' release

Une Interface Web Pour Un Git Public Avec Nginx

Vous le savez certainement si vous me suivez depuis un petit moment: j’utilise nginx comme serveur web. Celui-ci comporte de nombreux avantages par rapport au mastodonte qu’est Apache, dont notamment la simplicité de la configuration. Cependant, les ressources le concernant sont moins nombreuses car le projet est relativement jeune et son utilisation n’est pas aussi importante que celle d’Apache.

Bref, une des difficulté avec nginx se trouve être ce qui concerne les script CGI. Vous allez vite comprendre pourquoi.

Je voulais rendre public et accessible via une interface web mon dépôt git contenant mes configurations de programme. Naturellement, j’ai d’abord pensé à utiliser gitweb, qui est installé avec la “suite” git. Or, celui-ci étant écrit en perl ne facilite en rien les choses… Il aurait fallu utiliser un wrapper et pas mal bidouillé afin de le faire fonctionner. Ce n’est donc pas impossible mais je ne trouvais pas cela très propre. J’ai donc cherché une alternative simple à mettre en place et c’est là que je suis tombé sur gitphp.

Enfin bon, avant de publier ses dépôts sur un site web, il est intéressant de les rendre accessible en lecture pour tout le monde. Pour cela, avec git vient git-daemon. Comme son nom l’indique, il s’agit d’un daemon et il esst justement prévu pour ça. Au préalable, il ne faut pas oublier d’ouvrir le port 9418, qui est le port utilisé par défaut et éditer le git-daemon.conf (/etc/conf.d/git-daemon.conf chez Archlinux) au préalable. Chez moi, il ressemble à ceci:

# path to git repositories served
GIT_REPO="/srv/gitosis/repositories/"
# see `man git-daemon` for all available options
# $GIT_REPO will be present twice in most configs
GIT_DAEMON_ARGS="--detach --verbose --base-path=$GIT_REPO"

Comme il l’est écrit au-dessus, un man git-daemon permet dans savoir plus sur les options. Par la suite, à moins que vous ayez choisit l’option _ —export-all_, vous allez devoir rajouter un fichier spécial dans le dépôt. Celui-ci indique à git-daemon que le dépôt doit être exporté:

cd /chemin/vers/le/depot.git
touch git-daemon-export-ok

Voilà, normalement, dès à présent, vos dépôts sont clonables en lecture-seule via un:

git clone git://monserver.org/depot.git

Reste maintenant à installer gitphp et le configurer. S’agissant d’un site en php, voilà comment simplement créer un hôte virtuel avec nginx:

# gitphp
    server {
        listen 80;
        server_name git.rolinh.ch;
        root    /srv/http/rolinh/git;
        index   index.php;  
        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
        }  
        location ~ .php$ {
            fastcgi_split_path_info ^(.+.php)(/.+)$;
            include                 fastcgi.conf;
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /srv/http/rolinh/git/$fastcgi_script_name;
            fastcgi_cache_valid any 1m;
            fastcgi_intercept_errors on;
        }
    }

Évidemment, il faut adapter à votre configuration et celle-ci est prévue pour fonctionner avec php-fpm (voir la doc Archlinux pour informations). Il est nécessaire que posix.so soit activé dans php donc si ce n’est pas fait, il faut éditer le php.ini en conséquence. Ensuite, il faut télécharger et décompresser gitphp dans le répertoire prévu (il est normalement disponible ici).

Ceci fait, il faut encore le configurer. Dans le dossier config se trouve le fichier de configuration de base que l’on peut modifier à sa guise. Toutes les options disponibles sont visible dans gitphp.conf.defaults.php. Il vous faudra au minimum les options suivantes:

/*
 * projectroot
 * Full directory on server where projects are located
 */
$gitphp_conf['projectroot'] = '/srv/gitosis/repositories/';
/*
 * exportedonly
 * When listing all projects in the project root,
 * (not specifying any projects manually or using a project list file)
 * set this to true to only allow repositories with the
 * special file git-daemon-export-ok (see the git-daemon man page)
 */
$gitphp_conf['exportedonly'] = true;

Si les dépôts ne s’affichent pas, vérifiez bien que l’utilisateur web a bien accès en lecture au dossier contenant les dépôts git.

Pour un exemple de tout ceci en action: http://git.rolinh.ch/.

NB: cet article est inspiré partiellement par celui-ci: http://blog.hokietux.net/?p=247 très bien fait qui explique comment configurer gitphp.