Publicar un repositorio Mercurial con Apache
- 1. Introducción
- 2. Entorno
- 3. Instalación de Mercurial
- 4. Instalación del módulo modwsgi para Apache
- 5. Configurando Apache 2.x con el módulo modwsgi
- 6. Retocando el script hgwebdir.wsgi.
- 7. Configurando Mercurial.
- 8. Publicando un repositorio .
- 9. Restringiendo el acceso al repositorio.
- 10. Activando el push sobre el repositorio..
- 11. Conclusiones.
- 7. Configurando Mercurial.
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.wsgiOptions 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.
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.
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
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.
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
Hola Claudio,
Con los datos que me das no te puedo ayudar mucho. Vuelve a revisar de nuevo los permisos de la carpeta donde se encuentran los repositorios de mercurial.