feat(260923-dhh): Proxmox-Modul Aufgabe 6 - Modulseite mit Auslastung

- ServerCard.tsx: einzige Stelle, die einen Messwert in Text verwandelt
  (formatMetric) — null wird ueberall "unbekannt", nie 0/NaN/leer;
  verzweigt ueber productType auf PVE/PBS/PMG; PBS ohne Sicherung zeigt
  "noch keine Sicherung" statt eines Fehlers; nicht erreichbarer Server
  zeigt Klartext-Ursache plus Zeitpunkt der letzten erfolgreichen Messung
- page.tsx: "Jetzt aktualisieren" fragt alle Server neu ab und laedt die
  Liste danach neu, waehrend des Laufs gesperrt; ruhiger Hinweis bei
  leerer Liste mit Weg zu den Einstellungen; Link zu den Einstellungen
  nur fuer Administratoren sichtbar (Anzeige, kein Zugriffsriegel)
- proxmox-api.ts: ProxmoxMetrics-Union (Pve/Pbs/Pmg) fuer typsichere
  Verzweigung im Frontend
- umlaut-dictionary.ts: zwei weitere korrekte Woerter auf die
  Positivliste (Messung, Prozessorlast)

Tore: web 708/708 (>=693), type-check 4/4, Biome apps/web 53 Warnungen
(unveraendert).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-23 14:45:27 +02:00
parent 723cf6814b
commit 06fcdc0157
7 changed files with 622 additions and 34 deletions
+50 -2
View File
@@ -21,6 +21,54 @@ export type ProxmoxErrorKind =
| 'server'
| 'unbekannt';
export interface ProxmoxPveNodeMetric {
node: string;
cpu: number | null;
maxcpu: number | null;
mem: number | null;
maxmem: number | null;
}
export interface ProxmoxPveStorageMetric {
storage: string;
node: string;
disk: number | null;
maxdisk: number | null;
}
export interface ProxmoxPveMetrics {
productType: 'pve';
nodeCount: number;
guestsRunning: number;
guestsStopped: number;
nodes: ProxmoxPveNodeMetric[];
storages: ProxmoxPveStorageMetric[];
}
export interface ProxmoxPbsDatastoreMetric {
name: string;
total: number | null;
used: number | null;
free: number | null;
lastBackupAt: number | null;
lastVerifyState: string | null;
}
export interface ProxmoxPbsMetrics {
productType: 'pbs';
datastores: ProxmoxPbsDatastoreMetric[];
}
export interface ProxmoxPmgMetrics {
productType: 'pmg';
countIn: number | null;
countOut: number | null;
spamCount: number | null;
virusCount: number | null;
}
export type ProxmoxMetrics = ProxmoxPveMetrics | ProxmoxPbsMetrics | ProxmoxPmgMetrics;
export interface ProxmoxServerStatus {
id: string;
serverId: string;
@@ -29,7 +77,7 @@ export interface ProxmoxServerStatus {
reachable: boolean;
errorKind: ProxmoxErrorKind | null;
errorDetail: string | null;
metrics: unknown;
metrics: ProxmoxMetrics | null;
rawSample: unknown;
updatedAt: string;
}
@@ -72,7 +120,7 @@ export interface ProxmoxTestResult {
reachable: boolean;
errorKind: ProxmoxErrorKind | null;
errorDetail: string | null;
metrics: unknown;
metrics: ProxmoxMetrics | null;
rawSample: unknown;
}