Variáveis de ambiente
Referência completa — de onde vem cada valor.
Aqui é a referência rápida mais um .env.example pronto pra copiar.
Cole o bloco abaixo na aba de variável do serviço escolhido. Em Render ou Railway, colar tudo irá salvar cada chave em uma linha de tabela!
# Discord OAuth — o primeiro login (banco vazio) vira ADMIN automático.
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
NEXTAUTH_SECRET=
NEXTAUTH_URL=http://localhost:3000
# LiveKit
LIVEKIT_URL=
LIVEKIT_API_KEY=
LIVEKIT_API_SECRET=
# Postgres
DATABASE_URL=
# Armazenamento (opcional — sem ele o chat fica sem anexo de imagem).
# O R2 é o padrão; pra qualquer outro endpoint S3 preencha R2_ENDPOINT/R2_REGION
# em vez de R2_ACCOUNT_ID.
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=
NEXT_PUBLIC_R2_PUBLIC_BASE_URL=
R2_ENDPOINT=
R2_REGION=
# Dashboard de infra (opcional, só self-host)
SERVER_METRICS_INGEST_SECRET=
VPS_SSH_HOST=
VPS_SSH_PORT=22
VPS_SSH_USER=
VPS_SSH_PRIVATE_KEY=
# Geral
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_apiBaseUrl=http://localhost:3000
# Opcionais
NEXT_PUBLIC_RTC_ENABLED=
APP_COMMIT_SHA=
GIPHY_API_KEY=Cada grupo abaixo é detalhado na página dele.
Discord e sessão (detalhes)
| Variável | Observação |
|---|---|
DISCORD_CLIENT_ID | |
DISCORD_CLIENT_SECRET | |
NEXTAUTH_SECRET | openssl rand -base64 32 |
NEXTAUTH_URL | URL pública do app |
A primeira conta que logar com o banco vazio vira ADMIN — não existe
variável pra isso.
LiveKit (Cloud ou self-host)
| Variável | Observação |
|---|---|
LIVEKIT_URL | wss://... — mesmo formato no cloud e no self-host |
LIVEKIT_API_KEY | |
LIVEKIT_API_SECRET |
Postgres (detalhes)
| Variável | Observação |
|---|---|
DATABASE_URL |
Geral
| Variável | Observação |
|---|---|
NEXT_PUBLIC_APP_URL | Mesma URL do NEXTAUTH_URL |
NEXT_PUBLIC_apiBaseUrl | Sempre igual ao NEXT_PUBLIC_APP_URL — Server Actions e Server Components chamam a própria API do app por essa URL absoluta |
Sem essa variável o painel de admin quebra
Sem NEXT_PUBLIC_apiBaseUrl as Server Actions de admin e de usuário fazem
fetch em undefined/api/... e falham. Como é NEXT_PUBLIC_*, ela é gravada
no bundle em tempo de build — configurar depois e reiniciar o serviço não
resolve, precisa de um deploy/build novo.
Armazenamento (detalhes, opcional)
Sem elas o app sobe normalmente — só não aceita anexo de imagem no chat. O
prefixo R2_ nomeia o slot, não o provedor: as mesmas variáveis servem
Cloudflare R2 e Neon Object Storage.
| Variável | Observação |
|---|---|
R2_BUCKET | |
R2_ACCESS_KEY_ID | |
R2_SECRET_ACCESS_KEY | |
NEXT_PUBLIC_R2_PUBLIC_BASE_URL | Vai pro bundle do cliente, não é segredo |
R2_ACCOUNT_ID | Só no R2 — o endpoint é derivado dele |
R2_ENDPOINT | Qualquer endpoint S3 que não seja o R2 (Neon, MinIO). Setar ela também muda o client pra path-style |
R2_REGION | Só junto com R2_ENDPOINT. Default auto, que é o que o R2 exige; o Neon precisa da região real do projeto |
Opcionais
| Variável | Observação |
|---|---|
GIPHY_API_KEY | Habilita o botão de GIF no chat. Crie um app em developers.giphy.com. Nunca NEXT_PUBLIC_* — a busca passa pelo servidor |
NEXT_PUBLIC_RTC_ENABLED | false, 0 ou off desliga voz/vídeo no deploy inteiro. Qualquer outro valor (inclusive vazia) mantém ligado |
APP_COMMIT_SHA | Commit do deploy. Com ela, abas abertas durante um deploy novo recebem o aviso de "atualize a página". No Railway use RAILWAY_GIT_COMMIT_SHA |
Dashboard de infra (opcional — só self-host)
| Variável | Observação |
|---|---|
SERVER_METRICS_INGEST_SECRET | Mesmo valor no app e na VPS |
VPS_SSH_HOST | É também o que liga a aba "Infra" do admin |
VPS_SSH_PORT | Normalmente 22 |
VPS_SSH_USER | Um usuário restrito, não root |
VPS_SSH_PRIVATE_KEY | Chave privada PEM |
VULTR_API_KEY (se você usa Vultr) não vai no app — ela fica só na VPS, no
coletor de banda.