Minihubs et mmh · 4. Le mmh
Une antenne de 15 Mo,
là où il en faut une.
Le minihub fait tourner des applications. Pour des tâches plus petites, il a des enfants : les mmh. Un binaire Go, une machine, un rôle.
Le minihub est un agent Java, avec sa base, son bus de messages et Docker. C’est beaucoup pour une petite machine virtuelle qui doit seulement sortir sur Internet, ou lancer une tâche chaque nuit. Le mmh, pour miniMiniHub, répond à ce cas : un seul fichier exécutable en Go, de 12 à 17 Mo, sans dépendance.
À quoi ça sert
Un mmh tient un ou plusieurs rôles :
proxy
Il sert de sortie sur Internet pour les applications du Hub, avec sa propre adresse, en direct ou par TOR. C’est l’objet de l’article suivant.
smtp
Il remet du courrier directement aux serveurs de destination, seulement pour les domaines qu’on lui confie, et sous quota.
batch
Il exécute des tâches planifiées d’agent IA, que le Hub crée et modifie à distance, et remonte un rapport.
Un cas réel. Adswizard fait tourner des mmh sur sa propre infrastructure. Leur rôle est
batch : des tâches planifiées d’agent IA, pilotées depuis le Hub, sans que son réseau s’ouvre.
Ce qu’on voit à l’écran

Relevée le 2026-09-23 à 13:41. C’est la fiche du minihub minihub-ovh-rss, onglet
miniMiniHubs (17) : 17 mmh sont rattachés à ce minihub. En haut à droite, l’heure de mise à jour et un bouton Rafraîchir.
La rangée d’onglets. Un onglet par mmh. Certains noms sont en partie floutés : ils désignent des clients qui n’ont pas demandé à être cités. On lit notamment adsw-prd1, adsw-prd2,
adsw-token (Adswizard), et mmh-prod-001, mmh-prod-002 (nos deux sorties).
Le cadre du mmh ouvert, adsw-prd1. État ACTIVE. Dernier heartbeat il y a 11 s. Mode
persistent : l’agent est un service système qui survit au redémarrage de la machine. Rôle
batch. Version d’agent 0.7.2. L’adresse vue et l’hôte sont floutés.
« Charge et activité ». CPU 6 %, RAM 33 %, disque 38 %. L’adresse de sortie (IP d’égress), floutée. « Connexions par service : aucune ».
« Actions MCP ». C’est la partie la plus parlante. Le texte l’explique : « Catalogue introspecté : chaque binaire enrôlé est interrogé. Rien n’est déclaré côté Hub, donc rien ne peut dériver du code déployé. » Ici, 13 actions sur 1 binaire, servies depuis le cache du Hub (sonde de 13:40:15), le bouton Re-sonder force une lecture fraîche. Le binaire mmh:core est OK en v0.7.2. Première action listée : bash, étiquetée ops, « Exécuter une commande et observer sa sortie ». Sa règle est écrite en clair : exécution directe des arguments, jamais par un shell ; une commande composée (;, |, $(), redirection) est refusée. La sortie est rendue, tronquée à 100 ko.
Comment ça marche
Le mmh se rattache à un minihub, en sortant
Tunnel gRPC mTLS vers son minihub parent, sur le port 443. Aucun port ouvert sur la machine du mmh. Le minihub le relaie au Hub.
Il donne signe de vie et sa charge
Battement de cœur régulier, avec CPU, mémoire, disque et connexions par service. Le minihub tient le registre de ses mmh.
Il est fermé par défaut
Pas de mTLS, pas de démarrage. Magasin local chiffré (AES-256-GCM), ou pas de démarrage. Et un fichier de permissions, au format allow / deny / ask : sans lui, le mmh démarre, bat… et n’exécute rien.
Il déclare ce qu’il sait faire
Le Hub interroge chaque binaire autorisé, qui publie ses actions et leurs paramètres. Un appel mal formé est refusé par le Hub avant de réveiller la machine.
Le Hub lui confie des tâches
Une tâche planifiée : une expression cron, un agent, un gabarit de prompt. Le mmh la garde dans une file durable et remonte un rapport en Markdown, que le Hub peut diffuser par courrier.
Sous le capot
| Agent | Go, binaire statique ; magasin bbolt chiffré ; journal d’audit de chaque interaction |
| Tunnel | mmh → minihub parent, gRPC mTLS, 443 ; le minihub remonte l’état au Hub |
| Permissions | settings.local.json, précédence deny > ask > allow ; sans fichier, tout est refusé |
| Agents d’une tâche | claude_code, custom_exec, custom_http, agentia |
| Actions MCP | list_miniminihubs, mmh_list_actions, mmh_invoke_action, set_batch_job, run_now (du miniminihub_deploy_worker) |
| Écran | onglet miniMiniHubs de la fiche d’un minihub |
set_batch_job prend schedule (cron), agent_kind, prompt_template, overlap (skip, queue, parallel) et la liste des destinataires du rapport. run_now exécute tout de suite, en attendant le résultat ou non.
Les limites, aujourd’hui
- Le certificat qui relie un mmh à son minihub se renouvelle à la main.
- Une permission « ask » vaut un refus : il n’existe pas encore de canal pour approuver.
- Un seul de nos minihubs accueille des mmh.
