Configuración del Panel de Hermes Agent: SSH, Caddy, Docker y Seguridad (2026)
Ejecuta el panel web de Hermes Agent en tu VPS con túnel SSH, proxy inverso Caddy, Docker o systemd.
Actualizado Publicado 21 min de lectura

Si estás ejecutando Hermes Agent en un VPS y quieres una forma de gestionar sesiones, claves de API, memoria y configuración desde el navegador, el panel integrado hace exactamente eso. A partir de la v0.16 (junio de 2026), el panel se distribuye como un panel de administración nativo en el navegador. Está a un solo comando de distancia, pero la configuración por defecto solo escucha en localhost. Esta guía cubre cómo ejecutarlo localmente, acceder de forma remota mediante un túnel SSH o a través de un proxy inverso Caddy con protección por contraseña, desplegarlo en Docker y mantenerlo en ejecución permanente con systemd.
GitHub de Hermes AgentLo que cubre esta guía
- Iniciar el panel de Hermes localmente y en un servidor remoto
- Acceso remoto mediante reenvío de puertos SSH (lo más simple y seguro)
- Exponerlo externamente con el proxy inverso Caddy
- Añadir Basic Auth con usuario y contraseña
- Ejecutarlo permanentemente con systemd o Docker
- Riesgos de seguridad que debes conocer
Qué hace el panel de Hermes
El panel te ofrece una interfaz de navegador para gestionar tu instancia de Hermes Agent. Desde él puedes:
- Ver y gestionar las sesiones de chat activas
- Explorar y editar los archivos de memoria del agente
- Configurar claves de API y ajustes de modelos
- Monitorizar el uso de tokens y los costes
- Gestionar habilidades y configuraciones de herramientas
Se conecta al proceso de gateway de Hermes que ya está en ejecución en tu servidor — no inicia un segundo agente.
Recorrido por el panel
Una vez que el panel está en ejecución, la barra de navegación superior te da acceso a varias pestañas. Esto es lo que muestra cada una.
Estado
La pestaña Estado es la página de inicio. Muestra si el agente y el gateway están en ejecución, las plataformas conectadas y una lista de sesiones recientes con recuentos de mensajes y vistas previas.

Sesiones
La pestaña Sesiones lista todas las sesiones pasadas y activas. Cada entrada muestra el modelo usado, el recuento de mensajes, las herramientas invocadas y cuándo estuvo activa por última vez. Puedes buscar en el contenido de los mensajes de todas las sesiones y eliminar las antiguas.

Analíticas
La pestaña Analíticas registra el uso de tokens, el número de sesiones y las llamadas a la API a lo largo del tiempo. Muestra desgloses diarios y estadísticas por modelo para que veas exactamente cuánto te cuesta tu agente.

Cron
La pestaña Cron te permite crear y gestionar tareas programadas. Defines un prompt, estableces una expresión cron y eliges dónde se entregan los resultados (local, Discord, etc.). Puedes pausar, ejecutar manualmente o eliminar trabajos desde aquí.

Configuración
La pestaña Configuración te ofrece un editor estructurado para ~/.hermes/config.yaml. Está organizada por secciones — General, Agent, Terminal, Display, Memory, Security y más — cada una con campos etiquetados. Puedes editar los valores directamente o cambiar al modo YAML en bruto.

Claves
La pestaña Claves gestiona las claves de API y los inicios de sesión OAuth almacenados en ~/.hermes/.env. Muestra qué proveedores de LLM están configurados, gestiona los flujos OAuth (Nous Portal, OpenAI Codex) y te permite añadir o desconectar credenciales sin tocar la línea de comandos.

Iniciar el panel
La forma más sencilla de empezar:
hermes dashboardEsto compila la interfaz web (solo la primera vez) y luego inicia un servidor en http://127.0.0.1:9119. También abrirá una pestaña del navegador si lo estás ejecutando localmente.
Opciones disponibles
| Opción | Por defecto | Descripción |
|---|---|---|
--host |
127.0.0.1 |
Interfaz a la que vincularse |
--port |
9119 |
Puerto en el que escuchar |
--no-open |
desactivada | Omitir la apertura automática del navegador |
La vinculación por defecto a 127.0.0.1 significa que solo tu máquina puede acceder al panel. Es el valor seguro por defecto — si necesitas acceso remoto, sigue leyendo.
Acceso remoto mediante reenvío de puertos SSH
Si solo quieres abrir el panel desde tu portátil mientras se ejecuta en un VPS, el reenvío de puertos SSH es la opción más sencilla. Sin proxy inverso, sin DNS, sin puertos abiertos en el servidor — todo pasa por tu conexión SSH existente.
ssh -L 9119:127.0.0.1:9119 user@your-vps-ipLuego abre http://127.0.0.1:9119 en el navegador de tu portátil. La opción -L reenvía tu puerto local 9119 al localhost:9119 del VPS a través del túnel SSH. El panel lo ve como una conexión local.
Esta es la forma más segura de acceder al panel de forma remota porque:
- El panel permanece vinculado a
127.0.0.1— nada más en internet puede alcanzarlo - El tráfico va cifrado dentro de SSH — no hace falta configuración TLS adicional
- Ya tienes acceso SSH, así que no hay nada nuevo que proteger
- No hay puertos abiertos en el VPS más allá de SSH
Cuándo usar el reenvío SSH
Usa esto si eres la única persona que accede al panel y siempre te conectas desde una máquina con acceso SSH. Sáltate por completo las secciones de Caddy y systemd — simplemente mantén hermes dashboard en ejecución en una sesión de tmux o screen.
Túnel SSH en segundo plano
Si quieres que el túnel permanezca abierto en segundo plano:
ssh -f -N -L 9119:127.0.0.1:9119 user@your-vps-ip-f— pasa a segundo plano tras la autenticación-N— sin comando remoto, solo el túnel
Para detenerlo más tarde:
# Find the process
ps aux | grep "ssh -f -N -L 9119"
# Kill it
kill <PID>Mantener el panel en ejecución en el VPS
Con el reenvío SSH, el panel aún necesita estar en ejecución en el VPS. Usa tmux o screen para que sobreviva a las desconexiones SSH:
# On the VPS
tmux new -s hermes
hermes dashboard
# Ctrl+B then D to detach
# Later, reattach with
tmux attach -t hermesSi quieres que se ejecute permanentemente incluso sin SSH, usa el servicio systemd descrito más abajo.
Exponer el panel externamente
Para acceder al panel desde otra máquina (tu teléfono, tu portátil o un compañero), necesitas dos cosas: vincularlo a todas las interfaces y poner un proxy inverso delante.
Paso 1: Vincular a 0.0.0.0
hermes dashboard --host 0.0.0.0Esto hace que el servidor escuche en todas las interfaces de red. Por sí solo, significa que cualquiera que pueda alcanzar la IP de tu servidor puede acceder al panel — no te detengas aquí.
Paso 2: Proxy inverso con Caddy
Si ya estás ejecutando Caddy como proxy inverso en tu servidor, añade un bloque como este a tu Caddyfile:
hermes.yourdomain.com {
reverse_proxy your-server-ip:9119
encode gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-XSS-Protection "1; mode=block"
}
}Si tu instancia de Caddy se ejecuta dentro de Docker y el panel se ejecuta en el host, usa host.docker.internal en lugar de la dirección IP:
hermes.yourdomain.com {
reverse_proxy host.docker.internal:9119
}Requisito de red del host
Si el panel se vincula a 127.0.0.1 (el valor por defecto), los contenedores Docker no pueden alcanzarlo a través de host.docker.internal. Debes usar –host 0.0.0.0 o ejecutar Caddy directamente en el host (no en Docker).
Luego recarga Caddy:
sudo docker exec caddy caddy reload --config /etc/caddy/CaddyfileO si Caddy se ejecuta en el host:
sudo systemctl reload caddyAñadir protección con contraseña
El panel de Hermes no tiene una función de contraseña integrada. Pero como está detrás de Caddy, puedes usar HTTP Basic Auth a nivel de proxy. Esto añade un aviso de inicio de sesión en el navegador antes de que nadie llegue al panel.
Generar un hash de contraseña
Caddy almacena las contraseñas como hashes bcrypt. Genera uno:
caddy hash-password --plaintext 'your-password-here'O dentro de un Caddy dockerizado:
sudo docker exec caddy caddy hash-password --plaintext 'your-password-here'Esto produce una cadena hash que empieza con $2a$....
Actualizar el Caddyfile
Añade una directiva basic_auth dentro del bloque del sitio:
hermes.yourdomain.com {
basic_auth {
yourusername $2a$14$...your-hash-here...
}
reverse_proxy host.docker.internal:9119
encode gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-XSS-Protection "1; mode=block"
}
}Sustituye yourusername y el hash por los tuyos. Puedes añadir varios pares usuario-hash para distintos usuarios.
Verificar que funciona
Sin credenciales — espera un 401:
curl -sk -o /dev/null -w "%{http_code}" https://hermes.yourdomain.com/
# 401Con credenciales — espera un 200:
curl -sk -o /dev/null -w "%{http_code}" -u yourusername:your-password-here https://hermes.yourdomain.com/
# 200Cuando abras la URL en un navegador, verás una ventana emergente de inicio de sesión antes de que el panel cargue.
Bloquear el acceso directo al puerto 9119
Con Caddy gestionando la autenticación y TLS en el puerto 443, no hay razón para dejar que nadie alcance el puerto 9119 directamente. Si alguien descubre la dirección IP de tu servidor, podría saltarse Caddy y acceder al panel por el puerto 9119 sin contraseña. Bloquéalo con iptables:
# Allow Docker/Caddy internal traffic first
sudo iptables -A INPUT -p tcp --dport 9119 -s 172.16.0.0/12 -j ACCEPT
# Block everything else
sudo iptables -A INPUT -p tcp --dport 9119 -j DROPLa regla de permiso de Docker es crítica
Si solo bloqueas el 9119 sin permitir primero el tráfico de Docker, Caddy también quedará bloqueado. Caddy se conecta al panel a través de la red interna de Docker (rango 172.16.0.0/12). La regla ACCEPT debe ir antes que la regla DROP — iptables procesa las reglas en orden.
Verifica que las reglas están en su sitio:
sudo iptables -L INPUT -n | grep 9119
# ACCEPT tcp -- 172.16.0.0/12 0.0.0.0/0 tcp dpt:9119
# DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9119Esto bloquea todas las conexiones externas al 9119 mientras permite que Caddy alcance el panel internamente.
Persiste la regla entre reinicios
Las reglas de iptables se pierden al reiniciar por defecto. Guárdalas:
sudo iptables-save | sudo tee /etc/iptables/rules.v4
Si el archivo no existe, instala iptables-persistent primero: sudo apt install iptables-persistent
Si usas ufw en lugar de iptables directamente:
sudo ufw deny 9119/tcpEjecutar permanentemente con systemd
El comando hermes dashboard se ejecuta en primer plano. Si cierras tu terminal, se detiene. Para mantenerlo en ejecución permanente, crea un servicio systemd.
Crear el archivo de servicio
sudo tee /etc/systemd/system/hermes-dashboard.service << 'EOF'
[Unit]
Description=Hermes Agent Dashboard
After=network.target
[Service]
Type=simple
User=dragos
ExecStart=/home/dragos/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main dashboard --host 0.0.0.0 --port 9119 --no-open
Restart=on-failure
RestartSec=5
Environment=HOME=/home/dragos
[Install]
WantedBy=multi-user.target
EOFAjusta User y la ruta de Python a tu configuración. Puedes encontrar la ruta exacta con:
which hermes
# or
readlink -f $(which hermes)Habilitar e iniciar
sudo systemctl daemon-reload
sudo systemctl enable hermes-dashboard
sudo systemctl start hermes-dashboard
sudo systemctl status hermes-dashboardRevisar los logs
sudo journalctl -u hermes-dashboard -fEjecutar en Docker
Si prefieres ejecutar el panel en un contenedor Docker (coherente con cómo despliegas otros servicios en el VPS), puedes containerizarlo. La restricción clave es que el panel necesita alcanzar el gateway de Hermes en 127.0.0.1:8642, por lo que el contenedor debe usar la red del host.
Dockerfile
FROM python:3.12-slim
RUN pip install hermes-agent[web]
EXPOSE 9119
CMD ["python", "-m", "hermes_cli.main", "dashboard", "--host", "0.0.0.0", "--port", "9119", "--no-open"]docker-compose.yml
services:
hermes-dashboard:
build: .
container_name: hermes-dashboard
network_mode: host
restart: unless-stoppednetwork_mode: host es obligatorio porque el gateway se vincula a 127.0.0.1:8642 — sin él, el contenedor no puede alcanzar el gateway ni siquiera con host.docker.internal.
Con Caddy en el mismo stack
Si ya ejecutas Caddy en Docker (configuración típica con una red externa web), el contenedor del panel usando network_mode: host es alcanzable desde Caddy en host.docker.internal:9119. Añade el bloque de Caddy descrito en la sección del proxy inverso Caddy anterior — no hace falta ningún cambio.
Compilar y ejecutar
docker compose up -d --buildComprobar que está en ejecución
sudo docker ps --filter name=hermes-dashboard
curl -sk -o /dev/null -w "%{http_code}" http://127.0.0.1:9119/Red del host y seguridad
network_mode: host significa que el contenedor comparte directamente la pila de red del host. El puerto del panel es accesible en todas las interfaces — asegúrate de que Caddy o un firewall esté delante si lo expones públicamente.
Riesgos de seguridad
Exponer el panel de un agente de IA a internet no es lo mismo que exponer un sitio web estático. Esto es lo que necesitas entender.
El panel es un plano de control
Cualquiera con acceso al panel puede ver sesiones, leer archivos de memoria, modificar claves de API y cambiar la configuración. No es solo una página de estado de solo lectura — es acceso administrativo completo a tu agente de IA.
Basic Auth envía las credenciales en base64
HTTP Basic Auth codifica tu usuario y contraseña en base64 dentro de cada cabecera de petición. Sin HTTPS, cualquiera que intercepte tu red puede decodificarlas al instante. Caddy proporciona HTTPS automático con Let’s Encrypt, lo que resuelve esto — pero solo si usas un nombre de dominio real, no una dirección IP en crudo.
Nunca lo expongas sin HTTPS
No ejecutes el panel en el puerto 9119 con –host 0.0.0.0 sin un proxy inverso que termine TLS delante. Basic Auth sobre HTTP plano es esencialmente como no tener autenticación.
Almacenamiento de credenciales del navegador
Una vez que inicias sesión mediante Basic Auth, la mayoría de los navegadores cachean las credenciales y las envían automáticamente en cada petición a ese dominio. Si alguien obtiene acceso a tu sesión del navegador (ordenador compartido, exploit del navegador), tiene acceso libre al panel.
Sin límite de peticiones por defecto
Ni el panel ni Basic Auth incluyen protección contra fuerza bruta. Un atacante puede probar miles de contraseñas por minuto. Considera añadir reglas de fail2ban para los logs de tu proxy inverso, o usar forward_auth de Caddy con un proveedor de autenticación más robusto si lo necesitas.
La lista blanca de IPs ayuda
Si siempre accedes al panel desde la misma IP (oficina, casa), añade reglas de firewall para restringir el acceso:
# Allow only your IP
sudo ufw allow from YOUR_IP_ADDRESS to any port 443
sudo ufw deny 443O en Caddy, usa un matcher @blocked:
hermes.yourdomain.com {
@blocked not remote_ip YOUR_IP_ADDRESS/32
respond @blocked "Forbidden" 403
basic_auth {
yourusername $2a$14$...
}
reverse_proxy host.docker.internal:9119
}El panel se comunica con el gateway
El panel se comunica con la API del gateway de Hermes en 127.0.0.1:8642. Si alguien compromete el panel, también obtiene acceso indirecto al gateway — que controla el agente capaz de ejecutar comandos de terminal en tu servidor. Trata el panel como una superficie privilegiada, no como una función de conveniencia.
Resumen de riesgos
| Riesgo | Gravedad | Mitigación |
|---|---|---|
| Panel expuesto sin HTTPS | Crítica | Usa siempre Caddy con TLS |
| Puerto 9119 abierto a internet | Crítica | Bloquear con iptables (ver arriba) |
| Contraseña débil o reutilizada | Alta | Genera una contraseña aleatoria fuerte |
| Sin protección contra fuerza bruta | Media | Añade fail2ban o lista blanca de IPs |
| El navegador cachea credenciales | Media | Usa navegación privada en máquinas compartidas |
| El panel da acceso al gateway | Alta | Restricción por IP + autenticación fuerte + monitorizar logs |
Referencia rápida
# Local only (safe default)
hermes dashboard
# SSH tunnel (remote access, safest)
ssh -L 9119:127.0.0.1:9119 user@your-vps-ip
# Then open http://127.0.0.1:9119 on your laptop
# Remote access (bind to all interfaces)
hermes dashboard --host 0.0.0.0
# Custom port
hermes dashboard --host 0.0.0.0 --port 3000
# With systemd (permanent)
sudo systemctl start hermes-dashboard
# With Docker
docker compose up -d --build
# Check it is running
curl -sk -o /dev/null -w "%{http_code}" https://hermes.yourdomain.com/Para más información sobre la configuración de Hermes Agent, la integración de mensajería y las habilidades, consulta la guía de configuración de Hermes Agent y la guía de integración de MIMO V2 Pro. Para los mejores paneles de terceros e interfaces web más allá del integrado, consulta el resumen de mejores paneles de Hermes. Para recomendaciones de modelos asequibles para Hermes Agent, consulta la guía de mejores modelos baratos para Hermes Agent. Para la gestión estructurada de tareas multi-agente con tableros visuales, la guía de configuración de Hermes Kanban cubre tableros de tareas Kanban, dependencias y patrones de coordinación.
Más guías de herramientas de IA

