Запуск Social Stream Ninja без интерфейса

Поддерживайте захват полным настольным приложением на домашнем сервере Ubuntu или Debian либо VPS без физического монитора.

Перейти к начальной настройке, HTTP API, MCP, Owncast и Rocket.Chat, или проверке захвата.

Да — используйте обычный Linux AppImage

Скачайте обычное приложение Linux и сделайте файл исполняемым. На VPS без рабочего стола одного запуска AppImage недостаточно: используйте виртуальный дисплей и --ssapp-headless-control . Следующие шаги сохраняют захват чата после отключения SSH и перезагрузки сервера.

Режим без интерфейса скрывает окна Electron в SSApp, но страницы источников остаются настоящими окнами браузера. Поэтому Linux нужен виртуальный дисплей, например Xvfb. Это не небольшой исключительно фоновый сервис чата.

Режим без интерфейса не создаёт общедоступный API управления. Контроллер на другом компьютере использует тот же сеанс Social Stream и обычный WebRTC или размещённый WebSocket, как и другие способы дистанционного управления.

Перед началом

  • Используйте Ubuntu 22.04+, Debian 12+ или похожий дистрибутив Linux.
  • Выделите не менее 2 ГБ памяти для небольшой конфигурации и больше для нескольких окон источников.
  • Выберите постоянную папку профиля для настроек, источников, сеансов и данных браузера.
  • Запланируйте однократный сеанс рабочего стола или VNC для входа в аккаунты и других приватных настроек.

Проще всего удалённо работать с общедоступными URL источников без входа. OAuth, CAPTCHA, пароли, cookie и настройка аккаунтов всё равно требуют участия человека.

1. Установите Xvfb и AppImage

sudo apt-get update
sudo apt-get install -y xvfb x11-utils xauth curl
sudo mkdir -p /opt/socialstream
sudo mv ./YOUR_DOWNLOADED_FILE.AppImage /opt/socialstream/socialstreamninja.AppImage
sudo chmod 755 /opt/socialstream/socialstreamninja.AppImage

Скачайте текущий Linux AppImage со страницы загрузки Social Stream Ninja. Выберите файл для архитектуры сервера (uname -m), затем замените YOUR_DOWNLOADED_FILE.AppImage выше его точным именем файла. Копия исходников и отдельная установка Node не требуются.

2. Подготовьте профиль и один раз войдите в аккаунты

Используйте один аккаунт и папку данных для настройки и фоновой службы. Создайте отдельный аккаунт:

id ssapp >/dev/null 2>&1 || sudo useradd --system --create-home --home-dir /var/lib/ssapp --shell /usr/sbin/nologin ssapp
sudo install -d -o ssapp -g ssapp -m 700 /var/lib/ssapp
sudo apt-get install -y x11vnc
sudo -u ssapp Xvfb :99 -screen 0 1920x1080x24 -nolisten tcp -extension GLX

Оставьте терминал работающим. Во втором терминале SSH откройте видимое окно SSApp на этом виртуальном дисплее:

sudo -u ssapp env DISPLAY=:99 SSAPP_USER_DATA_DIR=/var/lib/ssapp SSAPP_HEADLESS_CONTROL=0 \
  /opt/socialstream/socialstreamninja.AppImage --ozone-platform=x11 --no-hwa

В третьем терминале SSH запустите временный доступ VNC, ограниченный самим сервером:

sudo -u ssapp x11vnc -display :99 -localhost -rfbport 5900 -nopw -forever

На своём компьютере откройте туннель SSH:

ssh -N -L 5900:127.0.0.1:5900 you@your-server

Подключите VNC-клиент к localhost:5900. Задайте идентификатор сеанса Social Stream и необязательный пароль, добавьте источники и выполните вход, где требуется. Включите Автоактивация для источников, которые должны запускаться вместе с SSApp. Скопируйте ссылки док-панели и оверлея выбранного сообщения для дальнейшего использования.

После настройки закройте SSApp, затем остановите VNC, туннель и Xvfb сочетанием Ctrl+C в их терминалах. Не запускайте настройку и службу одновременно с одним профилем. VNC, подключённый к уже работающему без интерфейса экземпляру, обычно показывает пустой дисплей, поскольку окна скрыты.

Используйте SSAPP_USER_DATA_DIR, а не флаг Chromium --user-data-dir. Выполняйте вход на VPS: cookie браузера, скопированные из другой ОС, могут не расшифроваться.

3. Запустите приложение без интерфейса

sudo -u ssapp env SSAPP_USER_DATA_DIR=/var/lib/ssapp xvfb-run -a -s "-screen 0 1920x1080x24 -nolisten tcp -extension GLX" \
  /opt/socialstream/socialstreamninja.AppImage \
  --ozone-platform=x11 --ssapp-headless-control --no-hwa

Это --ssapp-headless-control скрывает окна приложения. Эта команда работает на переднем плане и завершается при остановке; для работы без присмотра используйте службу systemd ниже. Основному приложению по-прежнему нужен Xvfb; --ozone-platform=headless не заменяет виртуальный дисплей.

4. Управляйте с другого компьютера

Используйте одинаковые идентификатор сеанса Social Stream и необязательный пароль в приложении без интерфейса и удалённом контроллере. Обычный транспорт — WebRTC. Если он не подходит для вашей среды, используйте размещённый WebSocket-сервер Social Stream.

Поддерживаемые удалённые команды позволяют добавлять, запускать, останавливать, перезапускать, заглушать и скрывать общедоступные источники. Они не выполняют дистанционно вход, OAuth, CAPTCHA, работу с cookie, учётными данными или другую приватную настройку аккаунтов.

См. Сеансы, пароли, ретрансляция и серверные режимы если удалённый контроллер подключается, но сообщения или команды не поступают.

Постоянная работа через systemd

Сначала остановите приложение на переднем плане сочетанием Ctrl+C. Создайте /etc/systemd/system/ssapp.service с sudo nano /etc/systemd/system/ssapp.service и вставьте этот файл службы:

[Unit]
Description=Social Stream Ninja (headless)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=ssapp
StateDirectory=ssapp
WorkingDirectory=/opt/socialstream
Environment=SSAPP_USER_DATA_DIR=/var/lib/ssapp
ExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1920x1080x24 -nolisten tcp -extension GLX" /opt/socialstream/socialstreamninja.AppImage --ozone-platform=x11 --ssapp-headless-control --no-hwa
Restart=on-failure
RestartSec=10
KillSignal=SIGTERM
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ssapp
journalctl -u ssapp -f

Служба использует аккаунт и профиль, созданные на шаге 2. Она запускается при загрузке системы и перезапускается после сбоя приложения. Если изменили путь установки, обновите ExecStart соответствующим образом.

Необязательный HTTP API для скриптов на VPS

Режим без интерфейса не включает API управления. Чтобы включить его для службы, выполните sudo systemctl edit ssapp и сохраните это переопределение:

[Service]
Environment=SSAPP_CONTROL_API=1
sudo systemctl daemon-reload
sudo systemctl restart ssapp
curl -sS http://127.0.0.1:17777/api/v1/capabilities
curl -sS http://127.0.0.1:17777/api/v1/status

Для ручного запуска добавьте --ssapp-control-api к команде приложения. Выполните следующие команды в оболочке SSH на VPS. API намеренно не использует токен и привязан только к 127.0.0.1; он независим от веб-сервера Owncast или Rocket.Chat. Оставьте его локальным.

Прочитайте ssappVersion, apiVersion, а также поддерживаемые платформы в возможностях. Например, если поддерживается Twitch, добавьте источник, заменив CHANNEL_NAME):

curl -sS http://127.0.0.1:17777/api/v1/command \
  -H 'Content-Type: application/json' \
  -d '{"action":"addSource","value":{"target":"twitch","username":"CHANNEL_NAME","autoActivate":true}}'

curl -sS http://127.0.0.1:17777/api/v1/command \
  -H 'Content-Type: application/json' \
  -d '{"action":"getSources","value":{}}' 

Скопируйте стабильный идентификатор источника id из возвращённого списка источников и замените SOURCE_ID ниже. После добавления источник остаётся неактивным; autoActivate управляет будущими запусками приложения.

curl -sS http://127.0.0.1:17777/api/v1/command \
  -H 'Content-Type: application/json' \
  -d '{"action":"startSource","value":{"sourceId":"SOURCE_ID"}}'

curl -sS http://127.0.0.1:17777/api/v1/command \
  -H 'Content-Type: application/json' \
  -d '{"action":"getSourceDiagnostics","value":{"sourceId":"SOURCE_ID"}}'

curl -sS http://127.0.0.1:17777/api/v1/command \
  -H 'Content-Type: application/json' \
  -d '{"action":"stopSource","value":{"sourceId":"SOURCE_ID"}}' 

Проверьте ok и payload в каждом ответе; при ошибке возвращается error. Проверяйте состояние после изменений. Если запрос превысил время ожидания, проверьте состояние перед повтором. Останавливайте источник перед изменением полей подключения. Команды перезагрузки, удаления и завершения требуют confirm: true.

curl -N http://127.0.0.1:17777/api/v1/events следит за потоком Server-Sent Events до нажатия Ctrl+C. См. Руководство по API и MCP для полного справочника. Это управление приложением и источниками; действия оверлеев, например показ сообщения, используют док-панель Social Stream и команды Social Stream.

Необязательный MCP для ИИ-клиента на VPS

MCP позволяет совместимому ИИ-клиенту вызывать команды SSApp как инструменты. Включите API, описанный выше, и оставьте основную службу приложения работающей. Зарегистрируйте эту конфигурацию в клиенте, запущенном на VPS:

{
  "mcpServers": {
    "social-stream": {
      "command": "/opt/socialstream/socialstreamninja.AppImage",
      "args": ["--ssapp-mcp", "--ozone-platform=headless"],
      "env": {
        "SSAPP_CONTROL_URL": "http://127.0.0.1:17777"
      }
    }
  }
}

Расположение конфигурации зависит от клиента. Она запускает отдельный адаптер через стандартные ввод и вывод, но не основное приложение захвата. Клиент на домашнем компьютере обращался бы к своему localhost, а не VPS. Для другого компьютера используйте обычное дистанционное управление Social Stream.

Встроенный адаптер доступен с SSApp 0.4.7; версии 0.4.14 и новее объявляют полный набор инструментов ещё до появления приложения. Какие вызовы работают, по-прежнему определяется текущими возможностями. Отдельная установка Node не нужна. Флаг Ozone без интерфейса здесь относится только к адаптеру MCP; основному приложению оставьте Xvfb.

Попробуйте: «Вызови ssapp_get_capabilities, затем ssapp_get_status и ssapp_list_sources. Сообщи, какие источники захватывают данные и есть ли у них ошибки». Инструменты также охватывают запуск и остановку источников, диагностику, захваченные события, снимки экрана и разрешённые действия в окнах приложения. Приватный вход и CAPTCHA всё равно требуют человека.

См. Руководство по локальному API управления и MCP о необязательном навыке агента, совместимости версий и других командах.

Owncast, Rocket.Chat и выбранные сообщения

SSApp можно запускать на том же VPS, что и Owncast и Rocket.Chat, если ресурсов достаточно. Сама установка SSApp не подключает Rocket.Chat и не добавляет оверлеи в видео.

Supported chat source → SSApp → Social Stream dock / featured overlay
                                           ↓
Video input → server broadcaster renders overlays → Owncast → viewers

В деревьях исходников, проверенных для этого руководства, нет встроенного коннектора Rocket.Chat. Для передачи этих сообщений в Social Stream нужна отдельная интеграция. Прежде чем настраивать видеооверлей, убедитесь, что сообщения доходят до док-панели.

Используйте ссылки док-панели и оверлея выбранного сообщения, скопированные при настройке, с теми же сеансом, паролем и транспортом. Выберите захваченное сообщение в док-панели, чтобы вывести его. Серверной программе вещания нужен рендеринг источников браузера для наложения этих страниц на видео перед отправкой объединённого потока в Owncast. См. инструкции Owncast по трансляции. SSApp не выполняет эту видеотрансляцию.

Оверлей поверх встроенного плеера на вашем сайте — другой вариант: он виден на этой странице, но не входит в видео, получаемое другими плеерами или записями. В документации Owncast описано встраивание видео и чата.

Чтобы выключать домашний компьютер, источник видео, программа вещания, захват чата и интеграция Rocket.Chat должны продолжать работу независимо от него. Рассчитывайте ресурсы для рендеринга и кодирования видео отдельно от памяти захвата чата SSApp.

Проверьте весь процесс перед работой без присмотра

  1. Отправьте настоящее сообщение в подключённый чат и убедитесь, что оно появилось в док-панели Social Stream.
  2. Выведите это сообщение и убедитесь, что оверлей выбранного сообщения изменился. Для Owncast также проверьте настоящее видео зрителя.
  3. Отключите VNC и SSH, затем отправляйте сообщения ещё несколько минут. Захват должен продолжаться.
  4. Выполните sudo systemctl restart ssapp, затем убедитесь, что вернулись тот же сеанс и источники, а автоматически активированные источники получают новые сообщения.
  5. Во время обслуживания перезагрузите VPS и повторите проверку сообщений. Сам по себе работающий процесс или успешный ответ API не доказывает, что захват чата работает.

Используйте sudo systemctl status ssapp и sudo journalctl -u ssapp -n 100 --no-pager для состояния службы и последних журналов. Для намеренной остановки используйте sudo systemctl stop ssapp.

При обновлении остановите службу, сохраните резервную копию /var/lib/ssapp, замените AppImage по тому же пути и снова запустите службу. Сохраните предыдущий исполняемый файл, пока новая версия не пройдёт проверку сообщений.

Устранение неполадок

ПроблемаЧто проверить
Missing X server or $DISPLAYЗапускайте через xvfb-run либо запустите Xvfb и задайте DISPLAY.
Xvfb сразу закрываетсяОставьте -extension GLX в аргументах Xvfb: некоторые установленные драйверы GPU мешают запуску GLX.
AppImage не монтируетсяРаспакуйте с помощью ./socialstreamninja.AppImage --appimage-extract в папке с правом записи, затем поместите распакованную папку в /opt/socialstream/squashfs-root. В командах настройки, службы и MCP замените путь AppImage на /opt/socialstream/squashfs-root/socialstreamninja.
Удалённые команды не поступаютУбедитесь, что обе стороны используют одинаковые сеанс и пароль, а WebRTC или размещённый WebSocket подключён.
Источники или настройки смешиваются между экземплярамиЗадайте каждому экземпляру отдельные SSAPP_USER_DATA_DIR и виртуальный дисплей.