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 delCGI
). - Si se intenta acceder a un fichero que existe (por ejemplo
git-logo.png
), se servirá; sino se pasará la petición agitweb
víafastcgi
. He usado un socketunix
parafastcgi
, pero se puede trabajar conTCP
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).
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.