① Client Layer
DJ Browser / App
Captures audio via Web Audio API. Sends via WebRTC.
Listener App
iOS / Android. Tunes in via Icecast HTTP stream.
Listener Web
Browser-based player using HTML5 Audio element.
443
HTTPS/WSS
8000
Icecast
UDP
40k–49k
WebRTC ICE/DTLS
HTTP audio stream
WebSocket
② Edge / Gateway Layer
Nginx
Reverse proxy, TLS termination, WebSocket upgrade, rate limiting, static serving.
STUN / TURN
NAT traversal for WebRTC. Coturn for TURN fallback behind strict NAT.
proxy_pass
signaling WS
③ Core Application Layer
Express API
REST endpoints for auth, streams, DJs, analytics. JWT-protected.
Socket.io
Real-time: chat, listener counts, requests, DJ events. 3 namespaces.
mediasoup SFU
Selective Forwarding Unit. Receives DJ's WebRTC audio, pipes to Icecast via RTP.
RTP / PlainTransport
FFmpeg transcode
④ Streaming Layer
FFmpeg
Opus → MP3/AAC transcoding. Spawned per live stream. 192kbps output.
Icecast 2
Streams audio to unlimited concurrent listeners. Mount: /live/{streamId}
read/write
HSET / GET / INCR
PUT recording
⑤ Data & Storage Layer
PostgreSQL 16
Users, DJs, streams, follows, analytics. Primary datastore.
Redis 7
Listener counts, chat history, song requests, DJ live status, refresh tokens.
AWS S3
Set recordings (post-stream). DJ avatars, cover images. Pre-signed URLs.
Select a Node
Click any component above
Full Signal Path
DJ Browser
↓ WebRTC/Opus
mediasoup SFU
↓ PlainTransport RTP
FFmpeg transcode
↓ SOURCE protocol
Icecast mount /live/{id}
↓ HTTP audio stream
Listeners (app + web)
↓ WebRTC/Opus
mediasoup SFU
↓ PlainTransport RTP
FFmpeg transcode
↓ SOURCE protocol
Icecast mount /live/{id}
↓ HTTP audio stream
Listeners (app + web)
Docker Services
nxondeck_api :4000
nxondeck_icecast :8000
nxondeck_postgres :5432
nxondeck_redis :6379
nxondeck_nginx :80/:443
nxondeck_icecast :8000
nxondeck_postgres :5432
nxondeck_redis :6379
nxondeck_nginx :80/:443
Socket.io Events
listener:join → join room
chat:send → broadcast
stream:golive → DJ live
request:submit → song req
listeners:update → count
stream:ended → teardown
chat:send → broadcast
stream:golive → DJ live
request:submit → song req
listeners:update → count
stream:ended → teardown