Skip to content

Step 1: Management Server

This step provisions the Azure infrastructure and deploys NetBird’s management server at netbird.gsisg.com.

NetBird architecture — management server role highlighted

You have two options: use the existing GSI-AZ-IDM VM (recommended — saves ~$35-51/month) or provision a new dedicated VM.

Section titled “Option A: Use Existing GSI-AZ-IDM (Recommended)”

GSI-AZ-IDM is already running Ubuntu 24.04 with Docker and has more than enough capacity for NetBird alongside its current Prefect workloads.

SettingValue
VM NameGSI-AZ-IDM (existing)
Resource Grouprg-idm-webapp-prod
RegionWest US 2
SizeB2s v2 (2 vCPU, 8 GiB RAM) — double the recommended minimum
Public IP4.154.241.58 (already assigned)
Private IP10.50.0.16
VNetGSI-AZ-NET / GSI-AZ-SUB01
Additional cost$0/month — already paid for

NetBird’s management server uses ~1 CPU and ~2 GB RAM for signaling only (no data-plane traffic). With 8 GB RAM, there is ample headroom for both Prefect and NetBird.

To proceed with this option: Skip to 1.2 Configure the NSG and add the required ports to GSI-AZ-IDM’s existing NSG. Then point DNS to 4.154.241.58.

If you prefer to keep NetBird isolated from other workloads:

SettingValue
Resource Grouprg-netbird-prod (or your naming convention)
VM Namevm-netbird-mgmt-01
RegionWest US 3 (Phoenix, AZ)
ImageUbuntu 24.04 LTS (Gen2)
SizeB2s (2 vCPU, 4 GiB RAM)
AuthenticationSSH public key
OS Disk30 GB Premium SSD
Public IPStatic SKU Standard
Additional cost~$35-51/month
Terminal window
az group create --name rg-netbird-prod --location westus3
az vm create \
--resource-group rg-netbird-prod \
--name vm-netbird-mgmt-01 \
--image Canonical:ubuntu-24_04-lts:server:latest \
--size Standard_B2s \
--admin-username azureadmin \
--generate-ssh-keys \
--public-ip-sku Standard \
--public-ip-address-allocation Static \
--os-disk-size-gb 30 \
--storage-sku Premium_LRS

Note the public IP from the output — you need it for the DNS record.

1.2 Configure the NSG (Network Security Group)

Section titled “1.2 Configure the NSG (Network Security Group)”

Open these inbound ports on the VM’s NSG. NetBird consolidates Management, Signal, and Relay behind ports 80/443 via Traefik. Only UDP 3478 (STUN) is exposed directly.

PriorityNamePortProtocolSourcePurpose
100AllowHTTP80TCPAnyLet’s Encrypt ACME challenge, HTTP-to-HTTPS redirect
110AllowHTTPS443TCPAnyDashboard, Management API/gRPC, Signal gRPC, Relay WebSocket
120AllowSTUN3478UDPAnySTUN server for NAT traversal
200AllowSSH22TCPYour admin IPsSSH management access
Terminal window
az network nsg rule create \
--resource-group rg-netbird-prod \
--nsg-name vm-netbird-mgmt-01NSG \
--name AllowHTTP --priority 100 \
--destination-port-ranges 80 --protocol Tcp --access Allow
az network nsg rule create \
--resource-group rg-netbird-prod \
--nsg-name vm-netbird-mgmt-01NSG \
--name AllowHTTPS --priority 110 \
--destination-port-ranges 443 --protocol Tcp --access Allow
az network nsg rule create \
--resource-group rg-netbird-prod \
--nsg-name vm-netbird-mgmt-01NSG \
--name AllowSTUN --priority 120 \
--destination-port-ranges 3478 --protocol Udp --access Allow

Create an A record with your DNS provider:

TypeNameValueTTL
Anetbird.gsisg.com<VM Public IP>300

Wait for DNS propagation before proceeding. Verify with:

Terminal window
dig +short netbird.gsisg.com

The output should match your VM’s public IP address.

SSH into the VM and install Docker with the Compose plugin, plus jq and curl:

Terminal window
ssh azureadmin@netbird.gsisg.com
Terminal window
# Update system
sudo apt update && sudo apt upgrade -y
# Install prerequisites
sudo apt install -y ca-certificates curl gnupg jq
# Install Docker (official method)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Add your user to the docker group (avoids needing sudo for docker commands)
sudo usermod -aG docker $USER
# Verify
docker --version
docker compose version

Log out and back in for the group change to take effect.

Run the quickstart installation script. This downloads the latest stable release and generates all configuration files.

Terminal window
curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash

The script will prompt you for:

  1. Domain name — enter netbird.gsisg.com
  2. Reverse proxy selection — press Enter to accept the default [0] Traefik (recommended, includes auto-TLS via Let’s Encrypt)
  3. NetBird Proxy service — enter N (not needed for our use case)
FilePurpose
docker-compose.ymlDefines Traefik, Dashboard, and NetBird Server containers
config.yamlCombined server config (listen addresses, STUN, relay auth, embedded IdP, database)
dashboard.envDashboard environment (API endpoints, OAuth2/OIDC settings)

The script automatically starts all containers. Verify they are running:

Terminal window
docker compose ps

You should see three containers (netbird-traefik, netbird-dashboard, netbird-server) all in a running state.

Check logs for any errors:

Terminal window
docker compose logs --tail 50
  1. Open https://netbird.gsisg.com in your browser
  2. You will be redirected to the /setup page (this page is only available when no users exist)
  3. Create the admin account:
    • Email: your IT admin email
    • Name: your name
    • Password: a strong password (store in your password manager)
  4. Click Create Account

After creating the account, you are redirected to the login page. Sign in with the email and password you just created.

NetBird Dashboard after first login

Before proceeding, locate and securely store these values from config.yaml:

Terminal window
# On the VM, display the encryption key
grep encryptionKey config.yaml
ValueLocationWhy It Matters
server.store.encryptionKeyconfig.yamlEncrypts setup keys and API tokens in the database. Losing this key means regenerating all setup keys and tokens.
server.authSecretconfig.yamlShared secret for relay authentication
Admin email/passwordYour password managerBreak-glass local admin access

The Docker Compose services are configured with restart: unless-stopped, so they will restart automatically after a VM reboot. Verify Docker itself starts on boot:

Terminal window
sudo systemctl enable docker

At this point you should have:

  • Azure B2s VM running Ubuntu 24.04 in West US 3
  • NSG rules allowing TCP 80, 443 and UDP 3478
  • DNS record netbird.gsisg.com pointing to the VM’s static public IP
  • Docker Compose running Traefik + Dashboard + NetBird Server
  • Valid Let’s Encrypt TLS certificate (automatic via Traefik)
  • Admin account created and login verified
  • Encryption key backed up securely

Proceed to Step 2: Entra ID Integration to connect Microsoft Entra ID for SSO authentication.