Configuração (.env)
# ── Ambiente ──────────────────────────────────────────────────────
# development → debug, hotreload e pprof ativados automaticamente
# production → modo otimizado, debug desligado
APP_ENV=development
# ── Servidor ──────────────────────────────────────────────────────
SERVER_HOST=0.0.0.0 # bind — veja a nota abaixo antes de abrir no navegador
SERVER_PORT=8000
SERVER_WORKERS=4 # omitir para usar todos os CPUs disponíveis
# ── Hosts permitidos ──────────────────────────────────────────────
# Ignorado em development. Obrigatório em production.
ALLOWED_HOSTS=meusite.com.br,www.meusite.com.br
# ── URL canônica (opcional) ────────────────────────────────────────
# Sem barra final. Usada pelo app embutido "meta" (apps/meta) para montar
# URLs absolutas em robots.txt, sitemap.xml e security.txt — veja SEO &
# Security.txt. Vazia até configurar; nesse caso esses arquivos saem sem
# domínio (ainda válidos, mas incompletos).
# APP_URL=https://meusite.com.br
# ── Fuso horário (opcional) ──────────────────────────────────────────
# Nome IANA usado pelo admin para EXIBIR timestamps automáticos
# (created_at/updated_at, histórico) — nunca afeta o que é gravado no
# banco (colunas TIMESTAMPTZ guardam o instante absoluto). Padrão UTC se
# ausente; nome inválido cai pra UTC com aviso no log, não derruba o boot.
# APP_TIMEZONE=America/Sao_Paulo
# ── Banco de dados ────────────────────────────────────────────────
# Cada bloco DB_NAME inicia um novo banco. O primeiro é o padrão.
DB_NAME=principal
DB_ENABLED=true
DB_DRIVER=postgres
DB_DSN=postgres://user:password@localhost:5432/meudb?sslmode=disable
# DB_NAME=analytics
# DB_ENABLED=true
# DB_DRIVER=postgres
# DB_DSN=postgres://user:password@localhost:5432/analytics?sslmode=disable
# ── Cache ─────────────────────────────────────────────────────────
CACHE_ENABLED=false
CACHE_DRIVER=memory
CACHE_ADDR=localhost:6379
# ── Queue (fila de tarefas em background) ─────────────────────────
QUEUE_ENABLED=false
QUEUE_DRIVER=memory # memory | redis (roadmap)
QUEUE_ADDR=localhost:6379
QUEUE_WORKERS=4
# ── Admin (painel opt-in por model — precisa de admin.Register[T] no código)
ADMIN_ENABLED=false
ADMIN_PATH=/admin/
# Opcional — cria o superusuário inicial no boot, se ainda não existir
# ninguém com esse login (não redefine senha de conta já existente)
# ADMIN_SUPERUSER_USERNAME=admin
# ADMIN_SUPERUSER_PASSWORD=troque-esta-senha-provisoria
# ── Segurança ─────────────────────────────────────────────────────
SECRET_KEY=sua-chave-secreta-forte-aqui
SESSION_TTL=3600 # duração da sessão em segundos
# Pepper aplicado antes do hash Argon2id — nunca armazenar no banco
# Gere com: openssl rand -base64 32
PASSWORD_PEPPER=seu-pepper-forte-aqui
# Chave AES-256-GCM para campos kyrux:"encrypt" — nunca armazenar no banco
# Gere com: openssl rand -base64 32
FIELD_ENCRYPTION_KEY=sua-chave-de-criptografia-forte-aqui
# ── Runtime (opcional) ────────────────────────────────────────────
# Percentual de GC do Go. Padrão: 100. Reduzir (ex: 75) diminui heap, aumenta frequência de GC.
# RUNTIME_GOGC=75
Em produção
SECRET_KEY,PASSWORD_PEPPER,FIELD_ENCRYPTION_KEYeALLOWED_HOSTSsão obrigatórios — o servidor recusa iniciar sem eles.
SERVER_HOST=0.0.0.0 é o endereço de bind, não de acesso
0.0.0.0 diz ao servidor para escutar em todas as interfaces de rede da
máquina — não é um endereço real para o qual um navegador consiga se
conectar. Digitar http://0.0.0.0:8000 na barra de endereços resulta em
ERR_CONNECTION_REFUSED (ou comportamento inconsistente, dependendo do SO).
| Endereço | O que é | Uso |
|---|---|---|
0.0.0.0 |
Curinga "todas as interfaces" | Só para SERVER_HOST (bind) |
127.0.0.1 |
Loopback — esta máquina, sempre existente e roteável | Acessar localmente |
localhost |
Nome que o SO resolve para 127.0.0.1 (ou ::1) |
Acessar localmente |
Para acessar o servidor rodando localmente, use sempre http://127.0.0.1:PORTA
ou http://localhost:PORTA — nunca 0.0.0.0, mesmo com SERVER_HOST=0.0.0.0
configurado (o bind continua em todas as interfaces; só o endereço de acesso
muda). O Kyrux já traduz isso sozinho nas mensagens que imprime (console,
welcome page, debug dashboard) — todas mostram 127.0.0.1, nunca 0.0.0.0.