NetBird + Pangolin (Pangolin as reverse proxy for NetBird) Setup Guide

Last updated on 16th Feb 2026

Disclaimer: Only tested on fresh installations.
Prerequisites: Pangolin installed. How to Self-host Pangolin - Identity-aware VPN and Reverse Proxy for Easy Remote Access - youtube.com/@pangolin-net


After my failed try recently, I got NetBird finally running properly under Pangolin. With both running on same server as well as different servers. Thanks to Netbird for such awesome changes recently!


Context

NetBird has made it way simpler by adding embedded STUN directly in their relay service instead of using separate coturn service → [infra] add embedded STUN to getting started (#5141) which they added in v0.64.0.
They also added this guide → Migration Guide: From Coturn to Embedded STUN Server - NetBird Docs

Their Self-Hosting Quickstart Guide (5 min) - NetBird Docs doesn’t explicitly tell about removed coturn service, which I think they will update instructions in next major version. They have updated their script though.


Installation

Here is my recent installation. Follow this as reference for my below guides -

$ curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash
The NETBIRD_DOMAIN variable cannot be empty.
Enter the domain you want to use for NetBird (e.g. netbird.my-domain.com): nb.yourdomain.com

Which reverse proxy will you use?
  [0] Traefik (recommended - automatic TLS, included in Docker Compose)
  [1] Existing Traefik (labels for external Traefik instance)
  [2] Nginx (generates config template)
  [3] Nginx Proxy Manager (generates config + instructions)
  [4] External Caddy (generates Caddyfile snippet)
  [5] Other/Manual (displays setup documentation)

Enter choice [0-5] (default: 0): 5

Should container ports be bound to localhost only (127.0.0.1)?
Choose 'yes' if your reverse proxy runs on the same host (more secure).
Bind to localhost only? [Y/n]: Y
Rendering initial files...

==========================================
  MANUAL REVERSE PROXY SETUP
==========================================

Container ports (bound to 127.0.0.1):
  Dashboard:     8080
  NetBird Server: 8081 (all services: management, signal, relay)

Configure your reverse proxy with these routes (all go to the same backend):

  WebSocket (relay, signal, management WS proxy):
    /relay*, /ws-proxy/*           -> 127.0.0.1:8081
    (HTTP with WebSocket upgrade, extended timeout)

  Native gRPC (signal + management):
    /signalexchange.SignalExchange/* -> 127.0.0.1:8081
    /management.ManagementService/* -> 127.0.0.1:8081
    (gRPC/h2c - plaintext HTTP/2)

  HTTP (API + embedded IdP):
    /api/*, /oauth2/*              -> 127.0.0.1:8081

  Dashboard (catch-all):
    /*                             -> 127.0.0.1:8080

IMPORTANT: gRPC routes require HTTP/2 (h2c) upstream support.
WebSocket and gRPC connections need extended timeouts (recommend 1 day).

Press Enter when your reverse proxy is configured (or Ctrl+C to exit)... 

Starting NetBird services

[+] up 4/4
 ✔ Network netbird_netbird     Created                                                                                                                                     0.0s
 ✔ Volume netbird_netbird_data Created                                                                                                                                     0.0s
 ✔ Container netbird-dashboard Created                                                                                                                                     0.1s
 ✔ Container netbird-server    Created                                                                                                                                     0.1s
Waiting for NetBird server to become ready . . . . . . . . done

Done!

NetBird is now running. Access the dashboard at:
  https://nb.yourdomain.com

Note before installing:

  1. For configuration in Pangolin UI, use these paths as prefix (without * character at end). You can simply copy from the terminal instructions provided by netbird script without * character -
  • /relay
  • /ws-proxy/
  • /signalexchange.SignalExchange/
  • /management.ManagementService/
  • /api/
  • /oauth2/
  • /
  1. In my second way I put netbird services directly in pangolin network for accessing them from pangolin unlike first way where I simply used 127.0.0.1/localhost. I did this because my Netbird wasn’t detected by Pangolin on localhost. You can avoid this way if your Netbird is being detected by Pangolin on localhost.

1. For Pangolin and NetBird on Different Servers

Install Newt on remote server and add remote site in Pangolin dashboard. Then Install netbird in netbird directory by using their quick start guide installation script, and when on this step -

Press Enter when your reverse proxy is configured (or Ctrl+C to exit)…

Add reverse proxy configuration in Pangolin, and press enter on Netbird script.

2. For Pangolin and NetBird on Same Server

If you installed both on same server then, first go to Pangolin UI and add your pangolin server as local site in your dashboard -

And then when installing NetBird on this step -

Press Enter when your reverse proxy is configured (or Ctrl+C to exit)…

Create a public resource on that local site with the paths provided by netbird

Add reverse proxy configuration in Pangolin, and press enter on Netbird script.

As you can see I’m using direct service names and ports here because I tried using 127.0.0.1 method like in 1st, pangolin was not detecting netbird for me for some reason. So I moved netbird directly to pangolin network as you can see in my below instructions -
Edit your docker-compose.yml file of inside netbird folder, where you installed netbird and make sure pangolin is already running:

# In every service, replace this -
networks: [netbird]
# with this -
networks: [pangolin]

# And for this global networks declaration part in compose file at the bottom, replace this -
networks:
  netbird:
#  with this -
networks:
  pangolin:
    external: true

BONUS!

For Cloudflare users, who run pangolin server with Cloudflare Proxy/Orange Cloud - Pangolin Docs turned ON.

Make sure that you enable gRPC in your Cloudflare Dashboard > Your Domain > Network

So that your devices connect properly using STUN. I was facing this problem before and discovered this option today which fixed my problem when using Cloudflare Proxy/Orange Cloud

5 Likes

Key Changes:

  • 16 Feb 2026

    • NetBird’s been cooking recently. Another major release with less configuration files - v0.65.0

      NetBird now includes a built-in reverse proxy in the management server, enabling proxied access to backend services through your NetBird network. Allowing you to expose your services to the public with the option to secure them with SSO, PINs, or passwords.

    • And here is Migration Guide: Enable Reverse Proxy Feature for existing users who want to upgrade their self-hosted netbird to this version.

  • 20 Feb 2026

    reverseProxy:
      trustedHTTPProxies:
        - "172.30.0.10/32"
    

For people like me who are still using Pangolin as their reverse proxy and NetBird as their overlay vpn, I will keep updating the posts. Haven’t tested migration guides myself, as i did fresh install of the combined container version.

4 Likes