Proyecto base para una evaluacion de DevOps con arquitectura de 3 capas:
frontend: aplicacion React para gestion de inventario y tickets.backend: API REST en Node.js + Express.bd: capa de base de datos MySQL con scripts de inicializacion.
La solucion esta pensada para un escenario "on-premise" que luego debe ser llevado a AWS con tres instancias EC2:
- EC2 Frontend en subred publica.
- EC2 Backend en subred privada.
- EC2 Base de datos en subred privada.
La separacion en carpetas busca que cada capa pueda tener su propia estrategia de contenerizacion y su propio Dockerfile.
La solucion debe separarse en tres capas independientes:
frontend: una instancia EC2 publica.backend: una instancia EC2 privada.bd: una instancia EC2 privada.
Cada carpeta representa una capa del sistema. Se espera que cada capa pueda contenerizarse de manera independiente y que la solucion final respete esta separacion al desplegarse en AWS.
Innovatech Chile necesita una aplicacion interna sencilla para:
- registrar productos de inventario.
- consultar stock disponible.
- crear tickets de soporte relacionados a productos o incidencias internas.
- actualizar estado y prioridad de tickets.
La aplicacion esta funcional pero incompleta desde el punto de vista DevOps. El equipo debe tomar esta base y prepararla para ejecucion containerizada, despliegue automatizado y operacion en AWS.
.
|-- README.md
|-- bd
| |-- .env.example
| |-- README.md
| |-- schema.sql
| `-- seed.sql
|-- backend
| |-- .env.example
| |-- package.json
| `-- src
`-- frontend
|-- .env.example
|-- index.html
|-- package.json
|-- vite.config.js
`-- src
- codigo fuente del frontend.
- codigo fuente del backend.
- carpeta
bdseparada para representar la tercera capa. - scripts SQL para crear esquema y datos iniciales.
- variables de entorno de ejemplo.
- README con guia de trabajo.
Esto queda como trabajo del estudiante:
Dockerfileparafrontend.Dockerfileparabackend.- estrategia de contenerizacion para
bd. docker-compose.yml.- workflows de GitHub Actions.
- despliegue en EC2.
- configuracion final de secretos.
- versionado Git y estrategia de ramas.
- desplegado en una EC2 publica.
- accesible por IP publica o DNS.
- consume la API del backend por variable de entorno.
- desplegado en una EC2 privada.
- no deberia quedar expuesto a Internet.
- acepta trafico solo desde frontend.
- desplegada en una EC2 privada.
- acepta conexiones solo desde backend.
- debe demostrar persistencia tras reinicio.
- listar productos.
- crear productos.
- editar nombre, categoria, stock y ubicacion.
- eliminar productos.
- marcar productos con stock bajo.
- listar tickets.
- crear tickets.
- asociar ticket a un producto opcionalmente.
- editar prioridad y estado.
- eliminar tickets.
La interfaz muestra:
- cantidad total de productos.
- cantidad total de tickets.
- cantidad de productos con stock bajo.
- cantidad de tickets abiertos.
Archivo base: frontend/.env.example
VITE_API_URL=http://localhost:3001Archivo base: backend/.env.example
PORTDB_HOSTDB_PORTDB_NAMEDB_USERDB_PASSWORDCORS_ORIGIN
Archivo base: bd/.env.example
MYSQL_DATABASEMYSQL_USERMYSQL_PASSWORDMYSQL_ROOT_PASSWORD
Crear una base de datos MySQL:
CREATE DATABASE innovatech_ops;Luego ejecutar:
cd backend
npm install
npm run devcd frontend
npm install
npm run dev- Crear un
Dockerfileparafrontend. - Crear un
Dockerfileparabackend. - Resolver la contenerizacion de
bdcomo tercera capa. - Crear
docker-compose.ymlpara levantar la solucion completa. - Definir volumenes para persistencia.
- Justificar el uso de
bind mountonamed volume. - Publicar imagenes en ECR o Docker Hub.
- Implementar GitHub Actions.
- Automatizar despliegue hacia EC2 usando la rama
deploy. - Documentar secretos, variables y pasos de operacion.
Antes de contenerizar, la dupla deberia identificar:
- que hace el frontend.
- que endpoints consume.
- que variables necesita el backend.
- como se conecta el backend a MySQL.
- que papel cumple la carpeta
bd.
Se espera que construyan:
- un
Dockerfilepara el frontend. - un
Dockerfilepara el backend. - una estrategia clara para la carpeta
bd. - un
docker-compose.ymlpara ambiente integrado.
Al menos deberian resolver:
- instalacion de dependencias.
- build del frontend.
- exposicion de puertos.
- variables de entorno.
- orden logico de servicios.
La pauta pone mucho foco aqui, asi que deberian demostrar:
- que servicio necesita persistencia.
- que volumen usaron.
- por que eligieron
bind mountonamed volume. - como comprueban que los datos permanecen tras reiniciar contenedores.
Sugerencia: para este caso, la persistencia principal deberia estar en MySQL.
La solucion final deberia respetar esta topologia:
- frontend en EC2 publica.
- backend en EC2 privada.
- base de datos en EC2 privada.
Y ademas demostrar:
- que el frontend accede al backend.
- que el backend accede a MySQL.
- que el frontend no accede directamente a la base de datos.
Cada componente que corresponda debe automatizar:
- build de imagen.
- push a registry.
- deploy en la EC2 correspondiente.
El trigger esperado por la pauta es un push sobre la rama deploy.
- aplicacion funcional en navegador.
- backend funcional con conexion real a MySQL.
- separacion visible entre
frontend,backendybd. - Dockerfiles presentes y documentados.
docker-compose.ymlfuncional.- persistencia demostrable.
- workflow de GitHub Actions implementado.
- uso de secrets para credenciales.
- despliegue hacia EC2 automatizado.
- README claro y suficiente para reproducir el flujo.
Para considerar la solucion completa, la dupla debe demostrar:
- frontend funcionando desde la EC2 publica.
- backend funcionando en EC2 privada y respondiendo al frontend.
- base de datos funcionando en EC2 privada.
- persistencia de datos tras reiniciar contenedores.
- despliegue automatizado mediante GitHub Actions.
Conviene pedir que muestren:
- estructura del proyecto con tres carpetas.
- Dockerfiles y
docker-compose.yml. - volumenes configurados.
- workflow de GitHub Actions.
- push a rama
deploy. - estado de contenedores en EC2.
- prueba funcional desde navegador.
- evidencia de persistencia.