OpenCall

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.git
cd OpenCall

Depois instale as dependências:

pnpm install

2. 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/discord

Deixe 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 .env

Abra 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:docker

Esse 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:3000

O 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

ComandoO que faz
pnpm dev:dockerInfra + migrations + app, tudo de uma vez
pnpm devSó o app, quando os containers já estão de pé
pnpm docker:upSó os containers
pnpm docker:downPara os containers e mantém os dados
docker compose down -vPara e apaga o banco e os arquivos enviados

O que está escutando onde

PeçaEndereçoCredenciais
App (Next.js)http://localhost:3000—
Postgreslocalhost:5433opencall / opencall, banco opencall
MinIO (API S3)http://localhost:9000opencall / opencall123
MinIO (console web)http://localhost:9001as mesmas de cima
LiveKitws://localhost:7880devkey / 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.1 como 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 é o Dockerfile na raiz do repositório, buildado pela Railway ou pelo Render — ver Deploy produção (Railway).
  • GIF no chat precisa de chave. O GIPHY_API_KEY vem 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

SintomaCausa
Cannot connect to the Docker daemonO Docker Desktop não está rodando
port is already allocatedTem outra coisa na 3000, 9000 ou 7880 — feche e tente de novo
Environment variable not found: DATABASE_URLO arquivo se chama .env.local; tem que ser .env
O login volta com invalid_redirect_uriA Redirect URI no Discord não é exatamente http://localhost:3000/api/auth/callback/discord
Imagem no chat não sobeO 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).

On this page