Skip to main content
Floe is published as two containers because the web client and signaling server have separate network and security settings. Install both templates for a working instance. Both templates pull the same multi-architecture images the Docker Compose stack uses, so amd64 and arm64 Unraid hosts are covered by the same template and nothing is built on your server. See Container Images.

Before you start

Choose how browsers will open Floe:
  • Direct LAN access: two host ports on your Unraid IP, for example http://192.168.1.10:3000 for the client and http://192.168.1.10:3001 for the signaling server.
  • One domain behind a reverse proxy: everything on https://floe.example.com. This is the recommended layout for anything reachable outside your LAN.
  • Two hostnames behind a reverse proxy: https://floe.example.com for the client and https://floe-api.example.com for the signaling server.
The exact client origin matters in all three, because the signaling server uses it as its CORS allow-list entry.

Direct LAN installation

1

Install Floe-Server

Install the Floe-Server template first. Keep Signaling Port at 3001 unless that host port is already used.Set Client URL to the URL that browsers will use for the client. With the default client port, an example is:
Client URL
Keep Trusted Proxy Count at 0 for direct access.
2

Install Floe-Client

Install the Floe-Client template. Keep Web UI Port at 3000 unless it conflicts with another container.Set Signaling Server URL to the full origin browsers use to reach Floe-Server, including the scheme and the host port, with no trailing slash:
Signaling Server URL
That value is the container’s SOCKET_URL. The client hands it to the browser from GET /api/config on every page load, so changing it later takes a container restart and never a rebuild. See How the Client Finds the Signaling Server.
3

Open and test Floe

Open the Floe-Client Web UI. Confirm that the connection indicator is online, then create a link and open it in a second browser or device.
The two templates hold each other’s addresses, so a port change is never a one-sided edit. Change the Floe-Client host port and Floe-Server Client URL has to carry the new port. Change the Floe-Server host port and Floe-Client Signaling Server URL has to match it. A mismatch looks like a client that loads perfectly and never connects.

One domain behind a reverse proxy

Put both containers behind a single hostname and there is no signaling address to keep in sync at all. Leave Floe-Client Signaling Server URL empty, and the browser talks to whatever origin served the page.
  1. Proxy https://floe.example.com to the Floe-Client host port for everything except the signaling paths.
  2. Proxy /socket.io/, /ws, /api/, and /health to the Floe-Server host port.
  3. Proxy /api/config back to the client, as an exception to the /api/ rule above.
  4. Set Floe-Server Client URL to https://floe.example.com.
  5. Set Floe-Server Trusted Proxy Count to the number of proxy hops, which is 1 for a single reverse proxy.
  6. Leave Floe-Client Signaling Server URL empty.
Step 3 is the one people miss. GET /api/config is served by the client, not the signaling server. Route all of /api/ to the server and that request returns 404, so any Signaling Server URL you set is silently discarded and the browser falls back to its own origin. On this layout that fallback is the answer you wanted anyway, so the mistake stays invisible until the day you set a value and it does nothing.
Copy-pasteable Caddy and nginx configurations for exactly this routing, including the exact-path rule that keeps /api/config on the client, are in Run Floe Behind One Domain.

Two hostnames behind a reverse proxy

Browsers require HTTPS for production use outside your trusted LAN. Proxy the client and server separately, and enable WebSocket forwarding for the server.
  1. Proxy the client hostname to the Floe-Client host port.
  2. Proxy the signaling hostname to the Floe-Server host port.
  3. Set Floe-Server Client URL to the public HTTPS client origin.
  4. Set Floe-Server Trusted Proxy Count to the number of proxy hops.
  5. Set Floe-Client Signaling Server URL to the complete public HTTPS server origin.
For example:
Template values

TURN relay

The default STUN-only configuration works on many networks. To support peers behind strict NAT or CGNAT, expand the advanced Floe-Server settings and add a Cloudflare Realtime TURN key. You can also run coturn separately and fill in the self-hosted TURN domain and secret. See TURN Relay.

Container updates

Both templates follow the latest image tag, which changes only when Floe publishes a version tag. Use Unraid’s normal container update flow to pull a new release. The containers store no files or application settings in volumes, so there is no appdata directory to migrate. To pin a specific version or a digest instead, see Container Images.