
Svaret på “kører alting?” krævede før tre faneblade — Proxmox’ webinterface, en SSH-session med docker ps, og QNAP’s Control Panel. Så jeg byggede et dashboard, der samler det hele på én side. Det er selve siden du kigger på lige nu.
Dashboardet er delt i tre sektioner med hver sin farve, så man kan se på et sekund hvilken slags ting man kigger på:
Siden opdaterer sig selv hvert halve minut uden at genindlæse.
Fire kilder, hver med sin egen adgangsform: Proxmox’ REST API med et token bundet til ren læseadgang (PVEAuditor), Docker Engine API gennem en skrivebeskyttet socket, Home Assistant for ét specifikt tal, og QNAP NAS’en over SNMP — skrivebeskyttet og uden at skulle gemme en admin-adgangskode.
Home Assistant “brugte” 99% RAM — men det gjorde den ikke. Proxmox måler hvor meget værts-RAM en gæst optager, og Linux bruger al ledig hukommelse til diskcache. Løsningen blev at spørge Home Assistant direkte om dens eget hukommelsestal i stedet for at stole på værtens udefra-måling.
“Sidst nede” virkede aldrig, fordi jeg kiggede på status hvert 30. sekund — en container der er nede i to sekunder under en genstart bliver aldrig observeret som nede. Løsningen var at holde øje med starttidspunktet i stedet: er det hoppet fremad siden sidst, har enheden genstartet, uanset hvad status tilfældigvis var da jeg kiggede.
Jeg slog min egen NAS ud, første gang jeg tilføjede QNAP-understøttelse. Statusindsamlingen kørte både fra en baggrundsproces og ved hver sideopdatering samtidig, og NAS’ens spinkle SNMP-agent kunne ikke følge med de overlappende forespørgsler. Rettelsen — at sidevisninger genbruger baggrundsprocessens data — gjorde hele dashboardet hurtigere på samme tid.
better-sqlite3dockerode, undici, net-snmp/api/status-endpoint der returnerer hele øjebliksbilledet som JSONDen lærerigste del var ikke koden, men stederne hvor et tal så rigtigt ud og ikke var det. Et dashboard man ikke kan stole på er værre end intet dashboard — for man handler på det uden at tjekke efter. Det meste af arbejdet gik med at gøre etiketterne ærlige.