Executar Social Stream Ninja sem interface gráfica

Mantenha o aplicativo para desktop completo capturando em um servidor doméstico ou VPS Ubuntu ou Debian sem monitor físico.

Ir para configuração inicial, API HTTP, MCP, Owncast e Rocket.Chat, ou verificação da captura.

Sim — use o AppImage Linux normal

Baixe o aplicativo Linux normal e torne-o executável. Em um VPS sem ambiente gráfico, iniciar apenas o AppImage não basta: use uma tela virtual e a opção --ssapp-headless-control opção. As etapas abaixo mantêm a captura de chat após você desconectar do SSH e após reiniciar o servidor.

O modo sem interface gráfica mantém ocultas as janelas Electron do SSApp, mas as páginas das fontes continuam sendo janelas reais de navegador. Por isso, o Linux precisa de uma tela virtual como Xvfb. Não se trata de um pequeno serviço de chat executado apenas em segundo plano.

O modo sem interface gráfica não cria uma API de controle pública. Um controlador em outro computador usa a mesma sessão do Social Stream e o transporte normal WebRTC ou WebSocket hospedado dos outros fluxos de controle remoto.

Antes de começar

  • Use Ubuntu 22.04+, Debian 12+ ou distribuição Linux semelhante.
  • Reserve pelo menos 2 GB de memória para uma configuração pequena e mais para várias janelas de fontes.
  • Escolha uma pasta de perfil persistente para configurações, fontes, sessões e dados do navegador.
  • Planeje uma sessão inicial de desktop ou VNC para logins e outras configurações privadas.

URLs públicas de fontes que não exigem login são as mais fáceis de operar remotamente. OAuth, CAPTCHA, senhas, cookies e configuração de contas ainda exigem uma pessoa.

1. Instale Xvfb e o 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

Baixe o AppImage Linux atual na página de download do Social Stream Ninja. Escolha o download correspondente à arquitetura do servidor (uname -m) e depois substitua YOUR_DOWNLOADED_FILE.AppImage acima pelo nome exato do arquivo. Não é necessário um checkout do código-fonte nem instalação separada do Node.

2. Prepare o perfil e faça login uma vez

Use a mesma conta e pasta de dados para a configuração e o serviço em segundo plano. Crie uma conta dedicada:

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

Deixe esse terminal em execução. Em um segundo terminal SSH, abra o SSApp de forma visível nessa tela virtual:

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

Em um terceiro terminal SSH, inicie acesso VNC temporário, restrito ao próprio servidor:

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

No seu computador, abra um túnel SSH:

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

Conecte seu visualizador VNC a localhost:5900. Defina o ID de sessão do Social Stream e a senha opcional, adicione fontes e conclua os logins necessários. Ative Ativar automaticamente nas fontes que deseja iniciar quando o SSApp iniciar. Copie os links de dock de chat e sobreposição de destaque para usar depois.

Encerre o SSApp após a configuração e pare VNC, túnel e Xvfb com Ctrl+C nos respectivos terminais. Não execute a configuração e o serviço no mesmo perfil ao mesmo tempo. VNC conectado a uma instância já sem interface gráfica normalmente mostrará uma tela vazia, pois as janelas estão ocultas.

Use SSAPP_USER_DATA_DIR, não a opção do Chromium --user-data-dir. Conclua os logins no VPS; cookies do navegador copiados de outro sistema operacional podem não ser descriptografados.

3. Inicie o aplicativo sem interface gráfica

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

O --ssapp-headless-control mantém as janelas do aplicativo ocultas. Este comando em primeiro plano para quando você o interrompe; use o serviço systemd abaixo para operação sem supervisão. O aplicativo principal ainda precisa de Xvfb; --ozone-platform=headless não substitui a tela virtual.

4. Controle a partir de outro computador

Use o mesmo ID de sessão do Social Stream e senha opcional no aplicativo sem interface gráfica e no controlador remoto. WebRTC é o transporte normal. Se não for adequado ao ambiente, use o modo de servidor WebSocket hospedado do Social Stream.

Os controles remotos compatíveis podem adicionar, iniciar, parar, reiniciar, silenciar e ocultar fontes públicas. Eles não concluem remotamente login, OAuth, CAPTCHA, cookies, credenciais nem outras configurações privadas de conta.

Veja Sessões, senhas, relay e modos de servidor quando o controlador remoto conecta, mas mensagens ou comandos não chegam.

Mantenha em execução com systemd

Primeiro, pare o aplicativo em primeiro plano com Ctrl+C. Crie /etc/systemd/system/ssapp.service com sudo nano /etc/systemd/system/ssapp.service e cole esta unidade:

[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

O serviço usa a conta e o perfil criados na etapa 2. Inicia na inicialização do sistema e reinicia após falhas do aplicativo. Se você alterou o caminho de instalação, atualize ExecStart para corresponder.

API HTTP opcional para scripts no VPS

O modo sem interface gráfica não ativa a API de controle. Para ativá-la no serviço, execute sudo systemctl edit ssapp e salve esta substituição:

[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

Para iniciar manualmente, adicione --ssapp-control-api ao comando do aplicativo. Execute os comandos a seguir em um shell SSH no VPS. A API intencionalmente não tem token e escuta apenas em 127.0.0.1; é separado do seu servidor web Owncast ou Rocket.Chat. Mantenha-o local.

Leia ssappVersion, apiVersion, e as plataformas compatíveis em capabilities primeiro. Por exemplo, se houver suporte à Twitch, adicione uma fonte (substitua 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":{}}' 

Copie o identificador estável da fonte id na lista de fontes retornada e substitua SOURCE_ID abaixo. Adicionar uma fonte a deixa inativa; autoActivate controla futuras inicializações do aplicativo.

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"}}' 

Verifique ok e payload em cada resposta; falhas retornam error. Leia o estado após uma alteração. Se uma solicitação exceder o tempo limite, verifique o estado antes de tentar novamente. Pare uma fonte antes de alterar seus campos de conexão. Comandos de recarregamento, remoção e desligamento exigem confirm: true.

curl -N http://127.0.0.1:17777/api/v1/events acompanha o feed de Server-Sent Events até Ctrl+C. Consulte o Guia da API e MCP para a referência completa. Estes são controles do aplicativo/fontes; ações de sobreposição, como destacar uma mensagem do chat, usam o dock do Social Stream e comandos do Social Stream.

MCP opcional para um cliente de IA no VPS

O MCP permite que um cliente de IA compatível chame os controles do SSApp como ferramentas. Ative a API acima e mantenha o serviço principal do aplicativo em execução. Registre esta configuração em um cliente executado no 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"
      }
    }
  }
}

O local da configuração depende do cliente. Isso inicia um adaptador separado pela entrada/saída padrão; não inicia o aplicativo principal de captura. Um cliente no seu computador doméstico apontaria para o próprio localhost, e não para o VPS. Use os controles remotos normais do Social Stream a partir de outro computador.

O adaptador empacotado está disponível desde o SSApp 0.4.7; versões 0.4.14 e posteriores anunciam o conjunto completo de ferramentas mesmo antes de o aplicativo estar disponível. As capacidades em tempo real ainda determinam quais chamadas funcionam. Não é necessário instalar Node separadamente. A opção Ozone headless aqui se aplica somente ao adaptador MCP; mantenha Xvfb para o aplicativo principal.

Experimente: “Chame ssapp_get_capabilities, depois ssapp_get_status e ssapp_list_sources. Diga quais fontes estão capturando e se alguma informa erros.” As ferramentas também abrangem início/parada de fontes, diagnósticos, eventos capturados, capturas de tela e interações aprovadas com janelas do aplicativo. Logins privados e CAPTCHA ainda precisam de uma pessoa.

Veja: Guia da API de controle local e MCP para a skill opcional de agente, compatibilidade de versões e mais controles.

Owncast, Rocket.Chat e mensagens em destaque

Você pode executar o SSApp no mesmo VPS do Owncast e Rocket.Chat se houver recursos suficientes. Instalar o SSApp, por si só, não conecta o Rocket.Chat nem coloca sobreposições no vídeo.

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

Não há conector integrado de Rocket.Chat nas árvores de código-fonte verificadas para este guia. É necessária uma integração separada para trazer essas mensagens ao Social Stream. Comprove que as mensagens chegam ao dock antes de configurar a sobreposição de vídeo.

Use as URLs de dock e sobreposição de destaque copiadas durante a configuração, com a mesma sessão/senha e transporte. Selecione uma mensagem capturada no dock para destacá-la. O transmissor no servidor precisa renderizar fontes de navegador para colocar essas páginas sobre o vídeo antes de enviar a transmissão combinada ao Owncast. Consulte instruções de transmissão do Owncast. O SSApp não é esse transmissor de vídeo.

Uma sobreposição posicionada sobre um player incorporado ao seu site é outra opção: aparece naquela página, em vez de fazer parte do vídeo recebido por outros players ou gravações. O Owncast documenta incorporação de vídeo e chat.

Para desligar o computador doméstico, a fonte de vídeo, o transmissor, a captura de chat e qualquer integração com Rocket.Chat precisam continuar funcionando independentemente dele. Reserve recursos para renderização e codificação de vídeo separadamente da memória de captura de chat do SSApp.

Verifique o fluxo completo antes de deixá-lo sem supervisão

  1. Envie uma mensagem real em um chat conectado e confirme que ela chega ao dock do Social Stream.
  2. Destaque essa mensagem e confirme que a sobreposição de destaque muda. Para Owncast, verifique também no vídeo real visto pelo espectador.
  3. Desconecte VNC e SSH e envie mais mensagens durante vários minutos. A captura deve continuar.
  4. Execute sudo systemctl restart ssapp, depois confirme que a mesma sessão e as fontes retornam e que fontes ativadas automaticamente recebem mensagens novas.
  5. Durante uma janela de manutenção, reinicie o VPS e repita a verificação de mensagens. Um processo em execução ou uma resposta bem-sucedida da API, por si só, não prova que a captura de chat funciona.

Use sudo systemctl status ssapp e sudo journalctl -u ssapp -n 100 --no-pager para o status do serviço e logs recentes. Para parar deliberadamente, use sudo systemctl stop ssapp.

Para atualizações, pare o serviço, faça backup de /var/lib/ssapp, substitua o AppImage no mesmo caminho e inicie o serviço novamente. Mantenha o executável anterior até que a nova versão passe nas verificações de mensagens.

Solução de problemas

ProblemaO que verificar
Missing X server or $DISPLAYInicie por xvfb-run ou inicie Xvfb e defina DISPLAY.
Xvfb encerra imediatamenteMantenha -extension GLX nos argumentos de Xvfb; alguns drivers de GPU instalados impedem sua inicialização GLX.
O AppImage não montaExtraia com ./socialstreamninja.AppImage --appimage-extract em uma pasta com permissão de gravação e depois coloque a pasta extraída em /opt/socialstream/squashfs-root. Substitua o caminho do AppImage nos comandos de configuração, serviço e MCP por /opt/socialstream/squashfs-root/socialstreamninja.
Comandos remotos não chegamConfirme que os dois lados usam a mesma sessão e senha e que o WebRTC ou o modo de WebSocket hospedado está conectado.
Fontes ou configurações se misturam entre instânciasDê a cada instância um SSAPP_USER_DATA_DIR e tela virtual.