Files
DashDescomplicar/CHANGELOG.md
Emanuel Almeida f1756829af security: implement 6 high-severity vulnerability fixes
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>
2026-02-14 04:09:50 +00:00

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
  • 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 (/apihttp://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.