The short version
Download the two templates into Unraid’s user templates folder, then add Floe-Server and Floe-Client from Add Container. Start with direct LAN access: it needs no proxy, and each template then holds the other’s address. Move to a domain later, once the LAN install works.Before you start
Start with direct LAN access. It needs nothing but the two containers, and you can move to a domain later. The three layouts:Add the templates to Unraid
Floe’s templates are not in Community Applications, so a search on the Apps tab does not find them. Put the two template files in Unraid’s user templates folder yourself, then start each container from Add Container. These steps are for Unraid 6.10.0 and later, which has no field for a template address.Open a terminal on the server
>_ at the top
right. SSH as root works too.Download both templates
.xml file in that folder. The my-<Name>.xml form is the
name Unraid gives a template it saves, so your settings go back into the same
file.Open Add Container
Pick the template
Fill in the fields and apply
Direct LAN installation
Install Floe-Server
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:0 for direct access.Install Floe-Client
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: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 server.Open and test Floe
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, which is how the template ships it, and the browser talks to whatever origin served the page. A Floe-Client added from an earlier copy of the template holds the placeholderhttp://YOUR-UNRAID-IP:3001 there, as its value
and as its default, and Unraid puts a default back whenever its field is empty. On such a container
turn on Advanced View, click Edit beside the field, and clear Default Value as well.
This layout needs path rules in your proxy, written by hand. If your proxy makes that hard, the
two-hostname layout below needs none.
Proxy the domain to Floe-Client
https://floe.example.com to the Floe-Client host port for everything
except the signaling paths.Proxy the signaling paths to Floe-Server
/socket.io/, /ws, /api/, and /health to the Floe-Server host port.Keep the config route on the client
/api/config back to the client, as an exception to the /api/ rule
above.Set Client URL to the domain
https://floe.example.com.Set Trusted Proxy Count
1 for a single reverse proxy.Clear Signaling Server URL
/api/config went,
are in Run behind one domain.
Two hostnames behind a reverse proxy
Use HTTPS for anything reachable outside your trusted LAN. Proxy the client and server separately, and enable WebSocket forwarding for the server.Proxy the client hostname
Proxy the signaling hostname
Set Client URL to the client origin
Count the proxy hops
Set Signaling Server URL
Keep the hostname in the Host header
Host header when proxying the signaling hostname.
The CLI and Floe Desktop connect to the signaling hostname, which
is not your Client URL. The server lets them in by matching their Origin
against Host, so a proxy that rewrites Host to the container address gets
them refused with a 403.The CLI and Floe Desktop
Both connect to the signaling server, so give them the Floe-Server address. On the direct LAN and two-hostname layouts the web client lives at a different address, and the share links both apps hand out have to carry it:TURN relay
The default configuration has no relay and works on many networks: it hands clients public STUN servers only. To support peers behind strict NAT or CGNAT, add a TURN relay. In the Floe-Server template, turn on Advanced View and fill in Cloudflare TURN Key ID and Cloudflare TURN API Token with a Cloudflare Realtime TURN key. You can also run coturn separately and fill in Self-hosted TURN Domain and Self-hosted TURN Secret instead. If that coturn has no TLS certificate, set Self-hosted TURN TLS tooff. A
Floe-Server added from a template older than 1.11.1 has no such field: add a Variable with the key
TURN_TLS and the value off instead. See TURN relay.
Request links on Unraid
A request link lets someone send files to a Floe Desktop that waits for them. Request links stay off until a policy file turns them on.Set the policy folder
/mnt/user/appdata/floe/policy. The template mounts it at
/app/policy, read-only. Map the folder, not the file: an edit puts a new file in place of
the old one, and a mount of the file alone keeps showing the old one.Create the policy file
policy.json in that folder containing {"requestLinks": true}. The server
runs as the unprivileged user node, not as root, so that user has to be able to read the
folder and the file. A folder and a file that every user can read work. A file it cannot read
is logged as policy file unreadable, keeping previous policy, and request links stay off.Name the file
/app/policy/policy.json, then click Apply./app/policy read-only, and a Variable with the key POLICY_FILE. To turn request links
off again, and for what the server logs, see Turn on request links.
The page a sender opens shows Report this link only when the Floe-Client template’s advanced
Request Link Report Email field holds an address you read. A Floe-Client added from a template
older than 1.11.1 has no such field: add a Variable with the key REQUEST_REPORT_EMAIL instead. See
Sending to a link on your server.
Other settings
The Floe-Server template has fields for the client URL, the proxy count, and the two connection limits (Maximum Connections Per IP and Maximum Open Connections Per IP). It also has the TURN options, the stats database (Upstash Redis REST URL and Upstash Redis REST Token), and the policy folder and file. Every field but the first two and Signaling Port shows only in Advanced View. Any other server variable in Configuration, such asMAX_TURN_REQUESTS_PER_IP, has no field: add a Variable with that key to Floe-Server. A
Floe-Server added before the template gained Maximum Open Connections Per IP has no such field
either: add a Variable with the key MAX_SOCKETS_PER_IP instead.
Container updates
Both templates follow thelatest 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. The one thing to keep is the policy
folder, if you added one for request links.
Update Floe-Client to 1.12.0 before Floe Desktop 1.1 reaches your users. Every request link Floe
Desktop 1.1 and later makes holds a link key, and an older client reads that
as an incomplete link. The Microsoft Store updates Floe Desktop on its own, and a container here
moves only when you apply its update. See
Keep the client and server on one version.
To pin a version, change the tag at the end of each template’s Repository field, for example
ghcr.io/jannskiee/floe-server:latest to ghcr.io/jannskiee/floe-server:1.12.1. Change both
templates to the same version, because the client and the server should match. The tags you can
use are in Container images.
If something goes wrong
- The client loads and the badge stays on Offline: see The browser cannot connect to my signaling server.
- The CLI or Floe Desktop is refused on the two-hostname layout: see The Test button says the realtime connection was refused.
- Request links will not turn on: see Request links are off on this server.