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

# Configuração do Fetcher

> As variáveis de ambiente que moldam uma implantação do Fetcher — criptografia, infraestrutura, streaming de eventos, multi-tenancy e readiness.

O Manager e o Worker do Fetcher são configurados inteiramente por variáveis de ambiente — cada componente lê seu próprio arquivo `.env` (`components/manager/.env`, `components/worker/.env`). Esta página cobre as variáveis que importam para uma implantação MVP; os arquivos `.env.example` no [repositório](https://github.com/LerianStudio/fetcher) são a referência exaustiva.

## Chaves de criptografia

***

| Variável              | Componente       | Descrição                                                                                                                                               |
| --------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_ENC_KEY`         | Manager + Worker | **Obrigatória.** Chave-mestra de 32 bytes codificada em base64. Gere com `make generate-master-key`. Os dois serviços devem compartilhar o mesmo valor. |
| `APP_ENC_KEY_VERSION` | Manager + Worker | Contador de rotação de chave (padrão `1`). Incremente ao rotacionar; o Fetcher rastreia qual versão criptografou cada credencial.                       |

A partir dessa única chave-mestra, o Fetcher deriva três chaves independentes via HKDF: criptografia de credenciais (AES-256-GCM), assinatura de mensagens internas entre Manager e Worker (HMAC-SHA256) e assinatura externa de documentos, para que consumidores verifiquem os dados extraídos. Consumidores derivam a chave de verificação com `make derive-key KEY="<chave-mestra>"`.

## API do Manager

***

| Variável                   | Descrição                                                        | Padrão          |
| -------------------------- | ---------------------------------------------------------------- | --------------- |
| `SERVER_PORT`              | Porta HTTP da API do Manager                                     | `4006`          |
| `SCHEMA_CACHE_TTL_SECONDS` | Por quanto tempo esquemas descobertos ficam em cache             | `300`           |
| `PLUGIN_AUTH_ENABLED`      | Delegar autenticação/autorização ao Access Manager               | `false`         |
| `PLUGIN_AUTH_ADDRESS`      | Endereço do Access Manager quando a autenticação está habilitada | —               |
| `LOG_LEVEL`                | Verbosidade dos logs                                             | `debug` (local) |

## Infraestrutura

***

Ambos os serviços conectam ao MongoDB (metadados) e ao RabbitMQ (fila de jobs); o Manager também usa Valkey/Redis para cache, e o Worker grava resultados em object storage.

| Variável                                                                                                                                 | Componente       | Descrição                                                                                                     |
| ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------- |
| `MONGO_HOST`, `MONGO_PORT`, `MONGO_NAME`, `MONGO_USER`, `MONGO_PASSWORD`                                                                 | Manager + Worker | Armazenamento de metadados no MongoDB                                                                         |
| `RABBITMQ_HOST`, `RABBITMQ_PORT_AMQP`, `RABBITMQ_DEFAULT_USER`, `RABBITMQ_DEFAULT_PASS`                                                  | Manager + Worker | Broker RabbitMQ                                                                                               |
| `RABBITMQ_FETCHER_WORK_QUEUE`                                                                                                            | Manager + Worker | Fila de trabalho de extração (padrão `fetcher.extract-external-data.queue`)                                   |
| `RABBITMQ_NUMBERS_OF_WORKERS`                                                                                                            | Worker           | Workers de extração concorrentes (padrão `5`)                                                                 |
| `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`                                                                                             | Manager          | Cache Valkey/Redis                                                                                            |
| `OBJECT_STORAGE_ENDPOINT`, `OBJECT_STORAGE_REGION`, `OBJECT_STORAGE_BUCKET`, `OBJECT_STORAGE_ACCESS_KEY_ID`, `OBJECT_STORAGE_SECRET_KEY` | Worker           | Armazenamento de resultados compatível com S3 (SeaweedFS por padrão; AWS S3 e MinIO funcionam da mesma forma) |
| `ENGINE_MAX_RESULT_BYTES`                                                                                                                | Worker           | Teto do artefato de resultado serializado por job (padrão 256 MiB)                                            |

Opções relacionadas a TLS (`MONGO_TLS_CA_CERT`, `REDIS_TLS`, `RABBITMQ_TLS`) estão disponíveis por dependência.

## Streaming de eventos de jobs

***

O Worker publica notificações obrigatórias `job.completed` e `job.failed` e **falha de forma fechada na inicialização** se o streaming não estiver habilitado:

| Variável                       | Descrição                                | Padrão               |
| ------------------------------ | ---------------------------------------- | -------------------- |
| `STREAMING_ENABLED`            | Deve ser `true` para o Worker iniciar    | `false`              |
| `STREAMING_BROKERS`            | Servidores bootstrap Kafka/Redpanda      | `localhost:9092`     |
| `STREAMING_CLOUDEVENTS_SOURCE` | Origem CloudEvents dos eventos do Worker | —                    |
| `RABBITMQ_JOB_EVENTS_EXCHANGE` | Exchange RabbitMQ para eventos de jobs   | `fetcher.job.events` |

Implantações single-tenant emitem eventos com o tenant ID estável `single-tenant`.

## Multi-tenancy

***

| Variável                                   | Descrição                                         | Padrão  |
| ------------------------------------------ | ------------------------------------------------- | ------- |
| `MULTI_TENANT_ENABLED`                     | Habilita o modo multi-tenant                      | `false` |
| `MULTI_TENANT_URL`                         | URL do serviço Tenant Manager                     | —       |
| `MULTI_TENANT_MAX_TENANT_POOLS`            | Máximo de pools de conexão de tenant concorrentes | `100`   |
| `MULTI_TENANT_IDLE_TIMEOUT_SEC`            | Timeout de conexão ociosa de tenant               | `300`   |
| `MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD`   | Limite de falhas do circuit breaker               | `5`     |
| `MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC` | Timeout de reset do circuit breaker               | `30`    |

<Note>
  Habilitar o modo multi-tenant também ativa a guarda de segurança contra SSRF: hosts de conexão fornecidos por tenants são checados contra faixas de loopback, endereços privados (RFC 1918) e metadados de nuvem antes de o Fetcher conectar. Com `MULTI_TENANT_ENABLED=false` (o padrão), todos os caminhos de código multi-tenant são ignorados com impacto zero de desempenho.
</Note>

## Readiness e postura de TLS

***

| Variável                 | Descrição                                                                                                                                                                               | Padrão                     |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| `DEPLOYMENT_MODE`        | `saas`, `byoc` ou `local` — etiqueta o `/readyz` e comanda a exigência de TLS em SaaS                                                                                                   | `local`                    |
| `ALLOW_INSECURE_TLS`     | Permite conexões em texto claro com MongoDB, Redis e RabbitMQ. O Fetcher falha de forma **fechada** em URIs de conexão inseguras por padrão — defina apenas para desenvolvimento local. | não definida (fail closed) |
| `READYZ_DRAIN_DELAY_SEC` | Janela de drenagem graciosa após SIGTERM, durante a qual o `/readyz` reporta unhealthy antes de as conexões serem encerradas                                                            | `12`                       |

Ambos os serviços expõem `GET /health` (liveness), `GET /readyz` (readiness com sondas paralelas de dependências) e `GET /version`.

## Datasources internos

***

Bancos fixos, de propriedade do operador, podem ser declarados como variáveis de ambiente em vez de conexões registradas pela API, usando a família `DATASOURCE_{NAME}_*`:

| Variável                     | Obrigatória | Exemplo                                                      |
| ---------------------------- | ----------- | ------------------------------------------------------------ |
| `DATASOURCE_{N}_CONFIG_NAME` | sim         | `billing_db`                                                 |
| `DATASOURCE_{N}_TYPE`        | sim         | `postgresql` / `mysql` / `oracle` / `mongodb` / `sql_server` |
| `DATASOURCE_{N}_HOST`        | sim         | `db.internal.example.com`                                    |
| `DATASOURCE_{N}_PORT`        | sim         | `5432`                                                       |
| `DATASOURCE_{N}_DATABASE`    | sim         | `billing`                                                    |
| `DATASOURCE_{N}_USER`        | sim         | `fetcher_ro`                                                 |
| `DATASOURCE_{N}_PASSWORD`    | sim         | do seu gerenciador de segredos                               |
| `DATASOURCE_{N}_OPTIONS`     | não         | `authSource=admin` (apenas MongoDB)                          |
| `DATASOURCE_{N}_SSLMODE`     | não         | `require` (PostgreSQL)                                       |

Para TLS com um banco gerenciado nesse caminho, `_SSLMODE` é a opção validada; plumbing de CA customizada ou certificado de cliente para datasources internos não está disponível.

## Observabilidade

***

O Fetcher emite traces e métricas OpenTelemetry quando a telemetria está habilitada:

| Variável                      | Descrição                                                    | Padrão         |
| ----------------------------- | ------------------------------------------------------------ | -------------- |
| `ENABLE_TELEMETRY`            | Liga/desliga a emissão OTel                                  | `false`        |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Endpoint do coletor OTLP                                     | —              |
| `OTEL_RESOURCE_SERVICE_NAME`  | Nome do serviço na telemetria (`fetcher` / `fetcher-worker`) | por componente |
