3 мин чтения#infrastructure#engineering

Поднял свой видеоузел за выходные

За выходные поднял vdn.csylabs.com — свой видеоузел. SRT на входе, HLS/WebRTC/RTMP на выходе. Свой домен, свои ключи, свой журнал.

Причина была простая: и для своих задач, и для партнёрских нужно было место, где можно спокойно экспериментировать — без чужой панели, без помесячной лицензии, без ожидания, пока кто-то раскатит релиз.

Стек:

→ MistServer 3.10 Free_64 — приём SRT на портах 9999 и 10000, раздача HLS, WebRTC и RTMP → Caddy на входе — TLS, редиректы, базовый контроль доступа к админке → Ansible-роль на раскатку: переменные в vault, один ansible-playbook — и узел готов → Свой журнал событий и fail2ban поверх systemd

Задержка по глазу — около полутора секунд на цепочке ffmpeg push → приёмник → ffmpeg pull в режиме caller. Для прямого эфира это рабочая цифра.

Ключ как идентификатор. Авторизацию на первом этапе я сделал самым простым способом из возможных. Каждому партнёру выдаётся идентификатор потока вида str_<12 шестнадцатеричных> — 48 бит случайности, не подсмотреть и не подобрать. Кто знает идентификатор, тот владеет каналом.

Почему так. В Free_64 пароль на отдельный поток не настраивается — пароль общий, на уровне коннектора. Поэтому всю секретность я перенёс в сам идентификатор. Это не элегантно, но работает предсказуемо: если ключ нужно отозвать, я меняю идентификатор, перевыдаю новый, и старый сразу становится неактуален.

Для выдачи ключей написал утилиту vdn-stream.sh:

vdn-stream.sh gen                # сгенерить str_<12hex>
vdn-stream.sh add <id> <partner> # зарегистрировать поток
vdn-stream.sh urls <id>          # показать push/pull/HLS-адреса
vdn-stream.sh list               # активные потоки

Скрипт достаёт пароль админки из ansible-vault (macOS Keychain), ходит по SSH на узел и дёргает служебный адрес MistServer на 127.0.0.1:4242. Наружу эта панель не выставлена — и не должна быть: работа с ней идёт только через SSH.

Что обнаружилось по ходу:

Произвольный идентификатор MistServer не примет. Первый push я сделал на незарегистрированный id — сервер честно отбил: Push rejected - stream not configured. Free_64 требует явной регистрации потока через addstream в админке, никакой самодеятельности. Для первого этапа это скорее плюс: онбординг любого партнёра сводится к одной команде vdn-stream.sh add, и в систему ничего не попадает самотёком.

Пароль на отдельный поток в Free_64 не настраивается. В коммерческих сборках у каждого потока свой ключ, во Free_64 — один общий на коннектор. Я подумал про обходы через Caddy или iptables, но выбрал обратный путь — перенести всю секретность в сам идентификатор. 48 бит случайности — это уже не пароль «123», подбор не обсуждается.

Админка закрыта bcrypt-ом через Caddy. Но у меня есть SSH. Хэш в одну сторону не разворачивается — значит, разворачивать его и не надо. Захожу по SSH и стучу в 127.0.0.1:4242 напрямую. Утилита ровно это и делает, плюс в любой момент можно руками — без вынесения админки в открытый контур.

План:

→ Неделя 25-26 апреля — страница потоков на ops.csylabs.com: таблица активных, генерация ключа в одно нажатие, перенос списка из markdown-файла в таблицу streaming.stream → Дальше — автоматические плашки поверх сигнала: расписание на входе, готовая графика на выходе. Ручной оператор в прямом эфире стоит дорого, часть его работы спокойно делается по триггерам → Узел собирается с двух сторон: приём сигнала снизу и выдача поверх него готовой картинки сверху. Для партнёров это замена не только доставки, но и части ручной обработки

Дальше — по мере поступления.

Читать по теме