Skip to main content 41q.ru

Как Настроить Сайт И Поток Для Онлайн Радио С Https

Задача, в общем-то тривиальная, но некоторые сложности возникли с ssl для Айскаста, о чём я и хотел бы рассказать ниже.

Диаграмма деплоя
На весь экран / посмотреть исходник диаграммы (diagrams.net)

Софт

  • Docker
  • Icecast
  • Nginx
  • Certbot

Процесс настройки

Докер лучше ставить по-инструкции от разработчиков.

Айскаст ставим в образе от команды Либретайм:

bash code snippet start

docker pull libretime/icecast:2.4.4-alpine

bash code snippet end

Конфиг для Айскаста положил по адресу /usr/local/share/icecast-server.xml1. Более чем избыточное описание параметров доступно в мануале Айскаста. Ssl настроим позже, после получения сертификата.

создать папку для логов:

bash code snippet start

mkdir /var/log/icecast

bash code snippet end

разрешить в неё писать:

bash code snippet start

chmod 777 /var/log/icecast/

bash code snippet end

Запускаем Айскаст через Докер командой:

bash code snippet start

docker run -d \
  -p 8000:8000 \
  -v /usr/local/share/icecast - conf.xml:/etc/icecast.xml \
  -v /var/log/icecast:/var/log /icecast \
  libretime/icecast:2.4.4-alpine

bash code snippet end

На данном этапе, можно уже подключиться к Айскасту и начать вещать.

Html-страничку с описанием потока, веб-плеером, стили и картинки я положил в /var/www/html. Как поставить и сконфигурировать Докер образ Энжинкса хорошо написано в блоге Докера.

Как получить ssl-сертификат, чтобы nginx начал работать по https и как это настроить, подробно рассказано у DigitalOcean.

Те самые сложности

В принципе, после всего что сделано выше, html-страничка начнет отдаваться по https. Но вот включить поток через плеер на сайте будет нельзя! Айскаст работает по http, а веб-браузер не разрешает на странице загруженной по https обращаться за http-содержимым. Чтобы заставить работать Айскаст по http с выпущенным сертификатом, надо с ним совершить некоторые манипуляции.

Icecast ожидает, что публичный и приватный ключи будут в одному .pem файле. Пример файла:

code snippet start

root@ubuntu22:/usr/local/share# cat  certbot-etc/live/адрес_сайта/bundle.pem
-----BEGIN CERTIFICATE-----
MIIELTCCAxWgAwIBAgISBOIzytOo4K4YP8hW9wClvI7iMA0GCSqGSIb3DQEBCwUA
...
YyoNWmQ5524cw5bKLRYTiDSG0fAIk53U4G+ybSC60hkgNJa7mE+ZYCuckCx2KOWo
GAdKyIVuPE+PHslKj52H5GA=
-----END CERTIFICATE-----

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjiHZ3M59U3V+XVe8
...
9SBWiOa6CXCJmIXNYb5kLltWY9YZo0AV5bh06/qUs4scBAmf6JNQXmO6
-----END PRIVATE KEY-----

code snippet end

Для этого, внутри папки /usr/local/share/certbot-etc/live/адрес_сайта/ выполним команду:

bash code snippet start

cat cert.pem privkey.pem > bundle.pem

bash code snippet end

Я ещё между сертификатами в файле добавил пустую строчку. Идею про строчку подглядел на stackoverflow.

Caution
такой вот “склеенный” файлик не будет генериться самостоятельно, если настроить автоматическое обновление ключей через cron, как в инструкции от DigitalOcean. Я самостоятельно обновлял сертификаты и “клеил” этот файлик.

В конфиге Айскаста (icecast-conf.xml), надо проставить ssl у listen-socket

xml code snippet start

<listen-socket>
    <port>8443</port>
    <ssl>1</ssl>
</listen-socket>

xml code snippet end

также, в paths указать путь до сертификата (потом через докер свяжем с реальным путём до файлика):

xml code snippet start

<paths>
    <ssl-certificate>/usr/share/icecast/icecast.pem</ssl-certificate>
    <ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
</paths>

xml code snippet end

Теперь, запустить Айскаст с указанием сертификата:

bash code snippet start

docker run -d \
    -p 8000:8000 \
    -p 8443:8443 \
    -v /usr/local/share/icecast-server.xml:/etc/icecast.xml \
    -v /var/log/icecast:/var/log/icecast \
    -v /usr/local/share/certbot-etc/live/адрес_сайта/bundle.pem:/usr/share/icecast/icecast.pem \
    libretime/icecast:2.4.4-alpine

bash code snippet end

Логи ошибок Айскаста можно смотреть в файле /var/log/icecast/error.log

По-идее, этого должно быть достаточно, чтобы Айскаст начал работать через https, и ссылку на поток можно теперь указать на страничке сайта.

Может быть полезно

Как настроить Nginx + letsencrypt, но попроще?

Nginx + letsencrypt - более простая статья на хабре

А может настроить reverse proxy в nginx, чтобы не маяться с настройкой ssl в Icecast?

Разработчики айскаста не рекомендуют так делать

Если есть проблемы с настройкой ssl, везде пишут проверить - собран ли Icecast с поддержкой ssl. Как это сделать?

bash code snippet start

docker container exec icecast-ssl ldd /usr/bin/icecast | grep ssl

bash code snippet end

Я проверял - внутри контейнера Icecast c ssl.


  1. /usr/local/share : Local architecture-independent hierarchy. На Лоссте написали то же самое языком попроще ↩︎