Sommaire
Relais SSH pur vs code-server (navigateur)
Par relais SSH pur, on entend OpenSSH (éventuellement via bastion), éditeurs en terminal, transferts LocalForward / RemoteForward ciblés, sans couche IDE web. code-server incarne le schéma « VS Code dans le navigateur » : l’UI vit en HTTPS, le workspace circule en WebSocket, mais les processus s’exécutent toujours sur le Mac. La comparaison porte sur la forme de session et la surface d’exposition, pas sur l’absence d’isolation côté hôte.
| Dimension | Relais SSH pur | code-server (navigateur) |
|---|---|---|
| Transport principal | Session SSH et forwards TCP optionnels. | TLS (souvent 443) en façade, WebSocket longue durée vers un processus Node. |
| Story des ports | Nombreux ports locaux ad hoc par développeur ; risque de collision sur hôte partagé sans plages réservées. | Un listener public (plus boucle interne) ; les serveurs de dev exigent tout de même des ports hauts non chevauchés par utilisateur. |
| Isolation des droits | Se mappe bien aux comptes Unix et à ForceCommand côté sshd si besoin. |
Exige barrière jeton ou SSO et utilisateurs OS distincts ou espaces $HOME cloisonnés ; sinon les modes fichier fuient entre sièges. |
| Conflit de concurrence | Visible en charge CPU et en échecs flock ; les binômes se freinent quand le shell devient lent. |
Serveurs de langage et hôte d’extensions multiplient RAM/CPU ; risque de thrash silencieux tant que les extensions ne sont pas limitées. |
| Sensibilité latence | Chemin frappe fin ; un RTT élevé pénalise moins qu’un flux GUI complet. | L’UX éditeur souffre du jitter ; il faut WebSocket stable et buffering raisonnable derrière le proxy. |
| Wi-Fi capricieux | tmux + ControlMaster accélèrent la reprise. |
Rechargement navigateur = perte d’état d’extensions possible ; règles de confiance d’espace de travail et sauvegarde automatique critiques. |
Ports, permissions et concurrence sur un seul hôte
Que le trafic arrive sur le port 22 ou 443, le noyau reste unique : un seul ordonnanceur, une file de signature, un disque partagé. Le relais SSH pousse à lier les API de dev sur 127.0.0.1 ; l’échec typique est la collision de ports locaux entre deux profils. code-server regroupe l’éditeur derrière un arbre de processus, mais chaque espace peut lancer LSP, prévisualisations et tests sur les mêmes ports hauts — documentez des plages par utilisateur (par ex. 31xxx / 32xxx) dans le runbook.
Isolation des permissions ne doit pas se résumer à « tout le monde admin parce que Xcode l’a exigé une fois ». Préférez des comptes Unix séparés, un groupe de style staff pour les répertoires d’artefacts, umask 027 pour les nouveaux fichiers, et des identités CI incapables de déverrouiller un trousseau de login personnel. L’authentification navigateur ajoute une couche en périphérie, mais si toutes les sessions tournent sous le même utilisateur OS, une extension peut lire les jetons disque — traitez le SSO au bord comme de la sécurité de transport, pas comme du multitenancy complet.
Conflits de concurrence apparaissent comme des tests UI flaky quand un autre profil lance un simulateur, ou des timeouts flock sur des scripts de signature. Listez les jobs exclusifs (notarisation, grosses archives, charge GPU) et imposez-les via calendrier, files runner étiquetées ou verrous fichier. Quand ces règles volent en éclats à chaque sprint, la réponse durable est l’horizontalisation : un second Mac loué ou une voie CI dédiée, pas un tunnel supplémentaire sur la même machine.
Matrice de décision (si / alors)
Utilisez-la comme feuille « sprint zéro ». Si plusieurs lignes pointent vers « scinder », considérez que le budget doit couvrir un second nœud loué ou un runner dédié plutôt que d’empiler des relais sur un seul builder.
| Signal observé | Choisir | Notes |
|---|---|---|
| Prestataires sans client SSH ni gestion de clés | code-server derrière SSO | Coupler jetons courts et répertoires personnels par siège. |
| Plus de cinq forwards TCP stables par personne | SSH + petit proxy de bord | Regrouper les API de dev derrière un vhost TLS unique ; voir la matrice proxy liée en tête d’article. |
| Politique interdisant le 443 vers binaires non revus | SSH seul | Journaliser via bastion ; reporter l’IDE web jusqu’à revue supply chain de code-server. |
| Passations fréquentes sur le même dépôt | URL d’espace code-server partagée | Conserver verrous de branche et revue Git — le navigateur ne remplace pas la discipline de merge. |
| CI nocturne sature déjà le CPU | Scission du pool | Déplacer les sièges interactifs vers un autre nœud type MeshMac ; le mode d’accès est secondaire. |
Seuils exécutables et proxy inverse (neutre vis-à-vis des marques)
Chiffres indicatifs pour un builder Apple Silicon mutualisé par 2 à 4 ingénieurs. Montez les plafonds avec le nombre de cœurs et la classe SSD.
- Concurrence interactive : plafonner les processus code-server simultanés à 2 sur une machine sauf si les LSP sont bornés par workspace ; autoriser un troisième siège seulement si la RAM libre médiane reste > 8 Gio pendant les compilations.
- Concurrence automatisation : limiter CI ou runner auto-hébergé à 1–2 tâches saturantes en parallèle avec le travail humain ; mettre le reste en file.
- Keepalive SSH :
ServerAliveInterval 30,ServerAliveCountMax 4,ControlPersist 10mpar défaut ; monter à 30m si les développeurs alternent Wi-Fi instable. - Timeouts HTTP / WebSocket inactifs : aligner le bord amont sur l’étape de lien la plus longue — souvent 2700–7200 s pour des binaires natifs lourds — afin qu’un terminateur TLS managé ne coupe pas la session au milieu d’un link.
- Garde-fous hôte d’extensions : désactiver les extensions intégrées inutiles dans le profil serveur ; viser < 1,5 Gio RSS par siège pour l’hôte d’extensions avant d’ajouter des utilisateurs.
Points d’attention proxy (sans nommer de fournisseur). Terminez le TLS devant code-server, propagez Upgrade et Connection pour les WebSockets, désactivez le buffering sur la route éditeur, et alignez timeouts HTTP et WebSocket. Vérifiez qu’aucun bord HTTP/2 ne supprime des en-têtes attendus en amont. Pour SSH, privilégiez le passthrough TCP — ne laissez pas un intermédiaire traiter SSH comme du HTTP.
# Exemple de variables d’environnement (adapter chemins ; utilisateur Unix dédié)
export PASSWORD="" # préférer fichier de jeton + SSO
export HOST=127.0.0.1
export PORT=8443 # boucle locale ; TLS sur le proxy
# Optionnel : plafonner les nouvelles sessions pendant le préchauffage des extensions
# export CODE_SERVER_SESSION_LIMIT=2
Checklist d’acceptation : latence et conflits
Exécutez-la une fois par chemin réseau (direct, VPN, bastion, navigateur). Mesurez le RTT et le jitter pendant une compilation représentative.
- ☐RTT : médiane ≤ 80 ms pour un quotidien SSH-first ; code-server tolère un peu plus si le jitter reste bas.
- ☐Latence éditeur : délai frappe→écran < 150 ms en p95 lorsque les extensions sont au repos ; sinon réduire les extensions ou déplacer des sièges.
- ☐Collisions de ports : inventaire scripté des ports
LISTENdans la plage dev partagée = zéro chevauchement entre utilisateurs après un stress test du vendredi. - ☐Drill de reprise : après coupure forcée, chemins SSH et navigateur retrouvent un état éditable en < 120 s sans rotation manuelle de secrets.
FAQ
- Le code-server supprime-t-il les conflits de ports SSH sur un Mac mutualisé ?
- Il déplace le problème : l’accès interactif se concentre derrière un listener HTTPS et des montées en WebSocket, mais il faut toujours des comptes ou espaces distincts, des ports dev non chevauchés et des files de build. Le port 22 peut rester pour l’automatisation ; l’entrée navigateur ne sérialise pas magiquement les compilations.
- Quand le relais SSH pur reste-t-il le meilleur défaut pour une petite équipe ?
- Quand l’équipe vit dans tmux, rsync, git worktrees et des CLI longues durée, quand la politique interdit l’IDE web, ou quand le RTT est déjà bas avec le minimum de briques. N’ajoutez des relais que si les portables n’atteignent pas le Mac directement.
- Quels timeouts côté proxy pour code-server derrière TLS ?
- Au moins la durée au 95e percentile du job — souvent 45 à 120 minutes pour des builds natifs lourds — et alignement WebSocket/HTTP pour éviter que le canal éditeur ne vacille pendant l’édition de liens.
- Combien d’utilisateurs IDE navigateur sur un builder avant de louer un autre nœud ?
- Au-delà de deux LSP lourds simultanés avec une compilation saturante, considérez un signal d’alarme ; au-delà de trois sièges interactifs IDE sur une machine, basculez vers un autre builder loué ou une voie CI dédiée.
Louez des nœuds et des ressources de build avant de combattre la contention
Quand les seuils se déclenchent, ajoutez un second Mac Apple Silicon ou séparez les voies interactives et CI — navigateur contre SSH ne remplace pas les cœurs. Comparez les forfaits publics et options multi-nœuds sans compte, parcourez le centre d’aide et l’accueil Meshmac pour le contexte matériel. Mutualisez les builders comme ressource d’équipe plutôt que comme point unique de défaillance.