Desplegando Trac con Gunicorn
En mi anterior
post hablé sobre Gunicorn, un servidor HTTP WSGI para Python, y terminé
diciendo que en el próximo articulo iba a explicar cómo desplegar Trac con
Gunicorn y como lo prometido es deuda, vamos a ello...
Preparando el entorno
Antes de nada, vamos a crear un directorio de trabajo, donde se alojará todo. Se me ocurre llamarlotesting-gunicorn:
$ mkdir testing-gunicorn
$ cd testing-gunicorn
Antes de comenzar a instalar Trac y Gunicorn, vamos a crear un virtualenv en el directorio testing-gunicorn, dentro del cual instalaremos todos los modulos de Python necesarios:
$ virtualenv --no-site-packages --distribute .
y activamos el virtualenv:
$ source bin/activate
Instalando Trac y Gunicorn
La instalación es realmente sencilla. Al igual que para instalar cualquier otro módulo de Python, utilizaremoseasy_install o pip. Yo opto por utilizar pip, así que ejecutamos las siguientes instrucciones:
$ pip install Trac
$ pip install gunicorn
Una vez hecho esto, deberemos tener instalado Trac y Gunicorn dentro de nuestro virtualenv, el mismo que tenemos activado.
Para comprobar que la instalación se ha realizado correctamente, abriremos una shell de Python e importaremos los dos módulos instalados:
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import trac
>>> import gunicorn
>>>
Esto quiere decir que la instalación se ha realizado correctamente. En caso
contrario, obtendriamos un error al intentar importar el módulo, y se mostraría un error como el siguiente:
>>>> import trac
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named trac</pre>
Pero no es nuestro caso, asi que sigamos adelante :-)
Creando un Trac de ejemplo
Tenemos Trac instalado, así que el siguiente paso será crear una instancia de Trac.Crearemos un directorio llamado 'projects' donde crearemos nuestras instancias de Trac:
$ mkdir projects
y finalmente crearemos la instancia de Trac llamada demo, haciendo uso de la utilidad trac-admin:
$ trac-admin projects/demo initenv demo sqlite:db/trac.db
A modo de resumen, le hemos especificado a trac-admin que cree una instancia de Trac en el directorio projects/demo con la opción
initenv, cuyo nombre es "demo" y siendo la base de datos de tipo sqlite, que se encontrará en db/trac.db.
Hecho esto, tendremos nuestra instancia de Trac creada con una estructura como la siguiente:
projects/
└── demo
    ├── attachments
    ├── conf
    │   ├── trac.ini
    │   └── trac.ini.sample
    ├── db
    │   └── trac.db
    ├── htdocs
    ├── log
    ├── plugins
    ├── README
    ├── templates
    │   └── site.html.sample
    └── VERSION
Configurando Gunicorn
Como comenté en el anterior post, la configuración de Gunicorn la realizaremos creando un fichero Python.Nuestro fichero de configuración se llamará trac_launcher.py y su contenido debe ser el siguiente:
#!/usr/bin/env python                                                                          
import sys                                                                                     
import os
import trac.web.main
sys.stdout = sys.stderr                                                                        
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
os.environ['TRAC_ENV_PARENT_DIR'] = os.path.join(PROJECT_ROOT,'projects')
os.environ['PYTHON_EGG_CACHE'] = os.path.join(PROJECT_ROOT, '.egg-cache')
application = trac.web.main.dispatch_request
Básicamente el fichero de configuración está compuesto por:
- Importaciones de los módulos 
sys,osytrac.web.main. - Creación de dos variables de entorno:
TRAC_ENV_PARENT_DIR: directorio donde se alojan las instancias de Trac.PYTHON_EGG_CACHE: directorio de caché de los huevos de Python.
 - Instancia de la funcion 
trac.web.main.dispatch_requesten la variableapplication. 
Antes de seguir hagamos un breve repaso:
- Nos encontramos en el directorio 
testing-gunicorn. - Tenemos nuestra instancia de Trac en 
projects/demo. - Hemos creado en el directorio actual el fichero de configuración para Gunicorn, llamado 
trac_launcher.py. 
El siguiente paso será ejecutar Gunicorn!
Ejecutando Gunicorn
Tan fácil como ejecutar la siguiente instrucción:$ gunicorn trac_launcher:application
¡Guay! Ya deberíamos tener nuestro proyecto Trac accesible en
http://localhost:8000 :-D
Por defecto Gunicorn arranca un solo worker, pero podemos indicarle que
arranque más de uno, un número máximo de peticiones por worker y un fichero de log, por ejemplo:
$ gunicorn trac_launcher:application \
--workers 2 \
--worker-connections 100 \
--log-file gunicorn.log
Como hemos podido observar, Gunicorn abre por defecto el puerto 8000 en nuestro sistema, pero si por el contrario la comunicación la queremos hacer a través de un socket, deberemos indicarle la opción --bind.
unix:///home/mviera/testing-gunicorn/gunicorn.sock
Por último y para terminar el despliegue, deberíamos instalar un servidor web que actuara de proxy, ya sea hacia HOST:PUERTO o hacia el fichero de socket.
Y eso esto todo amig@s! Espero que os haya gustado y gracias por leerme!
Un saludo!