El Manager y el Worker de Fetcher se configuran íntegramente mediante variables de entorno — cada componente lee su propio archivo .env (components/manager/.env, components/worker/.env). Esta página cubre las variables que importan para un despliegue MVP; los archivos .env.example del repositorio son la referencia exhaustiva.
Claves de cifrado
| Variable | Componente | Descripción |
|---|
APP_ENC_KEY | Manager + Worker | Obligatoria. Clave maestra de 32 bytes codificada en base64. Genérala con make generate-master-key. Ambos servicios deben compartir el mismo valor. |
APP_ENC_KEY_VERSION | Manager + Worker | Contador de rotación de clave (por defecto 1). Increméntalo al rotar; Fetcher rastrea qué versión cifró cada credencial. |
A partir de esa única clave maestra, Fetcher deriva tres claves independientes vía HKDF: cifrado de credenciales (AES-256-GCM), firma de mensajes internos entre Manager y Worker (HMAC-SHA256) y firma externa de documentos, para que los consumidores verifiquen los datos extraídos. Los consumidores derivan la clave de verificación con make derive-key KEY="<clave-maestra>".
API del Manager
| Variable | Descripción | Por defecto |
|---|
SERVER_PORT | Puerto HTTP de la API del Manager | 4006 |
SCHEMA_CACHE_TTL_SECONDS | Cuánto tiempo permanecen en caché los esquemas descubiertos | 300 |
PLUGIN_AUTH_ENABLED | Delegar autenticación/autorización a Access Manager | false |
PLUGIN_AUTH_ADDRESS | Dirección de Access Manager cuando la autenticación está habilitada | — |
LOG_LEVEL | Verbosidad de los logs | debug (local) |
Infraestructura
Ambos servicios se conectan a MongoDB (metadatos) y RabbitMQ (cola de jobs); el Manager también usa Valkey/Redis para caché, y el Worker escribe resultados en object storage.
| Variable | Componente | Descripción |
|---|
MONGO_HOST, MONGO_PORT, MONGO_NAME, MONGO_USER, MONGO_PASSWORD | Manager + Worker | Almacén de metadatos en MongoDB |
RABBITMQ_HOST, RABBITMQ_PORT_AMQP, RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASS | Manager + Worker | Broker RabbitMQ |
RABBITMQ_FETCHER_WORK_QUEUE | Manager + Worker | Cola de trabajo de extracción (por defecto fetcher.extract-external-data.queue) |
RABBITMQ_NUMBERS_OF_WORKERS | Worker | Workers de extracción concurrentes (por defecto 5) |
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD | Manager | Caché Valkey/Redis |
OBJECT_STORAGE_ENDPOINT, OBJECT_STORAGE_REGION, OBJECT_STORAGE_BUCKET, OBJECT_STORAGE_ACCESS_KEY_ID, OBJECT_STORAGE_SECRET_KEY | Worker | Almacenamiento de resultados compatible con S3 (SeaweedFS por defecto; AWS S3 y MinIO funcionan igual) |
ENGINE_MAX_RESULT_BYTES | Worker | Techo del artefacto de resultado serializado por job (por defecto 256 MiB) |
Las opciones relacionadas con TLS (MONGO_TLS_CA_CERT, REDIS_TLS, RABBITMQ_TLS) están disponibles por dependencia.
Streaming de eventos de jobs
El Worker publica notificaciones obligatorias job.completed y job.failed y falla de forma cerrada al arrancar si el streaming no está habilitado:
| Variable | Descripción | Por defecto |
|---|
STREAMING_ENABLED | Debe ser true para que el Worker arranque | false |
STREAMING_BROKERS | Servidores bootstrap de Kafka/Redpanda | localhost:9092 |
STREAMING_CLOUDEVENTS_SOURCE | Origen CloudEvents de los eventos del Worker | — |
RABBITMQ_JOB_EVENTS_EXCHANGE | Exchange de RabbitMQ para eventos de jobs | fetcher.job.events |
Los despliegues single-tenant emiten eventos con el tenant ID estable single-tenant.
Multi-tenancy
| Variable | Descripción | Por defecto |
|---|
MULTI_TENANT_ENABLED | Habilita el modo multi-tenant | false |
MULTI_TENANT_URL | URL del servicio Tenant Manager | — |
MULTI_TENANT_MAX_TENANT_POOLS | Máximo de pools de conexión de tenant concurrentes | 100 |
MULTI_TENANT_IDLE_TIMEOUT_SEC | Timeout de conexión ociosa de tenant | 300 |
MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD | Umbral de fallos del circuit breaker | 5 |
MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC | Timeout de reinicio del circuit breaker | 30 |
Habilitar el modo multi-tenant también activa la guarda de seguridad contra SSRF: los hosts de conexión proporcionados por tenants se comprueban contra rangos de loopback, direcciones privadas (RFC 1918) y metadatos de nube antes de que Fetcher se conecte. Con MULTI_TENANT_ENABLED=false (el valor por defecto), todos los caminos de código multi-tenant se omiten con impacto cero en el rendimiento.
Readiness y postura de TLS
| Variable | Descripción | Por defecto |
|---|
DEPLOYMENT_MODE | saas, byoc o local — etiqueta el /readyz y activa la exigencia de TLS en SaaS | local |
ALLOW_INSECURE_TLS | Permite conexiones en texto claro con MongoDB, Redis y RabbitMQ. Fetcher falla de forma cerrada ante URIs de conexión inseguras por defecto — defínela solo para desarrollo local. | sin definir (fail closed) |
READYZ_DRAIN_DELAY_SEC | Ventana de drenaje tras SIGTERM, durante la cual /readyz reporta unhealthy antes de cerrar las conexiones | 12 |
Ambos servicios exponen GET /health (liveness), GET /readyz (readiness con sondas paralelas de dependencias) y GET /version.
Datasources internos
Las bases fijas, propiedad del operador, pueden declararse como variables de entorno en lugar de conexiones registradas por la API, usando la familia DATASOURCE_{NAME}_*:
| Variable | Obligatoria | Ejemplo |
|---|
DATASOURCE_{N}_CONFIG_NAME | sí | billing_db |
DATASOURCE_{N}_TYPE | sí | postgresql / mysql / oracle / mongodb / sql_server |
DATASOURCE_{N}_HOST | sí | db.internal.example.com |
DATASOURCE_{N}_PORT | sí | 5432 |
DATASOURCE_{N}_DATABASE | sí | billing |
DATASOURCE_{N}_USER | sí | fetcher_ro |
DATASOURCE_{N}_PASSWORD | sí | de tu gestor de secretos |
DATASOURCE_{N}_OPTIONS | no | authSource=admin (solo MongoDB) |
DATASOURCE_{N}_SSLMODE | no | require (PostgreSQL) |
Para TLS con una base gestionada en esta vía, _SSLMODE es la opción validada; el plumbing de CA personalizada o certificado de cliente para datasources internos no está disponible.
Observabilidad
Fetcher emite trazas y métricas OpenTelemetry cuando la telemetría está habilitada:
| Variable | Descripción | Por defecto |
|---|
ENABLE_TELEMETRY | Enciende/apaga la emisión OTel | false |
OTEL_EXPORTER_OTLP_ENDPOINT | Endpoint del colector OTLP | — |
OTEL_RESOURCE_SERVICE_NAME | Nombre del servicio en la telemetría (fetcher / fetcher-worker) | por componente |