From bd21a8d511e93c6db29692cd64101877a5a638c1 Mon Sep 17 00:00:00 2001 From: Emanuel Almeida Date: Wed, 4 Feb 2026 23:21:03 +0000 Subject: [PATCH] fix: TypeScript errors in server-metrics service --- .env.example | 9 +++++++++ CHANGELOG.md | 24 ++++++++++++++++++++++++ api/routes/server-metrics.ts | 2 +- api/server.ts | 2 ++ api/services/server-metrics.ts | 6 ++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index df66640..fef417e 100644 --- a/.env.example +++ b/.env.example @@ -11,5 +11,14 @@ FRONTEND_URL=http://localhost:5173 # Hetzner Cloud API HETZNER_TOKEN=your_hetzner_api_token_here +# SSH Servers (for metrics collection) +SERVER_HOST=176.9.3.158 +SERVER_USER=root +SERVER_PASS=your_cwp_server_password + +EASY_HOST=178.63.18.51 +EASY_USER=root +EASY_PASS=your_easypanel_password + # Production URLs # FRONTEND_URL=https://dash.descomplicar.pt diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c8cb84..60dadf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ Todas as alterações notáveis neste projecto serão documentadas neste ficheiro. +## [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 diff --git a/api/routes/server-metrics.ts b/api/routes/server-metrics.ts index 141fdd1..8564af0 100644 --- a/api/routes/server-metrics.ts +++ b/api/routes/server-metrics.ts @@ -34,7 +34,7 @@ router.post('/ssh', async (_req: Request, res: Response) => { try { const result = await collectSSHMetrics() res.json({ - success: true, + ok: true, message: `SSH: ${result.success} OK, ${result.failed} failed`, ...result }) diff --git a/api/server.ts b/api/server.ts index 8ed20ba..3d4fdc9 100644 --- a/api/server.ts +++ b/api/server.ts @@ -10,6 +10,7 @@ import monitorRouter from './routes/monitor.js' import diagnosticRouter from './routes/diagnostic.js' import hetznerRouter from './routes/hetzner.js' import wpMonitorRouter from './routes/wp-monitor.js' +import serverMetricsRouter from './routes/server-metrics.js' const app = express() const PORT = process.env.API_PORT || 3001 @@ -32,6 +33,7 @@ app.use('/api/monitor', monitorRouter) app.use('/api/diagnostic', diagnosticRouter) app.use('/api/hetzner', hetznerRouter) app.use('/api/wp-monitor', wpMonitorRouter) +app.use('/api/server-metrics', serverMetricsRouter) // Error handling app.use((err: any, _req: express.Request, res: express.Response, _next: express.NextFunction) => { diff --git a/api/services/server-metrics.ts b/api/services/server-metrics.ts index c65e90e..e3e30e3 100644 --- a/api/services/server-metrics.ts +++ b/api/services/server-metrics.ts @@ -6,9 +6,7 @@ import db from '../db.js' import { collectAllMetrics as collectHetznerMetrics } from './hetzner.js' -// Hetzner API Configuration -const HETZNER_API_URL = 'https://api.hetzner.cloud/v1' -const HETZNER_TOKEN = process.env.HETZNER_TOKEN || '' +// Hetzner API Configuration (used by hetzner.ts service) // SSH Configuration (from MCP ssh-unified) interface SSHServer { @@ -185,7 +183,7 @@ export async function syncHetznerToMonitoring(): Promise { m.status = 'up', m.last_check = NOW() WHERE m.category = 'server' AND m.name = ? - `, [hetznerName.includes('.') ? hetznerName : hetznerName, monitorName]) + `, [namePattern, monitorName]) if ((result as any).affectedRows > 0) synced++ }