En esta entrada vamos a montar un servidor para la gestión de proyectos. Para ello utilizaremos un sistema de control de versiones (Subversion), un sistema de gestión de incidencias (Trac) y un sistema de autenticación compartido, para ello utilizaremos Apache y alguno de sus métodos de autenticación como por ejemplo LDAP (válido si es necesario utilizar las cuentas de un Directorio Activo).

Aunque existen soluciones más elaboradas y más integradas, como el software de SourceForge.net, este planteamiento permite montar un servidor a medida, pudiendo alterar cualquiera de sus elementos, y en mi opinión más sencillo de mantener.

Nos basaremos en una instalación mínima de Ubuntu Server 8.04 (por lo que no disponemos ni de Subversion 1.5 ni de Trac 0.11) con la idea de montar un servidor preparado para mantener varios proyectos.

Instalación y configuración de Subversion

Para empezar instalaremos subversion, también es recomendable subversion-tools por los scripts adicionales que incorpora, y preparamos un repositorio de prueba:

# apt-get install subversion subversion-tools
# mkdir /srv/svn
# svnadmin create /srv/svn/proyecto

Aprovechamos ahora para crear una estructura básica dentro del repositorio, esto nos servirá en las pruebas para ver si realmente podemos acceder al repositorio:

# svn co file:///srv/svn/proyecto
# svn mkdir proyecto/{branches,tags,trunk}
# svn ci -m 'Estructura Inicial' proyecto

Instalación y configuración de Trac

Instalaremos y configuraremos mínimamente un proyecto de Trac para el repositorio que acabamos de crear:

# apt-get install trac
# mkdir /srv/trac
# trac-admin /srv/trac/proyecto initenv
(Opciones sugeridas)
Path to repository [/path/to/repos]> /srv/svn/proyecto

Es el momento de comprobar que trac y su unión con el repositorio de subversion funcionan correctamente, para ello lanzaremos el servidor incluido en trac:

# tracd -p 80 /srv/trac/proyecto

Abriendo la URL http://localhost:80/ deberíamos ver disponible nuestro proyecto, “My Project”, y comprobamos que la función de “Browse Source” funciona correctamente.

Por el momento nada nuevo, paremos tracd y sigamos.

Instalación y configuración de Apache

Optamos por enganchar Trac con mod_python así que lo más sencillo es instalar el paquete de mod_python y que instale apache por sus dependencias:

# apt-get install libapache2-mod-python

Bien, ahora editamos la configuración para que Apache pase las peticiones que vayan a /trac a nuestro conjunto de proyectos en /srv/trac. Editando el fichero /etc/apache2/sites-available/default añadimos antes del cierre de </VirtualHost> lo siguiente:

<Location /trac>
  SetHandler mod_python
  PythonInterpreter main_interpreter
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /srv/trac
  PythonOption TracUriRoot /trac
</Location>

Forzamos la recarga de la configuración de Apache:

# /etc/init.d/apache2 reload

Hacemos una prueba con el navegador en http://localhost/trac/ que debería mostrarnos un error por falta de permisos de escritura. Como vamos a dejar a Apache como gestor de los proyectos es necesario darle los permisos que necesita:

# chown -R www-data.www-data /srv/trac/proyecto

Con esto todo debería funcionar exactamente igual que con la prueba realizada con tracd. Vamos ahora a mostrar el repositorio desde Apache.

Subversion trabaja con Apache haciendo uso de WebDAV así que instalamos el módulo necesario:

# apt-get install libapache2-svn

Añadimos la configuración necesaria en el fichero /etc/apache2/mods-available/dav_svn.conf, podéis descomentar las opciones si os resulta más cómodo. En cualquier caso la configuración debe quedar de la siguiente manera:

<Location /svn>
  DAV svn
  SVNParentPath /srv/svn
</Location>

De nuevo, forzamos la recarga de la configuración de Apache y comprobamos que http://localhost/svn/proyecto muestra el proyecto y que podemos navegar dentro de él. Si probáis http://localhost/svn/ os dará un error, ya que en este caso no existe un listado de proyectos disponibles como hacía Trac.

Igualmente que en Trac, si Apache es el gestor del repositorio es necesario que tenga permisos de escritura. En este caso vamos a ceder completamente el control a Apache:

# chown -R www-data.www-data /srv/svn/proyecto

Ahora mismo disponemos de un sistema completamente funcional en el que no se exige ningún tipo de autenticación. En el caso de Trac no se puede hacer login y en el caso de Subversion ni siquiera se pide. Si queréis verlo en podéis hacer la siguiente prueba:

~~

svn co http://localhost/svn/proyecto/trunk

touch trunk/README.txt

svn add trunk/README.txt

svn ci -m “Fichero leame” trunk


Si comprobamos el historial, *svn log trunk/README.txt*, podremos ver
que no hay ningún usuario responsable del commit. En ningún momento se
nos ha pedido identificarnos, ya que hay permisos de lectura y escritura
para todo el mundo, así que podemos bajarnos el contenido del
repositorio y los commit son anónimos.

Autenticando usuarios
---------------------

Empecemos con lo más sencillo, usuarios válidos de un fichero htpasswd,
podéis leer algo más en otro de mis artículos sobre [ficheros
.htpasswd](http://chernando.eu/doc/apache/).

~~
# htpasswd -c /etc/apache2/users.conf chernando

Editamos Trac para soportar un login centralizado añadiendo un nuevo location a default:

<Location /trac/*/login>
  AuthType Basic
  AuthName "Trac Projects"
  AuthUserFile /etc/apache2/users.conf
  Require valid-user
</Location>

Forzando la recarga de Apache ya disponemos de la función “login” en Trac. Para el repositorio vamos a dejar el acceso de lectura para todo el mundo y limitar el acceso de escritura a los usuarios registrados añadiendo a la configuración de WebDAV:

AuthType Basic AuthName "Subversion Repository"
AuthUserFile /etc/apache2/users.conf
<LimitExcept GET PROPFIND OPTIONS REPORT>
  Require valid-user
</LimitExcept>

Una vez más recargando Apache ahora podemos bajar y actualizar un repositorio pero necesitaremos identificarnos para subir cambios al repositorio. Probad a añadir un nuevo fichero y comprobaréis que ahora se exige un usuario y password válidos.

Rizando el rizo, autenticando contra un LDAP

En el caso de disponer de un sistema de autenticación centralizada, por ejemplo LDAP o un Directorio Activo con el servicio LDAP activo, podemos delegar toda la carga de la gestión de usuarios dejando nuestro servidor de proyectos completamente “inhabitado”.

Para ello lo único que necesitamos es cambiar ambas configuraciones. En primer lugar habilitamos los módulos necesarios:

# a2enmod authnz_ldap
(esto debería habilitar el módulo ldap por dependencias)

Y configuramos ambas secciones de autenticación. Primero eliminamos AuthUserFile que ya no es necesaria y después añadimos:

AuthBasicProvider "ldap"
AuthLDAPURL "ldap://127.0.0.1/dc=chernando,dc=eu?uid?sub?(objectClass=inetOrgPerson)"
authzldapauthoritative Off

Podéis ver más detalles en http://trac.edgewall.org/wiki/TracModPython_.

Ampliaciones que pueden hacerse a partir de aquí

En esta entrada he intentado introducir el menor ruido posible, tanto en comandos como software a instalar, por lo que hay ciertas mejoras que se han quedado en el tintero. Por ejemplo:

  • Configurar Apache para hacer uso de SSL, muy necesario ya que hasta el momento todas las negociaciones con Apache van en texto claro.
  • Establecer limitaciones en el acceso de los repositorios (y en secciones de los mismos) haciendo uso de authz.
  • Configurar un sistema de correo, que permita notificar todo tipo de eventos: nuevos tickets, cambios en el repositorio…
  • Integrar Subversion con Trac, por ejemplo permitir que un commit cierre o añada información a un ticket de Trac.
  • Utilizar la última versión de Subversion, 1.5, por su mejora en la gestión de merge de ramas.
  • Utilizar la última versión de Trac, 0.11, por las mejoras en el interfaz y en la gestión del flujo de trabajo asociado a un ticket.
  • Ampliar el sistema incluyendo otros servicios: listas de correo, servidor de integración continua…