- Daniel Charua - A01017419 - CSF
- Roberto Alejandro Gutiérrez Guillén - A01019608 - CSF
- Eduardo Badillo Álvarez - A01020716 - CSF
- Sergio Hernandez Castillo - A01025210 - CSF
Las orientaciones del proyecto se encuentran disponibles en la plataforma Canvas.
Este documento es una guía sobre qué información debe entregar como parte del proyecto, qué requerimientos técnicos debe cumplir y la estructura que debe seguir para organizar su entrega.
A continuación se mencionan los requerimientos técnicos mínimos del proyecto, favor de tenerlos presente para que cumpla con todos.
- El equipo tiene la libertad de elegir las tecnologías de desarrollo a utilizar en el proyecto, sin embargo, debe tener presente que la solución final se deberá ejecutar en una plataforma en la nube. Puede ser Google Cloud Platform, Azure o AWS.
- El proyecto debe utilizar al menos dos modelos de bases de datos diferentes, de los estudiados en el curso.
- La solución debe utilizar una arquitectura de microservicios. Si no tiene conocimiento sobre este tema, le recomiendo la lectura Microservices de Martin Fowler.
- La arquitectura debe ser modular, escalable, con redundancia y alta disponibilidad.
- La arquitectura deberá estar separada claramente por capas (frontend, backend, API RESTful, datos y almacenamiento).
- Los diferentes componentes del proyecto (frontend, backend, API RESTful, bases de datos, entre otros) deberán ejecutarse sobre contenedores Docker y utilizar Kubernetes como orquestador.
- Todo el código, datasets y la documentación del proyecto debe alojarse en este repositorio de GitHub siguiendo la estructura que aparece a continuación.
El proyecto debe seguir la siguiente estructura de carpetas:
- / # Raíz de todo el proyecto
- README.md # Archivo con los datos del proyecto (este archivo)
- frontend # Carpeta con la solución del frontend (Web app)
- backend # Carpeta con la solución del backend (CMS)
- api # Carpeta con la solución de la API
- datasets # Carpeta con los datasets y recursos utilizados (csv, json, audio, videos, entre otros)
- dbs # Carpeta con los modelos, catálogos y scripts necesarios para generar las bases de datos
- docs # Carpeta con la documentación del proyecto
- stage_f # Documentos de la entrega final
- manuals # Manuales y guías
Como parte de la entrega final del proyecto, se debe incluir la siguiente información:
- Justificación de los modelo de bases de datos que seleccionaron.
- Descripción del o los datasets y las fuentes de información utilizadas.
- Guía de configuración, instalación y despliegue de la solución en la plataforma en la nube seleccionada.
- Documentación de la API. Puede ver un ejemplo en Swagger.
- El código debe estar documentado siguiendo los estándares definidos para el lenguaje de programación seleccionado.
Nuestro proyecto consiste en el desarrollo de una aplicación web para cargar datos, monitorear, analizar y registrar casos de COVID-19.
A continuación aparecen descritos los diferentes elementos que forman parte de la solución del proyecto.
Los modelos de bases de datos utilizados son los siguientes:
Una base de datos NoSQL basada en documentos, para registrar los casos de Covid-19.
Utilizamos MongoDB por la facilidad de uso del framework de agregación cuando se realizan consultas y por su servicio acccesible de hosting de la base de datos en Mongo Atlas.
El JSON Schema de la base de datos se encuentra en el folder "database".
El patrón de modelación de nuestra base de datos es referencial. Es decir, en vez de embeber subdocumentos como parte de una colección para denotar relación se guardan referencias en los documentos a documentos en otras colecciones.
- La colección Cases guarda una relación referencial con Businesses 1:1 (Businesses._id)<->(Cases._id)
- La colección Cases guarda una relación referencial con Locations 1:1 (Cases._id)<->(Locations._id)
- La colección Cases guarda una relacion referencial con si misma 1:N Vector(closestFriends[])*->(Cases._id)
- La colección Businesses guarda una relación referencial con si misma 1:N Vector(suppliers[])*->(Businesses._id)
Una base de datos NoSQL basada en el esquema llave-valor, para gestionar las sesiones de usuario en la aplicación.
Utilizamos Redis por el manejo nativo de expiración de los registros, al ser automatizada la duración de sesión de los usuarios se evita tener que desarrollar ese funcionamiento a nivel aplicación.
El dataset fue producido en una aplicación de generación de datos JSON con el propósito de almacenar una cantidad realista de gente probada por COVID-19 (aproximadamente diez millones de casos).
Los campos del dataset son los siguientes:
- Nombre
- Apellidos
- Edad
- Sexo
- Confirmado
- Coordenadas
- Lista de amigos
- Lista de amigos recientemente visitados
Para la generación de gráficas utilizamos una API que utiliza un repositorio oficial del conteo de cifras para poder desplegar datos fidedignos.
Los dos modelos de bases de datos se están ejecutando en servidores externos, respectivamente Atlas y Redis-labs.
La base de datos de Mongo esta configurada como una arquitectura de desarrollo. Es decir, consiste de un solo replica set de 3 nodos y otro replica set de configuración.
La base de datos de Redis está configurada como la arquitectura default de alta disponibilidad de Redis. Es decir, consiste de un cluster con un nodo maestro y nodos esclavos para proveer redundancia mediante replicación.
El modelo siguiente muestra las interacciones de los dos microservicios expuestos anteriormente integrados con el microservicio de carga de csvs, el microservicio front de QR Code y el API externo para consultar las cifras oficiales de Covid-19.
El frontend para este proyecto está directamente basado del frontend que se creó para la Tarea 3 de esta materia. Entonces, este frontend también fue diseñado en Angular.
El front también ofrece unos modulos de operaciones de visualización básicas para el usuario:
- Ver datos reales a nivel global con la api covid.
- Registrarse a la aplicación.
- Ingresar a la aplicación.
- Operaciónes CRUD en casos, negocios y localidades.
- La función de visualizar las tablas de casos, negocios y localidades.
- Cargar múltiples casos a la vez con la función de CSV.
- La función de escanear el código QR fue desarrollado con Angular y opera conjuntamente con los demás componentes del Front.
- La función de ver gráfica con datos reales de la tasa de infección en México con la api covid.
- La función de visualizar el mapa de coordenadas de los casos por Covid-19 (experimental, son ficticias).
Los lenguajes de programación utilizados para el desarrollo del frontend fueron: HTML, SCSS y TypeScript.
El framework utilizado para el desarrollo del frontend fue: Angular. Es un framework de código abierto para el desarrollo de aplicaciones web de una sola página desarrollado por Google.
Para el diseño de las pantallas botones y assets de la aplicación se utilizó Bootstrap con sus modificaciones necesarias para una mejor visualización y UI.
Aparte de Bootstrap, se utilizó HTTP module. Es un dependencia que te permite hacer peticiones http y procesarlas para que puedas ocupar la información que necesites de las bases de datos que procesa el backend y los microservicios.
El backend esta compuesto de los microservicios y APIs expuestas en el diagrama global, estos son:
- La API principal para hacer operaciónes CRUD sobre nuestra base de datos en mongo (Puerto 8081)
- Microservicio de autenticación en Node para autenticar credenciales de usuario (Puerto 3000).
- Microservicio de carga de archivos en Node para subir archivos tipo csv al sistema (Puerto 3001).
- Microservicio de noticias en Node, para desplegar noticias relacionadas con el Covid-19 (Puerto 3002).
Cada microservicio y la API están almacenados en un Docker container dentro de GCP y son orquestrados por Kubernetes.
Los lenguajes de programación utilizados para el desarrollo del backend fueron: JavaScript.
El framework utilizado fue Node-js Express para agilizar el desarrollo web de Node.
npm install express --save
Las dependencias utilizadas son los modulos que Node precisa para su integración en el desarrollo. Se instalan los modulos utilizando el package manager en el folder de node local.
npm install
Se puede ver a detalle las dependencias de node aqui.
API RESTful en Node que se conecta al cluster de Mongo Atlas para realizar todas las operaciones CRUD (Puerto 8081).
Los lenguajes de programación utilizados para el desarrollo e integración de las APIS fueron: JavaScript
El framework utilizado fue Node-js Express
- Mongoose para conectarse a MongoDB.
- body-parser
- cors
- GET : cases/getALL -> Se regresa un JSON con los primeros 100 elementos de la colección, para eficientizar el tiempo de respuesta
- PUT: cases/add -> se agrega un objeto nuevo a la colección, se espera un objeto JSON con los datos del objeto nuevo
- DELETE: cases/delete/:id -> se borra un objeto con el id en el URL de la colección
- PUT: cases/update/:id -> se edita el objeto con el id de la URL de la colección, se espera un objeto JSON con los datos del objeto
- GET : cases/unwind -> Se regresa un JSON con el resultado del query unwind
- GET : cases/geoNear -> Se regresa un JSON con el resultado del query neoNear
- GET : cases/facet -> Se regresa un JSON con el resultado del query facet
- GET : cases/graphLookup -> Se regresa un JSON con el resultado del query graphLookup
- GET : buisnesses/getALL -> Se regresa un JSON con los primeros 100 elementos de la colección, para eficientizar el tiempo de respuesta
- PUT: buisnesses/add -> se agrega un objeto nuevo a la colección, se espera un objeto JSON con los datos del objeto nuevo
- DELETE: buisnesses/delete/:id -> se borra un objeto con el id en el URL de la colección
- PUT: buisnesses/update/:id -> se edita el objeto con el id de la URL de la colección, se espera un objeto JSON con los datos del objeto
- GET : cases/lookup -> Se regresa un JSON con el resultado del query lookup
- GET : locations/getALL -> Se regresa un JSON con los primeros 100 elementos de la colección, para eficientizar el tiempo de respuesta
- PUT: locations/add -> se agrega un objeto nuevo a la colección, se espera un objeto JSON con los datos del objeto nuevo
- DELETE: locations/delete/:id -> se borra un objeto con el id en el URL de la colección
- PUT: locations/update/:id -> se edita el objeto con el id de la URL de la colección, se espera un objeto JSON con los datos del objeto
- Clonar el repositorio de GitHub
git clone https://github.com/tec-csf/tc3041-pf-primavera-2020-equipo01
- Cambiarse a la carpeta del backend del proyecto
cd tc3041-pf-primavera-2020-equipo01/api
- Instalar las dependencias de NodeJs para el backend
npm install
- Iniciar la app de la API Rest
npm start
-
Abrir otra terminal y cambiarse a la carpeta del microservicios/auth
-
Cambiarse a la carpeta del microservicios/auth
cd tc3041-pf-primavera-2020-equipo01/microservices/auth
- Instalar las dependencias de NodeJs para el backend
npm install
- Iniciar el microservicio auth en Redis
npm start
-
Abrir otra terminal y cambiarse a la carpeta del microservicios/csv
-
Cambiarse a la carpeta del backend del proyecto
cd tc3041-pf-primavera-2020-equipo01/microservices/csv
- Instalar las dependencias de NodeJs para el backend
npm install
- Iniciar el microservicio de carga de csv
npm start
- Abrir otra terminal y cambiarse a la carpeta del frontend del proyecto
cd tc3041-pf-primavera-2020-equipo01/frontend
- Instalar las dependencias de NodeJs y Angular para el frontend
npm install
- Iniciar el frontend de la aplicación.
ng serve
- Abrir el navegador en el puerto 4200 para ver la aplicación funcionando
- Entra a la consola de Google Cloud Platform (GCP)
https://console.cloud.google.com
-
Crea un proyecto en el cual se desplegará la aplicación
-
Abre la terminal de GCP
-
Dentro de la plataforma entra a Compute/Kubernetes Engine y crea un nuevo cluster
- Clonar el repositorio de github
git clone https://github.com/tec-csf/tc3041-pf-primavera-2020-equipo01
- Cambiarse a la carpeta del backend del proyecto
cd tc3041-pf-primavera-2020-equipo01/api
- Crear la imagen de la api usando el comando
docker build . --tag gcr.io/[id del proyecto de GCP]/api
- Dar push a la imagen de la api usando el comando
gcloud docker -- push gcr.io/[ID del proyecto de GCP]/api
- Crea la conexión con el cluster creado previamente
gcloud container clusters get-credentials [Nombre del cluster] --zone [Zona del cluster] --project [ID del proyecto de GCP]
- Desplegar la aplicación en el cluster
kubectl apply -f backendDeployment.yaml
- Comprobar que el pod está funcionando correctamente (El Status debe ser Running)
kubectl get pods
- Obtener la dirección IP externa y el puerto del backend-service
kubectl get service
- Clonar el repositorio de github
git clone https://github.com/tec-csf/tc3041-pf-primavera-2020-equipo01
- Cambiarse a la carpeta del backend del proyecto
cd tc3041-pf-primavera-2020-equipo01/auth
- Crear la imagen del microservicio auth usando el comando
docker build . --tag gcr.io/[id del proyecto de GCP]/auth
- Dar push a la imagen del microservicio auth usando el comando
gcloud docker -- push gcr.io/[ID del proyecto de GCP]/auth
- Desplegar la aplicación en el cluster
kubectl apply -f authMicroDeploy.yaml
- Comprobar que el pod está funcionando correctamente (El Status debe ser Running)
kubectl get pods
- Obtener la dirección IP externa y el puerto del backend-service
kubectl get service
- Clonar el repositorio de github
git clone https://github.com/tec-csf/tc3041-pf-primavera-2020-equipo01
- Cambiarse a la carpeta del backend del proyecto
cd tc3041-pf-primavera-2020-equipo01/csv
- Crear la imagen del microservicio csv usando el comando
docker build . --tag gcr.io/[id del proyecto de GCP]/csv
- Dar push a la imagen del microservicio csv usando el comando
gcloud docker -- push gcr.io/[ID del proyecto de GCP]/csv
- Desplegar la aplicación en el cluster
kubectl apply -f CSVmicroDeploy.yaml
- Comprobar que el pod está funcionando correctamente (El Status debe ser Running)
kubectl get pods
- Obtener la dirección IP externa y el puerto del backend-service
kubectl get service
- Cambiarse a la carpeta del frontend del proyecto
cd ../frontend
- Modificar el siguiente archivo: src/app/enviroments/enviroments.prod.ts
Cambiar la rutas de conexión con las IPS de los clusters:
route: String = 'http://[IP externa del backend-service]:[Puerto del backend-service]';
- Crear la imagen del frontend usando el comando
docker build . --tag gcr.io/[ID del proyecto de GCP]/frontexp-image
- Dar push a la imagen del frontend usando el comando
gcloud docker -- push gcr.io/[ID del proyecto de GCP]/frontexp-image
- Desplegar la aplicación en el cluster
kubectl apply -f frontendDeployment.yaml
- Comprobar que el pod está funcionando correctamente (El Status debe ser Running)
kubectl get pods
- Obtener la dirección IP externa y el puerto
kubectl get service
- Acceder a la aplicación en un browser
http://[IP externa del frontend-service]:[Puerto del frontend-service]