Skip to main content
The browser needs to know where your signaling server is. It works that out when the page loads, so changing the address takes effect on a restart with no image rebuild.

Resolution order

The first match wins.
GET /api/config is served by the client, not the signaling server. If both sit behind one reverse proxy, do not route all of /api/ to the server, or step 3 always returns 404 and any SOCKET_URL you set is silently discarded in favor of step 4. With an empty SOCKET_URL step 4 is the answer you wanted anyway, so the mistake stays invisible until the day you set one. See Run Floe Behind One Domain for the exact-path rule that keeps /api/config on the client.

Changing the address

Set it in .env and recreate the container. No rebuild:
Terminal
Docker Compose maps your NEXT_PUBLIC_SOCKET_URL value to the container’s SOCKET_URL, so the variable name in .env has not changed.
Leave the value empty when the client and the signaling server share one origin behind a reverse proxy. The browser then talks to whatever host it was loaded from, so there is nothing to configure and nothing to keep in sync.

The address is used by the browser, not the server

Whatever you set has to be reachable from your users’ browsers, not from inside the container. http://localhost:3001 only works when the browser runs on the same machine as the server. For anything else use the server’s LAN IP or public domain.

What is still build-time

NEXT_PUBLIC_SITE_URL is genuinely build-time. It feeds canonical links, Open Graph tags, and the sitemap, which are rendered into the page rather than fetched. That is the one value a shared image cannot carry, because it would have to know which domain it will be served from before anyone downloads it. So the published image omits those tags rather than pointing them at floe.one, which would mean every self-hosted instance advertising somebody else’s site as its canonical. To put your own domain in them, build the client yourself:
Terminal
This affects only SEO and link previews. Transfers, signaling, and the relay are unaffected, and all of those are configured at runtime. See Container Images.