Obrigatórias
| Variável | Descrição |
|---|---|
DATABASE_URL | String de conexão do PostgreSQL |
BETTER_AUTH_SECRET | Segredo de autenticação (32 caracteres hex): openssl rand -hex 32. Precisa ser idêntico nos serviços app e realtime |
BETTER_AUTH_URL | A URL da sua aplicação — precisa ser a origem pública real, não localhost |
ENCRYPTION_KEY | Chave de criptografia (32 caracteres hex): openssl rand -hex 32 |
INTERNAL_API_SECRET | Segredo da API interna (32 caracteres hex): openssl rand -hex 32 |
NEXT_PUBLIC_APP_URL | URL pública da aplicação |
CRON_SECRET | Bearer token para os endpoints de jobs em background (32 caracteres hex). Obrigatório sempre que os jobs em background estiverem habilitados — o padrão do Helm chart, e o chart não é renderizado sem ele. Veja Jobs em Background |
API_ENCRYPTION_KEY | Criptografa em repouso as chaves de API geradas por usuários (32 caracteres hex). Necessária para criar chaves de API |
ENCRYPTION_KEY e API_ENCRYPTION_KEY não podem ser rotacionadas nem recuperadas. Perder qualquer uma delas torna os dados que ela protege permanentemente ilegíveis — variáveis de ambiente do workspace e pessoais, chaves de API de provedores armazenadas, credenciais OAuth de MCP e segredos de deploy/chat no primeiro caso; chaves de API do Studio geradas por usuários no segundo. Faça backup delas separadamente do banco de dados.
Fortemente recomendadas
| Variável | Descrição |
|---|---|
REDIS_URL | String de conexão do Redis. Opcional com uma única réplica; obrigatória a partir de mais de uma réplica de app ou realtime — veja Redis |
REDIS_TLS_SERVERNAME | Sobrescreve o SNI do TLS. Necessária quando REDIS_URL usa rediss:// com um IP puro, senão a aplicação falha ao iniciar |
NEXT_PUBLIC_SOCKET_URL | URL do WebSocket — o padrão é a origem da página; defina apenas se o realtime estiver em outro host |
TRUSTED_ORIGINS | Origens adicionais confiáveis para autenticação, separadas por vírgula (apex + www, domínios alias) |
AUTH_TRUSTED_PROXIES | IPs/CIDRs de proxies reversos separados por vírgula, para que o IP do cliente não possa ser falsificado via X-Forwarded-For |
INTERNAL_API_BASE_URL | URL interna para chamadas do servidor a si mesmo, por exemplo http://studio-app.studio.svc.cluster.local:3000. Necessária para a supressão de PII nos logs; o padrão é NEXT_PUBLIC_APP_URL |
DATABASE_REPLICA_URL | String de conexão de réplica de leitura para listagem de logs, logs de auditoria e agregações do dashboard. Recai para o primário quando não definida |
Provedores de IA
| Variável | Provedor |
|---|---|
OPENAI_API_KEY | OpenAI — também é o provedor padrão de embeddings da Knowledge Base |
ANTHROPIC_API_KEY_1 | Anthropic Claude |
GEMINI_API_KEY / GEMINI_API_KEY_1 | Google Gemini |
MISTRAL_API_KEY | Mistral |
XAI_API_KEY_1 | xAI |
KIMI_API_KEY_1 | Moonshot Kimi |
ZAI_API_KEY_1 | Z.ai |
TOGETHER_API_KEY | Together AI |
FIREWORKS_API_KEY | Fireworks AI |
BASETEN_API_KEY | Baseten |
COHERE_API_KEY | Cohere — necessária para o reranker do bloco Knowledge |
OLLAMA_URL | Ollama (padrão: http://localhost:11434) |
Bases de conhecimento exigem um provedor de embeddings hospedado. Três são suportados, selecionados com KB_EMBEDDING_MODEL: text-embedding-3-small (padrão) e text-embedding-3-large na OpenAI ou Azure OpenAI, e gemini-embedding-001 no Gemini. Não existe backend local de embeddings — configurar Ollama ou vLLM não substitui isso, porque os embeddings não passam pelo modelo de chat configurado.
Para balanceamento de carga, adicione várias chaves com os sufixos _1, _2, _3 (por exemplo, OPENAI_API_KEY_1, OPENAI_API_KEY_2). Funciona com OpenAI, Anthropic, Gemini, xAI, Kimi, Z.ai, Cohere e Fireworks.
No Docker, use OLLAMA_URL=http://host.docker.internal:11434 para o Ollama
na máquina host.
AWS Bedrock
| Variável | Descrição |
|---|---|
NEXT_PUBLIC_BEDROCK_DEFAULT_CREDENTIALS | Defina true ao usar a cadeia padrão de credenciais da AWS (IAM roles, ECS task roles, IRSA). Oculta os campos de credenciais na interface do bloco Agent |
Azure OpenAI
| Variável | Descrição |
|---|---|
AZURE_OPENAI_API_KEY | Chave de API do Azure OpenAI |
AZURE_OPENAI_ENDPOINT | URL do endpoint do Azure OpenAI |
AZURE_OPENAI_API_VERSION | Versão da API (por exemplo, 2024-02-15-preview) |
Endpoints auto-hospedados compatíveis com OpenAI
| Variável | Descrição |
|---|---|
VLLM_BASE_URL | URL do servidor vLLM, sem o sufixo /v1 (por exemplo, http://localhost:8000) — o Studio adiciona /v1 por conta própria |
VLLM_API_KEY | Bearer token opcional para o vLLM |
LITELLM_BASE_URL | URL base do proxy LiteLLM |
LITELLM_API_KEY | Bearer token opcional para o LiteLLM |
Provedores de Login
| Variável | Descrição |
|---|---|
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Google — também alimenta todas as integrações Google |
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET | GitHub |
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRET | Microsoft — também alimenta todas as integrações Microsoft |
DISABLE_GOOGLE_AUTH / DISABLE_GITHUB_AUTH / DISABLE_MICROSOFT_AUTH | Oculta um provedor da página de login sem remover as credenciais dele |
Veja Autenticação.
Credenciais de Integrações
Integrações não funcionam em uma implantação auto-hospedada até você registrar seu próprio app OAuth em cada serviço e definir o *_CLIENT_ID / *_CLIENT_SECRET correspondente. São cerca de 27 deles, cobrindo 50 conectores. A tabela completa, o formato da redirect URI e os passos de configuração estão em Integrações & OAuth.
Controle de Acesso
| Variável | Descrição |
|---|---|
DISABLE_REGISTRATION | Defina true para bloquear todas as novas contas, incluindo login social. Convites continuam funcionando para quem já tem conta. SSO não é afetado |
DISABLE_EMAIL_SIGNUP | Bloqueia novos cadastros com e-mail/senha; o login por e-mail existente continua funcionando |
ALLOWED_LOGIN_DOMAINS | Restringe cadastros a domínios (separados por vírgula) |
ALLOWED_LOGIN_EMAILS | Restringe cadastros a e-mails específicos (separados por vírgula) |
BLOCKED_SIGNUP_DOMAINS | Impede domínios específicos de se cadastrarem (separados por vírgula) |
SIGNUP_MX_VALIDATION_ENABLED | Rejeita domínios sem registro MX ou com um backend de e-mail na denylist |
BLOCKED_EMAIL_MX_HOSTS | Trechos de hosts MX a bloquear; usado apenas junto com a variável acima |
DISABLE_INVITATIONS / NEXT_PUBLIC_DISABLE_INVITATIONS | Desabilita convites de workspace globalmente |
DISABLE_PUBLIC_API / NEXT_PUBLIC_DISABLE_PUBLIC_API | Desabilita a API pública globalmente |
DISABLE_AUTH | Ignora a autenticação por completo, criando uma sessão anônima para cada requisição |
DISABLE_AUTH=true transforma qualquer pessoa que consiga alcançar a instância em um usuário com privilégios totais. Use apenas em uma instância de um único usuário em rede privada, nunca atrás de um ingress exposto à internet.
Execução de Código
| Variável | Descrição |
|---|---|
SANDBOX_PROVIDER | Provedor de sandbox remoto: e2b (padrão) ou daytona |
E2B_ENABLED / E2B_API_KEY | Habilita a execução remota no E2B |
DAYTONA_API_KEY | Chave de API do Daytona (usada quando SANDBOX_PROVIDER=daytona) |
IVM_MAX_EXECUTIONS_PER_WORKER | Execuções antes de um worker isolated-vm ser reciclado |
IVM_MAX_BROKERS_PER_EXECUTION | Brokers de chamadas ao host por execução |
IVM_MAX_BROKER_ARGS_JSON_CHARS | Tamanho máximo do payload de argumentos |
IVM_MAX_BROKER_RESULT_JSON_CHARS | Tamanho máximo do payload de resultado |
Sem um provedor remoto, o código do usuário roda em um isolate V8 no próprio processo, dentro do contêiner da aplicação. Veja Segurança.
Rede & Limites
| Variável | Padrão | Descrição |
|---|---|---|
API_MAX_JSON_BODY_BYTES | 50 MB | Corpo JSON máximo em rotas de API validadas por contrato |
CHAT_MAX_REQUEST_BYTES | 220 MB | Corpo máximo no endpoint público de chat deployado |
WEBHOOK_MAX_REQUEST_BYTES | 10 MB | Corpo máximo nos endpoints públicos receptores de webhook |
WORKFLOW_EXECUTION_CONCURRENCY_LIMIT | 75 | Execuções de workflow em paralelo |
WEBHOOK_EXECUTION_CONCURRENCY_LIMIT | 75 | Execuções disparadas por webhook em paralelo |
SCHEDULE_EXECUTION_CONCURRENCY_LIMIT | 30 | Execuções agendadas em paralelo |
RESUME_EXECUTION_CONCURRENCY_LIMIT | 50 | Execuções retomadas em paralelo |
ALLOW_PRIVATE_DATABASE_HOSTS | não definida | Permite que ferramentas de banco de dados/conectores alcancem hosts privados, reservados e de loopback. Afrouxa a barreira contra SSRF |
O limite de tamanho de corpo do seu proxy reverso precisa ser pelo menos tão grande quanto os limites da aplicação acima. Veja Rede.
Observabilidade
| Variável | Descrição |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | Endpoint do coletor OTLP |
OTEL_EXPORTER_OTLP_HEADERS | Headers de autenticação, key=value separados por vírgula |
OTEL_TRACES_SAMPLER_ARG | Proporção de amostragem de traces |
OTEL_DEPLOYMENT_ENVIRONMENT | Rótulo de ambiente nos spans emitidos |
TELEMETRY_SAMPLING_RATIO | Proporção de amostragem no nível da aplicação |
TELEMETRY_ENDPOINT | Para onde a telemetria anônima é enviada. O padrão é https://telemetry.seeyu.ai/v1/traces — aponte para o seu próprio coletor para manter os traces internos |
NEXT_TELEMETRY_DISABLED | Defina como 1 para desabilitar completamente a telemetria anônima |
GRAFANA_OTLP_ENDPOINT / GRAFANA_OTLP_HEADERS / GRAFANA_DEPLOYMENT_ENVIRONMENT | Exportação OTLP para o Grafana Cloud |
Veja Observabilidade.
Bases de Conhecimento
| Variável | Descrição |
|---|---|
KB_EMBEDDING_MODEL | Modelo de embeddings para novas bases de conhecimento. O padrão é text-embedding-3-small; um valor não suportado recai para o padrão |
COHERE_API_KEY | Habilita o reranker do bloco Knowledge |
Chat & PII
| Variável | Descrição |
|---|---|
COPILOT_API_KEY | Chave de API do Chat. Sem ela, o bloco Studio Chat, os jobs de prompt agendados e a Inbox não funcionam |
NEXT_PUBLIC_CHAT_DISABLED | Defina como true para ocultar o módulo Chat: o workspace abre no seu primeiro workflow, sem lista de chats, sem tarefas agendadas e sem o painel Chat no editor. O Chat aparece quando a variável não está definida; bun run setup a define para você se pular a chave do chat |
PII_REDACTION | Suprime PII dos logs de workflow via regras de Data Retention; requer o serviço de PII e um INTERNAL_API_BASE_URL alcançável no cluster |
PII_GRANULAR_REDACTION | Expõe adicionalmente os estágios de supressão que alteram a execução |
DURABLE_SECRET_PROVENANCE_ENFORCED_SURFACES | Armazenamentos duráveis em que um valor cuja procedência de segredo nunca foi registrada faz a execução falhar em vez de apenas gerar um aviso. all, ou um subconjunto separado por vírgula de memory, table-row, knowledge. Não definida (nada aplicado) por padrão |
ADMIN_API_KEY | Chave de API de administração para operações de GitOps e provisionamento de organizações |
Recursos Enterprise
Em implantações auto-hospedadas, os recursos enterprise são liberados por configuração, não por cobrança. Uma única chave liga o conjunto completo; as flags por recurso abaixo dela sobrescrevem essa chave nos dois sentidos.
| Variável | Descrição |
|---|---|
ENTERPRISE_ENABLED, NEXT_PUBLIC_ENTERPRISE_ENABLED | Habilita todo o conjunto de recursos enterprise |
INSTANCE_ORG_NAME | Nome da organização à qual todo usuário entra automaticamente no cadastro |
INSTANCE_ORG_SLUG | Slug dessa organização (derivado do nome quando omitido) |
INSTANCE_ORG_OWNER_EMAIL | Proprietário dessa organização (por padrão, o primeiro usuário a se cadastrar) |
A maioria dos recursos enterprise lê suas configurações da organização que é dona de um workspace, então habilitar apenas as flags não basta — a implantação também precisa de um modelo de organização. Veja o guia enterprise auto-hospedado para as flags por recurso, os dois padrões de organização e a Admin API.
Armazenamento de Arquivos
Por padrão, o Studio grava os uploads no disco local. Em produção, aponte-o para AWS S3, Azure Blob ou Google Cloud Storage. Veja Object Storage para a configuração completa, o layout do bucket e a política de IAM.
| Variável | Descrição |
|---|---|
AWS_REGION | Região da AWS — defina junto com S3_BUCKET_NAME para habilitar o S3 |
AWS_ACCESS_KEY_ID | Access key da AWS. Omita para usar a cadeia de credenciais de instância/IRSA |
AWS_SECRET_ACCESS_KEY | Secret key da AWS. Omita para usar a cadeia de credenciais de instância/IRSA |
S3_BUCKET_NAME | Bucket geral de arquivos do workspace — defina junto com AWS_REGION para habilitar o S3 |
AZURE_STORAGE_CONTAINER_NAME | Container geral de arquivos — defina junto com as credenciais do Azure para habilitar o Blob (tem precedência sobre o S3) |
AZURE_CONNECTION_STRING | String de conexão do Azure, ou use AZURE_ACCOUNT_NAME + AZURE_ACCOUNT_KEY |
GCS_BUCKET_NAME | Bucket geral de arquivos do workspace — habilita o GCS quando nem o Azure Blob nem o S3 estão configurados |
GCS_PROJECT_ID | ID do projeto na GCP. Omita para inferir das credenciais/ADC |
GCS_CREDENTIALS_JSON | JSON da conta de serviço, inline. Omita para usar Application Default Credentials (Workload Identity, GOOGLE_APPLICATION_CREDENTIALS) |
Provedores de E-mail
Configure pelo menos um. Todo provedor configurado permanece ativo e é tentado em ordem — Resend → AWS SES → SMTP → Azure Communication Services → Gmail — passando para o próximo apenas em caso de falha. Sem nenhum configurado, o e-mail simplesmente não é enviado, silenciosamente. Configuração, verificação e resolução de problemas estão em E-mail.
| Provedor | Variáveis |
|---|---|
| Compartilhadas | FROM_EMAIL_ADDRESS, EMAIL_DOMAIN, EMAIL_VERIFICATION_ENABLED |
| Resend | RESEND_API_KEY |
| AWS SES | AWS_SES_REGION (credenciais pela cadeia de provedores da AWS) |
| SMTP | SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_SECURE |
| Azure ACS | AZURE_ACS_CONNECTION_STRING |
| Gmail | GMAIL_CREDENTIALS_JSON, GMAIL_SENDER |
Limites
Implantações auto-hospedadas (com cobrança desabilitada) rodam sem limites de plano: sem rate limits, sem timeouts de execução, sem tetos de tabelas ou armazenamento e sem exclusão de dados por retenção. Cada limite pode ser reativado individualmente, definindo explicitamente a variável dele.
| Variável | Ativa | Valor sugerido |
|---|---|---|
RATE_LIMIT_FREE_SYNC | Execuções sincronizadas por minuto | 50 |
RATE_LIMIT_FREE_ASYNC | Execuções assíncronas por minuto | 200 |
RATE_LIMIT_FREE_API_ENDPOINT | Requisições ao endpoint da API v1 por minuto | 30 |
EXECUTION_TIMEOUT_FREE | Timeout de execução sincronizada (segundos) | 300 |
EXECUTION_TIMEOUT_ASYNC_FREE | Timeout de execução assíncrona (segundos) | 5400 |
FREE_TABLES_LIMIT | Máximo de tabelas de usuário por workspace | 5 |
FREE_TABLE_ROWS_LIMIT | Máximo de linhas por tabela de usuário | 50000 |
FREE_STORAGE_LIMIT_GB | Cota de armazenamento de arquivos (GB) | 5 |
Sem cobrança, toda conta é resolvida para o tier gratuito, então apenas as variáveis do tier gratuito se aplicam. Definir uma variável aplica somente aquele limite — os demais continuam ilimitados.
Nenhuma das implantações predefine esses valores. O Helm chart fazia isso antes, o que aplicava tetos de planos hospedados em instalações auto-hospedadas; o chart 1.5.0 removeu os presets, então Compose e Kubernetes se comportam de forma idêntica.
Exemplo de .env
# Core
DATABASE_URL=postgresql://postgres:postgres@db:5432/studio
NEXT_PUBLIC_APP_URL=https://studio.yourdomain.com
BETTER_AUTH_URL=https://studio.yourdomain.com
# Secrets — generate each with `openssl rand -hex 32`
BETTER_AUTH_SECRET=<openssl rand -hex 32>
ENCRYPTION_KEY=<openssl rand -hex 32>
INTERNAL_API_SECRET=<openssl rand -hex 32>
API_ENCRYPTION_KEY=<openssl rand -hex 32>
CRON_SECRET=<openssl rand -hex 32>
# Coordination (required past one replica)
REDIS_URL=redis://redis:6379
# Models — OPENAI_API_KEY also powers knowledge base embeddings
OPENAI_API_KEY=sk-...
# Email
RESEND_API_KEY=re_...
FROM_EMAIL_ADDRESS="Studio <noreply@yourdomain.com>"
# Access control
ALLOWED_LOGIN_DOMAINS=yourdomain.comVeja apps/core-api/.env.example para as opções dos serviços, e apps/web/.env.example para as da web.