Module 06 / 19← Ordre des modules
● Hermes · Service persistant · API locale

Hermes API / Gateway

Ce module transforme Hermes en service persistant, active son API OpenAI-compatible et protège l’accès par une clé Bearer. L’objectif est d’obtenir une Gateway stable utilisable plus tard par Open WebUI, Telegram et les autres interfaces, sans publier de secret ni exposer l’API directement sur Internet.

Point de départ

Hermes local fonctionne

Point d’arrivée

Gateway persistante + API protégée

Port Golden

8642

Avant de commencer

Prérequis

  • Modules 00 à 05 validés.
  • Hermes répond correctement au modèle local.
  • Vous avez choisi si l’API restera locale ou sera accessible sur votre réseau privé/VPN.
  • Aucun accès direct depuis Internet ne doit être nécessaire.

Valeurs à personnaliser

Adresse privée de Jarvis si accès LAN/VPNMETTRE_VOTRE_IP_LAN_JARVIS
Secret API HermesGÉNÉRÉ_AUTOMATIQUEMENT
Choix de sécurité : si seule la machine Jarvis doit consommer l’API, conservez l’écoute locale par défaut. Pour Open WebUI ou un client sur le LAN/VPN, utilisez uniquement METTRE_VOTRE_IP_LAN_JARVIS ou une adresse privée adaptée. N’exposez pas cette API directement sur Internet.

Légende des commandes

Lecture seuleModificationValidationOptionnel

Installation pas à pas

06.1 · Vérifier Hermes avant d’ajouter la Gateway

Validation
hermes chat -q "Réponds uniquement par : HERMES OK"
hermes config check
Pourquoi : Isoler les problèmes : la Gateway ne doit être installée que lorsque le cœur Hermes fonctionne déjà.
Résultat attendu : Hermes répond et la configuration est valide.

06.2 · Sauvegarder le fichier de secrets existant

Modification
mkdir -p ~/.hermes
[ -f ~/.hermes/.env ] && cp ~/.hermes/.env ~/.hermes/.env.backup-$(date +%Y%m%d-%H%M%S) || true
Pourquoi : Créer un point de retour avant d’ajouter les variables de l’API.
Résultat attendu : Une sauvegarde horodatée existe si le fichier .env était déjà présent.

06.3 · Générer la clé API sans l’afficher

Modification
python3 - <<'PY'
from pathlib import Path
import secrets
p = Path.home()/'.hermes'/'.env'
p.parent.mkdir(parents=True, exist_ok=True)
lines = p.read_text().splitlines() if p.exists() else []
keys = {'API_SERVER_ENABLED','API_SERVER_PORT','API_SERVER_KEY'}
lines = [x for x in lines if not ('=' in x and x.split('=',1)[0] in keys)]
lines += [
    'API_SERVER_ENABLED=true',
    'API_SERVER_PORT=8642',
    'API_SERVER_KEY=' + secrets.token_hex(32),
]
p.write_text('\n'.join(lines)+'\n')
p.chmod(0o600)
print('Configuration API créée sans afficher le secret.')
PY
Pourquoi : Hermes exige une clé Bearer lorsque le serveur API est activé, y compris en écoute locale.
Résultat attendu : Le script confirme la création et ne révèle jamais la valeur du secret.

06.4 · Choisir le mode d’écoute de l’API

Optionnel
# MODE A — local uniquement : ne rien ajouter, Hermes garde l'écoute locale par défaut.

# MODE B — LAN/VPN : ajouter l'adresse privée choisie
printf '\nAPI_SERVER_HOST=METTRE_VOTRE_IP_LAN_JARVIS\n' >> ~/.hermes/.env
Pourquoi : Le Golden Build utilise l’API sur un réseau privé. Cette étape doit rester explicite afin d’éviter une exposition involontaire.
Résultat attendu : Le fichier .env contient uniquement le mode d’écoute que vous avez choisi.

06.5 · Protéger le fichier de secrets

Validation
chmod 600 ~/.hermes/.env
stat -c "%a %n" ~/.hermes/.env
Pourquoi : Empêcher les autres comptes locaux de lire la clé API.
Résultat attendu : Les permissions affichées sont 600.

06.6 · Installer la Gateway en service utilisateur

Modification
hermes gateway install
Pourquoi : Créer l’unité systemd utilisateur officielle fournie par Hermes.
Résultat attendu : Hermes confirme l’installation du service Gateway.

06.7 · Permettre au service utilisateur de survivre à la déconnexion

Modification
sudo loginctl enable-linger "$USER"
Pourquoi : Le Golden Build utilise un service utilisateur qui doit pouvoir continuer à tourner après fermeture de session.
Résultat attendu : La commande se termine sans erreur.

06.8 · Démarrer ou redémarrer la Gateway

Modification
hermes gateway restart
Pourquoi : Charger les variables de .env et démarrer le serveur API avec la Gateway.
Résultat attendu : La Gateway redémarre sans boucle de crash.

06.9 · Vérifier l’état du service

Validation
hermes gateway status
systemctl --user status hermes-gateway --no-pager
Pourquoi : Confirmer que le processus est bien géré par systemd.
Résultat attendu : Le service est actif.

06.10 · Tester le endpoint de santé local

Validation
curl -fsS http://localhost:8642/health | jq .
Pourquoi : Le endpoint de santé permet de vérifier le serveur sans envoyer une conversation.
Résultat attendu : Une réponse JSON indique un état sain.

06.11 · Tester l’authentification de l’API

Validation
set -a
source ~/.hermes/.env
set +a
curl -fsS http://localhost:8642/v1/models \
  -H "Authorization: Bearer $API_SERVER_KEY" | jq .
Pourquoi : Vérifier que la clé stockée dans .env est acceptée sans jamais l’afficher.
Résultat attendu : La liste des modèles API est retournée ; le nom Hermes est visible.

06.12 · Tester une complétion OpenAI-compatible

Validation
curl -fsS http://localhost:8642/v1/chat/completions \
  -H "Authorization: Bearer $API_SERVER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"hermes-agent","messages":[{"role":"user","content":"Réponds uniquement par API OK"}]}' | jq .
Pourquoi : Valider la chaîne API → Hermes → modèle local → réponse.
Résultat attendu : La réponse contient le texte demandé ou une réponse équivalente.

06.13 · Vérifier le port sans publier d’adresse

Lecture seule
ss -lntp | grep ':8642' || true
Pourquoi : Confirmer qu’un processus écoute bien sur le port Golden.
Résultat attendu : Une ligne correspondant à Hermes/Gateway est visible.

06.14 · Consulter les logs en cas d’erreur

Lecture seule
journalctl --user -u hermes-gateway -n 100 --no-pager
Pourquoi : Obtenir la cause réelle d’un échec avant de modifier la configuration.
Résultat attendu : Les logs ne montrent pas de redémarrages en boucle ni d’erreurs d’authentification.

Local uniquement ou LAN / VPN ?

Local uniquement

C’est le mode le plus restrictif. Il convient si les clients tournent directement sur Jarvis. Ne définissez pas API_SERVER_HOST et conservez l’écoute locale par défaut.

Réseau privé / VPN

Utilisez METTRE_VOTRE_IP_LAN_JARVIS uniquement si un client externe, comme Open WebUI ou un poste VPN, doit joindre Hermes. La clé API reste obligatoire.

CORS

Ne configurez API_SERVER_CORS_ORIGINS que si un navigateur appelle directement l’API. Utilisez une liste très restrictive avec vos propres origines privées.

À éviter

Pas d’exposition Internet directe, pas de clé dans une page HTML, pas de clé dans un script public, et pas de double service Gateway user + system.

Validation du Module 06

Ne passez au module suivant que lorsque tous les points applicables sont validés.

Hermes fonctionnait avant l’installation de la Gateway.
API_SERVER_KEY a été générée sans être affichée.
~/.hermes/.env est en permissions 600.
Un seul mode d’écoute API a été choisi.
hermes gateway status indique un service actif.
Le endpoint /health répond.
/v1/models répond uniquement avec la bonne clé.
Une complétion /v1/chat/completions fonctionne.
Le port 8642 est bien ouvert localement comme prévu.
Aucune exposition Internet directe n’a été créée.

STOP — Module 06 validé

Si tous les contrôles sont corrects, ce module est terminé. En cas d’écart, restez sur ce module et diagnostiquez la dernière étape en erreur avant de poursuivre.