En entornos multi-tenant de gran escala, gestionar docenas de tareas en segundo plano dispares —desde auditorías automatizadas de control de calidad (QA) y descubrimiento de leads comerciales hasta el enrutamiento de correo saliente por OAuth y la sincronización distribuida de contenidos— se vuelve rápidamente insostenible cuando se ejecuta mediante tareas cron aisladas o scripts ad-hoc. Sin un marco centralizado de orquestación, los procesos de larga duración corren el riesgo de quedar huérfanos, saturar los núcleos de CPU del servidor y carecer de observabilidad en tiempo real.
Para resolver este desafío arquitectónico diseñamos Job Runner v2.0: una plataforma resiliente de alto rendimiento en Node.js y TypeScript construida sobre una arquitectura modular de plugins. Al definir contratos de subsistema estrictamente tipados, Job Runner consolidó tres motores de automatización independientes —QA Watchdog, Lead Hunter y Article Sync— en una única plataforma observable y aislada por procesos en el nodo de trabajo (192.168.11.18:8084).
1. El Problema de los Scripts en Segundo Plano Fragmentados
Antes de consolidarse bajo un ejecutor unificado, cada herramienta operativa funcionaba en su propio silo:
- QA Watchdog: Desplegaba spiders autónomos en Playwright headless para auditar enlaces 404, verificar formularios de contacto dinámicos e inspeccionar esquemas JSON-LD en más de 130 dominios.
- Lead Hunter: Ejecutaba bucles de descubrimiento comercial sobre registros empresariales regionales, enviaba auditorías mediante la API de Google Gmail y sincronizaba prospectos con Frappe CRM.
- Article Sync e Indexación SEO: Ejecutaba rutinas programadas para sincronizar fragmentos JSON en disco con MongoDB Atlas y notificar instantáneamente a los puntos de enlace de IndexNow.
Cuando se ejecutaban mediante sesiones SSH desacopladas o crons del sistema, los rechazos de promesas no controlados o los bucles infinitos podían fijar los núcleos de CPU al 100% indefinidamente.
2. La Arquitectura Modular de Plugins en TypeScript
Job Runner v2.0 abstrae cada dominio operativo en un módulo estrictamente tipado dentro de src/modules/ mediante un contrato declarativo unificado:
export interface JobDef {
key: string;
name: string;
description: string;
queue: 'qa' | 'lead-hunter' | 'seo' | 'maintenance' | 'social';
bin: 'node' | 'bash';
script: string;
cwd: string;
baseArgs: string[];
schedule?: string;
retries: number;
logFile: string;
}
A. Integración de QA-Watchdog (src/modules/qa/)
Todas las suites de pruebas automatizadas se migraron como spiders nativos en TypeScript: 404 Fast Spider (qa:spider), Contact Form Liveness (qa:contact-forms), Static Asset Auditor (qa:asset-audit) y SEO Schema Validator (qa:seo-audit) sobre más de 3.400 artículos publicados.
B. Integración de Lead-Hunter (src/modules/marketing/)
El motor comercial opera como una cascada automatizada de cinco etapas: descubrimiento regional de pymes, auditoría de fallos técnicos (ausencia de SSL, LCP lento, viewport roto), deduplicación en Frappe CRM v15 mediante API REST, envío exclusivo a través del microservicio OAuth de Google Gmail en el puerto 8085 y seguimiento automático de rebotes.
C. Integración de Article Sync y Motor de Contenido Versionado (src/modules/content/)
La sincronización de contenido utiliza escritura dual atómica entre archivos JSON, SQLite (data/revisions.db) y MongoDB, capturando instantáneas inmutables (v1 → v2) y notificando a IndexNow al instante.
3. Aislamiento Estricto de Procesos POSIX y Telemetría
Para evitar la saturación de CPU y las tareas huérfanas, Job Runner impone dos invariantes críticos de estabilidad:
- Sandboxing de Grupos de Procesos (
-pid): Cuando una tarea se detiene o supera su tiempo límite, Job Runner envíaSIGTERM/SIGKILLal ID negativo del grupo de procesos (process.kill(-child.pid, 'SIGTERM')), garantizando que todos los procesos hijos (incluidas las instancias headless de Chromium) terminen limpiamente. - Telemetría Dual-Push: Todos los registros y métricas se transmiten a Prometheus y Promtail/Loki, alimentando paneles de Grafana en tiempo real en los nodos
.32y.18.
| Cola del Subsistema | Ruta del Módulo | Límite de Concurrencia | Mecanismo de Aislamiento y Recuperación | Destino de Telemetría |
|---|---|---|---|---|
qa |
src/modules/qa/ |
2 spiders paralelos | Kill de grupo POSIX -pid + timeout de 15 min |
Loki {job="qa_watchdog"} + Prometheus |
lead-hunter |
src/modules/marketing/ |
1 pipeline serial | Deduplicación idempotente en Frappe CRM + retry OAuth | Loki {job="lead_hunter"} + Webhook CRM |
seo / maintenance |
src/modules/content/ |
4 workers atómicos | Bloqueo SHA-256 + escritura dual SQLite/MongoDB | Loki {job="cms_sync"} + IndexNow HTTP 200 |
4. Conclusión
Al unificar la validación de QA, la automatización de marketing y la sincronización de contenido en una arquitectura modular de plugins en TypeScript, transformamos scripts frágiles en un motor de automatización empresarial robusto y totalmente observable.
