SSD Nodes Learn 🎉 VPS desde $4.99/mes
Guías Matt ConnorPor Matt Connor

Acceder a tu agente Hermes desde el teléfono

Explica cómo abrir el panel de Hermes desde el teléfono mediante Tailscale, HTTPS público o SSH, y cómo revocar el acceso si pierdes el dispositivo.

Las tres formas de acceder a tu agente Hermes desde el teléfono

Para acceder a tu agente Hermes desde el teléfono se utiliza su panel web. La decisión real es qué componente se coloca delante de ese panel. La primera opción es una red de malla privada. El panel escucha sólo en una dirección de Tailscale y ningún puerto queda expuesto a Internet. La segunda opción es un endpoint público detrás de un proxy inverso con TLS (seguridad de la capa de transporte) y un inicio de sesión. En este caso, ese inicio de sesión es la única protección de un terminal con acceso al servidor. La tercera opción es SSH (shell seguro) desde una aplicación de terminal. Requiere la menor configuración y proporciona el mayor nivel de acceso.

Esta guía comienza donde termina ejecutar un agente Hermes en tu propio VPS. El agente está instalado, responde en la línea de comandos y ahora quieres tenerlo disponible en el teléfono.

Los comandos siguientes se basan en la etiqueta v2026.8.3, publicada el 3 de agosto de 2026 y denominada v0.20.0 en las notas de la versión. Hermes publica versiones con frecuencia, así que fija la máquina a una etiqueta en lugar de seguir main. El instalador acepta un commit:

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes version

hermes version muestra lo que está instalado realmente. Compáralo con la etiqueta antes de confiar en cualquier opción de esta página.

Qué incluye el repositorio y qué no incluye

No hay ninguna aplicación para iOS o Android en el repositorio de Hermes. El cliente nativo es hermes desktop (alias hermes gui), una aplicación Electron para macOS, Windows y Linux. Puede conectarse a un agente remoto en lugar de uno local: establezca la URL remota en http://<server-address>:9119 en Settings, dentro de Gateway, o exporte HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 antes de iniciarlo. Esto resuelve el uso desde un segundo portátil. No sirve para un teléfono.

La interfaz que se usa desde un teléfono es hermes dashboard, la interfaz del navegador. Permite administrar la configuración, las sesiones, las tareas cron, las skills, los registros y las plataformas de mensajería, e incluye un terminal: el servidor inicia hermes --tui detrás de una PTY (pseudo-terminal) y transmite la salida a la página. En una pantalla estrecha, el selector de sesiones se convierte en un panel superpuesto, por lo que el diseño se adapta a un teléfono.

De forma predeterminada, el dashboard escucha en 127.0.0.1:9119 y abre una pestaña del navegador en el propio servidor, lo que no sirve en un VPS (virtual private server) sin interfaz gráfica. Inícielo sin el navegador y revise el socket:

hermes dashboard --no-open
ss -lntp | grep 9119

Un proceso que escucha en 127.0.0.1:9119 sólo es accesible desde el servidor. Uno que escucha en 0.0.0.0:9119 es accesible desde todas las redes a las que está conectada la máquina, incluida la red pública. Esa línea determina el nivel de exposición, así que léala en lugar de darlo por supuesto.

Opción 1: una red mesh privada con Tailscale

Elija esta opción salvo que tenga un motivo para no hacerlo. Tailscale es una VPN mesh (red privada virtual) basada en WireGuard. Cada dispositivo que registre obtiene una dirección estable y se comunica directamente con los demás. El teléfono se une a la misma mesh, por lo que el dashboard no necesita ningún puerto público.

En el servidor:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4

Instale la aplicación de Tailscale en el teléfono e inicie sesión con la misma cuenta. tailscale status en el servidor muestra entonces el teléfono por su nombre. Ahora haga que el dashboard escuche en la dirección que mostró tailscale ip -4:

hermes dashboard --host 100.101.102.103 --port 9119 --no-open

Escuchar en la dirección de la mesh, en lugar de hacerlo en 0.0.0.0, significa que el socket de escucha sólo existe en la interfaz de Tailscale. Un escaneo de puertos de su dirección IP pública no encuentra nada en 9119 porque no hay ningún proceso escuchando allí. Por tanto, el firewall ya no es lo único que le protege. Confírmelo ejecutando de nuevo ss -lntp | grep 9119.

La dirección de escucha también determina la autenticación, y este es el punto que muchos pasan por alto. En 127.0.0.1 el dashboard no tiene inicio de sesión. En cualquier otra dirección, la puerta de autenticación es obligatoria y, si no hay ningún proveedor configurado, el servidor se niega a iniciar. El proyecto denomina a esto fallo cerrado. Ejecútelo de forma interactiva la primera vez. Le ofrecerá configurar un nombre de usuario y una contraseña en ese momento. El resultado se escribe en ~/.hermes/.env:

HERMES_DASHBOARD_BASIC_AUTH_USERNAME=you
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=scrypt$16384$8$1$...
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-string

Genere ese secreto con openssl rand -hex 32 y no lo modifique después. Firma la cookie de sesión, por lo que cambiarlo cierra la sesión en todos los dispositivos. El mismo archivo contiene las claves de API de sus modelos, así que protéjalo con chmod 600 ~/.hermes/.env.

Compruebe la puerta de autenticación desde otro equipo de la mesh antes de confiar en ella:

curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'

true seguido de ["basic"] significa que la puerta está activa y que el proveedor de contraseñas es el que responde. La documentación del propio proyecto es clara sobre ese proveedor: está pensado para una red de confianza o una VPN, y no es adecuado para un dashboard expuesto a Internet pública. En una mesh, esa es exactamente la situación en la que se encuentra.

Para usar HTTPS dentro de la tailnet, entregue el puerto a Tailscale:

sudo tailscale serve --bg localhost:9119
sudo tailscale serve status

Tailscale termina TLS con un certificado emitido para el nombre MagicDNS de la máquina. Así, el navegador deja de mostrar advertencias y la cookie de sesión obtiene su indicador Secure. Active primero MagicDNS y HTTPS Certificates en la página DNS de la consola de administración de Tailscale. Lea también el aviso que aparece allí: los nombres de sus máquinas y el nombre DNS de su tailnet se publican en el registro público de transparencia de certificados, que cualquiera puede consultar.

El coste real en este caso es el servidor de coordinación. El tráfico entre el teléfono y su VPS está cifrado de extremo a extremo y no pasa por Tailscale, pero la cuenta que decide qué dispositivos pertenecen a la mesh no está en su hardware. Si esto es importante para usted, ejecute el plano de control por su cuenta con Headscale, el servidor de control de Tailscale autohospedado y dirija los clientes hacia él usando tailscale up --login-server https://headscale.example.com. Si prefiere prescindir de la mesh y configurar los peers manualmente, la comparación entre WireGuard sin configuración adicional y Tailscale explica qué aspectos pierde.

Opción 2: un endpoint HTTPS público y la trampa que contiene

A veces no hay una mesh disponible. Es posible que un teléfono de trabajo no permita instalar un cliente VPN. En ese caso, el dashboard se coloca detrás de un reverse proxy. Mantenga el dashboard en loopback y deje que Caddy gestione el certificado:

hermes.example.com {
  reverse_proxy 127.0.0.1:9119
}

Caddy obtiene y renueva el certificado por su cuenta. Su reverse_proxy permite pasar las actualizaciones de WebSocket sin directivas adicionales, que es lo que necesita el terminal integrado del dashboard. En nginx debe añadir manualmente las cabeceras Upgrade y Connection. La emisión de un certificado de Let's Encrypt con Certbot en nginx cubre la parte TLS de esa tarea. Indique a Hermes su nombre público para que las devoluciones de autenticación apunten al host correcto:

dashboard:
  public_url: "https://hermes.example.com"

Ahora viene la trampa. La puerta de autenticación se basa en la dirección de enlace, no en la dirección desde la que llegó la petición. Un dashboard enlazado a 127.0.0.1 detrás de un proxy ve loopback, decide que no hace falta iniciar sesión y sirve el contenido a cualquiera que el proxy deje pasar. Compruebe qué ha publicado realmente:

curl -s https://hermes.example.com/api/status | jq '.auth_required'

Si muestra false, Internet está a una URL de distancia de un terminal en su servidor. No interviene ningún exploit y nada lo indicará en los registros. Hay dos soluciones y debe aplicar al menos una. Puede configurar la autenticación en el proxy, con Authentik como proveedor de inicio de sesión único autoalojado delante mediante forward auth, o configurar el proveedor OIDC (OpenID Connect) del propio dashboard:

HERMES_DASHBOARD_OIDC_ISSUER=https://auth.example.com/application/o/hermes/
HERMES_DASHBOARD_OIDC_CLIENT_ID=hermes-dashboard
HERMES_DASHBOARD_OIDC_SCOPES="openid profile email"

Incluso configurada correctamente, esta opción tiene un límite mínimo que no puede reducir. Una página de inicio de sesión pública es accesible y atacable por cualquiera, y detrás de ella hay un shell en su VPS. Un nombre de usuario y una contraseña ofrecen una protección débil para ese caso. Por eso la documentación recomienda OAuth u OIDC para los enlaces públicos. Aplique límites de tasa al inicio de sesión, mantenga ufw cerrado para todo excepto los puertos del proxy y SSH y revise de vez en cuando el registro de acceso.

Opción 3: SSH y mosh desde un terminal móvil

La opción que requiere menos esfuerzo: instale una aplicación de terminal en el teléfono, cargue una clave SSH y use la interfaz de texto del propio agente.

ssh you@vps.example.com
tmux new -A -s phone
hermes --tui

tmux new -A -s phone se conecta a una sesión llamada phone, o la crea si no existe. Así, el agente sigue ejecutándose cuando se interrumpe la conexión y la próxima vez vuelve al mismo punto. El patrón es el mismo que se usa para controlar Claude Code desde un teléfono.

SSH sin más sobre una red móvil resulta incómodo porque la conexión se interrumpe cuando el teléfono cambia de dirección o entra en suspensión. Mosh resuelve este problema. Funciona sobre UDP (protocolo de datagramas de usuario) y sincroniza el estado del terminal en lugar de un flujo de bytes. Por eso la sesión sobrevive al cambio de wifi a la red móvil:

sudo apt install -y mosh
sudo ufw allow 60000:61000/udp

Desde el teléfono, ejecute mosh you@vps.example.com. Mosh inicia mosh-server mediante la sesión SSH existente y después mueve la sesión a UDP en el intervalo de 60000 a 61000. Por eso ese intervalo debe estar abierto.

El coste de seguridad es el habitual. Una sesión SSH es un shell, y un shell puede hacer todo lo que esa cuenta tenga permitido hacer. Las solicitudes de aprobación del agente son entonces la última barrera entre un teléfono desbloqueado robado y sus archivos. Use una cuenta dedicada que no sea root y sólo con clave. Antes de poner una clave en un dispositivo que lleva consigo, siga reforzar la seguridad de SSH en un VPS.

Qué falla en una red móvil

Hay cuatro problemas, y ninguno se puede resolver cambiando la configuración.

El panel cierra la sesión mientras no lo está mirando. Los tokens de acceso tienen un TTL (tiempo de vida) de 15 minutos y el contrato actual de la API no incluye un token de actualización. Cuando el token caduca, la página recibe la respuesta 401 y vuelve a /login. Abra el panel, guarde el teléfono en el bolsillo durante veinte minutos y volverá a la pantalla de inicio de sesión con todo lo que estaba escribiendo perdido. No hay ningún fallo. Vuelva a iniciar sesión.

El terminal integrado no sobrevive a una pestaña en segundo plano. El servidor inicia la TUI (interfaz de usuario de texto) detrás de una PTY y la cierra correctamente cuando se cierra la pestaña; al volver a abrirla, inicia una nueva. Los navegadores móviles descartan las pestañas en segundo plano para recuperar memoria, por lo que cambiar a otra aplicación durante suficiente tiempo termina ese terminal. El historial del chat está a salvo, porque las sesiones se almacenan en el servidor y hermes sessions list todavía las muestra. No es posible volver a conectarse al terminal en sí. Si necesita una sesión que sobreviva, use tmux mediante SSH.

Las conexiones inactivas se interrumpen sin avisar. Los operadores móviles eliminan las conexiones TCP inactivas para recuperar entradas de las tablas NAT (traducción de direcciones de red), y el teléfono deja de atender la red casi por completo cuando se apaga la pantalla. Un WebSocket que ha permanecido inactivo durante un tiempo normalmente ya está desconectado cuando desbloquea el teléfono, y la página sólo vuelve a conectarse después de que usted la toque. Por eso mosh funciona mejor que SSH en un teléfono: nunca tuvo una conexión que perder.

No se envía ninguna notificación. Ni el panel ni una sesión SSH pueden activar el teléfono. No hay ninguna aplicación Hermes en el dispositivo, por lo que no existe una ruta hasta el servicio de notificaciones push de la plataforma. Una ejecución larga del agente termina y usted se entera la próxima vez que lo comprueba.

Las notificaciones llegan a través de la pasarela de mensajería

La solución para este último problema es la pasarela, que ofrece una forma completamente distinta de acceder al agente. hermes gateway conecta el agente con plataformas de mensajería como Telegram, Discord, Slack, WhatsApp, Signal y el correo electrónico. Así puede hablar con el agente desde una aplicación que ya tiene un canal de notificaciones push en el teléfono, gestiona la entrega en segundo plano y tolera las interrupciones de red.

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install registra la pasarela como un servicio de systemd para que vuelva a iniciarse después de un reinicio. El instalador de Hermes no crea unidades de servicio, por lo que hermes dashboard no volverá a iniciarse por sí solo tras un reinicio. Cree una unidad para cada componente del que dependa. crear servicios y temporizadores de systemd en un VPS explica cómo crear el archivo.

Un trabajo programado también puede enviar un resultado de la misma forma, sin que intervenga ninguna conversación:

hermes send -t telegram -s "Backup report" -f /home/you/report.txt

La autorización deniega el acceso de forma predeterminada. Si no se configura una lista de permitidos y GATEWAY_ALLOW_ALL_USERS no está definido, se rechaza a todos los usuarios. Este es el punto de partida correcto. Indique las cuentas que desea permitir en ~/.hermes/.env:

TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

También puede activar el emparejamiento mediante códigos en lugar de pegar identificadores numéricos, estableciendo unauthorized_dm_behavior: pair en ~/.hermes/config.yaml. Una cuenta desconocida que envíe un mensaje al agente recibirá un código de ocho caracteres. No ocurrirá nada más hasta que lo apruebe:

hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789

Los códigos caducan al cabo de una hora. Cada usuario puede solicitar uno cada diez minutos. Cinco intentos fallidos bloquean esa cuenta.

Limitar el alcance de un teléfono robado

Un teléfono que puede acceder a tu agente puede ejecutar comandos en tu servidor, y los teléfonos se pierden. Decide ahora qué puede hacer la persona que lo tenga.

Mantén activadas las aprobaciones. approvals.mode tiene smart de forma predeterminada, lo que pide a un modelo auxiliar que evalúe el riesgo y aprueba automáticamente sólo los comandos de bajo riesgo. Establecerlo en off equivale a ejecutar todo con --yolo, y HERMES_YOLO_MODE=1 lo hace mediante el entorno. No lleves un teléfono que se comunique con un agente en ese estado. Establece approvals.cron_mode: deny para que los trabajos programados no puedan aprobarse por sí mismos mientras duermes.

approvals:
  mode: smart
  cron_mode: deny

Dale al agente un entorno más limitado para reducir los daños. terminal.backend: docker ejecuta los comandos dentro de un contenedor que elimina todas las capacidades de Linux salvo una lista breve, establece no-new-privileges y limita el número de procesos, de modo que el contenedor se convierte en el límite de seguridad en lugar de una instrucción. terminal.cwd fija el directorio de trabajo. HERMES_WRITE_SAFE_ROOT restringe write_file y patch a los directorios que indiques, y cualquier escritura fuera de ellos se bloquea sin posibilidad de anularla mediante una aprobación.

export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermes

Hermes ya bloquea las escrituras en ~/.ssh, ~/.aws, ~/.kube y /etc/sudoers, rechaza escribir archivos .env en cualquier ubicación del disco y rechaza una lista estricta de comandos destructivos independientemente de la configuración de aprobación. Considéralo un nivel mínimo de protección, no tu plan de seguridad. Ejecuta el agente como un usuario normal, nunca como root. El mismo razonamiento se aplica a cualquier agente de programación que dejes ejecutándose sin supervisión, y ejecutar Claude Code de forma segura en un VPS lo explica con más detalle.

Después, documenta los pasos de revocación antes de necesitarlos. Eliminar el dispositivo en la consola de administración de Tailscale corta inmediatamente el acceso a la red mallada. Cambiar HERMES_DASHBOARD_BASIC_AUTH_SECRET y reiniciar invalida todas las sesiones del panel en todos los dispositivos, porque ese valor firma la cookie de sesión. Eliminar la clave pública del teléfono de ~/.ssh/authorized_keys finaliza el acceso SSH. hermes pairing revoke telegram <user-id> elimina una cuenta de mensajería. Si el dispositivo podía leer algo que permitiera acceder a las claves de tu proveedor, revócalas con hermes auth logout <provider> y emite otras nuevas en el proveedor.

Comprueba el resultado en lugar de darlo por supuesto. Estos comandos deben ejecutarse en tu propio equipo, y lo que muestran depende de tu configuración:

tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deep

Los registros se encuentran en ~/.hermes/logs/. Léelos después de un incidente y revísalos periódicamente aunque no haya ocurrido ninguno.

FAQ

¿Existe una aplicación móvil oficial de Hermes para iOS o Android?

No. El repositorio de Hermes incluye una interfaz de línea de comandos, un panel web y un cliente de escritorio basado en Electron para macOS, Windows y Linux. No existe una compilación oficial para iOS o Android. Desde un teléfono puede usar el panel web en un navegador, un cliente SSH o una plataforma de mensajería conectada mediante hermes gateway. También existen clientes móviles de terceros. Como su código de terceros almacena las credenciales de su agente, revise el código fuente antes de instalar uno.

¿Por qué el panel de Hermes cierra mi sesión en el teléfono?

Los tokens de acceso tienen un TTL de 15 minutos y el contrato actual de la API no incluye un token de renovación. Cuando el token caduca, la página recibe un 401 y navega a /login. Esto resulta evidente al dejar el navegador en segundo plano en un teléfono, porque veinte minutos en otra aplicación bastan para que ocurra. Establezca HERMES_DASHBOARD_BASIC_AUTH_SECRET en un valor aleatorio estable para que la clave de firma de la sesión no cambie entre reinicios. Esto elimina la segunda causa del cierre de sesión.

¿Puedo publicar el panel de Hermes en Internet de forma segura?

Sólo si ha verificado personalmente la autenticación. El mecanismo de autenticación se activa según la dirección de enlace. Por eso, un panel enlazado a 127.0.0.1 detrás de un reverse proxy nunca solicita credenciales a los usuarios de Internet. Ejecute curl -s https://your-host/api/status | jq '.auth_required' y revise la respuesta. Use OAuth u OIDC en lugar de un nombre de usuario y una contraseña, porque la documentación del proyecto indica que el proveedor de contraseñas está destinado a redes de confianza y VPN. Una red mesh privada evita por completo esta cuestión, por lo que es la opción predeterminada más adecuada.

¿Necesito una cuenta de Tailscale o puedo alojar yo mismo el plano de control?

Puede alojarlo usted mismo. Headscale es una implementación abierta del servidor de coordinación de Tailscale, y los clientes oficiales de Tailscale se conectan a él mediante tailscale up --login-server https://headscale.example.com. De este modo, usted administra la lista de dispositivos autorizados a acceder a la red mesh. El coste es que debe ejecutar y respaldar ese servidor. Mientras esté fuera de servicio, no podrá inscribir ni volver a autenticar un dispositivo.

¿Cómo recibo una notificación en el teléfono cuando el agente termina un trabajo?

Use la pasarela de mensajería. El panel y SSH no pueden activar un teléfono, porque no existe una aplicación de Hermes en el dispositivo que reciba notificaciones push. Conecte el agente a Telegram, Signal, Discord u otra plataforma compatible mediante hermes gateway setup y deje que la aplicación de esa plataforma entregue la notificación. Un trabajo de cron también puede enviar un único mensaje mediante hermes send -t telegram -s "Job done" -f /path/to/report.txt. La entrega se realiza sin llamar al modelo.

#hermes#mobile#remote-access#tailscale#ai-agents