Pular para o conteúdo principal

Guia de Desenvolvimento Local

Guia completo para configurar e rodar o projeto LJ Velas e Aromas em ambiente de desenvolvimento.


Sumário​

  1. Pré-requisitos
  2. Instalação passo a passo
  3. Configuração do .env
  4. Banco de dados
  5. Upload de imagens em dev
  6. Testando pagamentos
  7. Testando webhooks
  8. Ferramentas de desenvolvimento
  9. Problemas comuns

Pré-requisitos​

Certifique-se de ter as seguintes ferramentas instaladas antes de começar:

FerramentaVersão mínimaDownload
Node.js20.x LTShttps://nodejs.org
npm10.xIncluído com Node.js
Git2.xhttps://git-scm.com
MySQL8.0+https://dev.mysql.com/downloads/
Docker + Docker Compose24.x / 2.xhttps://www.docker.com (opcional, recomendado)

Dica: Use o Docker para o banco de dados em desenvolvimento — é o caminho mais rápido e evita conflitos de configuração.

Verifique suas versões:

node -v # v20.x.x ou superior
npm -v # 10.x.x ou superior
docker -v # Docker version 24.x.x
git --version # git version 2.x.x

Instalação passo a passo​

1. Clone o repositório​

git clone https://github.com/seu-usuario/ljvemasearomas.git
cd ljvemasearomas

2. Instale as dependências​

npm install

O script postinstall executa prisma generate automaticamente após a instalação.

3. Configure as variáveis de ambiente​

Copie o arquivo de exemplo:

cp .env.example .env

Edite o .env com suas configurações locais. Consulte a seção Configuração do .env para detalhes de cada variável.

4. Suba o banco de dados​

Com Docker (recomendado):

npm run db:up

Isso inicia um container MySQL 8.0 e o phpMyAdmin. Aguarde alguns segundos para o MySQL inicializar completamente.

Com MySQL local:

Certifique-se de que o serviço MySQL está rodando e crie o banco manualmente:

CREATE DATABASE ljvemasearomas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE ljvemasearomas_shadow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5. Sincronize o schema com o banco​

npm run db:push

Isso aplica o schema do Prisma ao banco de dados sem gerar arquivos de migração (ideal para desenvolvimento).

6. Execute o seed​

npm run db:seed

O seed cria os seguintes usuários de teste:

PapelE-mailSenha
Administradoradmin@ljvemasearomas.com.bradmin123
Clientecliente@teste.comcliente123

Além dos usuários, o seed popula categorias, produtos, cupons e configurações básicas da loja.

7. Inicie o servidor de desenvolvimento​

npm run dev

A aplicação estará disponível em http://localhost:3000.


Configuração do .env​

Abaixo está a referência completa de todas as variáveis de ambiente. As marcadas com * são obrigatórias para rodar o projeto localmente.

Banco de dados​

# * URL de conexão principal do Prisma
# Formato: mysql://USER:PASSWORD@HOST:PORT/DATABASE
DATABASE_URL="mysql://root:root@localhost:3306/ljvemasearomas"

# * Banco sombra do Prisma (usado em migrações — pode ser o mesmo host, outro banco)
SHADOW_DATABASE_URL="mysql://root:root@localhost:3306/ljvemasearomas_shadow"

Com Docker: o Docker Compose sobe o MySQL na porta 3306 com usuário root e senha root. Use os valores acima sem alteração.

Autenticação​

# * Chave secreta para assinar JWT — deve ter pelo menos 32 caracteres
# Gere com: openssl rand -hex 32
JWT_SECRET="sua-chave-secreta-de-pelo-menos-32-caracteres"

Upload de arquivos​

# * Caminho absoluto (ou relativo) onde os uploads serão salvos
# Em dev, use o diretório público do Next.js para servir imagens diretamente
UPLOAD_DIR="./public/uploads/products"

# * URL base pública das imagens (prefixo usado nas URLs retornadas pela API)
UPLOAD_URL_BASE="http://localhost:3000/uploads/products"

E-mail (SMTP)​

# * Host do servidor SMTP
EMAIL_HOST="smtp.gmail.com"

# * Porta SMTP (587 para TLS, 465 para SSL, 25 para sem criptografia)
EMAIL_PORT="587"

# * Usuário de autenticação SMTP (geralmente o próprio e-mail)
EMAIL_USER="seu-email@gmail.com"

# * Senha de autenticação SMTP
# Para Gmail: use uma "Senha de App" (não a senha da conta)
# Acesse: https://myaccount.google.com/apppasswords
EMAIL_PASS="sua-senha-de-app"

# * E-mail remetente (aparece no "De:" das mensagens)
EMAIL_FROM="LJ Velas e Aromas <seu-email@gmail.com>"

Alternativa: Use Mailtrap ou Resend para capturar e-mails de desenvolvimento sem enviá-los de verdade.

Mercado Pago​

# * Token de acesso da conta Mercado Pago
# Em desenvolvimento, use o token de TESTE (começa com TEST-)
# Obtenha em: https://www.mercadopago.com.br/developers/panel/app
MERCADOPAGO_ACCESS_TOKEN="TEST-0000000000000000-000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-000000000"

# * Chave pública (usada no frontend para o SDK do MP)
# Também começa com TEST- em modo sandbox
NEXT_PUBLIC_MP_PUBLIC_KEY="TEST-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Frete​

# * CEP de origem para cálculo de frete (endereço do remetente/loja)
STORE_ORIGIN_CEP="01310-100"

Variáveis opcionais​

# URL base da aplicação (usada para gerar links absolutos em e-mails)
NEXT_PUBLIC_APP_URL="http://localhost:3000"

# Chave da API para o serviço de NF-e (PHP microservice em /nfe-service)
NFE_API_KEY=""

# URL do serviço de NF-e
NFE_SERVICE_URL="http://localhost:8001"

# Integração com HyperDX (observabilidade / APM)
HYPERDX_API_KEY=""
OTEL_SERVICE_NAME="ljvemasearomas-dev"

Banco de dados​

Com Docker (recomendado)​

O projeto inclui um docker-compose.yml que sobe MySQL 8.0 e phpMyAdmin:

# Subir containers
npm run db:up

# Parar containers (mantém os dados)
npm run db:down

# phpMyAdmin disponível em http://localhost:8080
# Servidor: db | Usuário: root | Senha: root

Com MySQL local​

  1. Certifique-se de que o MySQL 8.0+ está rodando
  2. Crie dois bancos: ljvemasearomas e ljvemasearomas_shadow
  3. Atualize DATABASE_URL e SHADOW_DATABASE_URL no .env

Comandos Prisma​

ComandoDescrição
npm run db:pushSincroniza o schema com o banco (sem histórico de migração)
npm run db:seedPopula o banco com dados de teste
npm run db:resetApaga tudo e recria com seed (use com cuidado!)
npm run db:studioAbre o Prisma Studio em http://localhost:5555
npx prisma migrate devCria e aplica uma migração com histórico
npx prisma migrate resetReseta o banco e reaplica todas as migrações
npx prisma generateRegenera o Prisma Client após alterar o schema

Quando usar db:push vs migrate dev?

  • db:push é mais rápido para exploração e prototipagem — não gera arquivos de migração.
  • migrate dev gera arquivos SQL de migração versionados — use quando quiser que as mudanças sejam rastreadas e aplicadas em produção via prisma migrate deploy.

Upload de imagens em dev​

Em desenvolvimento, as imagens de produto são salvas no diretório público do Next.js para que possam ser servidas diretamente pelo servidor de desenvolvimento:

Configuração​

No .env, defina:

UPLOAD_DIR="./public/uploads/products"
UPLOAD_URL_BASE="http://localhost:3000/uploads/products"

Criando o diretório​

mkdir -p public/uploads/products

O diretório public/uploads/ já está listado no .gitignore — os arquivos de imagem não serão commitados.

Atenção: Essa configuração usa o ./public do Next.js, que serve arquivos estáticos diretamente. Em produção, o UPLOAD_DIR aponta para um caminho fora do diretório da aplicação (ex.: /home/USER/uploads/products). Nunca use o public/ do Next.js em produção para uploads, pois o conteúdo seria sobrescrito a cada novo deploy.


Testando pagamentos​

O Mercado Pago oferece um ambiente sandbox completo para testar pagamentos sem movimentar dinheiro real.

Configurando o sandbox​

  1. Acesse o Painel de Desenvolvedores do Mercado Pago
  2. Crie uma aplicação (ou use uma existente)
  3. Na aba Credenciais de teste, copie:
    • Access Token (começa com TEST-) → MERCADOPAGO_ACCESS_TOKEN
    • Public Key (começa com TEST-) → NEXT_PUBLIC_MP_PUBLIC_KEY

Cartões de teste​

Use os seguintes cartões para simular diferentes cenários:

CenárioNúmero do cartãoCódigoValidade
Pagamento aprovado5031 4332 1540 635112311/25
Pagamento pendente4235 6477 2802 568212311/25
Pagamento recusado3753 651535 56885123411/25
Saldo insuficiente5031 7557 3453 060412311/25

Dados do titular (sandbox): Use qualquer CPF válido (ex.: 000.000.001-91) e qualquer nome.

Referência completa: https://www.mercadopago.com.br/developers/pt/docs/checkout-api/additional-content/your-integrations/test/cards

Usuários de teste do MP​

Para testar o fluxo completo (comprador + vendedor), crie usuários de teste no painel do MP:

  1. Painel → Ferramentas de teste → Contas de teste
  2. Crie um usuário Comprador e um Vendedor
  3. Use as credenciais do Vendedor no .env

Testando webhooks​

O Mercado Pago precisa enviar notificações de pagamento (webhooks) para uma URL publicamente acessível. Em desenvolvimento local, use o localtunnel para expor seu servidor.

Iniciando o tunnel​

npm run dev:tunnel

O script exibe uma URL pública no formato https://xxxx.loca.lt. Exemplo:

Tunnel URL: https://meu-tunnel.loca.lt

Configurando o webhook no MP​

  1. Acesse: Painel MP → Sua aplicação → Webhooks
  2. Na URL de notificação, informe: https://meu-tunnel.loca.lt/api/webhooks/mercadopago
  3. Selecione os eventos: payment

Fluxo de teste​

  1. npm run dev em um terminal
  2. npm run dev:tunnel em outro terminal
  3. Realize um pagamento de teste
  4. Observe os logs no terminal do npm run dev — você verá as notificações do MP chegando em /api/webhooks/mercadopago

Importante: A URL do localtunnel muda a cada reinício. Lembre-se de atualizar o webhook no painel do MP sempre que reiniciar o tunnel.


Ferramentas de desenvolvimento​

Prisma Studio​

Interface gráfica para visualizar e editar dados do banco diretamente no navegador:

npm run db:studio
# Acesse: http://localhost:5555

phpMyAdmin (Docker)​

Interface web completa para administração do MySQL:

URL: http://localhost:8080
Servidor: db
Usuário: root
Senha: root

Disponível apenas quando os containers Docker estão ativos (npm run db:up).

ESLint​

# Verificar erros (sem corrigir)
npm run lint

# Corrigir erros automaticamente
npm run lint:fix

O projeto usa configuração estrita — --max-warnings=0 no CI, ou seja, zero warnings são tolerados no pipeline.

TypeScript​

# Verificar tipos sem gerar arquivos
npx tsc --noEmit

# Verificar em modo watch
npx tsc --noEmit --watch

Teste de conexão SMTP​

npm run test:smtp

Esse script verifica se as configurações de e-mail no .env estão corretas, tentando se conectar ao servidor SMTP e enviando um e-mail de teste.


Problemas comuns​

Error: Can't reach database server​

Causa: O MySQL não está rodando ou a DATABASE_URL está errada.

Solução:

# Com Docker:
npm run db:up

# Verifique se o container está rodando:
docker ps

# Confira as credenciais na DATABASE_URL do .env

Error: P1010 - User was denied access on the database​

Causa: O usuário MySQL não tem permissão no banco especificado.

Solução:

GRANT ALL PRIVILEGES ON ljvemasearomas.* TO 'root'@'localhost';
GRANT ALL PRIVILEGES ON ljvemasearomas_shadow.* TO 'root'@'localhost';
FLUSH PRIVILEGES;

Error: Environment variable not found: DATABASE_URL​

Causa: O arquivo .env não existe ou não foi carregado.

Solução:

# Certifique-se de que o .env existe:
ls -la .env

# Se não existir, copie do exemplo:
cp .env.example .env

Module not found: @/...​

Causa: O Prisma Client não foi gerado ou os alias TypeScript não estão configurados.

Solução:

npx prisma generate
npm install

EACCES: permission denied, mkdir './public/uploads'​

Causa: O Node.js não tem permissão para criar o diretório de uploads.

Solução:

mkdir -p public/uploads/products
# No Linux/macOS, se necessário:
chmod 755 public/uploads/products

Porta 3000 já em uso​

Causa: Outro processo está usando a porta 3000.

Solução:

# Descobrir qual processo está na porta 3000:
# Windows:
netstat -ano | findstr :3000

# Linux/macOS:
lsof -i :3000

# Encerrar o processo ou usar outra porta:
PORT=3001 npm run dev

Seed falha com Unique constraint failed​

Causa: O banco já tem dados do seed anterior.

Solução:

# Reset completo (apaga todos os dados e resemeia):
npm run db:reset

Localtunnel mostra "Tunnel not found"​

Causa: O servidor de desenvolvimento não está rodando quando o tunnel é iniciado, ou a porta está errada.

Solução:

  1. Certifique-se de que npm run dev está rodando em outro terminal
  2. O tunnel usa a porta 3000 por padrão — se você alterou a porta, edite scripts/dev-tunnel.mjs

E-mails não chegam no Gmail​

Causa: Gmail bloqueou o acesso por "app menos seguro" ou a senha está errada.

Solução:

  1. Ative a verificação em duas etapas na conta Google
  2. Gere uma Senha de App: https://myaccount.google.com/apppasswords
  3. Use essa senha no EMAIL_PASS (não a senha da conta Google)
  4. Teste com: npm run test:smtp