Rodar localmente (Docker)
Um comando sobe Postgres, armazenamento e LiveKit na sua máquina — a única coisa pra preencher na mão é o Discord.
Rodar localmente é o jeito mais rápido de ver o OpenCall funcionando: nada é provisionado na nuvem, nada custa nada e você pode quebrar o que quiser. É também o setup pra usar se a ideia for mexer no código.
O docker compose sobe as três peças de infra de que o app depende — Postgres,
MinIO (compatível com S3, no lugar do Cloudflare R2) e um
servidor LiveKit (no lugar do LiveKit Cloud). O app em si, o Next.js, roda na
sua máquina com pnpm dev, fora dos containers, pra o hot reload continuar
funcionando enquanto você edita.
O Discord é a única parte que fica manual
O login passa pelos servidores do Discord, então não dá pra containerizar:
você precisa de uma aplicação Discord própria, com http://localhost:3000
registrado como redirect. É o passo 2 aqui embaixo e leva dois minutos.
O que você precisa
-
Docker Desktop rodando — docker.com/get-started. No Windows ele pede pra habilitar o WSL 2 durante a instalação; aceite.
-
Node.js, que é o que fornece o
npm— ver "Antes de começar" em Requisitos. -
pnpm, o gerenciador de pacotes que o repositório usa:
npm install -g pnpm -
Um fork do repositório, feito em Repositório no GitHub.
1. Clone o seu fork
Troque SEU-USUARIO pelo seu usuário do GitHub.
git clone https://github.com/SEU-USUARIO/OpenCall.gitcd OpenCallDepois instale as dependências:
pnpm install2. Crie a aplicação no Discord
Siga Configurar o Discord, com uma diferença: a Redirect URI é o endereço local, não um domínio.
http://localhost:3000/api/auth/callback/discordDeixe o Client ID e o Client Secret à mão — eles entram no passo seguinte.
3. Preencha o .env
O repositório já vem com um .env.docker.example cujos valores batem com o
docker-compose.yml. Copie ele:
cp .env.docker.example .envAbra o .env e preencha as duas únicas linhas vazias que importam:
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=Todo o resto — banco, LiveKit, MinIO — já aponta pros containers, e o
NEXTAUTH_SECRET vem com um valor de desenvolvimento que serve localmente.
Tem que ser .env, não .env.local
O Next.js lê os dois, mas a CLI do Prisma só lê o .env. Se o arquivo tiver o
outro nome, o pnpm dev funciona e a migration quebra com Environment variable not found: DATABASE_URL.
4. Suba tudo
Com o Docker Desktop aberto:
pnpm dev:dockerEsse comando sozinho faz três coisas, em ordem: sobe os containers (pnpm docker:up), cria as tabelas no Postgres (prisma migrate dev) e inicia o
Next.js (pnpm dev). Quando termina, ele imprime o endereço:
http://localhost:3000O minio-init sair não é erro
Entre os containers tem um job que roda uma vez só, pra criar o bucket e
liberar leitura pública. Ele executa e para — exited (0) no Docker Desktop é
a cara do sucesso dele.
5. Primeiro login
Abra o localhost:3000 e entre com o Discord.
A primeira conta que logar com o banco vazio é criada como ADMIN, e junto com
ela nascem um canal de texto e um canal de voz chamados Geral. Como a máquina
é sua, essa primeira conta é a sua.
No dia a dia
| Comando | O que faz |
|---|---|
pnpm dev:docker | Infra + migrations + app, tudo de uma vez |
pnpm dev | Só o app, quando os containers já estão de pé |
pnpm docker:up | Só os containers |
pnpm docker:down | Para os containers e mantém os dados |
docker compose down -v | Para e apaga o banco e os arquivos enviados |
O que está escutando onde
| Peça | Endereço | Credenciais |
|---|---|---|
| App (Next.js) | http://localhost:3000 | — |
| Postgres | localhost:5433 | opencall / opencall, banco opencall |
| MinIO (API S3) | http://localhost:9000 | opencall / opencall123 |
| MinIO (console web) | http://localhost:9001 | as mesmas de cima |
| LiveKit | ws://localhost:7880 | devkey / secret |
O Postgres está na 5433, e não na 5432 de sempre, de propósito: assim ele não briga com um Postgres que você já tenha instalado na máquina.
Limites do ambiente local
- Voz e vídeo só funcionam nessa máquina. O container do LiveKit anuncia
127.0.0.1como candidato ICE, então outro aparelho no mesmo Wi-Fi até abre a página, mas nunca entra na chamada. Pra testar com outras pessoas, use o Deploy demo (Render). - Isso não é o deploy de produção. O
docker-compose.ymlé infra de desenvolvimento, com chaves e senhas fixas à vista. O que vai pra produção é oDockerfilena raiz do repositório, buildado pela Railway ou pelo Render — ver Deploy produção (Railway). - GIF no chat precisa de chave. O
GIPHY_API_KEYvem vazio no arquivo de exemplo; sem ele o botão de GIF simplesmente não aparece e o resto do chat funciona igual.
Quando alguma coisa dá errado
| Sintoma | Causa |
|---|---|
Cannot connect to the Docker daemon | O Docker Desktop não está rodando |
port is already allocated | Tem outra coisa na 3000, 9000 ou 7880 — feche e tente de novo |
Environment variable not found: DATABASE_URL | O arquivo se chama .env.local; tem que ser .env |
O login volta com invalid_redirect_uri | A Redirect URI no Discord não é exatamente http://localhost:3000/api/auth/callback/discord |
| Imagem no chat não sobe | O job minio-init não rodou — dê pnpm docker:down e pnpm docker:up de novo |
Próximo passo
Pra colocar uma instância no ar pras outras pessoas, sem cartão: Deploy demo (Render).