Buenas chavales/as!
Me gustaría compartir con vosotros un diario de desarrollo de una app que estamos haciendo un colega y yo en nuestros ratos libres (después del curro) y que ya hemos empezado. El proyecto es completamente open source y por ahora no tenemos ninguna intención de hacerlo close source o cualquier gitanada. Sin más os presento el proyecto.
* STACK *
Las tecnologías que hemos usado son las siguientes para el backend:
- Java 14
- Spring Boot 2.3.0
Para el frontend:
- Angular 9
Infraestructura:
- VPS en OVH con 2 vCPU
- Mongo 4.2
- Nginx como load balancer, también lo usamos para el SSL termination (con cert de Let's Encrypt of course)
- GitHub actions para Continuous Integration, Continuous Delivery y Continuous Deployment con un poquito de bash.
- Maven como build tool, con el generamos los artifacts deployeables
- Docker solo para testing
* ARCH *
La arquitectura del proyecto es bien sencilla, una SPA servida por el backend de Spring en formato monolito (desplegando un único artifact), conectada con un MongoDB con el legacy driver (espero poder cambiar esto a reactivo en los próximos días). Todo montado en un único nodo y por ahora seguirá así ya que no creemos que esto crezca mucho.
Hemos querido seguir un approach hexagonal, aunque no estamos 100% desacoplados del framework, y estamos intentando seguir algunas reglas del DDD. Básicamente la idea principal que hemos querido implementar es que testeando los casos de uso a nivel unitario en el dominio, conseguimos que testear las otras capas sea más fácil y fiable en el caso de que queramos hacerlo con mocking.
Ahora mismo no usamos ningún tipo de approach orientado a eventos, aunque si tenemos planeado hacerlo en los próximos días.
* CI/CD *
El proceso de puesta en producción también es bastante secillo y rudimentario. Tenemos el frontend sin tests y sin linter, así que, de aquí lo único que puedo decir es que lo compilamos y lo movemos a la carpeta "resources/public" del backend para que Spring lo sirva de forma automática. En el backend tenemos unos pocos de tests unitarios y algunos de integración.
Los de integración los lanzamos contra la aplicación Spring con el contexto completamente levantado, un servidor web empotrado encendido y una base de datos en docker que es exactamente la misma versión de la base de datos que tenemos en prod.
Este proceso se ejecuta cada vez que se hace push a la rama master y esta pendiente su modificación para trabajar con merge-requests.
A grosso modo: compilamos frontend, se compila el backend, se lanzan los tests del backend y si todo va bien se hace el build de un artifact que se despliega en el servidor a traves de SSH y se aumenta la versión.
Por ahora no tenemos ningún tipo de job para hacer rollback, lo que significa que si metemos una cagada y el pipeline se ejecuta con éxito, meteremos la gamba en prod y habrá que hacer el rollback a manopla.
* MODEL *
El modelo también es bastante sencillo, por ahora lo único que tenemos es un documento root que es el "Customer" donde cuelgan los negocios y menús que pueda tener cada negocio. Un customer solo puede crear un menú, cambiar un menú y buscar un menú, además de hacerse una cuenta. Por simplicidad, ahora mismo sólo trabajamos con que un customer puede tener un único negocio y un único menú, pero la idea es extender el modelo para permitir múltiples negocios y múltiples menús por negocio.
* IDEA *
La idea es que los usuarios puedan crear cartas/menús y poder digitalizarlos y compartirlos en redes así no tendrán que tocarlos cuando vayan a un bar/restaurante debido al COVID-19.
* COSAS PENDIENTES *
- Monitoring de logs <- tenemos pensado instalar ELK Stack o GrayLog, pero debido a nuestro servidor tan limitado instalar alguna de estas soluciones nos dejaria la aplicación sin iron.
- Mejorar la seguridad de la app <- tenemos implementado el reCaptcha v3 de Google y JWT con Spring Security pero queremos meter paneles de admin y demás y securizarlos por Basic Auth o VPN.
- Activar linter y tests en el frontend <- Por motivos de velocidad de desarrollo los hemos desactivado.
- Hacer suit de UI tests con Cucumber y Selenium.
* REPOSITORIO *
Cualquier duda o sugerencia bienvenida es iré actualizando a diario para que veáis como va el desarrollo.