Desarrollo
Indice
Instalar un nuevo requerimiento en la imagen base
Si necesitamos instalar y configurar un nuevo requerimiento para andino, lo recomendable es instalarlo en la imagen de datosgobar/portal-base. Esto permitirá mantener el build de datosgobar/portal-andino más pequeño y rápido.
Para ejemplificar esto, supondremos que queremos levantar los workers de RQ usando supervisor. Esta implementación, presente en ckan 2.7, require levantar supervisor con una configuración especial para levantar los workers.
Instalar nuevo requerimiento
Para instalar supervisor
en el portal base, podemos hacer uso de la tarea de ansible
encargada de instalar los
requerimientos para la aplicación. A la fecha, este código se encuentra en
dependencies.yml
La parte que instala los requerimientos quedaría así:
- name: Install dependencies apt: name: "{{ item }}" state: present with_items: - libevent-dev # Otras dependencias - gettext - supervisor
Al agregar supervisor
, éste será instalado cuando la generación de la imagen termine.
Ahora, lo siguiente sólo sería agregar la configuración para levantar las colas de rq,
con la configuración que trae ckan.
Configuración
El mejor punto para agregar esta configuración es en el archivo
configure.yml
.
El mismo es utilizado después de que ckan es instalado, por lo que el archivo de configuración ya está
presente en el sistema.
Para eso, añadiremos una tarea más de ansible, usaremos el módulo copy
.
Al final de configure.yml
, agregaremos algo como:
# Otras tareas - name: Copy supervisor configuration copy: src: /usr/lib/ckan/default/src/ckan/ckan/config/supervisor-ckan-worker.conf dest: /etc/supervisor/conf.d/ remote_src: yes
Configuración propia
Algo que podríamos desear es tener nuestra propia configuración de supervisor, que se basa en la que nos
provee ckan. Para esto, copiamos el archivo supervisor-ckan-worker.conf
desde dentro del contenedor y
lo colocamos al lado de production.ini.j2
, dentro del directorio templates/ckan
.
Luego, cambiamos la tarea de ansible para que copie nuestro archivo:
# Otras tareas - name: Copy supervisor configuration copy: src: ckan/supervisor-ckan-worker.conf dest: /etc/supervisor/conf.d/
Inicio automático
Para lograr que supervisor se inicie automátiamente cada vez que se levante el portal,
debemos correr service supervisor restart
mientras esta se levanta, en "runtime". El mejor lugar para esto
es el script que se corre por defecto: start_ckan.sh.j2
.
En este script, agregamos los comandos que queremos antes de que la aplicación sea iniciada:
# otros comandos ... echo "Iniciando Supervisor" service supervisor restart service apache2 stop exec {{ CKAN_INIT }}/run_andino.sh
Generación del nuevo contenedor
Ahora, para probar estos cambios, generamos una nueva imagen de datosgobar/portal-base
:
base_image="datosgobar/portal-base:test" cd portal-base/; docker build base_portal -t "$base_image";
Esto generará una imagen con el tag (o nombre) "datosgobar/portal-base:test".
Para hacer una prueba rápida, podemos correr:
docker run --rm -it datosgobar/portal-base:test supervisord -n
Este comando iniciará un contenedor con supervisor corriendo. Deberíamos ver en consola los
siguiente mensajes (podemos salir del contenedor usando Ctrl+c
):
2018-06-22 18:55:46,593 CRIT Supervisor running as root (no user in config file) 2018-06-22 18:55:46,593 WARN Included extra file "/etc/supervisor/conf.d/supervisor-ckan-worker.conf" during parsing 2018-06-22 18:55:46,615 INFO RPC interface 'supervisor' initialized
Para probar esto directamente en el contenedor de portl-andino
, debemos
generar una nueva imagen del contenedor en base a la imagen del portal base.
Para esto, en el archivo Dockerfile
del portal, cambiamos el FROM
, utilizando la
imagen temporal que acabamos de crear:
FROM datosgobar/portal-base:test # ... otros comandos
Ahora, generamos la nueva imagen:
cd portal-andino/ docker build -t portal-andino:test .
Luego, iniciamos la aplicación en modo desarrollo:
cd portal-andino/ ./dev.sh setup;
Una vez iniciada la aplicación, entramos al contenedor y verificamos que supervisor esté corriendo:
cd portal-andino/ ./dev.sh console # Una vez en el contenedor supervisorctl
En este momento, deberíamos ver el estado de supervisor. Para salir, usamos Ctrl + C
.
Si comprobamos que el nuevo requerimiento está instalado y configurado, volvemos el Dockerfile
a su estado anterior (deshaciendo el cambio en el FROM
).
Luego, debemos sacar una nueva imagen del portal-base y, finalmente, una nueva de portal-andino
que se base en la anterior.
Probar modificaciones y nuevas funcionalidades
Para una mayor facilidad a la hora de desarrollar existe un archivo dev.sh
, el cual contiene los siguientes comandos:
install Instalar una instancia de Andino usando configuraciones específicas (usar '-h' para ver cuáles existen y para qué sirven) update Actualizar una instancia de Andino usando configuraciones específicas (idem install) exec Ejecutar el comando especificado en el contenedor de Andino logs Mostrar y seguir log del contenedor especificado (default: Andino) serve Usar un servidor de paster para debuguear fácilmente la aplicación en el puerto 5000 up Levantar los servicios stop Parar los servicios down Borrar los contenedores, sus volúmenes, y el directorio de instalación
Instalando Andino
Se utilizará el archivo dev.sh
de portal-andino ejecutando la función install
, la cual permite levantar una
instancia en base a los parámetros recibidos. Dicha función puede ser usada para testear cambios en portal-andino,
portal-andino-theme, y/o portal-base.
Los parámetros a utilizar son:
-h | --help mostrar ayuda -a | --andino_branch VALUE nombre del branch de portal-andino (default: master) -t | --theme_branch VALUE nombre del branch de portal-andino-theme (default: master o el ya utilizado) -b | --base_branch VALUE nombre del branch de portal-base --site_host VALUE nombre de dominio del portal (default: localhost) --nginx_host_port VALUE puerto a usar para HTTP --nginx_ssl activar la configuración de SSL --nginx_ssl_port VALUE puerto a usar para HTTPS --ssl_key_path VALUE path a la clave privada del certificado SSL --ssl_crt_path VALUE path al certificado SSL --nginx-extended-cache activar la configuración de caché extendida de Nginx --file_size_limit VALUE tamanio máximo en MB para archivos de recursos (default: 300, máximo recomendado: 1024) --theme_volume_src VALUE path del host donde se encuentra clonado portal-andino-theme para crear un volumen (default: /dev/null para no usar un theme)
Todos los parámetros son opcionales. Para portal-andino y portal-andino-theme, el branch a utilizar, por default, será master en ambos casos. Para portal-base, se defaulteará a la versión que figure en el Dockerfile de portal-andino.
Nota: Si se utiliza el nombre 'localhost' para la variable site_host
, es posible que ocurra un error al intentar
subir un archivo perteneciente a un recurso al Datastore: Error: Proceso completo pero no se pudo enviar a
result_url.
Para evitar este problema, se puede utilizar un hostname local diferente; seguir los siguientes pasos para utilizar uno
nuevo:
* Ejecutar vi /etc/hosts
en el host
* Puede existir la línea 127.0.0.1 localhost
, y también otras parecidas; hay que escribir una nueva (es
necesario asegurarse de que la IP y el hostname de la que queremos escribir sean distintos a todos los anteriores).
* Escribir una línea nueva 127.0.X.1 nuevo_hostname
, reemplazando la 'X' por algún número que no esté en una de las
IPs de arriba, y 'nuevo_hostname' por el que se quiera utilizar_
Actualizando Andino
Para el mismo archivo, también existe una función update
, cuyo objetivo es actualizar una instancia
ya levantada.
Los parámetros que recibe son exactamente los mismos que para la función de instalación.
Nota: si se desea mantener la configuración de SSL y/o de la caché extendida, es necesario especificarlo utilizando los parámetros correspondientes. No ocurre lo mismo para los archivos del certificado, puesto que son persistidos al instalar Andino.
Utilizar una imagen custom de portal-base o portal-base-nginx
Si se quiere utilizar una imagen local en lugar de las existentes en https://hub.docker.com/r/datosgobar/portal-base, se debe correr este comando en el directorio donde se encuentra portal-base:
docker build base_portal -t datosgobar/portal-base:{nombre que se le quiera dar a la imagen}
Lo mismo aplica para Nginx: recordar que su Dockerfile está en nginx/
, por lo que el comando se debe correr ahí.
Debugear Andino
Para una instancia de Andino, se puede utilizar el comando ./dev.sh serve
, el cual utiliza un servidor de paster que
nos permite debuguear fácilmente, ya que apache no lo permite. Durante la ejecución de este comando, la aplicación
estará utilizando el puerto 5000.