Skip to content

Instantly share code, notes, and snippets.

@jacmkno
Last active March 11, 2022 14:27
Show Gist options
  • Save jacmkno/1851030403d8fd58d248aa90a3500993 to your computer and use it in GitHub Desktop.
Save jacmkno/1851030403d8fd58d248aa90a3500993 to your computer and use it in GitHub Desktop.
Readme vorisoma

Vorisoma para Paco 2.0

Sistema para análisis de Redes Criminales

Esta es una aplicación web que unifica una variedad de herramientas de usuario final para facilitar el análisis de redes criminales.

Tecnologías: PHP/MySQL

Despliegue con docker-compose:

cd docker
docker-compose up

Contenidos de este Repositorio

  1. Componentes de Código Creados por la Fundación Vortex:

    • Módulos de Drupal: Son módulos para Drupal 7 desarrollados por el contratista, que extienden la funcionalidad de Drupal para soportar funcionalidades específicamente relacionadas con el análisis de redes complejas tanto respecto a procesos de cálculo, como funcionalidades de flujo de trabajo.

      Ubicación: /sites/all/modules/custom

    • Plantillas de Drupal: Código para controlar el aspecto visual e interactivo de la plataforma.

      Ubicación:
      /sites/all/themes/paco
      /sites/all/themes/relcon

    • Librerías de PHP Independientes de Drupal: Son librerías de código que en términos generales no dependen de Drupal para su funcionamiento, y proveen funcionalidades relacionadas con procesamiento de datos, como son las Importación de archivos CSV, cálculo de estadísticas sobre espacios de trabajo o generación de códigos únicos de identificación de elementos, entre otras.

      Ubicación: /php

    • Modificaciones Menores al Core de Drupal 7: Son algunos cambios menores en el código Core de Drupal, para solucionar algunas fallas encontradas en casos de uso particulares o por incompatibilidad con versiones recientes de PHP.

    • Herramienta de Exploración Interactiva de Grafos: Provee la funcionalidad necesaria para generar las visualizaciones interactivas de las redes.

      Ubicación: /gmlgraph

    • Herramienta de despliegue mediante Docker: Provee los archivos de configuración y scripts para despliegue mediante Docker.

      Ubicación: /docker

  2. Componentes de Código Abierto:

    • Drupal 7: Sistema de Administración de contenidos que provee las funcionalidades de tipo genérico relacionadas con almacenamiento de información, control de acceso y estructuración de contenidos.
    • Librerías Complementarias: Son librerías que soportan principalmente aspectos de presentación de información en el navegador, entre las que se incluyen jQuery, Font Awesome, Bootstrap, JsonForm, D3, entre otras.
    • Módulos de la Comunidad Oficial de Drupal 7: Son módulos que complementan las funcionalidades de tipo genérico soportadas por Drupal, para aspectos como la autenticación de dos factores, funcionalidades particulares para estructuración de contenido y control de acceso entre otros.

Manual de Administración

Instrucciones y recomendaciones para la administración de la plataforma desde el punto de vista técnico de infraestructura.

Desplegar la plataforma con docker-compose y SSL:

Los siguientes requisitos son necesarios para la ejecución de estas instrucciones pero sus componentes se pueden ajustar según la infraestructura disponible.

  • Requisitos:

    1. Dominio o subdominio Público con certificado SSL.
    2. Servidor Apache Conectado al Dominio: En su lugar se puede tener un balanceador de carga o un servidor nginx, pero para estas instrucciones nos limitamos a la explicación bajo Apache. Puede ser la misma máquina de despliegue (esta fue la configuración utilizada para validar estas instrucciones). Apache en la máquina "host" debe estar adecuadamente configurado para recibir las peticiones por HTTPS.
    3. Máquina de Despliegue con Docker instalado: Los pasos se verificaron en una máquina Linux con Ubuntu 18; sin embargo, debería funcionar en cualquier máquina linux, mac o windows con una versión reciente de Docker. Para este ejemplo explicamos el despliegue sobre una máquina exclusiva en la que se ejecuta docker, aunque en su lugar se puede usar cualquier servicio de orquestación de contenedores. Para Azure Container Instances, por ejemplo, se pueden seguir estas instrucciones: https://docs.microsoft.com/en-us/azure/container-instances/tutorial-docker-compose
  • Pasos:

    1. Clonar el Repositorio.
    2. Mediante consola ubicarse en la carpeta /docker.
    3. Ejecutar el comando docker-compose up.
    4. Configurar el Apache (o balanceador) para que utilice el Contenedor como Backend. Para apache se puede utilizar el archivo de configuración de virtual host de ejemplo ubicado en /docker/sample-apache-site.conf.
    5. Reiniciar apache después de actualizar la configuración.

Desplegar la plataform en ambiente local

El puerto 8080 debe estar libre.

  1. Mediante consola ubicarse en la carpeta /docker
  2. Ingresar a "http://localhost:8080"

Arquitectura predeterminada

Consiste en dos contenedores: uno de base de datos denominado en docker-compose como mysql, y otro contenedor para procesamiento de peticiones web denominado como php.

Consideraciones:

  • El contenedor web por defecto se conecta al contenedor de base de datos que debe estar ejecutándose en la misma máquina Host. Esto debe cambiarse para producción de manera que se conecte a un servicio especializado de base datos, para lo cuál se debe modificar el archivo /docker/settings.php donde se asignará la cadena de conexión a la base de datos.
  • Los contenedores que tengan activado el argumento RUN_SCHEDULER en docker-compose serán considerados "nodos de servicio". Esto le indica al contenedor que debe realizar actividades periódicas automáticas.
  • La arquitectura se puede modificar fácilmente según las necesidades de escalabilidad

Modalidades de Escalabilidad Soportadas

Aquí mencionamos 4 modalidades de escalabilidad aplicables a la plataforma que se pueden combinar a criterio del equipo de infraestructura para optimizar el tiempo de respuesta y capacidad de la plataforma.

  1. Recursos: Escalabilidad vertical. Es el nivel básico soportado sin ningún cambio en la configuración, y se logra mediante el aumento directo en la capacidad de procesamiento, almacenamiento y memoria de los equipos asignados.
  2. Optimización de Contenedor Único: Consiste en cambiar el archivo docker/docker-boot.sh para que reemplace el archivo de configuración del módulo mpm_prefork de apache para modificar la cantidad de procesos de apache y las políticas que, para ello, se aplican a nivel el contenedor web. Esto, aún pensando en un solo contenedor web. Referencia: https://httpd.apache.org/docs/2.4/mod/prefork.html
  3. Elasticidad en Contenedores Web: Consiste en replicar el contenedor "php" según el nivel de tráfico, manteniendo un único "nodo de servicio" para el manejo de los procesos automáticos. Esto requiere configurar las carpetas de almacenamiento como un único volumen compartido entre todos los contenedores, para lo cuál es necesario modificar el archivo docker-boot.sh para realizar estas modificaciones en el contenedor, montando volúmenes compartidos en las carpetas /var/www/html/private y /var/www/html/sites/default/files del contenedor, migrando antes sus contenidos a los respectivos volúmenes compartidos.
  4. Elasticidad en Base de Datos de solo lectura: Esta modalidad consiste en mantener una cantidad elástica de bases de datos "slave" y modificar la configuración de Drupal en el archivo docker/settings.php para permitirle a Drupal utilizar estas bases de datos para algunas de las consultas. Esta modalidad es la más compleja de implementar, y requiere modificaciones medianamente complejas a la configuración.

Flujo de Procesos

Esta es una descripción de cómo interactúan los componentes de infraestructura relevantes para la plataforma.

Componentes:

  1. Nodo de Servicio: Es un contenedor web que siempre debe ser único y se encarga de realizar procesos automáticos. Además de las funciones web, descarga automáticamente archivos CSV de diferentes fuentes externas periódicamente y los importar a la plataforma. Este nodo se crea con el argumento RUN_SCHEDULER activado en docker-compose.yml.
  2. Contenedores Web: Son aquellos contenedores con la tarea específica de atención de peticiones web y vienen con el argumento RUN_SCHEDULER desactivado (false) en docker-compose.yml
  3. Base de datos: Corresponde al "endpoint" encargado de almacenar y gestionar el acceso a datos de la plataforma.
  4. Código Fuente.
  5. Carpetas Dinámicas: Son las carpetas utilizadas para almacenar archivos de los usuarios y archivos de la plataforma que cambian continuamente. En principio, son dos /private y /sites/default/files

Flujo de procesos predeterminado

Es el flujo de procesos que viene por defecto configurado en la carpeta /docker. Contiene:

  1. Un único "Nodo de Servicio" denominado "php" encargado, tanto de la atención a peticiones web como de la ejecución de procesos periódicos automáticos.
  2. Un contenedor de base de datos denominado "mysql" encargado exclusivamente de proveer una base de datos.

    ADVERTENCIA! Si se utiliza este nodo para producción es importante asegurarse de que el docker esté configurado para que el volumen asignado a este contenedor sea persistente.

  3. El código fuente y las carpetas dinámicas se encuentran simplemente en el sistema de archivos de la máquina Host y se asignan como volumen al contenedor. Es importante tener en cuenta que estos contenidos no se copian al contenedor en la configuración por defecto, lo cuál puede ser un posible inconveniente al configurar la elasticidad de contenedores web, que se soluciona simplemente copiando los archivos al contenedor en el archivo Dockerfile y quitando el volumen de docker-compose.yml.

Descripción en Pasos

  1. En el servidor host se ejecutan los contenedores "php" y "mysql".
  2. El contenedor php expone el puerto 8080 a la máquina Host.
  3. La máquina host recibe las peticiones de los usuarios en apache y las redirige al contenedor "php", de manera que apache en la máquina host actúa únicamente como forward proxy.
  4. El contenedor "mysql" no expone ningún puerto.
  5. El contenedor "php" se comunica a través de la red de docker con el contenedor "mysql".
  6. El contenedor "php" ejecuta periódicamente las actividades automáticas de importación.

Recomendaciones para despliegue inicial en producción

  1. Se recomienda iniciar con la configuración básica de un solo contenedor conectado a una base de datos externa, e iniciar con escalamiento vertical buscando llegar a un despliegue estable.
  2. Si no se logra esa estabilidad con la configuración básica, se recomienda aplicar las otras modalidades de escalabilidad en el orden especificado.
  3. Si se llega al punto estable, una vez esté operativo, se recomienda iniciar pruebas aisladas para el montaje de las modalidades de escalabilidad más complejas con un plazo más amplio de implementación, reservando la última para un proyecto posterior en caso de que se considere necesario.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment