In grootschalige multi-tenant omgevingen wordt het beheren van tientallen uiteenlopende achtergrondtaken — variërend van geautomatiseerde QA-audits en commerciële lead-discovery tot OAuth-e-mailroutering en gedistribueerde contentsynchronisatie — al snel onbeheersbaar wanneer deze als losse cronjobs of ad-hoc scripts draaien. Zonder een centraal orkestratieframework lopen langlopende processen het risico om weesprocessen (orphan processes) achter te laten, CPU-kernen volledig te verzadigen en elke vorm van realtime observability te verliezen.

Om deze architecturale uitdaging op te lossen, ontwikkelden wij Job Runner v2.0: een veerkrachtig Node.js- en TypeScript-automatiseringsplatform gebouwd op een modulaire pluginarchitectuur. Door strikt getypeerde subsystemen te definiëren, consolideerde de Job Runner drie voorheen gescheiden engines — QA Watchdog, Lead Hunter en Article Sync — binnen één proces-geïsoleerd platform op onze worker-node (192.168.11.18:8084).

1. Het Probleem van Gefragmenteerde Achtergrondscripts

Vóór de consolidatie onder een centrale runner opereerde elke operationele tool in een eigen silo:

  • QA Watchdog: Startte losstaande headless Playwright-spiders om HTTP 404-links op te sporen, dynamische contactformulieren te testen en JSON-LD-schema's te valideren op meer dan 130 productiedomeinen.
  • Lead Hunter: Voerde meerstaps-discoveryloops uit over regionale bedrijfsregisters, verstuurde gepersonaliseerde technische audits via de Google Gmail API en synchroniseerde leads met Frappe CRM.
  • Article Sync & SEO-indexering: Draaide geplande import-/exporttaken om flat-file JSON-shards te synchroniseren met MongoDB Atlas en nieuwe URL's direct aan te bieden bij IndexNow-zoekmachine-endpoints.

Wanneer dergelijke scripts via losgekoppelde SSH-sessies of standaard systeem-crons werden gestart, konden onafgehandelde promise-rejections of oneindige parser-loops CPU-kernen voor onbepaalde tijd op 100% vastzetten.

2. De Modulaire Plugin-Architectuur in TypeScript

Job Runner v2.0 lost dit op door elk operationeel domein onder te brengen in een strikt getypeerde module onder src/modules/ via één declaratief contract:

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. Integratie van QA-Watchdog (src/modules/qa/)

Alle geautomatiseerde testsuites zijn gemigreerd naar native TypeScript-spiders: de 404 Fast Spider (qa:spider) controleert HTTPS-responscodes en 301-redirects, Contact Form Liveness (qa:contact-forms) valideert publieke formulieren, de Static Asset Auditor (qa:asset-audit) controleert CSS- en JS-bundels, en de SEO Schema Validator (qa:seo-audit) inspecteert ruim 3.400 artikelen op gestructureerde JSON-LD-metadata.

B. Integratie van Lead-Hunter (src/modules/marketing/)

De commerciële discovery-engine werkt als een deterministische vijftraps-pijplijn: regionale MKB-discovery, technische foutanalyse (ontbrekende SSL, trage LCP, gebroken viewport), deduplicatie in Frappe CRM v15 via REST API, OAuth-verzending via de Google Gmail API-microservice op poort 8085 en automatische verwerking van bouncemeldingen.

C. Integratie van Article Sync & Versioned Content Engine (src/modules/content/)

Contentsynchronisatie maakt gebruik van atomaire dual-writing tussen JSON-shards op schijf, de SQLite-revisiedatabase (data/revisions.db) en MongoDB, inclusief onveranderlijke revisiesnapshots (v1 → v2) en directe IndexNow-notificaties.

3. Harde POSIX-Procesgroep-Isolatie & Telemetrie

Om CPU-verzadiging en achterblijvende Chromium-processen te voorkomen, dwingt Job Runner twee cruciale stabiliteitsinvarianten af:

  • Procesgroep-Sandboxing (-pid): Wanneer een taak wordt gestopt of een time-out bereikt, stuurt Job Runner SIGTERM / SIGKILL naar het negatieve procesgroep-ID (process.kill(-child.pid, 'SIGTERM')), zodat alle dochterprocessen (inclusief headless Chromium-instanties) gegarandeerd worden afgesloten.
  • Dual-Push Telemetrie: Alle joblogs en levenscyclusstatistieken worden realtime gestreamd naar Prometheus en Promtail/Loki, wat zorgt voor overzichtelijke Grafana-dashboards op zowel de primaire webserver (.32) als de worker-node (.18).
Subsysteem-wachtrij Modulepad Concurrencylimiet Isolatie- & Herstelmechanisme Primaire Telemetrie-sink
qa src/modules/qa/ 2 parallelle spiders POSIX -pid groeps-kill + 15 min watchdog-time-out Loki {job="qa_watchdog"} + Prometheus
lead-hunter src/modules/marketing/ 1 seriële pijplijn Idempotente Frappe CRM-deduplicatie + OAuth-retry Loki {job="lead_hunter"} + CRM-webhook
seo / maintenance src/modules/content/ 4 atomaire workers SHA-256 revisie-lock + SQLite/MongoDB dual-write Loki {job="cms_sync"} + IndexNow HTTP 200

4. Conclusie

Door QA-validatie, marketingautomatisering en contentsynchronisatie samen te brengen in één modulaire TypeScript-pluginarchitectuur, hebben wij kwetsbare achtergrondscripts getransformeerd tot een robuuste enterprise-automatiseringsengine met volledige operationele zichtbaarheid.