# Headless OBS Studio on Proxmox LXC Данный репозиторий содержит конфигурационные файлы для развертывания `obs-studio` в *headless*-режиме внутри контейнера **proxmox** (**lxc**) с пробросом **gpu** и **usb**-устройств захвата. ## Сравнение дистрибутивов В процессе разработки были протестированы два окружения. Ниже приведен критический анализ возникших проблем: | Характеристика | Alpine Linux | Debian 13 | |:---:|:---|:---| | **Графический стек** | `wayland` + `cage` + `wayvnc` | `x11` + `xvfb` + `x11vnc` | | **Работа с железом** | Успешно: Стабильный захват `v4l2` | Критическая ошибка: Segfault в `linux-v4l2.so` | | **Управление** | Проблема: Отсутствие плагина `obs-websocket` в репозиториях | Успешно: Полная поддержка `obs-websocket` | | **Итог** | Идеально для картинки, невозможно управлять удаленно | Отличное управление, невозможно использовать родной `v4l2` | ### Почему **alpine** не подошел: Основной блокирующий фактор — отсутствие нативной сборки `obs-websocket` в `apk` репозиториях. Поскольку проект требует удаленного управления через *api*, **alpine** без сложной ручной компиляции плагина оказался нежизнеспособен. ### Почему **debian** не подошел: На ядре **proxmox** (`7.0.0-3-pve`) стандартный плагин `linux-v4l2.so` в **debian 13** вызывает ошибку обращения к памяти (`segmentation fault`) при инициализации устройств захвата. ## Текущий стек (arch + wayland) После тестирования **alpine** и **debian**, финальным и наиболее стабильным решением стал **arch** в контейнере **lxc**. Это позволило получить доступ к свежим версиям `obs-studio` и плагина `obs-websocket` без проблем с сегфолтами ядра **proxmox**. ### Архитектурная схема | Компонент | Технология | Описание | | :---: | :--- | :--- | | ОС | **arch linux** | Свежие репозитории и ядро, обеспечивающие совместимость с современными плагинами. | | Графический стек | `wayland` + `cage` |Использование киоска для запуска `obs-studio` без тяжелого DE. | | Удаленный доступ | `wayvnc` + `novnc` | Доступ к *gui* через браузер по вэбсокету. | | Управление | `obs-websocket`| Нативная поддержка управления через *api* из коробки. | | Работа с видео | `v4l2-input` | Стабильная работа вэбки и карты захвата без ошибок памяти. | ### Почему Arch Linux оказался идеальным решением: Наличие `obs-websocket`: В отличие от **alpine**, пакет `obs-studio` в **arch** включает в себя актуальные плагины управления. Исправленный `v4l2`: Плагин `linux-v4l2.so` в сборке **arch** не вызывает `segmentation fault` при инициализации устройств захвата на ядре **proxmox**. Минимализм: Использование композитора `cage` позволяет держать потребление ресурсов на уровне **alpine**. ### Нюансы настройки (Troubleshooting) * **Runtime Directory**: Для работы `wayland` необходимо вручную создавать и прокидывать `XDG_RUNTIME_DIR`, иначе композитор `cage` не сможет создать сокет. * **WLR_BACKENDS**: При запуске в **lxc** без монитора необходимо явно указывать `WLR_BACKENDS=headless` для корректной инициализации виртуального экрана. ## Установка зависимостей Включаем песочницу: ```bash sed -i 's/#DisableSandbox/DisableSandbox/' /etc/pacman.conf ``` Инициализируем ключи для `pacman`: ```bash pacman-key --init pacman-key --populate archlinux ``` Устанавливаем программы: ```bash # обновляем pacman -Syu # база pacman -S obs-studio luajit cage wayvnc # зависимости для yay pacman -S base-devel linux-headers git nano # видеодрайвера (в данном случае для амд) pacman -S mesa vulkan-radeon ``` Далее пробрасываем устройства в контейнер с гипервизора, с **guid**'ами сверяемся в гостевой системе. Пример: ```bash dev0: /dev/dri/card0,gid=983,mode=0660,uid=0 dev1: /dev/dri/renderD128,gid=987,mode=0660,uid=0 dev2: /dev/video%N%,gid=983,mode=0660,uid=0 dev3: /dev/snd/controlC%N%,gid=995,mode=0660,uid=0 dev4: /dev/snd/pcmC%N%D0c,gid=995,mode=0660,uid=0 ``` Перезапускаем контейнер и создаём юзера `obs`: ```bash useradd -m -d /var/lib/obs -s /bin/bash obs chown -R obs:obs /var/lib/obs # wheel для yay usermod -aG wheel,video,render,audio obs ``` Заходив в юзера и ставим `yay`: ```bash # клонируем и ставим yay cd /tmp git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # устанавливаем novnc из aur yay -S novnc ``` ## systemd-units ### /etc/systemd/system/obs.service ```bash [Unit] Description=obs After=network.target [Service] Type=simple User=obs Group=obs RuntimeDirectory=obs-runtime Environment=XDG_RUNTIME_DIR=/run/obs-runtime Environment=WAYLAND_DISPLAY=wayland-0 Environment=WLR_BACKENDS=headless Environment=WLR_LIBSEAT_BACKEND=noop ExecStart=/usr/bin/cage -s -- /usr/bin/obs Restart=always RestartSec=3 [Install] WantedBy=multi-user.target ``` ### /etc/systemd/system/wayvnc.service ```bash [Unit] Description=wayvnc After=obs.service Requires=obs.service [Service] Type=simple User=obs Environment=XDG_RUNTIME_DIR=/run/obs-runtime Environment=WAYLAND_DISPLAY=wayland-0 ExecStart=/usr/bin/wayvnc 127.0.0.1 5900 Restart=always RestartSec=2 [Install] WantedBy=multi-user.target ``` ### /etc/systemd/system/novnc.service ```bash [Unit] Description=novnc After=wayvnc.service Requires=wayvnc.service [Service] Type=simple User=obs ExecStart=/usr/bin/novnc --listen 6080 --vnc localhost:5900 Restart=always [Install] WantedBy=multi-user.target ``` ## Тестирование ### Схема аппаратного подключения Для тестирования захвата видео и стабильности плагинов используется цепочка преобразования сигнала из аналогового в цифровой с последующим пробросом в виртуальную среду. #### Цепочка передачи сигнала 1. **Источник:** **ps2**/**ps3** (+ **hdmi splitter** для расшифровки **hdcp**). 2. **Аналоговый вывод:** Проприетарный кабель **av multi out** → **component** (**YPbPr**). 3. **Конвертация:** Преобразователь **YPbPr** + → **HDMI**. 4. **Захват**: Карта видеозахвата **Fifine V3 RGB**. 5. **Хост**: Сервер под управлением **proxmox**. ## Скриншоты ![noVNC](assets/novnc.png) *`novnc` — `obs-studio` запущен внутри **lxc** через `wayland` (`cage`)* ![Twitch](assets/twitch.png) *лайв-стрим на твиче*