What is Netbird?NetBird combines a WireGuard®-based overlay network with Zero Trust Network Access, providing a unified open-source platform for reliable and secure connectivity
First, go to https://netbird.io and click Get Started to create your free account.
A Setup Key acts like a temporary password that allows your server to authenticate and join your NetBird network automatically.
Jellyfin Server Setup).1 Day or 7 Days.Security Warning: Do not set the expiry to
0(never expire). If an infinite, reusable key is ever leaked, anyone can join your private network.
Your server will not disconnect when this key expires! Setup keys are only used for the initial installation; after that, NetBird uses secure, auto-rotating WireGuard keys.
Docker Compose
Bare Metal Linux
Windowsservices:
netbird:
cap_add:
- NET_ADMIN
container_name: netbird
environment:
- NB_SETUP_KEY=
image: netbirdio/netbird:latest
network_mode: host
restart: unless-stopped
volumes:
- ./netbird-client:/var/lib/netbird
Paste your Setup Key created from above in the - NB_SETUP_KEY= line.
curl -fsSL https://pkgs.netbird.io/install.sh | sh
Once this is installed, execute netbird up --setup-key <key-value> to start the connection using the setup key created above.
netbird up --setup-key <key-value> using the setup key created aboveGet the app from your respective app store:
NetBird's built-in reverse proxy lets you expose local services over HTTPS without opening a single port on your router. Every service you publish lives on a cluster — a group of one or more proxy instances that serve a single apex domain. There are two kinds:
Start with a shared cluster to get going in minutes, then graduate to your own cluster when you want traffic to stay on your own server.
By default, NetBird assigns your proxy services to a provided cloud domain. However, if you own your own domain (e.g., yourdomain.com), you can attach it to NetBird to make your services look cleaner and easier to remember.
Add the Domain to NetBird:
yourdomain.com).Configure your DNS Provider:
*) or specific subdomain to NetBird's provided target address.Important note for Cloudflare users: If you are using Cloudflare for DNS, make sure the Proxy status (the orange cloud icon) is toggled OFF (set to "DNS Only") for these specific CNAME records. Because NetBird is now acting as your Reverse Proxy, leaving Cloudflare's proxy enabled will cause conflicts and prevent NetBird from verifying your domain or issuing SSL certificates.
Once your custom domain is active, it will be available in the dropdown menu when creating new routes in the Services tab.
Once your server is connected to the NetBird mesh, you can expose its local applications to the internet without opening any ports on your router.
In the NetBird dashboard, navigate to the Reverse Proxy > Services tab.
Click the Add Service button. This will open a configuration window with several steps:
Details:
Enter a memorable subdomain for your service (e.g., jellyfin or media) and select the domain you wish to use.
Targets:
Click Add Target. In the new prompt, select the NetBird Peer you set up in 1. Deploy Netbird Set the Port to the internal port your service uses (for Jellyfin, the default is 8096). Click Continue and Add Target to return to the main setup window.
Authentication:
If the application you are exposing already has its own secure login screen (like Jellyfin), you can skip this tab. If you are exposing a service with no built-in security, you can enforce route-level authentication here. (See 2.3. Reverse Proxy - Authentication for more details).
Advanced Settings:
It is highly recommended to enable Pass Host Header. This ensures that the original URL requested by the user is passed directly to your application, preventing routing errors and keeping your internal IP addresses hidden.
Click Add Service to finalize the setup.
Wait a few minutes. NetBird needs a moment to provision the service globally and automatically generate your free SSL (HTTPS) certificate.
Tip: Once the service status shows as active, you can test it by visiting your new URL (e.g.,
https://jellyfin.yourdomain.com) from a device that is not connected to your local network!
While applications like Jellyfin manage their own users and login screens (meaning you skip this step), many self-hosted tools (like network dashboards, basic web servers, or admin panels) lack strong built-in security. NetBird allows you to put an identity layer in front of these routes, forcing visitors to authenticate before they can even reach the application.
Access the Authentication Settings:
Add Service wizard, or by clicking Edit on an existing route in the Reverse Proxy > Services tab.Choose an Authentication Method:
Save and Apply:
💡 What does the user experience?
When a user navigates to a protected URL (e.g.,https://admin.yourdomain.com), they won't see your application right away. Instead, they are stopped by a secure NetBird interception screen asking for the required SSO login, Password, or PIN. Once they successfully authenticate, they are forwarded to your actual backend application.
Everything above runs on a shared cluster — NetBird's own proxy infrastructure handles TLS and routes your traffic. That's the easy path, but it means your traffic terminates on someone else's servers.
Bring Your Own Proxy (BYOP) lets your account run its own reverse proxy on your own box. The proxy connects to NetBird's management service like any other proxy, but it's bound to a single account: only your services route through it, and the apex domain you choose is reserved across the management instance. For a homelabber, this is the sweet spot — you keep NetBird's slick dashboard and mesh routing, but the proxy and the Let's Encrypt certs live on a server you control (a VPS, for example).
You'd reach for BYOP when you want:
In the dashboard, BYOP proxies live under Reverse Proxy > Clusters and show up as account clusters.
Both cluster types appear together on the Clusters page. The Type badge marks each row as shared or account, the Status column shows whether at least one proxy has heartbeated in the last two minutes, and the Features column lists what the connected proxies support.
| Shared cluster | Account cluster (BYOP) | |
|---|---|---|
| Who runs it | NetBird / your management operator | You |
| Who can use it | Every account on the management instance | Only your account |
| Apex domain | Provided by the platform | Provided by you (you own the DNS) |
| TLS | Managed by the platform | Issued by the proxy you run (ACME or your own certs) |
| Registration token | Management-wide | Account-scoped (one per account) |
| Geographic placement | Wherever the platform runs proxies | Wherever you run the container |
| Delete from dashboard | Not allowed | Allowed (account owner only) |
There's no functional difference at the data plane — a service behaves identically once a request lands on either cluster type. The choice is purely operational: shared = zero effort, account = control over location, TLS, and the data path.
The rest of this section sets up an account cluster. If you just want a shared cluster, there's nothing to do here — pick the platform-provided domain back in Section 2.2.
The dashboard provides a wizard that generates the proxy token, shows the DNS records to add, and emits a ready-to-run command.
Open the wizard. Navigate to Reverse Proxy > Clusters. The table lists every cluster your account can reach. Click Setup Self-Hosted Cluster.
Choose your domain. In the Domain tab, enter the domain this cluster will be reachable on, e.g., proxy.yourdomain.com. This becomes the proxy's NB_PROXY_DOMAIN and the suffix of every service URL hosted on it ({subdomain}.proxy.yourdomain.com). Click Continue.
Configure DNS records. In the DNS Records tab, add these two records at your registrar:
| Type | Name | Content |
|---|---|---|
| A | proxy.yourdomain.com |
Your server's public IP |
| CNAME | *.proxy.yourdomain.com |
proxy.yourdomain.com |
The wildcard record is required so every service domain ({subdomain}.proxy.yourdomain.com) resolves to your proxy. If you're on Cloudflare, set these records to DNS Only (grey cloud). Click Continue.
Run the proxy. The Run the Proxy tab generates a one-time, account-scoped token and embeds it into a command. The wizard hands you a docker run, but here's the equivalent Dockge-friendly compose stack to run on your server:
services:
netbird-proxy:
container_name: netbird-proxy
image: netbirdio/reverse-proxy:latest
restart: unless-stopped
environment:
- NB_PROXY_CERTIFICATE_DIRECTORY=/certs
- NB_PROXY_MANAGEMENT_ADDRESS=https://api.netbird.io
- NB_PROXY_ACME_CERTIFICATES=true
- NB_PROXY_DOMAIN=proxy.yourdomain.com
- NB_PROXY_LOG_LEVEL=info
- NB_PROXY_TOKEN=
ports:
- "443:443"
- "80:80"
volumes:
- ./netbird-certs:/certs
Paste the generated token into the NB_PROXY_TOKEN= line and set NB_PROXY_DOMAIN to the domain from Step 2. On NetBird Cloud, leave NB_PROXY_MANAGEMENT_ADDRESS as https://api.netbird.io; on a self-hosted management server, use your own management URL.
Copy the token now. The plain token is shown only once, at the moment it's generated. Store it somewhere safe before closing the modal. If you lose it, revoke it and generate a new one.
With the default
tls-alpn-01challenge you only need port 443 — you can drop the80:80mapping. Keep port 80 only if you switch to thehttp-01challenge.
Once the cluster is connected, your BYOP domain shows up as a normal Cluster option in the service-creation flow:
proxy.yourdomain.com) as the base domain.Traffic to subdomain.proxy.yourdomain.com is now received by your proxy, terminated locally with a Let's Encrypt certificate, and forwarded over WireGuard to the target peer.
3 · Videohttps://youtu.be/-yfE3Lb3hTI
https://youtu.be/skbWnMSwZcE
4 · Would You Like to Know More?