Subversion desde Apache usando virtual hosts y locations
Aunque hay bastantes guías que cubren cómo configurar un WebDAV para acceder a un repositorio Subversion mediante HTTP usando el servidor Apache, aquí os presento la mía, en la que configuro el acceso a un conjunto de repositorios usando un virtual host y distintas locations (es decir, es una guía más con la configuración que a mi más me gusta
).
Lo primero que debemos hacer es asegurarnos de que tenemos el módulo adecuado. En Debian, por ejemplo, podemos buscarlo e instalarlo si es necesario usando los siguientes mandatos:
$ aptitude search apache subversion | grep svn
# aptitude install libapache2-svn
Además, deberemos asegurarnos de que Apache habilita el módulo, lo cual, nuevamente en Debian, es trivial gracias a la buena organización que tiene de la configuración de Apache:
$ a2enmod dav_svn
# /etc/init.d/apache2 restart
El siguiente paso es crear un repositorio Subversion. Lo habitual es crear uno por proyecto, aunque en mi caso no lo hago así exactamente. Por ejemplo, tengo un repositorio al que llamo personal en el que tengo mi CV, algunas prácticas y cosas pequeñas en las que es más que improbable que participe nadie más que yo. Depende del criterio de cada uno (por ejemplo, a mi siempre me resulta tentador tener un único respositorio para todo, y a la hora de hacer el checkout, hacerlo con ruta relativa al proyecto que necesito), pero recordad que los usuarios, contraseñas y permisos serán los mismos para todo un repositorio. La creación del repositorio la hacemos con los mandatos:
$ mkdir -p /opt/svn/nombre_del_repositorio/
$ svnadmin create /opt/svn/nombre_del_repositorio/repo
Podemos verificar que funciona intentando hacer un checkout:
$ svn co file:////opt/svn/nombre_del_repositorio/repo /tmp/
Por último, creamos los usuarios y passwords del repositorio:
$ mkdir -p /opt/svn/nombre_del_repositorio/passwords/
$ htpasswd -c /opt/svn/nombre_del_repositorio/passwords/.htpasswd usuario
Y procedemos a crear el fichero de configuración del virtual host de Apache. En el ejemplo, lo voy a hacer para dos repositorios, uno llamado personal y otro llamado público, suponiendo que quiera acceder a ambos a través del mismo dominio (svn.deigote.com
pero con distintas localizaciones (/personal y /publico):
<VirtualHost *:80> ServerName svn.deigote.com DocumentRoot /opt/websites/svn.deigote.com
Como véis, definimos un virtual host para el dominio elegido, y le asignamos un docroot, en el que podríamos poner una página de inicio o incluso vacía (para que si alguien entra directamente en el dominio, no vea el clásico It works! situado en /var/www
(1).
A partir de aquí, para cada localización (personal y publico
establecemos que es un WebDAV de tipo Subversion, e indicamos la ruta del repositorio y del fichero de passwords, tanto para el repositorio personal:
<Location "/personal" >
DAV svn
SVNPath /opt/svn/personal/repo
AuthType Basic
AuthName "SVN Deigote - Personal"
AuthUserFile /opt/svn/personal/passwords/.htpasswd
Require valid-user
Order deny,allow
Deny from all
Allow from unaipdeconfianza.com
</Location>
como para el repositorio público:
<Location "/publico" >
DAV svn
SVNPath /opt/svn/publico/repo
AuthType Basic
AuthName "SVN Deigote - Publico"
AuthUserFile /opt/svn/publico/passwords/.htpasswd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
Podemos ver un par de diferencias. Mientras que el repositorio personal pide un usuario válido para todos los casos (es decir, un usuario definido en el fichero de passwords), el repositorio público especifica que necesita un usuario válido excepto para algunas acciones. Básicamente, son el conjunto de acciones que permiten lectura y navegación por el repositorio. De esta manera, todo el mundo podrá ver (acciones checkout, update, etcétera) pero sólo los usuarios válidos podrán escribir (acción commit, add, etcétera) (2)
La otra diferencia es que el repositorio personal tiene una sección que especifica que el acceso es denegado para todos, y admitido para una ip o nombre de dominio. Esto te garantiza que la persona que accede a tu repositorio lo está haciendo desde una IP de tu confianza, aumentando ligeramente la paranoia seguridad.
Añadir que el directorio raiz (/
es un location válido, por lo que podemos configurar un único repositorio para el dominio, aunque sería equivalente a poner dicha configuración directamente en el contexto del virtual host en vez de en el del location.
Añadiendo la información de logs y demás, el fichero de virtual host de ejemplo (/etc/apache2/sites-available/svn.deigote.com
queda como se ve a continuación:
<VirtualHost *:80>
ServerName svn.deigote.com
DocumentRoot /opt/websites/svn.deigote.com
<Location "/personal" >
DAV svn
SVNPath /opt/svn/personal/repo
AuthType Basic
AuthName "SVN Deigote - Personal"
AuthUserFile /opt/svn/personal/passwords/.htpasswd
Require valid-user
Order deny,allow
Deny from all
Allow from unaipdeconfianza.com
</Location>
<Location "/publico" >
DAV svn
SVNPath /opt/svn/publico/repo
AuthType Basic
AuthName "SVN Deigote - Publico"
AuthUserFile /opt/svn/publico/passwords/.htpasswd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
ErrorLog /var/log/apache2/error_svn.deigote.com.log
LogLevel warn
CustomLog /var/log/apache2/access_svn.deigote.com.log combined
</VirtualHost>
Lo añadimos a la lista de sites y reiniciamos Apache, y ya estamos listos para jugar:
$ a2ensite svn.deigote.com
$ /etc/init.d/apache restart
$ svn co http://svn.deigote.com/personal
$ svn co http://svn.deigote.com/publico
Como nota final, ojo con los passwords. Tened en cuenta que estamos configurando un acceso a través de HTTP, por lo que la información no va encriptada. Para que sí lo fuera tendríamos que configurar el virtual host para ir a través de HTTPS, pero eso lo dejamos para un próximo capítulo (más que nada porque todavía no he aprendido a hacerlo
).
(1) Tened cuidado de no crear directorios en el document root con el mismo nombre que los location. Os encontraréis con un error de este estilo al hacer el checkout:
$ ls /opt/websites/svn.deigote.com # Docroot
personal
$ svn co http://svn.deigote.com/personal/ /tmp/personal
Authentication realm:
Password for 'deigote':
svn: PROPFIND request failed on '/personal'
svn: PROPFIND of '/personal': 301 Moved Permanently (http://svn.deigote.com)
$ rmdir /opt/websites/svn.deigote.com/personal
$ svn co http://svn.deigote.com/personal/ /tmp/personal
...
Checked out revision 1
(2) Se puede afinar más usando mod_authz_svn, que permite establecer qué usuarios pueden escribir y cuáles pueden leer sin complicarse mucho, pero yo de momento no lo he necesitado, así que queda para el siguiente capítulo
Parecidos razonables
-
Empezando con Liferay: una guía rápida de instalación
enero 8, 2010
17 -
Svn y Apache: 403 Forbidden PROPFIND (client denied by server configuration)
marzo 3, 2010
4 -
Subdominio o subdirectorio, esa era la cuestión
septiembre 3, 2008
13 -
Fedora Core 7: notas post-instalación (paquetes varios, plugins multimedia, compiz, etcétera)
octubre 31, 2007
5 -
Enlazar mi blog
febrero 8, 2006
7

Joer… Que derroche!!
Tres artículos el mismo día!!!
Estoy que no me lo creo todavía… Necesito tiempo para asimilarlo
Bueno, en realidad los dos anteriores son de un día antes que este, pero aun así es todo un record
de todas formas no lo asimiles mucho que no creo que se repita
Ah… Ya decía yo… Por un momento pensé que estábamos ante una nueva era Deigotera
No te preocupes, tu club de fans te sigue apoyando!!
[OFFTOPIC]
Uooo!!! así que era cierto
¡Enhoragüena!
Jejeje.. Gracias!!
Hola, muy bueno el artículo. Te hago una consulta. Seguí la guia y configuré un subdmain para acceder al server svn. Si subo un archivo html o php y accedo desde el browser, este no se muestra como si el debería, se muestra en texto plano… ¿es eso normal? ¿como debería configurar mi server para que los archivos del repositorio se rendericen mediante html/php?
Saludos
Buenas, me alegro de que te sirviera
. La pregunta es, ¿para qué quieres hacer eso? Un gestor de versiones como Subversion está pensado para trabajar con ficheros de texto y binarios, y como tales te los sirve el servidor, valga la rebuznancia
. Si pruebas algún mandato de este tipo:
$ wget -S http://mi.servidor.svn.com/fichero.html$ wget -S http://mi.servidor.svn.com/fichero.php
Verás cómo el content-type que el servidor devuelve es text/plain, es decir, texto plano, y no text/html. Por eso el navegador decide no renderizarlo.
Igual en este punto te puedes preguntar “vale, aceptamos barco, pero, ¿porqué el fichero PHP no se “ejecuta” en el servidor, independientemente de que luego no se renderice el HTML resultante en el navegador?”. Ten en cuenta que esos ficheros ni siquiera existen como tales en el servidor, sino que son generados “al vuelo” por el servidor SVN a partir de la información de su base de datos (su repositorio), por lo que realmente no pasan por ningún otro módulo (incluyendo el de PHP).
Si lo que quieres es servir esos ficheros como HTML o que los ficheros PHP se “ejecuten” en el servidor, deberías crearte otro virtual host o location con un checkout del repositorio o fichero en cuestión, y dejar SVN exclusivamente para lo que sirve: manejar versiones
.
Pingback: Svn y Apache: 403 Forbidden PROPFIND (client denied by server configuration) « El blog de Deigote
Hola, surfeando por la web en busca de una solución a lo que comenta Diego he llegado aquí. Deigote, como deberia hacer lo que tu dices? es decir, yo quiero que accediendo a svn://server/repo pueda acceder y modificar el repositorio (eso ya esta conseguido) y por otro lado, quiero que accediendo a http://server/repo pueda acceder a la version actualizada del repositorio y que si hay alguna pagina php o html estas se sirvan como lo que son.
Viendo tu ultimo post, creo que debe ser realmente fácil, y supongo que la clave esta en el “checkout” que comentas, pero desconozco como hacerlo, y no encuentro información al respeto.
Puedes ayudarme?
Buenas Diddi.
Éste post enseña cómo configurar http://server/repo para que sea equivalente a svn://server/repo, es decir, para que cuando uses tu cliente de Subversion, puedas pasarle la URL http://server/repo como repositorio.
Si lo que quieres es ver el contenido, deberías crearte otro virtual host en Apache y hacer un checkout del repositorio en el path al que apunte el document root de dicho virtual host. También tendrás que tener instalado el módulo PHP de Apache.
Para hacer un checkout desde la terminal:
$ cd /path/al/document/root/que/hayas/puesto/en/el/virtual/host
$ svn co svn://server/repo .
Tengo un problema, tengo apache2 con host virtuales, y he colocado un servidro subversion por SLL, el problema es que puedo ver mis repositios por cualquiera de los dominio, y yo solo quiero atravez de uno y por el puerto 443, es decir, ahora lo que hace es lo siguiente: http://dominio1/repos/ y veo mis proyectos http://dominio2/repos/ y veo mis proyectos. Y yo lo que quiero es que solo se puedan ver los proyectos de la siguiente manera: https://dominio2:443/repos/, que tengo que configurar, apache? subversion?