14 de Febrero, 2013

gitweb con fastcgi y nginx

No es que sea demasiado complicado, pero es la segunda vez que monto gitweb para tener un frontal web para mis repositorios git, que no todo va a ser github, y siempre me atasco en algo. Sirva esta anotación para no volver a perder el tiempo por despistes ;).

Como mi servidor es una Debian Squeeze, la primera parte es sencilla:

# apt-get install gitweb libfcgi-perl

gitweb tiene soporte para fastcgi mediante CGI::Fast, solo que la documentación no es nada clara. Si instalamos esa dependencia no necesitaremos nada especial para usarlo con nginx (que no tiene soporte para el modo de trabajo por defecto de gitweb: CGI clásico); me enteré leyendo su código cuando ya había casi acabado mi wsgi2cgi :(.

Una vez que tenemos gitweb instalado hay que ajustar la configuración (por defecto en /etc/gitweb.conf):

# dónde se encuentran los repositorios
$projectroot = "/home/code/git";
# para el 'title' de la web
$site_name = "Mis repositorios";

El resto se puede dejar por defecto.

Lo siguiente es la configuración de nginx, añadiendo un nuevo sitio en /etc/nginx/sites-available/ y creando el enlace simbólico correspondiente en /etc/nginx/sites-enabled/.

Este tema es un poco personal, pero lo que he montado es algo así:

server {
    listen   80;

    server_name  whatever.usebox.net;
    access_log   /var/log/nginx/whatever.usebox.net.access.log;

    root         /usr/share/gitweb;

    location / {
        if (!-f $request_filename) {
            fastcgi_pass   unix://tmp/gitweb.sock;
        }
        fastcgi_index  index.cgi;
        fastcgi_param  SCRIPT_FILENAME  /usr/share/gitweb/index.cgi;
        include        fastcgi_params;
    }
}

Yo me he creado un subdominio (que no se llama whatever, claro :P), y lo único especial es:

  • La raíz de la web estará donde instala gitweb (ahí hay algunos ficheros estáticos a parte del CGI).
  • Si se intenta acceder a un fichero que existe (por ejemplo git-logo.png), se servirá; sino se pasará la petición a gitweb vía fastcgi. He usado un socket unix para fastcgi, pero se puede trabajar con TCP igualmente.
  • El índice de la web será el script de gitweb, y pasamos algunos parámetros de lo más normales (incluyendo todos los parámetros estándar que vienen en /etc/nginx/fastcgi_params).

Como digo esto va a gustos. Y lo mismo para el siguiente paso: arrancar gitweb.

Ahora mismo uso supervisord para este tipo de cosas. Creamos un fichero de configuración en /etc/supervisor/conf.d/ tal que:

[program:gitweb]
command=/usr/lib/cgi-bin/gitweb.cgi -f
environment=FCGI_SOCKET_PATH="/tmp/gitweb.sock",FCGI_LISTEN_QUEUE="20"
directory=/usr/share/gitweb/
user=www-data
autostart=true
autorestart=true
redirect_stderr=true

Podría haber creado un usuario especial para ejecutar el proceso, pero como el servicio en mi caso es privado y no va a estar expuesto al público, he usado www-data. Hay que tener cuidado al pasar las variables de entorno, poniendo entre comillas los valores si tienen caracteres alfanuméricos (se pueden poner siempre y evitamos despistes).

Si tenemos supervisor ya ejecutando, podemos recargar la configuración y lanzar gitweb con:

$ supervisorcrl reread
$ supervisorcrl update
$ supervisorcrl start gitweb

Si algo no funciona como esperamos podemos mirar los logs de supervisor (aunque gitweb es muy poco explicativo cuando hay problemas :S).

Reiniciamos nginx y con esto ya podemos visitar nuestro subdominio y acceder a la vista web para nuestros repositorios (si los permisos son correctos, pero eso ya lo dejo en manos del lector interesado :P).

Para terminar comentar que hay un tema para gitweb muy resultón, que mejora bastante el aspecto por defecto; aunque la funcionalidad es la misma (y ojo que necesitamos un gitweb a la última, y la versión de Squeeze es algo vieja).

Anotación por Juan J. Martínez, clasificada en: perl, git.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: