javoaxian cambió a: javoaxian.me
Este blog se mantendrá como histórico del nuevo javoaxian.me. Por tal motivo, sólo serán creados post que harán referencia a los del nuevo blog. Si hay dudas y comentarios, favor de hacerlos en javoaxian.me.

viernes, 20 de junio de 2008

Instalar Subversion (SVN) desde su código fuentes con Apache2 en Debian y Ubuntu

En un post anterior ya había explicado como instalar Subversion desde los repositorios de Debian y Ubuntu, pero el día de hoy voy ha explicar como podemos instalar este software atravéz de su código fuente y además habilitaremos Apache para que se puedan consultar nuestros repositorios desde la Web.

Primeramente nos convertiremos en el usuario root.

javoaxian@darthmaul:~$ su -

Instalaremos los paquetes: zlib1g, zlib1g-dev, openssl, libssl-dev, libxml2, libxml2-dev, libexpat1 y libexpat1-dev.

root@darthmaul:~# apt-get install zlib1g zlib1g-dev openssl libssl-dev libxml2 libxml2-dev libexpat1 libexpat1-dev

Ahora deberemos tener instalado nuestro servidor Apache desde su código fuente. Aquí dejo este artículo de cómo instalarlo, nada más deberemos agregar las siguientes opciones en el comando ./configure para que la línea del comando quede de la siguiente manera:

./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared="most ssl dav"

Ya que contamos con nuestro servidor web instalado, vamos a crearle un certificado de prueba. Supondré que siguieron el artículo que mencioné anteriormente (con la modificación del comando ./configure) e instalaron apache en /usr/local/apache.

root@darthmaul:~# cd /usr/local/apache/conf/
root@darthmaul:~# mkdir ssl.crt
root@darthmaul:~# mkdir ssl.key

Ahora generaremos el certificado:

root@darthmaul:~# openssl req -new -x509 -days 365 -keyout ./ssl.key/server.key -out ./ssl.crt/server.crt -subj '/CN=Certificado JavoAxian'

Este comando nos solicitará el PEM pass Phrase y su confirmación. Este nos será solicitado cada vez que iniciemos nuestro servidor web, pero para efectos de este artículo, lo eliminaremos.

Generating a 1024 bit RSA private key
....................++++++
.......................++++++
writing new private key to './ssl.key/server.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

Ya que ingresamos los datos anteriores, eliminaremos el PEM pass phrase que ingresamos de la siguiente manera:

root@darthmaul:~# cp ssl.key/server.key ssl.key/server.key.org
root@darthmaul:~# openssl rsa -in ssl.key/server.key.org -out ssl.key/server.key

Nos pedirá la PEM pass phrase que ingresamos:

Enter pass phrase for ssl.key/server.key.org:
writing RSA key

Ahora le cambiaremos los permisos al archivo server.key:

root@darthmaul:~# chmod 400 ssl.key/server.key

Con esto ya tenemos nuestro certificado. Ahora nos encargaremos de instalar subversion, para esto, lo descargaremos de su página. La versión vigente en el momento de hacer este post es la 1.4.6, por lo que bajaremos los siguientes archivos: subversion-1.4.6.tar.bz2 y subversion-deps-1.4.6.tar.bz2.

La instalación de subversion la haré en el directorio /usr/local.
Copiaremos los archivos de subversion que descargamos al directorio /usr/local/src.

root@darthmaul:~# cp /ruta/de/descarga/subversion-1.4.6.tar.bz2 /usr/local/src/
root@darthmaul:~# cp /ruta/de/descarga/subversion-deps-1.4.6.tar.bz2 /usr/local/src/

Hecho lo anterior, nos moveremos al directorio /usr/local/src y descomprimiremos los 2 archivos.

root@darthmaul:~# cd /usr/local/src/
root@darthmaul:~# tar -jxvf subversion-1.4.6.tar.bz2
root@darthmaul:~# tar -jxvf subversion-deps-1.4.6.tar.bz2

Esto creará un directorio llamado subversion-1.4.6 al cual ingresaremos.

root@darthmaul:~# cd subversion-1.4.6

Ahora ya tenemos todo listo para compilar el paquete de subversion, el cual lo vamos a instalar en el directorio /usr/local/subversion. Vamos a suponer, que si siguieron las instrucciones para instalar apache de este post. Apache deberá estar instalado en /usr/local/apache y abremos creado el usuario apache y el grupo apache.

root@darthmaul:~# ./configure --prefix=/usr/local/subversion --with-apxs=/usr/local/apache/bin/apxs --with-apr=/usr/local/apache --with-apr-util=/usr/local/apache --with-ssl

El comando configure nos mandará un WARNING el cual dice lo siguiente:

You don't seem to have Berkeley DB version 4.0.14 or newer
installed and linked to APR-UTIL. We have created Makefiles which
will build without the Berkeley DB back-end; your repositories will
use FSFS as the default back-end. You can find the latest version of
Berkeley DB here:
http://www.sleepycat.com/download/index.shtml

Éste nos dice que no tenemos instalada la base de datos de Berkeley, pero no la vamos a instalar, en su lugar vamos a usar la base de datos fsfs.
Continuaremos con la instalación ejecutando los siguientes comandos:

root@darthmaul:~# make
root@darthmaul:~# make install

Si desean, pueden agregar las siguientes líneas en el archivo /etc/profile para que los comandos de subversion funcionen sin tener que especificar su ruta completa.

export SVN=/usr/local/subversion
export PATH=$PATH:$SVN/bin

Para que funcione este cambio, deberán reiniciar su ambiente gráfico o su máquina.

Con esto tenemos instalado subversion. Ahora configuraremos un repositorio para que se pueda acceder por medio de nuestro servidor web.

Crearemos el repositorio especificando el tipo de base de datos fsfs en el directorio /usr/local/repositorio y le daremos permisos de escritura al usuario apache para que pueda escribir sobre el repositorio:

root@darthmaul:~# mkdir /usr/local/repositorio
root@darthmaul:~# /usr/local/subversion/bin/svnadmin create --fs-type=fsfs /usr/local/repositorio/
root@darthmaul:~# chown -R apache.apache /usr/local/repositorio/

Creado el repositorio, procederemos a crear una cuenta (javoaxian) para acceder a éste. Esto se hace usando el comando htpasswd que se encuentra en el directorio bin donde fue instalado apache y crearemos el archivo que guarda los passwords y lo pondremos en el directorio /usr/local/apache/svn.

root@darthmaul:~# mkdir /usr/local/apache/svn
root@darthmaul:~# /usr/local/apache/bin/htpasswd -cm /usr/local/apache/svn/svn_auth.txt javoaxian

La opción "c" indica que deberá crear el archivo de las contraseña, cabe destacar que si van a agregar otro usuario omitan esta opción ya que borrará el archivo ya existente.
La opción "m" indica que deberá generar las contraseña con el algoritmo MD5.
Se nos pedirá el password del usuario y que lo volvamos a ingresar:

New password:
Re-type new password:
Adding password for user javoaxian

Por seguiridad cambiaremos el dueño al directorio /usr/local/apache/svn y le cambiaremos los permisos:

root@darthmaul:~# chown -R apache.apache /usr/local/apache/svn/
root@darthmaul:~# chmod 700 /usr/local/apache/svn/

Ahora agregaremos las instrucciones necesarias en apache para tener acceso al repositorio, para ello, deberemos editar el archivo httpd.conf que se encuentra en el directorio conf donde se instaló apache, que en este caso está en /usr/local/apache/conf/httpd.conf.
Primero buscaremos la línea siguiente del archivo:

Listen 80

Y agregaremos la línea Listen 443 debajo de la que encontramos para que quede de la siguiente forma:

Listen 80
Listen 443

Ahora colocaremos las siguiente líneas al final del archivo:

NameVirtualHost *:443

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key

<Location /repositorio>
DAV svn
SVNPath /usr/local/repositorio
AuthType Basic
AuthName "Repositorio de Subversion"
AuthUserFile /usr/local/apache/svn/svn_auth.txt
Require valid-user
SSLRequireSSL
</Location>
</VirtualHost>

Como podemos observar, estamos creando un Host virtual para el puerto 443.
SSLCertificateFile: Ruta donde colocamos el archivo server.crt cuando creamos el certificado.
SSLCertificateKeyFile: Ruta donde colocamos el archivo server.key cuando creamos el certificado.
Location: Alias que usaremos para dirigirnos al repositorio, en este caso sería https://localhost/repositorio.
SVNPath: Ruta del repositorio.
AuthUserFile: Ruta del archivo de contraseñas que creamos.

Ahora deberemos reiniciar nuestro servidor de apache.

root@darthmaul:~# /usr/local/apache/bin/apachectl stop
root@darthmaul:~# /usr/local/apache/bin/apachectl start

Podemos entrar con nuestro navegador a la dirección https://localhost/repositorio/, nos aparecerá una pantalla para aceptar el certificado y una vez que aceptemos, nos mostrará una pantalla donde se nos pide el user name y password del usuario que creamos con el comando htpasswd, y una vez introducidos estos datos, nos mostrará el contenido del repositorio.

Ahora si queremos permitir el acceso a más de un usuario al repositorio, deberemos crear nuestros nuevos usuarios de la siguiente manera:

root@darthmaul:~# /usr/local/apache/bin/htpasswd -m /usr/local/apache/svn/svn_auth.txt javoaxian2

Crearemos otro archivo que se encargará de llevar el control de acceso a los usuario. Se les puede dar permisos de lectura o lectura-escritura, además que pueden acomodarse en grupos.

Este es un ejemplo del nuevo archivo:

[groups]
javoaxianteam = javoaxian, javoaxian2
pruebas = prueba1, prueba2

[/]
@javoaxianteam = rw
@pruebas = r
javoaxian3 = r

[/trunk]
javoaxian4 = r

Este archivo nos indica que tenemos dos grupos: javoaxianteam con los usuario javoaxian y javoaxian2 y el grupo pruebas con los usuarios prueba1 y prueba2.
También nos indica que el grupo javoaxianteam tiene permisos de lectura-escritura sobre el directorio "/" del repositorio, el grupo pruebas y el usuario javoaxian3 sólo tienen permisos de lectura para el repositorio.
Por último, el usuario javoaxian4 tiene permisos de lectura dentro del directorio /trunk del repositorio.

Este nuevo archivo lo crearé en /usr/local/apache/svn/svn_control_acceso.txt.

Una vez que se tiene el archivo con la configuración que deseamos, deberemos configurar nuevamente apache.
Deberemos editar el archivo /usr/local/apache/conf/httpd.conf y poner la línea:

AuthzSVNAccessFile /usr/local/apache/svn/svn_control_acceso.txt

Debajo de la línea:

Require valid-user

Por lo que nos quedaría de la siguiente manera esta sección de la configuración de apache.


DAV svn
SVNPath /usr/local/repositorio
AuthType Basic
AuthName "Repositorio de Subversion"
AuthUserFile /usr/local/apache/svn/svn_auth.txt
Require valid-user
AuthzSVNAccessFile /usr/local/apache/svn/svn_control_acceso.txt
SSLRequireSSL

Y nuevamente deberemos reiniciar nuestro apache.

root@darthmaul:~# /usr/local/apache/bin/apachectl stop
root@darthmaul:~# /usr/local/apache/bin/apachectl start

Pueden acceder al repositorio mediante su navegador a la dirección https://localhost/repositorio/ e ingresar los datos de acceso de su usuario.
Espero que esto les pueda ser de utilidad.
Saludos.

2 comentarios:

Anónimo dijo...

Hola lo que comentas podría servir para windows, quiero decir, tengo un proyecto en el que quiero crear distintos grupos con distintos usuarios para asignar distintos permisos a unos y a otros, ¿se podría utilizar lo mismo a la hora de crear usuarios y grupos?

Un saludo

javoaxian dijo...

Hola, si se puede hacer lo que mencionas ya que los permisos de usuarios y grupos son manejados con la autenticación de Apache.