Skip to main content

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

ComponenteOnde definirTotal
coredocker-compose core.environment ou .env montado60+ vars
dashboardbuild-time (Vite) — sem env vars próprias no momento0
worker (edge-integration)docker-compose ou .env no host onde roda o container7
worker-automation (edge-automation)mesmo padrão do worker7
sdk (consumido por worker/worker-automation)herda do processo pai7
emqxdocker-compose emqx.environment4

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ávelComponenteDescriçãoObrig.DefaultExemplo
DATABASE_URLcoreURL Postgres do core (Drizzle ORM).postgresql://api:<senha>@postgres:5432/api_test
REDIS_URLcoreURL Redis (cache, locks).redis://default:<senha>@redis:6379
EMQX_DATABASE_HOSTcoreHost do Postgres onde o EMQX lê mqtt_user/mqtt_acl.postgres
EMQX_DATABASE_PORTcorePorta desse Postgres.5432
EMQX_DATABASE_NAMEcoreNome do banco que o EMQX usa.emqx
EMQX_DATABASE_USERNAMEcoreUsuário Postgres para autenticar o broker.api
EMQX_DATABASE_PASSWORDcoreSenha Postgres correspondente.<senha>

2. MQTT / EMQX

Endereço e credenciais para conexão MQTT pelos diferentes componentes.
VariávelComponenteDescriçãoObrig.DefaultExemplo
EMQX_HOSTcore, worker, worker-automation, sdkHost do broker (sem esquema/porta — TCP MQTT em :1883).localhost (SDK)host.docker.internal
EMQX_URLcoreURL da Dashboard EMQX (HTTP admin API).http://host.docker.internal:18083
EMQX_TOKENcoreToken da Dashboard EMQX, usado pelo core para chamadas admin.<token_emqx>
EMQX_CLIENT_USERNAMEcore, worker, worker-automation, sdkUsuário MQTT do próprio cliente (no edge, é setado em runtime após pair/register-cloud).portal (core)portal
EMQX_CLIENT_PASSWORDcore, worker, worker-automation, sdkSenha MQTT correspondente.<senha_mqtt>
EMQX_PUBLIC_WS_URLcoreURL WebSocket pública do EMQX (entregue ao dashboard e mobile para conectar diretamente).ws://localhost:8083/mqttwss://emqx.example.com/mqtt
EMQX_NAMEemqx (container)Identificador do nó EMQX (cluster).emqx
EMQX_NODE__COOKIEemqx (container)Cookie de cluster Erlang.<uuid>
EMQX_DASHBOARD__DEFAULT_PASSWORDemqx (container)Senha inicial da Dashboard (admin/…).<senha_dashboard>
EMQX_ALLOW_ANONYMOUSemqx (container)Se true, libera conexões sem auth. Sempre false em produção.truefalse

3. Autenticação (Logto + M2M)

VariávelComponenteDescriçãoObrig.DefaultExemplo
LOGTO_URLcore, worker-automationURL base do tenant Logto.https://id.test.flexhome.casa
LOGTO_CLIENT_IDcoreClient ID OAuth do app principal.1dp6oy508vo3eza6r1gp5
LOGTO_CLIENT_SECRETcoreClient secret correspondente.<secret>
LOGTO_SIGNING_KEYcoreChave usada para assinar tokens internos.<signing_key>
LOGTO_MCP_CLIENT_IDcoreClient ID para integração com o MCP server.t2rhj977fiit7fry6jhuv
LOGTO_MCP_CLIENT_SECRETcoreClient secret MCP.<secret>
LOGTO_MANAGEMENT_CLIENT_IDcore, worker-automationClient ID para chamar a Management API do Logto.k6s2p15x2gxbr8uxazigp
LOGTO_MANAGEMENT_CLIENT_SECRETcore, worker-automationClient secret correspondente.<secret>
M2M_API_RESOURCEcore, worker-automationURI 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ávelComponenteDescriçãoObrig.DefaultExemplo
STRIPE_API_KEYcoreAPI key secreta do Stripe.sk_test_...
STRIPE_WEBHOOK_SECRETcoreSecret para validar webhooks do Stripe.whsec_...
APPLE_IAP_KEY_IDcoreKey ID do certificado App Store Connect (apenas mobile iOS).""4X66Z2SZ98
APPLE_IAP_ISSUER_IDcoreIssuer ID App Store Connect.""<uuid>
APPLE_IAP_BUNDLE_IDcoreBundle ID do app iOS.com.unicontrol.mobilecom.unicontrol.mobile
APPLE_IAP_PRIVATE_KEYcoreChave privada PEM (P-256) usada para assinar JWT da App Store.""-----BEGIN PRIVATE KEY-----...
APPLE_IAP_ENVcoreAmbiente App Store: Sandbox ou Production.SandboxSandbox

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ávelComponenteDescriçãoObrig.DefaultExemplo
CORE_API_URLworker, worker-automation, sdkURL HTTP do core para pair/register-cloud/bootstrap.http://core:3000
CORE_BASE_URLcoreURL pública do core para links retornados (callbacks OAuth, etc).http://localhost:3000https://api.portal.unisec.com.br
EDGE_TOKENworkerToken estático do edge home. Definido após criação no painel /edges.— (home)edge_kLeP5YwLs...
AUTOMATION_EDGE_TOKENworker-automationToken estático de edge home kind=‘automation’.— (home)edge_aD4tQpZmC...
PORTAL_CLOUD_EDGE_SECRETcore, workerShared secret para self-register de cloud integration edges.— (cloud)""<secret_cloud>
PORTAL_CLOUD_AUTOMATION_SECRETcore, worker-automationShared secret para self-register de cloud automation edges. Cai pra PORTAL_CLOUD_EDGE_SECRET se não definido.— (cloud)""<secret_cloud_automation>
EDGE_CREDS_PATHworker, worker-automationCaminho em disco onde o edge home persiste suas creds MQTT após pair../data/edge.json/app/data/edge.json
EDGE_QUEUE_PATHsdk (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
HOSTNAMEworker, worker-automationHostname 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ávelComponenteDescriçãoObrig.DefaultExemplo
TUYA_CLIENT_IDcoreClient ID da app cadastrada na Tuya IoT Platform.HA_3y9q4ak7g4ephrvke
TUYA_SCHEMAcoreSchema OAuth Tuya (usado no QR code).haauthorize
EWELINK_APP_IDcoreApp ID OAuth eWeLink (CoolKit).3m7IlbXYPbvwPmE9vZxblh1SOA4JE94T
EWELINK_APP_SECRETcoreApp secret correspondente.<secret>
DAIKIN_CLIENT_IDcoreClient ID OAuth Daikin.K1hVdwtKWTRbSb0B_qHXTxpB
DAIKIN_CLIENT_SECRETcoreClient secret Daikin.<secret>
SHELLY_CLIENT_IDcoreClient ID OAuth Shelly Cloud.""<id>
SHELLY_CLIENT_SECRETcoreClient secret Shelly.""<secret>
SHELLY_REDIRECT_URIcoreRedirect 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ávelComponenteDescriçãoObrig.DefaultExemplo
DIRECTUS_URLcoreURL da API REST do Directus.http://directus:8055
DIRECTUS_TOKENcoreStatic token do Directus para autenticar chamadas server-to-server.<token>
VAULT_ADDRcoreURL do HashiCorp Vault.https://vault.local
VAULT_TOKENcoreToken Vault.<token>
CONSUL_HTTP_ADDRcoreURL do HashiCorp Consul.https://consul.local
CONSUL_HTTP_TOKENcoreToken Consul (ACL).<token>
INFLUXDB_URLcoreURL do InfluxDB (séries temporais).https://influxdb.local
INFLUXDB_TOKENcoreToken InfluxDB.<token>
PANGOLIN_URLcoreURL da API Pangolin (sync de dispositivos).https://pangolin.local
PANGOLIN_TOKENcoreToken Pangolin.<token>
CLOUDFLARE_API_TOKENcoreAPI token Cloudflare (usado em integrações/tunnels).cfut_...
CLOUDFLARE_ACCOUNT_IDcoreAccount ID Cloudflare.<id>
CLOUDFLARE_ZONE_IDcoreZone ID Cloudflare (domínio gerenciado).<id>
ODOO_URLcoreURL Odoo (suporte/CRM).https://suporte.unisec.com.brhttps://unisec.odoo.com
ODOO_API_KEYcoreAPI key Odoo.<key>
ODOO_DATABASEcoreNome da base Odoo.suporteunisec
ODOO_LOGINcoreLogin Odoo.admincontato@unisec.com.br
CALENDLY_PAT_TOKENcorePersonal Access Token Calendly (agenda).eyJraWQiOi...
CALENDLY_WEBHOOK_SIGNING_KEYcoreChave para validar assinatura dos webhooks Calendly.<key>
CALENDLY_ORGANIZATION_URIcoreURI da organização Calendly.""https://api.calendly.com/organizations/<uuid>
WHATSAPP_TOKENcoreBearer token do WhatsApp Business API.<token>
WHATSAPP_ID_TELEPHONEcorePhone Number ID (não o número em si).<phone_id>

8. LLMs

Provedores de modelos de linguagem usados pelo assistente.
VariávelComponenteDescriçãoObrig.DefaultExemplo
ANTHROPIC_API_KEYcoreAPI key da Anthropic (Claude).sk-ant-api03-...
OLLAMA_BASE_URLcoreURL do servidor Ollama (LLM self-hosted).http://localhost:11434https://ollama.test.flexhome.casa
OLLAMA_MODELcoreIdentificador do modelo Ollama padrão.qwen3.5:cloudqwen3.5:cloud
OPENROUTER_API_KEYcoreAPI key OpenRouter (router de LLMs).""sk-or-v1-...
OPENROUTER_BASE_URLcoreURL base OpenRouter.https://openrouter.ai/api/v1(default)
OPENROUTER_MODELcoreModelo padrão no OpenRouter.qwen/qwen3.5-9b(default)

9. Misc / SDK

VariávelComponenteDescriçãoObrig.DefaultExemplo
MET_USER_AGENTsdk (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.brMeuApp/1.0 contato@exemplo.com

Apêndice — Modos do edge

HOME edge (roda na casa do usuário, atendendo apenas a org dele):
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):
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.