# 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.