Skip to content

Puesta en Producción de CKAN

Rodrigo Parra edited this page Jun 27, 2014 · 3 revisions
  1. Introducción
  2. Requerimientos
  3. Instalación de CKAN
  4. Integración con Apache y Nginx
  5. Integración del CKAN Filestore
  6. Integración del CKAN Datastore
  7. Integración con el Datapusher

Introducción

En este tutorial se presenta la serie de pasos necesarios para la puesta en producción de un portal de datos abiertos utilizando CKAN.

El resultado que se busca es similar al entorno de producción propuesto en la wiki de CKAN: https://github.com/ckan/ckan/wiki/CKAN-hosting-guidelines

A diferencia del entorno de desarrollo propuesto, se utilizarán dos servidores para la puesta en producción:

  • Un servidor donde se ejecutará el portal CKAN, de aquí en adelante denominado como servidor de aplicación.
  • Un servidor donde se alojarán las bases de datos necesarias para el funcionamiento del portal, de aquí en adelante denominado como servidor de base de datos.

Requerimientos

Aunque no existen requerimientos para el seguimiento de este tutorial, se recomienda instalar previamente CKAN en un entorno de desarrollo de modo a:

  • Disponer de un entorno para las pruebas y modificaciones que se realicen sobre el portal.
  • Adquirir experiencia con respecto a la estructura propia de CKAN.

El sistema operativo de referencia para este tutorial es Ubuntu 12.04.

Si se desea instalar CKAN en un la última versión de Ubuntu, la 14.04, existen algunos problemas ocasionados por la versión de las dependencias que se instalan. Particularmente, se esperan problemas en la configuración de:

  • solr-jetty
  • apache2

La documentación para solucionar estos problemas, y otros que puedan presentarse durante la instalación en Ubuntu 14.04, puede consultarse siguiendo este enlace: https://github.com/ckan/ckan/issues/1651

Cabe destacar que ambos servidores deben estar conectados mediante una red para el funcionamiento del entorno de producción. Cada servidor deberá tener los siguientes puertos abiertos:

  • Servidor de Base de Datos: 5432 y 8983
  • Servidor de Aplicacion: 80

La lista de puertos abiertos de cada máquina puede obtenerse utilizando el comando: nmap host, donde host es la dirección IP del servidor. Para instalar nmap ejecutar:

sudo apt-get install nmap

Instalación de CKAN

La instalación de CKAN puede llevarse a cabo de acuerdo a los pasos detallados en http://datosparaguay.org/xwiki/bin/view/CKAN_Guide/WebHome.
Sin embargo, debe considerarse que la instalación se lleva a cabo en dos servidores diferentes, por lo cual existen algunas diferencias.

1. En ambos servidores, actualizar el índice de paquetes de Ubuntu:

sudo apt-get update

2. En el servidor de aplicación, instalar las dependencias de CKAN:

sudo apt-get install python-dev libpq-dev python-pip python-virtualenv
git-core apache2 libapache2-mod-wsgi nginx postfix

3. En el servidor de aplicación, crear los directorios y el entorno virtual para CKAN:

mkdir -p ~/ckan/lib
sudo ln -s ~/ckan/lib /usr/lib/ckan
mkdir -p ~/ckan/etc
sudo ln -s ~/ckan/etc /etc/ckan

sudo mkdir -p /usr/lib/ckan/default
sudo chown `whoami` /usr/lib/ckan/default
virtualenv --no-site-packages /usr/lib/ckan/default
. /usr/lib/ckan/default/bin/activate

4. En el servidor de aplicación, instalar el paquete CKAN desde el repositorio raíz:

pip install -e 'git+https://github.com/SENATICS/ckan.git@ckan-2.2-py#egg=ckan'
pip install -r /usr/lib/ckan/default/src/ckan/requirements.txt

Observación: verificar con pip freeze si la instalación se realizó correctamente.

5. En el servidor de base de datos, instalar los paquetes necesarios:

sudo apt-get install postgresql libpq-dev solr-jetty openjdk-6-jdk

6. En el servidor de base de datos, crear un usuario ckan_default:

sudo -u postgres createuser -S -D -R -P ckan_default

7. En el servidor de base de datos, crear una base de datos ckan_default, cuyo propietario debe ser el usuario ckan_default:

sudo -u postgres createdb -O ckan\_default ckan\_default -E utf-8

Al intentar ejecutar este comando, puede ocurrir un error si la plantilla base de Postgres utiliza un encoding diferente a UTF-8. Se incluye a continuación el error que se imprime en pantalla en este caso:

perl: warning: Setting locale failed. 
perl: warning: Please check that your locale settings: 
 LANGUAGE = (unset), 
 LC_ALL = (unset), 
 LANG = "es_PY.UTF-8" 
    are supported and installed on your system. 
perl: warning: Falling back to the standard locale ("C"). 
Enter password for new role: 
Enter it again: 
aortiz@db-datosabiertos:~$ sudo -u postgres createdb -O ckan_default ckan_default -E utf-8 
perl: warning: Setting locale failed. 
perl: warning: Please check that your locale settings: 
 LANGUAGE = (unset), 
 LC_ALL = (unset), 
 LANG = "es_PY.UTF-8" 
    are supported and installed on your system. 
perl: warning: Falling back to the standard locale ("C"). 
createdb: database creation failed: ERROR:  new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII) 
HINT:  Use the same encoding as in the template database, or use template0 as template. 

Para solucionar este problema es necesario cambiar el encoding de la plantilla. Los pasos necesarios para realizar esta operación se encuentran en las siguientes guías:

http://stackoverflow.com/questions/16736891/pgerror-error-new-encoding-utf8-is-incompatible

http://desarrolla2.com/post/reparando-perl-warning-setting-locale-failed-en-ubuntu-server

8. En el servidor de base de datos, modificar el archivo /etc/postgresql/pg_version/main/pg_hba.conf, añadiendo una línea como la siguiente:

host all all IP_Cliente/MASK_Cliente md5

Donde:

  • pg_version es la versión de Postgres instalada.
  • IP_Cliente es la dirección IP del servidor de aplicación.
  • MASK_Cliente es la máscara correspondiente a la IP del servidor de aplicación.

Estos cambios permitirán al servidor de aplicación conectarse a la base de datos de CKAN.

9. En el servidor de base de datos, modificar el archivo /etc/postgresql/pg_version/main/postgresql.conf, dejando la línea delisten_addresses de la siguiente manera:

listen_addresses = '*'

10. En el servidor de aplicación, crear el archivo de configuración de CKAN:

sudo mkdir -p /etc/ckan/default
sudo chown -R 'whoami' /etc/ckan/
. /usr/lib/ckan/default/bin/activate
cd /usr/lib/ckan/default/src/ckan
paster make-config ckan /etc/ckan/default/development.ini

11. En el servidor de aplicación, editar el archivo de configuración (development.ini):

sqlalchemy.url = postgresql://ckan_default:pass@bdhost/ckan_default
ckan.site_id = default

Observación: reemplazar "pass" por la contraseña del usuario ckan_default de la base de datos postgres y "bdhost" por la dirección del servidor de base de datos.

12. En el servidor de base de datos, editar el archivo de configuración de jetty (/etc/default/jetty):

NO_START=0          # (line 4)
JETTY_HOST=0.0.0.0  # (line 15)
JETTY_PORT=8983     # (line 18)

Observación: también podría ser necesario setear la variable JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64/.

13. Iniciar el servicio Jetty:

sudo service jetty start

**14.**En el servidor de base de datos, comprobar que se instaló correctamente yendo a: http://localhost:8983/solr/, allí debería abrirse la página de bienvenida de Solr.

15. En el servidor de base de datos, reemplazar el archivo schema.xml que viene por defecto por el archivo incluido en la instalación de CKAN. Previamente, renombrar el archivo original de Solr para conservarlo en caso de problemas.

sudo mv /etc/solr/conf/schema.xml /etc/solr/conf/schema.xml.bak

A continuación, crear un nuevo archivo /etc/solr/conf/schema.xml con el esquema de CKAN. Como el archivo de CKAN se encuentra en otro servidor, puede copiarse por la red o directamente puede obtenerse en: https://github.com/ckan/ckan/blob/release-v2.2/ckan/config/solr/schema.xml

Atención: Al no utilizarse un enlace simbólico para el esquema de CKAN, por encontrarse el archivo original en otro servidor, es necesario actualizar este archivo manualmente en caso de actualizar la versión de CKAN.

16. En el servidor de base de datos, reiniciar el servicio jetty:

sudo service jetty restart

17. En el servidor de aplicación, cambiar la url de Solr en el archivo de configuración de CKAN (development.ini):

solr_url=http://dbhost:8983/solr

Donde dbhost es la dirección IP del servidor de base de datos.

18. En el servidor de aplicación, ejecutar el script para inicializar la base de datos de CKAN y crear enlace a who.ini:

cd /usr/lib/ckan/default/src/ckan
paster db init -c /etc/ckan/default/development.ini

ln -s /usr/lib/ckan/default/src/ckan/who.ini /etc/ckan/default/who.ini

19. Iniciar el servicio que levantará el sitio CKAN:

cd /usr/lib/ckan/default/src/ckan
paster serve /etc/ckan/default/development.ini

20. Ir a el sitio CKAN: http://localhost:5000/

Si la instalación fue completada exitosamente, podrá observarse la página inicial del portal.

Habiendo llegado hasta este punto, se cuenta con una instancia de CKAN cuya base de datos se encuentra en otro servidor. Sin embargo, CKAN aún se ejecuta utilizando un servidor de desarrollo. La siguiente sección incluye los pasos necesarios para ejecutar CKAN en un servidor de producción.

Integración con Apache y Nginx

El esquema propuesto para el servidor de aplicación es el siguiente:

  • Un servidor Apache con el módulo modwsgi habilitado en el puerto 8080, en el cual se ejecuta CKAN.
  • Un servidor Nginx que hará de proxy para el Apache, funcionando como cache.

Este esquema, y la guía para su implementación que se presenta a continuación, está basados en el siguiente artículo de la wiki de CKAN: http://ckan.readthedocs.org/en/latest/maintaining/installing/deployment.html.

El servidor de aplicación puede configurarse de acuerdo a este esquema mediante los siguientes pasos:

1. Crear el archivo de configuración production.ini, copiando el archivo de configuración de desarrollo de CKAN.

cp /etc/ckan/default/development.ini /etc/ckan/default/production.ini

2. Crear el archivo de configuración del módulo mod_wsgi para CKAN /etc/ckan/default/apache.wsgi, con el siguiente contenido:

import os
activate_this = os.path.join('/usr/lib/ckan/default/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

from paste.deploy import loadapp
config_filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'production.ini')
from paste.script.util.logging_config import fileConfig
fileConfig(config_filepath)
application = loadapp('config:%s' % config_filepath)

El módulo mod_wsgi de Apache permite ejecutar aplicaciones web Python en el servidor Apache. Para más información acerca de mod_wsgi, se recomienda consultar:

https://code.google.com/p/modwsgi/wiki/InstallationInstructions

3. Crear el archivo de configuración para CKAN en el directorio de sitios de Apache, /etc/apache2/sites-available/ckan_default.conf, con el siguiente contenido:

<VirtualHost 0.0.0.0:8080>
    ServerName datos.gov.py
    ServerAlias www.datos.gov.py
    WSGIScriptAlias / /etc/ckan/default/apache.wsgi

    # Pass authorization info on (needed for rest api).
    WSGIPassAuthorization On

    # Deploy as a daemon (avoids conflicts between CKAN instances).
    WSGIDaemonProcess ckan_default display-name=ckan_default processes=2 threads=15

    WSGIProcessGroup ckan_default

    ErrorLog /var/log/apache2/ckan_default.error.log
    CustomLog /var/log/apache2/ckan_default.custom.log combined
</VirtualHost>

En caso de utilizar Ubuntu 14.04, debido a cambios en la actualización de Apache a la versión 2.4, se deben agregar las siguientes líneas al final del mismo archivo:

<Directory /etc/ckan/default/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

4. Modificar el archivo de configuración de Apache /etc/apache2/ports.conf, cambiando las líneas correspondientes a los puertos donde escucha el servidor. Estas líneas deben quedar de la siguiente manera:

NameVirtualHost *:8080
Listen 8080

Con esto, el servidor Apache pasará a escuchar en el puerto 8080, como se había definido previamente.

5. Crear el archivo de configuración del servidor Nginx /etc/nginx/sites-available/ckan_default, con el siguiente contenido:

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache:30m max_size=250m;
proxy_temp_path /tmp/nginx_proxy 1 2;

server {
    server_name datos.gov.py www.datos.gov.py 127.0.0.1;
    client_max_body_size 100M;
    location / {
        proxy_pass http://datos.gov.py:8080/;
        proxy_set_header Host $host;
        proxy_cache cache;
        proxy_cache_bypass $cookie_auth_tkt;
        proxy_no_cache $cookie_auth_tkt;
        proxy_cache_valid 30m;
        proxy_cache_key $host$scheme$proxy_host$request_uri;
        # In emergency comment out line to force caching
        # proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
    }

}

Este archivo de configuración establece un proxy a modo de cache utilizando el servidor Nginx. Para más información acerca de Nginx y su configuración, se recomienda consultar: http://wiki.nginx.org/Configuration.

6. Habilitar CKAN en ambos servidores:

sudo a2ensite ckan_default
sudo ln -s /etc/nginx/sites-available/ckan_default /etc/nginx/sites-enabled/ckan_default
sudo service apache2 reload
sudo service nginx reload

Una vez habilitado el sitio, la página inicial de CKAN debe visualizarse al visitar el dominio configurado en Apache, en este caso datos.gov.py.

Integración del CKAN Filestore

El Filestore de CKAN permite a los usuarios subir archivos locales como recursos al portal. Estos archivos se almacenan en el servidor de aplicación. Para más información sobre el Filestore, se recomienda consultar: http://docs.ckan.org/en/latest/maintaining/filestore.html. El Filestore puede configurarse mediante los siguientes pasos:

1. Crear el directorio donde se almacenarán los archivos añadidos por los usuarios:

sudo mkdir -p /var/lib/ckan/default

2. Modificar el archivo de configuración de CKAN, production.ini, añadiendo la siguiente línea:

ckan.storage_path = /var/lib/ckan/default

3. Modificar los permisos del directorio donde se almacenarán los archivos, otorgando permisos de escritura al usuario del sistema con el cual se ejecuta CKAN:

sudo chown www-data /var/lib/ckan/default
sudo chmod u+rwx /var/lib/ckan/default

4. Reiniciar el servidor Apache para que los cambios sean efectivos:

sudo service apache2 reload

Integración del CKAN Datastore

El Datastore de CKAN permite guardar la información estructurada de los datasets almacenados en CKAN en una base de datos Postgres. Con el Datastore habilitado, el portal CKAN:

  • Expone automáticamente una API de búsqueda y actualización de los datos almacenados en el Datastore.
  • Permite previsualizar los datos en la página del recurso correspondiente.

Para más información acerca del CKAN Datastore, se recomienda consultar: http://docs.ckan.org/en/latest/maintaining/datastore.html. El Datastore de CKAN puede habilitarse a través de los siguientes pasos:

1. En el servidor de aplicación, editar el archivo de configuración de CKAN, production.ini, añadiendo el Datastore a la lista de plugins habilitados:

ckan.plugins = <otros plugins> datastore

2. En el servidor de base de datos, crear un usuario de base de datos, datastore_default al cual se asignará posteriormente permisos de lectura sobre la base de datos del Datastore:

sudo -u postgres createuser -S -D -R -P -l datastore_default

3. En el servidor de base de datos, crear la base de datos del Datastore, con el usuario ckan_default como propietario:

sudo -u postgres createdb -O ckan_default datastore_default -E utf-8

4. En el servidor de aplicación, configurar las credenciales de acceso a la base de datos del Datastore en el archivo de configuración de CKAN, production.ini. Las cuentas de lectura y de escritura se configuran por separado por motivos de seguridad. Se añaden las siguientes líneas:

ckan.datastore.write_url = postgresql://ckan_default:pass@dbhost/datastore_default
ckan.datastore.read_url = postgresql://datastore_default:pass@dbhost/datastore_default

Donde:

  • dbhost es la dirección del servidor de base de datos.
  • pass es la contraseña de cada usuario.

5. Es necesario establecer los permisos correspondientes a cada usuario sobre la base de datos del Datastore. Para esto, copiar el directorio /usr/lib/ckan/default/src/ckan/ckanext/datastore/bin desde el servidor de aplicación al servidor de base de datos. A continuación, desde este directorio en el servidor de base de datos, ejecutar el siguiente comando:

python datastore_setup.py ckan_default datastore_default ckan_default ckan_default datastore_default -p postgres

6. En el servidor de aplicación, reiniciar Apache para que los cambios sean efectivos:

sudo service apache2 reload

7. Una vez completados estos pasos, se habrá instalado el Datastore de CKAN. Para probar la configuración, en el servidor de aplicación, ejecutar el siguiente comando:

curl -X GET "http://127.0.0.1/api/3/action/datastore_search?resource_id=_table_metadata"

El resultado esperado es un objeto JSON con errores, el cual confirma el funcionamiento adecuado del Datastore.

Integración con el Datapusher

Por defecto, el único modo de añadir datos al Datastore es a través de la API REST que expone CKAN. El Datapusher es un servicio que permite cargar al Datastore automáticamente los documentos añadidos en el portal CKAN. Para más información acerca del Datapusher, se recomienda consultar: http://docs.ckan.org/projects/datapusher/en/latest/.

El Datapusher puede instalarse mediante los siguientes pasos en el servidor de aplicación:

1. Instalar las dependencias del Datapusher:

sudo apt-get install python-dev python-virtualenv build-essential libxslt1-dev libxml2-dev git

2. Crear un virtualenv para el Datapusher:

sudo virtualenv /usr/lib/ckan/datapusher

3. Crear un directorio para el Datapusher e ingresar al mismo:

sudo mkdir /usr/lib/ckan/datapusher/src
cd /usr/lib/ckan/datapusher/src

4. Clonar el repositorio del Datapusher:

sudo git clone -b stable https://github.com/ckan/datapusher.git

5. Instalar el Datapusher y sus requerimientos:

cd datapusher
sudo /usr/lib/ckan/datapusher/bin/pip install -r requirements.txt
sudo /usr/lib/ckan/datapusher/bin/python setup.py develop

6. Copiar el archivo de configuración del Datapusher al directorio de los sitios de Apache:

sudo cp deployment/datapusher /etc/apache2/sites-available/

En caso de utilizar Ubuntu 14.04, debido a cambios en la versión 2.4 de Apache, es necesario añadirle la extensión .conf al archivo copiado:

sudo mv /etc/apache2/sites-available/datapusher /etc/apache2/sites-available/datapusher.conf

Además, solo si se utiliza Ubuntu 14.04, deben añadirse al mismo archivo las siguientes líneas:

<Directory /etc/ckan/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

7. Copiar el archivo de configuración del módulo WSGI para el Datapusher al directorio correspondiente:

sudo cp deployment/datapusher.wsgi /etc/ckan/

8. Copiar el archivo de configuraciones del Datapusher:

sudo cp deployment/datapusher_settings.py /etc/ckan/

9. Habilitar el puerto 8800 de Apache para el Datapusher:

sudo sh -c 'echo "NameVirtualHost *:8800" >> /etc/apache2/ports.conf'
sudo sh -c 'echo "Listen 8800" >> /etc/apache2/ports.conf'

10. Habitar el Datapusher entre los sitios de Apache:

sudo a2ensite datapusher

11. Añadir la siguiente línea al archivo de configuración de CKAN, /etc/ckan/default/production.ini:

ckan.datapusher.url = http://0.0.0.0:8800/

12. En el mismo archivo, configurar el valor de la propiedad ckan.site_url:

ckan.site_url = http://datos.gov.py

13. En el mismo archivo, incluir al Datapusher entre la lista de plugins habilitados del portal CKAN:

ckan.plugins = <otros plugins> datapusher

14. Reiniciar el servidor Apache para hacer efectivos los cambios:

sudo service apache2 restart

15. Para probar si el Datapusher está funcionando, ejecutar el siguiente comando:

curl 0.0.0.0:8800

El resultado esperado es similar al siguiente objeto JSON:

{
"help": "\n        Get help at:\n        http://ckan-service-provider.readthedocs.org/."
}