Skip to content

SkyZeroZx/API-Sky-Krono

Repository files navigation

Nest Logo

Sky Krono API NestJS

Es el API REST para la WebAPP/PWA SkyKrono integrado con Web Authentication para el inicio de sesion passworless

Quality Gate Coverage Vulnerabilities Bugs Security Rating Code Smells Maintainability Rating Build With TypeScript Build With TypeScript

📒 Index

Comenzando 🚀

Estas instrucciones te permitirán obtener una copia del proyecto en funcionamiento en tu máquina local para propósitos de desarrollo y pruebas.

Pre-Requisitos 📋

Software requerido

NodeJS >= 14.X
NPM >= 8.X
NestJS >= 9.X
MySQL >=8.X

Software opcional

Visual Studio Code ( O el editor de su preferencia)

Instalación 🔧

Para ejecutar un entorno de desarrollo

Previamente ejecutar el comando en la terminal para descargar "node_modules" para el funcionamiento del proyecto

 npm install

Previamente a ejecutar el servidor en desarrollo configurar el archivo .env con las credenciales del servidor correos y base de datos , ejecutar :

 npm run start:dev

Dirigirse a la ruta http://localhost:3000/ donde tendra el API REST levantada

Base de Datos

El diagrama de base de datos se construyo para el proyecto se describe en la imagen

Database 1

Scripts SQL

Se tiene el archivo script.sql en la raiz del proyecto , el cual contiene los scripts de creacion de Store Procedure y Events/Jobs en MySQL

Se requiere ejecutar para el correcto funcionamiento de las tareas programadas como registro de licencias , dias libres de los trabajadores

Scripts SQL

Environment

Se tiene el archivo env.template , el cual posee un ejemplo de cada valor de las valores de entorno para poder desplegarlas en nuestro propio ambiente local o cloud

Env

Desarrollo ⚙️

Las siguientes instrucciones serviran para ejecutar en su entorno local la pruebas unitarias realizadas para el proyecto

Unit-Test

Para ejecutar todos los Unit Test desarrollados en Jest y reporte de cobertura de codigo ejecutar el comando

 npm run test:cov

La carpeta con la cobertura del codigo se creara en la raiz del proyecto con la siguiente ruta coverage/Icov-report/index.html el cual se puede visualizar

Unit Test Coverage

E2E-Test

Los test fueron desarrollados en Jest con ayuda de SuperTest realizados a la API , para validar el funcionamiento adecuado en un entorno más real

Previamente configurar los datos de pruebas en el archivo e2e-config.spec.ts de la carpeta e2e

Para ejecutar todos los E2E Test y reporte de cobertura de codigo ejecutar el comando

 npm run test:e2e:cov

E2E Test Coverage

Build

Para generar el build de producción del proyecto ejecutar el siguiente comando:

 npm run build

Despliegue 👨🏻‍💻

Para desplegar el proyecto mediante Docker tiene el archivo docker-compose.prod.yaml y la carpeta docker

Las cuales contienen los Dockerfile y dependencias necesarias para levantar el proyecto

Se dockerizo sobre un servidor de proxy inverso nginx el cual se expone en el puerto 80 por default

Para construir la imagen y ejecutarla tenemos el siguiente comando , el cual tambien tomara nuestras variable de entorno del archivo env

Ejecutar el siguiente comando en la raiz del proyecto

 docker compose  -f docker-compose.prod.yaml --env-file .env up -d --build skykronoapi nginx

Docker 1

Docker 2

En caso de requerir volver a ejecutar el contenedor del proyecto previamente creado ejecutar el mismo comando

Monitoreo

Adicionalmente en Docker posee Prometheus y Grafana para el monitorio de nuestra API

Se configuro por default el puerto 9090 para Prometheus y para Grafana se configuro el puerto 2525

DashBoard para monitoreo del API en Grafana

Grafana 1

Grafana 2

Se agrego tambien LogStash , ElasticSearch con Kibana para la ingesta y monitoreo de LOGs

Se configuro por default el puerto 5061 por default para Kibana

Para implementar el ELK se tomo el repositorio de Deaviantony Docker ELK

Se construyo un DashBoard para monitoreo de LOGs con sus status y metricas

Kibana 1

Kibana 2

Para ejecutar los contenedores referentes al monitoreo ejecutar el comando

 docker compose  -f "docker-compose.prod.yaml" up -d --build elasticsearch prometheus grafana kibana logstash setup

Previamente inicializar el API en su contenedor indicado en el apartado de despliegue con la siguiente configuración en .env

LOGSTASH_ENABLED= true
LOGSTASH_PORT= 50000
LOGSTASH_NODE_NAME= SKY_KRONO_LOG
LOGSTASH_HOST= host.docker.internal
GRAFANA_PASSWORD='changeme'
ELASTIC_VERSION=8.5.0
KIBANA_SYSTEM_PASSWORD= changeme
LOGSTASH_INTERNAL_PASSWORD= changeme
ELASTIC_PASSWORD= changeme

Si desea importar los dashboards construidos para este proyecto se encuentran en la carpeta dashboard siendo los archivos:

  • grafana-sky-krono.json para Grafana
  • kibana-sky-krono.ndjson para Kibana

Analisis de Codigo 🔩

Pre requisitos

En la raiz del proyecto se tiene el archivo sonar-project.properties el cual tiene las propiedades necesarias para ejecutarlo sobre un SonarQube

Configurar los apartados : sonar.host.url , sonar.login sonar.password con los datos de su instancia correspondiente o usar SonarCloud con su token correspondiente

Sonaqube >= 9.X

SonarQube Properties

Las pruebas fueron realizas sobre SonarQube 9.7 y SonarCloud para ejecutar el analisis de codigo ejecutar el comando para la instancia local:

npm run sonar

Reporte de Cobertura en SonarCloud

SonarQube Cloud 1

SonarQube Cloud 2

SonarQube Cloud 3

Integración Continua

Se realizo un CI con SonarCloud para ejecuta de manera automatica los test

Se creo la carpeta .github/workflows con el archivo build.yml que contiene los pasos para desplegar mediante GitHub Actions nuestro CI

CI 1

Posteriormente a la ejecución del workflow se generan los artifacts reports-e2e-test , reports-unit-test que contienen el reporte cobertura generado

CI 2

Documentacion

Se realizo la documentación del API Rest usando Swagger el cual puede encontrar en la ruta http://localhost:3000/docs/ en la configuración por default

Swagger 1

Swagger 2

Logger

Se integro winston para reemplazar el logger de NestJS para realizar seguimiento y conservacion de los logs segun sea requerido

En el archivo .env se tienen los siguientes apartados configurados por default:

APP_NAME=SKY_KRONO
DATE_PATTERN=YYYY-MM-DD
MAX_SIZE=20m
MAX_DAYS=14d

Por default la carpeta donde se guardan los logs es LOG , el formato configurado es JSON

LOGGER 1

LOGGER 2

Construido con 🛠️

Las herramientas utilizadas son:

  • NestJS - El framework para construir aplicaciones del lado del servidor eficientes, confiables y escalables.
  • NPM - Manejador de dependencias
  • Jest - Framework Testing para pruebas unitarias
  • SuperTest - Libreria para probar APIs bajo HTTP
  • Docker - Para el despliegue de aplicaciones basado en contenedores
  • Nginx - Servidor de Proxy Inverso ligero
  • Graphana - Para la creación de DashBoard interactivos
  • Prometheus - Aplicación para monitorear metricas en tiempo real
  • Kibana - Permite visualizar los datos de Elasticsearch y navegar en el Elastic Stack
  • Logstash - Procesador de datos gratuito e ingesta de logs
  • ElasticSearch - Motor de búsqueda y analítica distribuido, gratuito y abierto
  • SonarQube - Evaluacion de codigo on premise
  • SonarCloud - Evaluacion de codigo cloud
  • Visual Studio Code - Editor de Codigo
  • Prettier - Formateador de Codigo
  • WebAuthn - Estándar web del proyecto FIDO2 de la Alianza FIDO
  • TabNine - Autocompletador de Codigo
  • Swagger - Automatización de Documentación
  • Winston - Logger para NodeJS

Versionado 📌

Usamos GIT para el versionado.

Autor ✒️