Files
DashDescomplicar/CHANGELOG.md
Emanuel Almeida 20c16ab1e0 security: fix 3 critical vulnerabilities + dependency audit
CRITICAL FIXES:
- Remove hardcoded DB password from api/db.ts (was: 9qPRdCGGqM4o)
- Remove hardcoded API key from api/routes/wp-monitor.ts
- Add mandatory env var validation for DB_USER, DB_PASS, DB_NAME
- Add mandatory env var validation for WP_MONITOR_API_KEY
- Add connection timeouts to MySQL pool (10s/15s/30s)

VERIFIED:
- .env never committed to Git (credentials not exposed in repo)
- .gitignore working correctly

DEPENDENCIES:
- Fix qs vulnerability (GHSA-w7fw-mjwx-w883)
- npm audit: 1 low → 0 vulnerabilities

Related: AUDIT-REPORT.md vulnerabilities 1.1, 1.2, 1.3
Next: Implement rate limiting, CORS restrictions, input validation

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-14 03:38:09 +00:00

296 lines
11 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
- **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
### Changed
- `api/db.ts` - Credenciais agora exigem variáveis de ambiente obrigatórias
- `api/routes/wp-monitor.ts` - API key agora exige variável de ambiente obrigatória
### Technical Notes
- Auditoria de segurança realizada - 3 vulnerabilidades críticas identificadas
- 2 corrigidas (hardcoded credentials), 1 era falso positivo
- Próximos passos: implementar rate limiting, CORS restrito, validação de input (Zod)
---
## [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.