Skip to content

Document cross-host proxy gRPC routing for multi-proxy deployments#728

Merged
TechHutTV merged 2 commits intomainfrom
fix/multi-proxy-doc
May 8, 2026
Merged

Document cross-host proxy gRPC routing for multi-proxy deployments#728
TechHutTV merged 2 commits intomainfrom
fix/multi-proxy-doc

Conversation

@TechHutTV
Copy link
Copy Markdown
Collaborator

@TechHutTV TechHutTV commented May 5, 2026

Summary

Adds the missing Traefik routing steps that remote NetBird proxy instances need to reach the management server's gRPC services, fixing the silent transport: received unexpected content-type "text/html" failure that users hit when adding a second proxy host. Also fixes a layout bug where wide content (like Traefik rules) inside <Note>/<Warning>/<Success> alerts pushed past the content column instead of scrolling.

Resolves netbirdio/netbird#6051. Confirmed working by xRedCrystalx, who also flagged the parenthesis pitfall now called out in a Warning callout.

Description of changes

src/pages/selfhosted/maintenance/scaling/multiple-proxy-instances.mdx

Added a new "Prepare the management server for cross-host proxies" section to the prerequisites, covering the three management-side changes that are required before a remote proxy can connect:

  1. Add PathPrefix(/management.ProxyService/) to the netbird-grpc Traefik router rule, alongside the existing SignalExchange and ManagementService paths. Without this, Traefik falls back to the dashboard router and returns HTML, producing the code = Unimplemented ... 404 (Not Found) error users were hitting.
  2. Disable the Traefik idle timeout on the websecure entrypoint so the long-lived gRPC streams between proxy and management aren't cut off.
  3. Restart Traefik on the management host.

A <Warning> callout sits next to the rule snippet to flag a copy-paste pitfall that xRedCrystalx (and likely others) ran into: appending only the new PathPrefix(...) clause to the end of an existing rule pushes it outside the existing )) group, breaking the OR logic and reproducing the same text/html error. The callout shows a side-by-side example with a ^ pointer at the offending paren so readers can visually compare against their existing rule.

A second <Warning> at the end of the section reminds readers that all three changes are made on the management server, not the proxy hosts — this is the most common cause of management connection failed ... 404 (Not Found) reports when adding a remote instance.

src/components/mdx.jsx

Added min-w-0 flex-1 to the inner content div in Note, Warning, and Success. These three alert components share the same flex layout, and the inner div previously had no min-width: 0. Because flex children default to min-width: auto (their intrinsic content width), a <pre> with a long unbreakable line forced the inner div — and therefore the entire alert — to expand past the content column, even though the project's <pre> already has overflow-x-auto.

min-w-0 lets the flex child shrink below its intrinsic content width, which lets the existing horizontal scroll on <pre> engage as intended. flex-1 makes the inner div consistently take the remaining width regardless of content. This is a cosmetic fix only — no alert content changes — but it applies site-wide to every existing <Note>/<Warning>/<Success> that contains code blocks or other wide content.

Screenshot From 2026-05-08 08-46-48

@xRedCrystalx
Copy link
Copy Markdown

xRedCrystalx commented May 8, 2026

Can confirm that this clarifies my issue/documentation and works.

One thing that would be nice to add is a little "note" next to this line:

traefik.http.routers.netbird-grpc.rule=Host(`netbird.example.com`) && (PathPrefix(`/signalexchange.SignalExchange/`) || PathPrefix(`/management.ManagementService/`) || PathPrefix(`/management.ProxyService/`))

Many people, including me might only copy last part || PathPrefix('/management.ProxyService/')) and paste it to the end of the existing line which breaks the OR logic due to previous closing bracket. Its really easy to miss it and will result to same transport: received unexpected content-type "text/html" error.
Example:

traefik.http.routers.netbird-grpc.rule=Host(`netbird.example.com`) && (PathPrefix(`/signalexchange.SignalExchange/`) || PathPrefix(`/management.ManagementService/`)) [<- this here] || PathPrefix(`/management.ProxyService/`))

Unsure if the CrowdSec integration should also be a part of this documentation/if it even supports multi-proxy instances, but would be nice to see that getting added as well.

@TechHutTV TechHutTV changed the title Update Running Multiple Proxy Instances Doc Document cross-host proxy gRPC routing for multi-proxy deployments May 8, 2026
@TechHutTV TechHutTV marked this pull request as ready for review May 8, 2026 15:51
@TechHutTV
Copy link
Copy Markdown
Collaborator Author

@xRedCrystalx I added the warning you mentioned. I'll look into crowdsec with this setup to test for issues once time allows. Thanks for reporting this!

@TechHutTV TechHutTV merged commit e64d801 into main May 8, 2026
1 check passed
@TechHutTV TechHutTV deleted the fix/multi-proxy-doc branch May 8, 2026 16:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[self-host] out-of-date documentation for multiple reverse proxy intances

3 participants