Configurar o Discord
Criar o App OAuth (login e NextAuth), configurar o redirect URI, virar o primeiro admin e, se quiser, o bot de alertas de canal.
O Discord é o único jeito de logar no OpenCall — não tem cadastro por
email/senha. Isso é o NextAuth por baixo dos panos: o provider de login é o
DiscordProvider, e as duas únicas coisas que o NextAuth precisa de você são
um segredo de sessão (NEXTAUTH_SECRET) e a URL pública do app
(NEXTAUTH_URL) — sem conta ou dashboard separado pra "configurar o
NextAuth", é tudo resolvido aqui.
Qualquer conta Discord consegue entrar; quem de fato ganha acesso aos canais é controlado depois, dentro do próprio app.
1. Criar a Application (login)
New Application → dê um nome (ex: o nome da sua comunidade).
Vá em OAuth2 (menu lateral). Copie:
- Client ID → vira
DISCORD_CLIENT_ID - Client Secret → vira
DISCORD_CLIENT_SECRET(clique em "Reset Secret" se não aparecer de cara)

2. Configurar o Redirect URI
Ainda em OAuth2 → Redirects, adicione:
https://SEU-DOMINIO/api/auth/callback/discord
Troque SEU-DOMINIO pelo domínio onde o Next.js vai ficar (ver Deploy do
Next.js). Se você ainda não tem domínio definido,
volte aqui depois — sem essa URL exata cadastrada, o login falha com
redirect_uri_mismatch.
Ambiente local
Pra testar em pnpm dev, adicione também
http://localhost:3000/api/auth/callback/discord como um segundo redirect.
3. Pegar seu Discord user ID
Isso vira o primeiro admin da instalação:
Discord → Configurações → Avançado → ative Modo desenvolvedor.
Clique com o botão direito no seu próprio nome/avatar em qualquer lugar do Discord → Copiar ID do usuário.
Guarde esse número — ele vai na variável BOOTSTRAP_ADMIN_DISCORD_IDS.
Como o acesso funciona (importante entender antes de configurar)
O login pelo Discord não é restrito por servidor/guild — qualquer pessoa
com conta Discord consegue autenticar. O controle de acesso real é um
allowlist manual dentro do próprio OpenCall: só quem tem a role ADMIN ou
CANAL_ACCESS no banco consegue entrar nos canais.
Isso cria um problema óbvio numa instalação nova: ninguém tem ADMIN pra
conceder acesso a ninguém. É pra isso que serve BOOTSTRAP_ADMIN_DISCORD_IDS
— uma env var com o(s) Discord ID(s) que devem nascer já como ADMIN no
primeiro login. Depois do primeiro login desses IDs, a variável pode ser
removida sem efeito (só importa na criação do usuário).
Com o ADMIN logado, o resto do time ganha acesso em /admin/channels.
4. Bot do Discord (opcional — alertas de canal)
Passo separado do login — só necessário se você quiser que o OpenCall poste no seu servidor Discord quando alguém entra num canal de voz vazio ("bora participar? 🎙️"), e para o botão de "Convidar pro canal". Sem isso configurado, o resto do OpenCall funciona normalmente, só sem esses avisos.
O bot vive dentro da mesma Application criada no passo 1 — não é um app separado.
Na mesma Application, vá em Bot (menu lateral) → Add Bot.
Em Token, clique Reset Token e copie — vira DISCORD_BOT_TOKEN.

Nenhum Privileged Gateway Intent é necessário
O bot do OpenCall só faz chamadas REST pontuais (abrir DM, postar e apagar mensagem) — ele nunca mantém uma conexão de Gateway aberta. Pode deixar todos os "Privileged Gateway Intents" dessa página desligados.

Vá em OAuth2 → URL Generator. Em Scopes, marque bot. Em
Bot Permissions, marque:
- View Channel
- Send Messages
- Embed Links

Copie a URL gerada no fim da página, abra num navegador logado no Discord, e selecione o servidor da sua comunidade pra adicionar o bot.
No servidor, ative o Modo desenvolvedor (se ainda não fez no passo 3),
clique com o botão direito no canal de texto onde os avisos devem aparecer
→ Copiar ID do canal → vira DISCORD_CHAT_CHANNEL_ID.
Variáveis desta etapa
| Variável | Valor |
|---|---|
DISCORD_CLIENT_ID | Client ID do passo 1 |
DISCORD_CLIENT_SECRET | Client Secret do passo 1 |
BOOTSTRAP_ADMIN_DISCORD_IDS | Seu Discord user ID (ou vários, separados por vírgula) |
NEXTAUTH_SECRET | Gerado por você — openssl rand -base64 32 |
NEXTAUTH_URL | https://SEU-DOMINIO (o mesmo domínio do redirect URI) |
DISCORD_BOT_TOKEN | (opcional) Token do passo 4 |
DISCORD_CHAT_CHANNEL_ID | (opcional) Id do canal do passo 4 |