Aplicação Next.js 14 que centraliza o fluxo de conexão do WhatsApp com a Evolution API via QR Code. Todo o tráfego sensível (URL base e chave privada) passa pelo backend do Next, garantindo que o navegador nunca tenha contato direto com os segredos da Evolution.
- Visão geral
- Principais recursos
- Stack utilizada
- Requisitos
- Variáveis de ambiente
- Configuração e execução
- Scripts npm disponíveis
- Estrutura do projeto
- Fluxo de conexão
- Integração com Evolution API
- Execução com Docker
- Documentação adicional
- Solução de problemas
- Próximos passos sugeridos
O conector foi pensado para ser uma camada fina entre o usuário final e a Evolution API. Ele expõe uma interface única onde o operador informa o nome da instância e, a partir daí, o aplicativo se encarrega de:
- Verificar o estado atual da instância.
- Gerar QR Code e/ou código de pareamento quando necessário.
- Acompanhar o estado de conexão até a confirmação de sucesso.
- Exibir métricas e dados do número conectado, permitindo desconectar ou reiniciar a instância.
- Fluxo orientado por etapas com estados
instance,qrcodeeconnected. - Geração automática do QR Code e código de pareamento a cada 45 segundos.
- Monitoramento do estado (
instance/connectionState) com polling a cada 5 segundos. - Exibição de foto, nome e número do perfil conectado (com fallback seguro).
- Métricas de contatos, chats e mensagens, com formatação localizada (
pt-BR). - Ações administrativas rápidas: atualizar dados, reiniciar ou desconectar a instância.
- Proxy backend que encapsula
API_BASE_URLeAPI_KEY, evitando vazamentos no frontend.
- Next.js 14 (App Router) e React 18.
- TypeScript para tipagem estática.
- CSS module global (
app/globals.css) com design responsivo básico. - Node.js 20 nas imagens Docker multi-stage.
- Node.js 18 ou 20.
- npm 9+.
- Chave válida da Evolution API e endpoint acessível.
- Acesso às dependências no primeiro
npm install(caso esteja em ambiente restrito, execute a instalação fora dele e replique a pastanode_modules).
| Variável | Obrigatório | Descrição | Exemplo |
|---|---|---|---|
API_BASE_URL |
Sim | URL interna da Evolution API acessível somente pelo backend Next.js. | http://evolution-api:3000 |
API_KEY |
Sim | Chave privada que autoriza as chamadas à Evolution API. | minha-chave-secreta |
PORT |
Não | Porta exposta pelo Next.js (usada no Docker e Traefik). | 3000 (padrão) |
Copie
.env.examplepara.env.local(desenvolvimento) ou.env(produção/Docker) e ajuste os valores conforme o ambiente.
-
Instalar dependências
npm install
-
Rodar em desenvolvimento
npm run dev
O aplicativo ficará disponível em
http://localhost:3000. -
Gerar build de produção
npm run build npm run start
-
Rodar lint (opcional, recomendado antes de commits)
npm run lint
| Script | Descrição |
|---|---|
npm run dev |
Inicia o servidor Next.js com hot reload. |
npm run build |
Gera a build otimizada de produção. |
npm run start |
Sobe o servidor Next em modo produção. |
npm run lint |
Executa as regras de lint do Next/ESLint. |
.
├── app/
│ ├── api/whatsapp/[...path]/route.ts # Proxy de todas as rotas Evolution API
│ ├── components/Connector.tsx # SPA principal com todo o fluxo de conexão
│ ├── globals.css # Estilos globais da interface
│ ├── layout.tsx # Fonte Roboto + metadados padrão
│ └── page.tsx # Entrada que renderiza o Connector
├── lib/utils.ts # Normalização de instâncias, contadores e QR
├── docs/ # Referências da Evolution API (Postman + markdown)
├── Dockerfile # Build multi-stage com imagem enxuta para produção
├── docker-compose.yml # Stack de exemplo com Traefik e rede bridge local
└── .env.example # Modelo das variáveis de ambiente
- O usuário informa o nome da instância e submete o formulário.
- O backend checa
/instance/connectionState; se já estiver conectada, exibe a tela de sucesso imediatamente. - Para instâncias desconectadas, a aplicação aciona
/instance/connecte renderiza o QR Code/código de pareamento, renovando a cada 45s. - Enquanto o QR Code está visível, um polling periódico verifica o estado da instância.
- Quando a Evolution API retorna
CONNECTED/OPEN, o app busca detalhes adicionais (fetchInstances,fetchProfilePictureUrl) e atualiza a tela de métricas. - A partir da tela conectada é possível atualizar os dados, reiniciar (
/instance/restart) ou desconectar (/instance/logout) a instância.
O arquivo app/api/whatsapp/[...path]/route.ts funciona como um proxy genérico. Ele:
- Valida a presença de
API_BASE_URLeAPI_KEYantes de processar qualquer requisição. - Monta a URL de destino respeitando os segmentos e querystring informados pelo frontend.
- Encaminha somente cabeçalhos seguros (
content-type,accept) e injetaapikeyautomaticamente. - Remove cabeçalhos potencialmente problemáticos da resposta (ex.:
transfer-encoding). - Garante que falhas retornem
502com mensagem amigável sem expor detalhes sensíveis.
Essa abordagem permite que o frontend faça fetch para /api/whatsapp/... sem conhecer a topologia real da Evolution API.
docker build -t evolution-qrcode-connector .
docker run --rm -p 3000:3000 \
-e API_BASE_URL=http://evolution-api:3000 \
-e API_KEY=troque-por-sua-chave \
evolution-qrcode-connectorO arquivo docker-compose.yml serve como exemplo com labels Traefik e rede bridge interna. Ajuste o domínio (connector.example.com) e personalize o middleware opcional conforme a sua topologia.
- Substitua o host nas labels Traefik e, se usar prefixo, edite ou remova o middleware
StripPrefix. - Defina as variáveis em
.env(ou via Portainer/secret manager). - Caso precise compartilhar a rede com outras stacks, altere o bloco
networkspara usar uma rede externa existente. - Suba a stack:
docker compose up -d --build
Para testar sem Traefik, descomente a seção
portse acessehttp://localhost:3000.
A pasta docs/ contém:
- Coleção Postman (
Evolution API - v2.2.2.postman_collection.json) alinhada com as rotas utilizadas. - Referências em Markdown para controladores da Evolution API (chats, grupos, instâncias, integrações etc.).
Esses materiais servem como apoio para depurar respostas ou implementar novos fluxos no conector.
Missing environment variablesno console → verifique.env(.local)e restart do servidor.- Erro 502 "Erro ao comunicar com a Evolution API" → valide
API_BASE_URL(deve ser acessível a partir do backend) e se a chave não expirou. - QR Code não aparece ou expira muito rápido → confirme que o nome da instância está correto e que o relógio do servidor Evolution não está defasado.
- Foto ou métricas não carregam → as contagens são opcionais; confira se a instância possui permissões suficientes ou se a rota
/chat/fetchProfilePictureUrlestá habilitada.
- Configurar pipelines (CI/CD) que executem
npm run lintenpm run buildem ambientes com acesso à internet. - Personalizar estilos em
app/globals.cssou migrar para um design system da empresa, mantendo o fluxo intacto. - Estender o proxy (
app/api/whatsapp) conforme novas rotas da Evolution API forem necessárias. - Publicar uma nova imagem Docker em um registry privado para simplificar deploys futuros.