
Set up Nginx Proxy Manager as a reverse proxy for all your self-hosted services. HTTPS with Let's Encrypt, subdomain routing, access control, and Docker Compose integration.
Running a dozen self-hosted applications on different ports quickly becomes a headache to remember and a security risk to expose. A reverse proxy acts as a smart traffic director, sitting at the front door of your server and cleanly routing requests for nextcloud.yourdomain.com or plex.yourhome.net to the correct internal service. This guide will walk you through deploying Nginx Proxy Manager (NPM), a powerful yet user-friendly web interface for managing this crucial piece of homelab infrastructure, all while keeping an eye on efficiency.

By the end of this tutorial, you will have a fully operational reverse proxy that provides several key benefits for your low-power home server setup. Instead of accessing services via IP addresses and ports (e.g., 192.168.1.100:8080), you'll access them via memorable hostnames like homeassistant.lan.yourdomain.com. You will secure every connection with valid HTTPS certificates from Let's Encrypt, automatically renewed for free. Nginx Proxy Manager's GUI will give you point-and-click control over routing, access lists, and SSL settings, eliminating the need to manually write and test complex Nginx configuration files. Crucially, we'll achieve this within an isolated Docker container, avoiding dependency conflicts and making backups a breeze.

Before proceeding, ensure your system meets the following requirements:
192.168.1.100) on your local network. Ports 80 (HTTP) and 443 (HTTPS) must be open on your server's firewall and forwarded to your server from your router if you plan external access.nano or vim.Verify your Docker installation:
docker --version
docker compose version

We will deploy Nginx Proxy Manager using a Docker Compose file, which defines the service, its persistent storage, and network configuration in a single, reproducible document.
Create a Project Directory: This keeps everything organized.
mkdir ~/nginx-proxy-manager
cd ~/nginx-proxy-manager
Create the Docker Compose File: Using nano or your preferred editor, create a file named docker-compose.yml.
nano docker-compose.yml
Paste the Configuration: This is a standard, production-ready configuration for NPM. Note the use of the jc21/nginx-proxy-manager:latest image.
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web UI Port
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy-network
networks:
proxy-network:
driver: bridge
Explanation:
./data and ./letsencrypt directories relative to your project folder.Deploy the Container: From within your ~/nginx-proxy-manager directory, run:
docker compose up -d
Docker will pull the image and start the container. Verify it's running with:
docker ps --filter "name=nginx-proxy-manager"
With the container running, initial configuration is done via the web GUI.
Access the Admin Interface: Open a web browser and navigate to http://YOUR_SERVER_IP:81. For example, http://192.168.1.100:81.
Log In: The default credentials are:
admin@example.comchangeme
You will be immediately forced to change these credentials. Do so and log in with the new ones.Set Up Your First Proxy Host (Example: Home Assistant): This is the core action of routing a subdomain to a service.
homeassistant.lan.yourdomain.com.httpproxy-network), use its container name (e.g., homeassistant). If it's on your host network, use your server's LAN IP (e.g., 192.168.1.100).8123 for Home Assistant).Create an Access List (Optional but Recommended): You can restrict access to certain proxy hosts.
192.168.1.0/24 (Replace with your LAN subnet).It's critical to test that everything is working correctly, both internally and externally.
Internal Access Test: From a computer on your local network, navigate to https://homeassistant.lan.yourdomain.com. You should see your Home Assistant login screen, with a valid HTTPS padlock in the browser's address bar. The URL should not show any port number.
Certificate Check: Click the padlock icon in your browser's address bar and view the certificate details. It should be issued by "Let's Encrypt" and valid for 90 days.
Log Verification: Check the NPM container logs for any errors during SSL provisioning or access attempts.
docker logs nginx-proxy-manager --tail 50
Look for lines containing "Certificate obtained successfully" or "HTTP->HTTPS".
DNS Record Verification: For external access, ensure your public DNS records point to your home's public IP. At your domain registrar, you'd create an A record like:
A*.lan (or specific subdomains)your.home.public.ip.addressA key tenet of lowpowerhomeserver.com is quantifying the efficiency impact of our services. Nginx Proxy Manager, while a critical piece of infrastructure, has a minimal footprint.
Resource Usage: On an idle Intel N100 system (Beelink EQ12), the NPM container typically uses:
Performance Impact: The proxy adds negligible latency. Testing with curl on a local network:
# Direct access to service (bypassing proxy)
curl -o /dev/null -s -w 'Time: %{time_total}s\n' http://192.168.1.100:8123
# Via Nginx Proxy Manager
curl -o /dev/null -s -w 'Time: %{time_total}s\n' https://homeassistant.lan.yourdomain.com
Typical Results:
| Access Method | Average Response Time | Notes |
|---|---|---|
| Direct (IP:Port) | 0.015s | Baseline |
| Via NPM (HTTPS) | 0.025s | Adds ~10ms for SSL/TLS negotiation and routing |
This ~10 millisecond overhead is an excellent trade-off for the benefits of centralized SSL termination, hostname routing, and access control.
Once the basics are working, you can explore NPM's deeper capabilities.
Create a custom network and attach your services to it for better isolation and internal DNS resolution.
# Create the network (if not already defined in compose)
docker network create proxy-frontend
Modify your other services' docker-compose.yml files to join this network:
services:
nextcloud:
image: lscr.io/linuxserver/nextcloud:latest
container_name: nextcloud
networks:
- proxy-frontend
networks:
proxy-frontend:
external: true
name: proxy-frontend
In NPM, you can now forward hostname to nextcloud (the container name) on port 443.
NPM can also proxy non-HTTP traffic (e.g., for game servers, SSH, or MQTT). This is done via Streams.
25565 for Minecraft) and the Forwarding target (e.g., 192.168.1.100:25565).Use Redirection Hosts to permanently (301) or temporarily (302) redirect one domain to another. Use Custom Pages to create branded 404 Not Found or 503 Maintenance pages for your services.
Here are common issues and their solutions.
hosts file) points the subdomain to your server's LAN IP.A or CNAME DNS records are correct and have propagated (can take up to 48 hours). Use dig or nslookup to check:
dig homeassistant.lan.yourdomain.com
ufw).
sudo ufw status
# If needed, allow port 80
sudo ufw allow 80/tcp
docker ps.docker exec nginx-proxy-manager curl -v http://backend-service:port
# Check if the container is mapping port 81
docker port nginx-proxy-manager
# Check for conflicts on the host
sudo ss -tulpn | grep :81
Nginx Proxy Manager successfully demystifies the reverse proxy, transforming it from a command-line chore into a manageable, web-accessible utility. For the low-power home server enthusiast, its negligible resource
Optimization
Access your home server from anywhere with Tailscale. Zero-config WireGuard VPN setup, subnet routing, exit nodes, MagicDNS, and Docker integration โ no port forwarding required.
Optimization
Master Docker Compose for homelabs in 2026. Environment variables, named volumes, health checks, resource limits, and compose profiles for cleaner multi-service setups on low-power hardware.

Use Cases
Self-host a WireGuard VPN server for secure remote access to your home network. wg-easy Docker setup, peer configuration, split tunneling, mobile client setup, and kill switch.
Use our Power Calculator to see how much you can save.
Try Power Calculator