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ía SIGTERM / SIGKILL al 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 .32 y .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.