Pin the NetBird mesh-control-plane images (was :latest)
Prereq for IPv6-first ingress, and a drift fix in its own right.
ansible/roles/netbird-server ran everything on :latest — management, signal, relay, reverse-proxy, dashboard. That's unpinned drift on the mesh control plane: the running version is whatever was last pulled, with no rollback and no reproducibility. Pinned via two role vars:
0.73.2 is the current stable (0.75.0 is only -rc) and matches the agents already on the mesh. >=0.71 is the floor that enables IPv6 overlay addressing (NetBird v0.71) — the prerequisite for advertising fd99::/64 into the mesh so the rootless routing peer can serve IPv6-first. That follow-up is not in this PR.
⚠️ This is a git change only — applying it is a deliberate, risky step
It takes effect when plays/install-netbird-server.yml runs on the VPS. Before that:
Confirm the currently-running version (dashboard footer, or Settings → Network shows the IPv6 toggle iff already >=0.71). We don't know it — the role was :latest, and SSH to the prod VPS is (correctly) off-limits.
Snapshot the VPS. A management version bump runs a one-way store migration; a large jump from an old :latest is the real risk.
Then run the play. Existing peer WireGuard sessions survive a brief control-plane restart; config sync pauses during it.
After it's on >=0.71, to actually get IPv6-first ingress (separate work)
Enable IPv6 in Settings → Network (group-gated — the routing-peer group + your client group).
Ensure your laptop agent is >=0.71.
Add an fd99::/64 NetBird route via the netbird-ingress peer.
The rootless userspace peer then dials fd99::* over its own v6 socket → kills the ~0.6 s Happy-Eyeballs penalty we measured off-LAN.
🤖 Generated with Claude Code
## Pin the NetBird mesh-control-plane images (was `:latest`)
Prereq for IPv6-first ingress, and a drift fix in its own right.
`ansible/roles/netbird-server` ran **everything on `:latest`** — management, signal, relay, reverse-proxy, dashboard. That's unpinned drift on the mesh control plane: the running version is whatever was last pulled, with no rollback and no reproducibility. Pinned via two role vars:
```yaml
netbird_version: "0.73.2" # management / signal / relay / reverse-proxy
netbird_dashboard_version: "v2.80.0" # dashboard (versions independently)
```
`0.73.2` is the current stable (`0.75.0` is only `-rc`) and matches the agents already on the mesh. **`>=0.71` is the floor that enables IPv6 overlay addressing** ([NetBird v0.71](https://netbird.io/knowledge-hub/ipv6-overlay-addressing)) — the prerequisite for advertising `fd99::/64` into the mesh so the rootless routing peer can serve IPv6-first. That follow-up is **not** in this PR.
### ⚠️ This is a git change only — applying it is a deliberate, risky step
It takes effect when `plays/install-netbird-server.yml` runs on the VPS. Before that:
1. **Confirm the currently-running version** (dashboard footer, or Settings → Network shows the IPv6 toggle iff already `>=0.71`). We don't know it — the role was `:latest`, and SSH to the prod VPS is (correctly) off-limits.
2. **Snapshot the VPS.** A management version bump runs a **one-way store migration**; a large jump from an old `:latest` is the real risk.
3. Then run the play. Existing peer WireGuard sessions survive a brief control-plane restart; config sync pauses during it.
### After it's on `>=0.71`, to actually get IPv6-first ingress (separate work)
- Enable IPv6 in **Settings → Network** (group-gated — the routing-peer group + your client group).
- Ensure your laptop agent is `>=0.71`.
- Add an `fd99::/64` NetBird route via the `netbird-ingress` peer.
- The rootless userspace peer then dials `fd99::*` over its own v6 socket → kills the ~0.6 s Happy-Eyeballs penalty we measured off-LAN.
🤖 Generated with Claude Code
The mesh control plane (management/signal/relay/reverse-proxy/dashboard)
ran on :latest — unpinned drift with no rollback and a non-reproducible
running version. Pin via two role vars:
netbird_version: 0.73.2 # mgmt/signal/relay/reverse-proxy
netbird_dashboard_version: v2.80.0 # dashboard (independent versioning)
0.73.2 is the current stable (0.75.0 is only -rc) and matches the agents
already on the mesh. >=0.71 is the floor that enables IPv6 overlay
addressing, which is the prerequisite for advertising fd99::/64 into the
mesh (IPv6-first ingress) — a follow-up, not done here.
Takes effect only when plays/install-netbird-server.yml is run on the
VPS. Before applying: confirm the currently-running version and SNAPSHOT
the host — a management version bump runs a one-way store migration.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Pin the NetBird mesh-control-plane images (was
:latest)Prereq for IPv6-first ingress, and a drift fix in its own right.
ansible/roles/netbird-serverran everything on:latest— management, signal, relay, reverse-proxy, dashboard. That's unpinned drift on the mesh control plane: the running version is whatever was last pulled, with no rollback and no reproducibility. Pinned via two role vars:0.73.2is the current stable (0.75.0is only-rc) and matches the agents already on the mesh.>=0.71is the floor that enables IPv6 overlay addressing (NetBird v0.71) — the prerequisite for advertisingfd99::/64into the mesh so the rootless routing peer can serve IPv6-first. That follow-up is not in this PR.⚠️ This is a git change only — applying it is a deliberate, risky step
It takes effect when
plays/install-netbird-server.ymlruns on the VPS. Before that:>=0.71). We don't know it — the role was:latest, and SSH to the prod VPS is (correctly) off-limits.:latestis the real risk.After it's on
>=0.71, to actually get IPv6-first ingress (separate work)>=0.71.fd99::/64NetBird route via thenetbird-ingresspeer.fd99::*over its own v6 socket → kills the ~0.6 s Happy-Eyeballs penalty we measured off-LAN.🤖 Generated with Claude Code