Как настроить сайт и поток для онлайн радио с https.
Задача, в общем-то тривиальная, но некоторые сложности возникли с ssl для Icecast, о чём я и хотел бы рассказать ниже.
Софт
- Docker. Для простенького сервера который я собрался делать - использование докера скорее избыточно.
- Icecast - в качестве сервера для аудио-потока.
- Nginx - для отдачи статической веб-странички.
- 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.