Hasta ahora, la forma principal de comunicarnos con Hermes Agent era a través de Telegram. Este sistema funciona muy bien para enviar instrucciones rápidas, revisar respuestas desde el móvil o interactuar con Hermes de una forma cómoda y sencilla. Sin embargo, cuando empezamos a trabajar con mensajes largos, análisis técnicos, bloques de código, logs o instrucciones complejas, Telegram se queda un poco corto.
Ahí es donde entra Open WebUI.
1. Introducción
Open WebUI nos permite disponer de una interfaz web muy parecida a ChatGPT, accesible desde el navegador, pero conectada directamente a nuestro propio Hermes Agent instalado en un servidor Ubuntu. De esta forma podemos escribir mensajes más largos, revisar mejor las respuestas, mantener conversaciones más cómodas y trabajar desde una pantalla amplia sin depender únicamente del chat de Telegram.
La idea no es sustituir Telegram, sino añadir un segundo canal más cómodo para trabajar desde el ordenador. Telegram seguirá siendo útil como canal secundario, especialmente para consultas rápidas o uso desde el móvil, mientras que Open WebUI será la interfaz principal cuando queramos trabajar con Hermes de forma más ordenada.
En esta instalación vamos a montar Open WebUI en un Ubuntu Server dentro de Proxmox, sin usar Docker, utilizando una instalación nativa con uv. Open WebUI quedará escuchando en la red local en el puerto 3000, mientras que Hermes Agent expondrá su API solo de forma local en 127.0.0.1:8642. Esto es importante desde el punto de vista de seguridad, porque Hermes no quedará accesible directamente desde otros equipos de la red.
Nota: uv se refiere a uv de Astral, una herramienta moderna para gestionar paquetes, entornos y ejecución de aplicaciones Python.
La arquitectura final será sencilla:
2. Entorno utilizado
Antes de instalar Open WebUI conviene dejar claro el entorno sobre el que vamos a trabajar. En mi caso, la instalación se realiza sobre una máquina virtual creada en Proxmox, con Ubuntu Server como sistema operativo y Hermes Agent ya instalado previamente.
La idea no es instalar Hermes desde cero, sino añadir una interfaz web adicional para poder hablar con él desde el navegador. Por tanto, partimos de esta situación:
Open WebUI se instalará directamente en Ubuntu Server, sin Docker, usando uv. El acceso será únicamente desde la red local, por ejemplo:
http://IP_DEL_SERVIDOR:3000
En esta guía iremos comprobando todo paso a paso para evitar errores: primero el sistema, después Hermes, luego Open WebUI, y finalmente el arranque automático y la seguridad básica.
Paso 2.1 — Comprobar versión de Ubuntu
Este comando sirve para confirmar qué versión de Ubuntu Server tenemos instalada en la VM:
- lsb_release -a
Description: Ubuntu 24.04.4 LTS
Codename: noble
Paso 2.2 — Comprobar versión de Python
Ahora vamos a comprobar qué versión de Python tiene instalada el sistema.
Esto es importante porque Open WebUI lo vamos a ejecutar con uv, y uv se encargará de preparar el entorno necesario, pero conviene saber de qué parte el servidor.
- python3 --version
Python 3.12.3
Aunque Open WebUI lo ejecutaremos con uv, esta comprobación nos sirve para confirmar que el sistema tiene Python instalado correctamente y que estamos partiendo de una instalación moderna de Ubuntu.
Paso 2.3 — Comprobar que curl está instalado
Ahora vamos a comprobar si el servidor tiene disponible curl.
curl nos hará falta para dos cosas:
- Descargar uv
- Probar la API local de Hermes con una petición HTTP
- curl --version
curl 8.5.0
- Ubuntu Server 24.04.4 LTS
- Python 3.12.3
- curl instalado
Paso 2.4 — Comprobar la IP local del servidor
Ahora vamos a comprobar qué IP tiene esta VM dentro de la red local.
Esto es importante porque será la dirección desde la que accederemos a Open WebUI desde el navegador, por ejemplo:
http://IP_DEL_SERVIDOR:3000
- ip -4 addr
IP local del servidor: 192.168.1.22
Interfaz de red: ens18
Red local: 192.168.1.0/24
Esto significa que, cuando Open WebUI esté instalado, accederemos desde el navegador con:
http://192.168.1.22:3000
También nos servirá más adelante para configurar el firewall y permitir el acceso solo desde la red local 192.168.1.0/24.
Paso 2.5 — Comprobar el estado del firewall
Ahora vamos a ver si ufw, el firewall de Ubuntu, está activo o no.
Esto es importante porque más adelante abriremos solo el puerto necesario para Open WebUI y dejaremos protegido el puerto local de Hermes.
- sudo ufw status
Firewall UFW: activo
SSH permitido solo desde la red local 192.168.1.0/24
Servicios Samba permitidos desde la red local
Loopback permitido
Perfecto. El firewall ya está activo y bastante bien protegido. Esto es incluso mejor que partir de un firewall desactivado. Más adelante solo añadiremos una regla nueva para permitir Open WebUI en el puerto 3000 desde la LAN.
3. Arquitectura final
La arquitectura que vamos a montar será esta:
- Open WebUI sí será accesible desde la red local.
- Hermes API no será accesible directamente desde la red local.
- Open WebUI hablará con Hermes usando localhost.
Así, desde otro equipo de la red local podremos abrir:
http://192.168.1.22:3000
pero no deberíamos poder acceder directamente a:
http://192.168.1.22:8642
Hermes quedará protegido escuchando solo en:
127.0.0.1:8642
4. Activar API local de Hermes
Antes de instalar Open WebUI tenemos que comprobar si Hermes ya tiene activa su API local.
Esta API es la que permitirá que Open WebUI hable con Hermes usando una URL compatible con OpenAI:
http://127.0.0.1:8642/v1
Paso 4.1 — Comprobar si Hermes ya escucha en el puerto 8642
Este comando revisa si hay algún proceso escuchando en el puerto 8642, que es el puerto que usaremos para la API local de Hermes:
- sudo ss -ltnp | grep 8642
Sin salida
Si este comando no muestra ninguna línea, significa que Hermes Gateway está funcionando, pero el API Server local todavía no está activo. Open WebUI necesita esa API para poder comunicarse con Hermes.
Ahora vamos a localizar la carpeta de configuración de Hermes.
Paso 4.2 — Comprobar carpeta de Hermes
Este comando sirve para ver si existe la carpeta oculta .hermes dentro del usuario actual. Ahí suele estar la configuración de Hermes, incluido el fichero .env.
- ls -la /home/$USER/.hermes
Hermes guarda su configuración principal en:
/home/USUARIO/.hermes
y que el fichero que vamos a modificar es:
/home/USUARIO/.hermes/.env
Paso 4.3 — Comprobar si el .env ya tiene variables del API Server
Este comando busca si ya existen líneas relacionadas con API_SERVER dentro del fichero .env.
Sirve para saber si la API local de Hermes ya está configurada o si tenemos que añadirla desde cero.
- grep -n "API_SERVER" /home/$USER/.hermes/.env
Sin salida
No existe todavía ninguna variable API_SERVER en ~/.hermes/.env
Eso significa que tenemos que añadir manualmente la configuración necesaria para activar la API local de Hermes.
Paso 4.4 — Hacer copia de seguridad del fichero .env
Antes de modificar el fichero .env, vamos a crear una copia de seguridad.
Este comando copia el fichero actual y le añade la fecha y hora al nombre. Así, si nos equivocamos editando, podremos recuperar la versión anterior.
- cp /home/$USER/.hermes/.env /home/$USER/.hermes/.env.bak.$(date +%Y%m%d_%H%M%S)
Sin salida
Antes de modificar el fichero .env de Hermes, hacemos una copia con fecha y hora para poder recuperar la configuración anterior si cometemos algún error.
Paso 4.5 — Generar una clave para la API local de Hermes
Ahora vamos a generar una clave secreta para proteger la API local de Hermes.
Esta clave será la que Open WebUI usará después para conectarse a Hermes. Aunque Hermes va a escuchar solo en 127.0.0.1, es buena práctica proteger igualmente la API con una clave.
- openssl rand -hex 32
Te devolverá una cadena larga de letras y números. Guárdala porque la utilizaremos más adelante.
Paso 4.6 — Editar el fichero .env de Hermes
Este comando abre el fichero de configuración de Hermes con el editor nano.
Dentro añadiremos al final del fichero estas variables:
API_SERVER_ENABLED=true
API_SERVER_KEY=TU_CLAVE_GENERADA
API_SERVER_HOST=127.0.0.1
API_SERVER_PORT=8642
La parte importante es:
API_SERVER_HOST=127.0.0.1
Eso hace que la API de Hermes solo escuche dentro del propio servidor, no desde la red local.
- nano /home/$USER/.hermes/.env
Cuando se abra el fichero, baja al final y añade esas cuatro líneas, sustituyendo
TU_CLAVE_GENERADA
por la clave que acabas de generar.
Guarda con
- Ctrl + O
- Enter
- Ctrl + X
Editamos ~/.hermes/.env y añadimos las variables necesarias para activar el API Server local de Hermes.
Ahora tenemos que reiniciar Hermes para que lea las nuevas variables del .env.
Paso 4.7 — Reiniciar Hermes Gateway
Este comando reinicia el servicio de Hermes Gateway del usuario actual.
Lo hacemos porque Hermes ya estaba en ejecución, y los cambios del fichero .env no se aplican hasta que el proceso se reinicia.
- systemctl --user restart hermes-gateway
Sin salida
Paso 4.8 — Comprobar si la API local de Hermes ya está activa
Ahora vamos a comprobar si Hermes ya está escuchando en el puerto 8642.
Este comando muestra los puertos TCP en escucha y filtra por 8642:
- sudo ss -ltnp | grep 8642
LISTEN 0 128 127.0.0.1:8642 0.0.0.0:* users:(("python",pid=1307,fd=21))
Hermes ya tiene activa la API local en el puerto 8642.
Lo importante es que aparece:
127.0.0.1:8642
Esto significa que la API solo escucha dentro del propio servidor y no queda expuesta directamente a la red local.
Hasta aquí, Hermes ya está preparado para que Open WebUI pueda conectarse a él usando:
http://127.0.0.1:8642/v1
Paso 4.9 — Probar la API local de Hermes
Ahora vamos a hacer una prueba real contra la API de Hermes.
Este comando envía una petición a Hermes y le pide que responda solo con OK.
Tienes que sustituir:
TU_CLAVE_API_HERMES
por la clave que has puesto en el fichero .env en esta línea:
API_SERVER_KEY=...
curl http://127.0.0.1:8642/v1/chat/completions \
-H "Authorization: Bearer TU_CLAVE_API_HERMES" \
-H "Content-Type: application/json" \
-d '{
"model": "hermes-agent",
"messages": [
{"role": "user", "content": "Responde solo con OK"}
]
}'
La prueba devuelve una respuesta JSON donde Hermes responde:
"content": "OK"
Esto confirma que:
- Hermes API Server está activo.
- La clave API funciona.
- El modelo hermes-agent responde correctamente.
- Open WebUI podrá conectarse a Hermes usando http://127.0.0.1:8642/v1
5. Instalar uv
Ahora vamos a instalar uv.
uv es la herramienta que vamos a usar para ejecutar Open WebUI sin Docker. Nos permite lanzar Open WebUI con uvx y preparar el entorno necesario sin tener que crear manualmente un entorno virtual de Python.
Nota: uvx es el ejecutor de comandos incluido en uv. Sirve para ejecutar una herramienta Python sin instalarla manualmente de forma permanente en tu sistema.
Paso 5.1 — Instalar uv
Este comando descarga e instala uv en el usuario actual:
- curl -LsSf https://astral.sh/uv/install.sh | sh
El instalador descarga uv y uvx dentro de ~/.local/bin. uv será la herramienta principal, y uvx nos permitirá ejecutar Open WebUI sin instalarlo manualmente como paquete del sistema.
Paso 5.2 — Recargar el entorno de la terminal
Después de instalar uv, recargamos la configuración de la terminal para que el sistema reconozca los nuevos comandos uv y uvx.
- source ~/.bashrc
Sin salida
Después de instalar uv, recargamos ~/.bashrc para que la terminal encuentre los nuevos comandos uv y uvx sin tener que cerrar y abrir la sesión SSH.
Paso 5.3 — Comprobar que uv funciona
Ahora vamos a comprobar que uv está instalado correctamente.
Este comando muestra la versión instalada de uv:
- uv --version
uv 0.11.17 (x86_64-unknown-linux-gnu)
uv y uvx están correctamente instalados. A partir de este punto ya podemos usar uvx para lanzar Open WebUI sin Docker.
6. Instalar Open WebUI sin Docker
Ahora vamos a preparar Open WebUI. En esta guía no lo instalaremos con Docker. Lo ejecutaremos usando uvx, definiendo algunas variables importantes:
DATA_DIR
WEBUI_SECRET_KEY
WEBUI_AUTH
ENABLE_SIGNUP
OPENAI_API_BASE_URL
OPENAI_API_KEY
OLLAMA_BASE_URL
La más importante para los datos es:
DATA_DIR
Ahí se guardará la configuración, usuarios, conversaciones y base de datos de Open WebUI.
Usaremos esta ruta:
/home/USUARIO/open-webui-data
Paso 6.1 — Crear carpeta de datos de Open WebUI
Este comando crea la carpeta donde Open WebUI guardará sus datos persistentes:
- mkdir -p /home/$USER/open-webui-data
Sin salida
Creamos una carpeta persistente para Open WebUI. En ella se guardarán usuarios, configuración, conversaciones y base de datos. Si no definimos una carpeta clara, podríamos acabar con datos en rutas temporales o menos fáciles de mantener.
Paso 6.2 — Comprobar que la carpeta existe
Ahora vamos a comprobar que la carpeta se ha creado y que pertenece al usuario actual.
- ls -ld /home/$USER/open-webui-data
drwxrwxr-x 2 USUARIO USUARIO 4096 may 29 19:49 /home/USUARIO/open-webui-data
La carpeta de datos persistentes de Open WebUI se ha creado correctamente y pertenece al usuario.
Paso 6.3 — Generar clave secreta para Open WebUI
Ahora vamos a generar una clave secreta propia de Open WebUI.
Esta clave no es la misma que la clave de Hermes. Open WebUI la usa internamente para proteger sesiones y datos de autenticación.
- openssl rand -hex 32
Guardamos la clave que la usaremos más adelante.
Paso 6.4 — Primer arranque manual de Open WebUI
Ahora vamos a arrancar Open WebUI manualmente, todavía sin crear el servicio systemd.
Este primer arranque sirve para comprobar que:
- Open WebUI descarga correctamente sus dependencias.
- La interfaz web carga en el navegador.
- Open WebUI puede conectarse a Hermes.
Ejecuta el siguiente comando, sustituyendo:
CLAVE_SECRETA_OPENWEBUI
por la clave que acabas de generar, y:
CLAVE_API_HERMES
por la clave que pusiste en API_SERVER_KEY dentro de ~/.hermes/.env.
DATA_DIR=/home/$USER/open-webui-data \
WEBUI_SECRET_KEY=CLAVE_SECRETA_OPENWEBUI \
WEBUI_AUTH=True \
ENABLE_SIGNUP=True \
OPENAI_API_BASE_URL=http://127.0.0.1:8642/v1 \
OPENAI_API_KEY=CLAVE_API_HERMES \
OLLAMA_BASE_URL= \
uvx --python 3.11 open-webui@latest serve --host 0.0.0.0 --port 3000
Este comando puede tardar bastante la primera vez porque descarga Open WebUI y prepara el entorno.
Si se corta la sesión ssh porque ha expirado el tiempo, abre una nueva terminal.
Paso 6.5 — Comprobar si Open WebUI está escuchando en el puerto 3000
Este comando revisa si hay algún proceso escuchando en el puerto 3000, que es el puerto donde intentamos arrancar Open WebUI:
- sudo ss -ltnp | grep 3000
LISTEN 0 2048 0.0.0.0:3000 0.0.0.0:* users:(("python",pid=1575,fd=33))
Aunque la terminal SSH se haya desconectado, comprobamos que Open WebUI sigue activo revisando si hay algún proceso escuchando en el puerto 3000.
Paso 6.6 — Probar Open WebUI desde el servidor
Este comando hace una petición HTTP local a Open WebUI para comprobar si la web responde:
- curl -I http://127.0.0.1:3000
HTTP/1.1 200 OK
server: uvicorn
Open WebUI ya está levantado en el servidor y responde localmente en el puerto 3000.
Ahora hay un detalle importante: en esta VM el firewall ya estaba activo, y todavía no hemos permitido el puerto 3000 desde la red local. Por eso, aunque Open WebUI responda dentro del servidor, puede que todavía no cargue desde tu PC.
Vamos a añadir la regla del firewall para permitir Open WebUI desde la LAN.
Paso 6.7 — Permitir acceso a Open WebUI desde la red local
Este comando permite que los equipos de la red local 192.168.1.0/24 puedan acceder al puerto 3000, que es donde escucha Open WebUI:
- sudo ufw allow from 192.168.1.0/24 to any port 3000 proto tcp
Rule added
Como el firewall ya estaba activo, añadimos una regla para permitir que los equipos de la red local puedan acceder a Open WebUI en el puerto 3000.
Ahora vamos a comprobar que la regla ha quedado registrada.
Paso 6.8 — Comprobar estado del firewall
Este comando muestra las reglas actuales de UFW:
- sudo ufw status
Status: active
......
3000/tcp ALLOW 192.168.1.0/24
......
El firewall ya permite el acceso a Open WebUI desde cualquier equipo de la red local 192.168.1.0/24, pero mantiene bloqueado el acceso desde fuera de esa red.
Ahora ya deberías poder entrar desde el navegador de tu PC.
Paso 6.9 — Acceder a Open WebUI desde el navegador
Abre en tu navegador:
Debería aparecer la pantalla inicial de Open WebUI.
Pulsa Empezar y crea el primer usuario administrador.
Ahora vamos a comprobar que Open WebUI realmente puede hablar con Hermes.
Paso 6.10 — Probar Hermes desde Open WebUI
En la caja de chat de Open WebUI escribe:
Responde solo con OK
Esta prueba nos sirve para comprobar toda la cadena:
Navegador
→ Open WebUI
→ API local de Hermes
→ Hermes Agent
Al enviar “Responde solo con OK” desde Open WebUI, Hermes responde correctamente. Esto confirma que la cadena completa funciona:
Navegador → Open WebUI → API local de Hermes → Hermes Agent
7. Crear servicio systemd
Hasta ahora Open WebUI está funcionando porque lo hemos lanzado manualmente con uvx.
El problema de este método es que no es la forma más cómoda ni más robusta para usarlo a diario. Lo ideal es crear un servicio systemd para que Open WebUI:
- arranque automáticamente con Ubuntu Server
- se reinicie si falla
- no dependa de una terminal SSH abierta
- se pueda gestionar con systemctl
Antes de crear el servicio necesitamos guardar las variables de configuración en un fichero .env.
Paso 7.1 — Crear fichero de configuración de Open WebUI
Este comando abre un nuevo fichero donde guardaremos la configuración de Open WebUI:
- nano /home/$USER/open-webui.env
DATA_DIR=/home/madiazg/open-webui-data
WEBUI_SECRET_KEY=CLAVE_SECRETA_OPENWEBUI
WEBUI_AUTH=True
ENABLE_SIGNUP=True
OPENAI_API_BASE_URL=http://127.0.0.1:8642/v1
OPENAI_API_KEY=CLAVE_API_HERMES
OLLAMA_BASE_URL=
Donde:
CLAVE_SECRETA_OPENWEBUI = la clave que generaste para Open WebUI
CLAVE_API_HERMES = la clave API de Hermes que pusiste en ~/.hermes/.env
Guarda con:
- Ctrl + O
- Enter
- Ctrl + X
Creamos un fichero open-webui.env para guardar las variables necesarias de Open WebUI en un lugar separado y más fácil de mantener que un comando largo.
Ahora vamos a proteger ese fichero, porque contiene claves.
Paso 7.2 — Proteger el fichero de configuración
Este comando cambia los permisos del fichero para que solo tu usuario pueda leerlo y modificarlo:
- chmod 600 /home/$USER/open-webui.env
Sin salida
Es importante porque dentro están:
WEBUI_SECRET_KEY
OPENAI_API_KEY
Protegemos el fichero de configuración porque contiene claves internas de Open WebUI y la clave que se usará para conectar con Hermes.
Paso 7.3 — Crear el servicio systemd de Open WebUI
Ahora vamos a crear el servicio de systemd.
Este servicio permitirá gestionar Open WebUI con comandos como:
- start
- stop
- restart
- status
y además hará que Open WebUI pueda arrancar automáticamente con Ubuntu.
- sudo nano /etc/systemd/system/open-webui.service
Dentro pega este contenido (no olvides sustituir USUSARO por tu nombre de usuario):
[Unit]
Description=Open WebUI for Hermes
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=USUARIO
Group=USUARIO
WorkingDirectory=/home/USUARIO
EnvironmentFile=/home/USUARIO/open-webui.env
ExecStart=/home/USUARIO/.local/bin/uvx --python 3.11 open-webui@latest serve --host 0.0.0.0 --port 3000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Guarda con:
- Ctrl + O
- Enter
- Ctrl + X
Creamos el fichero /etc/systemd/system/open-webui.service para que Open WebUI pueda ejecutarse como servicio del sistema. En este servicio indicamos el usuario, la carpeta de trabajo, el fichero de variables y el comando uvx que arranca Open WebUI en el puerto 3000.
Ahora systemd todavía no sabe que acabamos de crear ese servicio. Hay que recargar su configuración.
Paso 7.4 — Recargar systemd
Este comando hace que systemd vuelva a leer los ficheros de servicios disponibles, incluyendo el nuevo open-webui.service que acabamos de crear:
- sudo systemctl daemon-reload
Sin salida
Paso 7.5 — Habilitar Open WebUI para que arranque con Ubuntu
Ahora vamos a habilitar el servicio.
Este comando no arranca todavía Open WebUI, solo le indica a Ubuntu que debe iniciarlo automáticamente cada vez que arranque el sistema:
- sudo systemctl enable open-webui
Created symlink /etc/systemd/system/multi-user.target.wants/open-webui.service → /etc/systemd/system/open-webui.service.
Ahora todavía tenemos un detalle importante: Open WebUI sigue funcionando desde el arranque manual anterior. Antes de arrancarlo como servicio, hay que liberar el puerto 3000 para evitar que el servicio falle porque el puerto ya está ocupado.
Paso 7.6 — Parar el Open WebUI arrancado manualmente
Este comando detiene el proceso Python que está escuchando en el puerto 3000.
- sudo fuser -k 3000/tcp
Sin salida
Paso 7.7 — Comprobar que el puerto 3000 está libre
Este comando comprueba si todavía hay algún proceso escuchando en el puerto 3000:
sudo ss -ltnp | grep 3000
Sin salida
Como no muestra nada, significa que el Open WebUI manual se ha parado correctamente y ya podemos arrancarlo como servicio.
Paso 7.8 — Arrancar Open WebUI como servicio
Este comando inicia Open WebUI usando el servicio systemd que acabamos de crear:
- sudo systemctl start open-webui
Sin salida
Ahora vamos a comprobar el estado real del servicio.
Paso 7.9 — Comprobar estado del servicio Open WebUI
Este comando muestra si el servicio está activo, si ha fallado o si sigue arrancando:
- sudo systemctl status open-webui
Nota: Si se abre una pantalla larga, puedes salir pulsando q
En la captura se ve:
Loaded: loaded ... enabled
Active: active (running)
Main PID: 2131
Eso confirma que:
- Open WebUI ya está funcionando como servicio systemd
- El servicio está habilitado para arrancar con Ubuntu
- El proceso está activo
Paso 7.10 — Comprobar que Open WebUI escucha en el puerto 3000
Este comando verifica que el servicio realmente está escuchando en el puerto 3000:
- sudo ss -ltnp | grep 3000
LISTEN 0 2048 0.0.0.0:3000 0.0.0.0:* users:(("python",pid=2178,fd=28))
Esa salida confirma que Open WebUI está escuchando correctamente:
0.0.0.0:3000
8. Seguridad básica
Ahora vamos a revisar y cerrar algunos puntos de seguridad.
Ya tenemos varias cosas bien configuradas:
- Open WebUI tiene login activado
- El firewall está activo
- El puerto 3000 está permitido solo desde la LAN
- Hermes escucha solo en 127.0.0.1:8642
Pero todavía nos queda un punto importante: cerrar el registro de nuevos usuarios en Open WebUI.
Durante la primera instalación dejamos:
ENABLE_SIGNUP=True
para poder crear el primer usuario administrador. Una vez creado, conviene cambiarlo a:
ENABLE_SIGNUP=False
Así evitamos que otra persona de la red local pueda registrarse en Open WebUI.
Paso 8.1 — Cerrar el registro de usuarios
Este comando abre el fichero de configuración de Open WebUI:
- nano /home/$USER/open-webui.env
Dentro busca esta línea:
ENABLE_SIGNUP=True
y cámbiala por:
ENABLE_SIGNUP=False
Guarda con:
- Ctrl + O
- Enter
- Ctrl + X
Ahora hay que reiniciar Open WebUI para que lea el cambio.
Paso 8.2 — Reiniciar Open WebUI
Este comando reinicia el servicio de Open WebUI para aplicar el cambio de configuración:
- sudo systemctl restart open-webui
Sin salida
Paso 8.3 — Comprobar que Open WebUI sigue activo
Este comando comprueba que el servicio sigue funcionando después del reinicio:
- sudo systemctl status open-webui
Nota: Si se abre una pantalla larga, sal con q.
El servicio sigue funcionando correctamente después de cerrar el registro. En la captura se ve:
Loaded: loaded ... enabled
Active: active (running)
Main PID: 2282
Paso 8.4 — Comprobar que Open WebUI sigue escuchando en el puerto 3000
Este comando confirma que Open WebUI continúa escuchando en el puerto 3000 después del reinicio:
- sudo ss -ltnp | grep 3000
LISTEN 0 2048 0.0.0.0:3000 0.0.0.0:* users:(("python",pid=2309,fd=28))
0.0.0.0:3000
Ahora vamos a comprobar la parte de Hermes dentro del punto de seguridad.
Paso 8.5 — Comprobar que Hermes escucha solo en localhost
Este comando comprueba si la API de Hermes sigue activa en el puerto 8642:
- sudo ss -ltnp | grep 8642
LISTEN 0 128 127.0.0.1:8642 0.0.0.0:* users:(("python",pid=1307,fd=21))
Esta salida confirma que Hermes está configurado de forma segura:
127.0.0.1:8642
Aunque Hermes ya escucha solo en localhost, vamos a añadir una regla defensiva al firewall para bloquear el puerto 8642 desde fuera.
Paso 8.6 — Bloquear el puerto 8642 en UFW
Este comando añade una regla explícita para denegar conexiones entrantes al puerto 8642:
- sudo ufw deny 8642/tcp
Rule added
Rule added (v6)
Perfecto. El puerto 8642 ha quedado bloqueado explícitamente en UFW.
Ahora vamos a comprobar el estado final del firewall.
Paso 8.7 — Revisar reglas del firewall
Este comando muestra las reglas actuales de UFW:
- sudo ufw status
Status: active
....
3000/tcp ALLOW 192.168.1.0/24
8642/tcp DENY Anywhere
.....
Esto significa:
- Open WebUI:
- accesible desde la red local
- Hermes API:
- no accesible directamente desde la red local
- solo accesible desde el propio servidor mediante 127.0.0.1
9. Comprobación tras reinicio
Ahora toca hacer la prueba final: reiniciar la VM y comprobar que todo vuelve a arrancar automáticamente.
La idea es validar que:
- Hermes Gateway arranca solo
- Hermes API vuelve a escuchar en 127.0.0.1:8642
- Open WebUI arranca solo como servicio
- Open WebUI vuelve a escuchar en 0.0.0.0:3000
- La web responde desde el navegador
- Open WebUI sigue pudiendo hablar con Hermes
Paso 9.1 — Reiniciar la VM
Este comando reinicia Ubuntu Server:
- sudo reboot
La conexión SSH se cortará, es normal.Espera aproximadamente 1 o 2 minutos, vuelve a conectarte por SSH.
Paso 9.2 — Comprobar que Open WebUI ha arrancado tras el reinicio
Este comando muestra el estado del servicio de Open WebUI después de reiniciar la VM:
- sudo systemctl status open-webui
Si se abre una pantalla larga, sal con q.
Loaded: loaded ... enabled
Active: active (running)
Esto confirma que Open WebUI se ha iniciado automáticamente con Ubuntu Server.
También se ve que está consumiendo bastante memoria:
Memory: 1.6G
Paso 9.3 — Comprobar que Open WebUI escucha en el puerto 3000
Ahora vamos a comprobar que el servicio está escuchando en el puerto correcto después del reinicio.
Este comando revisa si hay algún proceso escuchando en el puerto 3000:
- sudo ss -ltnp | grep 3000
LISTEN 0 2048 0.0.0.0:3000 0.0.0.0:* users:(("python",pid=988,fd=28))
Open WebUI está escuchando correctamente tras el reinicio:
0.0.0.0:3000
Paso 9.4 — Comprobar que Hermes API ha arrancado tras el reinicio
Este comando comprueba si Hermes vuelve a escuchar en el puerto 8642 después de reiniciar:
- sudo ss -ltnp | grep 8642
LISTEN 0 128 127.0.0.1:8642 0.0.0.0:* users:(("python",pid=896,fd=21))
Hermes también ha arrancado correctamente tras el reinicio:
127.0.0.1:8642
Con esto ya tenemos confirmados los dos puertos importantes:
- Open WebUI: 0.0.0.0:3000
- Hermes API: 127.0.0.1:8642
Ahora queda la última comprobación funcional desde el navegador.
Paso 9.5 — Probar la conversación desde Open WebUI tras el reinicio
Abre en el navegador:
Inicia sesión en Open WebUI si te lo pide y escribe en el chat:
Responde solo con OK
- Navegador
- → Open WebUI arrancado como servicio
- → Hermes API arrancada automáticamente
- → Hermes Agent
10. Comandos útiles de mantenimiento
Para terminar el artículo, conviene dejar una pequeña chuleta de comandos útiles. No hace falta ejecutarlos todos ahora; sirven para consultar, reiniciar o diagnosticar la instalación en el futuro.
Comprobar el estado de Open WebUI:
sudo systemctl status open-webui
Comprobar estado de Hermes Gateway:
systemctl --user status hermes-gateway
Reiniciar Open WebUI:
sudo systemctl restart open-webui
Reiniciar Hermes Gateway:
systemctl --user restart hermes-gateway
Parar Open WebUI:
sudo systemctl stop open-webui
Parar Hermes Gateway:
systemctl --user stop hermes-gateway
Arrancar Open WebUI:
sudo systemctl start open-webui
Arrancar Hermes Gateway:
systemctl --user start hermes-gateway
Comprobar si Open WebUI escucha en el puerto 3000:
sudo ss -ltnp | grep 3000
Comprobar si Hermes API escucha en el puerto 8642:
sudo ss -ltnp | grep 8642
Ver logs recientes de Open WebUI:
journalctl -u open-webui -n 80 --no-pager
Ver logs en directo de Open WebUI:
journalctl -u open-webui -f
Ver logs recientes de Hermes Gateway:
journalctl --user -u hermes-gateway -n 80 --no-pager
Ver logs en directo de Hermes Gateway:
journalctl --user -u hermes-gateway -f
Ver estado del firewall UFW:
sudo ufw status
Ver estado detallado del firewall UFW:
sudo ufw status verbose
Editar configuración de Open WebUI:
nano /home/$USER/open-webui.env
Editar configuración de Hermes:
nano /home/$USER/.hermes/.env
Reiniciar Open WebUI después de cambiar su configuración:
sudo systemctl restart open-webui
Reiniciar Hermes Gateway después de cambiar su configuración:
systemctl --user restart hermes-gateway
Comprobar que Hermes responde directamente por API local:
curl http://127.0.0.1:8642/v1/chat/completions \
-H "Authorization: Bearer TU_CLAVE_API_HERMES" \
-H "Content-Type: application/json" \
-d '{
"model": "hermes-agent",
"messages": [
{"role": "user", "content": "Responde solo con OK"}
]
}'
Comprobar si el servicio de usuario puede arrancar sin iniciar sesión:
loginctl show-user $USER | grep Linger
Activar linger para el usuario actual si fuera necesario:
sudo loginctl enable-linger $USER
Reiniciar la VM:
sudo reboot
Conclusiones finales
Con esta instalación hemos conseguido usar Hermes Agent desde una interfaz web tipo ChatGPT, mucho más cómoda para trabajar con conversaciones largas, código, logs o análisis técnicos.
Open WebUI queda como interfaz principal desde el navegador, mientras que Telegram puede mantenerse como canal secundario para consultas rápidas o uso desde el móvil.
La arquitectura final es sencilla: Open WebUI actúa como puerta de entrada, y Hermes permanece protegido, accesible solo desde el propio servidor. Esto permite trabajar cómodamente sin exponer directamente la API de Hermes a la red.
También hemos dejado la instalación preparada para el uso diario: Open WebUI arranca automáticamente con Ubuntu, Hermes Gateway sigue funcionando como servicio, el registro de nuevos usuarios queda cerrado y el firewall limita el acceso a lo necesario.
Tras reiniciar la máquina virtual, ambos servicios vuelven a iniciarse correctamente y la comunicación entre Open WebUI y Hermes sigue funcionando. Esto confirma que la instalación es persistente, práctica y adecuada para un entorno local en Proxmox.
En resumen, esta configuración permite trabajar con Hermes de forma más cómoda, ordenada y segura, manteniendo Telegram como apoyo y usando Open WebUI como interfaz principal desde el ordenador.















No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.