Volver al Blog
HermesSignalDeploymentAI Agents

Cómo desplegar Hermes Agent en Signal (signal-cli)

Despliega Hermes Agent en Signal con signal-cli: enlaza el dispositivo, configura SIGNAL_HTTP_URL, cierra la allowlist y lanza un bot E2EE privado.

Por Hermify Team||9 min de lectura
Una ventana oscura de Signal con el wordmark de Hermes Agent y un único punto verde junto al nombre del bot, evocando un asistente privado cifrado de extremo a extremo

Por qué tener Hermes Agent dentro de Signal

Si tu modelo de amenazas pone los metadatos primero, Signal es el mensajero en el que ya confías. El cifrado de extremo a extremo está activado por defecto, el servidor guarda casi nada más allá de un número de teléfono y la última vez que te conectaste, y el propio protocolo es de código abierto. Meter a tu agente de IA en esa misma superficie mantiene cada prompt, cada respuesta y cada archivo que le pases dentro del mismo sobre.

Hermes Agent soporta Signal de forma nativa a través de signal-cli, un daemon no oficial pero bien mantenido que habla el protocolo de Signal en tu nombre. El gateway de Hermes habla con signal-cli por HTTP usando JSON-RPC para las acciones salientes y Server-Sent Events para el flujo entrante, así que el runtime entero puede vivir en un VPS de 5 USD, en tu portátil o en una Raspberry Pi detrás de un NAT y aun así enviar y recibir en tiempo real.

Esta guía recorre la configuración completa: instalar signal-cli, enlazarlo a tu cuenta de Signal como dispositivo secundario, arrancar el daemon HTTP, conectarlo al runtime de Hermes y los baches que muerden en el primer despliegue. Si ya tienes Hermes en alguna superficie más pública, el tutorial de Slack y la guía de Telegram cubren el mismo extremo del stack y conviene tenerlos abiertos al lado.

Lo que necesitas antes de empezar

Un despliegue limpio de Signal necesita cinco piezas en el host:

  • Una instalación de Hermes Agent funcionando. La guía de Hermes Agent en Docker es el punto de partida más limpio si todavía no la tienes.
  • Una API key de un proveedor de modelos. Anthropic, OpenAI, OpenRouter y cualquier endpoint compatible con OpenAI sirven. El runtime la usa para responder de verdad a los mensajes.
  • Una cuenta de Signal ya activada en un dispositivo principal (tu teléfono). signal-cli se enlaza como dispositivo secundario, igual que Signal Desktop - no registra una cuenta nueva.
  • Java Runtime Environment 21 o superior. El jar de signal-cli no arranca con JRE 17 en las builds actuales. El binario nativo de GraalVM evita este requisito si prefieres un único ejecutable.
  • Unos 20 minutos para la primera instalación. Los redespliegues posteriores tardan menos de un minuto.

El número de teléfono que uses no tiene por qué ser el de tu móvil del día a día. Mucha gente que se autohospeda dedica un segundo número (una eSIM barata, un número de Twilio o una línea de Google Voice que acepte SMS) para que la cuenta del bot quede operativamente separada.

Paso 1 - Instalar signal-cli en tu host

En Debian o Ubuntu, instala Java y baja la última release de signal-cli:

sudo apt update
sudo apt install -y curl openjdk-21-jre
VERSION=$(curl -s https://api.github.com/repos/AsamK/signal-cli/releases/latest | jq -r .tag_name | sed 's/^v//')
curl -L -o /tmp/signal-cli.tar.gz \
  "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux.tar.gz"
sudo tar -xf /tmp/signal-cli.tar.gz -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/signal-cli
signal-cli --version

Si prefieres un único binario estático sin dependencia de JRE, la build nativa con GraalVM de la página de releases es un reemplazo directo y te evita el ciclo de actualizaciones de Java.

Paso 2 - Enlazar signal-cli con tu cuenta de Signal

signal-cli se une a tu cuenta como un dispositivo enlazado, exactamente igual que Signal Desktop. Genera una URL de aprovisionamiento y haz que el daemon imprima un código QR:

signal-cli link -n "hermes-agent"

El comando imprime una URL sgnl://linkdevice?... y un QR en el terminal. En tu teléfono, abre Signal, ve a Ajustes -> Dispositivos enlazados -> Enlazar nuevo dispositivo y escanea el QR. En unos segundos el terminal te muestra algo como:

Associated with: +12025550123

Ese número en formato E.164 es tu SIGNAL_ACCOUNT para el resto de la configuración. El estado en disco de la identidad enlazada vive en ~/.local/share/signal-cli/. Haz copia de seguridad de ese directorio antes de destruir el host - es el único lugar donde se guardan las claves del dispositivo enlazado, y volver a enlazar desde cero invalida el historial pendiente.

Paso 3 - Arrancar el daemon HTTP de signal-cli

El gateway de Hermes habla con signal-cli por HTTP, así que el daemon necesita correr en modo HTTP atado a un puerto solo accesible localmente:

signal-cli -a +12025550123 daemon --http 127.0.0.1:8080

El flag --http expone un endpoint JSON-RPC para enviar y un flujo Server-Sent Events para recibir. Átalo a 127.0.0.1 y a nada más; el daemon no hace autenticación propia, así que cualquier proceso que pueda alcanzar el puerto puede enviar mensajes como si fueras tú. Si el gateway corre en Docker en el mismo host, host.docker.internal:8080 o una red Docker compartida funcionan sin exponer el puerto a la LAN.

Para despliegues de largo plazo, deja una unit de systemd para que el daemon se reinicie tras un reboot. El wiki de signal-cli tiene una plantilla lista; los únicos campos que tienes que rellenar son el número de cuenta y la dirección de bind.

Un terminal dividido mostrando los logs del daemon de signal-cli a la izquierda y los logs del gateway de Hermes a la derecha, conectados por localhost:8080

Paso 4 - Configurar el runtime de Hermes

Abre ~/.hermes/.env (o el .env que lea tu contenedor) y añade:

SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+12025550123
SIGNAL_ALLOWED_USERS=+34611222333,+12025557788
SIGNAL_GROUP_ALLOWED_USERS=group.abc123==
SIGNAL_HOME_CHANNEL=+34611222333

Una nota sobre cada uno:

  • SIGNAL_HTTP_URL - el endpoint del daemon local del paso 3. Siempre http://, siempre loopback o red privada.
  • SIGNAL_ACCOUNT - el número en E.164 de la identidad de Signal enlazada. Tiene que coincidir exactamente con lo que reportó signal-cli link.
  • SIGNAL_ALLOWED_USERS - números E.164 o UUIDs de Signal separados por comas a los que se les permite hablar con el bot. Sin esto (y sin emparejar el DM), el gateway rechaza todo mensaje entrante como medida segura por defecto. Es el control de seguridad más importante de todo el stack.
  • SIGNAL_GROUP_ALLOWED_USERS (opcional) - IDs de grupo separados por comas donde el bot puede responder. Los IDs salen de signal-cli listGroups -d. Déjalo vacío para desactivar el soporte de grupos.
  • SIGNAL_HOME_CHANNEL (opcional) - el destino por defecto para tareas programadas, cron jobs y notificaciones disparadas por skills. Sin valor, la salida proactiva va al primer usuario permitido.

Haz chmod 600 ~/.hermes/.env después de guardar. La combinación de la identidad de Signal enlazada y tus claves del proveedor de modelos permite a quien lea ese archivo suplantar al bot y quemarte los tokens - trátalo como una clave SSH.

Paso 5 - Arrancar el gateway y mandar el primer mensaje

Reinicia el gateway de Hermes para que recoja el nuevo entorno:

hermes gateway restart

Sigue los logs y busca dos líneas, en este orden:

signal: connecting to http://127.0.0.1:8080
signal: subscribed to receive stream for +12025550123

Desde el teléfono permitido, abre Signal y mándale un DM al número del bot. Hermes responde en el mismo hilo, con memoria persistente y contexto de skills intactos - el tutorial de memoria y skills cuenta qué está pasando por debajo. Los adjuntos de hasta 100 MB viajan por la misma API de subida de Signal que un mensaje normal, así que capturas, notas de voz y PDFs fluyen sin tubería adicional.

Un hilo de Signal mostrando un intercambio privado entre un usuario y el bot de Hermes, con los indicadores de cifrado de extremo a extremo visibles en la parte superior de la pantalla

Los fallos que muerden primero

Cinco errores explican casi todo el "el setup de Signal está roto" del soporte:

Olvidarse de enlazar el dispositivo. Arrancar signal-cli daemon contra una cuenta no enlazada no imprime error - el daemon arranca y rechaza silenciosamente cada mensaje. Si los logs muestran cero eventos y cero intentos de envío, ejecuta signal-cli listAccounts y confirma que tu número aparece.

Versión de JRE incorrecta. Las builds actuales de signal-cli necesitan JRE 21. En servidores viejos clavados a JRE 17 u 11, el jar falla con un error de versión de clase en cuanto invocas --http. Sube la versión de Java o usa el binario nativo de GraalVM.

SIGNAL_ALLOWED_USERS vacío. El valor por defecto es rechazar a todo el mundo. Es deliberado - un número de teléfono filtrado del bot dejaría que cualquiera en el mundo te mandase prompts y te quemase los tokens. Que el bot parezca muerto cuando alguien que prueba por primera vez se olvida de añadir su propio número es la falsa alarma más frecuente.

Daemon atado a 0.0.0.0. El daemon HTTP no hace autenticación. Atarlo a una interfaz pública significa que cualquiera que llegue al puerto puede enviar mensajes de Signal como si fueras tú. Siempre 127.0.0.1 o red Docker privada.

Estado de dispositivo enlazado obsoleto. Volver a ejecutar signal-cli link sobrescribe el directorio de estado local. El nuevo enlace funciona, pero Hermes está mirando una identidad distinta a la que declara el .env. O mantienes el SIGNAL_ACCOUNT antiguo al reenlazar, o actualizas el env al nuevo número que imprima el comando de link.

Si el problema parece de Signal pero los síntomas son más generales - respuestas que faltan, deriva de memoria, errores del proveedor - la guía de troubleshooting de Telegram cubre los problemas de gateway y proveedor con más profundidad. La mayoría son agnósticos a la superficie.

Signal al lado de Telegram y Slack

| Aspecto | Signal | Telegram | Slack | |---|---|---|---| | Tiempo de setup | 20 min (link + daemon) | 5 min (token de BotFather) | 15 min (manifiesto + 2 tokens) | | Cifrado | E2E por defecto | Chats secretos opt-in | Solo del lado del servidor | | Metadatos guardados | Casi nada | Historial en servidor | Retención por workspace | | Modelo de cuenta | Número de teléfono enlazado | Cuenta de bot, sin número | Usuario bot en el workspace | | Campo de allowlist | SIGNAL_ALLOWED_USERS (E.164) | TELEGRAM_ALLOWED_USERS (numérico) | SLACK_ALLOWED_USERS (numérico) | | Mejor para | Individuos y equipos pequeños con foco en privacidad | Uso personal, mobile-first, voice-mode | Workflows de equipo y contexto de canales |

Las tres superficies no son excluyentes. El mismo runtime de Hermes puede entregar a todas a la vez, multiplexando sobre un único almacén de memoria. Un founder con un agente personal en Signal y un agente de equipo en Slack desde la misma instalación es un patrón común.

Salta la fontanería de Signal

Los pasos de arriba son llevaderos, pero te dejan el host a cuestas: mantener signal-cli actualizado, hacer backup del estado del dispositivo enlazado, rotar el JRE, vigilar reinicios del daemon. Para una instalación personal está bien. Para cualquier cosa que quieras tener viva en minutos y olvidarte, Hermify provisiona un runtime gestionado de Hermes con el puente de Signal listo para enlazar, cifra tu config SIGNAL_* en reposo y mantiene sano el daemon de signal-cli en un servidor persistente al que nunca tienes que entrar por SSH.

Tú pones el número de Signal y una clave de proveedor de modelo; la plataforma se encarga de todo lo de abajo. Si quieres comparar qué se queda bajo tu control y qué se cede, la comparativa entre autohospedaje y gestionado desglosa los números de mantenimiento y coste. Y si el coste es lo que te frena, la guía de VPS baratos muestra cómo es de verdad un autohospedaje de 5 USD/mes. Empieza con Hermify cuando quieras saltarte la fontanería del todo.

Fuentes

Lanza tu propio agente Hermes

Trae tu clave de API, conecta Telegram y ten un agente de IA que evoluciona solo activo en 60 segundos.

Empezar