BCFlow Background Checker · by Zetgo Flow · powered by DigitALL Pro
Plataforma colombiana de consulta de antecedentes — diseñada como un sistema distribuido de control central + flota de workers residenciales, con monitoreo, autocuración y entrega activa de eventos.
17 fuentes, un reporte, sin pelearle a las IPs.
BCFlow es una plataforma SaaS multi-tenant que consulta 17 fuentes de antecedentes en paralelo. Tres pilares: un plano de control en la nube, una flota distribuida de workers en máquinas residenciales colombianas, y una capa de monitoreo activo que avisa cuando algo se rompe antes de que el cliente lo note.
La narrativa de este documento es simple: la plataforma se diseñó para que cada nueva máquina que se enchufa en una casa colombiana añada capacidad real al sistema, sin ceremonias, sin Kubernetes, sin proxies caros. Cada componente que verás aquí existe porque resuelve un problema concreto que enfrentamos en producción.
⚙¿Cuántos workers necesitas para tu volumen?Usa la calculadora — volumen mensual, fuentes por consulta, retención. Salen workers, almacenamiento y costo total a N años.→Tres barreras estructurales que matan cualquier solución ingenua.
Resolverlas las tres a la vez es lo que justifica todo el resto del sistema.
Bloqueo por IP
Los portales .gov.co rechazan IPs de centros de datos extranjeros y limitan agresivamente cualquier IP que haga >5 consultas por minuto.
CAPTCHAs y JavaScript
Cuatro fuentes (Policía, Contraloría, Procuraduría, Registraduría) requieren un navegador real con JavaScript, cookies y resolución de reCAPTCHA v2 o CAPTCHAs de imagen.
Volumen
El target del negocio son 4 mil a 500 mil consultas/mes por cliente con SLA de minutos. Un solo proceso, un solo navegador, una sola IP — colapsa antes del primer cliente serio.
Dos planos. Un solo trabajo cada uno.
Un plano de control en la nube (estable, una sola IP fija) y un plano de ejecución (flota de mini-PCs en casas residenciales). Se hablan por una cola de mensajes.
La promesa: cada nueva mini-PC enchufada en una casa colombiana es N veces más capacidad real, en minutos, sin tocar el plano de control. La IP residencial nueva queda automáticamente en rotación porque la cola distribuye el trabajo de forma equitativa.
La vista detallada — todo lo que existe físicamente en producción.
Las dos reglas inviolables
El VPS tiene IP de datacenter en EE.UU. Si ejecuta un adapter contra .gov.co, contamina la reputación de la IP del plano de control entero. Una sola consulta puede gatillar bloqueos que tumban toda la plataforma.
Watchman está atado a 127.0.0.1. Las consultas de sanciones se ejecutan in-process en la API — 100× más rápidas (<1s vs ~30s).
Una responsabilidad por capa. Un contrato entre cada par.
Presentación
Lo que el usuario toca: portal web, dashboard de salud, formularios, línea de progreso en tiempo real. SPA Nuxt. Recibe eventos SSE.
API Gateway
El portero. Verifica JWT, valida rate-limits por cuenta, traduce alias en español, aplica CORS y headers de seguridad.
Orquestación
Decide tier de la consulta (sanctions in-process; browser/api a la cola). Resuelve nombre completo, agrupa resultados, dispara eventos SSE.
Ejecución
17 adapters, cada uno habla su dialecto. BrowserManager, CaptchaSolver, EvidenceCollector compartidos.
Cada componente resuelve un problema concreto.
Plano de control
digitall/worker + watchtower.platform_config.Inteligencia y monitoreo
source.unhealthy.Plano de ejecución (workers)
Diez pasos, dos planos.
Desde que el cliente hace clic en "Buscar" hasta que el reporte aparece pintado en pantalla.
queryId; los resultados llegan vía SSE conforme cada fuente termina. No hay polling.Recepción
POST → JWT + rate-limit + zod → fila en queries → 202 con queryId.
Decisión por tier
Sanctions → in-process. Browser/API → cola.
Worker recibe
Primer worker libre toma el job (BLPOP), corre el adapter en su IP residencial.
Persistencia + evento
Escribe en query_results con worker_id y publica en el canal SSE.
UI live
El navegador suscrito al SSE dibuja cada resultado conforme llega. Último evento: agregado final.
Tres tiers. Cada uno con su perfil de costo y forma de escalar.
6 fuentes — OFAC, US Non-SDN, US CSL, EU CSL, UK CSL, UN CSL
Watchman in-memory. Latencia <1s. In-process en la API — nunca tocan la cola. Costo cero después del seed.
4 fuentes — Policía, Contraloría, Procuraduría, Registro Civil
Playwright + reCAPTCHA + JSF. Latencia 20-100s. IP residencial CO obligatoria. CAPTCHA ~$0.005 por intento.
7 fuentes — PEPs, Defunción, ADRES, SIMIT, Rama Judicial, INTERPOL, INPEC
HTTP plano (ASP.NET, ICEfaces, JSF). Latencia 0.1-15s. IP residencial preferida.
Capacidad efectiva del fleet
Cada fuente tiene un rate-limit upstream — típicamente 5 consultas/min/IP. Con N workers, la capacidad total es N × 5 consultas/minuto. Lineal.
🟧 Proxies residenciales pagos
- $50–100/mes por IP
- 8 IPs ≈ $400–800/mes para siempre
- Restricciones del proveedor (puerto 7005 bloqueado,
.govbloqueado) - Cero control sobre rotación o calidad
🟩 Mini-PCs en casas residenciales
- ~$200 por máquina, una sola vez
- Energía: ~$1.20/mes por nodo
- IP residencial real, sin restricciones de puerto
- Plug & play: instalación ~10 minutos
- Break-even en 4 meses
Operacionalmente trivial — ningún paso requiere expertise.
Geo-distribución y resiliencia de IPs
Cada worker está en una conexión ISP distinta. Con 8 workers en distintos ISPs, una caída masiva de un ISP (rara pero real) afecta a 1/8 del fleet. La cola redistribuye sin intervención.
Auto-actualización
Push nueva imagen → Watchtower detecta digest en ≤5 min → recreate del container manteniendo env y volumen. ≤10 min al fleet entero. Cero downtime.
Centralizar lo que es delicado de operar.
- Seguridad. Si una mini-PC se compromete, el atacante no obtiene la API key de 2captcha.
- Operación. Añadir un worker pasa de "whitelistea su IP y reza que no cambie" a "enchúfalo y olvídalo".
- Costo. Balance se monitorea desde un solo lugar. Atribución por
worker_idsigue siendo posible. - Latencia. ~50 ms de hop adicional sobre un solve que tarda 20-60s. Invisible.
Workers solo trabajan — nunca almacenan datos históricos.
Buffer en memoria — sin tocar disco. Igual con PDFs y traces.POST /internal/evidence/file con bytes en body./var/lib/digitall/evidence/. Path traversal validado.evidence_bundles. Single source of truth.Para cada eje: el cuello, la palanca, el costo.
Throughput browser
Cuello: rate-limit por IP (~5/min/IP).
Palanca: añadir workers en nuevas ISPs.
Capacidad: N × 5/min lineal. 8 workers ⇒ 1.7 M consultas/mes.
Costo: ~$200 por worker, una vez.
Throughput sanciones
Cuello: CPU + RAM de Watchman.
Palanca: escalar vertical el VPS.
Capacidad: >1000/seg en VPS pequeño.
Costo: $6-25/mes por instancia adicional.
Concurrencia HTTP
Cuello: conexiones a Postgres (max 25 inicial).
Palanca: habilitar PgBouncer transaction-pool.
Capacidad post-PgBouncer: ~1000 conexiones lógicas sobre 25 físicas.
CAPTCHA
Cuello: presupuesto en 2captcha.
Palanca: filtrar CAPTCHA-bound sources client-side o auto-recargar al umbral.
Costo: ~$2-4 K/mes para 500K consultas. Se traslada al cliente.
Cinco variables — workers, almacenamiento y TCO al instante.
Cada fuente gubernamental tiene ~5 consultas/min/IP. Con N workers, capacidad = N × 5. Sin proxies, sin Kubernetes, sin gymnastics.
Escenarios de referencia
Cliente pequeño — 4 000 consultas/mes
PyME o startup haciendo onboarding
- Promedio sostenido
- ~0.09 c/min
- Pico (×5)
- ~0.46 c/min
- Workers necesarios
- 1 (margen de sobra)
- Almacenamiento 4a
- ~940 GB
- Costo recurrente
- ~$98/mes
- TCO 4 años
- ~$4 900
Enterprise — 1 000 000 consultas/mes
Plataforma BPO / RR.HH. nacional
- Promedio sostenido
- ~23 c/min
- Pico (×5)
- ~116 c/min
- Workers necesarios
- ~30 mini-PCs en 30 ISPs
- Almacenamiento 4a
- ~229 TB
- Costo recurrente
- ~$25 000/mes
- TCO 4 años
- ~$1.2 M
Calculadora interactiva
Variables de entrada
Volumen total esperado.
Total 1–17.
Con CAPTCHA, 0–5.
5× cubre concentración en horario laboral.
Dimensionamiento
Carga
Workers
Almacenamiento
Costo mensual recurrente
TCO a 4 años
$126,250
CAPEX + recurrente × 48 meses
Supuestos. Rate-limit gobierno: 5 c/min/IP/fuente. Margen workers: +30%. CAPTCHA: $0.005/solve. Mini-PC: $200 una vez. Energía: $1.20/PC/mes. Object-storage: $0.02/GB·mes. Infraestructura bundled por escalón.
Las fallas son la norma — no la excepción.
17 portales gubernamentales. La pregunta no es si fallan, es cómo nos enteramos y cuánto duele.
| Falla | Detección | Respuesta automática |
|---|---|---|
| Una fuente falla | Adapter throw | Otras siguen. Status: partial |
| 3 fallas seguidas | Health detector | Webhook source.unhealthy |
| Worker mid-job | BullMQ stalled (30s) | Reasigna a otro worker |
| Worker offline (90s) | Sweeper | Status flipea + webhook worker.offline |
| EU CSL caído | Mirror timer | Sirve desde réplica local |
| Webhook receiver muerto | 10 fallos seguidos | Auto-disable |
| Consulta atascada | Cron 30 min | Marca failed si >10 min |
El truco de la fingerprint
Cada error se normaliza (timestamps, UUIDs, IPs, números → placeholder) y se hashea. El dashboard agrupa por hash y cuenta cuántos workers distintos lo vieron.
El upstream está roto. Nada que un worker individual pueda hacer.
Ese worker está enfermo. Pausar hasta que rote DHCP.
Tres dashboards y un detector — sin SSH a nada.
Dashboard de Salud
Per-source: runs, success rate, p50/p95, fingerprints top-3, breakdown por worker. Pestañas para fuentes, workers, Watchman y webhooks.
Métricas (Chart.js)
Consultas por hora, success rate por fuente, costo CAPTCHA por día, latencia p95 a lo largo del tiempo.
Logs estructurados (pino)
Cada componente loggea JSON en stdout. systemd persiste. Workers via Docker daemon.
Tú decides la URL. Nosotros firmamos, entregamos y registramos.
Eventos disponibles
3 fallos seguidos en 10 min. Adjunta fingerprint del último error y workers involucrados.
Primer éxito tras un período unhealthy. Cierra incidentes automáticamente.
Sweeper marcó worker offline tras 90s sin heartbeat. Útil para alertar a quien tenga la mini-PC en su casa.
Toda fuente retornó error. Útil para reembolso automático en planes pay-per-query.
Cada POST incluye X-DigitALL-Event, X-DigitALL-Delivery (UUID único) y X-DigitALL-Signature: sha256=<hex>. Verifica con HMAC-SHA256 sobre el body crudo y la clave secreta (entregada UNA VEZ al crear el webhook).
Estado actual — honesto.
curl bco.zetgo.io/install | sudo bash + install.ps1 en Windows.Cada decisión arquitectural defendible en una conversación con un cliente.
BCFlow se diseñó para que cada decisión arquitectural sea defendible en una conversación con un cliente que pregunta por qué. No hay tecnología por moda: cada componente resuelve un problema concreto que vimos en producción y cada componente se puede reemplazar sin tumbar el resto.