Producto Territorial
Sentinel
Una plataforma programable de monitoreo sintético: pruebas en JavaScript, alertas por cambio de estado, páginas de estado públicas, en un VPS de 1 GB.
Los monitores de uptime existentes o hacen ping a URLs desde YAML o crecen hasta ser paneles pesados. Sentinel ejecuta funciones de prueba JavaScript reales según un horario, valida lógica de negocio y alerta por Discord, Slack o webhooks. Vigila todas las plataformas que opero, además de la red GNSS nacional del IBGE.
En resumen
- Las pruebas son JavaScript puro con una pequeña API ctx: HTTP, FTP, S3 (SigV4 implementado a mano), secretos, aserciones y avisos
- Tres resultados (pass, warn, fail), umbrales de fallo, cooldowns y enrutamiento de canales por tipo de evento
- Páginas de estado públicas por etiqueta, métricas Prometheus, almacén de secretos cifrado y un servidor MCP completo para agentes de IA
- Diseñado para 1 GB de RAM y media vCPU: escrituras por lotes, tablas particionadas, estadísticas diarias preagregadas
Por qué otro monitor
Necesitaba saber que el pipeline de un cliente se había quedado obsoleto antes de que lo supiera el cliente. Un 200 de una API no dice nada sobre si el pronóstico detrás tiene seis horas, o si una capa de GeoServer todavía tiene datos. Los monitores por configuración no podían expresarlo; las herramientas centradas en paneles no podían correr cientos de comprobaciones en una máquina pequeña. Sentinel es la herramienta que quería: una prueba es una función que recibe un contexto y devuelve verdadero o falso, y la plataforma se ocupa de programación, reintentos, alertas e historial.
Arquitectura
Todo el diseño parte de un único objetivo de despliegue: un VPS de 1 GB y media vCPU corriendo unas 500 pruebas por minuto. Un solo proceso Fastify en Node.js programa pruebas con intervalos con jitter, compila el código del usuario una vez al guardar, enfrenta cada ejecución a su timeout y limita la concurrencia con un pequeño pool de slots. Los resultados se almacenan en búfer y se vuelcan a PostgreSQL por lotes en tablas particionadas por mes; una tabla de agregados diarios alimenta las páginas de estado públicas para que nunca toquen las ejecuciones crudas. El HTTP saliente pasa por Undici con pool de conexiones por host. Los secretos se cifran en reposo con AES-256-GCM y se exponen a las pruebas como un objeto síncrono en memoria.
Las notificaciones son dirigidas por eventos y fire-and-forget: una prueba pasa a fallo solo tras N fallos consecutivos, los avisos se disparan en la primera ocurrencia con cooldown, la recuperación es su propio evento y cada asignación de canal filtra qué tipos de evento recibe. El panel es una app Next.js que puede desplegarse en Cloudflare Pages con solo la API y la base de datos en el VPS. Un servidor MCP envuelve las rutas REST en proceso, así que un agente de IA puede crear, ejecutar e inspeccionar pruebas con la misma validación y autenticación.
En producción: la red RBMC
El despliegue público más exigente monitorea la RBMC, la Red Brasileña de Monitoreo Continuo de los Sistemas GNSS, operada por el IBGE. La RBMC es una red de unas 150 estaciones GNSS permanentes repartidas por Brasil que transmiten y publican observaciones satelitales continuas. Es la materialización física de SIRGAS2000, el marco de referencia geodésico nacional, y la columna vertebral del posicionamiento preciso en el país: levantamientos posprocesados, correcciones en tiempo real, georreferenciación de inmuebles rurales, monitoreo de ingeniería y trabajo científico dependen de que sus datos estén disponibles y al día.
La página de estado de la RBMC sigue cada estación individualmente con historial de 24 horas, para que un topógrafo compruebe si la estación más cercana a un trabajo está publicando antes de salir a campo. Sentinel también vigila la plataforma de Jane's Weather con 63 pruebas y cada servicio detrás de Skyport y MapPrism.
Más proyectos
Todos los proyectos
Territorial Invoices
El sistema que lleva la facturación de Territorial: registro de horas en calendario, contratos con matemática de cobro determinista y facturas generadas en minutos.
- Next.js
- Fastify
- Prisma
- PostgreSQL
- +4

Territorial Assistant
Un daemon basado en Discord que convierte mi propia actividad de trabajo en hojas de horas aprobadas y en una base curada de historias de ingeniería.
- TypeScript
- discord.js
- Drizzle
- PostgreSQL
- +3

Finances
Una app personal de libro mayor y presupuesto con arquitectura Postgres-first: una instancia PostgREST, un frontend estático, nada más.
- PostgreSQL
- PostgREST
- React
- Vite
- +5