SUBVERSION + APACHE2 + SSL + INTERFACE WEB (websvn)

1. Introducción
2. Apache2/SSL
3. Subversion
3.1 Creando un repositorio
3.2. Configurar Apache
3.3. Dar de alta algunos usuarios
4. Interface web
5. Probando el servidor de control de versiones

1. Introducción

En este documento, describiré brevemente el proceso para configurar un
servidor de versiones con Apache2 y SSL activado sobre Debian GNU/Linux.

Nota: si desean profundizar en el tema de SSL, pueden visitar los estos
enlaces:

http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html
http://www.securityfocus.com/infocus/1818
http://www.eclectica.ca/howto/ssl-cert-howto.php
http://www.debian-administration.org/article/Setting_up_an_SSL_server_wi...

Documentación oficial subversion:
http://svnbook.red-bean.com/index.es.html

2. Apache2/SSL

El primer paso es instalar los paquetes necesarios, en este caso necesitaremos instalar apache2 y, si no lo tenemos instalado aún, también instalamos openssl

#aptitude install apache2 openssl

Ahora debemos ejecutar los siguientes comandos para generar el certificado:

#mkdir /etc/apache2/ssl
#RANDFILE=/dev/random openssl req $@ -new -x509 -days 365 -nodes \
    -out /etc/apache2/ssl/apache.pem \
    -keyout /etc/apache2/ssl/apache.pem

#chmod 600 /etc/apache2/ssl/apache.pem

Realicemos una copia de '/etc/apache2/sites-available/default' y lo nombramos svn, por ejemplo.

#cd /etc/apache2/sites-available/
#cp default svn

Activamos el nuevo sitio. Esto lo hacemos realizando un "sym-link" a la configuración de etc/apache2/sites-enabled/. El comando que nos brinda apache para realizar esto, es:

#a2ensite svn

Para activar el módulo ssl, hacemos:

#a2enmod ssl

Ahora debemos agregar la línea "Listen 443" al archivo de configuración /etc/apache2/ports.conf

Editamos /etc/apache2/sites-available/svn (o como sea que hayamos nombrado el nuevo archivo del sitio ssl) y cambiamos el puerto 80 en el nombre del sitio por 443. También debemos cambiar la configuración del virtual host, agregando las lineas:

"SSLEngine On" y "SSLCertificateFile /etc/apache2/ssl/apache.pem"
LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
LoadModule dav_svn_module /usr/lib/apache2/modules/mod_dav_svn.so
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

El archivo debería quedar mas o menos así:

NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
LoadModule dav_svn_module /usr/lib/apache2/modules/mod_dav_svn.so
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

...

</VirtualHost>

Reiniciamos el servicio apache2, ya debería estar funcionando https

#/etc/init.d/apache2 restart

o

#apache2ctl restart

Accesa a https://localhost/

3. Subversion

Instalamos los paquetes necesarios:

#aptitude install subversion libapache2-svn subversion-tools

Listo, así de fácil ya tenemos instalado nuestro servidor de control de versiones

3.1 Creando un repositorio

Estando como root, realizamos lo siguiente:

#cd /home/
#mkdir svn
#chown www-data:www-data svn

Con esto, lo que hicimos fue crear un directorio para nuestros repositorios de subversion (svn); necesitamos de Apache para poder leer y escribir en estos directorios por lo que dimos los permisos al usuario www-data (es el estándar en Debian).

Ahora debemos crear un directorio dentro de svn, el cual será el encargado de almacenar el repositorio "de prueba" en este caso.

#su www-data -c "svnadmin create svn/prueba"

o lo que es lo mismo

#cd svn
#su www-data
#mkdir prueba
#cd prueba
#svnadmin create prueba

Con esto ya tendríamos nuestro primer repositorio llamado "prueba".

3.2 Configurar Apache

Nos logeamos como root y añadimos las siguientes líneas al archivo /etc/apache2/sites-available/svn dentro de la declaración de VirtualHost

<Location /svn/src>
   DAV svn
   SVNPath /home/svn/src
   AuthType Basic
   AuthName "My Subversion Repository"
   AuthUserFile /home/svn/.dav_svn.passwd
   Require valid-user
</Location>

Una vez realizado este cambio, reiniciamos le servicio apache:

#/etc/init.d/apache2 restart

o

#apache2ctl restart

3.3 Dar de alta algunos usuarios

#su www-data -c "htpasswd -c -m /home/svn/.dav_svn.passwd user1"

La opción -c sólo es necesaria la primera vez que ejecute este comando, a fin de crear el archivo de las contraseñas'. Posteriormente ya no se ejecuta:

#su www-data -c "htpasswd -m /home/svn/.dav_svn.passwd user2"

El archivo de las contraseñas no es necesario crearlo con www-data, se puede hacer como root si así lo desean, sin embargo, debe ser visible por www-data.

4. Interface web

Para tener una bonita interface web con subversion, disponemos del paquete websvn, lo instalamos de la manera más fácil =)

#aptitude install websvn

Seguimos las instrucciones que aparecen, simplemente debemos decirle a websvn en dónde están nuestros repositorios subversion.

https://localhost/websvn

No doy más detalles, ya que la forma de configurar websvn es de lo más sencillo de hacer, en dado caso que quisiéramos re-configurar el paquete es igual de sencillo como hacer:

#dpkg-reconfigure websvn

5. Probando el servidor de control de versiones

Lo que a continuación menciono, debe ser adaptado a nuestras propias necesidades, por ejemplo, yo realicé lo siguiente:

~$mkdir working_copy
~$cd working_copy/
~$svn checkout https://localhost/svn/documentacion

Este último comando es para traer una copia del repositorio hacia mi directorio "copia de trabajo local".

~$ls -l
~$drwxr-xr-x 3 usuario usuario 4096 2009-04-21 19:51 documentacion
~$cd documentacion
~$touch info.txt

Edito el archivo info.txt, lo preparo para añadirlo al repositorio y, lo subo al repositorio:

~$emacs info.txt
~$svn add info.txt
A         info.txt

Aquí podemos ver que cuando indicamos al subversion que vamos a agregar un archivo al repositorio, lo marco con la letra A, esta listo para ser añadido al repositorio, entonces lo subimos al repositorio con:

~$svn commit info.txt
(R)eject, accept (t)emporarily or accept (p)ermanently? t
Adding         info.txt
Transmitting file data .
Committed revision 1.

Con esto ya tenemos nuestro primer archivo/documento en nuestro repositorio.