diff --git a/dashcaddy-api/middleware.js b/dashcaddy-api/middleware.js index 9cc878d..92fc6bb 100644 --- a/dashcaddy-api/middleware.js +++ b/dashcaddy-api/middleware.js @@ -305,6 +305,8 @@ module.exports = function configureMiddleware(app, { { path: '/api/v1/config', exact: true, method: 'GET' }, { path: '/api/v1/services/status', exact: true, method: 'GET' }, { path: '/api/v1/system/update-notify', exact: true, method: 'POST' }, + { path: '/api/v1/monitoring/stats', exact: true, method: 'GET' }, + { path: '/api/v1/health-checks/status', exact: true, method: 'GET' }, ]; function isPublicRoute(req) { diff --git a/dashcaddy-api/routes/health.js b/dashcaddy-api/routes/health.js index e5c112d..badcbd3 100644 --- a/dashcaddy-api/routes/health.js +++ b/dashcaddy-api/routes/health.js @@ -322,9 +322,16 @@ module.exports = function({ // ===== HEALTH CHECK (health-checker module) ===== // Get current status for all services + // Returns per-service status plus a summary for the System Overview widget: + // { status: { ... }, summary: { healthy, unhealthy, total } } router.get('/health-checks/status', asyncHandler(async (req, res) => { const status = healthChecker.getCurrentStatus(); - success(res, { status }); + // Build summary for the overview widget + const entries = Object.values(status); + const healthy = entries.filter(s => s.status === 'up' || s.status === 'healthy').length; + const unhealthy = entries.filter(s => s.status === 'down' || s.status === 'unhealthy').length; + const total = entries.length; + success(res, { status, summary: { healthy, unhealthy, total } }); }, 'health-check-status')); // Get service statistics diff --git a/dashcaddy-api/routes/monitoring.js b/dashcaddy-api/routes/monitoring.js index ae27a39..46e7498 100644 --- a/dashcaddy-api/routes/monitoring.js +++ b/dashcaddy-api/routes/monitoring.js @@ -16,8 +16,22 @@ module.exports = function({ resourceMonitor, docker, asyncHandler, log, notifica // ===== RESOURCE MONITORING ENDPOINTS ===== // Get all container stats (from resource monitor module) + // Returns a flat summary format for the System Overview widget: + // { containerId: { cpu: , memory: , memoryUsage: , name } } router.get('/monitoring/stats', asyncHandler(async (req, res) => { - const stats = resourceMonitor.getAllStats(); + const raw = resourceMonitor.getAllStats(); + // Transform nested { current: { cpu: { percent }, memory: { percent, usage } } } + // into flat { cpu: number, memory: number, memoryUsage: number } for the frontend widget + const stats = {}; + for (const [id, data] of Object.entries(raw)) { + const cur = data.current || {}; + stats[id] = { + name: data.name, + cpu: typeof cur.cpu === 'object' ? (cur.cpu.percent ?? 0) : (Number(cur.cpu) || 0), + memory: typeof cur.memory === 'object' ? (cur.memory.percent ?? 0) : (Number(cur.memory) || 0), + memoryUsage: typeof cur.memory === 'object' ? (cur.memory.usage ?? 0) : 0, + }; + } success(res, { stats }); }, 'monitoring-stats'));