Как Настроить Сайт И Поток Для Онлайн Радио С Https
Задача, в общем-то тривиальная, но некоторые сложности возникли с ssl для Айскаста, о чём я и хотел бы рассказать ниже.
Софт
- 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.xml
1. Более чем избыточное описание параметров доступно в мануале Айскаста. 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.
В конфиге Айскаста (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.
-
/usr/local/share : Local architecture-independent hierarchy. На Лоссте написали то же самое языком попроще ↩︎