Dokumentace
Instalace serveru, přidání monitorů a připojení agentů.
Rychlý start
Takhle nainstalujete centrální server na běžný PHP webhosting. Je to stejný návod jako na stránce ke stažení.
Změřená doba instalace: 1 min (od ZIPu vydání po první běh sběru dat na čistém serveru s PHP 8.2 a MySQL, podle tohoto návodu; nahrávání přes FTP a klikání v administraci hostingu jde navíc)
Ověřte, co hosting nabízí
- PHP 8.2 nebo novější s rozšířeními PDO MySQL, cURL, mbstring a OpenSSL
- Databáze MySQL nebo MariaDB
- Cron každou minutu (stačí Cron Jobs v cPanelu)
- Apache s .htaccess a mod_rewrite, jako na většině sdílených hostingů
- Jedna doména nebo subdoména, v jejímž kořeni leží /status i /app: aplikace mluví s /status na stejném hostu
- Odchozí HTTP a HTTPS z hostingu, pro kontroly
Umístěte ho mimo síť, kterou hlídáte. Server doma spadne s domácí linkou a pak už vám to nemá kdo říct.
Stáhněte a nahrajte
Poslední vydání: —
Rozbalte ho a nahrajte status/ do public_html/status/ a app/ do public_html/app/. Soubor app/.htaccess nevynechávejte: bez něj skončí obnovení stránky uvnitř aplikace chybou 404. Stažený soubor ověříte proti zveřejněnému kontrolnímu součtu tak, že SHA256SUMS uložíte vedle ZIPu a spustíte:
sha256sum -c SHA256SUMS --ignore-missingJeště žádné vydání? Sestavte obě složky ze zdrojů
S gitem a Node.js 22 na svém počítači:
git clone --recursive https://github.com/BKPepe/monitoring.git cd monitoring npm ci npm run build -w apps/monitor cp agents/vps-agent/agent.sh agents/vps-agent/agent.py agents/vps-agent/agent.ps1 \ agents/vps-agent/agent_openwrt.sh agents/vps-agent/docker-compose.agent.yml apps/status/Pak nahrajte apps/status/ (bez složky tests/) jako status/ a apps/monitor/dist/ (i s jeho .htaccess) jako app/. Agenti patří vedle agent_api.php: odtud se stahují a odtud se i sami aktualizují.
Založte prázdnou databázi
Založte databázi MySQL nebo MariaDB a uživatele se všemi právy k ní (v cPanelu: MySQL Databases) a poznamenejte si název, uživatele a heslo. Nechte ji prázdnou: tabulky založí instalátor. Jen když chcete všechno udělat ručně, naimportujte status/schema.sql sami:
mysql -u YOUR_DB_USER -p YOUR_DB_NAME < schema.sqlSpusťte instalátor
Otevřete https://YOUR-DOMAIN/app/setup. Zkontroluje PHP, vyzkouší přihlášení k databázi, zapíše status/config.php (nebo soubor ukáže k nahrání, když do složky PHP zapisovat nesmí), založí tabulky a pak prvního správce. Žádný výchozí účet ani heslo neexistuje a jakmile účet je, instalátor se znovu nespustí. Do té doby ho může spustit kdokoli, kdo adresu najde, proto databázi založte ještě před nahráním a instalátor spusťte hned po něm. Ručně místo toho: ve složce status/ zkopírujte config.sample.php na config.php a vyplňte připojení:
define('DB_HOST', 'localhost'); define('DB_PORT', 3306); define('DB_NAME', 'YOUR_DB_NAME'); define('DB_USER', 'YOUR_DB_USER'); define('DB_PASS', 'YOUR_DB_PASSWORD');Volitelné klíče patří do stejného souboru jako konstanty velkými písmeny, nebo později do aplikace v Nastavení: CRON_KEY, AGENT_REGISTRATION_TOKEN a METRICS_TOKEN. Instalátor dá každé nové instalaci vlastní CRON_KEY. Při ruční cestě zůstane prázdný, dokud ho nenastavíte, a dokud je prázdný, spustí sběr dat kdokoli, kdo zná adresu cron.php.
config.php obsahuje heslo k databázi. V ZIPu není a nahrání nového vydání ho nepřepíše.
Spouštějte sběr dat každou minutu
Všechny kontroly spouští jeden cron. Poslední krok instalátoru ukáže tenhle řádek se skutečnou cestou k PHP a k cron.php na vašem serveru. V cPanelu otevřete Cron Jobs, zvolte Once Per Minute (* * * * *) a příkaz vložte do pole Command. USER je váš účet na hostingu; domovskou složku ukazuje cPanel na hlavní stránce.
php -q /home/USER/public_html/status/cron.php >/dev/null 2>&1Bez cPanelu je to stejná úloha jako řádek pro crontab -e:
* * * * * php -q /home/USER/public_html/status/cron.php >/dev/null 2>&1Přihlaste se
Přihlaste se na https://YOUR-DOMAIN/app/ účtem, který založil instalátor. Po ruční cestě ten první účet místo toho založí /app/setup.
Ověřte, že běží
Instalátor na první běh sběru dat počká a po něm zezelená, do minuty od přidání cronu. Později, nebo po ruční cestě, to ověříte takhle (adresa se dá otevřít i v prohlížeči):
curl -s "https://YOUR-DOMAIN/status/api.php?action=collection_health"Hledejte čas v lastRunAt a "stale": false. "stale": true s lastRunAt null znamená, že sběr ještě nikdy neběžel: zkontrolujte řádek cronu a cestu v něm.
Dál: v aplikaci přidejte monitory a na stroje a routery, do kterých chcete vidět, agenty. Instalace agenta →
Pak: první monitor
V aplikaci otevřete Infrastruktura → Přidat nový monitor. Hlídat můžete weby (HTTP/HTTPS), TCP porty, servery Minecraft, TeamSpeak a Discord, servery a routery OpenWrt s agentem, nebo heartbeaty úloh, které se hlásí samy. Starší PHP administrace (admin.php) je převážně česky; přehled na /app mluví česky i anglicky.
Systémové požadavky
Centrální server je čisté PHP a běží na běžném sdíleném webhostingu, VPS stačí také. Co musí hosting nabízet, je první krok Rychlého startu.
Centrální Server:
- Místo na disku: aplikace a databáze MySQL/MariaDB, která roste s historií kontrol
- Software: PHP 8.2+ (CI běží na 8.4), Apache s
.htaccessamod_rewritea MySQL nebo MariaDB. Server běží bez Dockeru; možnost Dockeru má jen Python agent.
Vzdálený Agent:
- OS: Linux (libovolná distribuce s Bashem, nebo s Pythonem 3), Windows 10/11/Server, OpenWrt/Turris OS, Raspberry Pi OS
- Síť: odchozí HTTPS (port 443) k centrálnímu serveru; nic příchozího
Architektura systému
Blood Kings Monitoring spojuje aktivní kontroly, které spouští server, a hlášení, která mu posílají agenti.
Pasivní monitoring (Agenti): Agenta na hlídaném stroji spouští cron (nebo Plánovač úloh): na OpenWrt každou minutu, jinde standardně každých 5 minut. Každý běh přečte lokální data (CPU, RAM, disky, síť) a zasílají je pomocí HTTPS POST požadavků na centrální server. Tento přístup nevyžaduje otevírání žádných příchozích portů na monitorovaných serverech.
Aktivní monitoring (Pinger): Cron centrálního serveru kontroluje cíle přímo: požadavky HTTP/HTTPS (s volitelným klíčovým slovem a expirací certifikátu) a TCP spojení. ICMP ping ani kontroly UDP neumí; „ping“ je TCP spojení.
Konfigurace Databáze Serveru
Server se k MySQL nebo MariaDB připojuje přes PDO. Připojení zapíše do status/config.php instalátor na /app/setup (4. krok Rychlého startu, kde je i ruční cesta). Ostatní konstanty vysvětluje config.sample.php; nejčastěji se mění časové pásmo, které pak sdílí PHP i databázové spojení:
define('TIMEZONE', 'Europe/Prague');Klíče a tokeny
Tři volitelné klíče. Každý se čte jako konstanta v config.php (velkými písmeny), pak jako proměnná prostředí a pak z Nastavení aplikace; platí první nalezený.
CRON_KEY: klíč, kterýcron.phpchce při volání přes HTTP (?key=...). Dokud je prázdný, spustí sběr dat kdokoli, kdo zná adresu; cron z příkazové řádky klíč nepotřebuje. Instalátor dá každé nové instalaci vlastní.AGENT_REGISTRATION_TOKEN: dovolí agentům pro Bash a OpenWrt, aby se zaregistrovali sami (--register). Dokud je prázdný, server místo něj přijmeCRON_KEY.METRICS_TOKEN: bearer token pro endpoint Prometheametrics.php. Dokud je prázdný, endpoint je vypnutý.
define('CRON_KEY', 'dlouhy-nahodny-retezec');Veřejné Status Stránky
Status stránky založíte v aplikaci v části Status Stránky: každá má vlastní název, adresu (/app/public?page=…) a výběr monitorů a dá se před veřejností skrýt. Návštěvníci se tam mohou přihlásit k e-mailům o incidentech. SVG odznak veřejného stavu nebo jednoho monitoru (api.php?action=badge&monitor_id=…) lze vložit kamkoli.
Heartbeat monitory
Aktivní kontrola umí jen to, na co dosáhne ze sítě. Záloha, která se spustí ve tři ráno a tiše selže, je pro ni neviditelná - není co pingnout. Heartbeat obrací směr: úloha se hlásí sama a monitor spadne ve chvíli, kdy se neozve.
Založte monitor typu Heartbeat, nastavte, jak často se má úloha ozvat, a na její konec přidejte adresu, kterou dostanete:
curl -fsS -m 10 "https://vas-server/status/heartbeat.php?token=VAS_TOKEN"Když úloha selže, ať to řekne rovnou - monitor pak spadne hned, ne až po vypršení intervalu:
curl -fsS -m 10 "https://vas-server/status/heartbeat.php?token=VAS_TOKEN&status=fail&msg=tar%20skoncil%20kodem%202"Monitor, který ještě nikdy nedostal signál, hlásí neznámý stav, ne výpadek. Nic neselhalo - jen o něm zatím nic nevíme, a upozornění na výpadek, který se nestal, je svého druhu lež.
Token je jediné, co endpoint autorizuje. Nepouštějte ho do sdílených logů: kdo ho má, může se hlásit za vás a monitor bude svítit zeleně, i když záloha dávno neběží.
Hlídač: kdo hlídá sběr dat
Všechno sbírá jediná cron úloha. Když umře, aplikace se nerozbije - dál zobrazuje poslední známé stavy a vypadá naprosto zdravě. Ze všech způsobů, jak může monitoring selhat, je tenhle nejhorší, protože o sobě nedá vědět.
Server proto zaznamenává každý dokončený běh a vystavuje ho:
curl -s "https://vas-server/status/api.php?action=collection_health"Odpověď má stale: true, jakmile je poslední běh starší než nastavený limit - a také tehdy, když cron neběžel ještě ani jednou, protože „žádná data" není totéž co „vše v pořádku".
Ten endpoint kontroluje Cloudflare Worker každých pět minut. Běží mimo hlídaný server záměrně: hlídač na stejném stroji umře spolu s tím, co hlídá.
Worker v release ZIPu není: leží v apps/worker v repozitáři a nasadíte ho do vlastního účtu Cloudflare. Bez cíle hlídá bloodkings.eu, server autora, takže mu nejdřív dejte ten svůj:
cd apps/worker && npx wrangler deploy
npx wrangler secret put WATCHDOG_TARGET_URL # https://vas-server/status/api.php?action=collection_healthStačí mu jednou nastavit Discord webhook a ozve se sám:
cd apps/worker && npx wrangler secret put WATCHDOG_DISCORD_WEBHOOKBez toho hlídač kontroluje dál, ale umí jen logovat - a přizná to na /api/watchdog, místo aby jen budil dojem, že něco hlídá.
Instalace a Registrace Agenta
Agenti jsou samostatné skripty pro Bash, Python, PowerShell a routery s OpenWrt. Postup pro každou platformu je na stránce ke stažení: tytéž kroky, které aplikace vypíše při přidání monitoru, tam s vaší adresou a klíčem.
Pro víc strojů se agenti pro Bash a OpenWrt umí zaregistrovat sami registračním tokenem (viz Klíče a tokeny). Oba argumenty jsou poziční a druhý je agent_api.php vašeho serveru:
/opt/bk-agent/agent.sh --register YOUR_REGISTRATION_TOKEN https://YOUR-DOMAIN/status/agent_api.phpBez adresy se agent registruje proti výchozímu localhost. Klíč, který dostane, uloží do agent.cfg vedle skriptu (na routeru do agent_openwrt.cfg). Agenti pro Python a PowerShell registrační příkaz nemají: API_URL a AGENT_KEY z nastavení monitoru berou z agent.cfg. Víc o registraci.
Intervaly Agenta a Vzdálené Akce
Agenty spouští cron: na serverech každých 5 minut, na OpenWrt routerech každou minutu. Na OpenWrt routerech lze zapnout opt-in HMAC podepsané Vzdálené akce nastavením REMOTE_ACTIONS_ENABLED=1 v agent_openwrt.cfg vedle skriptu.
Řešení Problémů s Agenty
Pokud agent přestane hlásit data, zkontrolujte odchozí přístup na port 443, pak ho spusťte ručně a přečtěte jeho log (leží vedle skriptu):
/opt/bk-agent/agent.sh --verbose
tail -n 50 /opt/bk-agent/agent.logStejné kontroly pro OpenWrt, Windows a Docker jsou na stránce ke stažení.