> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuración de Fetcher

> Las variables de entorno que dan forma a un despliegue de Fetcher — cifrado, infraestructura, streaming de eventos, multi-tenancy y readiness.

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](https://github.com/LerianStudio/fetcher) 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`        |

<Note>
  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.
</Note>

## 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 |
