Self-hosted uptime monitoring
A full-stack monitoring app you can run with one
docker compose up
Built on rock-solid open source
Everything a small team needs — nothing you'll never use.
No 30-day trial. No 50-monitor cap. No per-seat add-ons. Just monitoring that works on your hardware.
HTTP & ICMP checks
Schedule from 30 seconds to 1 hour per monitor. Configurable consecutive-failure threshold so flaky single hits don't page you.
Multi-region probes
Deploy a ~10 MB Go binary anywhere — via Tailscale, Cloudflare Tunnel, or your own VPN. Cross-probe quorum eliminates false positives.
Multi-channel alerts
Email and Pushover today, on every down and recovery. Each user picks their own channels; each monitor picks a subset.
Status pages, your way
Public, unlisted, or private. Custom domains with auto-HTTPS via Caddy on-demand TLS. Themes, custom CSS, logo upload, incidents and scheduled maintenance.
Time-series at scale
TimescaleDB hypertables store every check result efficiently. Keep years of history without your Postgres breaking a sweat.
Teams & projects
Group monitors into projects, share with collaborators, control access with role-based permissions. Per-user notification preferences, no shared inboxes.
Three steps. No yak-shaving.
Clone & run setup.sh
Interactive installer detects your environment, configures DNS, generates secrets, and starts every container.
$ git clone https://github.com/easymonitordev/easymonitor.git $ cd easymonitor $ ./setup.sh
Add a monitor
Drop in a URL, pick an interval, choose alert channels. Group monitors by project so a marketing site doesn't page the API team.
Deploy a remote probe
Run the probe binary in any region. Tunnel back to Redis over Tailscale or Cloudflare — never expose Redis to the internet.
$ docker run -d \
-e PROBE_NODE_ID=eu-west-1 \
-e PROBE_REDIS_URL=redis://... \
-e PROBE_TOKEN=$TOKEN \
easymonitor/probe-node:latest
Boring tech, glued together right.
A Laravel app schedules checks onto Redis Streams. Lightweight Go probes claim them, run HTTP/ICMP requests, and publish results back. A consumer writes to TimescaleDB and triggers alerts. Predictable, observable, and easy to scale by adding more probes.
- Per-node consumer groups — cross-probe quorum decides up/down, not a single flaky probe.
- Caddy on-demand TLS — customers point their domain, you don't touch DNS.
- Laravel Horizon — queue dashboard so you actually know what's happening in prod.
SaaS monitoring is great — until it isn't.
When your monitoring vendor has an outage, your blind spots are exactly the moments you needed it. Self-hosting puts the watcher under your control.
| EasyMonitor | Typical SaaS | |
|---|---|---|
| Monitors | Unlimited | Tier-capped |
| Where data lives | Your server | Their server |
| Custom-domain status pages | Included | Premium tier |
| Probe regions | Any host you own | Vendor's list |
| Source code | MIT, on GitHub | Closed |
The boring-tech stack you already know.
If you've shipped a Laravel app before, you can debug, extend, and operate EasyMonitor. No bespoke runtime, no exotic database, no surprise.
Questions developers ask first.
What hardware do I need?
How do I add probes in other regions?
easymonitor/probe-node on any host. The probe needs to reach Redis on your main server — the installer can wire up Tailscale automatically, or you can use Cloudflare Tunnel, WireGuard, or your own VPN. Don't expose Redis to the public internet.
Which alert channels are supported?
Can customers point their own domain at status pages?
Is it really MIT licensed?
How do I contribute?
php artisan test, open a PR. CI runs Pint and the test suite on every push. See CONTRIBUTING.md.
Ready in less time than it takes to compare SaaS plans.
Clone the repo, run the installer, and watch your dashboard light up in a few minutes.