<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Reverse-Proxy on rHomelab</title><link>https://rhomelab.com/tags/reverse-proxy/</link><description>Recent content in Reverse-Proxy on rHomelab</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rhomelab.com/tags/reverse-proxy/index.xml" rel="self" type="application/rss+xml"/><item><title>Nginx Proxy Manager vs. Traefik vs. Caddy: Picking a Reverse Proxy for Your Homelab</title><link>https://rhomelab.com/self-hosted/reverse-proxy-showdown/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://rhomelab.com/self-hosted/reverse-proxy-showdown/</guid><description>A practical comparison of the three most common homelab reverse proxies - what each one actually costs you in setup time, ongoing maintenance, and flexibility once you&amp;#39;re running a dozen services.</description><content:encoded><![CDATA[<p>Every self-hosted setup eventually hits the same wall: you&rsquo;ve got four, six, ten services running on different ports, and typing <code>http://10.0.0.50:8096</code> from memory has stopped being funny. A reverse proxy fixes that - one entry point, real hostnames, automatic TLS certificates, and a single place to manage access instead of juggling port numbers. The question isn&rsquo;t whether you need one. It&rsquo;s which one.</p>
<p>There are more options than these three, but Nginx Proxy Manager, Traefik, and Caddy cover the vast majority of homelab setups for good reason - they&rsquo;re mature, well documented, and each represents a genuinely different philosophy about how a reverse proxy should work. Picking the wrong one isn&rsquo;t fatal, but re-migrating a dozen services to a different proxy after the fact is a weekend you don&rsquo;t get back.</p>
<h2 id="the-three-philosophies">The three philosophies</h2>
<p><strong>Nginx Proxy Manager (NPM)</strong> is nginx with a web UI bolted on top. You add a proxy host through a browser form, pick a domain, toggle Let&rsquo;s Encrypt, save. It&rsquo;s the easiest one to understand because you never have to look at a config file unless you want to.</p>
<p><strong>Traefik</strong> is built around automatic service discovery. Point it at Docker (or Kubernetes, or a handful of other backends) and it watches for containers with the right labels, then wires up routing and certificates on its own, with zero manual proxy-host creation. The tradeoff is that the &ldquo;labels in your compose file&rdquo; model has a real learning curve before it clicks.</p>
<p><strong>Caddy</strong> sits in between. It&rsquo;s config-file-driven like Traefik, but the config format (Caddyfile) is deliberately simple, and it does automatic HTTPS by default, no separate cert-manager container, no ACME plugin to configure - it just works the moment you give it a domain.</p>
<p>None of these are wrong choices. They&rsquo;re optimized for different things, and the right one depends on how you actually run your homelab.</p>
<h2 id="nginx-proxy-manager-the-one-you-dont-have-to-think-about">Nginx Proxy Manager: the one you don&rsquo;t have to think about</h2>
<p>NPM&rsquo;s entire pitch is accessibility. You get a web UI, a login screen, and a list of proxy hosts you manage by clicking &ldquo;Add Proxy Host,&rdquo; filling in a domain and a target IP:port, and hitting save. Let&rsquo;s Encrypt integration is a checkbox. Basic auth, access lists, and custom nginx config snippets are all available through the UI if you need them, but you&rsquo;re never required to touch a terminal after initial setup.</p>
<p><strong>What it costs you:</strong> every new service is a manual step. Ten services means ten proxy hosts you created by hand, and if you rebuild a service with a new port, you&rsquo;re back in the UI updating it. That&rsquo;s fine at homelab scale (a dozen services, one person managing it), but it stops scaling gracefully somewhere past that, and it&rsquo;s genuinely annoying if you spin services up and down often for testing.</p>
<p><strong>What it&rsquo;s good at:</strong> nothing to memorize, a real UI for viewing certificate status and access lists at a glance, and it&rsquo;s forgiving of mistakes - you can see exactly what&rsquo;s configured without parsing a file. If you&rsquo;re new to reverse proxies generally, this is the lowest-friction way to get one running and understand what a reverse proxy is actually doing before you move to something more automated.</p>
<p><strong>Resource footprint:</strong> light. It&rsquo;s a single Docker container (nginx plus a small Node.js management app and a SQLite database), comfortable on an LXC with a fraction of a CPU core and a few hundred MB of RAM.</p>
<h2 id="traefik-the-one-that-watches-docker-for-you">Traefik: the one that watches Docker for you</h2>
<p>Traefik&rsquo;s core idea is that your reverse proxy configuration shouldn&rsquo;t live somewhere separate from the services it&rsquo;s routing to - it should live <em>in</em> the service definition. Add labels to a container in your <code>docker-compose.yaml</code> (hostname, port, TLS settings), and the moment that container starts, Traefik sees it and wires up routing automatically. Tear the container down, the route disappears. No separate proxy-host step, ever.</p>
<p>This is the right model if you&rsquo;re already managing services through Docker Compose and redeploying or rebuilding things reasonably often - the config-in-the-compose-file pattern means your routing lives in version control alongside the service itself, not in a separate system you have to remember to update.</p>
<p><strong>What it costs you:</strong> the learning curve is real. Understanding entrypoints, routers, middlewares, and how they compose together takes longer than NPM&rsquo;s point-and-click model, and the documentation, while thorough, assumes you already understand reverse proxy concepts. Debugging a misconfigured label set means reading Traefik&rsquo;s dashboard and logs, not clicking through a UI form. Budget a genuine weekend to get comfortable with it if you&rsquo;re new to the concept.</p>
<p><strong>What it&rsquo;s good at:</strong> once it clicks, adding a new service is often zero extra work beyond the labels you&rsquo;d add anyway. It also handles more complex routing scenarios cleanly - path-based routing, weighted load balancing across multiple instances, middleware chains for auth or rate limiting - in ways that are awkward to bolt onto NPM after the fact.</p>
<p><strong>Resource footprint:</strong> light, comparable to NPM. It&rsquo;s a single binary/container with no database dependency (routing state comes from the Docker API or config files directly), which is arguably lighter than NPM&rsquo;s UI-plus-database stack.</p>
<h2 id="caddy-automatic-https-without-the-ceremony">Caddy: automatic HTTPS without the ceremony</h2>
<p>Caddy&rsquo;s whole reputation rests on one thing: point it at a domain, and it gets a valid TLS certificate and keeps it renewed, with zero additional configuration. No separate Certbot container, no ACME DNS challenge setup for the common case, no cert-expiry monitoring you have to remember to set up. It just works, and it was the first major reverse proxy to make that the default rather than an add-on.</p>
<p>The Caddyfile format is genuinely simple - a domain, a <code>reverse_proxy</code> directive pointing at your backend, done. It reads closer to plain English than nginx or Traefik&rsquo;s config syntax, which makes it approachable for anyone comfortable editing a text file but not wanting to learn a full config language.</p>
<p><strong>What it costs you:</strong> no built-in Docker service discovery the way Traefik has it (there&rsquo;s a community plugin, <code>caddy-docker-proxy</code>, that adds label-based config, but it&rsquo;s not the default experience the way it is with Traefik). Out of the box, you&rsquo;re still manually adding a block to the Caddyfile per service, closer to NPM&rsquo;s manual-entry model, just as a text file instead of a UI.</p>
<p><strong>What it&rsquo;s good at:</strong> the automatic HTTPS is genuinely the best of the three with zero configuration for the standard case, and the config file, once you&rsquo;re editing it directly, is faster to work in than clicking through NPM&rsquo;s UI for anything beyond the basics. It&rsquo;s also a legitimately fast, well-engineered proxy under the hood, not just a friendly config format wrapped around something else.</p>
<p><strong>Resource footprint:</strong> light, single Go binary, no database, similar footprint to Traefik.</p>
<h2 id="which-one-to-actually-run">Which one to actually run</h2>
<p><strong>Pick NPM if:</strong> you&rsquo;re new to reverse proxies, you manage services by hand rather than through Docker Compose, or you just want a UI you can glance at instead of a config file you have to remember the syntax for. It&rsquo;s the right default for most people&rsquo;s first reverse proxy.</p>
<p><strong>Pick Traefik if:</strong> you already run everything through Docker Compose and redeploy services often. The label-based automatic discovery pays for itself once you&rsquo;re past the initial learning curve, and it scales cleanly as your service count grows without more manual proxy-host work per service.</p>
<p><strong>Pick Caddy if:</strong> you want the simplest possible HTTPS story and are comfortable editing a text config file instead of clicking through a UI. It&rsquo;s a strong middle ground between NPM&rsquo;s accessibility and Traefik&rsquo;s automation, especially if Traefik&rsquo;s label system feels like more than you need.</p>
<p>None of these are permanent decisions in the sense that migrating later is impossible, but it is real work - every service&rsquo;s routing gets redefined in whichever new system you pick, and DNS/certificate transitions need care so you don&rsquo;t drop TLS for a service mid-migration. Worth getting this choice right the first time rather than treating it as disposable.</p>
<h2 id="a-note-on-what-a-reverse-proxy-doesnt-do">A note on what a reverse proxy doesn&rsquo;t do</h2>
<p>None of these three protect you from a compromised service being reachable on your LAN, and none of them replace a firewall or VLAN segmentation. A reverse proxy controls how traffic gets routed and terminates TLS - it&rsquo;s not a security boundary by itself. If you&rsquo;re exposing anything to the public internet through one of these (rather than just cleaning up internal LAN access), pair it with access lists, basic auth or a proper identity provider (Authelia, Authentik) for anything sensitive, and don&rsquo;t assume &ldquo;it&rsquo;s behind a reverse proxy&rdquo; means &ldquo;it&rsquo;s secured.&rdquo;</p>
<p>Whichever one you pick, the actual payoff is the same: real hostnames instead of port numbers, one place for TLS instead of per-service certificate management, and a setup that looks like it was built on purpose instead of accumulated. Start with whichever of the three matches how you already manage your services - that&rsquo;s a better predictor of which one you&rsquo;ll stick with than any feature comparison.</p>
]]></content:encoded></item></channel></rss>