Aller au contenu

Hermes — Interfaces d'accès sur VPS Hetzner

Résumé

L'agent Hermes tourne sur le VPS Hetzner (178.105.46.57) dans un conteneur Docker exposant trois interfaces : un Dashboard natif, Hermes WebUI (interface recommandée, native Hermes), et un terminal ttyd+tmux. Caddy assure le reverse proxy ; Open WebUI a été remplacé par Hermes WebUI (port 8787) installé via Dockerfile custom. Voir aussi shared/references/vps-hermes-commandes pour les commandes de gestion courante.

Contenu structuré

Architecture globale #reverse-proxy

Téléphone / PC / WSL (navigateur)
         ↓
    Caddy (reverse proxy + auth)
    ├── :2019 → Dashboard Hermes (port 9119)   — auth Caddy
    ├── :3001 → Hermes WebUI (port 8787)        — auth WebUI natif
    └── :7682 → ttyd terminal (port 7681)       — auth Caddy
         ↓
    hermes-telegram (Docker)
    ├── Gateway Telegram (toujours actif)
    ├── API Server (port 8642)
    ├── Dashboard (port 9119)
    ├── Hermes WebUI (port 8787)
    └── Session tmux (terminal partagé)

1. Dashboard Hermes natif

Accès : http://178.105.46.57:2019 — login : hermes / <mot_de_passe> (Caddy)

Configuration docker-compose.yml :

environment:
  - HERMES_DASHBOARD=1
  - HERMES_DASHBOARD_HOST=0.0.0.0
  - HERMES_DASHBOARD_TUI=1
ports:
  - "127.0.0.1:9119:9119"

Caddyfile :

:2019 {
    basic_auth {
        hermes "HASH_MOT_DE_PASSE"
    }
    reverse_proxy localhost:9119
}

Onglet Description
Sessions Historique de toutes les conversations
Analytics Tokens utilisés, coût, statistiques
Logs Logs en temps réel
Cron Tâches planifiées
Skills Activation/désactivation des skills
Config Éditeur visuel de config.yaml
Keys Gestion des clés API

Limitation : l'onglet Chat (TUI embarqué) ne fonctionne pas via reverse proxy.


2. Hermes WebUI (interface recommandée) #streaming

Accès : http://178.105.46.57:3001 — login : mot de passe défini dans HERMES_WEBUI_PASSWORD

Remplace Open WebUI. Interface conçue nativement pour Hermes, légère (Python + JS vanilla).

Configuration docker-compose.yml :

environment:
  - HERMES_WEBUI_PASSWORD=VOTRE_MOT_DE_PASSE
  - API_SERVER_ENABLED=true
  - API_SERVER_HOST=0.0.0.0
  - API_SERVER_KEY=VOTRE_CLE
ports:
  - "127.0.0.1:8787:8787"
  - "8642:8642"

Dockerfile (intégration automatique) :

FROM nousresearch/hermes-agent:latest

USER root

RUN apt-get update && apt-get install -y tmux git && \
    rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/nesquena/hermes-webui.git /opt/hermes-webui

RUN curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py && \
    /opt/hermes/.venv/bin/python /tmp/get-pip.py && \
    cd /opt/hermes-webui && \
    /opt/hermes/.venv/bin/pip install -r requirements.txt && \
    rm /tmp/get-pip.py

COPY entrypoint.sh /opt/entrypoint.sh
RUN chmod +x /opt/entrypoint.sh

USER hermes

ENTRYPOINT ["/opt/entrypoint.sh"]

entrypoint.sh :

#!/bin/bash

# Lancer Hermes WebUI en arrière-plan
nohup env \
  HERMES_WEBUI_HOST=0.0.0.0 \
  HERMES_WEBUI_PORT=8787 \
  HERMES_WEBUI_DEFAULT_WORKSPACE=/opt/projets \
  HERMES_WEBUI_AGENT_DIR=/opt/hermes \
  HERMES_HOME=/opt/data \
  HERMES_WEBUI_PASSWORD=${HERMES_WEBUI_PASSWORD} \
  /opt/hermes/.venv/bin/python /opt/hermes-webui/server.py > /tmp/webui.log 2>&1 &

# Lancer le gateway Hermes
exec /opt/hermes/.venv/bin/hermes gateway run --replace

Caddyfile :

:3001 {
    reverse_proxy localhost:8787
}

Pas de basic_auth Caddy — WebUI gère son propre login natif.

Panneau Description
Chat Conversations avec streaming, sessions, recherche
Tasks Tâches cron, alertes de complétion
Skills Liste, création, édition des skills
Memory Édition de MEMORY.md et USER.md
Todos Liste des tâches de la session courante
Spaces Gestion des workspaces
Workspace Navigateur de fichiers avec prévisualisation

Commandes utiles :

# Vérifier que WebUI répond
docker exec hermes-telegram curl http://localhost:8787/health

# Voir les logs WebUI
docker exec hermes-telegram cat /tmp/webui.log

# Rebuild après modification
docker compose build hermes-telegram
docker compose up -d --force-recreate hermes-telegram


3. Terminal ttyd + tmux

Accès : http://178.105.46.57:7682 — login : hermes / <mot_de_passe> (Caddy)

Lancement ttyd (sur l'hôte kanmaber) :

nohup ttyd -p 7681 -W docker exec -it hermes-telegram \
  tmux new-session -A -s main \
  /opt/hermes/.venv/bin/hermes \
  > /home/kanmaber/ttyd.log 2>&1 &

Démarrage automatique au reboot :

# crontab -e
@reboot nohup ttyd -p 7681 -W docker exec -it hermes-telegram tmux new-session -A -s main /opt/hermes/.venv/bin/hermes > /home/kanmaber/ttyd.log 2>&1 &

Caddyfile :

:7682 {
    basic_auth { hermes "HASH_MOT_DE_PASSE" }
    @websocket {
        header Connection *Upgrade*
        header Upgrade websocket
    }
    reverse_proxy @websocket localhost:7681
    reverse_proxy localhost:7681
}

ttyd tourne sur l'hôte (kanmaber), pas dans Docker. tmux et Hermes WebUI sont installés via le Dockerfile custom.

Raccourcis tmux :

Ctrl+b d  → se détacher (session reste active)
Ctrl+b [  → mode scroll
Ctrl+b c  → nouvelle fenêtre
Ctrl+b n  → fenêtre suivante
q         → quitter le mode scroll


4. Commandes de gestion globale

Docker :

docker compose ps
docker stats --no-stream
docker compose restart
docker logs hermes-telegram --tail 50 -f
docker logs caddy --tail 20
docker compose build hermes-telegram
docker compose up -d --force-recreate hermes-telegram

Caddy :

docker run --rm caddy:alpine caddy hash-password --plaintext VOTRE_MOT_DE_PASSE
docker compose restart caddy
docker exec caddy ss -tlnp

ttyd :

pkill ttyd
tail -f /home/kanmaber/ttyd.log
ps aux | grep ttyd

Hermes API :

curl http://localhost:8642/health
curl http://localhost:8642/v1/models


5. Fichiers importants

Fichier Chemin Rôle
docker-compose.yml /home/kanmaber/hermes/ Orchestration des conteneurs
Dockerfile /home/kanmaber/hermes/ Image custom (tmux + WebUI)
entrypoint.sh /home/kanmaber/hermes/ Script de démarrage des services
Caddyfile /home/kanmaber/hermes/ Reverse proxy + auth
.env /home/kanmaber/hermes/ Variables d'environnement
data/.env /home/kanmaber/hermes/data/ Config Hermes (API keys)

6. Comparaison des interfaces

Critère Dashboard Hermes WebUI ttyd
Streaming Non Oui Oui
Sync PC/téléphone historique conversations session live
Interface mobile Oui Oui limité
Donner des tâches Non Oui Oui
Exécution bash Non Oui Oui
Retry auto erreurs API Non Oui Oui
Historique sessions Oui Oui Non
Gestion clés API Oui Non Non
Analytics / tokens Oui anneau de contexte barre de statut
Skills / Cron Oui Oui Non
Workspace fichiers Non Oui Non
Session partagée Non Non Oui
Conçu pour Hermes Oui Oui (natif) Oui
Auth Caddy basic_auth Login natif WebUI Caddy basic_auth

7. Points de vigilance

  • .env ne doit jamais être commité sur GitHub
  • API_SERVER_KEY doit être défini pour activer l'API Hermes
  • Port 8642 exposé sans 127.0.0.1 — requis pour accès via 172.17.0.1 (bridge Docker)
  • tmux et Hermes WebUI installés via Dockerfile custom — persistants au redémarrage du conteneur
  • ttyd tourne sur l'hôte (kanmaber), pas dans Docker
  • Crontab @reboot garantit le redémarrage de ttyd après reboot VPS
  • Ne pas doubler l'authentification (Caddy + WebUI) — choisir l'un ou l'autre par interface
  • Les processus lancés dans un conteneur ne survivent pas au redémarrage — les intégrer au Dockerfile ou entrypoint

Points clés

  • Open WebUI remplacé par Hermes WebUI (port 8787) : natif, léger, retry auto, anneau de contexte
  • L'entrypoint.sh démarre WebUI en arrière-plan puis lance le gateway — les deux cohabitent dans le même conteneur
  • Ne pas mettre basic_auth Caddy sur le port 3001 — WebUI a son propre login
  • Port 8642 doit être exposé sans 127.0.0.1 pour être accessible depuis le bridge Docker

Liens connexes