Backend Streaming Architecture
Click any node for details
Node.js 20 WebRTC / mediasoup Icecast Socket.io
① Client Layer
🎛
DJ Browser / App
Captures audio via Web Audio API. Sends via WebRTC.
WebRTCgetUserMediaOpus
📱
Listener App
iOS / Android. Tunes in via Icecast HTTP stream.
React Nativeexpo-avSocket.io
🌐
Listener Web
Browser-based player using HTML5 Audio element.
HTML5 AudioHLS.js
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.
TLS 1.3HTTP/2Rate limit
📡
STUN / TURN
NAT traversal for WebRTC. Coturn for TURN fallback behind strict NAT.
coturnICE candidates
proxy_pass
signaling WS
③ Core Application Layer
Express API
REST endpoints for auth, streams, DJs, analytics. JWT-protected.
Express 4JWTJoiHelmet
🔌
Socket.io
Real-time: chat, listener counts, requests, DJ events. 3 namespaces.
/stream/dj/discovery
🎚
mediasoup SFU
Selective Forwarding Unit. Receives DJ's WebRTC audio, pipes to Icecast via RTP.
SFUOpusRTP
RTP / PlainTransport
FFmpeg transcode
④ Streaming Layer
🎬
FFmpeg
Opus → MP3/AAC transcoding. Spawned per live stream. 192kbps output.
libmp3lame192kbps44.1kHz
📻
Icecast 2
Streams audio to unlimited concurrent listeners. Mount: /live/{streamId}
MP32000 clients:8000
read/write
HSET / GET / INCR
PUT recording
⑤ Data & Storage Layer
🐘
PostgreSQL 16
Users, DJs, streams, follows, analytics. Primary datastore.
pg-pool:5432migrations
Redis 7
Listener counts, chat history, song requests, DJ live status, refresh tokens.
ioredis512MB:6379
☁️
AWS S3
Set recordings (post-stream). DJ avatars, cover images. Pre-signed URLs.
aws-sdkpre-signedus-east-1
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)
Docker Services
nxondeck_api :4000
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