Запуск 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. Задайте ID сесії 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. Керуйте ним з іншого комп’ютера

Використовуйте однаковий ID сесії 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, а також підтримувані платформи в capabilities спочатку. Наприклад, якщо 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 і новіші оголошують повний набір інструментів ще до доступності застосунку. Поточні capabilities усе одно визначають, які виклики працюють. Окреме встановлення 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, потрібна окрема інтеграція. Підтвердьте надходження повідомлень у док перед налаштуванням відеооверлею.

Використовуйте URL дока й оверлею вибраних повідомлень, скопійовані під час налаштування, із тією самою сесією/паролем і транспортом. Виберіть захоплене повідомлення в доку, щоб показати його. Серверний транслятор потребує відображення джерел браузера для розміщення цих сторінок поверх відео перед надсиланням об’єднаного потоку в 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. Замініть шлях AppImage у командах налаштування, служби та MCP на /opt/socialstream/squashfs-root/socialstreamninja.
Віддалені команди не надходятьПереконайтеся, що обидва боки використовують однакову сесію й пароль та що WebRTC або розміщений режим WebSocket підключений.
Джерела або налаштування змішуються між екземплярамиНадайте кожному екземпляру інший SSAPP_USER_DATA_DIR і віртуальний дисплей.