Services

infra / running

Nginx Proxy Manager

The reverse proxy in front of every internal service — turns IP-and-port into a real hostname with TLS.

What it is

Nginx Proxy Manager is a friendly web UI sitting on top of nginx. You point it at upstreams, give them hostnames, attach SSL certificates, and it generates and reloads the nginx config for you. It's the kind of tool that becomes invisible once it's working — which is the highest compliment I can pay infrastructure software.

Why I run it

The catalog you're reading has 33 public service entries. Without a reverse proxy, each one is "remember which port runs on which IP," and adding HTTPS means hand-editing nginx config and managing certificates per host. NPM collapses both problems: one entry per service, dropdown menu for the certificate, websockets toggle, done.

I picked NPM over raw nginx specifically because the GUI keeps me honest. When I see a list of every proxied service in one screen, I notice the ones that have grown stale. A YAML file in a repo hides that.

How I use it

Every internal hostname in this homelab flows through NPM:

  1. AdGuard Home holds a single wildcard DNS rewrite that points every *.lab name at NPM.
  2. The browser sends the request to NPM with the hostname in the Host header.
  3. NPM matches the header against its proxy host list and forwards to the right upstream.

Adding a new service to the catalog is now a single NPM entry — no new DNS record per name, no nginx file. The wildcard does the resolution; NPM does the routing.

The site you're on (jhinx.dev) is the recent change here. In May 2026, I moved new service hostnames toward Let's Encrypt-backed *.jhinx.dev certs instead of self-signed *.lab certs that had to be trusted on every device. The *.lab setup is still alive in NPM as a compatibility path, but new services go straight to the real domain.

Setup notes

Runbook