Soixante conteneurs sur un seul serveur
Une seule machine bare-metal fait tourner des dizaines à des centaines de conteneurs Hoody. La déduplication KSM et BTRFS rend le coût marginal quasi nul.
Snapshot votre conteneur staging une fois. Chaque nouvelle PR clone le snapshot dans son propre conteneur avec sa propre URL. Le conteneur se réveille quand un reviewer ouvre le lien, dort quand personne ne regarde, et se fait détruire par un cron d'une ligne quand la PR ferme. Soixante branches, soixante URL et une facture fixe.
l'URL à droite est l'env de preview — un clic, vrai conteneur, vraie base
Trois appels. Une ligne cron. Le pipeline CI que vous avez déjà les déclenche dans l'ordre que vous écrirais vous-même.
Choisis le conteneur qui fait tourner votre stack staging — app, base, queues, fixtures. POST un snapshot, nomme-le staging-base. Fichiers, processus et mémoire sont capturés. Le snapshot est un point de départ deltable, pas un tarball — les clones partagent ses pages au lieu de les copier.
votre CI reçoit le webhook push GitHub et POST sur l'API conteneurs avec source_snapshot=staging-base. Un nouveau conteneur boote en quelques secondes avec la base seedée et la branche de la PR checkée out. L'URL revient en status check.
Une entrée cron toutes les 5 minutes parcourt les PRs mergées et DELETE leurs conteneurs — ou votre webhook de merge le fait inline. Le delta disque du conteneur est récupéré, l'URL libérée, et le slot conteneur retourne dans le pool pour la prochaine PR.
L'étape 02 prend à peu près le temps d'un yarn install. L'étape 03 est un appel HTTP. Rien d'autre n'a besoin de savoir que le conteneur de la PR a existé.
Trois vrais endpoints des APIs Hoody Conteneurs et Snapshots. Place-les dans l'étape GitHub Actions que vous avez déjà.
/api/v1/containers/[staging_id]/snapshotsBody : [ "alias": "staging-base", "expiry": 30 ]. Renvoie un nom de snapshot type snap-20260501-093000. Lancez ça une fois par déploiement de la branche main — chaque clone PR descend de la capture la plus récente.
/api/v1/projects/[project_id]/containersLe body choisit server_id et un conteneur_image ; passe environment_vars pour injecter le numéro de PR, la ref de branche et le nom de la base. Le conteneur boote depuis le filesystem de votre snapshot, pas depuis zéro — caches et seed sont déjà là.
/api/v1/containers/[pr_conteneur_id]Un appel. Le conteneur s'éteint et son delta disque est récupéré ; rien d'autre n'a besoin d'être démonté. Une entrée cron toutes les 5 minutes gère les PRs qui ont fermé sans qu'on regarde.
Endpoints des APIs Hoody Conteneur Snapshots et Conteneurs. L'expiration de snapshot est en jours ; la création de conteneur accepte environment_vars, ssh_public_key, autostart, ramdisk et realm_ids — voir la doc pour le schéma complet.
Le calcul cesse de gater le comportement des reviewers. Trois habitudes trop chères à $40 par preview apparaissent d'elles-mêmes une fois que le coût par PR devient un arrondi.
Personne ne checkout la branche en local pour reproduire le bug. Ils ouvrent l'URL, cliquent sur le truc cassé, laissent un screenshot dans la PR. La boucle de review tourne sur ce que le code fait vraiment, pas sur ce que le diff suggère.
Les cinquante PRs que personne n'examine en ce moment coûtent zéro CPU et zéro RAM. Elles partagent les pages du snapshot staging-base sur disque, donc même leur empreinte est surtout du delta. La facture est bornée par la machine, pas par le compte de PRs ouvertes.
votre designer, votre support engineer, votre sales lead — quiconque a l'URL peut tester la PR. Ils n'allaient jamais git checkout une branche. Avec un lien, ils regardent vraiment le changement avant qu'il atterrisse.
Une équipe qui ouvre 30 PRs par mois. Le chiffre avant est la facture standard d'environnements de preview. Le chiffre après est une machine bare-metal Hoody qui contient les 30 plus votre staging.
$1/mo
Tarif Pro par siège plus minutes de build plus bande passante sur une équipe de 6 ingés faisant tourner 30 deploys PR par mois. La plupart des équipes plafonnent les previews aux 10 actives parce que les 20 suivantes coûtent vraiment.
$1/mo
Un serveur mid-tier du marketplace Hoody fait tourner staging plus 30 clones PR plus votre cache CI. Ajoute les soixante prochains pour $0 — copy-on-write veut dire que chaque clone est les pages du snapshot plus un delta.
Le tarif Vercel Pro affiché est $20/siège/mois plus l'usage ; le tarif d'entrée bare-metal Hoody démarre à $1/mo et varie selon la spec, la région et la durée de location. La densité de conteneurs dépend de la charge — les apps web typiques en empilent des dizaines à centaines ; les gros services stateful demandent plus de marge.
Les environnements de preview cessent d'être un poste de budget. Ils deviennent le défaut.
Les produits d'environnement de preview facturent par siège, par minute, ou par conteneur qui tourne. Hoody facture par serveur — la 30e preview coûte autant que la 1re.
Snapshot une fois. Clone par PR. Détruis au merge. Le reviewer ne sent jamais la couture.