DEV Community

selfhosting.sh
selfhosting.sh

Posted on • Originally published at selfhosting.sh

Nginx Proxy Manager vs Caddy

Quick Verdict

Caddy is the better choice for most self-hosters who are comfortable editing a config file. It uses less memory, starts faster, and automatic HTTPS requires zero configuration. Choose Nginx Proxy Manager if you want a point-and-click web UI and never want to touch a config file — NPM is genuinely easier for people who prefer GUIs over text editors.

Overview

Nginx Proxy Manager (NPM, v2.13.7) wraps Nginx in a web UI for managing reverse proxy hosts, SSL certificates, redirections, and access lists. You create proxy hosts through a form, toggle SSL on with a checkbox, and NPM generates the Nginx config behind the scenes. No config files to write.

Caddy (v2.9) is a web server and reverse proxy with automatic HTTPS as its core feature. Configuration uses the Caddyfile, a minimal text format where adding a new proxied service takes two lines. Caddy handles certificate provisioning, renewal, and OCSP stapling automatically.

Both solve the same problem — route traffic to your self-hosted services with HTTPS. NPM does it through a GUI. Caddy does it through a config file. The fundamental tradeoff is simplicity of management (NPM) versus simplicity of the tool itself (Caddy).

Feature Comparison

Feature Nginx Proxy Manager (v2.13.7) Caddy (v2.9)
Configuration method Web UI (forms and toggles) Caddyfile (text) or JSON API
Automatic HTTPS Yes — toggle per host Yes — automatic for all sites, zero config
Let's Encrypt challenges HTTP, DNS HTTP, TLS-ALPN, DNS
Wildcard certificates Yes — via DNS challenge Yes — via DNS challenge
HTTP/2 Yes Yes
HTTP/3 (QUIC) No Yes
WebSocket support Yes — toggle per host Yes — automatic
Access control lists Yes — built-in IP and password auth Via plugins or Caddyfile directives
Custom Nginx config Yes — advanced tab per host N/A (not Nginx-based)
Static file serving Yes (via custom config) Yes — native, first-class
TCP/UDP forwarding Yes — stream hosts Yes — Layer 4 module
API for automation No Yes — comprehensive admin API
Multi-user support Yes — multiple admin accounts No built-in multi-user
Underlying engine Nginx Custom Go HTTP server
Config-as-code No — stored in SQLite database Yes — Caddyfile is a plain text file
License MIT Apache 2.0

Installation Complexity

NPM is slightly easier for absolute beginners. Deploy the container, open port 81, and log in with the default credentials. Everything from there is point-and-click. No config files to create. The tradeoff: your proxy configuration lives inside NPM's SQLite database, not in a file you can version-control.

Caddy requires creating a Caddyfile before starting the container. But the format is remarkably simple:

app.example.com {
    reverse_proxy container:8080
}
Enter fullscreen mode Exit fullscreen mode

That is the entire config for a proxied service with HTTPS. No entry points, no certificate resolvers, no toggles. If you can write two lines in a text file, you can use Caddy.

Both take under 5 minutes to deploy. NPM has a lower floor (no text editing at all), but Caddy's ceiling is higher (config-as-code, version control, scripted deploys).

Performance and Resource Usage

Metric Nginx Proxy Manager Caddy
Idle RAM ~100-150 MB ~20-40 MB
Under load RAM ~200-300 MB ~50-100 MB
CPU at idle Low Very low
Docker image size ~400 MB ~40 MB
Startup time 3-5 seconds < 1 second

Caddy is dramatically lighter. NPM runs Nginx plus a Node.js management API plus SQLite. Caddy is a single Go binary. On a Raspberry Pi or low-spec VPS, Caddy leaves more resources for the services you're actually proxying.

Community and Support

Metric Nginx Proxy Manager Caddy
GitHub stars 23K+ 60K+
First release 2019 2015 (v1), 2020 (v2)
Maintainer Single developer (jc21) Small team (Matt Holt + contributors)
Documentation Good, focused on UI walkthrough Excellent, detailed, well-organized
Community GitHub issues, Reddit Dedicated forum (caddy.community), Reddit

Caddy has a larger community and more active development. NPM is maintained primarily by a single developer, which is a risk factor for long-term reliability. Both are open source and free.

Use Cases

Choose Nginx Proxy Manager If...

  • You strongly prefer a web UI over editing config files
  • You need built-in access control lists with password protection
  • You want multi-user admin access
  • You are managing a shared homelab where others need to add proxy hosts
  • You want to inject custom Nginx directives for specific hosts

Choose Caddy If...

  • You want the lightest possible reverse proxy
  • You value config-as-code and version-controlled infrastructure
  • Memory is limited (Raspberry Pi, small VPS)
  • You want HTTP/3 support
  • You also need to serve static sites alongside proxied services
  • You want an API for programmatic proxy management
  • You want the fastest automatic HTTPS setup possible

FAQ

Can Caddy do everything NPM does?

For reverse proxying and SSL, yes. What Caddy lacks is the built-in web UI, multi-user access, and visual access control list management. If you need those, NPM is the right tool. If you don't, Caddy does the core job with less overhead.

What if NPM's developer stops maintaining it?

This is a real concern. NPM is primarily a single-maintainer project. If development stops, your existing setup will continue working, but you would not get security updates or new features. Caddy has a broader contributor base and commercial backing.

Can I use both together?

You should not run two reverse proxies on the same server — only one can bind ports 80 and 443. Pick one.

Final Verdict

Caddy is the better reverse proxy for most self-hosters. It is lighter, faster, more secure by default (automatic HTTPS with zero config), and its Caddyfile is genuinely easy to write. Your config lives in a text file you can back up, version, and replicate.

NPM is the better choice specifically for people who want a GUI and never want to see a config file. That is a valid preference, and NPM executes on it well. But the overhead — more memory, a SQLite database holding your config, a single-maintainer project — is the cost of that convenience.

If you are reading this comparison and trying to decide, try Caddy first. If the Caddyfile feels uncomfortable, switch to NPM.

Related

Top comments (0)