Skip to main content
You can self-host the entire Floe stack independently of 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.