HIGH-SEVERITY FIXES (Fase 2): 1. Rate Limiting (Vulnerabilidade 2.1) - express-rate-limit: 100 req/15min (prod), 1000 req/15min (dev) - Applied to all /api/* routes - Standard headers for retry-after 2. CORS Restrictions (Vulnerabilidade 2.2) - Whitelist: dashboard.descomplicar.pt, desk.descomplicar.pt - Localhost only in development - CORS blocking logs 3. Input Validation with Zod (Vulnerabilidade 2.4) - Generic validateRequest() middleware - Schemas: WordPress Monitor, server metrics, dashboard, financial - Applied to api/routes/wp-monitor.ts POST endpoint - Detailed field-level error messages 4. Backend Authentication OIDC (Vulnerabilidade 2.5 - OPTIONAL) - Enabled via OIDC_ENABLED=true - Bearer token validation on all APIs - Backward compatible (disabled by default) 5. SSH Key-Based Auth Migration (Vulnerabilidade 2.6) - Script: /media/ealmeida/Dados/Dev/ClaudeDev/migrate-ssh-keys.sh - Generates ed25519 key, copies to 6 servers - Instructions to remove passwords from .env - .env.example updated with SSH_PRIVATE_KEY_PATH 6. Improved Error Handling (Vulnerabilidade 2.5) - Unique error IDs (UUID) for tracking - Structured JSON logs in production - Stack traces blocked in production - Generic messages to client FILES CHANGED: - api/server.ts - Complete refactor with all security improvements - api/middleware/validation.ts - NEW: Zod middleware and schemas - api/routes/wp-monitor.ts - Added Zod validation on POST - .env.example - Complete security documentation - CHANGELOG.md - Full documentation of 9 fixes (3 critical + 6 high) - package.json + package-lock.json - New dependencies DEPENDENCIES ADDED: - express-rate-limit@7.x - zod@3.x - express-openid-connect@2.x AUDIT STATUS: - npm audit: 0 vulnerabilities - Hook Regra #47: PASSED PROGRESS: - Phase 1 (Critical): 3/3 ✅ COMPLETE - Phase 2 (High): 6/6 ✅ COMPLETE - Phase 3 (Medium): 0/6 - Next - Phase 4 (Low): 0/5 - Next Related: AUDIT-REPORT.md vulnerabilities 2.1, 2.2, 2.4, 2.5, 2.6 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
332 lines
12 KiB
Markdown
Executable File
332 lines
12 KiB
Markdown
Executable File
# Changelog
|
|
|
|
Todas as alterações notáveis neste projecto serão documentadas neste ficheiro.
|
|
|
|
## [2.6.0] - 2026-02-14
|
|
|
|
### Security - Vulnerabilidades Críticas (3)
|
|
- **CRÍTICO** - Removidas credenciais hardcoded em `api/db.ts`
|
|
- Eliminados fallbacks de password, user e database
|
|
- Adicionada validação obrigatória de variáveis de ambiente
|
|
- Adicionados timeouts de conexão (connectTimeout: 10s, acquireTimeout: 15s, timeout: 30s)
|
|
- **CRÍTICO** - Removida API key hardcoded em `api/routes/wp-monitor.ts`
|
|
- Eliminado fallback `descomplicar-monitor-2026`
|
|
- Adicionada validação obrigatória de `WP_MONITOR_API_KEY`
|
|
- **VERIFICADO** - Confirmado que `.env` nunca foi commitado ao Git
|
|
- Credenciais locais nunca foram expostas no repositório
|
|
- `.gitignore` a funcionar correctamente
|
|
|
|
### Security - Vulnerabilidades Altas (6)
|
|
- **ALTO** - Implementado Rate Limiting com `express-rate-limit`
|
|
- 100 requests/15min em produção, 1000/15min em dev
|
|
- Aplicado a todas as rotas `/api/*`
|
|
- Headers standard para retry-after
|
|
- **ALTO** - CORS restrito para produção
|
|
- Whitelist: `dashboard.descomplicar.pt`, `desk.descomplicar.pt`
|
|
- Localhost permitido apenas em desenvolvimento
|
|
- Logs de bloqueios CORS
|
|
- **ALTO** - Validação de input com Zod (Vulnerabilidade 2.4)
|
|
- Middleware genérico `validateRequest()`
|
|
- Schemas para WordPress Monitor, server metrics, dashboard, financial
|
|
- Mensagens de erro detalhadas por campo
|
|
- Aplicado em `api/routes/wp-monitor.ts`
|
|
- **ALTO** - Autenticação backend OIDC (OPCIONAL)
|
|
- Ativável via `OIDC_ENABLED=true`
|
|
- Validação de Bearer tokens em todas as APIs
|
|
- Compatibilidade mantida (desativado por defeito)
|
|
- **ALTO** - Script de migração SSH key-based auth
|
|
- `/media/ealmeida/Dados/Dev/ClaudeDev/migrate-ssh-keys.sh`
|
|
- Gera chave ed25519, copia para 6 servidores
|
|
- Instruções para remover passwords do `.env`
|
|
- `.env.example` atualizado com `SSH_PRIVATE_KEY_PATH`
|
|
- **ALTO** - Error handling melhorado (Vulnerabilidade 2.5)
|
|
- Error IDs únicos (UUID) para tracking
|
|
- Logs estruturados JSON em produção
|
|
- Stack traces bloqueados em produção
|
|
- Mensagens genéricas ao cliente
|
|
|
|
### Added
|
|
- `api/middleware/validation.ts` - Middleware e schemas Zod
|
|
- `migrate-ssh-keys.sh` - Script de migração SSH
|
|
- Dependências: `express-rate-limit@7.x`, `zod@3.x`, `express-openid-connect@2.x`
|
|
|
|
### Changed
|
|
- `api/server.ts` - Completamente refatorado com todas as melhorias de segurança
|
|
- `api/routes/wp-monitor.ts` - Adicionada validação Zod no POST
|
|
- `.env.example` - Documentação completa de segurança
|
|
|
|
### Technical Notes
|
|
- Auditoria completa: 3 críticas + 6 altas = **9 vulnerabilidades corrigidas**
|
|
- npm audit: 1 low → **0 vulnerabilidades**
|
|
- Hook Regra #47 ativado e a funcionar (security audit pre-commit)
|
|
- Próximos passos: corrigir 6 médias + 5 baixas (Fase 3 e 4)
|
|
|
|
---
|
|
|
|
## [2.5.0] - 2026-02-10
|
|
|
|
### Added
|
|
- **CWP Backup Tool** - Monitorização do backup_manager2 (sistema CWP nativo)
|
|
- Verifica directório mais recente em `/usr/local/cwp/.conf/backups/new/15/`
|
|
- Status: ok (<24h), warning (24-48h), critical (>48h)
|
|
- Adicionado ao collector `collect-backups.sh` no servidor CWP
|
|
|
|
### Changed
|
|
- Secção Backups no dashboard agora mostra 5 items (era 4)
|
|
|
|
### Technical Notes
|
|
- Collector: `/root/scripts/monitor/collect-backups.sh` (item #5)
|
|
- Detecta o subdirectório mais recente via `ls -dt` e calcula idade pelo mtime
|
|
- Frontend não requer alterações - renderiza dinamicamente todos os backups da BD
|
|
|
|
---
|
|
|
|
## [2.4.0] - 2026-02-04
|
|
|
|
### Fixed
|
|
- ✅ **Monitor.tsx** - Corrigido URL da API de `/api/monitor.php` para `/api/monitor`
|
|
- ✅ **Monitor.tsx** - Adaptada estrutura de dados para nova resposta da API (items agrupados por categoria)
|
|
- ✅ **Monitoring Service** - Corrigido cálculo de stats (MySQL retornava strings)
|
|
- ✅ **server.ts** - Adicionado serving de ficheiros estáticos em produção
|
|
|
|
### Changed
|
|
- ✅ Interface `MonitorData` actualizada para reflectir estrutura real da API
|
|
- ✅ Mock data actualizado com dados realistas da BD
|
|
- ✅ Sumário usa `data.stats` em vez de `data.summary` para totais
|
|
|
|
### Added
|
|
- ✅ **Dockerfile** - Configuração Docker com NODE_ENV=production
|
|
- ✅ **Static serving** - Frontend servido pelo Express em produção
|
|
- ✅ **SPA fallback** - Rotas não-API devolvem index.html
|
|
|
|
### Technical Notes
|
|
- API endpoint: `/api/monitor` retorna dados de `tbl_eal_monitoring`
|
|
- Categorias disponíveis: server, service, site, container, backup, wp_update, storage
|
|
- Stats calculados server-side com conversão explícita para números
|
|
- Em produção: Express serve `dist/` e faz fallback para SPA
|
|
|
|
---
|
|
|
|
## [2.3.0] - 2026-02-04
|
|
|
|
### Added
|
|
- ✅ **Server Metrics Unified** - Métricas de todos os servidores (Hetzner + SSH)
|
|
- Serviço `/api/services/server-metrics.ts` - Collector unificado
|
|
- Rota `/api/server-metrics/collect` - Recolhe todas as métricas
|
|
- Rota `/api/server-metrics/ssh` - Métricas CWP e EasyPanel via SSH
|
|
- Rota `/api/server-metrics/hetzner` - Sync Hetzner para monitoring
|
|
- Integração com `tbl_eal_monitoring` existente
|
|
|
|
### Endpoints Server Metrics
|
|
- `POST /api/server-metrics/collect` - Recolhe métricas de todos os servidores
|
|
- `POST /api/server-metrics/ssh` - Apenas CWP Server e EasyPanel (via SSH)
|
|
- `POST /api/server-metrics/hetzner` - Sync Hetzner para tabela monitoring
|
|
|
|
### Technical Notes
|
|
- Servidores SSH: CWP Server (176.9.3.158), EasyPanel (178.63.18.51)
|
|
- Servidores Hetzner: MCP Hub, Meet, WhatsApp, WhatSMS
|
|
- Métricas: CPU%, RAM%, Disk%, Load Average, Network I/O
|
|
- Actualiza `tbl_eal_monitoring` com dados reais
|
|
- Cron recomendado: `curl -X POST localhost:3001/api/server-metrics/collect` a cada 5 min
|
|
|
|
---
|
|
|
|
## [2.2.0] - 2026-02-04
|
|
|
|
### Added
|
|
- ✅ **WordPress Monitor API** - Endpoint para receber dados do plugin WP
|
|
- Rota `POST /api/wp-monitor` - Recebe dados de sites WordPress
|
|
- Rota `GET /api/wp-monitor` - Lista sites monitorizados
|
|
- Rota `GET /api/wp-monitor?test` - Testar conexão
|
|
- Autenticação via header `X-API-Key`
|
|
|
|
- ✅ **Site Availability Checker** - Verificação de disponibilidade HTTP
|
|
- Função `checkSiteAvailability()` em `/api/services/monitoring.ts`
|
|
- Função `checkAllSitesAvailability()` para verificar todos os sites
|
|
- Script cron `/api/scripts/check-sites.ts` para verificação periódica
|
|
- Rota `POST /api/monitor/check-sites` para trigger manual
|
|
|
|
### Changed
|
|
- ✅ `/api/routes/monitor.ts` - Adicionada rota POST para check manual
|
|
|
|
### Technical Notes
|
|
- Script de cron: `npx tsx api/scripts/check-sites.ts`
|
|
- Recomendado: executar a cada 10 minutos via cron
|
|
- Sites down são marcados com status `down` na BD
|
|
- Plugin WP actualizado para usar `dash.descomplicar.pt/api/wp-monitor`
|
|
|
|
---
|
|
|
|
## [2.1.0] - 2026-02-04
|
|
|
|
### Added
|
|
- ✅ **Hetzner Cloud Monitoring** - Monitorização de VPS Hetzner
|
|
- Tabela `tbl_eal_hetzner_servers` - Inventário de servidores
|
|
- Tabela `tbl_eal_hetzner_metrics` - Métricas time-series
|
|
- View `v_eal_hetzner_latest` - Últimas métricas por servidor
|
|
- Serviço `/api/services/hetzner.ts` - Integração API Hetzner Cloud
|
|
- Rotas `/api/hetzner/*` para dashboard e collectors
|
|
|
|
### Endpoints Hetzner
|
|
- `GET /api/hetzner` - Dashboard (servidores + últimas métricas)
|
|
- `POST /api/hetzner/sync` - Sincronizar lista de servidores
|
|
- `POST /api/hetzner/collect` - Recolher métricas de todos os servidores
|
|
- `POST /api/hetzner/collect/:id` - Recolher métricas de um servidor
|
|
- `GET /api/hetzner/history/:id` - Histórico de métricas (24h default)
|
|
- `POST /api/hetzner/cleanup` - Limpar métricas antigas (7 dias default)
|
|
|
|
### Technical Notes
|
|
- Token Hetzner armazenado em `.env` (HETZNER_TOKEN)
|
|
- Métricas: CPU%, disk IOPS/bandwidth, network bandwidth/pps
|
|
- Retenção de dados: 7 dias (configurável)
|
|
- Collector pode ser executado via cron: `curl -X POST localhost:3001/api/hetzner/collect`
|
|
|
|
## [2.0.1] - 2026-02-04
|
|
|
|
### Added
|
|
- ✅ Endpoint `/api/diagnostic` para testes individuais de cada função
|
|
- ✅ Dependência `dotenv` ^16.6.1 para carregamento de variáveis de ambiente
|
|
|
|
### Fixed
|
|
- ✅ Carregamento de variáveis de ambiente (`.env`) antes de inicializar connection pool MySQL
|
|
- ✅ Configuração de `DB_HOST` para servidor remoto (176.9.3.158)
|
|
- ✅ Tratamento de erros EADDRINUSE (porta já em uso)
|
|
|
|
### Changed
|
|
- ✅ Título da aplicação: "Plan EAL" → "Dashboard Descomplicar · Dados Reais"
|
|
- ✅ Logs do servidor mais detalhados com separadores visuais
|
|
|
|
## [2.0.0] - 2026-02-04
|
|
|
|
### Added
|
|
|
|
#### API Node.js/Express Completa
|
|
- ✅ Servidor Express em `/api/server.ts`
|
|
- ✅ Connection pool MySQL em `/api/db.ts`
|
|
- ✅ Proxy Vite configurado (`/api` → `http://localhost:3001`)
|
|
|
|
#### Serviços
|
|
- ✅ **Google Calendar API** (`/api/services/calendar.ts`)
|
|
- Integração com calendários pessoal e profissional
|
|
- Eventos de hoje e da semana
|
|
- OAuth2 configurado com refresh token
|
|
|
|
- ✅ **Dashboard Queries** (`/api/services/dashboard.ts`)
|
|
- Tasks: urgente, alta prioridade, vencidas, em testes, esta semana
|
|
- Monday Mood (tag especial #67)
|
|
- Tickets abertos
|
|
- Leads: contactar, followup, proposta
|
|
- Projectos activos
|
|
- Timesheet semanal (staff_id=1)
|
|
- Billing 360 (clientes com horas facturadas vs entregues)
|
|
- Pipeline completo (leads, estimates, proposals)
|
|
|
|
- ✅ **Monitoring Queries** (`/api/services/monitoring.ts`)
|
|
- Query à tabela `tbl_eal_monitoring`
|
|
- Summary por categoria
|
|
- Status geral (ok/warning/critical)
|
|
|
|
#### Endpoints
|
|
- ✅ `GET /api/dashboard` - Dashboard completo
|
|
- ✅ `GET /api/monitor` - Monitorização de sistemas
|
|
- ✅ `GET /api/health` - Health check
|
|
|
|
#### Frontend
|
|
- ✅ `App.tsx` actualizado para usar `/api/dashboard` (linha 425)
|
|
- ✅ Fallback para dados mock em caso de erro (desenvolvimento)
|
|
|
|
#### Infraestrutura
|
|
- ✅ Scripts npm:
|
|
- `npm run dev` - Vite + API em paralelo (concurrently)
|
|
- `npm run dev:api` - API apenas (tsx watch)
|
|
- `npm run dev:ui` - Vite apenas
|
|
- `npm start` - Produção (serve API + static build)
|
|
|
|
#### Dependências Adicionadas
|
|
- `express` ^4.19.2
|
|
- `cors` ^2.8.5
|
|
- `mysql2` ^3.11.5
|
|
- `googleapis` ^144.0.0
|
|
- `concurrently` ^9.1.2 (dev)
|
|
- `tsx` ^4.19.2 (dev)
|
|
- `@types/express` ^5.0.0 (dev)
|
|
- `@types/cors` ^2.8.17 (dev)
|
|
|
|
#### Documentação
|
|
- ✅ `api/README.md` - Documentação completa da API
|
|
- ✅ `.env.example` - Template de configuração
|
|
|
|
### Changed
|
|
|
|
- Título da tarefa #1556: "Dashboard Descomplicar - Dados Reais e API"
|
|
- `vite.config.ts` - Adicionado proxy para `/api`
|
|
- `package.json` - Nome alterado para `dash-descomplicar`
|
|
|
|
### Migrated
|
|
|
|
Toda a lógica do PHP (`plan-eal.descomplicar.pt`) migrada para TypeScript:
|
|
|
|
#### De `index.php`:
|
|
- ✅ Google Calendar API (pessoal + profissional)
|
|
- ✅ Todas as queries à BD Desk CRM
|
|
- ✅ Billing 360 (horas facturadas vs entregues)
|
|
- ✅ Pipeline de vendas
|
|
- ✅ Cálculo de timesheet semanal
|
|
- ✅ Monday Mood (tarefas com tag especial)
|
|
|
|
#### De `monitor.php`:
|
|
- ✅ Query à `tbl_eal_monitoring`
|
|
- ✅ Organização por categoria
|
|
- ✅ Cálculo de status geral
|
|
|
|
### Technical Notes
|
|
|
|
#### Semana: Segunda a Domingo
|
|
- Função `getWeekRange()` calcula início da semana (segunda-feira)
|
|
- Timesheet usa UNIX timestamp para compatibilidade com dados antigos
|
|
|
|
#### Billing 360
|
|
- Calcula horas entregues de `tbltaskstimers`
|
|
- Compara com horas facturadas de `billing_360_invoices`
|
|
- Status: `credit` (>5h crédito), `debt` (<-5h débito), `ok` (entre -5 e +5)
|
|
|
|
#### Pipeline
|
|
- Agrega leads por fase (`tblleads_status`)
|
|
- Inclui estimates (status 2=Enviado, 3=Visto)
|
|
- Inclui proposals (status 4)
|
|
- Valor total calculado em SQL
|
|
|
|
#### Performance
|
|
- Queries em paralelo com `Promise.all()`
|
|
- Connection pool MySQL (10 conexões)
|
|
- Vite proxy em dev (zero CORS issues)
|
|
|
|
### Pending
|
|
|
|
- [ ] Sistema de autenticação (JWT ou sessões)
|
|
- [ ] Deploy em produção (EasyPanel)
|
|
- [ ] Configurar variáveis de ambiente em produção
|
|
- [ ] Testar Google Calendar OAuth refresh
|
|
|
|
### Breaking Changes
|
|
|
|
- ❌ PHP backend descontinuado (`plan-eal.descomplicar.pt` será apagado)
|
|
- ✅ Nova API Node.js/Express em `/api`
|
|
- ✅ React dashboard em `dash.descomplicar.pt`
|
|
|
|
---
|
|
|
|
## [1.0.0] - 2026-02-03
|
|
|
|
### Added
|
|
- Dashboard React inicial com Vite + TypeScript
|
|
- UI com Tailwind CSS 4 + Framer Motion
|
|
- Design system: Glassmorphism + Bento Grid
|
|
- Componentes: HeroStat, GlassCard, ProgressRing, Sparkline
|
|
- Dados mock para demonstração
|
|
- Autenticação Authentik (OIDC) configurada
|
|
- Deploy EasyPanel em `dash.descomplicar.pt`
|
|
|
|
### Note
|
|
Versão inicial com dados mock. API implementada na v2.0.0.
|