Especificación · S-PLAN

Infraestructura tecnológica

S-PLAN es una aplicación de cliente: el servidor solo entrega archivos estáticos y resuelve rutas limpias. Todo el trabajo con datos ocurre en el navegador contra Firebase. Entender eso explica casi todas sus virtudes y todos sus límites.

Arquitectura

Navegador Firebase SDK 9.x Bootstrap · Chart.js SheetJS · SweetAlert2 Nginx planitone.co TLS · proxy /s-plan/ Node + Express 127.0.0.1:3102 estáticos + rutas Firebase Realtime Database sigunitropico-default-rtdb prefijo S-PLAN/ · lectura y escritura Firebase Storage + Auth sigunitropico.appspot.com evidencias · Google Sign-In el navegador habla directo con Firebase

Componentes

PiezaDetalle
Servidor de aplicaciónNode.js con Express, escuchando en 127.0.0.1:3102. Sirve public/ como estático y define las rutas limpias.
Gestión de procesoPM2, proceso s-plan.
Proxy y TLSNginx en planitone.co, con location ^~ /s-plan/ hacia el puerto 3102.
Base de datosFirebase Realtime Database del proyecto sigunitropico, prefijo S-PLAN/.
AlmacenamientoFirebase Storage, bucket sigunitropico.appspot.com, prefijo PlanItOne/S-PLAN/evidencias/.
AutenticaciónFirebase Auth con Google Sign-In, compartida con toda la suite PlanItOne.
FrontendHTML y JavaScript sin framework ni build: Firebase SDK 9.x por módulos ES, plantilla Argon sobre Bootstrap 5, Chart.js, SheetJS (Excel) y SweetAlert2.

Lo que implica no tener backend de datos

A favor

  • Los cambios se ven en tiempo real, sin recargar ni desplegar.
  • No hay una capa de API que mantener sincronizada con el modelo.
  • Publicar una corrección es copiar un archivo estático.

En contra

  • La seguridad real depende de las reglas de la base, no del código de la página.
  • Ocultar un botón por rol es una comodidad visual, no un control de acceso.
  • La lógica de cálculo vive en el navegador: dos pestañas con versiones distintas pueden escribir distinto.
Consecuencia práctica: el avance de una meta se recalcula y se persiste cuando alguien abre esa meta. Por eso los índices agregados existen —para que los tableros no dependan de que alguien haya visitado cada ficha—. Ver Cálculo del avance.

Despliegue y operación

Dependencias externas

Todo lo de terceros se carga por CDN: Firebase SDK, Bootstrap y su plantilla, Chart.js, SheetJS, SweetAlert2 y Font Awesome. La aplicación no funciona sin conexión a internet, aunque el servidor esté disponible.

Riesgo conocido: las versiones de las librerías se fijan en cada archivo HTML por separado. Conviven versiones distintas del SDK de Firebase entre páginas (9.1.2 y 9.22.2, por ejemplo). Al añadir un módulo compartido, hay que reutilizar la instancia ya inicializada en vez de crear otra.

Relacionado: Autenticación · Permisos · Rutas de acceso.