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.tse dos próprios módulos consumidores.- Exemplos com valores marcados
<...>devem ser substituídos por segredos reais. Não use os valoresFAKENEWS/from-devque aparecem nodocker-compose.ymlde 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 |
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 emconfig_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):EDGE_TOKEN por AUTOMATION_EDGE_TOKEN.
CLOUD edge (frota compartilhada, atendendo várias orgs):
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.