Internet Radio Proxy
Relay internet radio streams from a Windows PC to a Raspberry Pi running Volumio on the local network, using Icecast2 as the local streaming server and Liquidsoap as the stream relay engine — both running in Docker.
Architecture
Internet Radio Stream
↓
[Liquidsoap container] ← pulls & relays the stream
↓
[Icecast2 container] ← serves it locally on port 8000
↓
Volumio (Raspberry Pi) ← connects to http://[PC-IP]:8000/radio
File Structure
Create this folder on your PC:
radio-proxy/
docker-compose.yaml
config/
icecast.xml
radio.liq
docker-compose.yaml
services:
icecast:
image: infiniteproject/icecast
container_name: icecast
ports:
- "8000:8000"
volumes:
- ./config/icecast.xml:/etc/icecast2/icecast.xml:ro
restart: unless-stopped
liquidsoap:
image: savonet/liquidsoap:2.2.5
container_name: liquidsoap
volumes:
- ./config/radio.liq:/etc/liquidsoap/radio.liq:ro
command: ["liquidsoap", "/etc/liquidsoap/radio.liq"]
depends_on:
- icecast
restart: unless-stoppedconfig/icecast.xml
<icecast>
<location>Home</location>
<admin>admin@localhost</admin>
<limits>
<clients>10</clients>
<sources>2</sources>
<queue-size>524288</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65536</burst-size>
</limits>
<authentication>
<!-- Password Liquidsoap uses to connect as a source -->
<source-password>CHANGE_ME_SOURCE</source-password>
<relay-password>CHANGE_ME_RELAY</relay-password>
<admin-user>admin</admin-user>
<admin-password>CHANGE_ME_ADMIN</admin-password>
</authentication>
<hostname>localhost</hostname>
<listen-socket>
<port>8000</port>
</listen-socket>
<http-headers>
<header name="Access-Control-Allow-Origin" value="*" />
</http-headers>
<paths>
<basedir>/usr/share/icecast2</basedir>
<logdir>/var/log/icecast2</logdir>
<webroot>/usr/share/icecast2/web</webroot>
<adminroot>/usr/share/icecast2/admin</adminroot>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>3</loglevel>
</logging>
<security>
<chroot>0</chroot>
</security>
</icecast>config/radio.liq
# Log level (1=critical, 2=error, 3=warning, 4=info)
settings.log.level := 3
# Pull the internet radio stream
# Replace this URL with your actual stream URL
radio = input.http("http://YOUR_STREAM_URL_HERE")
# Relay it to local Icecast2
# source-password must match icecast.xml
output.icecast(
%mp3(bitrate=128),
host="icecast",
port=8000,
password="CHANGE_ME_SOURCE",
mount="/radio",
name="My Radio Proxy",
description="Proxied internet radio stream",
radio
)Setup Steps
- Create the folder structure above on your PC
- Replace all
CHANGE_ME_*values inicecast.xmlandradio.liqwith real passwords - Replace
YOUR_STREAM_URL_HEREinradio.liqwith the actual radio stream URL - Open a terminal in the
radio-proxy/folder and run:docker compose up -d - Verify Icecast2 is running: open
http://localhost:8000in a browser — you should see the Icecast status page - Check that your stream is mounted at
http://localhost:8000/radio
Volumio Setup
- In Volumio, go to Browse → My Web Radio → Add Web Radio
- Add a new station with this URL:
http://[YOUR-PC-LOCAL-IP]:8000/radio - Find your PC’s local IP: run
ipconfigin Windows CMD and look for the IPv4 address on your local network adapter (usually starts with192.168.x.x)
Tip: Set a static IP or DHCP reservation for your PC so this URL never changes.
Adding More Stations
To proxy multiple streams, add additional output.icecast() blocks in radio.liq with different mount points (e.g., /jazz, /classical), and add each as a separate station in Volumio:
jazz = input.http("http://jazz-stream-url")
output.icecast(%mp3(bitrate=128), host="icecast", port=8000,
password="CHANGE_ME_SOURCE", mount="/jazz", jazz)
classical = input.http("http://classical-stream-url")
output.icecast(%mp3(bitrate=128), host="icecast", port=8000,
password="CHANGE_ME_SOURCE", mount="/classical", classical)Outstanding
- Identify the actual radio stream URL(s) to proxy
- Choose and set real passwords
- Find PC’s local IP and set static reservation on router
- Test end-to-end: Docker → Icecast → Volumio