Svaki tim koji upravlja produkcijskom infrastrukturom prije ili kasnije dođe do istog pitanja: kako da saznamo da nešto ne radi prije nego što nam to jave korisnici? Hostovani servisi za praćenje dostupnosti kao što su Pingdom, UptimeRobot i Better Stack rješavaju taj problem – ali uz cijenu, vezanost za jednog provajdera (vendor lock-in) i sve kompromise koje nosi prepuštanje nadzora vaše infrastrukture trećoj strani. U CodeWizu smo naišli na ograničenja svih postojećih self-hosted opcija i odlučili da napravimo vlastito rješenje. Danas ga objavljujemo kao open-source: Uptime, self-hosted uptime monitor pod MIT licencom, napisan u Node.js-u i pokrenut kao jedan proces.
Projekat je dostupan na GitHubu na adresi github.com/codewizdevs/uptime, a kompletna prezentacijska stranica (snimci ekrana, pregled funkcionalnosti, uputstvo za instalaciju) nalazi se na codewizdevs.github.io/uptime.
Zašto još jedan uptime monitor?
Na polju self-hosted praćenja dostupnosti već postoje jaki igrači. Uptime Kuma je očigledna referenca – odlično dizajniran, s ogromnim brojem funkcionalnosti i velikom zajednicom. Healthchecks.io je zlatni standard za pasivno praćenje cron poslova. Gatus nudi konfiguraciju kao kod (config-as-code) u Go-u. Statping-ng donosi doteranu statusnu stranicu. Svaki od njih je odličan u onome na šta je fokusiran, ali svaki je napravio kompromise koje nismo bili spremni prihvatiti na produkcijskim VPS serverima.
Konkretno, stalno smo nailazili na četiri problema:
Smetnje koje izaziva Cloudflare. Većina monitora Cloudflare JS challenge tumači kao potpuni pad sajta. Šalju upozorenje, bilježe incident i obaraju vaš procenat dostupnosti – iako je sajt potpuno ispravan, a provjeru filtrira samo Cloudflareova zaštita od botova.
Nema prave podrške za timove. Ili imate jednu zajedničku administratorsku lozinku (i svi vide sve), ili morate platiti SaaS pretplatu. Nije postojalo čisto rješenje između za situacije tipa „neka naš junior programer vidi samo ova tri monitora“.
Zahtjevna instalacija. Nekoliko zrelih rješenja podrazumijeva Docker, Kubernetes ili compose stack s više containera. Mi smo željeli nešto što radi na VPS-u od $5, kao jedan proces i bez stalnog nadgledanja.
Nema pravog audit loga. Kada upravljate tuđom infrastrukturom, pitanje „ko je pauzirao ovaj monitor u 3 ujutro?“ je nešto što će vas klijent sigurno pitati. Većina self-hosted monitora na to ne može odgovoriti.
Uptime je napravljen upravo da zatvori te praznine, a da pritom ostane mali, brz i jednostavan za održavanje.
Provjere svjesne Cloudflarea: funkcionalnost koju niko drugi ne nudi
Na ovu funkcionalnost smo najponosniji i, koliko nam je poznato, to je jedina razlika koju nijedan drugi open-source uptime monitor nema odmah po instalaciji. Sloj za provjere prepoznaje Cloudflare challenge na osnovu tri signala – HTTP statusa, zaglavlja odgovora cf-mitigated i poznatih markera u tijelu odgovora – i bilježi ih kao neodređene (inconclusive), a ne kao DOWN. To znači da talas zaštite od botova u ponoć neće oboriti vaš procenat dostupnosti, neće otvoriti incident i neće poslati lažno upozorenje dežurnom timu.
Uz to, prober rotira realne user-agent stringove preglednika (pa uopšte ne izgleda kao bot), automatski dekompresuje Brotli, gzip i deflate odgovore (pa provjere teksta u tijelu i JSON-path provjere zaista vide dekodirano tijelo) i nudi opcionalni „Cloudflare mode“ po monitoru, koji prelazi na provjere s HEAD zahtjevom kao prvim izborom, podiže minimalni interval na 60 sekundi i primjenjuje adaptivni eksponencijalni back-off nakon uzastopnih challengea. Nakon pet challengea zaredom jednom se šalje jedno obavještenje „being challenged“ – a ne pet ponovljenih upozorenja.
Ako ispred svog origin servera koristite Cloudflare (a većina timova ga koristi), samo zbog ovoga se isplati preći.
Šest tipova monitora u jednom alatu
Uptime podržava cijeli spektar tipova provjera koje očekujete od zrelog alata za monitoring, a sve se podešava iz jedne forme za monitor:
HTTP / HTTPS – s provjerama statusnog koda, teksta u tijelu odgovora, JSON putanje, regexa i praga vremena odziva. Prilagođena zaglavlja, Basic auth, Bearer tokeni, praćenje preusmjeravanja, opcionalno preskakanje TLS verifikacije i tijelo zahtjeva po monitoru (POST/PUT/PATCH/DELETE).
TCP – direktno socket povezivanje na host:port uz opcionalnu provjeru dijela teksta u banneru.
ICMP ping – poziva sistemski ping program, prikazuje prosječni RTT, a djelimičan gubitak paketa tretira kao grešku.
DNS zapisi – A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, SOA, PTR. Opcionalni prilagođeni resolver i poređenje očekivane vrijednosti po dijelu teksta ili po /regex/ izrazu.
TLS certifikat – poseban tip provjere koji izvršava samo TLS handshake (bez HTTP-a). Radi za SMTPS, IMAPS i druge servise koji nisu na portu 443. Prati broj preostalih dana i šalje cert_expiring upozorenje kada se dostigne prag podešen po monitoru (podrazumijevano 14 dana).
Pasivni heartbeati – po uzoru na Healthchecks.io. Svaki monitor izlaže endpointe /ping/<token>, /start, /0 i /<non-zero>. Tijela do 4 KB se čuvaju, izlazni kodovi i trajanje računaju se na osnovu parova start/success, a raspored može biti interval s periodom tolerancije ili puni cron izraz u izabranoj vremenskoj zoni.
Deset kanala za obavještenja, potpuno prilagodljivih
Upozorenja se mogu slati na bilo koju kombinaciju kanala: Discord, Slack, Telegram, Ntfy.sh, Gotify, Pushover, Mattermost, Microsoft Teams, SMTP email i generički webhookovi. Svaki kanal se podešava zasebno, ima dugme „Send test“ na stranici za uređivanje i može se povezati s neograničenim brojem monitora.
Svaki tip događaja (DOWN, RECOVERED, CHALLENGED, CERT_EXPIRING, TEST) ima vlastiti šablon za naslov i tekst s placeholderima kao što su {{site_name}}, {{site_url}}, {{error}}, {{status_code}}, {{duration_human}} i {{cert_days_remaining}}. Jednim klikom ubacujete placeholder na poziciju kursora, a jednim klikom vraćate šablon na podrazumijevani. Globalni prekidač APP_DEBUG=true prebacuje sve kanale u dry-run režim – sadržaj koji bi bio poslan upisuje se u log fajl umjesto da se pošalje, što je idealno za doterivanje šablona bez zatrpavanja Discorda porukama.
Više korisnika uz ACL dozvole po monitoru
Model uloga je namjerno jednostavan i lako razumljiv: admin, editor, viewer. Povrh toga, svaki monitor može pojedinačnim korisnicima dodijeliti dozvolu view ili manage. Ta kombinacija pokriva većinu stvarnih operativnih scenarija – „ovaj klijent treba vidjeti samo svoje monitore“, „ovaj junior inženjer može pauzirati i nastaviti, ali ne i brisati“, „ovaj saradnik s pravom samo čitanja dobija link do statusa“ – bez eksplozije uloga koja muči enterprise RBAC sisteme.
Postojeći super-admin definisan u .env fajlu zadržan je kao trajni nalog za hitne slučajeve (break-glass), s vlastitim nezavisnim TOTP ključem. Korisnici iz baze podataka dobijaju svoje. Lozinke se hashiraju pomoću argon2id algoritma, prijava ima rate limiting i zaključava se nakon ponovljenih neuspjelih pokušaja, a svaka radnja koja mijenja stanje bilježi se u audit log s podacima o izvršiocu, IP adresi, cilju i strukturiranim JSON metapodacima. Korisnici koji nisu administratori automatski vide samo svoje zapise u audit logu, a administratori vide sve.
Javna statusna stranica, REST API i Prometheus exporter
Javna statusna stranica /status samo za čitanje (uz opcionalnu zaštitu tokenom) dostupna je odmah po instalaciji, s trakom dnevne dostupnosti za posljednjih 90 dana za svaki monitor, poredanim imenovanim grupama, prilagođenim nazivima monitora za prikaz, MTTR-om za posljednja 24 sata i pratećim Atom feedom /status.rss.
REST API na /api/v1/* koristi bearer tokene s opsezima read / write, a što je ključno – svaki odgovor se automatski filtrira kroz ACL vlasnika tokena. Token korisnika s ulogom viewer vidi samo ono što vidi i taj korisnik. Prometheus exporter na /metrics poštuje isti ACL, pa token s niskim privilegijama možete dati zajedničkoj Grafani bez otkrivanja cijelog sistema za monitoring. Serije uključuju uptime_monitor_up, uptime_monitor_response_time_ms, uptime_monitor_last_check_age_seconds, uptime_monitor_uptime_pct_24h, uptime_cert_days_remaining i uptime_open_incidents.
Kako se Uptime poredi s drugima
Ovo poređenje smo uradili pošteno. Svaki red u tabeli ispod može se provjeriti u javnoj dokumentaciji navedenog alata, zaključno s majem 2026:
Uptime (ovaj)
Uptime Kuma
Healthchecks.io
Gatus
Statping-ng
Better Stack
Licenca
MIT
MIT
BSD-3
Apache-2
Apache-2
Vlasnička
Self-hosted
Da
Da
Da
Da
Da
Ne (SaaS)
Radi bez Dockera
✓ Da (1 proces)
Da
Da (venv)
Da
Da
—
HTTP / TCP / Ping / DNS / Cert
✓ Svih pet
Većina
Samo pasivno
Većina
HTTP + TCP
Svih pet
Heartbeati s cronom i čuvanjem tijela
✓ Da
Osnovno
Najbolji u klasi
Ne
Ne
Da
Provjere svjesne Cloudflarea
✓ Da
Ne
Ne
Ne
Ne
—
Kanali za obavještenja
10
90+
30+
Preko shoutrrr
13
20+
Javna statusna stranica + RSS
✓ Da
Da
Ne
Da
Da
Da
Više korisnika uz ACL po monitoru
✓ Da
Uskoro
Samo timovi
Ne
Ograničeno
Da
REST API + Prometheus exporter
✓ Oboje (filtrirano po ACL-u)
Ograničeno
Samo API
Samo čitanje
Samo API
Samo API
Audit log po izvršiocu
✓ Da
Ne
Ne
Ne
Ne
Da
Rate limit i zaključavanje prijave
✓ Da
Ne
Da
Ne
Ne
Da
Zauzeće resursa
~150 MB · 1 proces
~100 MB
~200 MB
~30 MB
~80 MB
—
Iskren zaključak: Uptime Kuma ima više kanala za obavještenja i veću zajednicu; ako vam treba 90 manje poznatih integracija za dojave, koristite nju. Healthchecks.io je pravi izbor ako se cijelo vaše opterećenje svodi na praćenje cron poslova. Better Stack je ono što kupujete ako vam je draže da platite nego da sami hostujete. Uptime popunjava prazninu kada želite alat koji radi kao jedan proces, ima MIT licencu, podržava više korisnika od prvog dana, prepoznaje Cloudflare i koji možete klonirati na mali VPS i pokrenuti za manje od tri minute.
Tehnološki stack
Uptime je „ispod haube“ namjerno dosadan. Radi na Node.js 20+ uz Express 4 i EJS šablone – bez SPA frameworka, bez build koraka, bez bundlera. HTTP prober koristi undici sa zajedničkim keep-alive agentom radi boljih performansi. Podaci se podrazumijevano čuvaju u SQLite bazi preko better-sqlite3, ili u MySQL-u preko mysql2/promise ako promijenite jednu varijablu okruženja. Sesije koriste express-session, email ide preko nodemailer, grafikoni su Chart.js učitan s CDN-a, a tema je Tabler CSS s čistim JavaScriptom (bez Bootstrap bundlea).
Cijela stvar je jedan proces, jedan log fajl i jedna opcionalna PM2 ecosystem konfiguracija. U repozitoriju postoje Dockerfile i docker-compose.yml za timove koji više vole containere, ali nijedno od toga nije obavezno. Pokrenuli smo ga na VPS-u od $5 iza nginxa, s Cloudflareom ispred, i pratili kako nadzire 150 endpointa uz ~50 MB rezidentne memorije.
Brzi početak za tri minute
git clone https://github.com/codewizdevs/uptime.git
cd uptime
npm install
cp .env.example .env
# edit .env — at minimum set SESSION_SECRET, ADMIN_USER, ADMIN_PASS
npm start
Otvorite http://localhost:3000 i prijavite se. Šema baze se automatski primjenjuje pri prvom pokretanju – bez ručne migracije i bez čarobnjaka za podešavanje. Za produkciju zamijenite npm start sa pm2 start src/server.js --name uptime && pm2 save i ispred postavite nginx (ili Caddy, ili Cloudflare Tunnel). README sadrži primjer nginx vhost konfiguracije koji možete direktno kopirati.
Open-source, MIT licenca, doprinosi su dobrodošli
Uptime dolazi s istom MIT licencom koju koristimo u svim našim open-source projektima. Forkujte ga, mijenjajte, dalje distribuirajte, ugradite ga u proizvod zatvorenog koda ili u SaaS – jedini uslov je da zadržite napomenu o autorskim pravima. Kompletan izvorni kod, snimci ekrana, tabela poređenja i dokumentacija arhitekture nalaze se na:
Detaljan plan razvoja: fajl PLAN.md u repozitoriju prati završene i odgođene faze
Izgrađeno na vrijednostima CodeWiza
Uptime je najnoviji u CodeWizovoj seriji open-source alata za operativni rad, uz projekte kao što je Cloudflare Tunnel Manager. Kao full-stack agencija za razvoj softvera iz Banje Luke, u Bosni i Hercegovini, pravimo alate koje bismo i sami željeli koristiti i objavljujemo ih kada su dovoljno stabilni da budu korisni i drugima. Praktično, dobro dokumentovano, lagano i jednostavno za deployment – to je naš standard.
Treba vam pomoć oko deploymenta ili prilagođene integracije?
Većina timova može sama postaviti Uptime za manje od sat vremena. Ako biste radije da to neko uradi umjesto vas – instalacija na vaš VPS, integracija s vašim postojećim kanalima, konfiguracija iza nginxa ili Cloudflare Tunnela, uvoz monitora iz postojećeg alata ili proširenje prilagođenim kanalom za obavještenja ili integracijom jedinstvene prijave (SSO) – nudimo to kao plaćenu uslugu. Javite nam se na hello@codewizdev.com ili putem kontakt stranice CodeWiza i zajedno ćemo definisati obim posla.
Ako napravite nešto na osnovu Uptimea ili vam treba funkcionalnost koju još nismo objavili, otvorite issue na GitHubu – čitamo svaki.
Spremni da počnemo?
Razgovarajmo o zahtjevima vašeg projekta i pronađimo idealno rješenje za vaše poslovanje.