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

# Variáveis de ambiente

> Catálogo completo das variáveis de ambiente consumidas pelos componentes do stack Portal (core, dashboard, worker edge-integration, worker-automation, SDK, EMQX).

# Variáveis de ambiente

Este documento lista todas as variáveis de ambiente consumidas pelos componentes do stack Portal — **core**, **dashboard**, **worker** (edge de integrações), **worker-automation** (edge de automações), **SDK** e **EMQX**.

Serviços de infraestrutura puros (Postgres, Redis, Directus) ficam fora deste catálogo; aqui aparecem apenas as variáveis usadas pelo Portal para se conectar a eles.

> Convenções
>
> * **Obrig.**: a aplicação não inicializa (ou o use case falha) sem o valor.
> * **Opc.**: tem default ou é usado apenas em fluxos específicos.
> * Defaults extraídos de `packages/core/src/infrastructure/config/environment.ts` e dos próprios módulos consumidores.
> * Exemplos com valores marcados `<...>` devem ser substituídos por segredos reais. Não use os valores `FAKENEWS` / `from-dev` que aparecem no `docker-compose.yml` de desenvolvimento — são placeholders.

***

## Sumário por componente

| Componente                                     | Onde definir                                           | Total    |
| ---------------------------------------------- | ------------------------------------------------------ | -------- |
| `core`                                         | docker-compose `core.environment` ou `.env` montado    | 60+ vars |
| `dashboard`                                    | build-time (Vite) — sem env vars próprias no momento   | 0        |
| `worker` (edge-integration)                    | docker-compose ou `.env` no host onde roda o container | 7        |
| `worker-automation` (edge-automation)          | mesmo padrão do worker                                 | 7        |
| `sdk` (consumido por worker/worker-automation) | herda do processo pai                                  | 7        |
| `emqx`                                         | docker-compose `emqx.environment`                      | 4        |

***

## 1. Database & cache

Conexões do core com Postgres (DB de aplicação), Postgres do EMQX (DB que o broker lê para auth) e Redis. Os bancos em si não fazem parte do produto Portal.

| Variável                 | Componente | Descrição                                               | Obrig. | Default | Exemplo                                           |
| ------------------------ | ---------- | ------------------------------------------------------- | :----: | ------- | ------------------------------------------------- |
| `DATABASE_URL`           | core       | URL Postgres do core (Drizzle ORM).                     |    ✓   | —       | `postgresql://api:<senha>@postgres:5432/api_test` |
| `REDIS_URL`              | core       | URL Redis (cache, locks).                               |    ✓   | —       | `redis://default:<senha>@redis:6379`              |
| `EMQX_DATABASE_HOST`     | core       | Host do Postgres onde o EMQX lê `mqtt_user`/`mqtt_acl`. |    ✓   | —       | `postgres`                                        |
| `EMQX_DATABASE_PORT`     | core       | Porta desse Postgres.                                   |    ✓   | —       | `5432`                                            |
| `EMQX_DATABASE_NAME`     | core       | Nome do banco que o EMQX usa.                           |    ✓   | —       | `emqx`                                            |
| `EMQX_DATABASE_USERNAME` | core       | Usuário Postgres para autenticar o broker.              |    ✓   | —       | `api`                                             |
| `EMQX_DATABASE_PASSWORD` | core       | Senha Postgres correspondente.                          |    ✓   | —       | `<senha>`                                         |

***

## 2. MQTT / EMQX

Endereço e credenciais para conexão MQTT pelos diferentes componentes.

| Variável                           | Componente                           | Descrição                                                                                    | Obrig. | Default                    | Exemplo                             |
| ---------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------- | :----: | -------------------------- | ----------------------------------- |
| `EMQX_HOST`                        | core, worker, worker-automation, sdk | Host do broker (sem esquema/porta — TCP MQTT em :1883).                                      |    ✓   | `localhost` (SDK)          | `host.docker.internal`              |
| `EMQX_URL`                         | core                                 | URL da Dashboard EMQX (HTTP admin API).                                                      |    ✓   | —                          | `http://host.docker.internal:18083` |
| `EMQX_TOKEN`                       | core                                 | Token da Dashboard EMQX, usado pelo core para chamadas admin.                                |    ✓   | —                          | `<token_emqx>`                      |
| `EMQX_CLIENT_USERNAME`             | core, worker, worker-automation, sdk | Usuário MQTT do próprio cliente (no edge, é setado em runtime após `pair`/`register-cloud`). |    —   | `portal` (core)            | `portal`                            |
| `EMQX_CLIENT_PASSWORD`             | core, worker, worker-automation, sdk | Senha MQTT correspondente.                                                                   |    —   | —                          | `<senha_mqtt>`                      |
| `EMQX_PUBLIC_WS_URL`               | core                                 | URL WebSocket pública do EMQX (entregue ao dashboard e mobile para conectar diretamente).    |    —   | `ws://localhost:8083/mqtt` | `wss://emqx.example.com/mqtt`       |
| `EMQX_NAME`                        | emqx (container)                     | Identificador do nó EMQX (cluster).                                                          |    —   | —                          | `emqx`                              |
| `EMQX_NODE__COOKIE`                | emqx (container)                     | Cookie de cluster Erlang.                                                                    |    ✓   | —                          | `<uuid>`                            |
| `EMQX_DASHBOARD__DEFAULT_PASSWORD` | emqx (container)                     | Senha inicial da Dashboard (admin/...).                                                      |    ✓   | —                          | `<senha_dashboard>`                 |
| `EMQX_ALLOW_ANONYMOUS`             | emqx (container)                     | Se `true`, libera conexões sem auth. **Sempre `false` em produção.**                         |    —   | `true`                     | `false`                             |

***

## 3. Autenticação (Logto + M2M)

| Variável                         | Componente              | Descrição                                                    | Obrig. | Default | Exemplo                            |
| -------------------------------- | ----------------------- | ------------------------------------------------------------ | :----: | ------- | ---------------------------------- |
| `LOGTO_URL`                      | core, worker-automation | URL base do tenant Logto.                                    |    ✓   | —       | `https://id.test.flexhome.casa`    |
| `LOGTO_CLIENT_ID`                | core                    | Client ID OAuth do app principal.                            |    ✓   | —       | `1dp6oy508vo3eza6r1gp5`            |
| `LOGTO_CLIENT_SECRET`            | core                    | Client secret correspondente.                                |    ✓   | —       | `<secret>`                         |
| `LOGTO_SIGNING_KEY`              | core                    | Chave usada para assinar tokens internos.                    |    ✓   | —       | `<signing_key>`                    |
| `LOGTO_MCP_CLIENT_ID`            | core                    | Client ID para integração com o MCP server.                  |    ✓   | —       | `t2rhj977fiit7fry6jhuv`            |
| `LOGTO_MCP_CLIENT_SECRET`        | core                    | Client secret MCP.                                           |    ✓   | —       | `<secret>`                         |
| `LOGTO_MANAGEMENT_CLIENT_ID`     | core, worker-automation | Client ID para chamar a Management API do Logto.             |    ✓   | —       | `k6s2p15x2gxbr8uxazigp`            |
| `LOGTO_MANAGEMENT_CLIENT_SECRET` | core, worker-automation | Client secret correspondente.                                |    ✓   | —       | `<secret>`                         |
| `M2M_API_RESOURCE`               | core, worker-automation | URI do recurso protegido (audience) — escopo nos tokens M2M. |    ✓   | —       | `https://api.portal.unisec.com.br` |

O `worker-automation` herda esses M2M creds para obter tokens via Logto OIDC ao chamar a API do core.

***

## 4. Pagamentos

| Variável                | Componente | Descrição                                                      | Obrig. | Default                 | Exemplo                          |
| ----------------------- | ---------- | -------------------------------------------------------------- | :----: | ----------------------- | -------------------------------- |
| `STRIPE_API_KEY`        | core       | API key secreta do Stripe.                                     |    ✓   | —                       | `sk_test_...`                    |
| `STRIPE_WEBHOOK_SECRET` | core       | Secret para validar webhooks do Stripe.                        |    ✓   | —                       | `whsec_...`                      |
| `APPLE_IAP_KEY_ID`      | core       | Key ID do certificado App Store Connect (apenas mobile iOS).   |    —   | `""`                    | `4X66Z2SZ98`                     |
| `APPLE_IAP_ISSUER_ID`   | core       | Issuer ID App Store Connect.                                   |    —   | `""`                    | `<uuid>`                         |
| `APPLE_IAP_BUNDLE_ID`   | core       | Bundle ID do app iOS.                                          |    —   | `com.unicontrol.mobile` | `com.unicontrol.mobile`          |
| `APPLE_IAP_PRIVATE_KEY` | core       | Chave privada PEM (P-256) usada para assinar JWT da App Store. |    —   | `""`                    | `-----BEGIN PRIVATE KEY-----...` |
| `APPLE_IAP_ENV`         | core       | Ambiente App Store: `Sandbox` ou `Production`.                 |    —   | `Sandbox`               | `Sandbox`                        |

***

## 5. Edge runtime (worker e worker-automation)

Variáveis que governam como o container do edge se anuncia ao core e onde guarda estado local.

| Variável                         | Componente                     | Descrição                                                                                                                                                                                                                    |   Obrig.  | Default                 | Exemplo                            |
| -------------------------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------: | ----------------------- | ---------------------------------- |
| `CORE_API_URL`                   | worker, worker-automation, sdk | URL HTTP do core para `pair`/`register-cloud`/`bootstrap`.                                                                                                                                                                   |     ✓     | —                       | `http://core:3000`                 |
| `CORE_BASE_URL`                  | core                           | URL pública do core para links retornados (callbacks OAuth, etc).                                                                                                                                                            |     —     | `http://localhost:3000` | `https://api.portal.unisec.com.br` |
| `EDGE_TOKEN`                     | worker                         | Token estático do edge **home**. Definido após criação no painel `/edges`.                                                                                                                                                   |  — (home) | —                       | `edge_kLeP5YwLs...`                |
| `AUTOMATION_EDGE_TOKEN`          | worker-automation              | Token estático de edge home **kind='automation'**.                                                                                                                                                                           |  — (home) | —                       | `edge_aD4tQpZmC...`                |
| `PORTAL_CLOUD_EDGE_SECRET`       | core, worker                   | Shared secret para self-register de cloud integration edges.                                                                                                                                                                 | — (cloud) | `""`                    | `<secret_cloud>`                   |
| `PORTAL_CLOUD_AUTOMATION_SECRET` | core, worker-automation        | Shared secret para self-register de cloud automation edges. Cai pra `PORTAL_CLOUD_EDGE_SECRET` se não definido.                                                                                                              | — (cloud) | `""`                    | `<secret_cloud_automation>`        |
| `EDGE_CREDS_PATH`                | worker, worker-automation      | Caminho em disco onde o edge home persiste suas creds MQTT após `pair`.                                                                                                                                                      |     —     | `./data/edge.json`      | `/app/data/edge.json`              |
| `EDGE_QUEUE_PATH`                | sdk (edge)                     | Caminho do arquivo JSONL onde a `OfflineQueue` persiste publicações MQTT que falharam (broker offline). Quando vazio, usa buffer em memória capado em 10.000 mensagens (cloud edges efêmeros). TTL de 24h aplicado no drain. |     —     | (memória)               | `/app/data/queue.jsonl`            |
| `HOSTNAME`                       | worker, worker-automation      | Hostname do container — chave de upsert em `edge_nodes` para cloud edges. Auto-detectado via `Deno.hostname()` se não setado.                                                                                                |     —     | (auto)                  | `edge-integration`                 |

> Modo HOME vs CLOUD: HOME usa `EDGE_TOKEN` + Bearer auth e roda em casa do usuário; CLOUD usa shared secret e se auto-registra na frota compartilhada. Exatamente uma das duas envs deve estar setada.

***

## 6. Integrações — credenciais OAuth/API

Estas envs habilitam apenas o **fluxo de configuração** das integrações; as credenciais de cada usuário ficam em `config_entries`/`tokens` no banco.

| Variável               | Componente | Descrição                                         | Obrig. | Default | Exemplo                                                            |
| ---------------------- | ---------- | ------------------------------------------------- | :----: | ------- | ------------------------------------------------------------------ |
| `TUYA_CLIENT_ID`       | core       | Client ID da app cadastrada na Tuya IoT Platform. |    ✓   | —       | `HA_3y9q4ak7g4ephrvke`                                             |
| `TUYA_SCHEMA`          | core       | Schema OAuth Tuya (usado no QR code).             |    ✓   | —       | `haauthorize`                                                      |
| `EWELINK_APP_ID`       | core       | App ID OAuth eWeLink (CoolKit).                   |    ✓   | —       | `3m7IlbXYPbvwPmE9vZxblh1SOA4JE94T`                                 |
| `EWELINK_APP_SECRET`   | core       | App secret correspondente.                        |    ✓   | —       | `<secret>`                                                         |
| `DAIKIN_CLIENT_ID`     | core       | Client ID OAuth Daikin.                           |    —   | —       | `K1hVdwtKWTRbSb0B_qHXTxpB`                                         |
| `DAIKIN_CLIENT_SECRET` | core       | Client secret Daikin.                             |    —   | —       | `<secret>`                                                         |
| `SHELLY_CLIENT_ID`     | core       | Client ID OAuth Shelly Cloud.                     |    —   | `""`    | `<id>`                                                             |
| `SHELLY_CLIENT_SECRET` | core       | Client secret Shelly.                             |    —   | `""`    | `<secret>`                                                         |
| `SHELLY_REDIRECT_URI`  | core       | Redirect URI cadastrado no portal Shelly.         |    —   | —       | `https://api.portal.unisec.com.br/v1/integrations/shelly/callback` |

***

## 7. Serviços externos

Endpoints e tokens para serviços de terceiros usados pelo core.

| Variável                       | Componente | Descrição                                                           | Obrig. | Default                         | Exemplo                                         |
| ------------------------------ | ---------- | ------------------------------------------------------------------- | :----: | ------------------------------- | ----------------------------------------------- |
| `DIRECTUS_URL`                 | core       | URL da API REST do Directus.                                        |    ✓   | —                               | `http://directus:8055`                          |
| `DIRECTUS_TOKEN`               | core       | Static token do Directus para autenticar chamadas server-to-server. |    ✓   | —                               | `<token>`                                       |
| `VAULT_ADDR`                   | core       | URL do HashiCorp Vault.                                             |    ✓   | —                               | `https://vault.local`                           |
| `VAULT_TOKEN`                  | core       | Token Vault.                                                        |    ✓   | —                               | `<token>`                                       |
| `CONSUL_HTTP_ADDR`             | core       | URL do HashiCorp Consul.                                            |    ✓   | —                               | `https://consul.local`                          |
| `CONSUL_HTTP_TOKEN`            | core       | Token Consul (ACL).                                                 |    ✓   | —                               | `<token>`                                       |
| `INFLUXDB_URL`                 | core       | URL do InfluxDB (séries temporais).                                 |    ✓   | —                               | `https://influxdb.local`                        |
| `INFLUXDB_TOKEN`               | core       | Token InfluxDB.                                                     |    ✓   | —                               | `<token>`                                       |
| `PANGOLIN_URL`                 | core       | URL da API Pangolin (sync de dispositivos).                         |    ✓   | —                               | `https://pangolin.local`                        |
| `PANGOLIN_TOKEN`               | core       | Token Pangolin.                                                     |    ✓   | —                               | `<token>`                                       |
| `CLOUDFLARE_API_TOKEN`         | core       | API token Cloudflare (usado em integrações/tunnels).                |    —   | —                               | `cfut_...`                                      |
| `CLOUDFLARE_ACCOUNT_ID`        | core       | Account ID Cloudflare.                                              |    —   | —                               | `<id>`                                          |
| `CLOUDFLARE_ZONE_ID`           | core       | Zone ID Cloudflare (domínio gerenciado).                            |    —   | —                               | `<id>`                                          |
| `ODOO_URL`                     | core       | URL Odoo (suporte/CRM).                                             |    —   | `https://suporte.unisec.com.br` | `https://unisec.odoo.com`                       |
| `ODOO_API_KEY`                 | core       | API key Odoo.                                                       |    ✓   | —                               | `<key>`                                         |
| `ODOO_DATABASE`                | core       | Nome da base Odoo.                                                  |    —   | `suporte`                       | `unisec`                                        |
| `ODOO_LOGIN`                   | core       | Login Odoo.                                                         |    —   | `admin`                         | `contato@unisec.com.br`                         |
| `CALENDLY_PAT_TOKEN`           | core       | Personal Access Token Calendly (agenda).                            |    ✓   | —                               | `eyJraWQiOi...`                                 |
| `CALENDLY_WEBHOOK_SIGNING_KEY` | core       | Chave para validar assinatura dos webhooks Calendly.                |    ✓   | —                               | `<key>`                                         |
| `CALENDLY_ORGANIZATION_URI`    | core       | URI da organização Calendly.                                        |    —   | `""`                            | `https://api.calendly.com/organizations/<uuid>` |
| `WHATSAPP_TOKEN`               | core       | Bearer token do WhatsApp Business API.                              |    ✓   | —                               | `<token>`                                       |
| `WHATSAPP_ID_TELEPHONE`        | core       | Phone Number ID (não o número em si).                               |    ✓   | —                               | `<phone_id>`                                    |

***

## 8. LLMs

Provedores de modelos de linguagem usados pelo assistente.

| Variável              | Componente | Descrição                                 | Obrig. | Default                        | Exemplo                             |
| --------------------- | ---------- | ----------------------------------------- | :----: | ------------------------------ | ----------------------------------- |
| `ANTHROPIC_API_KEY`   | core       | API key da Anthropic (Claude).            |    ✓   | —                              | `sk-ant-api03-...`                  |
| `OLLAMA_BASE_URL`     | core       | URL do servidor Ollama (LLM self-hosted). |    —   | `http://localhost:11434`       | `https://ollama.test.flexhome.casa` |
| `OLLAMA_MODEL`        | core       | Identificador do modelo Ollama padrão.    |    —   | `qwen3.5:cloud`                | `qwen3.5:cloud`                     |
| `OPENROUTER_API_KEY`  | core       | API key OpenRouter (router de LLMs).      |    —   | `""`                           | `sk-or-v1-...`                      |
| `OPENROUTER_BASE_URL` | core       | URL base OpenRouter.                      |    —   | `https://openrouter.ai/api/v1` | (default)                           |
| `OPENROUTER_MODEL`    | core       | Modelo padrão no OpenRouter.              |    —   | `qwen/qwen3.5-9b`              | (default)                           |

***

## 9. Misc / SDK

| Variável         | Componente              | Descrição                                                                         | Obrig. | Default                                       | Exemplo                          |
| ---------------- | ----------------------- | --------------------------------------------------------------------------------- | :----: | --------------------------------------------- | -------------------------------- |
| `MET_USER_AGENT` | sdk (integração Met.no) | User-Agent enviado nas requisições à API meteorológica Met.no (exigido pela API). |    —   | `Unicontrol-Portal/1.0 contato@unisec.com.br` | `MeuApp/1.0 contato@exemplo.com` |

***

## Apêndice — Modos do edge

**HOME edge** (roda na casa do usuário, atendendo apenas a org dele):

```env theme={null}
CORE_API_URL=https://api.portal.unisec.com.br
EDGE_TOKEN=edge_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EMQX_HOST=mqtt.portal.unisec.com.br
EDGE_CREDS_PATH=/app/data/edge.json
EDGE_QUEUE_PATH=/app/data/queue.jsonl
```

Para automation home edge, troque `EDGE_TOKEN` por `AUTOMATION_EDGE_TOKEN`.

**CLOUD edge** (frota compartilhada, atendendo várias orgs):

```env theme={null}
CORE_API_URL=http://core:3000
PORTAL_CLOUD_EDGE_SECRET=<secret>
EMQX_HOST=emqx
# HOSTNAME=auto via Docker; pode ser fixado para deploys estáveis
```

Para automation cloud edge, troque `PORTAL_CLOUD_EDGE_SECRET` por `PORTAL_CLOUD_AUTOMATION_SECRET`.

`EDGE_QUEUE_PATH` em cloud edges é geralmente omitido — os containers são efêmeros, e o buffer em memória de 10.000 mensagens é suficiente para drenar reconexões rápidas.
