feat: add server stats, GPU stats, container CPU/memory display

- Add /api/servers endpoint querying Prometheus for CPU, RAM, disk, uptime, load
- Add /api/gpu endpoint for NVIDIA Jetson GPU utilization, temp, power
- Add ServerStatsWidget with animated bars for Atlas, Wile, RoadRunner
- Add GPUStatsWidget with GPU util, memory, temp color-coding, power draw
- Update ContainerGroup to show CPU bar and memory for running containers
- Fix docker-compose.yml: traefik network external: true
- Fix getTraefikUrl to scan all router labels (not just 'https')
This commit is contained in:
2026-02-13 13:08:39 -05:00
parent d6debe51b1
commit b14489ff59
8 changed files with 918 additions and 435 deletions

View File

@@ -1,40 +1,64 @@
export interface Container {
id: string;
name: string;
image: string;
state: string;
status: string;
created: number;
ports: Port[];
labels: Record<string, string>;
}
export interface Port {
ip?: string;
privatePort: number;
publicPort?: number;
type: string;
}
export interface UnifiDevice {
name: string;
mac: string;
ip: string;
model: string;
state: number;
uptime: number;
}
export interface SynologyStorage {
volume: string;
size: number;
used: number;
available: number;
percentUsed: number;
}
export interface GrafanaDashboard {
uid: string;
title: string;
url: string;
}
export interface Container {
id: string;
name: string;
image: string;
state: string;
status: string;
created: number;
ports: Port[];
labels: Record<string, string>;
cpu?: string;
memory?: string;
stats?: string;
}
export interface Port {
ip?: string;
privatePort: number;
publicPort?: number;
type: string;
}
export interface UnifiDevice {
name: string;
mac: string;
ip: string;
model: string;
state: number;
uptime: number;
}
export interface SynologyStorage {
volume: string;
size: number;
used: number;
available: number;
percentUsed: number;
}
export interface GrafanaDashboard {
uid: string;
title: string;
url: string;
}
export interface ServerStats {
name: string;
role: string;
ip: string;
cpu: number;
memoryPercent: number;
memoryUsedGB: number;
memoryTotalGB: number;
diskPercent: number;
uptimeSeconds: number;
load1: number;
}
export interface GPUStats {
name: string;
gpu_util: number;
mem_util: number;
temp: number;
power_watts: number;
}