Subversion + Trac + DAV-SVN + LDAP….. en Debian 6 Squeeze

Recientemente me ha tocado realizar una instalación de un servidor destinado a bugtracking y control de versiones con múltiples proyectos (muchos) y agrupados en un árbol bastante extenso, esto es, se trata de una instalación un tanto atípica ya que, la mayoría de howto’s que he encontrado, sólo hacen la parte básica y me gustaria ir un poco más allá añadiendo unos cuantos detalles que seguro que a más de uno le sirve.

Para ello, me he decantado por mi preferida, Debian y su flamante nueva versión 6.0 (Squeeze), con los servicios de Subversion, Trac, acceso mediante DAV -SVN) , WebSVN, autentificación LDAP y un poco de restyling para los directorios de los repositorios de Subversion.

Empezamos…

Partiendo de la base con una Debian 6.0 netinst recién instalada, he creado una nueva partición para nuestros repositorios de subversion y los entornos de trac bajo /srv/desarrollo/

Una vez hecho esto pasamos a instalar los paquetes necesarios:

apt-get install subversion trac libapache2-svn libapache2-mod-python
mkdir -p /srv/desarrollo/trac /srv/desarrollo/svn

Ahora creamos el árbol para los repositorios de subversion,:

mkdir -p /srv/desarrollo/svn/proyectos_1/proyecto_A1 \
/srv/desarrollo/svn/proyectos_1/proyecto_B1 \
/srv/desarrollo/svn/proyectos_2/proyecto_A2 \
/srv/desarrollo/svn/proyectos_2/proyecto_B2

svnadmin create /srv/desarrollo/svn/proyectos_A/proyecto_A1 --fs-type fsfs
svnadmin create /srv/desarrollo/svn/proyectos_A/proyecto_A2 --fs-type fsfs
svnadmin create /srv/desarrollo/svn/proyectos_B/proyecto_B1 --fs-type fsfs
svnadmin create /srv/desarrollo/svn/proyectos_B/proyecto_B2 --fs-type fsfs
chown -R www-data:www-data /srv/desarrollo/svn

Con esto hemos creado 4 proyectos en dos árboles diferentes. Se podrían crear todos en el mismo árbol pero para una mejor organización, los ubicamos así.

La creación de los entornos de Trac es bastante sencilla y solo basta con ejecutar lo siguiente:

mkdir /srv/desarrollo/trac/proyecto_A1
trac-admin /srv/desarrollo/trac/proyecto_A1 initenv
chown www-data:www-data -R /srv/desarrollo/trac/proyecto_A1

En el asistente le indicamos el nombre del proyecto, la ruta al repositorio de subversion y lo demás por defecto.

La asignación de permisos sobre cada entorno también es sencilla:

# Creamos el grupo admins y le asignamos el rol de TRAC_ADMIN
trac-admin /srv/desarrollo/trac/proyecto_A1 permission add admins TRAC_ADMIN
# Unimos al usuario admin al grupo admins
trac-admin /srv/desarrollo/trac/proyecto_A1 permission add admin admins

Ahora viene la parte tortuosa del asunto, la configuración de Apache. En primer lugar tenemos que decidir si vamos a crear un nuevo VirtualHost o agregamos la configuración al que viene por defecto. A mí personalmente me gusta separar cada entorno por lo que he optado por crear uno nuevo, así al servir varios portales no tenemos problemas de que se solapen las configuraciones.

Ahora vamos a crear el archivo de configuración en /etc(apache2/sites-available/001-svntrac:

<VirtualHost *:80>
# Nombre del VirtualHost
 ServerName svntrac.cygnux.org
 ServerAdmin webmaster@cygnux.org

# Raíz del VirtualHost
 DocumentRoot /srv/desarrollo

 ErrorLog ${APACHE_LOG_DIR}/svntrac-error.log
 LogLevel warn
 CustomLog ${APACHE_LOG_DIR}/svntrac-access.log combined

 <Directory />
  Options +Indexes +FollowSymLinks
  AllowOverride All
  DirectoryIndex index.php index.html
 </Directory>

# Allias para acceso a WebSVN
 Alias /websvn /usr/share/websvn
...

Con esto definimos el VirtualHost, las opciones de logging, los permisos sobre el directorio raíz y el alias para WebSVN (tenemos que comentar dicho alias del archivo /etc/apache2/conf.d/websvn)

Pasamos a definir la autentificación mixta (LDAP y htpasswd):

...
# Autentificación sólo a subniveles de /
 <LocationMatch "/.+/">
  Order deny,allow
  Deny from all

  AuthBasicProvider ldap file
  AuthType Basic
  AuthName "Acceso Repositorios Subversion"
  AuthLDAPURL ldap://ldap.cygnux.org/OU=USUARIOS,DC=CYGNUX,DC=ORG?uid?sub?(objectClass=inetOrgPerson)
  AuthzLDAPAuthoritative off
  AuthLDAPBindDN "CN=proxyuser,DC=CYGNUX,DC=ORG"
  AuthLDAPBindPassword clave_secreta
  AuthUserFile /usr/local/etc/apache/svn.htpasswd
  Satisfy any
  Require valid-user
 </LocationMatch>

# No autentificamos el acceso a /autoindex
 <Location "/autoindex">
  Options +FollowSymLinks +Indexes
  order allow,deny
  Allow from all
 </Location>
...

Con esto definimos la autentificación para todos los niveles que estén por debajo de http://svntrac.cygnux.org/, es decir, para el nivel raíz no la pide pero sí para /svn o /trac También excluimos el nivel /autoindex de la autentificación, que más adelante lo veremos…

La parte de LDAP indica que sólo autentificará a aquellos usuarios que estén dentro de la OU=USUARIOS mediante el usuario de conexión proxyuser y su clave_secreta.

Para la autentificación mediante archivo utilizamos el archivo /usr/local/etc/apache/svn.htpasswd, que se crea así:

mkdir -p /usr/local/etc/apache/
htpasswd -c /usr/local/etc/apache/svn.htpasswd nombre_usuario

A continuación definimos la configuración para los entornos de trac y subversion:

...
# Entornos de Trac
 <Location /trac>
  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /srv/desarrollo/trac
  PythonOption TracUriRoot /trac
 </Location>

# Repositorios de Subversion
 <Location /svnrepo/proyectos_1>
  DAV svn
  SVNListParentPath on
  SVNParentPath /srv/desarrollo/svn/proyectos_1
 </Location>

 <Location /svnrepo/proyectos_2>
  DAV svn
  SVNListParentPath on
  SVNParentPath /srv/desarrollo/svn/proyectos_2
 </Location>
</VirtualHost>

El módulo dav-svn con la opción SVNListParentPath, crea un listado de los repositorios que contiene la ubicación SVNParentPath.

Si habéis observado bien, la localización /svn la he cambiado por /svnrepo, esto es porque no es posible hacer un autoindex del directorio /svn con el módulo dav-svn activado, ya que al tratar de acceder a los repositorios con un cliente de Subversion, da el error "301 Moved Permanently" (vaya dolores de cabeza que me ha dado el….). Si optáis por no hacer el autoindex (lo veo de gran utilidad cuando hay muchos repositorios en varios niveles), lo podéis dejar con /svn.

Es hora de instalar WebSVN…

apt-get install websvn

En el proceso de instalación nos pedirá la versión de apache a configurar, la ruta a la raíz de los repositorios (…svn/proyectos_1 y …svn/proyectos_2) separados por comas y la ruta a repositorios individuales (NO INDICAR). Para editar los repositorios basta con modificar el archivo /etc/websvn/svn_deb_conf.inc

Por último descomprimimos este zip en /srv/desarrollo y movemos el archivo .htaccess a /srv/desarrollo/svn

Ahora nos toca activar los módulos de Apache y reiniciarlo:

a2enmod dav_svn authnz_ldap
service apache2 restart

Con todo esto, y si todo ha ido bien,  ya tenemos listo nuestro entorno TRAC-SVN en la siguiente URL: http://svntrac.cygnux.org/

Recuerda: para el acceso con un cliente de Subversion es necesario cambiar /svn por /svnrepo….

4 pensamientos en “Subversion + Trac + DAV-SVN + LDAP….. en Debian 6 Squeeze

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Imagen CAPTCHA

*