ssh -p 2222 cemantix@ssh.lclr.dev pour jouer à Cémantix dans son terminal
- Go 99.5%
- Dockerfile 0.5%
| cmd/ssh-portal | ||
| docs/superpowers | ||
| internal | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| compose.yaml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| README.md | ||
SSH Portal
Portail SSH pour publier des applications terminal hébergées dans des images OCI. Le joueur n’installe ni Docker, ni Python, ni le dépôt du jeu.
ssh -p 2222 cemantix@ssh.lclr.dev
Une clé SSH est obligatoire, mais elle n’a pas besoin d’être inscrite au préalable. Son empreinte identifie la session persistante du joueur.
Fonctionnement
gatewayaccepte seulement les sessions SSH interactives avec clé publique ;adminpropose une interface HTTP protégée par Basic Auth ;runnerest le seul service avec accès Docker. Il télécharge les images demandées par l’admin, puis résout le handle demandé vers le digest OCI et lance le jeu dans un conteneur limité.
Un mapping contient un handle, tel que cemantix, et une image complète
épinglée par digest :
forge.lclr.dev/thibaud-lclr/cemantix-tui@sha256:<digest>
Les tags tels que latest sont refusés : ils ne permettent pas de savoir
quelle version est exécutée.
Téléchargement des images
La création d’un mapping lance un téléchargement asynchrone sur le serveur :
- pastille orange : téléchargement en cours, le handle n’est pas lançable ;
- pastille verte : image téléchargée et handle activé ;
- pastille grise : image téléchargée mais handle désactivé ;
- pastille rouge : téléchargement en erreur ; le log Docker complet est consultable depuis l’interface.
Un mapping en erreur doit être supprimé puis recréé avec le digest à utiliser.
Déploiement Coolify
- Créer un nouveau service Docker Compose depuis ce dépôt, avec
compose.yaml. - Déclarer au moins
RUNNER_TOKEN,ADMIN_USERNAMEetADMIN_PASSWORDà partir de .env.example. Utiliser deux secrets longs et distincts. - Configurer un domaine HTTPS Coolify uniquement sur le service
admin, port8080, par exempleadmin.ssh.lclr.dev. - Ouvrir le port TCP
2222vers Internet pour le servicegateway. - Déployer, ouvrir l’admin avec les identifiants configurés et créer le
mapping
cemantixavec l’image issue de sa CI.
Coolify héberge le portail et les conteneurs de jeu tournent sur ce serveur. Le joueur utilise seulement son client SSH local.
Stockage et limites
Les propositions d’un jeu sont conservées dans un volume Docker nommé, associé à l’empreinte de la clé et au handle. Changer de clé crée une session distincte.
Chaque lancement reçoit un système de fichiers en lecture seule, un volume de
données dédié, 0,5 CPU, 256 Mio de mémoire, au plus 128 processus et une durée
maximale configurable par MAX_SESSION_DURATION (4 heures par défaut). Les
images de jeu ne reçoivent jamais le socket Docker ni les secrets du portail.
Développement
go test ./...
docker compose --env-file .env.example config
docker build -t ssh-portal:local .
go test -tags=integration ./tests -run TestPublicKeySSHStartsMappedTerminalImage -v
Le dernier test nécessite un daemon Docker accessible et télécharge l’image
publique hello-world pour vérifier le chemin SSH complet.