Sandboxes

Une machine isolée par environnement, lancée depuis un projet sur les machines de Spunto et payée à la minute.

Une sandbox est une machine Linux isolée, construite à partir d’un projet, sur les machines de Spunto. Rien à installer ni à connecter : créez-en une, elle démarre. Elle appartient au membre qui l’a créée.

TailleCPU · RAM
small1 vCPU · 2 Go
default2 vCPU · 4 Go
large4 vCPU · 8 Go
xlarge8 vCPU · 16 Go

Choisissez-en une à la création de la sandbox (ou d’une tâche), sinon default s’applique (small pendant l’essai).

Une sandbox allumée coûte un centime par Go de RAM et par heure, décompté à la minute entamée — une small revient à 0,02 € de l’heure, une xlarge à 0,16 €. Une sandbox arrêtée ou en pause ne coûte rien.

Les minutes sont prélevées sur le solde de votre organisation, alimenté par l’abonnement mensuel (Settings → Billing : 20 € crédités chaque mois, des recharges quand il en faut plus). Quand le solde atteint zéro, les sandboxes allumées sont mises en pause, pas détruites.

Les 7 premiers jours d’un abonnement sont un essai : 2 € de crédit, une seule sandbox small à la fois, mise en pause après une heure de marche — reprenez-la et l’heure repart de zéro.

Depuis la page d’un projet, New sandbox — ou par l’API :

curl -X POST https://spunto.net/api/orgs/$ORG/sandboxes \
  -H "Authorization: Bearer $SPUNTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"projectId": "'$PROJECT'", "appId": "spunto-cloud", "size": "default"}'

appId vaut toujours spunto-cloud. La réponse revient tout de suite, avec le statut starting ; elle passe à running dès que l’agent de la sandbox s’est connecté. Un projet est construit une fois par version, et le build est partagé par les sandboxes qui l’attendent : la suivante démarre dessus.

  • /workspace — vos dépôts, sur la branche demandée, conservés quand la sandbox est arrêtée
  • Les secrets de l’organisation, du projet et du membre, en variables d’environnement
  • Un IDE dans le navigateur, sur son URL à lui, derrière votre connexion
  • Des terminaux persistants — des sessions qui survivent à une connexion coupée
  • Docker, compose compris — si le projet le demande (la feature docker-in-docker)

StatutSignification
building, creating, startingEn préparation — rien d’autre ne peut encore lui être demandé
runningL’agent de la sandbox est connecté : exec, terminaux et ports fonctionnent
stoppedSa mémoire est perdue, /workspace conservé — un start la redémarre
pausedArrêtée en gardant sa mémoire — un start la reprend, processus compris
errorQuelque chose a échoué ; statusReason dit quoi

POST .../sandboxes/:id/start, /stop, /pause, /rebuild (à la version courante du projet), et DELETE .../sandboxes/:id pour la détruire avec son stockage.

La page d’une sandbox allumée montre son CPU et sa mémoire en direct, et en dessous leur historique sur la dernière heure, 6 heures, journée ou semaine — échantillonné toutes les 15 secondes par son agent :

GET /api/orgs/:orgId/sandboxes/:sandboxId/metrics?range=1h

La page Sandboxes mesure le temps que mettent vos sandboxes à être utilisables : du début d’un démarrage à la fin du setup du projet — ou, pour une reprise, au retour de ses processus. Médiane, p95 et le plus lent, par fournisseur et par type de démarrage (nouvelle machine, boot, reprise, rebuild) :

GET /api/orgs/:orgId/sandboxes/startups?range=7d

Les deux répondent available: false tant que l’historique n’est pas joignable ; rien d’autre dans une sandbox n’en dépend.

curl -X POST https://spunto.net/api/orgs/$ORG/sandboxes/$SANDBOX/exec \
  -H "Authorization: Bearer $SPUNTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"command": "npm test"}'

Synchrone : la commande tourne dans le shell de la sandbox, par son agent (jusqu’à 30 minutes, timeoutMs), et la réponse porte son code de sortie et sa sortie. Pour un shell interactif, attachez-vous à un terminal par WebSocket — wss://spunto.net/api/sandboxes/:sandboxId/terminal?session=main (voir la référence de l’API).

Chaque port sur lequel la sandbox écoute est joignable par son URL HTTPS à lui, derrière votre connexion — rien à déclarer :

GET /api/orgs/:orgId/sandboxes/:sandboxId/ports

renvoie l’URL de l’IDE et chaque port, fusionnés avec ce que le projet déclare dans forwardPorts.

Une sandbox allumée peut faire l’objet d’un snapshot (POST .../sandboxes/:id/snapshots), d’où de nouvelles sandboxes — ou des tâches — démarrent en quelques secondes, processus et travail compris. Un snapshot est personnel : il contient les secrets de son membre.