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>
12 KiB
Executable File
12 KiB
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
- Eliminado fallback
- VERIFICADO - Confirmado que
.envnunca foi commitado ao Git- Credenciais locais nunca foram expostas no repositório
.gitignorea 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
- Whitelist:
- 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
- Middleware genérico
- 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)
- Ativável via
- 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.exampleatualizado comSSH_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 Zodmigrate-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çaapi/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.shno servidor CWP
- Verifica directório mais recente em
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 -dte 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.phppara/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
MonitorDataactualizada para reflectir estrutura real da API - ✅ Mock data actualizado com dados realistas da BD
- ✅ Sumário usa
data.statsem vez dedata.summarypara 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/monitorretorna dados detbl_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_monitoringexistente
- Serviço
Endpoints Server Metrics
POST /api/server-metrics/collect- Recolhe métricas de todos os servidoresPOST /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_monitoringcom dados reais - Cron recomendado:
curl -X POST localhost:3001/api/server-metrics/collecta 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
- Rota
-
✅ 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.tspara verificação periódica - Rota
POST /api/monitor/check-sitespara trigger manual
- Função
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
downna 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
- Tabela
Endpoints Hetzner
GET /api/hetzner- Dashboard (servidores + últimas métricas)POST /api/hetzner/sync- Sincronizar lista de servidoresPOST /api/hetzner/collect- Recolher métricas de todos os servidoresPOST /api/hetzner/collect/:id- Recolher métricas de um servidorGET /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/diagnosticpara 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_HOSTpara 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)
- Query à tabela
Endpoints
- ✅
GET /api/dashboard- Dashboard completo - ✅
GET /api/monitor- Monitorização de sistemas - ✅
GET /api/health- Health check
Frontend
- ✅
App.tsxactualizado 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 apenasnpm start- Produção (serve API + static build)
Dependências Adicionadas
express^4.19.2cors^2.8.5mysql2^3.11.5googleapis^144.0.0concurrently^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/apipackage.json- Nome alterado paradash-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.ptserá 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.