Configuración de servidor SVN en CentOS 6

En Ktaris hemos trabajado durante bastante tiempo con Assembla para mantener los repositorios del código desarrollado. Sin embargo, la única característica que explotamos es esa, el repositorio. Todos los demás servicios, como asignación de tareas, compartición de archivos, y seguimiento de tiempo, lo realizamos mediante otras aplicaciones como RedBooth y Toggl.

Como tal, ¿por qué no configurar nuestro propio servidor en Digital Ocean para almacenar tantos repositorios como deseemos? Esta entrada, basada en el contenido de If Not True Then False, es el resultado de esos experimentos.

Paso 1. Instalación de SVN y el módulo de Apache

Lo primero es instalar subversion, la herramienta encargada de los repositorios, y el módulo de Apache para lidiar con ellos. En caso de no tener Apache aún instalado, puedes revisar esta entrada. Para instalar, ejecutar:

sudo yum install mod_dav_svn subversion

Paso 2. Configurar Subversion

Ahora que ya está instalado, es necesario configurar el acceso (no queremos dejar nuestro código expuesto ante cualquier mirada curiosa). Así que es necesario abrir el archivo /etc/httpd/conf.d/subversion.conf y añadir lo siguiente:

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
 
<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn
   AuthType Basic
   AuthName "Repositorios de Subversion"
   AuthUserFile /etc/svn-auth-users
   Require valid-user
</Location>

Paso 3. Añadir usuarios a SVN

En el paso 2 dimos acceso solamente a usuarios registrados, pero de momento no existe ninguno. Para permitir el acceso se necesita ejecutar el siguiente comando:

# El argumento "-c" se utiliza la primera vez para crear el archivo
sudo htpasswd -cm /etc/svn-auth-users prueba1
# Para usuarios subsecuentes, utilizar "-m" solamente:
sudo htpasswd -m /etc/svn-auth-users prueba2

Paso 4. Crear el directorio para los repositorios

Tal y como se definió en el paso 2, debemos crear el directorio especificado en SVNParentPath, mismo que alojará los repositorios:

# Crear directorio para svn.
sudo mkdir /var/www/svn
# Cambiar a ese directorio para inicio de pruebas.
cd /var/www/svn

Paso 5. Creación de repositorio de prueba

Ya en el directorio de /var/www/svn, creamos un nuevo repositorio para demostrar su funcionamiento:

# Creación de nuevo repositorio.
sudo svnadmin create repo-prueba
# Cambio de usuario y grupo para tener permisos de lectura/escritura.
sudo chown -R apache:apache repo-prueba

Para reflejar los cambios hasta ahora del servidor, reiniciamos Apache:

service httpd restart

Tras esto, podrás observar el repositorio (o al menos la pantalla que te pedirá que inicies sesión) en el navegador, visitando http://ip.ip.ip.ip/svn, como se muestra en la figura 1.

Figura 1: Petición de credenciales por parte de SVN.

Figura 1: Petición de credenciales por parte de SVN.

Paso 6. Configuración del repositorio

Esta configuración se realiza con el objetivo de mejorar la seguridad, al deshabilitar el acceso a anónimos y requerir usuarios registrados. Para ello, editar repo-prueba/conf/svnserve.conf:

# Deshabilitar el acceso a usuarios anónimos:
anon-access = none
# Habilitar el control de acceso:
authz-db = authz

Paso 7. Plantilla de directorios

Todo directorio de SVN, al menos hasta donde tengo memoria, tiene tres carpetas: trunk (todo el código más reciente), branches (bifurcaciones en el camino para diversas necesidades), y tags (software estable). Así que es necesario crear tales carpetas iniciales dentro del repositorio:

# Creación de todos los directorios:
sudo mkdir -p /tmp/svn-structure-template/{trunk,branches,tags}
# Importando los directorios para un 'commit' inicial:
svn import -m 'Importación inicial' /tmp/svn-structure-template/ http://localhost/svn/repo-prueba/

Tras la importación (para la cual te pide credenciales), podrás ver lo siguiente en el navegador:

Figura 2: Archivos presentes en el repositorio.

Figura 2: Archivos presentes en el repositorio.

Paso 8 (Opcional). Configurar SVN como host virtual

Puedes leer la guía sobre cómo configurar hosts virtuales en CentOS 6.5 y proceder a declarar uno nuevo:

# Host virtual 3: Para SVN
<VirtualHost *:80>
    ServerAdmin [email protected] ejemplo3.com
    DocumentRoot /var/www/svn
    ServerName ejemplo3.com
</VirtualHost>

Y descubrir que no sirve. Para que SVN sirva como host virtual, hacen falta algunas líneas, como lo explica Schwuk:

# Host virtual 3: Para SVN
<VirtualHost *:80>
    ServerAdmin [email protected] ejemplo3.com
#    DocumentRoot /var/www/svn
    ServerName ejemplo3.com
    <Location />
        DAV svn
        SVNParentPath /var/www/svn
        AuthType Basic
        AuthName "Repositorios de Subversion"
        AuthUserFile /etc/svn-auth-users
        Require valid-user
    </Location>
</VirtualHost>

Finalmente, reiniciamos y disfrutamos de SVN desde un host virtual:

service httpd restart

Si lo deseas, puedes eliminar la configuración del paso 2 (todo lo que está entre las etiquetas de <Location>) para utilizar solamente el host virtual como punto de acceso.

Un error de recursividad

Si al intentar clonar el repositorio de tu servidor a otra computadora recibes un error como,

Error: Redirect cycle detected for URL 'domain/svn'

esto se debe a que los parámetros DocumentRoot y SVNParentPath son idénticos. Lo que se debe hacer es que apunten a diversas ubicaciones, o bien, no proveer ningún directorio en especial para DocumentRoot (motivo por el cual aparece comentado arriba). La solución fue encontrada en Stack Overflow.

Colofón

En esta entrada las cosas se van complicando un poco, ya hablamos de configuración de diversos archivos, repositorios, y cosas que van incrementando un poco el nivel. Sin embargo, ahora podemos tener un servidor propio para almacenar tantos repositorios nos quepan en 20GB por solamente $5 USD al mes gracias a Digital Ocean.



Deja un comentario