PHP · MySQL / MariaDB · SNMP · Zabbix-agent
Övervaka servrar, hypervisors och nätverk från en sida
VM Monitor visar status för Windows- och Linux-servrar, NAS, Proxmox, VMware och Hyper-V, switchar, routrar och brandväggar samt vanliga tjänster. Du får larm när något går över dina gränsvärden.
Innan du börjar
Krav
Installationen nedan utgår från Debian eller Ubuntu. Samma delar behövs på andra distributioner, med andra paketnamn.
Server (där VM Monitor körs)
| Del | Krav | Används till |
|---|---|---|
| PHP | 8.0 eller nyare, installationen nedan använder 8.5 | Hela applikationen och bakgrundstjänsten |
php8.5-mysql | PHP-tillägget pdo_mysql | Databasanslutning |
php8.5-curl | PHP-tillägget curl | URL-checks, Proxmox API, Telegram, webhook och SMS |
php8.5-snmp | PHP-tillägget snmp | SNMP-checks, VMware, switchar, routrar och brandväggar |
php8.5-mbstring | PHP-tillägget mbstring | Textfunktioner |
openssl | Ingår i PHP-paketen | Kryptering av sparade lösenord och tokens (AES-256-GCM) |
| Databas | MariaDB 10.5+ eller MySQL 8.0+ | Inställningar, kontroller, historik och loggar |
| Webbserver | nginx eller Apache 2.4, med PHP-FPM | Gränssnittet. Kör det över HTTPS |
iputils-ping | Kommandot ping, och PHP:s exec() får inte vara avstängt | Ping-checks och "server svarar inte" |
| systemd | Valfritt, rekommenderas | Bakgrundstjänsten vmmon-worker |
Kontrollera tilläggen i kommandoradens PHP med php -m. Bakgrundstjänsten använder CLI-PHP, som kan ha andra tillägg än PHP-FPM.
Nätverk
| Från monitorn till | Port | Behövs för |
|---|---|---|
| Servrar och enheter | ICMP | Ping |
| Servrar, switchar, ESXi | UDP 161 | SNMP |
| Servrar med Zabbix-agent | TCP 10050 | Zabbix-agent (passiva kontroller) |
| Proxmox | TCP 8006 | Proxmox API |
| Telegram, SMS-leverantör | TCP 443 utåt | Larm |
| SMTP-server | TCP 25, 465 eller 587 | E-postlarm |
Installation
Steg för steg
Följ stegen i ordning. Byt ut vmmon.example.se och lösenord mot dina egna värden.
-
Installera webbserver, databas och PHP 8.5
Uppdatera systemet och lägg först till en paketkälla för PHP 8.5. Debian och Ubuntu levererar ofta en äldre PHP-version som standard, så här används Ondřej Surýs paketkälla.
bashsudo apt update && sudo apt upgrade -y sudo apt install -y software-properties-common curl unzip sudo add-apt-repository -y ppa:ondrej/php sudo apt update
bashsudo apt update && sudo apt upgrade -y sudo apt install -y ca-certificates curl unzip lsb-release sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' sudo apt update
Installera sedan PHP med alla tillägg.
iputils-pingbehövs för ping-checks ochsnmpger dig kommandotsnmpwalkför felsökning.bashsudo apt install -y php8.5-cli php8.5-fpm php8.5-mysql php8.5-curl \ php8.5-snmp php8.5-mbstring iputils-ping snmp php -v php -m | grep -Ei 'pdo_mysql|curl|openssl|snmp|mbstring'
Utskriften från
php -mska innehålla alla fem namnen.Välj webbserver och databas. Du behöver bara en av varje.
bashsudo apt install -y nginx sudo systemctl enable --now nginx php8.5-fpm
bashsudo apt install -y apache2 sudo a2enmod proxy_fcgi setenvif rewrite headers sudo a2enconf php8.5-fpm sudo systemctl enable --now apache2 php8.5-fpm
bashsudo apt install -y mariadb-server sudo systemctl enable --now mariadb sudo mysql_secure_installation
bashsudo apt install -y mysql-server sudo systemctl enable --now mysql sudo mysql_secure_installation
På RHEL, Rocky och Alma heter paketen
php-snmp,php-mysqlndoch så vidare. PHP 8.5 kommer då från Remi-repot. Resten av guiden gäller oförändrad, men filsökvägar och användarenwww-dataheterapacheellernginx.
-
Skapa databasanvändare och importera databasen
Zippen innehåller
schema.sql. Den skapar databasenvmmonmed alla tabeller och är komplett, så du ska inte köra någramigrate_*.sqlvid en ny installation.Skapa först en egen användare med rättigheter bara på databasen
vmmon:bashsudo mysql
sqlCREATE DATABASE IF NOT EXISTS vmmon CHARACTER SET utf8mb4; CREATE USER 'vmmon'@'localhost' IDENTIFIED BY 'byt-till-ett-langt-losenord'; GRANT ALL PRIVILEGES ON vmmon.* TO 'vmmon'@'localhost'; FLUSH PRIVILEGES; EXIT;
Importera sedan schemat från den uppackade mappen:
bashcd /var/www/vmmon sudo mysql < schema.sql sudo mysql -e "USE vmmon; SHOW TABLES;"
Listan ska innehålla 13 tabeller, bland annat
users,servers,server_checks,alert_rulesochapp_log. Hoppa till steg 3 om du inte har packat upp filerna än, och kör importen när de ligger på plats.schema.sqlär till för en tom installation. Kör den inte mot en databas med data, den skapar tabellerna från början.Ska databasen ligga på en annan server? Skapa användaren som
'vmmon'@'webbserverns-ip'och sättbind-addressi databasens konfiguration så att den lyssnar på nätverket.
-
Lägg filerna på plats och ställ in config
bashsudo mkdir -p /var/www/vmmon sudo unzip vmmon.zip -d /tmp/vmmon-unzip sudo cp -r /tmp/vmmon-unzip/vmmon/. /var/www/vmmon/ sudo chown -R www-data:www-data /var/www/vmmon sudo find /var/www/vmmon -type d -exec chmod 750 {} \; sudo find /var/www/vmmon -type f -exec chmod 640 {} \;Webbanvändaren måste kunna skriva i mappen, eftersom programmet skapar filen
secret.phpvid första start.Databasuppgifter i config.local.php
Kopiera exempelfilen och fyll i dina uppgifter. Redigera inte
config.php. Den ersätts vid uppdateringar, medanconfig.local.phpligger kvar.bashcd /var/www/vmmon sudo -u www-data cp config.local.php.example config.local.php sudo -u www-data nano config.local.php
config.local.php<?php const DB_DSN = 'mysql:host=localhost;dbname=vmmon;charset=utf8mb4'; const DB_USER = 'vmmon'; const DB_PASS = 'byt-till-ett-langt-losenord';
Rad Betyder DB_DSNhostär databasservern (localhosteller ett IP-nummer),dbnameär databasen. Lägg till;port=3307om du använder en annan port.DB_USERAnvändaren du skapade i steg 2. DB_PASSLösenordet till den användaren. Använd enkla citattecken, och tecknet 'i lösenordet måste skrivas\'.Ta backup på
secret.phpnär den har skapats. Den innehåller nyckeln som krypterar lösenord och tokens i databasen. Utan den måste du skriva in dem igen. Nyckeln kan i stället sättas somSECRET_KEYiconfig.local.php.
-
Konfigurera webbservern
Konfigurationen pekar på PHP-FPM och stänger dessutom åtkomsten till filer som inte ska nås utifrån, som
.sql,.txtochconfig.local.php./etc/nginx/sites-available/vmmonserver { listen 80; server_name vmmon.example.se; root /var/www/vmmon; index index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.5-fpm.sock; } # Stäng åtkomst till filer som inte ska nås utifrån location ~* \.(sql|txt|service|example|md)$ { deny all; } location ~* ^/(config\.local|secret)\.php$ { deny all; } location ~ /\.ht { deny all; } }bashsudo ln -s /etc/nginx/sites-available/vmmon /etc/nginx/sites-enabled/vmmon sudo nginx -t && sudo systemctl reload nginx
/etc/apache2/sites-available/vmmon.conf<VirtualHost *:80> ServerName vmmon.example.se DocumentRoot /var/www/vmmon <Directory /var/www/vmmon> Require all granted DirectoryIndex index.php </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/php8.5-fpm.sock|fcgi://localhost" </FilesMatch> # Stäng åtkomst till filer som inte ska nås utifrån <FilesMatch "\.(sql|txt|service|example|md)$"> Require all denied </FilesMatch> <FilesMatch "^(config\.local|secret)\.php$"> Require all denied </FilesMatch> </VirtualHost>bashsudo a2ensite vmmon sudo a2dissite 000-default sudo apachectl configtest && sudo systemctl reload apache2
HTTPS
Inloggningen och dina lösenord ska aldrig gå i klartext. Hämta ett gratis certifikat med Let's Encrypt:
bashsudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d vmmon.example.se
bashsudo apt install -y certbot python3-certbot-apache sudo certbot --apache -d vmmon.example.se
Har du bara ett internt nätverk får du använda en egen CA eller ett självsignerat certifikat.
-
Första start och administratör
- Öppna
https://vmmon.example.se. Så länge databasen saknar användare visar inloggningssidan formuläret Skapa första administratören. - Fyll i användarnamn, e-post och ett lösenord på minst 8 tecken. E-postadressen används för "Glömt lösenord".
- Öppna Inställningar. Under Allmänt ställer du in intervall, gränsvärden och hur länge data och loggar sparas. Under SNMP anger du standard-community, och under Notifieringar fyller du i SMTP och eventuellt Telegram, webhook och SMS.
- Lägg till din första server under Servrar, och skapa larmregler under Larmregler.
Fler användare skapas under Inställningar → Användare. Rollen admin kan ändra allt, rollen user kan bara titta.
- Öppna
-
Bakgrundstjänsten (systemctl)
Utan tjänsten körs kontroller och larm bara medan någon har dashboarden öppen, eftersom webbläsaren då anropar
api/poll.phpvar 15:e sekund. Tjänstenvmmon-workerkör dem hela tiden. När den är igång hoppar dashboarden över egen pollning, och om tjänsten stannar tar webbläsaren över automatiskt.Filen
vmmon-worker.serviceföljer med i zippen:vmmon-worker.service[Unit] Description=VM Monitor worker (kontroller, hosts och larm) After=network-online.target mysql.service mariadb.service [Service] User=www-data WorkingDirectory=/var/www/vmmon ExecStart=/usr/bin/php /var/www/vmmon/worker.php Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
Justera
Useroch sökvägarna om du valde andra. Användaren ska vara samma som webbservern kör som, eftersom den behöver läsaconfig.local.phpochsecret.php.bashsudo cp /var/www/vmmon/vmmon-worker.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now vmmon-worker systemctl status vmmon-worker journalctl -u vmmon-worker -f
I loggen ska du se startar, och vid första cykeln kördes: N kontroller…. Därefter kommer lever: … var tionde minut. Du kan också köra en enda cykel för hand:
sudo -u www-data php /var/www/vmmon/worker.php --once.Vill du se tjänstens logg i gränssnittet under Inställningar → Loggar lägger du webbanvändaren i gruppen
systemd-journal:sudo usermod -aG systemd-journal www-data, och startar sedan om PHP-FPM och tjänsten. PHP:sexec()måste vara tillåtet.Utan systemd
- Cron, varje minut:
* * * * * www-data php /var/www/vmmon/worker.php --for=55 - Windows:
nssm install VMMonitor php.exe C:\sökväg\worker.php, eller en schemalagd aktivitet vid start.
- Cron, varje minut:
Underhåll
Uppgradera
- Ta backup på databasen:
mysqldump vmmon > vmmon-backup.sql, och påsecret.phpochconfig.local.php. - Ersätt filerna i
/var/www/vmmonmed de nya. Dina uppgifter ligger kvar iconfig.local.php. - Kör de migreringsfiler som är nyare än din version, i ordning, till exempel
sudo mysql vmmon < migrate_v19.sql. FilenREADME.txtanger vilken migrering som hör till vilken uppgradering. Kör bara dem du inte redan har kört. - Starta om tjänsten:
sudo systemctl restart vmmon-worker, och ladda om webbläsaren med Ctrl+F5.
Funktioner
Vad kan övervakas
Allt läggs till i gränssnittet. Varje server, host, nätverksenhet och tjänst har samma sida med rutan Pausa larm / Inaktivera / Dölj från dash och panelen Tjänster och kontroller, där varje kontroll kan testas för hand med Testa nu.
Servrar
Windows, Linux och NAS (till exempel TrueNAS).
- CPU, minne och diskar
- OS och version
- Interface och trafik
- Ping, SNMP, Zabbix-agent, TCP och URL
Virtualisering
Hosts med VM-lista och storage.
- Proxmox VE via API-token
- VMware ESXi via SNMP
- Hyper-V via Zabbix-agent
- Host-CPU, minne, storage och varje VM
Nätverk
Switchar, routrar och brandväggar via SNMP och ping.
- Interface, trafik, fel och tappade paket
- CPU, minne och uptime
- Temperatur, fläktar och nätdelar
Tjänster
Fristående kontroller som inte hör till en server, till exempel en webbplats eller en extern IP.
- Ping, TCP-portar och URL
- Svarstid i ms
- SSL-certifikatets giltighetstid
Kontrolltyper
| Typ | Vad den kontrollerar |
|---|---|
| Ping | ICMP-svar och svarstid. |
| SNMP | CPU, minne, disk, OS och nätverksinterface via standard-MIB:ar. Stöder SNMP v2c och v3. Standard-community och SNMPv3-uppgifter sätts under Inställningar → SNMP. |
| TCP | Att en port svarar, med färdiga val för vanliga tjänster samt egen port. |
| URL | HTTP 200–399, exakt HTTP 200, att sidan innehåller en text, eller att SSL-certifikatet har minst 14 dagar kvar. |
| Zabbix-agent | Cirka 60 färdiga kontroller plus egen item-key. Se tabellen nedan. |
TCP-portar med färdiga val
Zabbix-agent, grupper av kontroller
| Grupp | Exempel |
|---|---|
| Agent | Agenten svarar (agent.ping), agentversion, agentens värdnamn |
| System | CPU-användning, CPU-load 1/5/15 min, iowait, antal CPU-kärnor, CPU-modell, uptime, OS-version, inloggade användare, serverns lokala tid |
| Minne | Minnesanvändning, totalt och tillgängligt minne, ledig swap |
| Disk och filer | Diskanvändning, ledigt och totalt utrymme per disk, lediga inoder, fil finns, filstorlek, när filen ändrades, filens innehåll |
| Processer och tjänster | Antal processer, process körs, process-CPU och -minne, Windows-tjänst körs, systemd-enhet aktiv (Agent 2) |
| Nätverk | Trafik in och ut, nätkortsfel, TCP- och UDP-port lyssnar, nätverkstjänst svarar, DNS-uppslag, hämta webbsida från servern |
| Windows | Performance Counter, WMI-fråga, registervärde |
| Applikationer (Agent 2) | Docker, MySQL/MariaDB, PostgreSQL, Redis, MongoDB och Memcached. Kräver Zabbix Agent 2 |
| Egen | Valfri item-key. system.run stöds avsiktligt inte |
Varje Zabbix-kontroll kan ha ett villkor för OK, till exempel <90, >=1, =active eller ~text.
Nätverksenheter
Välj roll (switch, router eller brandvägg) när du lägger till enheten. Enheter som inte finns i listan fungerar som Annan via standard-SNMP, men visar då färre sensorer.
Larm och notiser
Larmregler skapas i tre steg: vad som ska övervakas, villkor och mottagare. En regel kan gälla alla enheter, vissa enheter eller bara en viss tjänst, ett interface eller en VM.
| Grupp | Larmtyper |
|---|---|
| Resurser | CPU över X %, minne över X %, disk över X % (valfri disk) |
| Tjänster och servrar | Tjänst nere, tjänstens svarstid över X ms, server svarar inte på ping |
| Nätverk | Fel per minut, tappade paket, interface nere, interface-belastning |
| Virtualisering | Host svarar inte på ping, host svarar inte (API), host-CPU, host-minne, storage, VM körs inte, VM-CPU, VM-minne |
| Nätverksenheter | Svarar inte på ping, svarar inte på SNMP, temperatur, fläkt eller nätdel felar |
Kanaler
E-post
Via din SMTP-server. Mottagare anges som Larmkontakter under Inställningar → Notifieringar.
Telegram
Bot-token och ett eller flera chatt-ID, valfritt med tråd-ID.
Webhook
Skickar larmet som ett HTTP-anrop till en URL du anger.
SMS
REST-API med färdiga mallar för 46elks och Twilio, samt valfri generell REST-leverantör.
Larm kan pausas per enhet eller för alla på en gång, och en enhet kan sättas i underhållsläge.
Vanliga frågor
FAQ
Installation
Vilken PHP-version krävs?
PHP 8.0 eller nyare. Guiden använder PHP 8.5, men samma paket finns för äldre 8.x-versioner. Byt bara versionsnumret i paketnamnen, i sökvägen till PHP-FPM-socketen och i webbserverns konfiguration.
Måste jag köra tjänsten vmmon-worker?
Nej, men det rekommenderas. Utan den körs kontroller och larm bara när någon har dashboarden öppen i en webbläsare. Du får då inga larm på natten om ingen tittar.
Behövs cron?
Nej. Tjänsten ersätter cron. Cron är bara ett alternativ om du inte vill använda systemd.
Fel: "could not find driver" eller en tom sida direkt efter installationen
PHP-tillägget pdo_mysql saknas för PHP-FPM. Installera php8.5-mysql och starta om php8.5-fpm. Se även webbserverns fellogg, till exempel /var/log/nginx/error.log.
Fel: "Access denied for user" vid inloggning
Uppgifterna i config.local.php stämmer inte med databasanvändaren. Testa dem för hand: mysql -u vmmon -p vmmon. Kontrollera också att användaren skapades med rätt värd, 'vmmon'@'localhost' för en lokal databas.
Skapa-administratör-formuläret visas inte
Det visas bara när tabellen users är tom. Finns redan en användare loggar du in med den. Har du glömt lösenordet använder du Glömt lösenord, vilket kräver att SMTP är ifyllt.
Kan jag köra det på Windows?
Ja, med PHP, en webbserver och MySQL eller MariaDB för Windows. Bakgrundsprocessen startas med nssm install VMMonitor php.exe C:\sökväg\worker.php eller som en schemalagd aktivitet vid start. Guiden ovan är skriven för Linux.
Ping och SNMP
Ping fungerar inte, felet säger att exec() är avstängt
Ping körs som kommandot ping från PHP. Ta bort exec ur disable_functions i /etc/php/8.5/fpm/php.ini och /etc/php/8.5/cli/php.ini, kontrollera att iputils-ping är installerat och starta om PHP-FPM och tjänsten.
SNMP-checken ger "No response from …"
- Kontrollera community (eller SNMPv3-användare) och att monitorns IP får fråga enheten.
- UDP 161 måste vara öppen i brandväggen.
- Testa från monitorn:
snmpwalk -v2c -c community enhetens-ip 1.3.6.1.2.1.1. Svarar den inte där är felet inte i VM Monitor. - På Linux lyssnar
snmpdofta bara på localhost. SättagentAddress udp:161i/etc/snmp/snmpd.conf.
Linux-servern visar fel OS-version
Skapa /usr/local/bin/osrelease.sh (körbar) med innehållet #!/bin/sh och . /etc/os-release; echo "$PRETTY_NAME". Lägg raden extend osrelease /usr/local/bin/osrelease.sh i snmpd.conf och starta om snmpd. Utan detta härleds Ubuntu- och Debian-versionen från kernelversionen.
Servern svarar på ping men inte på SNMP, vilket status får kortet?
Kortet blir rött (Critical) så fort en kontroll som är synlig på dashboarden är nere, i det här fallet SNMP. Pingen visas fortfarande grön i chipen.
Zabbix-agent
Zabbix-agent-kontroller svarar inte
- Installera Zabbix Agent eller Agent 2 på målservern.
- Lägg monitorns IP i
Server=i agentens konfiguration. Kontrollerna är passiva och går mot port 10050. - Öppna TCP 10050 i brandväggen.
- Använd Testa nu på kontrollen. Den visar agentens exakta felmeddelande.
- Kontrollerna i gruppen Applikationer (och systemd-enhet) kräver Agent 2.
Varför fungerar inte system.run?
Den stöds avsiktligt inte, eftersom den låter agenten köra godtyckliga kommandon.
Virtualisering
Hur kopplar jag Proxmox?
Skapa en API-token i Proxmox under Datacenter → Permissions → API Tokens. Ge den rollen PVEAuditor. Avmarkera Privilege Separation eller ge token samma roll. Klistra in token-ID och hemlighet när du lägger till hosten under Virtualisering. Port 8006 måste vara nåbar från monitorn.
Hur kopplar jag VMware ESXi?
Via SNMP. Aktivera det på ESXi: esxcli system snmp set --communities community --enable true. VM-listan läses ur VMWARE-VMINFO-MIB.
Hur kopplar jag Hyper-V?
Via Zabbix-agent på Hyper-V-hosten. Nyckeln wmi.getall måste vara tillåten i agentens konfiguration.
Proxmox visar inga körande VM:ar via SNMP
Proxmox har ingen officiell MIB, så körande VM:ar härleds ur processlistan om du går via SNMP. Då måste net-snmp-vyn släppa igenom .1.3.6.1.2.1.25.4. API-vägen med token ger mer och bättre data och är den som rekommenderas.
Dashboard och inställningar
Vad är skillnaden mellan Pausa, Inaktivera, Dölj och Ignorera?
- Pausa larm: övervakningen fortsätter, men inga larm skickas under vald tid.
- Inaktivera: övervakningen stängs av helt.
- Dölj från dash: kortet försvinner från dashboarden, men enheten övervakas och larmar som vanligt.
- Ignore (på kortet): kortet blir grått och räknas inte som fel i sammanfattningen. Övervakningen fortsätter.
Vad styr färgerna normal, varning och kritisk?
De fyra reglagen under Inställningar → Allmänt: CPU, minne, disk (i procent) och svarstid (i ms). Varning och Kritisk justeras automatiskt så att nivåerna aldrig överlappar. De styr både färger och kortets status på dashboarden.
Hur ändrar jag sorteringen av korten?
Med sorteringsknappen på dashboarden. Egen layout behåller den ordning du lagt korten i. Kritikalitet lägger kort med kritiska tjänster först och därefter varning, och uppdateras automatiskt. Valet sparas i webbläsaren.
Kan jag stänga av ljudsignalen?
Ja, under Inställningar → Allmänt. Signalen spelas en gång när något blir kritiskt. Webbläsaren kräver att du har klickat på sidan minst en gång innan ljud får spelas.
Hur länge sparas data och loggar?
Övervakningshistoriken och loggarna har varsin lagringstid under Inställningar → Allmänt. Du kan alltså spara loggar kortare eller längre än mätdata.
Var ser jag loggar?
Under Inställningar → Loggar. Välj loggnivå och källa: Inloggning, SNMP, TCP, URL, Zabbix-agent, Proxmox/VMware/Hyper-V, Worker, Larm eller Konfiguration. Debug-loggning slås på i samma vy.
Kan en kollega bara titta utan att kunna ändra?
Ja. Skapa användaren med rollen user under Inställningar → Användare. Den kan se allt men inte ändra något.
Säkerhet
Hur lagras lösenord och tokens?
SNMP-communities, SMTP-lösenord, API-tokens, Telegram- och SMS-uppgifter lagras krypterade med AES-256-GCM. Nyckeln ligger i secret.php. Användarnas lösenord lagras som hash.
Vad måste jag skydda?
- Kör alltid över HTTPS.
- Se till att
.sql,.txtoch.serviceinte kan hämtas via webben (se webbserverns konfiguration ovan). - Begränsa databasanvändaren till databasen
vmmon. - Ta backup på databasen och på
secret.php.