Jag ville ha koll på mina servrar utan att behöva logga in på varje enskild maskin. Och utan att betala för tjänster som Datadog eller Zabbix. Lösningen blev SkyNode — ett egenutvecklat system där en liten agent på varje server rapporterar sin status, och en HTML-sida samlar ihop allt i en live-dashboard.

Projektet tog ungefär ett år att växa fram till vad det är idag — med idéer, omskrivningar, testande och lärande längs vägen. Det är inte perfekt, men det är mitt — och det funkar.

2
Agent-varianter
Windows + Linux
9191
Porten agenterna
lyssnar på
~1 år
Tid det tagit att
bygga systemet
Hur fungerar systemet?
Arkitektur i ett nötskal

Systemet bygger på ett enkelt koncept: varje server kör en liten agent-process som samlar ihop information om sig själv. Dashboarden (en HTML-fil) frågar sedan varje agent och ritar upp resultatet i realtid.

🖥 Server
kör agenten
HTTP :9191
/status
🌐 Dashboard
hämtar data
📊 Live-vy
i webbläsaren

Dashboarden behöver inte ligga på samma maskin som agenterna — den är bara en HTML-fil som kan öppnas i vilken webbläsare som helst, var som helst på nätverket. Den frågar agenterna direkt via HTTP.

Vad är en agent?
Den lilla programmet som körs på varje server

Agenten är ett litet program som startar automatiskt när servern startar och sedan bara sitter och lyssnar. När dashboarden frågar, svarar agenten med ett JSON-paket fyllt med info om servern.

Agenten behöver inga externa bibliotek eller beroenden — den är avsiktligt enkel och portabel.

🪟 Windows-agenten

  • Skriven i PowerShell
  • Kör som Administrator
  • Autostart via Task Scheduler
  • Hämtar CPU, RAM, diskar
  • Övervakar Windows-tjänster
  • Kopplar mot SQL Server/MySQL
  • Skapar brandväggsregel automatiskt

🐧 Linux-agenten

  • Skriven i Python 3
  • Kör som root (sudo)
  • Autostart via systemd
  • Läser /proc för CPU + RAM
  • Kör df för diskinformation
  • Kollar systemctl-tjänster
  • Stöd för MySQL + PostgreSQL
Vad samlar agenten in?
All data som skickas till dashboarden

Varje gång dashboarden frågar agenten returnerar den ett JSON-objekt med all relevant serverinformation. Det ser ut ungefär så här:

SVAR FRÅN /status — JSON-FORMAT
{ "name": "PROD-SERVER-01", "os": "Windows Server 2022 Standard", "online": true, "cpu": 23, // procent (0-100) "ramGB": 32.0, // totalt RAM i GB "ramUsed": 14.2, // använt RAM i GB "disks": [ { "letter": "C:", "total": 120, "used": 67 }, { "letter": "D:", "total": 500, "used": 312 } ], "services": [ { "name": "W3SVC", "status": "ok" }, { "name": "Spooler", "status": "stop" } ], "sql": [ { "name": "MySQL", "db": "wordpress", "sizeMB": 420, "status": "ok" } ], "ts": "2025-04-26 14:22:01" // tidsstämpel }
API-endpoints — vad kan man fråga agenten?
HTTP på port 9191

Agenten lyssnar på port 9191 och svarar på tre olika adresser.

GET
http://<server-ip>:9191/status
Returnerar all serverinformation som JSON. Det är detta dashboarden anropar varje gång den uppdaterar sig. Svaret innehåller CPU, RAM, diskar, tjänster och databaser.
GET
http://<server-ip>:9191/health
En enkel hälsokontroll. Svarar alltid med {"ok": true} om agenten är igång. Bra för att snabbt kolla om agenten lever.
http://192.168.1.10:9191/status
"name": "MINSERVER",  "online": true,
"cpu": 12,  "ramGB": 16.0,  "ramUsed": 5.4,
"disks": [{ "letter": "C:", "total": 240, "used": 88 }],
"services": [{ "name": "W3SVC", "status": "ok" }],
"ts": "2025-04-26 14:22:01"
Hur fungerar HTML-dashboarden?
En enda HTML-fil — inga beroenden, ingen server

Dashboarden är en vanlig HTML-fil som du öppnar i webbläsaren. Inget Node.js, inga npm-paket, inget backend. Allt JavaScript är inbyggt i filen och kommunicerar direkt med agenterna via fetch().

🌐 Webbläsare
öppnar HTML-fil
fetch()
varje 30 sek
Agenter
svarar med JSON
📊 Uppdaterar
vyn automatiskt
AGENTENS KOMMUNIKATION MED DASHBOARDEN — HTTP PORT 9191 🪟 Windows PowerShell Agent :9191 aktiv 🐧 Linux Python Agent :9191 aktiv skynode-dashboard.html 🌐 SkyNode Dashboard PROD-01 cpu: 23% DATABASE cpu: 8% ↻ var 30:e sekund via fetch() GET /status 200 OK {JSON} GET /status 200 OK {JSON} Förfrågan (GET) Svar (JSON) 🔒 lokalt nätverk

I dashboardens CONFIG-objekt listar man sina servrar med IP och port. Dashboarden frågar sedan alla servrar parallellt, ritar upp ett kort per server och uppdaterar sig automatiskt var 30:e sekund. Om en server inte svarar visas den som offline.

DASHBOARD CONFIG — LÄGG TILL DINA SERVRAR HÄR
const CONFIG = { refreshSeconds: 30, servers: [ { name: "Webb-server", url: "http://192.168.1.10:9191" }, { name: "Databas-server", url: "http://192.168.1.20:9191" }, { name: "NAS", url: "http://192.168.1.30:9191" }, ] };
💡 Tips: Dashboarden fungerar utmärkt från en NAS eller en Synology — öppna bara HTML-filen i valfri webbläsare på nätverket. Ingen installation krävs.
Autostart — agenten startar med servern
Systemd på Linux, Task Scheduler på Windows

Agenten är designad att starta automatiskt och köra i bakgrunden utan att störa det övriga systemet. På Linux används systemd, på Windows Task Scheduler.

LINUX — SYSTEMD SERVICE
# Kopiera agenten: sudo cp agent-linux.py /opt/monitor/agent-linux.py # Skapa service-fil i /etc/systemd/system/monitor-agent.service [Unit] Description=Server Monitor Agent After=network.target [Service] ExecStart=/usr/bin/python3 /opt/monitor/agent-linux.py Restart=always User=root [Install] WantedBy=multi-user.target # Aktivera och starta: sudo systemctl daemon-reload sudo systemctl enable --now monitor-agent
WINDOWS — TASK SCHEDULER (automatiskt via install-skript)
# Kör install-skriptet som Administrator: powershell -ExecutionPolicy Bypass -File install-windows.ps1 # Skriptet sköter automatiskt: Kopierar agenten till C:\Monitor\ Skapar brandväggsregel för port 9191 Skapar schemalagd uppgift som kör som SYSTEM Startar agenten direkt
Säkerhet: Agenten lyssnar på port 9191 utan kryptering. Den är avsedd för användning på ett internt nätverk — exponera den inte mot internet utan ett lager av skydd (VPN eller reverse proxy med HTTPS). Agenten har ett valfritt token-skydd via X-Monitor-Token-headern.
Inga molntjänster. Ingen prenumeration. Bara egna servrar som pratar med varandra på det lokala nätverket.
Projektet — ungefär ett år av byggande
Hur SkyNode växte fram
Tidigt 2025
Idén föds
Trött på att logga in på varje server för att kolla status. Börjar skissa på ett enkelt PowerShell-skript som svarar på HTTP-anrop.
Vår 2025
Första fungerande prototypen
Windows-agenten kan svara på /status med CPU och RAM. En enkel HTML-sida visar resultatet. Inga diskgrafer, ingen tjänstövervakning ännu.
Sommar 2025
Linux-agenten tillkommer
Porterar logiken till Python 3 utan externa bibliotek. Agenten läser /proc direkt för CPU och minne. Systemd-integrationen läggs till.
Höst 2025
Dashboarden växer
Lägger till pie-grafer för diskar, tjänstövervakning, SQL-databasstorlekar och filter för Windows/Linux/kritiska servrar. Auto-refresh implementeras.
Tidigt 2026
Polering och install-skript
Install-skript för automatisk driftsättning. Token-autentisering, bättre felhantering och responsiv design. Projektet döps till SkyNode.

Vad du får med SkyNode

  • Windows-agent skriven i PowerShell
  • Linux-agent i Python 3
  • Live-dashboard som körs direkt i webbläsaren
  • Automatisk uppdatering
  • Stöd för MySQL, MariaDB och PostgreSQL
  • Inga molntjänster, inga externa beroenden
  • Designad för internt nätverk med valfritt token-skydd

Nyfiken på att bygga något liknande?

Hör av dig — jag berättar gärna mer om hur det är uppbyggt och vad jag lärt mig längs vägen.

✉ Kontakta mig