Files
2026-05-04 02:43:00 +04:00

187 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
*лайв-стрим на твиче*