Skip to content

docs: add networking requirements page for self-hosted installs - #8354

Merged
dimitrieh merged 4 commits into
mainfrom
docs-self-hosted-networking-requirements
Sep 9, 2026
Merged

dimitrieh merged 4 commits into
mainfrom
docs-self-hosted-networking-requirements

Conversation

@dimitrieh

@dimitrieh dimitrieh commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Adds an outbound egress list for self-hosted installs. Comes from a self-hosted enterprise renewal on a narrow-egress OT network that needs to file one change-controlled firewall request: https://github.com/FlowFuse/accounts/issues/128. Sales reports it is a common question.

Today there is no self-hosted egress list in the docs. The only list is on the Device Agent overview page, which covers agent to Cloud traffic, so a self-hoster behind a firewall reads Cloud-only endpoints as authoritative for their install.

Where it lives

docs/install/networking-requirements.md, in the Installing FlowFuse nav group alongside DNS Setup and Configuring FlowFuse. It is reference material (what is required), not a how-to, so it is a flat table with conditions rather than a walkthrough. Linked from:

  • install overview
  • Docker install, Requirements
  • Kubernetes install, Prerequisites

Open questions for review

  1. Wording of the restricted-networks caveat: an allowlist covers most nodes, but some packages fetch native builds from arbitrary hosts at install time and cannot be enumerated.
  2. Should the Device Agent overview list be trimmed of Cloud-only rows and cross-linked here, or left as is? It also lists registry.npmjs.com, which should be .org.
  3. Kubernetes side: any image-pull or operator hosts missing (EMQX operator, Traefik, cert-manager charts)?

There is no outbound egress list for a self-hosted platform in the docs. The
only list lives on the Device Agent overview page and covers agent to Cloud
traffic, so self-hosters behind a firewall read Cloud-only endpoints as
authoritative for their install.

Adds docs/install/networking-requirements.md as reference material: one table
of always-required destinations, one table of per-feature destinations with the
config flag that removes each. Hostnames and defaults taken from the platform
source and the Helm chart. Linked from the install overview and from the Docker
and Kubernetes prerequisites.
@dimitrieh

Copy link
Copy Markdown
Contributor Author

This follows a conversation with Nick, and solves a sales need from https://github.com/FlowFuse/accounts/issues/128#issuecomment-5452823013

Up fro changes and considerations as eng sees fit. This is just the initial proposal to kickstart it

@hardillb hardillb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments added before I am OOO

Comment thread docs/install/networking-requirements.md Outdated
| Destination | Port | Purpose |
| --- | --- | --- |
| `registry.npmjs.org` | 443 | Installing Node-RED and node packages |
| `catalogue.nodered.org` | 443 | Default node catalogue used by the editor palette |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only required for the machines running the browser accessing the NR editor (for both hosted and remote), not from the FF install it's self.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. Added a "Needed by" column and this row is now Editor browsers only, with a note that the editor fetches the catalogue directly and the platform does not. Confirmed in the editor client, palette-editor.js does the $.getJSON on the catalogue URL from the browser.

Comment thread docs/install/networking-requirements.md Outdated
| --- | --- | --- |
| `registry.npmjs.org` | 443 | Installing Node-RED and node packages |
| `catalogue.nodered.org` | 443 | Default node catalogue used by the editor palette |
| `registry-1.docker.io`, `auth.docker.io`, `production.cloudflare.docker.com` | 443 | Pulling FlowFuse and Node-RED container images, at install and at every upgrade |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unless using a local Container registry/proxy

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. The row now ends with "Not needed if you pull the images from an internal registry or a pull-through proxy instead", and the restricted networks section lists an internal registry or pull-through proxy as an option.

Comment thread docs/install/networking-requirements.md Outdated

Only open these if the feature is in use.

| Destination | Port | Feature | Turn off with |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Turn off with

This doesn't feel the right way round

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed the column to "Required when", so each row states the condition that makes the destination necessary instead of how to switch it off. Config flags stay inside the cell where they help, for example blueprintImport.enabled.

Comment thread docs/install/networking-requirements.md Outdated
Comment on lines +58 to +66
A hostname allowlist covers the large majority of Node-RED nodes, but not all of them. Some
packages download native builds at install time from arbitrary hosts, such as GitHub releases
or S3 buckets. Those cannot be listed up front.

If that is not acceptable, host the packages yourself and point FlowFuse at them:

- An internal npm registry and your own node catalogue. See
[3rd party npm registries](../user/custom-npm-packages.md#npm-registries).
- A mirror of the FlowFuse and Node-RED container images in your own registry.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a bit vague and hard to do in practice as you only find out they are pull native components when it fails and the only way to host them yourself is to either do proxy interception or build and host the nodes and their components yourself locally, this is a VERY big task.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewrote that section. It now says a minority of packages fetch native components at install time from hosts that cannot be listed, that you only find out when an install fails, and that the ways round it are an intercepting proxy or building and hosting the packages and their components yourself, both a significant piece of work. The advice is to plan for a small number of nodes being unavailable rather than for full coverage.

Adds a 'Needed by' column so each destination says whether the platform, the
Node-RED instances or the editor browsers has to reach it. The node catalogue
is fetched by the editor client, not by the platform. Docker Hub is not needed
when images come from an internal registry or a pull-through proxy.

Replaces the 'Turn off with' column with 'Required when', so the table states
the condition that makes a destination necessary rather than how to disable it.

Restricted networks section is honest about the limit: a minority of packages
fetch native components from hosts that cannot be listed, you find out when an
install fails, and the only ways round it (intercepting proxy, or building and
hosting the packages yourself) are a significant piece of work.
@dimitrieh
dimitrieh requested a review from hardillb September 1, 2026 16:45
@dimitrieh

Copy link
Copy Markdown
Contributor Author

Note on the red check. "Test Documentation links" fails in npm ci, before the link test runs:

npm error `npm ci` can only install packages when your package.json and package-lock.json are in sync
npm error Invalid: lock file's globals@17.11.0 does not satisfy globals@17.12.0

It is not caused by this branch, which only adds and edits markdown under docs/:

  • The same job passed on the first commit of this PR at 10:43 today, same lockfile, same npm (11.17.0).
  • Every docs.yml run since about 10:55 today fails the same way, including unrelated branches (docs/packaging-subflows, docs-website-preview).
  • main has not moved since 31 August, and its package.json (globals: ^17.7.0) and package-lock.json (17.11.0) agree with each other.
  • There is precedent for the same package and symptom in Resync package-lock.json for globals 17.9.0 #8027, where the fix was a lockfile resync on main.

So this needs a package-lock.json resync on main rather than a change here. Happy to open that separately if it is not already in hand.

The job that validates the content of this PR, "Test Documentation with website" (site build plus hyperlink --check-anchors), passes. Links and anchors were also checked locally.

@dimitrieh

Copy link
Copy Markdown
Contributor Author

@knolleary or @ppawlowski can you take a look here now that Ben is OOO

@knolleary

Copy link
Copy Markdown
Member

Approved on the basis there could be finer details to add when we discover them - but lets get something merged so we can iterate as needed.

Comment thread docs/install/introduction.md Outdated
Comment thread docs/install/networking-requirements.md Outdated
| `registry.npmjs.org` | 443 | Instances | Installing Node-RED and node packages |
| `catalogue.nodered.org` | 443 | Editor browsers | The node catalogue listed in the editor palette. The editor fetches it directly, the platform does not |
| `registry-1.docker.io`, `auth.docker.io`, `production.cloudflare.docker.com` | 443 | Platform | Pulling the FlowFuse and Node-RED container images, at install and at every upgrade. Not needed if you pull the images from an internal registry or a pull-through proxy instead |
| `ping.flowforge.com` | 443 | Platform | Anonymous usage telemetry |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we sure about this? Will a FlowFuse Platform on a self-hosted environment crash if access to the ping.flowforge.com is not possible?
Additionally, it should be ping.flowfuse.com. The old domain is used for legacy purposes and shouldn't be used in documents.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two separate things here.

Will it crash: no. The ping is a housekeeper task (forge/housekeeper/tasks/telemetryMetrics.js), scheduled once a day at a random time plus once ten seconds after startup, and the axios.post sits in a try/catch that logs Failed to send telemetry report. Blocking it costs you the report and nothing else. I have moved the row out of "Always required" into the conditional table and added a note saying exactly that, so nobody reads it as load-bearing.

The hostname: changed to ping.flowfuse.com as you asked, but flagging a mismatch with the code. The shipped default is still the old domain: telemetryMetrics.js:60 is app.config.telemetry.url || 'https://ping.flowforge.com/ping', and a code search across the org finds ping.flowfuse.com in no files and ping.flowforge.com in three, including docs/admin/telemetry.md:108. Both hostnames answer 200, but they resolve to different API Gateway deployments, so they are not aliases.

As the page now stands, an admin who allowlists only ping.flowfuse.com gets telemetry failing silently on every current release. Options as I see them:

  1. List both hostnames in the row, so the allowlist survives the switch.
  2. Move the default in code first, then the docs follow.

Which would you prefer? Happy to list both here and open a separate issue for the code default.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ppawlowski this needs your view again :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any flowforge.com reference should not be used in publicly available documents.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ppawlowski did you see this:

As the page now stands, an admin who allowlists only ping.flowfuse.com gets telemetry failing silently on every current release. Options as I see them:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My statement about avoiding the use of the old company name/domain name in the documentation remains.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ppawlowski Got it, merging. In that case, "elemetry failing silently", I'll take is a non-problem to be solved. If it actually is an issue, please open up an issue that we can solve separately.

Comment thread docs/install/networking-requirements.md Outdated

@ppawlowski ppawlowski left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my comments; none of them are blockers, though.

- introduction.md: replace the Networking requirements section with a
  one-sentence pointer, so the overview page carries no detail of its own.
- telemetry: move the row out of "Always required" into the conditional
  table and state that a blocked post is only logged, since the ping runs
  as a background task and does not stop the platform.
- telemetry: use ping.flowfuse.com rather than the legacy domain.
- GitOps: split the single GitHub row into GitHub, Azure DevOps and any
  other HTTPS Git server, matching the three supported backends.
@dimitrieh

Copy link
Copy Markdown
Contributor Author

@dgatti0213 can you have a look here as well. See if it aligns from your side as well

@dimitrieh
dimitrieh merged commit 41e1a63 into main Sep 9, 2026
15 checks passed
@dimitrieh
dimitrieh deleted the docs-self-hosted-networking-requirements branch September 9, 2026 09:44
dgatti0213 added a commit to FlowFuse/website that referenced this pull request Sep 15, 2026
…not just install

For self-hosted installs, "FlowFuse installed" is not the same as a ready
environment. If the environment can't reach the hosts FlowFuse needs to install
and update nodes/packages, the PoV stalls the first time someone adds a node — a
recent PoV lost a week to exactly this.

Strengthen gate #5 in both the Solution "What the SE produces" list and the
Pre-PoV checklist: the outbound access must be filed *and proven* during Solution,
and links to the Networking requirements docs page for the host list to hand the
customer's network team.

Depends on FlowFuse/flowfuse#8354, which adds /docs/install/networking-requirements
— keep this PR in draft until that merges (the link 404s until then).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KT4u2XgENWkw2Rm6oEXFXx
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.

6 participants