Enlace: (http://20.77.40.187:3000/) Enlace a grafana: (http://20.77.40.187:9091/)
Equipo de Desarrollo
Estos son los componentes que componen la aplicación web.
- gatewayservice. Servicio Express expuesto al público que actúa como un proxy hacia los servicios subyacentes.
- userservice. Servicio Express encargado de registrar nuevos usuarios en el sistema.
- authservice. Servicio Express que se ocupa de verificar la identidad de los usuarios.
- historyservice. Servicio Express que gestiona los registros de juegos jugados por los usuarios.
- questionservice. Servicio Express que se encarga de la generación de preguntas y de realizar consultas a la API de Wikidata.
- webapp. Aplicación web desarrollada en React que interactúa con el Servicio Gateway para ofrecer funcionalidades de inicio de sesión, registro de nuevos usuarios, la posibilidad de jugar y la opción de revisar las estadísticas de juegos anteriores.
La arquitectura de la aplicación está compuesta por microservicios. Cada servicio utiliza una tabla privada en la base de datos.
Documentación: https://arquisoft.github.io/wiq_es04d/
La forma más rápida de lanzar este proyecto de ejemplo es usando docker. Solo clona el proyecto:
git clone https://github.com/Arquisoft/wiq_es04d.git
y lánzalo con docker compose:
docker compose --profile dev up --build
y detenlo con:
docker compose --profile dev down
Primero, inicia la base de datos. Instala y ejecuta Mongo o ejecútalo usando docker:
docker run -d -p 27017:27017 --name=my-mongo mongo:latest
También puedes usar servicios como Mongo Atlas para ejecutar una base de datos Mongo en la nube.
Ahora, lanza los siguientes servicios: gateway, questionservice, authservice, historyservice y userservice. Solo ve a cada directorio y ejecuta npm install
seguido de npm start
.
Por último, ve al directorio de webapp y lanza este componente con npm install
seguido de npm start
.
Después de que todos los componentes se hayan lanzado, la aplicación debería estar disponible en localhost en el puerto 3000.
Para el despliegue, tenemos varias opciones.
La primera y más flexible es desplegar en una máquina virtual usando SSH. Esto funcionará con cualquier servicio en la nube (o con nuestro propio servidor).
Otras opciones incluyen usar los servicios de contenedores que la mayoría de los servicios en la nube proporcionan. Esto significa, desplegar nuestros contenedores de Docker directamente.
Vamos a usar el primer enfoque, creando una máquina virtual en un servicio en la nube y después de instalar docker y docker-compose, desplegar nuestros contenedores allí usando GitHub Actions y SSH.
La máquina para el despliegue se puede crear en servicios como Microsoft Azure o Amazon AWS. En general, estos son los ajustes que debe tener:
- Máquina Linux con Ubuntu > 20.04.
- Docker y docker-compose instalados.
- Puertos abiertos para las aplicaciones instaladas (en este caso, puertos 3000 para la aplicación web y 8000 para el servicio de gateway).
Una vez que hayas creado la máquina virtual, puedes instalar docker y docker-compose usando las siguientes instrucciones:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
sudo usermod -aG docker ${USER}
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Una vez que tenemos nuestra máquina lista, podríamos desplegar manualmente la aplicación, llevando nuestro archivo docker-compose y ejecutándolo en la máquina remota.
En este repositorio, este proceso se hace automáticamente usando GitHub Actions. La idea es desencadenar una serie de acciones cuando se cumple alguna condición en el repositorio.
Como puedes ver, las pruebas unitarias de cada módulo y las pruebas e2e se ejecutan antes de subir las imágenes de docker y desplegarlas. Usando este enfoque evitamos desplegar versiones que no pasan las pruebas.
La acción de despliegue es la siguiente:
deploy:
name: Desplegar a través de SSH
runs-on: ubuntu-latest
needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-webapp]
steps:
- name: Desplegar a través de SSH
uses: fifsky/ssh-action@master
with:
host: ${{ secrets.DEPLOY_HOST }}
user: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
command: |
wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/docker-compose.yml -O docker-compose.yml
wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/.env -O .env
docker compose --profile prod down
docker compose --profile prod up -d --pull always
Esta acción utiliza tres secretos que deben configurarse en el repositorio:
- DEPLOY_HOST: IP de la máquina remota.
- DEPLOY_USER: usuario con permiso para ejecutar los comandos en la máquina remota.
- DEPLOY_KEY: clave para autenticar al usuario en la máquina remota.
Nota que esta acción inicia sesión en la máquina remota, descarga el archivo docker-compose del repositorio y lo lanza. Obviamente, previamente se han ejecutado acciones que han subido las imágenes de docker al repositorio de GitHub Packages.
Este es un repositorio para el curso de Arquitectura de Software en la edición 2023/2024.