Publicar un repositorio Mercurial con Apache

6
11952

Publicar un repositorio Mercurial con Apache

1. Introducción

En el primer tutorial sobre Mercurial os enseñamos las características y pasos básicos para empezar a trabajar con él. Ahora os vamos a enseñar los pasos necesarios para que los repositorios sean accesibles a través de Apache.

Mercurial soporta diferentes protocolos para acceder a un repositorio (http, https, ssh, file y local), pero cuando queremos publicar un repositorio para que sea accesible remotamente, se reducen las posibilidades. De todas ellas, https es el más utilizado y el que recomienda Mercurial en su documentación.

En la página oficial existe una tabla en la que se describen todas las posibles soluciones para publicar un repositorio. En nuestro caso, para el protocolo https, podremos utilizar:

  • hg server bajo un proxy Nginx: esta solución utiliza el servidor que viene integrado con Mercurial. Como éste sólo soporta el protocolo http, será necesario utilizar un proxy para utilizar https. Con esta solución vamos a poder publicar varios repositorios. Por defecto estará habilitada la posibilidad de hacer push, permite autenticación y no utiliza CGI.
  • hgweb: es una solución que se integra con un servidor web existente utilizando python, CGI o WSGI. Se integra con la autenticación del servidor, pero sólo será capaz de publicar un único repositorio y por defecto no estará habilitado el uso de push.
  • hgwebdir: se trata de la misma solución que hgweb pero con la única diferencia de que vamos a poder publicar más de un repositorio.

De todas las soluciones, la más adecuada es hgwebdir ya que nos da la posibilidad de publicar varios repositorios y su ejecución estará bajo un servidor web como va a ser Apache. La solución hg server sólo la deberíamos utilizar para situaciones temporales y no como un servidor permanente.

Como único requisito de este tutorial daremos por hecho que disponemos de un servidor web Apache con el protocolo https configurado.

2. Entorno

Entorno utilizado para escribir este tutorial:

  • Hardware: VirtualBox 3.2.8 corriendo sobre un Mac Book Pro (Core 2 Duo 2,8 Ghz, 4 GB RAM, 500 GB)
  • Sistema Operativo: Ubuntu 64 bits 10.04 LTS
  • Mercurial: 1.6.3
  • Python: 2.6.1
  • Wsgi: 2.8.2

3. Instalación de Mercurial

Lo primero que tenemos que hacer es instalar Mercurial y la librería de python. Para ello ejecutaremos el siguiente comando:

apt-get install mercurial python python-dev

A continuación debemos crear el directorio donde vamos a almacenar los repositorios y demás ficheros de configuración:

mkdir -p /var/hg/repositories  
mkdir -p /var/hg/cgi-bin  
touch /var/hg/hgweb.config

Ahora copiamos el script de hgwebdir que posteriormente utilizaremos en Apache. Este fichero se encuentra en uno de estos dos path: /usr/share/doc/mercurial-common/examples o /usr/share/doc/mercurial/examples/. En nuestro caso ejecutaríamos el siguiente comando

cp /usr/share/doc/mercurial-common/examples/hgwebdir.wsgi /var/hg/cgi-bin

De momento no vamos hacer ningún cambio en él, lo haremos más adelante. Lo último que nos quedaría es dar permisos para que estos recursos puedan ser accedidos por el usuario con el que se ejecuta Apache.

chown -R www-data:www-data /var/hg 

4. Instalación del módulo modwsgi para Apache

Como hemos comentado en la introducción, vamos a utilizar la solución hgwebdir. Esto implica que tengamos que decidir que opción utilizar para servir los repositorios (módulo de python, módulo de wsgi o CGI). En nuestro caso vamos a instalar el módulo modwsgi porque es la mejor solución por su facilidad de configuración y su mejor rendimiento respecto a las otras alternativas.

Existen varias formas de instalar el módulo en nuestro Apache: de forma manual, compilando los fuentes de http://code.google.com/p/modwsgi/, o instalando el módulo ya precompilado de los repositorios de Debian. Por comodidad utilizaremos la segunda opción, así que ejecutamos el siguiente comando:

apt-get install libapache2-mod-wsgi 

Una vez finalizada la instalación del módulo, tenemos que comprobar que en el directorio /etc/apache2/mods-enabled/ existen los siguientes ficheros wsgi.conf y wsgi.load. Si no existiesen deberíamos crear enlaces a esos ficheros desde /etc/apache2/mods-available/.

ls -l /etc/apache2/mods-enabled/wsgi.* 

Recordad que todos los paths que estamos utilizando en este tutorial son los estándar y por tanto deberán ser modificados si tu entorno utiliza otros distintos.

5 Configurando Apache 2.x con el módulo modwsgi

El siguiente paso que debemos seguir es configurar nuestro servidor web. Editamos el fichero default-ssl situado en el path /etc/apache2/sites-available, y justo antes de la línea SSLEngine On, añadimos:

WSGIScriptAlias    /hg  /var/hg/cgi-bin/hgwebdir.wsgi  
  
  
                Options ExecCGI   
                AddHandler wsgi-script .wsgi  
  
                AllowOverride None  
                Order allow,deny  
                Allow from all  
  
#   SSL Engine Switch:  
#   Enable/Disable SSL for this virtual host.  
SSLEngine on 

Con estas líneas lo que hacemos es que cuando se acceda a la url https://nuestroservidor/hg, se lance el script /var/hg/cgi-bin/hgwebdir.wsgi y nos de acceso a los repositorios que tengamos configurados.

6 Retocando el script hgwebdir.wsgi

Un vez que hayamos configurado Apache tendremos que modificar el fichero hgwebdir.wsgi que copiamos al principio. Este fichero será el encargado de proporcionar el acceso a los repositorios que configuremos. En él se define la ruta del fichero de configuración de Mercurial. Por defecto el script intentará buscar un fichero llamado hgweb.config dentro del directorio cgi-bin. En nuestro caso esta ruta no es válida y la tendremos que sustituir por /var/hg/hgweb.config, así que editamos el fichero /var/hg/cgi-bin/hgwebdir.wsgi, nos dirigimos a la última línea y donde pone:

application = hgwebdir('hgweb.config') 

lo sustituimos por:

config = Ò/var/hg/hgweb.configÓ  
application = hgwebdir(config)

Ahora sólo nos quedaría añadir la configuración necesaria al fichero hgweb.config.

7 Configurando Mercurial

Prácticamente hemos finalizado la configuración básica para poder publicar un repositorio a través de Apache. Ahora nos queda añadir la configuración necesaria al fichero /var/hg/hgweb.config. Realmente se podría considerar como cualquier otro fichero de configuración hgrc que nos podríamos encontrar en el directorio .hg de un repositorio. La única diferencia es que en él vamos a configurar todo lo necesario para el acceso a los repositorios vía https.

Como ya explicamos en el anterior tutorial sobre Mercurial, este fichero está dividido en secciones donde cada una tendrá un conjunto de propiedades que configura una parte de Mercurial. De momento vamos a añadir a este fichero la url base que utilizamos para acceder a los repositorios y el estilo con el que se presentará la información vía web. Para ello añadimos las siguientes líneas:

[web]  
#Indicamos que el estilo del html sea con la plantilla gitweb  
style=gitweb  
#Como al script hgwebdir.wsgi se accede con el prefijo hg se lo indicamos al servidor para que lo #tenga en cuenta  
baseurl=/hg 

Si ahora abrimos un navegador y tecleamos https://localhost/hg debe mostrarse algo como esto:

Como podéis comprobar no nos aparece casi nada porque todavía no hemos configurado ningún repositorio para que se pueda acceder a través del Apache.

8 Publicando un repositorio

Como parece evidente, antes de publicar un repositorio deberemos crearlo. Por tanto manos a la obra. Para crear un repositorio Mercurial debemos utilizar el comando «hg init». En nuestro caso haremos lo siguiente:

cd /var/hg/repositories/  
mkdir adictos-repo  
cd adictos-repo  
hg init  
cd ..  
chown -R www-data:www-data adictos-repo

Una vez creado debemos añadirlo a la configuración para que sea accesible. Existen dos formas de publicar un repositorio o conjunto de repositorios. Lo podemos hacer usando la sección paths o collections. Collections era la forma antigua que se utilizaba en las versiones anteriores de Mercurial 1.1 y se mantiene para mantener compatibilidad, pero lo correcto sería usar la sección paths. En ella vamos a definir todos los repositorios que queremos que sean accesibles a través de nuestro servidor web. Básicamente se trata de indicar el alias que se utilizará para acceder a él y la ruta física donde se encuentra el repositorio en nuestro sistema. En nuestro caso la sección paths quedaría así:

[paths]  
#Añadimos el repositorio creado para que se pueda acceder via https. En este caso para acceder al #repositorio lo haremos invocando a la url https://miservidor/hg/adictos-repo.  
/adictos-repo = /var/hg/repositories/adictos-repo 

Con esta configuración, cuando accedamos a https://miservidor/hg/adictos-repo, estaremos accediendo al repositorio situado en /var/hg/repositories/adictos-repo.

Si guardamos el fichero y volvemos a abrir un navegador accediendo a https://localhost/hg, veremos nuestro repositorio accesible:

9 Restringiendo el acceso al repositorio

Si queremos que el acceso a nuestro repositorio sea restringido debemos configurar Apache para que pida credenciales cuando queramos realizar una operación con el repositorio. En este ejemplo vamos a utilizar la autenticación básica, pero podremos configurar cualquier autenticación que Apache permita como Digest o Ldap.

Editamos el fichero default-ssl y añadimos las siguientes líneas al apartado Directory creado anteriormente:

  
                Options ExecCGI   
                AddHandler wsgi-script .wsgi  
  
                AllowOverride None  
                Order allow,deny  
                Allow from all  
        AuthType Basic  
        AuthName "Mercurial repositories"  
        AuthUserFile /var/hg/hgusers  
        Require valid-user  
 

Ahora sólo nos queda crear el fichero de usuarios, y cuando terminemos reiniciaremos el apache para que coja los cambios. Para crear los usuarios hacemos lo siguiente:

cd /var/hg/hgusers  
touch hgusers  
htpassword /var/hg/hgusers adictos  
htpassword /var/hg/hgusers autentia  
chown www-data:www-data /var/hg/hgusers  

Ahora cuando queramos acceder al repositorio nos pedirá las credenciales.

10 Activando el push sobre el repositorio.

Por defecto el push de los repositorios se encuentra desactivado. Para habilitarlo debemos editar el fichero hgrc que se encuentra dentro del directorio .hg del repositorio y añadir las siguientes líneas (en el caso de que no existiese lo deberíamos crear):

[web]  
allow_push=* 

Con esto permitimos la operación push de cualquier usuario sobre el repositorio. Para restringir qué usuarios pueden hacer push en vez de «*», indicaremos la lista de usuarios que podrán realizar esta operación separados por comas.

Y con este último cambio tenemos montado nuestro repositorio accesible por https. En un próximo tutorial veremos cómo añadir permisos de grano fino.

11 Conclusión

Habilitar el acceso remoto a los repositorios es algo habitual cuando trabajamos con un sistema de control de versiones. Los equipos de desarrollo lo necesitan para poder trabajar con ellos. En el caso de Mercurial sólo se podrá acceder por medio de ssh o http. Con este tutorial hemos visto la segunda opción por ser la más utilizada en este SCM.

6 COMENTARIOS

  1. Buenas Angel García, la verdad excelente tutorial , admiro la pasciencia de las personas como usted para explicar paso a paso este tipo de detalles. Un saludo.

  2. Excelente Manual… pero me queda una duda bien enorme como puedo configurarlo en CentOS 5 porfavor… me podrias ayudar en el aspecto de validacion de usuarios para el acceso

  3. Hola amigo, tengo una duda que hasta el momento no he podido resolver, tengo un pryecto web y estaré trabajando con colaboración de otro usuario, he cofigurado mi repositorio y trabaja bien, la duda que tengo es si es posible configurar mercurial para que haga un espejo del repositorio hacia la carpeta del proyecto web, para que los cambios se publiquen en la carpeta public_html/XXXX, o que montaje se hace para un proyecto de este tipo.

    Entiendo que es complicado colocar el repositorio sobre ese mismo directorio (donde esta la página web) ya que puede ser perjudicial por seguridad y porque los comandos clone, push no funcionarán bien ya que la respuesta será desde el puerto 80 trayendo lo que muestra la url, no el repositorio, espero una respuesta de alguien que haya trabajado proyectos web con control de versiones.

    • Hola CJMO,

      Pues realmente yo no te aconsejo montar el repositorio de control de versiones y la versión que todo el mundo puede ver.

      Lo que tienes que hacer en montarte un repositorio Mercurial o cualquier otro tu mismo que se puede acceder remotamente o utilizar un repositorio en la nube como github o bitbucket. Luego clonaros el repositorio tanto tu compañero como tu.

      Cuando tengáis una versión final en vuestro repositorio deberéis sacar una versión (etiquetando la versión en el repositorio) y subirla a la carpeta public_html/XXX como comentas.

  4. Hola Angel, primero que nada gracias por armar este post, lo segui al pie de la letra, me altaba configurar ssl, pero una vez que lo logre al probar la url en el navegador me tira:

    Forbidden

    You don’t have permission to access /hg on this server.

    revise que la carpeta tenga permisos para el usuario www-data y lo tiene, repase los pass y estaban correctos la diferencia no se si viene al caso es que estoy con ubuntu 16.04 LTS

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad