Multi-Station Setup
Each station in br\u016bhi Cloud is a fully independent broadcast unit with its own Liquidsoap process, Icecast mountpoint, and configuration.
Station Concept
Section titled “Station Concept”Think of each station as a separate radio channel. Station 1 might be your main pop music station; Station 2 your jazz channel; Station 3 a news talk format. Each runs independently — DJs select which station they want to broadcast on at login.
Port Allocation
Section titled “Port Allocation”Stations use a fixed port formula. For station number N (1-based):
| Service | Port | Example (N=1) | Example (N=2) |
|---|---|---|---|
| Harbor (HTTP ingest) | 8100 + N − 1 | 8100 | 8101 |
| Liquidsoap telnet | 2000 + N − 1 | 2000 | 2001 |
| Icecast mount | /station-N.mp3 | /station-1.mp3 | /station-2.mp3 |
The Icecast server listens on port 8005 by default. Listeners connect to:
http://your-server:8005/station-1.mp3http://your-server:8005/station-2.mp3Opening Ports for Multiple Stations
Section titled “Opening Ports for Multiple Stations”If you run more than one station, expose the additional harbor ports in your docker-compose.yml:
services: bruhi: ports: - "8000:8000" # API + dashboard - "8005:8005" # Icecast - "8100:8100" # Station 1 harbor - "8101:8101" # Station 2 harbor - "8102:8102" # Station 3 harborCreating a Station
Section titled “Creating a Station”Via API
Section titled “Via API”POST /api/stationsContent-Type: application/json
{ "name": "Jazz Radio", "description": "24/7 jazz and blues"}Response:
{ "id": 2, "name": "Jazz Radio", "status": "stopped", "harbor_port": 8101, "telnet_port": 2001, "icecast_mount": "/station-2.mp3"}Starting a Station
Section titled “Starting a Station”POST /api/stations/{id}/startThis starts the Liquidsoap process for the station. The station’s Icecast mountpoint becomes active and silence begins streaming immediately (fallback behaviour).
Stopping a Station
Section titled “Stopping a Station”POST /api/stations/{id}/stopStops the Liquidsoap process and closes the Icecast mountpoint.
Listing Stations
Section titled “Listing Stations”GET /api/stationsReturns all stations with their current status (running, stopped), harbor port, telnet port, and Icecast mount.
Station Selection in the Dashboard
Section titled “Station Selection in the Dashboard”When a DJ logs into the br\u016bhi Cloud dashboard, they are presented with a station selector after authentication. The selector shows:
- Station name
- Current status (on-air / offline)
- Number of active listeners (if Icecast stats are enabled)
The selected station is stored in the browser’s localStorage so the DJ’s station preference persists across sessions.
Per-Station Configuration
Section titled “Per-Station Configuration”Each station has its own independent configuration stored in the station database:
| Configuration | Scope |
|---|---|
| Playlist and queue | Per-station |
| Soundboard (cart wall) | Per-station |
| Automation rules | Per-station |
| Broadcast outputs | Per-station |
| Recordings | Per-station |
Changing the playlist or output config on Station 1 has no effect on Station 2.
Station Discovery
Section titled “Station Discovery”br\u016bhi Cloud auto-discovers all running stations from the Docker Compose service list. If you use Docker Swarm or Kubernetes, stations are discovered from the orchestrator API. See Scaling.