Icecast в Docker Compose: готовый файл
Если вы хотите поднять собственное интернет-радио, ретранслировать эфир из другого источника или просто раздавать аудиопоток небольшой аудитории без зависимости от сторонних платформ — рано или поздно упрётесь в Icecast. Это тот редкий случай в мире серверного софта, когда протокол и базовая архитектура не менялись почти два десятилетия: Icecast 2.x, вышедший ещё в середине 2000-х, работает по сей день практически без изменений в том, как источник (source) подключается к серверу и как слушатели забирают поток. Ниже — рабочий docker-compose.yml, который поднимает Icecast с нуля, плюс разбор mount points, авторизации и типичных грабель при подключении источника через ffmpeg.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему именно Icecast, а не Shoutcast или собственный RTMP
Icecast и Shoutcast исторически делили один и тот же рынок интернет-радио, но у Icecast есть решающее преимущество для тех, кто ставит сервер сам: он открытый, бесплатный без ограничений на количество mount points и умеет отдавать сразу несколько потоков с одного сервера — это удобно, если вы вещаете, скажем, основной канал и запасной с другим битрейтом одновременно. Shoutcast v2 тоже стал бесплатным, но его конфигурация и экосистема плагинов заметно более закрытые.
RTMP-серверы (тот же nginx-rtmp) — это другая история: они заточены под видео и live-стриминг с низкой задержкой, а Icecast — под классическое аудиовещание с широкой поддержкой плееров: любой браузер, VLC, встроенные плееры на сайтах, старые аппаратные ресиверы интернет-радио — все понимают HTTP-поток Icecast без танцев с бубном. Если вам нужно именно аудио и совместимость с максимальным числом клиентов — это его ниша.
Структура проекта
Разложим файлы так, чтобы конфиг, логи и веб-статика были разделены и монтировались отдельными volume:
icecast/
├── docker-compose.yml
├── config/
│ └── icecast.xml
├── logs/
└── web/
mkdir -p icecast/{config,logs,web}
cd icecast
Папка logs/ даёт возможность смотреть access- и error-логи прямо с хоста без захода внутрь контейнера, а web/ — это опциональная директория со статическими страницами (стартовая страница сервера, favicon), которую Icecast отдаёт по корневому пути, если вы её настроите.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Используем образ moul/icecast — один из самых поддерживаемых на Docker Hub на момент написания статьи (конец августа 2026); если у вас уже есть предпочтения по образу или своя сборка — принцип конфигурации от этого не меняется, важен сам файл icecast.xml.
services:
icecast:
image: moul/icecast:latest
container_name: icecast
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- ./config/icecast.xml:/etc/icecast.xml:ro
- ./logs:/var/log/icecast2
- ./web:/usr/share/icecast2/web
environment:
- TZ=Europe/Moscow
networks:
- icecast_net
networks:
icecast_net:
driver: bridge
Порт 8000 — это порт по умолчанию, на котором Icecast принимает и HTTP-запросы слушателей, и подключения источников. При желании его можно сменить на любой свободный, но тогда не забудьте поменять его в icecast.xml и во всех настройках источников синхронно — рассинхрон портов между compose-файлом и конфигом внутри контейнера — самая частая причина «сервер не отвечает» на этом шаге.
Конфигурация icecast.xml: пароли и лимиты
Файл config/icecast.xml — сердце всей настройки. Вот рабочий минимальный конфиг с комментариями к ключевым секциям:
<icecast>
<location>Earth</location>
<admin>admin@example.com</admin>
<limits>
<clients>200</clients>
<sources>5</sources>
<queue-size>524288</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-size>65536</burst-size>
</limits>
<authentication>
<source-password>ChangeMeSourcePass123!</source-password>
<relay-password>ChangeMeRelayPass123!</relay-password>
<admin-user>admin</admin-user>
<admin-password>ChangeMeAdminPass123!</admin-password>
</authentication>
<hostname>radio.example.com</hostname>
<listen-socket>
<port>8000</port>
<bind-address>0.0.0.0</bind-address>
</listen-socket>
<fileserve>1</fileserve>
<paths>
<basedir>/usr/share/icecast2</basedir>
<logdir>/var/log/icecast2</logdir>
<webroot>/usr/share/icecast2/web</webroot>
<adminroot>/usr/share/icecast2/admin</adminroot>
<alias source="/" destination="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>3</loglevel>
<logsize>10000</logsize>
</logging>
<security>
<chroot>0</chroot>
</security>
</icecast>
Три пароля — source-password, relay-password и admin-password — обязательно смените на свои перед запуском, иначе любой, кто найдёт ваш сервер сканером портов, сможет подключиться как источник и перебить ваш эфир своим. clients — общий лимит одновременных слушателей на всех mount points, sources — сколько независимых потоков может быть подключено параллельно.
Mount points: несколько потоков с одного сервера
Icecast не требует явного описания mount point в конфиге — источник сам объявляет путь при подключении (например, /stream или /radio.mp3), и сервер создаёт точку монтирования на лету. Но если вам нужен предсказуемый контроль — сколько слушателей на конкретный поток, публичный он или скрытый, — можно задать его явно:
<mount>
<mount-name>/stream</mount-name>
<max-listeners>150</max-listeners>
<public>1</public>
<stream-name>Мое радио</stream-name>
<stream-description>Круглосуточное вещание</stream-description>
<stream-url>https://radio.example.com</stream-url>
<genre>various</genre>
</mount>
public>1 означает, что поток попадёт в публичный YP-каталог Icecast (если вы включили trasmit туда через <directory> секцию) — для приватного вещания для своей аудитории эту опцию лучше держать выключенной, чтобы не светить ссылку на потоки для случайных слушателей.
Запуск и первая проверка
Запускаем контейнер:
docker compose up -d
docker compose logs -f icecast
Если в логах нет ошибок парсинга XML (частая причина — незакрытый тег или неэкранированный & в пароле), сервер уже слушает 8000-й порт. Проверяем через браузер или curl:
curl -I http://ваш_ip:8000/
Ответ 200 OK со статусной страницей Icecast означает, что сервер жив. Админка доступна по адресу http://ваш_ip:8000/admin/ — логин и пароль те, что вы указали в admin-user/admin-password.
Подключение источника через ffmpeg
Самый практичный способ завести поток на Icecast — ffmpeg, он есть почти на любом Linux-сервере и умеет стримить в Icecast нативно через libshout или напрямую через протокол HTTP PUT (в зависимости от сборки). Вариант с трансляцией из файла (например, зацикленный плейлист) для тестового вещания:
ffmpeg -re -i playlist.m3u -acodec libmp3lame -ab 128k -ac 2 -ar 44100 \
-content_type audio/mpeg \
-f mp3 icecast://source:ChangeMeSourcePass123!@ваш_ip:8000/stream
Флаг -re критичен — он заставляет ffmpeg читать файл со скоростью реального времени, а не залить его на сервер за секунду и завершиться. Без него источник отключится сразу после отправки данных, и слушатели услышат обрыв.
Если источник — не файл, а живой микрофон или линейный вход через ALSA/PulseAudio на том же сервере или домашней машине:
ffmpeg -f pulse -i default -acodec libmp3lame -ab 128k \
-content_type audio/mpeg \
-f mp3 icecast://source:ChangeMeSourcePass123!@ваш_ip:8000/live
Для более стабильного протокола вещания (например, при нестабильном исходящем канале у источника) многие используют BUTT (Broadcast Using This Tool) или Liquidsoap вместо ffmpeg — они умеют переподключаться при обрыве и буферизовать эфир, что для 24/7-вещания зачастую важнее, чем гибкость ffmpeg. Разбор Liquidsoap-плейлистов — тема отдельной статьи, здесь достаточно знать, что путь mount point и логин/пароль работают у них так же, как в примере выше.
Firewall и сетевые нюансы
Открываем 8000-й порт (или тот, что вы указали в конфиге) в firewall — если у вас уже настроен ufw на сервере, команда простая:
ufw allow 8000/tcp
Если планируете отдавать поток через свой домен с SSL (а для современных браузеров и мобильных плееров это уже почти обязательное требование — многие блокируют autoplay и Web Audio API для незащищённых источников), Icecast сам TLS не терминирует в базовой конфигурации. Практичный путь — поставить перед ним nginx или Caddy как реверс-прокси с автоматическим сертификатом через Let's Encrypt, и проксировать запросы на 127.0.0.1:8000, оставляя порт Icecast закрытым для внешнего мира — открытым остаётся только 80/443 у прокси.
Частые проблемы при первом запуске:
| Симптом | Причина | Решение | |
|---|---|---|---|
| ffmpeg сразу отключается от сервера | Неверный source-password или занятый mount point другим источником | Сверить пароль в icecast.xml, проверить /admin/ на активные подключения | |
| Слушатели слышат обрывы каждые несколько минут | Нестабильный аплинк источника или слишком маленький burst-size | Увеличить queue-size/burst-size, перейти на Liquidsoap с буферизацией | |
| Браузер не проигрывает поток без прокси | Смешанный контент — сайт на HTTPS, поток на HTTP | Поднять reverse-proxy с SSL перед Icecast | |
| Порт занят при старте контейнера | Другой сервис (Shoutcast, старый Icecast) уже слушает 8000 | `ss -tulpn \ | grep :8000`, освободить порт или сменить в конфиге |
Бэкап конфигурации и логов
Сам Icecast не хранит состояние вещания — его нечего бэкапить в привычном смысле, всё живое вещание идёт через сокет от источника к слушателям и не сохраняется на диск, если вы не настроили отдельно запись потока. Но конфиг стоит держать под git, как и с любым другим сервисом в Docker:
cd icecast
git init
git add config/
git commit -m "initial icecast config"
Если вы уже используете что-то вроде BorgBackup в Docker Compose для других сервисов на сервере, добавить папку config/ в существующий бэкап-джоб — вопрос одной строчки в списке источников архивации, отдельный сервис под это заводить не нужно. Если же вы захотите архивировать сами эфиры (записывать поток на диск для последующего прослушивания), проще всего запустить параллельно cron-задачу с ffmpeg, слушающим ваш собственный mount point и пишущим в файлы с ротацией по времени — но это уже отдельный слушатель, а не бэкап сервера как такового.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли Icecast в Docker или проще поставить его пакетом из репозитория?
В Docker версия предсказуема, конфиг переносится между серверами одной папкой, а откат к предыдущему образу — секундное дело. Пакет из репозитория Debian/Ubuntu часто заметно старее актуальной ветки Icecast, и обновление системы иногда тянет за собой рестарт сервиса в неудобный момент.
Сколько слушателей выдержит один VPS?
Зависит от битрейта потока и канала сервера, а не от CPU — Icecast сам по себе лёгкий процесс. Ориентировочно: при битрейте 128 kbps и канале в 100 Мбит/с теоретический потолок — несколько сотен одновременных слушателей, но на практике стоит закладывать запас и следить за исходящим трафиком, у части тарифов он лимитирован.
Можно ли ретранслировать чужую радиостанцию через свой Icecast?
Да, это называется relay — в секции <relay> конфига указывается адрес исходного потока, и ваш сервер работает как зеркало. Учитывайте авторские права на транслируемый контент — это ваша ответственность, а не техническое ограничение Icecast.
Как защитить сервер от подбора source-password?
Пароль в конфиге — это по сути единственный барьер, поэтому используйте длинный случайный пароль и рассмотрите fail2ban с правилом на частые неудачные подключения к 8000-му порту, если видите в логах перебор.
Что делать, если нужен именно видеостриминг, а не аудио?
Icecast для видео не предназначен — для RTMP/HLS-вещания стоит смотреть в сторону nginx-rtmp или специализированных решений, Icecast здесь не заменит их функциональность.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →