floe.one. The setup uses Docker Compose so the full stack comes up with a single command.
What you are hosting
The signaling server brokers WebRTC connection setup (offer, answer, ICE candidates) and issues short-lived TURN credentials. File data never passes through it. Transfers go peer-to-peer over encrypted WebRTC data channels. TURN is optional and only relays (still encrypted) traffic when a direct connection is not possible.Components
Those are the ports inside the containers. In production you normally put both
behind a single domain, so your users never see either one. See
Reverse Proxy.
Who can connect
One instance serves every Floe client. They share one wire protocol, so any two of them can transfer with each other on your server.
Both peers must be on the same server. Servers do not talk to each other.
CLIENT_URL governs browser traffic only. CLI and desktop peers connect over /ws,
which performs no origin check, so they reach your server regardless of that setting.
Contents
Quick Start
Get the stack running with Docker Compose in minutes.
Container Images
The prebuilt images on ghcr.io: tags, pinning a version or digest, and supported architectures.
Unraid
Install the client and signaling server from the two Unraid Community Applications templates.
Configuration
Environment variable reference for all settings.
How the Client Finds the Signaling Server
Runtime
SOCKET_URL resolution, and the one value that is still baked in at build time.Reverse Proxy
Serve the client and signaling server from one domain, with Caddy and nginx examples.
Production Deployment
HTTPS, custom domains, and the two-subdomain layout.
TURN Relay
Use Cloudflare’s managed TURN or add coturn to support peers behind strict NAT or CGNAT.
Operations
Day-to-day commands, updates, and health checks.
Without Docker
Run the client and signaling server straight from Node.