Hа главную

Как настроить сайт и поток для онлайн радио с https.

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

Софт

  1. Docker. Для простенького сервера который я собрался делать - использование докера скорее избыточно.
  2. Icecast - в качестве сервера для аудио-потока.
  3. Nginx - для отдачи статической веб-странички.
  4. Certbot - для получения ssl-сертификата

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

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

Icecast ставим в образе от команды libretime:

# docker pull libretime/icecast:2.4.4-alpine

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

Где расположить конфиги для серверов? Я положил в /usr/local/share/ руководствуясь Стандартом иерархии файловой системы. (а на Losst-e написали то же самое языком попроще)

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

# mkdir /var/log/icecast

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

# chmod 777 /var/log/icecast/

Запускаем Icecast через Docker командой:


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

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

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

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

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

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

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

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-----

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

# cat cert.pem privkey.pem > bundle.pem

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

!ВАЖНОтакой вот "склеенный" файлик не будет генериться самостоятельно, если настроить автоматическое обновление ключей через cron, как в инструкцииот DigitalOcean. Я самостоятельно обновлял сертификаты и "клеил" этот файлик.

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

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

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

<paths>
    <ssl-certificate>/usr/share/icecast/icecast.pem
    <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
</paths>

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

# 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/recordnsk.ru/bundle.pem:/usr/share/icecast/icecast.pem \
    libretime/icecast:2.4.4-alpine

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

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

Вопросы, которые возникали по-ходу

Как проще всего пересылать файлы между локальным компьютером и удаленной машинкой?

Проще всего через scp.

% scp ./icecast-config.xml root@remote-ip:/usr/local/share/icecast-config.xml

Как посмотреть список запущенных контейнеров?

docker ps

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

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

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

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

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

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

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