Social Stream Ninjaを画面なしで実行する

UbuntuやDebianのホームサーバー、またはVPSで、物理モニターなしに完全なデスクトップアプリの取得処理を動かし続けます。

移動先: 初期設定, HTTP API, MCP, OwncastとRocket.Chat、または 取得の確認.

通常のLinux AppImageで実行できます

通常のLinuxアプリをダウンロードし、実行可能にします。デスクトップのないVPSでは、AppImageを起動するだけでは不十分です。仮想ディスプレイと次のフラグを使用します: --ssapp-headless-control フラグを使用します。以下の手順では、SSHを切断した後も、サーバーを再起動した後も、チャットの取得を継続できます。

ヘッドレスモードではSSAppのElectronウィンドウを非表示にしますが、ソースページは実際のブラウザーウィンドウとして動作します。そのため、LinuxではXvfbなどの仮想ディスプレイが必要です。これは軽量なバックグラウンド専用チャットデーモンではありません。

ヘッドレスモードは、公開の制御APIを作成しません。 別のコンピューターのコントローラーは、他のリモート操作と同様に、同じSocial Streamセッションと、通常のWebRTCまたはホスト型WebSocket通信を使用します。

始める前に

  • Ubuntu 22.04以降、Debian 12以降、または同等のLinuxディストリビューションを使用してください。
  • 小規模な構成でも少なくとも2GBのメモリを確保し、ソースウィンドウを複数使う場合は増やしてください。
  • 設定、ソース、セッション、ブラウザーデータ用に、永続的なプロファイルディレクトリを選んでください。
  • サインインやその他の非公開設定のために、一度だけデスクトップまたは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

そのターミナルを動作させたままにします。2つ目の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

3つ目の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のセッションIDと任意のパスワードを設定し、ソースを追加して、必要なサインインを完了します。次を有効にしてください: 自動有効化(Auto-activate) を、SSAppの起動時に開始したいソースで有効にします。後で使うため、チャットドックと注目表示オーバーレイのリンクをコピーしてください。

設定後にSSAppを終了し、VNC、トンネル、Xvfbを、それぞれのターミナルでCtrl+Cを押して停止します。同じプロファイルに対して、設定用アプリとサービスを同時に実行しないでください。すでにヘッドレスで動作しているインスタンスにVNCを接続しても、ウィンドウが非表示のため、通常は空の画面になります。

使う項目: SSAPP_USER_DATA_DIRを使用します。Chromiumの次のフラグではありません: --user-data-dir。VPS上でサインインを完了してください。別のOSからコピーしたブラウザー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セッションIDと任意のパスワードを使用してください。通常の通信方式はWebRTCです。環境に適さない場合は、Social Streamのホスト型WebSocketサーバーモードを使用します。

対応するリモート操作では、公開ソースの追加、開始、停止、再起動、ミュート、非表示ができます。サインイン、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 を一致させます。

任意:VPS上のスクリプト用HTTP API

ヘッドレスモードだけでは制御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のWebサーバーとは別のものです。ローカルに限定してください。

参照: 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 は、Ctrl+Cを押すまでServer-Sent Eventsのフィードを受信します。参照: APIとMCPのガイド に完全なリファレンスがあります。これらはアプリ/ソースの操作です。チャットの注目表示などのオーバーレイ操作には、Social Streamのドックと次を使用します: Social Streamのコマンド.

任意:VPS上のAIクライアント用MCP

MCPを使うと、対応するAIクライアントから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"
      }
    }
  }
}

設定場所はクライアントによって異なります。これは標準入出力を使う別のアダプターを起動するもので、メインの取得アプリは起動しません。自宅のコンピューター上のクライアントは、VPSではなく、そのコンピューター自身のlocalhostを参照します。別のコンピューターからは、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、注目メッセージ

十分なリソースがあれば、OwncastやRocket.Chatと同じVPSでSSAppを実行できます。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は、その動画配信ソフトではありません。

Webサイト上の埋め込みプレーヤーにオーバーレイを重ねる方法もあります。この場合、そのページに表示されるだけで、他のプレーヤーや録画が受け取る映像には含まれません。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 と仮想ディスプレイ。