Voltar ao Blog
HermesSignalDeploymentAI Agents

Como rodar o Hermes Agent no Signal (signal-cli)

Coloque o Hermes Agent no Signal com signal-cli: vincule o dispositivo, ajuste SIGNAL_HTTP_URL, feche a allowlist e suba um bot E2EE privado.

Por Hermify Team||9 min de leitura
Uma janela escura do Signal com o wordmark do Hermes Agent e um único ponto verde ao lado do nome do bot, evocando um assistente privado criptografado de ponta a ponta

Por que rodar o Hermes Agent no Signal

Se seu modelo de ameaças coloca metadados em primeiro lugar, o Signal é o mensageiro em que você já confia. A criptografia ponta a ponta vem ligada por padrão, o servidor guarda quase nada além de um número de telefone e o timestamp da última conexão, e o protocolo em si é de código aberto. Colocar seu agente de IA na mesma superfície mantém cada prompt, cada resposta e cada arquivo que você passa para ele dentro do mesmo envelope.

O Hermes Agent suporta o Signal de forma nativa através do signal-cli, um daemon não oficial mas bem mantido que fala o protocolo do Signal em seu nome. O gateway do Hermes conversa com o signal-cli por HTTP usando JSON-RPC para as ações de saída e Server-Sent Events para o fluxo de entrada, então o runtime inteiro cabe num VPS de 5 USD, no seu notebook, ou numa Raspberry Pi atrás de um NAT e ainda assim envia e recebe em tempo real.

Este guia percorre o setup completo: instalar o signal-cli, vinculá-lo à sua conta do Signal como dispositivo secundário, subir o daemon HTTP, ligá-lo ao runtime do Hermes e as armadilhas que mordem no primeiro deploy. Se você já colocou o Hermes em alguma superfície mais pública, o tutorial do Slack e o guia do Telegram cobrem o mesmo lado da stack e vale deixar abertos lado a lado.

O que você precisa antes de começar

Um deploy limpo do Signal precisa de cinco coisas no host:

  • Uma instalação do Hermes Agent funcionando. O guia do Hermes Agent no Docker é o ponto de partida mais limpo se ainda não tiver.
  • Uma API key de um provedor de modelo. Anthropic, OpenAI, OpenRouter e qualquer endpoint compatível com OpenAI servem. O runtime usa essa chave para de fato responder as mensagens.
  • Uma conta do Signal já ativada num dispositivo principal (seu celular). O signal-cli se vincula como dispositivo secundário, igual ao Signal Desktop - não registra uma conta nova.
  • Java Runtime Environment 21 ou superior. O jar do signal-cli não roda em JRE 17 nas builds atuais. O binário nativo do GraalVM dispensa esse requisito se você prefere um único executável.
  • Cerca de 20 minutos para a primeira instalação. Os redeploys seguintes levam menos de um minuto.

O número de telefone que você usar não precisa ser o do seu celular do dia a dia. Muita gente que self-hospeda dedica um segundo número (um eSIM barato, um número do Twilio, ou uma linha do Google Voice que aceite SMS) para que a conta do bot fique operacionalmente separada.

Passo 1 - Instalar o signal-cli no host

No Debian ou Ubuntu, instale o Java e baixe a release mais recente do 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

Se você prefere um único binário estático, sem depender de JRE, a build nativa com GraalVM da página de releases é um substituto direto e evita o ciclo de atualizações do Java.

Passo 2 - Vincular o signal-cli à sua conta do Signal

O signal-cli entra na sua conta como dispositivo vinculado, exatamente como o Signal Desktop. Gere uma URL de provisionamento e peça ao daemon para imprimir um QR code:

signal-cli link -n "hermes-agent"

O comando imprime uma URL sgnl://linkdevice?... e um QR no terminal. No celular, abra o Signal, vá em Configurações -> Dispositivos vinculados -> Vincular novo dispositivo e escaneie o QR. Em alguns segundos o terminal mostra algo como:

Associated with: +12025550123

Esse número em E.164 é o valor de SIGNAL_ACCOUNT para o resto da configuração. O estado em disco da identidade vinculada vive em ~/.local/share/signal-cli/. Faça backup desse diretório antes de destruir o host - é o único lugar onde ficam as chaves do dispositivo vinculado, e revincular do zero invalida o histórico pendente.

Passo 3 - Subir o daemon HTTP do signal-cli

O gateway do Hermes fala com o signal-cli por HTTP, então o daemon precisa rodar em modo HTTP atado a uma porta apenas local:

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

A flag --http expõe um endpoint JSON-RPC para enviar e um fluxo Server-Sent Events para receber. Atar em 127.0.0.1 e em nada mais; o daemon não faz autenticação própria, então qualquer processo que chegue à porta consegue enviar mensagens como se fosse você. Se o gateway roda em Docker no mesmo host, host.docker.internal:8080 ou uma rede Docker compartilhada funcionam sem expor a porta para a LAN.

Para deploys de longo prazo, deixe uma unit do systemd para o daemon reiniciar depois de um reboot. O wiki do signal-cli traz uma template pronta; os únicos campos para preencher são o número da conta e o endereço de bind.

Um terminal dividido mostrando os logs do daemon do signal-cli à esquerda e os logs do gateway do Hermes à direita, ambos conectados via localhost:8080

Passo 4 - Configurar o runtime do Hermes

Abra ~/.hermes/.env (ou o .env que seu container lê) e adicione:

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

Uma nota sobre cada um:

  • SIGNAL_HTTP_URL - o endpoint do daemon local do passo 3. Sempre http://, sempre loopback ou rede privada.
  • SIGNAL_ACCOUNT - o número em E.164 da identidade do Signal vinculada. Tem que bater exatamente com o que o signal-cli link reportou.
  • SIGNAL_ALLOWED_USERS - números E.164 ou UUIDs do Signal separados por vírgula que podem falar com o bot. Sem essa variável (e sem pareamento de DM), o gateway nega toda mensagem de entrada como padrão seguro. É o controle de segurança mais importante de toda a pilha.
  • SIGNAL_GROUP_ALLOWED_USERS (opcional) - IDs de grupo separados por vírgula onde o bot pode responder. Os IDs saem de signal-cli listGroups -d. Deixe em branco para desligar o suporte a grupos.
  • SIGNAL_HOME_CHANNEL (opcional) - o destino padrão de tarefas agendadas, cron jobs e notificações disparadas por skills. Sem valor, a saída proativa vai para o primeiro usuário permitido.

Faça chmod 600 ~/.hermes/.env depois de salvar. A combinação da identidade vinculada do Signal com as chaves do seu provedor de modelo permite que qualquer um que leia esse arquivo se passe pelo bot e queime seus tokens - trate como uma chave SSH.

Passo 5 - Subir o gateway e mandar a primeira mensagem

Reinicie o gateway do Hermes para ele pegar o novo ambiente:

hermes gateway restart

Acompanhe os logs e procure duas linhas, nesta ordem:

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

A partir do número permitido, abra o Signal e mande um DM para o número do bot. O Hermes responde na mesma thread, com memória persistente e contexto de skills intactos - o tutorial de memória e skills explica o que está acontecendo por baixo. Anexos de até 100 MB sobem pela mesma API de upload do Signal que uma mensagem comum, então prints, áudios e PDFs passam sem encanamento extra.

Uma thread do Signal mostrando uma troca privada entre um usuário e o bot do Hermes, com os indicadores de criptografia ponta a ponta visíveis no topo da tela

Os erros que mordem primeiro

Cinco erros explicam quase todo "o setup do Signal está quebrado" do suporte:

Esquecer de vincular o dispositivo. Subir signal-cli daemon numa conta não vinculada não imprime erro nenhum - o daemon sobe e silenciosamente recusa toda mensagem. Se os logs mostram zero eventos e zero tentativas de envio, rode signal-cli listAccounts e confirme que seu número aparece.

Versão errada do JRE. As builds atuais do signal-cli precisam de JRE 21. Em servidores antigos travados em JRE 17 ou 11, o jar falha com erro de versão de classe assim que você chama --http. Suba a versão do Java ou use o binário nativo do GraalVM.

SIGNAL_ALLOWED_USERS vazio. O padrão é negar todo mundo. É de propósito - um número vazado da conta do bot deixaria qualquer pessoa no mundo te mandar prompts e queimar seus tokens. O bot parecer morto para um testador de primeira viagem que esqueceu de pôr o próprio número é o alarme falso mais frequente.

Daemon atado em 0.0.0.0. O daemon HTTP não faz autenticação. Atar em uma interface pública significa que qualquer um que chegue à porta consegue mandar mensagens do Signal como se fosse você. Sempre 127.0.0.1 ou rede Docker privada.

Estado de dispositivo vinculado obsoleto. Rodar signal-cli link de novo sobrescreve o diretório de estado local. O novo vínculo funciona, mas o Hermes está olhando para uma identidade diferente da que o .env declara. Ou mantenha o SIGNAL_ACCOUNT antigo ao revincular, ou atualize o env com o número novo impresso pelo comando.

Se o problema parece do Signal mas os sintomas são mais gerais - respostas faltando, deriva de memória, erros do provedor - o guia de troubleshooting do Telegram cobre os problemas de gateway e provedor com mais profundidade. A maioria é independente da superfície.

Signal ao lado de Telegram e Slack

| Aspecto | Signal | Telegram | Slack | |---|---|---|---| | Tempo de setup | 20 min (link + daemon) | 5 min (token do BotFather) | 15 min (manifesto + 2 tokens) | | Criptografia | E2E por padrão | Chats secretos opt-in | Só do lado do servidor | | Metadados guardados | Quase nada | Histórico no servidor | Retenção por workspace | | Modelo de conta | Número de telefone vinculado | Conta de bot, sem número | Usuário bot no workspace | | Campo da allowlist | SIGNAL_ALLOWED_USERS (E.164) | TELEGRAM_ALLOWED_USERS (numérico) | SLACK_ALLOWED_USERS (numérico) | | Melhor para | Pessoas e times pequenos com foco em privacidade | Uso pessoal, mobile-first, voice-mode | Workflows de time e contexto de canais |

As três superfícies não são exclusivas. O mesmo runtime do Hermes entrega para as três ao mesmo tempo, multiplexando sobre um único repositório de memória. Um founder com um agente pessoal no Signal e um agente de time no Slack a partir da mesma instalação é um padrão comum.

Pule o encanamento do Signal

Os passos acima são tratáveis, mas deixam o host nas suas mãos: manter o signal-cli atualizado, fazer backup do estado do dispositivo vinculado, rotacionar o JRE, ficar de olho em restarts do daemon. Para uma instalação pessoal está ok. Para qualquer coisa que você queira viva em minutos e depois esquecer, o Hermify provisiona um runtime gerenciado do Hermes com a ponte de Signal pronta para vincular, criptografa sua config SIGNAL_* em repouso e mantém o daemon do signal-cli saudável em um servidor persistente onde você nunca precisa entrar por SSH.

Você traz o número do Signal e uma chave de provedor de modelo; a plataforma cuida de tudo abaixo. Se quiser comparar o que fica sob seu controle e o que é delegado, o comparativo entre self-hosting e gerenciado abre os números de manutenção e custo. E se o custo é o que trava, o guia de VPS baratos mostra como é de verdade um self-host de 5 USD/mês. Comece com a Hermify quando quiser pular o encanamento de vez.

Fontes

Lance seu próprio agente Hermes

Traga sua chave de API, conecte o Telegram e tenha um agente de IA que evolui sozinho no ar em 60 segundos.

Começar agora