When Your Monitoring Tool Needs Monitoring
We used to run Netdata for system monitoring. It was great — detailed metrics, real-time graphs, low overhead. Then Netdata v2 happened.
The v2 release pushed hard toward their cloud platform. The local dashboard still worked, but it assumed it was the only thing running on the server. It wanted its own port, its own URL, its own everything. And critically, it used absolute asset paths — every JavaScript and CSS reference started with /.
That last detail killed it for us.
The sub-path proxy problem
Our monitoring dashboard lives at a sub-path: beej.cloud/admin/monitor/. This isn’t a separate subdomain — it’s a path within the admin panel, reverse-proxied through nginx to the monitoring container.
When a web application uses absolute paths (/static/app.js), the browser requests that path from the root of the domain — beej.cloud/static/app.js — not from the sub-path. The monitoring container never sees the request because nginx routes it elsewhere. The dashboard loads as a blank page with a cascade of 404 errors in the console.
Applications that use relative paths (static/app.js or ./static/app.js) work fine behind sub-path proxies because the browser resolves them relative to the current URL.
Enter Glances
Glances is a Python-based system monitor that happens to use relative paths for all its assets. It also has a web mode (-w flag) that serves a simple dashboard. No cloud dependencies, no phone-home, no premium tier.
The configuration is a single environment variable that specifies which plugins to enable:
GLANCES_OPT=-w --disable-plugin all --enable-plugin cpu,mem,memswap,load,diskio,fs,network,docker,alert,system,uptime
Start with everything disabled, enable what you actually watch. The result is a clean dashboard that loads instantly and shows exactly what matters.
The nginx config
The key is the ^~ location modifier:
location ^~ /admin/monitor/ {
proxy_pass http://glances:61208/;
}
The ^~ tells nginx “if this prefix matches, stop looking at other location blocks.” Without it, regex location blocks (like one that caches .js files) can intercept requests meant for the monitoring proxy. This is a recurring nginx gotcha — prefix locations and regex locations interact in non-obvious ways.
The lesson
When choosing self-hosted tools, check how they handle asset paths. It’s not in any feature comparison matrix, but it determines whether the tool can live behind a reverse proxy at a sub-path — which is how most self-hosted dashboards are actually deployed.
Relative paths: works anywhere. Absolute paths: works only at the root. It’s a one-line difference in the application code and a dealbreaker in production.
Uptime Kuma: the exception
Not every tool can be fixed. Uptime Kuma is a Vue.js SPA that hardcodes absolute paths throughout. It got its own subdomain because there was no other option. Sometimes the right answer is “give it a subdomain and move on.”