Ir al contenido
Q
QuoteNode

Wiki

Pila tecnologica

Por que QuoteNode usa Java, Spring Boot y PostgreSQL, y que trade-offs implica eso para hosting, seguridad y rendimiento.

Pila tecnologica y razonamiento de diseno

Las decisiones tecnologicas de QuoteNode estan guiadas por seguridad, correccion y mantenibilidad a largo plazo, no por minimizar consumo de recursos ni por seguir modas de frameworks.

Esta pagina explica que usamos, por que lo elegimos y que significa eso para el despliegue.

Por que Java 25 y Spring Boot 4

Seguridad como criterio principal

QuoteNode maneja datos comerciales sensibles: clientes, estrategias de precio, negociaciones y relaciones de negocio. La pila tecnica debe estar probada en entornos donde un fallo de seguridad tiene consecuencias reales.

Java y Spring Boot son la eleccion por defecto en banca, seguros, sanidad y administracion. No es casualidad:

  • Mature security model - Spring Security ofrece una base auditada para autenticacion, autorizacion, sesiones, CSRF y cabeceras de seguridad
  • Type safety - el sistema de tipos de Java captura en compilacion categorias completas de errores que en lenguajes dinamicos aparecerian en runtime
  • Memory safety - la JVM aporta gestion automatica de memoria con garbage collection, evitando clases completas de vulnerabilidades tipicas de C o C++
  • Ecosystem maturity - librerias como Flyway, Thymeleaf, Hibernate y Testcontainers tienen recorrido real en entornos empresariales

Por que no Go, Rust o Node.js

Cada uno puede ser razonable para otros productos. Para QuoteNode:

  • Go - excelente para servicios de red y CLI, pero con un sistema de tipos menos expresivo y un ecosistema mas inmaduro para ORM, migraciones, seguridad y render PDF empresarial
  • Rust - maximiza rendimiento y seguridad de memoria, pero a costa de velocidad de desarrollo y de un ecosistema menos comodo para una plataforma de negocio basada en CRUD
  • Node.js - rapido para prototipos, pero la concurrencia single-threaded, el arbol de dependencias npm y una disciplina tipada menos estricta lo convierten en peor ajuste para una plataforma critica de calculo financiero

Que significa esto para el consumo de recursos

Las aplicaciones Java consumen mas memoria que servicios equivalentes en Go o Rust. Un backend de QuoteNode suele usar 512 MB a 1.5 GB de RAM segun carga y configuracion JVM. Es un trade-off deliberado:

  • el compilador JIT optimiza rutas calientes tras el warmup
  • las pausas de GC son irrelevantes para una aplicacion single-tenant con carga B2B normal
  • ese coste de memoria compra mejor tipado, mejores primitivas de seguridad y librerias mas maduras

Para una aplicacion self-hosted y single-tenant, la diferencia entre 256 MB y 1 GB de RAM no tiene relevancia operativa seria. Un VPS barato capaz de correr Docker Compose puede ejecutar QuoteNode con comodidad.

PostgreSQL 16

PostgreSQL es la unica base de datos soportada. Esto es intencional:

  • ACID compliance - cada calculo de oferta, transicion de estado y escritura en audit log vive dentro de una transaccion real
  • JSON support - los snapshots de oferta se almacenan como JSONB y pueden consultarse sin requerir un document store separado
  • Extensions - pgcrypto para hashing del lado servidor y pg_trgm para busquedas aproximadas
  • Reliability - PostgreSQL tiene decadas de historial en sistemas comerciales y financieros
  • Backup tooling - pg_dump en formato custom permite backups online coherentes

Cifrado de base de datos

Los campos sensibles se cifran en la capa de aplicacion usando AES-256-GCM.

Siempre cifrados cuando existe DB_ENCRYPTION_KEY:

  • secretos TOTP y codigos 2FA
  • credenciales SMTP

Opcionalmente cifrados cuando ENCRYPT_PII=true:

  • PII de clientes, como nombres, email, telefono y NIP
  • PII de contactos
  • PII de proveedores y sus contactos
  • PII de usuarios
  • PII ligada a order intent

Cuando el cifrado PII esta activo, las busquedas exactas usan blind indexes HMAC-SHA256 almacenados junto al ciphertext. Las busquedas tipo LIKE en columnas cifradas no son posibles por diseno; es un trade-off deliberado a favor de proteccion de datos.

La clave se deriva de DB_ENCRYPTION_KEY mediante SHA-256 y nunca se guarda en la base. Un validador de produccion impide arrancar con la clave de desarrollo por defecto y un startup validator detecta incoherencias entre la configuracion de cifrado y el estado real de la base.

Existen utilidades CLI para operaciones masivas: --pii-encrypt, --pii-decrypt y --pii-rekey=<old-key>.

El cifrado at rest de la base completa se delega a la infraestructura de hosting, como LUKS o volumenes EBS cifrados.

Frontend en Vue 3

El frontend es una SPA construida con Vue 3, Vite, PrimeVue 4 y Tailwind CSS 4:

  • Vue 3 - UI reactiva y basada en componentes con buen soporte TypeScript
  • PrimeVue 4 - biblioteca empresarial de componentes accesibles y ricos en funcionalidades
  • Tailwind CSS 4 - utilidades y tokens de diseno sin inflar el CSS
  • Vite - tooling rapido para build y desarrollo
  • vue-i18n - internacionalizacion completa con ingles, polaco, aleman, frances, espanol, italiano y portugues

El frontend habla con el backend exclusivamente por una API REST tipada. Se sirve como activos estaticos por Caddy y no accede a la base de datos de forma directa.

Gotenberg como motor PDF

La generacion de PDF usa Gotenberg, un servicio de conversion HTML a PDF basado en Chromium:

  • renderiza CSS moderno con precision
  • corre como contenedor Docker independiente, aislando el proceso de render
  • soporta paginacion, margenes y plantillas de header/footer
  • evita que el backend tenga que controlar Chromium directamente

El contenedor Gotenberg consume aproximadamente 200-400 MB de RAM y solo entra en carga durante la generacion PDF.

Caddy como reverse proxy

Caddy 2 actua como reverse proxy con HTTPS automatico:

  • aprovisionamiento automatico de certificados Let’s Encrypt
  • soporte HTTP/2 y HTTP/3
  • configuracion declarativa y simple
  • consumo de recursos muy bajo

En despliegues con Coolify, el propio proxy de Coolify asume TLS y los contenedores de aplicacion no incluyen una capa separada.

Requisitos totales de recursos

ComponenteRAM tipicaDiscoCPU
Backend (Java 25)512 MB - 1.5 GBminimo1 core
PostgreSQL 16256 MB - 512 MB1-10 GB de datoscompartido
Frontend estatico~20 MB~50 MBcasi nulo
Gotenberg200-400 MB~500 MBsolo en picos
Caddy~20 MBminimocasi nulo
Total~1.5 - 2.5 GB~2-12 GB2 cores

Un VPS de 4 GB RAM con 2 cores y 20 GB SSD ejecuta sin problemas la pila completa para un equipo de 10 a 20 usuarios.

Ideal para pequenas y medianas empresas

QuoteNode esta disenado para organizaciones de 1 a 50 usuarios:

  • freelancers y consultores individuales que necesitan ofertas profesionales sin pagar por un CRM enterprise
  • pequenas agencias que quieren gestion centralizada de clientes y ofertas
  • empresas medianas con operaciones comerciales estructuradas y necesidad de reporting, roles y trazabilidad

El modelo self-hosted elimina fees mensuales por usuario y ofrece control total sobre datos, branding y configuracion de seguridad.

Roadmap multilenguaje

QuoteNode soporta actualmente ingles, polaco, aleman, frances, espanol, italiano y portugues tanto en la UI como en las superficies orientadas al cliente.

Ingles y polaco siguen siendo las locales de referencia completas. El resto de idiomas ya esta activo en el producto y sigue ampliandose en la capa publica del sitio.

El objetivo a largo plazo sigue siendo cubrir los principales idiomas europeos. La arquitectura i18n esta preparada para crecer sin cambios estructurales de codigo, anadiendo principalmente archivos de traduccion.

Last reviewed: Recently