Ejecutar Social Stream Ninja sin interfaz visible

Mantén la aplicación de escritorio completa capturando en un servidor doméstico o VPS con Ubuntu o Debian, sin monitor físico.

Ir a configuración inicial, API HTTP, MCP, Owncast y Rocket.Chat, o comprobación de captura.

Sí: usa el AppImage normal de Linux

Descarga la aplicación habitual de Linux y dale permisos de ejecución. En un VPS sin escritorio, iniciar solo el AppImage no basta: usa una pantalla virtual y el parámetro --ssapp-headless-control . Los pasos siguientes mantienen la captura de chat después de desconectarte de SSH y después de reiniciar el servidor.

El modo sin interfaz visible mantiene ocultas las ventanas de Electron de SSApp, pero las páginas de fuentes siguen siendo ventanas reales del navegador. Por eso Linux necesita una pantalla virtual como Xvfb. No es un pequeño servicio de chat que funcione únicamente en segundo plano.

El modo sin interfaz visible no crea una API de control pública. Un controlador en otro equipo usa la misma sesión de Social Stream y el transporte WebRTC normal o WebSocket alojado que otros flujos de control remoto.

Antes de empezar

  • Usa Ubuntu 22.04+, Debian 12+ o una distribución Linux similar.
  • Reserva al menos 2 GB de memoria para una configuración pequeña y más si usas varias ventanas de fuentes.
  • Elige un directorio de perfil persistente para ajustes, fuentes, sesiones y datos del navegador.
  • Prepara una sesión única de escritorio o VNC para los inicios de sesión y otros ajustes privados.

Las URL de fuentes públicas que no requieren iniciar sesión son las más fáciles de manejar a distancia. OAuth, CAPTCHA, contraseñas, cookies y la configuración de cuentas siguen necesitando una persona.

1. Instala Xvfb y el 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

Descarga el AppImage actual de Linux desde la página de descargas de Social Stream Ninja. Elige la descarga que corresponda a la arquitectura del servidor (uname -m), y sustituye YOUR_DOWNLOADED_FILE.AppImage arriba por el nombre exacto del archivo. No hace falta descargar el código fuente ni instalar Node por separado.

2. Prepara el perfil e inicia sesión una vez

Usa la misma cuenta y directorio de datos para la configuración y el servicio en segundo plano. Crea una cuenta 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

Deja esa terminal en ejecución. En otra terminal SSH, abre SSApp de forma visible en esa pantalla 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

En una tercera terminal SSH, inicia un acceso VNC temporal limitado al propio servidor:

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

En tu propio equipo, abre un túnel SSH:

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

Conecta tu visor VNC a localhost:5900. Establece el ID de sesión de Social Stream y una contraseña opcional, añade fuentes y completa los inicios de sesión. Activa Activar automáticamente (Auto-activate) en las fuentes que quieras iniciar cuando arranque SSApp. Copia los enlaces de tu dock de chat y del overlay de destacados para usarlos más tarde.

Cierra SSApp después de configurarlo y detén VNC, el túnel y Xvfb con Ctrl+C en sus terminales. No ejecutes la configuración y el servicio con el mismo perfil al mismo tiempo. VNC conectado a una instancia que ya funciona sin interfaz visible normalmente mostrará una pantalla vacía porque sus ventanas están ocultas.

Usa SSAPP_USER_DATA_DIR, no el de Chromium --user-data-dir. Completa los inicios de sesión en el VPS; las cookies copiadas desde otro sistema operativo pueden no descifrarse.

3. Inicia la aplicación sin interfaz visible

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

El --ssapp-headless-control mantiene ocultas las ventanas de la aplicación. Este comando en primer plano termina cuando lo detienes; usa el servicio systemd de abajo para funcionamiento sin supervisión. La aplicación principal sigue necesitando Xvfb; --ozone-platform=headless no sustituye a la pantalla virtual.

4. Contrólala desde otro equipo

Usa el mismo ID de sesión de Social Stream y la misma contraseña opcional en la aplicación sin interfaz visible y el controlador remoto. WebRTC es el transporte normal. Si no es adecuado para el entorno, usa el modo de servidor WebSocket alojado de Social Stream.

Los controles remotos compatibles permiten añadir, iniciar, detener, reiniciar, silenciar y ocultar fuentes públicas. No completan a distancia inicios de sesión, OAuth, CAPTCHA, cookies, credenciales ni otros ajustes privados de cuentas.

Consulta Sesiones, contraseñas, retransmisión y modos de servidor cuando el controlador remoto conecta pero no llegan mensajes o comandos.

Mantenerlo en ejecución con systemd

Detén primero la aplicación en primer plano con Ctrl+C. Crea /etc/systemd/system/ssapp.service con sudo nano /etc/systemd/system/ssapp.service y pega esta unidad:

[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

El servicio usa la cuenta y el perfil creados en el paso 2. Se inicia al arrancar y se reinicia si falla la aplicación. Si cambiaste la ruta de instalación, actualiza ExecStart para que coincida.

API HTTP opcional para scripts en el VPS

El modo sin interfaz visible no activa la API de control. Para activarla en tu servicio, ejecuta sudo systemctl edit ssapp y guarda esta configuración adicional:

[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 un inicio manual, añade --ssapp-control-api al comando de la aplicación. Ejecuta los siguientes comandos en una consola SSH en el VPS. La API no tiene token de forma intencionada y solo escucha en 127.0.0.1; es independiente de tu servidor web de Owncast o Rocket.Chat. Mantenlo local.

Consulta ssappVersion, apiVersion, y primero las plataformas compatibles en capabilities. Por ejemplo, si Twitch es compatible, añade una fuente (sustituye 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":{}}' 

Copia el identificador estable id de la lista de fuentes devuelta y sustituye SOURCE_ID abajo. Al añadir una fuente, queda inactiva; autoActivate controla los futuros inicios de la aplicación.

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

Comprueba ok y payload en cada respuesta; los fallos devuelven error. Consulta el estado después de un cambio. Si una solicitud agota el tiempo de espera, comprueba el estado antes de repetirla. Detén una fuente antes de cambiar sus campos de conexión. Los comandos de recarga, eliminación y apagado requieren confirm: true.

curl -N http://127.0.0.1:17777/api/v1/events sigue el flujo Server-Sent Events hasta pulsar Ctrl+C. Consulta la guía de API y MCP para ver la referencia completa. Estos son controles de la aplicación y las fuentes; las acciones de overlay, como destacar un mensaje, usan el dock de Social Stream y los comandos de Social Stream.

MCP opcional para un cliente de IA en el VPS

MCP permite que un cliente de IA compatible invoque controles de SSApp como herramientas. Activa la API anterior y mantén el servicio principal de la aplicación en ejecución. Registra esta configuración en un cliente que se ejecute en el 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"
      }
    }
  }
}

La ubicación de la configuración depende del cliente. Esto inicia un adaptador separado mediante entrada y salida estándar; no inicia la aplicación principal de captura. Un cliente en tu equipo doméstico apuntaría a su propio localhost, no al VPS. Usa los controles remotos habituales de Social Stream desde otro equipo.

El adaptador empaquetado está disponible desde SSApp 0.4.7; las versiones 0.4.14 y posteriores anuncian el conjunto completo de herramientas incluso antes de que la aplicación esté disponible. Las capacidades en ejecución siguen determinando qué llamadas funcionan. No hace falta instalar Node por separado. Aquí el parámetro headless de Ozone se aplica solo al adaptador MCP; conserva Xvfb para la aplicación principal.

Prueba: «Llama a ssapp_get_capabilities, después a ssapp_get_status y ssapp_list_sources. Dime qué fuentes están capturando y si alguna informa de errores». Las herramientas también cubren el inicio y la parada de fuentes, diagnósticos, eventos capturados, capturas de pantalla e interacciones autorizadas con ventanas de la aplicación. Los inicios de sesión privados y CAPTCHA siguen necesitando una persona.

Consulta: guía de API de control local y MCP para la habilidad opcional del agente, compatibilidad de versiones y más controles.

Owncast, Rocket.Chat y mensajes destacados

Puedes ejecutar SSApp en el mismo VPS que Owncast y Rocket.Chat si tiene recursos suficientes. Instalar SSApp no conecta por sí solo Rocket.Chat ni añade overlays al vídeo.

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

No hay un conector integrado de Rocket.Chat en los árboles de fuentes revisados para esta guía. Hace falta una integración separada para llevar esos mensajes a Social Stream. Comprueba que los mensajes lleguen al dock antes de configurar el overlay de vídeo.

Usa las URL del dock y del overlay de destacados que copiaste durante la configuración, con la misma sesión, contraseña y transporte. Selecciona un mensaje capturado en el dock para destacarlo. El emisor de tu servidor necesita renderizar fuentes de navegador para colocar estas páginas sobre el vídeo antes de enviar la transmisión combinada a Owncast. Consulta instrucciones de emisión de Owncast. SSApp no es ese emisor de vídeo.

Otra opción es colocar un overlay sobre un reproductor insertado en tu web: aparece en esa página, en lugar de formar parte del vídeo que reciben otros reproductores o grabaciones. Owncast documenta la inserción de vídeo y chat.

Para apagar tu equipo doméstico, la fuente de vídeo, el emisor, la captura del chat y cualquier integración de Rocket.Chat deben seguir funcionando de forma independiente. Calcula los recursos para renderizar y codificar vídeo por separado de la memoria de captura de chat de SSApp.

Comprueba todo el proceso antes de dejarlo sin supervisión

  1. Envía un mensaje real en un chat conectado y comprueba que llegue a tu dock de Social Stream.
  2. Destaca ese mensaje y confirma que cambie el overlay de destacados. Para Owncast, compruébalo también en el vídeo real que ve la audiencia.
  3. Desconecta VNC y SSH y envía más mensajes durante varios minutos. La captura debería continuar.
  4. Ejecuta sudo systemctl restart ssapp, y comprueba que vuelvan la misma sesión y fuentes, y que las fuentes activadas automáticamente reciban mensajes nuevos.
  5. Durante una ventana de mantenimiento, reinicia el VPS y repite la comprobación de mensajes. Que un proceso esté en ejecución o que la API responda correctamente no demuestra por sí solo que la captura del chat funcione.

Usa sudo systemctl status ssapp y sudo journalctl -u ssapp -n 100 --no-pager para ver el estado del servicio y los registros recientes. Para detenerlo expresamente, usa sudo systemctl stop ssapp.

Para actualizar, detén el servicio, haz una copia de seguridad de /var/lib/ssapp, sustituye el AppImage en la misma ruta y vuelve a iniciar el servicio. Conserva el ejecutable anterior hasta que la nueva versión supere las comprobaciones de mensajes.

Solución de problemas

ProblemaQué comprobar
Missing X server or $DISPLAYInicia mediante xvfb-run o inicia Xvfb y establece DISPLAY.
Xvfb termina inmediatamenteMantén -extension GLX en los argumentos de Xvfb; algunos controladores GPU instalados impiden su inicio de GLX.
El AppImage no se montaExtrae con ./socialstreamninja.AppImage --appimage-extract en un directorio con permisos de escritura y coloca la carpeta extraída en /opt/socialstream/squashfs-root. Sustituye la ruta del AppImage en los comandos de configuración, servicio y MCP por /opt/socialstream/squashfs-root/socialstreamninja.
Los comandos remotos no lleganComprueba que ambos lados usen la misma sesión y contraseña y que WebRTC o el modo WebSocket alojado estén conectados.
Las fuentes o los ajustes se mezclan entre instanciasAsigna a cada instancia un SSAPP_USER_DATA_DIR y una pantalla virtual diferentes.