Exécutez Crew sur plusieurs hôtes distants — postes de développement, instances EC2, serveurs personnels — et pilotez-les tous depuis une seule passerelle hub. Multi-instance ouvre des tunnels SSH vers chaque instance distante, émet des jetons de tableau de bord de courte durée et intègre chaque tableau de bord distant dans une bande d'onglets. Les instances utilisées le plus récemment restent actives; les autres se reconnectent à la demande.
Activation volontaire. Désactivé par défaut.
kirocrew config set instances.enabled true kirocrew restart
Une fois activée, la passerelle :
SshTunnelManagerframe-src aux ports de tunnel loopback actifs (afin que les tableaux de bord distants intégrés puissent s'afficher — ils sont sinon bloqués par le strict frame-src 'self' blob:)Lorsque l'indicateur est désactivé, /api/instances/* renvoie 403 et la page /instances affiche une invitation à l'activation.
┌── Hub gateway (this host) ──┐ │ /instances page (React) │ │ ├─ tab strip: Home · A · B │ │ ├─ warm <iframe>s per tab │ http://127.0.0.1:<local_port>/?token=… │ └─ Manage panel │ add / connect / diagnose / restart / remove │ │ │ instances/ package │ │ ├─ registry │ ~/.kiro/crew/instances.json │ ├─ port_allocator │ loopback ports from base 7778 │ ├─ token_mint │ ssh <host> kirocrew token → JWT (never logged) │ ├─ ssh_tunnel_manager │ supervised ssh -N -L, probe, self-heal, refresh │ └─ diagnostics │ ssh → remote-dashboard → local-forward ladder └──────────────────────────────┘ │ ssh -N -L 127.0.0.1:<local>:127.0.0.1:<remote> ▼ ┌── Remote gateway ────────────┐ │ kirocrew gateway bound to │ │ 127.0.0.1:<remote_port> │ └──────────────────────────────┘
Chaque instance que vous ajoutez produit un processus enfant supervisé ssh -N -L. Le tunnel transfère 127.0.0.1:<local> → distant 127.0.0.1:<remote>. Le hub émet un jeton de tableau de bord sur l'instance distante via SSH et intègre le tableau de bord distant dans un iframe à l'URL loopback.
POST /api/instances/{id}/connect alloue un port loopback, émet un jeton sur l'instance distante via SSH, démarre ssh -N -L, attend que le transfert local accepte une connexion, puis renvoie l'état en directwarm_set_cap (5 par défaut) instances les plus récemment utilisées restent actives avec un tunnel + WebSocket en direct. Se connecter au-delà de la limite évince paresseusement la moins récemment utilisée?diagnose=1 exécute une série de sondes de défaillance à la demande; POST .../restart redémarre la passerelle distante via SSHOuvrez Instances dans le tableau de bord, cliquez sur Add, puis remplissez :
| Champ | Description |
|---|---|
| Name | N'importe quelle étiquette (p. ex. « Dev box 1 ») |
| SSH host / alias | Ce que vous taperiez après ssh — voir ci-dessous |
| Remote port | Port de la passerelle distante (par défaut 7777) |
| Token TTL | Par défaut 20 h |
Le champ ssh_host accepte :
dev-1.example.com)ec2-user@10.0.1.5)my-ec2)Toute option commençant par - est rejetée (protection contre l'injection).
Le seul paramètre propre à chaque instance distante est ssh_host. Tout ce que ssh peut atteindre de manière non interactive fonctionne.
Utilisez votre alias de configuration SSH ou user@hostname. Tant qu'une clé de votre ssh-agent couvre l'authentification, BatchMode réussit sans invite.
Configurez un alias SSH dans ~/.ssh/config sur le hub, puis référencez l'alias :
Host my-ec2 HostName ec2-1-2-3-4.compute-1.amazonaws.com User ec2-user IdentityFile ~/.ssh/my-key.pem # Optional: reach a private instance through a bastion ProxyJump bastion-host # Or via SSM Session Manager: # ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
Ajoutez ensuite une instance avec my-ec2 comme hôte SSH.
Prérequis sur le hub :
ssh-agent la détenant (BatchMode ne demandera pas d'invite)kirocrew installé et une passerelle en cours d'exécution sur le port loopback de l'instance EC2| Besoin | État | Comment |
|---|---|---|
| Utilisateur de connexion personnalisé | ✅ | user@host ou User dans la configuration ssh |
| FQDN / IP | ✅ | valeur directe de ssh_host |
Fichier d'identité (-i) | ⚠️ via la configuration ssh seulement | IdentityFile dans un bloc Host |
| Port SSH autre que 22 | ⚠️ via la configuration ssh seulement | Port dans un bloc Host |
| Bastion / ProxyJump | ⚠️ via la configuration ssh seulement | ProxyJump / ProxyCommand |
| Instances SSM uniquement | ⚠️ via la configuration ssh seulement | ProxyCommand avec aws ssm start-session |
Le panneau Manage vous offre les actions suivantes par instance :
Chaque route de /api/instances/* est protégée par _guard() :
request["user"] (session de tableau de bord authentifiée)instances.enabled: trueAu-delà de la protection :
ssh -N -L 127.0.0.1:<local>:127.0.0.1:<remote>ssh est toujours invoqué avec une liste argv; ssh_host ne peut pas injecter de syntaxe shell localessh_host et remote_bin sont rejetés s'ils contiennent des métacaractères shell ou commencent par -event.origin de trame intégrée par rapport à l'exact http://127.0.0.1:<port> d'un tunnel actuellement actif avant de faire confiance à un message de compte de non-lusSous instances.* :
| Clé | Par défaut | Signification |
|---|---|---|
instances.enabled | false | Activation principale |
instances.warm_set_cap | 5 | Nombre maximal d'instances maintenues actives à la fois |
instances.tunnel_base_port | 7778 | Premier port loopback local pour ssh -L |
instances.max_recovery_attempts | 8 | Tentatives d'autoréparation consécutives avant abandon |
instances.recover_backoff_max_secs | 30 | Plafond du délai exponentiel entre les tentatives d'autoréparation |
instances.probe_failure_threshold | 3 | Échecs de sonde consécutifs avant de déclencher la récupération |
| Symptôme | Solution |
|---|---|
/instances affiche « multi-instance management is off » | instances.enabled est à false — activez-le et redémarrez |
| L'iframe est vide | L'assouplissement de la CSP frame-src ne s'applique qu'aux ports de tunnel actifs; assurez-vous que l'instance est connectée |
| La connexion échoue avec une erreur d'authentification SSH | Actualisez vos identifiants SSH (rajoutez la clé à ssh-agent); les tunnels s'autoréparent une fois SSH rétabli |
| La connexion échoue | Utilisez Diagnose — la série de sondes signale le premier lien rompu (ssh_unreachable, remote_down ou tunnel_down) |
| L'instance se déconnecte constamment | Sonde de santé + nouvelle tentative d'autoréparation à 2 niveaux sur environ 2 min; si elle abandonne, le diagnostic s'exécute automatiquement. Vérifiez la passerelle distante et la stabilité SSH |
| Une instance a disparu silencieusement de l'ensemble actif | Évincée par LRU (ensemble actif plein). Augmentez instances.warm_set_cap ou reconnectez-vous à la demande |
Multi-instance