El objetivo del TP es desarrollar una aplicación que sirva para realizar una compra de un producto entre varias personas. Ver enunciado
Es posible acceder a través del sitio web o el bot de Telegram.
- Backend: Java 21, Spring Boot 3.2.4, Maven 3
- Frontend: Node 18, Next.js 14.2.3 w/React 18
- Telegram: Serverless Framework 4.1.6
- Bases de Datos: MongoDB 7.0 y Upstash (Redis)
Para correr un s3 bucket en local, se puede utilizar la imagen de MinIO que se
encuentra en el archivo compose.yml
:
docker compose up -d s3
Luego, se puede acceder a la consola de MinIO en http://localhost:9001/ con las
credenciales configuradas en el archivo .env
.
El backend depende de contar con ambos base de datos y s3 corriendo en local, por lo que es necesario levantar ambos servicios con:
docker compose up -d mongo s3
Ahora sí, para correr la aplicación en local se debe ejecutar el método main de
la clase Grupo1Application
. Y con esto ya vamos a tener el backend corriendo
en http://localhost:8080/
Dicho backend se puede probar a través de la colección de Postman que se
encuentra en la carpeta docs
del proyecto.
El frontend depende del backend, la base de datos y el s3 para correr en local:
docker compose up -d mongo s3 backend
Una vez hecho esto, simplemente ejecutamos el comando:
npm run dev
Y ya vamos a tener la aplicación corriendo en http://localhost:3000/
El proyecto cuenta con un archivo compose.yml
que permite correr la
aplicación en varios contenedores de Docker, uno para el backend, otro para el
backend-for-frontend, uno para la base de datos y otro para el s3 bucket.
Para correr la aplicación, primero hay que configurar las variables de entorno
creando un archivo .env
en la raíz del proyecto basándose en el archivo
env.example
.
Luego, simplemente debemos ejecutar el siguiente comando en el directorio raíz del proyecto:
docker compose up
Una vez que la aplicación esté corriendo, se podrá corroborar que el backend está funcionando correctamente accediendo a http://localhost:8080/health
Además, dicho healthcheck se encuentra configurado en el docker compose file para esperar a que el backend esté listo antes de levantar el frontend, el cual se puede acceder en http://localhost:3000/
Los archivos Dockerfile
se encuentran en la raíz de ambos proyectos (frontend
y backend) y contienen las instrucciones necesarias para construir las imágenes
de docker de ambas aplicaciones.
En la primera capa del Dockerfile
se utilizan las dependencias de desarrollo
para poder construir la aplicación.
Luego, en la segunda capa, se utilizan únicamente las dependencias de ejecución además de los archivos generados en la capa anterior. Esta capa corre la aplicación en modo no-root, para evitar problemas de seguridad.
Para automatizar el despliegue del backend, contamos con una GitHub Action para construir y subir la imagen de Docker a DigitalOcean Container Registry.
Es necesario proveer las siguientes variables antes de ejecutar el pipeline:
registry
: Nombre del registry de DigitalOceantoken
: API Token de DigitalOcean
En segundo lugar, debemos contar con un R2 Object Storage creado y extraer la siguiente información:
- Account ID y Bucket Name: que servirán para construir la URL hacia el bucket.
- Access Key ID y Secret Access Key: ambos servirán para conectarse al bucket utilizando la API de AWS S3 (la cual es compatible con Cloudflare R2).
- Public Domain: dominio público para acceder a las imágenes guardadas en el bucket desde Internet. Podemos generar un R2.dev subdomain de forma gratuita a modo de prueba.
Para desplegar la aplicación en los distintos proveedores cloud, se utilizó
Terraform. Los directorios db
, backend
y frontend
contienen los módulos
necesarios para desplegar la base de datos, el backend y el frontend
respectivamente.
Lo único que se necesita desplegar a mano es el Cloudflare R2, el cual se debe configurar manualmente en la consola de Cloudflare.
Para desplegar la aplicación en cada uno de los proveedores primero vamos a
configurar todas las variables definidas en el archivo variables.tf
. Para
ello, podemos elegir una de las siguientes dos opciones:
- Guardarlas en un archivo
terraform.tfvars
dentro de la raíz del repositorio, basándonos en el archivoexample.tfvars
. - Configurar variables de entorno agregando el prefijo
TF_VAR_
a cada variable, por ejemplo:var.example
->TF_VAR_example
.
Una vez configuradas todas las variables listadas, vamos a inicializar Terraform:
terraform init
Por último, vamos a aplicar los cambios:
terraform apply
Terraform nos imprimirá todos los recursos que serán creados, y una vez
ingresemos yes
los creará y guardará su estado en un archivo
terraform.tfstate
. Este archivo tiene información sensible en texto
plano, por lo que no debe ser pusheado al repositorio.
En caso de que queramos destruir la infraestructura, simplemente debemos ejecutar el siguiente comando:
terraform destroy
Y en base al contenido de terraform.tfstate
eliminará todos los recursos que
tengamos levantados.
Por último, el Bot de Telegram es un webhook que se despliega a través de la CLI de Serverless Framework. Las instrucciones están en la carpeta telegram.
El bot consume el backend y las credenciales SSM desplegadas previamente con Terraform, por lo que no es necesario agregar ninguna configuración adicional.
Apellido y Nombre | GitHub |
---|---|
Álvarez, Damián | @Damuchi99 |
Galli, Patricio | @Patricio-Galli |
Lingeri, Martín | @MartinLingeri |
Pesce, Franco | @fpesce27 |
Ranieri, Agustín | @RaniAgus |
Nota: 10