Obrigatórias
| Variável | Descrição |
|---|---|
DATABASE_URL | String de conexão do PostgreSQL |
BETTER_AUTH_SECRET | Segredo de auth (32 chars hex): openssl rand -hex 32 |
BETTER_AUTH_URL | URL do seu app |
ENCRYPTION_KEY | Chave de criptografia (32 chars hex): openssl rand -hex 32 |
INTERNAL_API_SECRET | Segredo da API interna (32 chars hex): openssl rand -hex 32 |
NEXT_PUBLIC_APP_URL | URL pública do app |
NEXT_PUBLIC_SOCKET_URL | Opcional. URL do WebSocket — o padrão é a origem da página; defina só se o realtime estiver em um host separado. |
Provedores de IA
| Variável | Provedor |
|---|---|
OPENAI_API_KEY | OpenAI |
ANTHROPIC_API_KEY_1 | Anthropic Claude |
GEMINI_API_KEY_1 | Google Gemini |
MISTRAL_API_KEY | Mistral |
OLLAMA_URL | Ollama (padrão: http://localhost:11434) |
Para balanceamento de carga, adicione várias chaves com sufixos _1, _2, _3 (ex.: OPENAI_API_KEY_1, OPENAI_API_KEY_2). Funciona com OpenAI, Anthropic e Gemini.
No Docker, use OLLAMA_URL=http://host.docker.internal:11434 para Ollama na máquina host.
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 (ex.: 2024-02-15-preview) |
vLLM (self-hosted)
| Variável | Descrição |
|---|---|
VLLM_BASE_URL | URL do servidor vLLM (ex.: http://localhost:8000/v1) |
VLLM_API_KEY | Bearer token opcional para o vLLM |
Provedores OAuth
| Variável | Descrição |
|---|---|
GOOGLE_CLIENT_ID | Client ID OAuth do Google |
GOOGLE_CLIENT_SECRET | Client secret OAuth do Google |
GITHUB_CLIENT_ID | Client ID OAuth do GitHub |
GITHUB_CLIENT_SECRET | Client secret OAuth do GitHub |
Opcionais
| Variável | Descrição |
|---|---|
API_ENCRYPTION_KEY | Criptografa chaves de API armazenadas (32 chars hex): openssl rand -hex 32 |
COPILOT_API_KEY | Chave de API para recursos do copilot |
ADMIN_API_KEY | Chave de API admin para operações GitOps |
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) |
DISABLE_REGISTRATION | Defina como true para desativar novos cadastros |
Armazenamento de arquivos
Por padrão o Zoen grava uploads no disco local. Em produção, aponte para AWS S3, Azure Blob ou Google Cloud Storage. Veja Object Storage para o setup completo, layout de buckets e política IAM.
| Variável | Descrição |
|---|---|
AWS_REGION | Região AWS — defina com S3_BUCKET_NAME para ativar o S3 |
AWS_ACCESS_KEY_ID | Access key da AWS. Omita para usar a cadeia de credenciais da instância/IRSA |
AWS_SECRET_ACCESS_KEY | Secret key da AWS. Omita para usar a cadeia de credenciais da instância/IRSA |
S3_BUCKET_NAME | Bucket geral de arquivos do workspace — defina com AWS_REGION para ativar o S3 |
AZURE_STORAGE_CONTAINER_NAME | Container geral de arquivos — defina com credenciais Azure para ativar Blob (tem precedência sobre S3) |
AZURE_CONNECTION_STRING | Connection string do Azure, ou use AZURE_ACCOUNT_NAME + AZURE_ACCOUNT_KEY |
GCS_BUCKET_NAME | Bucket geral de arquivos do workspace — ativa o GCS quando nem Azure Blob nem S3 estão configurados |
GCS_PROJECT_ID | ID do projeto GCP. Omita para inferir das credenciais/ADC |
GCS_CREDENTIALS_JSON | JSON inline da service account. Omita para usar Application Default Credentials (Workload Identity, GOOGLE_APPLICATION_CREDENTIALS) |
Provedores de e-mail
Configure um provedor — o mailer detecta automaticamente na ordem de prioridade: Resend → AWS SES → SMTP → Azure Communication Services → Gmail. Se nenhum estiver configurado, os e-mails são registrados no console.
| Variável | Descrição |
|---|---|
FROM_EMAIL_ADDRESS | Endereço do remetente (ex.: Zoen <noreply@example.com>). Fallback para noreply@EMAIL_DOMAIN. |
EMAIL_DOMAIN | Domínio padrão quando FROM_EMAIL_ADDRESS não está definido |
EMAIL_VERIFICATION_ENABLED | Defina como true para exigir verificação de e-mail no cadastro |
Resend
| Variável | Descrição |
|---|---|
RESEND_API_KEY | Chave de API de resend.com |
AWS SES
| Variável | Descrição |
|---|---|
AWS_SES_REGION | Região AWS para o SES (ex.: us-east-1). As credenciais são resolvidas pela cadeia padrão do AWS SDK (env vars, IRSA, role de instância ECS/EC2, SSO). |
SMTP (funciona com MailHog, Postfix, SendGrid SMTP, etc.)
| Variável | Descrição |
|---|---|
SMTP_HOST | Hostname do servidor SMTP |
SMTP_PORT | 465 para TLS implícito, 587 para STARTTLS, 25 para plain |
SMTP_USER | Opcional — omita para relays sem autenticação |
SMTP_PASS | Opcional — omita para relays sem autenticação |
SMTP_SECURE | Defina como true para forçar TLS na conexão; auto-true na porta 465 |
Azure Communication Services
| Variável | Descrição |
|---|---|
AZURE_ACS_CONNECTION_STRING | Connection string do Azure Communication Services |
Gmail (nativo do Google — o GCP não tem serviço próprio de e-mail transacional, então o caminho nativo é a Gmail API com um remetente do Google Workspace)
| Variável | Descrição |
|---|---|
GMAIL_CREDENTIALS_JSON | JSON inline da service account. A service account precisa de domain-wide delegation concedida para o escopo https://www.googleapis.com/auth/gmail.send no console de admin do Workspace |
GMAIL_SENDER | O usuário do Workspace que a service account personifica ao enviar (ex.: noreply@yourdomain.com). FROM_EMAIL_ADDRESS deve corresponder a esse usuário ou a um dos aliases registrados — o Gmail reescreve endereços From não reconhecidos |
Como alternativa, o Google Workspace SMTP relay funciona pelo provedor SMTP genérico (SMTP_HOST=smtp-relay.gmail.com, porta 587) sem precisar de service account.
Limites
Deployments self-hosted (billing desativado) rodam sem limites de plano: sem rate limits, sem timeouts de execução, sem caps de tabelas ou armazenamento, e sem exclusão de dados por retenção. Cada limite pode ser reativado individualmente definindo explicitamente a variável correspondente.
| Variável | Opta por | Valor sugerido |
|---|---|---|
RATE_LIMIT_FREE_SYNC | Execuções sync por minuto | 50 |
RATE_LIMIT_FREE_ASYNC | Execuções async 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 sync (segundos) | 300 |
EXECUTION_TIMEOUT_ASYNC_FREE | Timeout de execução async (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 billing, toda conta resolve para o tier free, então só as variáveis do tier free se aplicam. Definir uma variável aplica só aquele limite — o restante continua ilimitado.
Deployments instalados com o chart Helm já vêm com essas variáveis pré-definidas em app.envDefaults, então instalações via chart mantêm a aplicação dos limites a menos que essas chaves sejam removidas ou sobrescritas.
Exemplo de .env
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=<openssl rand -hex 32>
BETTER_AUTH_URL=https://sim.yourdomain.com
ENCRYPTION_KEY=<openssl rand -hex 32>
INTERNAL_API_SECRET=<openssl rand -hex 32>
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
OPENAI_API_KEY=sk-...Veja apps/sim/.env.example para todas as opções.