// the find
strukturag/nextcloud-spreed-signaling
Standalone signaling server for Nextcloud Talk.
Standalone WebRTC signaling server for Nextcloud Talk, written in Go. Handles the signaling layer (session management, room orchestration, presence) while leaving media transport to Janus gateway. This is the piece you need if you're running Nextcloud Talk at any real scale and want to offload signaling from the PHP app.
The clustering story is properly thought out — NATS for message distribution, gRPC for inter-node communication, etcd for dynamic cluster membership, and a separate proxy layer for Janus fan-out. That's a real architecture, not bolted-on afterthought. Test coverage is extensive and uses real infrastructure (embedded NATS, embedded etcd in tests) rather than mocks, which catches the actual failure modes. The proxy binary is a clean design: each Janus instance gets its own proxy process, isolated from the signaling server, with RSA-token auth between them. Prometheus metrics are first-class throughout — every subsystem (hub, rooms, gRPC client/server, HTTP pool) exports its own metrics file.
The dependency on Janus is a significant constraint — Janus is notoriously painful to operate, requires its own event handler WebSocket wiring back to this server, and the README warning about Janus queuing unbounded events on reconnect is a real production hazard. There's no native SFU; this project is purely a signaling layer, so you're always running at least three processes (NATS, Janus, signaling) before you have anything working. The etcd dependency for dynamic config adds operational weight that most Nextcloud self-hosters won't want. Outside the Nextcloud Talk ecosystem this is essentially useless — the protocol is tightly coupled to Nextcloud's backend authentication and room model.