Files
obs-lxc-proxmox/README.md
T

187 lines
8.2 KiB
Markdown
Raw Normal View History

2026-05-04 02:43:00 +04:00
# 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)
*лайв-стрим на твиче*