Getting started
Self-hosting
One binary, no external dependencies to start. Run it with Docker for a quick deploy, or build from source when you need to vendor it.
Requirements
Section titled “Requirements”| To run the image | To build from source |
|---|---|
| Docker or any OCI runtime | Rust 1.79+ |
| No external services required | No CGO boundary — pure Rust in the media path |
Run with Docker
Section titled “Run with Docker”docker run -p 3000:3000 \
ghcr.io/lumyx-dev/sfu-core:latest
# signaling ws://127.0.0.1:3000/ws
# dashboard http://127.0.0.1:3000
Scale it out when you actually need to — a single process handles a room until concurrent peers or egress say otherwise.
Build from source
Section titled “Build from source”cargo add lumyx-sfu
# or run the workspace binary
cargo run -p lumyx-sfu --release
Rust 1.79+. The media path has no GC and no CGO boundary, so a release build behaves the same on your hardware as it does in the published image.
Configuration
Section titled “Configuration”Thresholds, alert destinations and remediation live in lumyx.toml next to the binary. Nothing
in it is required to start — every metric below already has a sane default.
# Thresholds are yours. These are the defaults.
[alerts.packet_loss]
above = 0.02
sustained_for = "30s"
severity = "breached"
notify = ["slack:#oncall", "pagerduty"]
[remediation]
auto_audio_only = true
Full field reference: Metrics reference.
Production checklist
Section titled “Production checklist”Put a reverse proxy in front for wss:// and https:// — the binary speaks plain ws/http.
In-memory retention only survives the process. Add Postgres or object storage to keep history past that.
Point your existing Prometheus at :3000/metrics — see the Prometheus endpoint reference.
Wire Slack, PagerDuty or a webhook before traffic arrives, not after the first threshold breach.