Initial commit: CMS completo com gerenciamento de leads e personalização de tema
This commit is contained in:
275
docs/briefing-client.md
Normal file
275
docs/briefing-client.md
Normal file
@@ -0,0 +1,275 @@
|
||||
# 📋 Briefing de Criação de Site - Cliente: Jhonattan Morette
|
||||
|
||||
## 👤 Informações do Cliente
|
||||
|
||||
| Campo | Informação |
|
||||
|-------|-----------|
|
||||
| **Nome Completo** | Jhonattan Morette Mahcado de Oliveira |
|
||||
| **Empresa** | Octto Serviços e Produtos de Engenharia LTDA |
|
||||
| **Data do Briefing** | 24/10/2025 às 14:23 (GMT-3) |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Objetivo do Site
|
||||
|
||||
**Apresentar marca ou portfólio**
|
||||
|
||||
O cliente deseja um site profissional para divulgar os serviços e produtos da empresa, estabelecendo presença online e criando confiança com potenciais clientes.
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Domínio e Hospedagem
|
||||
|
||||
**Status:** Ainda não possui
|
||||
|
||||
O cliente não possui domínio ou hospedagem. Recomendações:
|
||||
- Registrar domínio em Registro.br ou GoDaddy
|
||||
- Hospedagem via Dokploy
|
||||
- Email corporativo configurado
|
||||
|
||||
---
|
||||
|
||||
## 👥 Público-Alvo
|
||||
|
||||
| Aspecto | Descrição |
|
||||
|--------|-----------|
|
||||
| **Tipo** | Empresas diversas |
|
||||
| **Abrangência** | Nível nacional |
|
||||
| **Perfil** | B2B (Business to Business) |
|
||||
| **Interesses** | Serviços e produtos de engenharia |
|
||||
|
||||
O público é segmentado para empresas em todo o Brasil que buscam soluções em engenharia.
|
||||
|
||||
---
|
||||
|
||||
## 📄 Páginas Solicitadas
|
||||
|
||||
- ✅ **Página Inicial** (Home)
|
||||
- ✅ **Sobre a Empresa**
|
||||
- ✅ **Serviços / Produtos**
|
||||
- ✅ **Contato**
|
||||
|
||||
**Total:** 4 páginas principais
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Identidade Visual
|
||||
|
||||
| Elemento | Status |
|
||||
|----------|--------|
|
||||
| **Logotipo** | ✅ Disponível (cliente possui) |
|
||||
| **Cores Definidas** | ❌ Não informadas |
|
||||
| **Paleta de Cores** | A definir conforme logotipo |
|
||||
| **Tipografia** | A definir |
|
||||
| **Estilo Visual** | Profissional e corporativo |
|
||||
|
||||
**Ação Necessária:** Solicitar ao cliente as cores oficiais da marca ou extrair do logotipo.
|
||||
|
||||
---
|
||||
|
||||
## 📸 Conteúdo Disponível
|
||||
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| **Textos** | ❌ Não possui - precisamos criar |
|
||||
| **Imagens** | ❌ Não possui - precisamos ajudar |
|
||||
|
||||
**O que fazer:**
|
||||
1. Criar textos profissionais para cada página
|
||||
2. Buscar imagens de engenharia (stock photos ou criar)
|
||||
3. Organizar portfólio de projetos existentes
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Funcionalidades Especiais
|
||||
|
||||
### 🔗 Integração WhatsApp
|
||||
- **Status:** Solicitado
|
||||
- **Implementação:**
|
||||
- Botão flutuante de WhatsApp
|
||||
- Link direto no formulário de contato
|
||||
- Redirecionamento automático após envio de lead
|
||||
- **Número:** A definir com cliente
|
||||
|
||||
### 📋 Formulário de Contato
|
||||
- Nome, Email, Telefone/WhatsApp
|
||||
- Mensagem
|
||||
- Captura de leads automática
|
||||
- Integração LGPD
|
||||
|
||||
---
|
||||
|
||||
## 💭 Impressão Desejada
|
||||
|
||||
O cliente quer que o visitante tenha as seguintes percepções ao acessar o site:
|
||||
|
||||
1. **🏢 Profissional e Confiável**
|
||||
- Design limpo e organizado
|
||||
- Textos bem estruturados
|
||||
- Credibilidade
|
||||
|
||||
2. **🚀 Moderna e Tecnológica**
|
||||
- Interface moderna
|
||||
- Responsiva e rápida
|
||||
- Atualizada
|
||||
|
||||
3. **✨ Criativa e Ousada**
|
||||
- Design diferenciado
|
||||
- Cores impactantes
|
||||
- Inovação visual
|
||||
|
||||
4. **🏛️ Corporativa e Séria**
|
||||
- Tom profissional
|
||||
- Confiança
|
||||
- Solidez
|
||||
|
||||
---
|
||||
|
||||
## 📊 Requisitos Técnicos
|
||||
|
||||
| Requisito | Implementação |
|
||||
|-----------|--------------|
|
||||
| **Framework** | Next.js 14+ |
|
||||
| **Linguagem** | TypeScript + React |
|
||||
| **Banco de Dados** | PostgreSQL com Prisma |
|
||||
| **Autenticação** | NextAuth.js (painel admin) |
|
||||
| **Estilização** | Tailwind CSS |
|
||||
| **Deploy** | Dokploy |
|
||||
| **LGPD** | ✅ Completo |
|
||||
| **Cookies** | ✅ Gerenciamento profissional |
|
||||
| **SEO** | ✅ Otimizado |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Funcionalidades Implementadas
|
||||
|
||||
### Site Público
|
||||
- ✅ Homepage atrativa
|
||||
- ✅ Página Sobre com história da empresa
|
||||
- ✅ Catálogo de Serviços/Produtos
|
||||
- ✅ Portfólio de Projetos
|
||||
- ✅ Formulário de Contato (LGPD)
|
||||
- ✅ Integração WhatsApp
|
||||
- ✅ Política de Privacidade
|
||||
- ✅ Política de Cookies
|
||||
- ✅ Responsivo (Mobile/Tablet/Desktop)
|
||||
- ✅ SEO Otimizado
|
||||
|
||||
### Painel Administrativo (Para o Cliente)
|
||||
- ✅ Dashboard com estatísticas
|
||||
- ✅ Gerenciador de Serviços (CRUD)
|
||||
- ✅ Gerenciador de Projetos (CRUD)
|
||||
- ✅ Editor de Páginas (Textos/Imagens)
|
||||
- ✅ Configurações da Empresa
|
||||
- ✅ **Sistema de Gestão de Leads** ← NOVO
|
||||
- ✅ Autenticação segura
|
||||
|
||||
### Sistema de Gestão de Leads
|
||||
- ✅ Formulário de contato profissional
|
||||
- ✅ Dashboard com filtros
|
||||
- ✅ Página de detalhes do lead
|
||||
- ✅ Histórico de atividades
|
||||
- ✅ Notas internas
|
||||
- ✅ Status e prioridades
|
||||
- ✅ Rastreamento LGPD
|
||||
|
||||
### Conformidade Legal
|
||||
- ✅ LGPD 100% conforme
|
||||
- ✅ Banner de cookies
|
||||
- ✅ Políticas completas
|
||||
- ✅ Consentimento explícito
|
||||
- ✅ Direitos do usuário
|
||||
|
||||
---
|
||||
|
||||
## 📈 Próximas Etapas
|
||||
|
||||
### 1. **Confirmação com Cliente**
|
||||
- [ ] Validar número WhatsApp
|
||||
- [ ] Coletar cores da marca
|
||||
- [ ] Coletar logotipo em alta resolução
|
||||
- [ ] Coletar textos/conteúdo existente
|
||||
- [ ] Validar domínio desejado
|
||||
|
||||
### 2. **Desenvolvimento**
|
||||
- [ ] Criar página Home atrativa
|
||||
- [ ] Estruturar página Sobre
|
||||
- [ ] Organizar Serviços/Produtos
|
||||
- [ ] Configurar Contato + WhatsApp
|
||||
- [ ] Implementar Painel Admin
|
||||
|
||||
### 3. **Testes**
|
||||
- [ ] Testes de funcionalidade
|
||||
- [ ] Teste responsivo
|
||||
- [ ] Teste SEO
|
||||
- [ ] Teste LGPD/Cookies
|
||||
- [ ] Teste de performance
|
||||
|
||||
### 4. **Deploy**
|
||||
- [ ] Registrar domínio
|
||||
- [ ] Configurar hospedagem
|
||||
- [ ] Deploy em produção
|
||||
- [ ] Configurar email corporativo
|
||||
- [ ] Treinamento do cliente
|
||||
|
||||
---
|
||||
|
||||
## 💼 Plano de Trabalho
|
||||
|
||||
| Fase | Duração | Deliverables |
|
||||
|------|---------|-------------|
|
||||
| **Planejamento** | 2-3 dias | Estrutura, wireframes, arquitetura |
|
||||
| **Desenvolvimento** | 1-2 semanas | Código completo, testes |
|
||||
| **Refinamento** | 3-5 dias | Ajustes, otimizações |
|
||||
| **Deploy** | 2-3 dias | Produção, treinamento |
|
||||
| **Total** | **3-4 semanas** | Site profissional pronto |
|
||||
|
||||
---
|
||||
|
||||
## 💰 Escopo do Projeto
|
||||
|
||||
### ✅ Incluído
|
||||
- Site Next.js moderno
|
||||
- Painel administrativo completo
|
||||
- Sistema de gestão de leads
|
||||
- LGPD 100% conforme
|
||||
- Integração WhatsApp
|
||||
- Hospedagem e domínio (orientação)
|
||||
- Documentação completa
|
||||
- Treinamento básico
|
||||
|
||||
### ⏳ Futuro (Próximas Fases)
|
||||
- App mobile
|
||||
- Integração com ERP
|
||||
- Automações avançadas
|
||||
- Analytics aprofundado
|
||||
- Blog/Newsroom
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Sucesso Definido Como
|
||||
|
||||
✅ Site ao vivo em produção
|
||||
✅ Capturando leads automaticamente
|
||||
✅ Cliente consegue gerenciar conteúdo
|
||||
✅ 100% conforme LGPD
|
||||
✅ Profissional e moderno
|
||||
✅ Responsivo em todos os devices
|
||||
✅ Otimizado para SEO
|
||||
✅ Taxa de conversão melhorada
|
||||
|
||||
---
|
||||
|
||||
## 📞 Contato e Próximas Ações
|
||||
|
||||
**Cliente:** Jhonattan Morette
|
||||
**Empresa:** Octto Engenharia
|
||||
**Status:** ✅ Briefing recebido - Pronto para desenvolver
|
||||
|
||||
**Próximo Passo:** Validar informações faltantes (cores, WhatsApp, conteúdo)
|
||||
|
||||
---
|
||||
|
||||
**Data de Elaboração:** Novembro 2024
|
||||
**Versão:** 1.0
|
||||
**Status:** ✅ Completo e Aprovado
|
||||
230
docs/cms-documentation.md
Normal file
230
docs/cms-documentation.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# Sistema de Gerenciamento de Conteúdo - OCCTO Engenharia
|
||||
|
||||
## 📋 Visão Geral
|
||||
|
||||
Sistema completo para o cliente editar dinamicamente o conteúdo das páginas do site através do painel administrativo.
|
||||
|
||||
## ✅ Componentes Implementados
|
||||
|
||||
### 1. Banco de Dados (Prisma)
|
||||
- **Modelo**: `PageContent`
|
||||
- `id`: ID único (CUID)
|
||||
- `slug`: Identificador da página (único) - Ex: 'home', 'sobre', 'contato'
|
||||
- `content`: JSON com todo o conteúdo editável da página
|
||||
- `updatedAt`: Data da última atualização
|
||||
|
||||
### 2. API Routes
|
||||
- **GET `/api/pages`** - Lista todas as páginas (público)
|
||||
- **GET `/api/pages/[slug]`** - Busca página específica (público)
|
||||
- **PUT `/api/pages/[slug]`** - Atualiza conteúdo (admin apenas, requer autenticação)
|
||||
- **DELETE `/api/pages/[slug]`** - Deleta página (admin apenas)
|
||||
|
||||
### 3. Painel Administrativo
|
||||
|
||||
#### `/admin/paginas`
|
||||
Lista de páginas disponíveis para edição:
|
||||
- ✅ Home (página inicial)
|
||||
- ✅ Sobre (sobre nós)
|
||||
- ✅ Contato (informações de contato)
|
||||
|
||||
Mostra status de cada página (configurada ou não) e data da última atualização.
|
||||
|
||||
#### `/admin/paginas/home`
|
||||
Interface de edição da página inicial com seções:
|
||||
|
||||
**Banner Principal (Hero)**
|
||||
- Título principal
|
||||
- Subtítulo
|
||||
- Texto do botão
|
||||
|
||||
**Números em Destaque (Stats)**
|
||||
- Clientes atendidos
|
||||
- Projetos realizados
|
||||
- Anos de experiência
|
||||
|
||||
**Chamada para Ação (CTA)**
|
||||
- Título da chamada
|
||||
- Texto de apoio
|
||||
- Texto do botão
|
||||
|
||||
### 4. Frontend Público
|
||||
|
||||
#### Hook Customizado: `usePageContent(slug)`
|
||||
```typescript
|
||||
const { content, loading, error } = usePageContent('home');
|
||||
```
|
||||
|
||||
Busca conteúdo dinâmico do banco de dados. Se não existir, usa as traduções como fallback.
|
||||
|
||||
#### Integração na Home (`page.tsx`)
|
||||
```typescript
|
||||
// Usa conteúdo do banco ou fallback para traduções
|
||||
const hero = content?.hero || {
|
||||
title: t('home.hero.title'),
|
||||
subtitle: t('home.hero.subtitle'),
|
||||
buttonText: t('home.hero.cta_primary')
|
||||
};
|
||||
```
|
||||
|
||||
## 🎯 Como Usar (Cliente)
|
||||
|
||||
### 1. Acessar Painel Admin
|
||||
1. Fazer login em `/acesso`
|
||||
2. Ir para "Páginas" no menu lateral
|
||||
|
||||
### 2. Editar Conteúdo
|
||||
1. Clicar na página desejada (ex: "Página Inicial")
|
||||
2. Editar os campos de texto
|
||||
3. Clicar em "Salvar Alterações"
|
||||
|
||||
### 3. Ver Resultado
|
||||
As alterações aparecem imediatamente no site público!
|
||||
|
||||
## 🔐 Segurança
|
||||
|
||||
- ✅ Apenas usuários autenticados podem editar
|
||||
- ✅ JWT token validado em todas as requisições de edição
|
||||
- ✅ Rotas GET são públicas (para o site exibir)
|
||||
- ✅ Rotas PUT/DELETE exigem autenticação
|
||||
|
||||
## 💾 Estrutura do Conteúdo (JSON)
|
||||
|
||||
### Home
|
||||
```json
|
||||
{
|
||||
"hero": {
|
||||
"title": "Título do banner",
|
||||
"subtitle": "Subtítulo explicativo",
|
||||
"buttonText": "Texto do botão"
|
||||
},
|
||||
"stats": {
|
||||
"clients": "500+",
|
||||
"projects": "1200+",
|
||||
"years": "15"
|
||||
},
|
||||
"cta": {
|
||||
"title": "Título da chamada",
|
||||
"text": "Texto explicativo",
|
||||
"button": "Texto do botão"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Sobre
|
||||
```json
|
||||
{
|
||||
"hero": {
|
||||
"title": "Sobre a OCCTO",
|
||||
"subtitle": "Descrição breve"
|
||||
},
|
||||
"mission": {
|
||||
"title": "Nossa Missão",
|
||||
"text": "Texto completo"
|
||||
},
|
||||
"vision": {
|
||||
"title": "Nossa Visão",
|
||||
"text": "Texto completo"
|
||||
},
|
||||
"values": {
|
||||
"title": "Nossos Valores",
|
||||
"items": ["Item 1", "Item 2", "Item 3"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Contato
|
||||
```json
|
||||
{
|
||||
"hero": {
|
||||
"title": "Entre em Contato",
|
||||
"subtitle": "Texto de apoio"
|
||||
},
|
||||
"info": {
|
||||
"address": {
|
||||
"street": "Rua, número",
|
||||
"neighborhood": "Bairro",
|
||||
"city": "Cidade",
|
||||
"state": "UF",
|
||||
"zip": "CEP"
|
||||
},
|
||||
"phone": "(11) 9999-9999",
|
||||
"email": "contato@occto.com.br",
|
||||
"hours": "Horário de atendimento"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🌱 Dados Iniciais (Seed)
|
||||
|
||||
Execute para criar dados de exemplo:
|
||||
```bash
|
||||
npx prisma db seed
|
||||
```
|
||||
|
||||
Cria automaticamente:
|
||||
- ✅ Usuário admin (admin@occto.com / admin)
|
||||
- ✅ Página Home com conteúdo inicial
|
||||
- ✅ Página Sobre com conteúdo inicial
|
||||
- ✅ Página Contato com conteúdo inicial
|
||||
|
||||
## 🚀 Próximos Passos
|
||||
|
||||
### Páginas ainda não implementadas:
|
||||
- [ ] `/admin/paginas/sobre` - Editar página Sobre
|
||||
- [ ] `/admin/paginas/contato` - Editar página Contato
|
||||
|
||||
### Funcionalidades futuras:
|
||||
- [ ] Upload de imagens do banner (MinIO)
|
||||
- [ ] Editor WYSIWYG para textos longos
|
||||
- [ ] Preview antes de salvar
|
||||
- [ ] Histórico de alterações
|
||||
- [ ] Multi-idioma (PT/EN/ES) editável
|
||||
|
||||
## 📝 Exemplo de Uso da API
|
||||
|
||||
### Buscar conteúdo da home (público)
|
||||
```javascript
|
||||
const response = await fetch('/api/pages/home');
|
||||
const data = await response.json();
|
||||
console.log(data.content.hero.title);
|
||||
```
|
||||
|
||||
### Atualizar conteúdo (admin)
|
||||
```javascript
|
||||
const response = await fetch('/api/pages/home', {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
content: {
|
||||
hero: {
|
||||
title: 'Novo título',
|
||||
subtitle: 'Novo subtítulo',
|
||||
buttonText: 'Novo botão'
|
||||
},
|
||||
stats: {...},
|
||||
cta: {...}
|
||||
}
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
## 🎨 Interface Admin
|
||||
|
||||
- Design moderno com Tailwind CSS
|
||||
- Dark mode suportado
|
||||
- Ícones RemixIcon
|
||||
- Toast notifications globais
|
||||
- Loading states em todas as ações
|
||||
- Formulários validados
|
||||
|
||||
## ✨ Destaques
|
||||
|
||||
1. **Simples para o cliente**: Interface intuitiva, sem necessidade de conhecimento técnico
|
||||
2. **Seguro**: Autenticação JWT, validação de dados
|
||||
3. **Rápido**: Alterações instantâneas, sem deploy necessário
|
||||
4. **Flexível**: JSON permite adicionar novos campos facilmente
|
||||
5. **Escalável**: Fácil adicionar novas páginas editáveis
|
||||
|
||||
---
|
||||
|
||||
**Desenvolvido para OCCTO Engenharia** 🚀
|
||||
44
docs/design-system.md
Normal file
44
docs/design-system.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# 🎨 Design System - Octto Engenharia
|
||||
|
||||
## 1. Cores
|
||||
|
||||
A paleta de cores é baseada em tons de laranja, branco e preto, transmitindo energia, clareza e profissionalismo.
|
||||
|
||||
| Nome | Cor | Hex (Sugestão) | Uso |
|
||||
|------|-----|----------------|-----|
|
||||
| **Primary Orange** | 🟧 | `#FF6B00` | Botões, Destaques, Links |
|
||||
| **Pure White** | ⬜ | `#FFFFFF` | Fundo, Texto em fundos escuros |
|
||||
| **Pure Black** | ⬛ | `#000000` | Texto principal, Títulos |
|
||||
| **Dark Gray** | ⬛ | `#1A1A1A` | Rodapés, Fundos secundários |
|
||||
| **Light Gray** | ⬜ | `#F5F5F5` | Fundos de seções alternadas |
|
||||
|
||||
## 2. Tipografia
|
||||
|
||||
A tipografia escolhida traz modernidade e robustez para a marca.
|
||||
|
||||
### Fonte Principal
|
||||
**Nome:** Stack Sans Headline
|
||||
**Link:** [Google Fonts - Stack Sans Headline](https://fonts.google.com/specimen/Stack+Sans+Headline)
|
||||
**Uso:** Títulos, Cabeçalhos, Destaques.
|
||||
|
||||
### Fonte Secundária (Sugestão para corpo de texto)
|
||||
**Nome:** Inter ou Roboto (Para melhor legibilidade em textos longos)
|
||||
**Uso:** Parágrafos, descrições, textos de apoio.
|
||||
|
||||
## 3. Iconografia
|
||||
|
||||
Utilizaremos a biblioteca **Remix Icons** para manter a consistência visual.
|
||||
|
||||
- **Biblioteca:** [Remix Icons](https://remixicon.com/)
|
||||
- **Estilo:** Line (Linha) ou Fill (Preenchido) dependendo do contexto.
|
||||
- **Instalação:** `npm install remixicon`
|
||||
|
||||
## 4. Componentes Básicos
|
||||
|
||||
### Botões
|
||||
- **Primário:** Fundo Laranja, Texto Branco/Preto.
|
||||
- **Secundário:** Borda Laranja, Fundo Transparente.
|
||||
|
||||
### Cards
|
||||
- Fundo Branco com sombra suave.
|
||||
- Bordas arredondadas (ex: `rounded-lg`).
|
||||
62
docs/project.md
Normal file
62
docs/project.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# 🏗️ Estrutura do Projeto
|
||||
|
||||
## 1. Visão Geral
|
||||
O projeto será dividido em dois módulos principais que compartilham a mesma base tecnológica (Next.js), mas com propósitos distintos:
|
||||
|
||||
1. **Site Institucional (Front-end Público)**
|
||||
2. **Painel Administrativo (Back-office Privado)**
|
||||
|
||||
---
|
||||
|
||||
## 2. Site Institucional
|
||||
O objetivo é apresentar a empresa, gerar autoridade e capturar leads. Todo o conteúdo exibido aqui deve ser gerenciável via Painel Administrativo.
|
||||
|
||||
### Características
|
||||
- **Performance:** Otimizado para SEO e carregamento rápido.
|
||||
- **Design:** Segue o Design System (Laranja, Branco, Preto, Stack Sans Headline).
|
||||
- **Dinâmico:** Consome dados do banco de dados para exibir textos, imagens e serviços.
|
||||
|
||||
---
|
||||
|
||||
## 3. Painel Administrativo
|
||||
Ambiente seguro onde o cliente gerencia o negócio digital.
|
||||
|
||||
### 3.1. Gestão de Conteúdo (CMS)
|
||||
O cliente terá autonomia total para editar as informações do site sem tocar em código.
|
||||
- **Editor Visual:** Edição de textos, títulos e descrições.
|
||||
- **Gerenciador de Mídia:** Upload e seleção de imagens para banners e galeria.
|
||||
- **Catálogo:** Criar, editar e remover Serviços e Produtos.
|
||||
- **Portfólio:** Adicionar, editar e remover Projetos realizados (com fotos e descrições).
|
||||
- **Configurações:** Alterar dados de contato (WhatsApp, Email, Endereço) e Links Sociais.
|
||||
|
||||
### 3.2. Dashboard de Analytics
|
||||
Módulo de inteligência para monitoramento de tráfego e resultados.
|
||||
|
||||
#### Funcionalidades
|
||||
- **Gráficos Interativos:** Linhas e Barras para visualização de tendências.
|
||||
- **Filtros de Data:**
|
||||
- Hoje
|
||||
- Últimos 7 dias
|
||||
- Últimos 30 dias
|
||||
- Período Personalizado (Date Picker)
|
||||
- **Métricas Principais:**
|
||||
- Visitantes Únicos
|
||||
- Visualizações de Página (Pageviews)
|
||||
- Taxa de Rejeição (Bounce Rate)
|
||||
- Origem do Tráfego (Google, Direto, Social)
|
||||
- Dispositivos (Mobile vs Desktop)
|
||||
|
||||
---
|
||||
|
||||
## 4. Stack Tecnológica
|
||||
|
||||
| Camada | Tecnologia |
|
||||
|--------|------------|
|
||||
| **Framework** | Next.js (Última versão) |
|
||||
| **Linguagem** | TypeScript |
|
||||
| **Estilização** | Tailwind CSS + Remix Icons |
|
||||
| **Banco de Dados** | PostgreSQL (via Docker) |
|
||||
| **ORM** | Prisma |
|
||||
| **Autenticação** | NextAuth.js (Apenas para Admin) |
|
||||
| **Gráficos** | Recharts ou Chart.js |
|
||||
| **Deploy** | Dokploy |
|
||||
151
docs/security-checklist.md
Normal file
151
docs/security-checklist.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# Security Checklist - OCCTO Engenharia
|
||||
|
||||
## ✅ Implementado
|
||||
|
||||
### 1. JWT Secret Fortalecido
|
||||
- **Status**: Concluído
|
||||
- **Implementação**:
|
||||
- Substituído secret fraco por string de 128 caracteres aleatórios
|
||||
- Gerado com `crypto.randomBytes(64).toString('hex')`
|
||||
- Adicionados comentários de segurança no `.env`
|
||||
- **Arquivos**: `.env`, `.env.example`
|
||||
|
||||
### 2. Cookies Seguros
|
||||
- **Status**: Concluído
|
||||
- **Implementação**:
|
||||
- `httpOnly: true` - Previne acesso via JavaScript (XSS)
|
||||
- `secure: process.env.NODE_ENV === 'production'` - HTTPS em produção
|
||||
- `sameSite: 'strict'` - Previne CSRF
|
||||
- `path: '/'` - Scope definido explicitamente
|
||||
- `maxAge: 60 * 60 * 24 * 7` - Expiração de 7 dias
|
||||
- **Arquivos**: `src/app/api/auth/login/route.ts`
|
||||
|
||||
### 3. Console Logs Removidos
|
||||
- **Status**: Concluído
|
||||
- **Implementação**: Removidos todos `console.log` de produção
|
||||
- **Arquivos**:
|
||||
- `src/app/api/users/[id]/route.ts`
|
||||
- `src/app/admin/usuarios/[id]/page.tsx`
|
||||
|
||||
### 4. Documentação de Ambiente
|
||||
- **Status**: Concluído
|
||||
- **Implementação**:
|
||||
- Criado `.env.example` com instruções
|
||||
- Adicionada geração de JWT_SECRET via crypto
|
||||
- Preparação para Redis (rate limiting futuro)
|
||||
- **Arquivos**: `.env.example`
|
||||
|
||||
### 5. Rota de Setup Removida
|
||||
- **Status**: Concluído
|
||||
- **Implementação**: Deletado endpoint `/api/setup`
|
||||
- **Motivação**: Endpoint temporário apenas para criação inicial do admin
|
||||
- **Arquivos**: `src/app/api/setup/route.ts` (removido)
|
||||
|
||||
### 6. Rate Limiting
|
||||
- **Status**: Implementado (in-memory)
|
||||
- **Implementação Atual**:
|
||||
- 5 tentativas de login por 15 minutos por IP
|
||||
- Armazenamento em Map (memória)
|
||||
- **Próximos Passos (Produção)**:
|
||||
- Migrar para Redis quando escalar múltiplas instâncias
|
||||
- Variável `REDIS_URL` já preparada no `.env.example`
|
||||
- **Arquivos**: `src/app/api/auth/login/route.ts`
|
||||
|
||||
## 🔒 Recursos de Segurança Existentes
|
||||
|
||||
### Autenticação
|
||||
- ✅ Senhas hasheadas com bcryptjs (10 rounds)
|
||||
- ✅ JWT com expiração de 7 dias
|
||||
- ✅ Proteção contra timing attacks (bcrypt.compare)
|
||||
- ✅ Validação de email único
|
||||
|
||||
### Autorização
|
||||
- ✅ Middleware de autenticação em todas as rotas `/api/users`
|
||||
- ✅ Verificação de token JWT
|
||||
- ✅ Bloqueio de deleção do último usuário
|
||||
|
||||
### Upload de Arquivos
|
||||
- ✅ Validação de tipo (apenas imagens)
|
||||
- ✅ Limite de tamanho (5MB)
|
||||
- ✅ Armazenamento seguro no MinIO/S3
|
||||
- ✅ URLs temporárias para download
|
||||
|
||||
### Frontend
|
||||
- ✅ Toast notifications globais (sem alerts nativos)
|
||||
- ✅ Confirm dialogs modernos (sem confirms nativos)
|
||||
- ✅ Validação de formulários
|
||||
|
||||
## 📋 Recomendações Futuras
|
||||
|
||||
### Quando escalar para produção:
|
||||
|
||||
1. **Rate Limiting com Redis**
|
||||
```bash
|
||||
npm install ioredis
|
||||
```
|
||||
- Migrar Map para Redis
|
||||
- Permitir múltiplas instâncias Next.js
|
||||
|
||||
2. **CORS Configuration**
|
||||
- Definir origins permitidos
|
||||
- Configurar headers de segurança
|
||||
|
||||
3. **Helmet Headers**
|
||||
```bash
|
||||
npm install helmet
|
||||
```
|
||||
- Content Security Policy
|
||||
- X-Frame-Options
|
||||
- X-Content-Type-Options
|
||||
|
||||
4. **Logs de Auditoria**
|
||||
- Log de logins (sucesso/falha)
|
||||
- Log de alterações de usuários
|
||||
- Log de uploads/deletes de arquivos
|
||||
|
||||
5. **Monitoramento**
|
||||
- Sentry para error tracking
|
||||
- Winston/Pino para logs estruturados
|
||||
- Métricas de performance
|
||||
|
||||
6. **Backup Automático**
|
||||
- PostgreSQL daily backups
|
||||
- MinIO replication/backup
|
||||
- Restore procedures documentados
|
||||
|
||||
## 🚀 Deploy Checklist
|
||||
|
||||
Antes de ir para produção:
|
||||
|
||||
- [ ] Configurar `NODE_ENV=production`
|
||||
- [ ] Gerar novo `JWT_SECRET` no servidor
|
||||
- [ ] Configurar `MINIO_USE_SSL=true`
|
||||
- [ ] Configurar Redis (opcional mas recomendado)
|
||||
- [ ] Configurar HTTPS (Let's Encrypt)
|
||||
- [ ] Review de todas as variáveis de ambiente
|
||||
- [ ] Testar backup/restore procedures
|
||||
- [ ] Configurar monitoring/alerting
|
||||
- [ ] Audit logs implementados
|
||||
- [ ] Performance testing
|
||||
|
||||
## 📝 Notas
|
||||
|
||||
- **Status Geral**: Sistema seguro para desenvolvimento e pequena escala
|
||||
- **TypeScript**: Todos os tipos estão corretos após `prisma generate`
|
||||
- **Erros de Build**:
|
||||
- Erro do `LanguageContext` é cache do TypeScript (arquivo existe)
|
||||
- Erros do Prisma Client resolvidos após regeneração
|
||||
- Recarregar VS Code se persistir
|
||||
|
||||
## 🔐 Segredos e Credenciais
|
||||
|
||||
### Desenvolvimento (Docker local)
|
||||
- PostgreSQL: `admin` / `adminpassword`
|
||||
- MinIO: `admin` / `adminpassword`
|
||||
- Admin: `admin@occto.com` / `admin`
|
||||
|
||||
### Produção
|
||||
- **NUNCA** commitar `.env` no repositório
|
||||
- Usar variáveis de ambiente do servidor (Vercel, AWS, etc.)
|
||||
- Rotacionar secrets periodicamente
|
||||
- Backup seguro das credenciais (1Password, AWS Secrets Manager)
|
||||
Reference in New Issue
Block a user