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_authCaddy — 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¶
.envne doit jamais être commité sur GitHubAPI_SERVER_KEYdoit être défini pour activer l'API Hermes- Port
8642exposé sans127.0.0.1— requis pour accès via172.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
@rebootgarantit 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_authCaddy sur le port 3001 — WebUI a son propre login - Port
8642doit être exposé sans127.0.0.1pour être accessible depuis le bridge Docker
Liens connexes¶
- shared/references/vps-hermes-commandes — commandes SSH, Docker, gateway Telegram sur le même VPS
- shared/references/hermes-commandes — aide-mémoire Hermes : chat, config, fallbacks OpenRouter
- shared/references/hermes-email-himalaya — envoi d'emails depuis Hermes via Himalaya