Stacks

Un stack regroupe les applications et services d'un projet. Ses membres partagent un réseau privé et un jeu de variables, et peuvent être déployés ensemble dans un ordre défini.

Qu'est-ce qu'un stack ?

Dans l'API et la CLI, un stack s'appelle un projet : /api/v1/projects et sh0 projects gèrent les stacks. Un stack apporte à ses applications :

  • Un réseau privé sur lequel chaque application répond à <nom-app> et <nom-app>.internal. Le nom d'hôte ne change pas quand l'application est redéployée.
  • Des variables partagées, lues par toutes les applications du stack.
  • Un ordre de démarrage, utilisé quand tout le stack est déployé d'un coup.

Les applications de stacks différents ne se voient pas par leur nom. Les serveurs de bases de données sont hors des stacks : toute application les joint à <nom-serveur>.internal.

Créer un stack

Dans le tableau de bord, ouvrez Stacks, cliquez sur Créer un Stack, saisissez un Nom du Stack (1 à 100 caractères) et une Description facultative. Depuis la CLI :

Terminal
$ sh0 projects create my-shop
Project created: my-shop (5aee8eea-9f77-4d10-ac21-2fe4a565e666)
Note
sh0 push --project attend l'identifiant du stack affiché ici ; le nom n'est pas accepté.

Page d'un stack

Ouvrir un stack affiche ses services regroupés par type, ainsi que :

  • Ajouter une app, qui ouvre la page de déploiement pour ce stack ; Paramètres du Stack ; Exporter le snapshot et Importer un snapshot.
  • Le panneau Réseau interne et réglages partagés : le nom d'hôte interne de chaque service, les Variables partagées, l'Ordre de démarrage, et Déployer le projet, qui déploie toutes les applications dans cet ordre.

Variables du stack

Une variable partagée est injectée dans chaque application du stack à son déploiement suivant. Si une application définit la même clé, sa valeur l'emporte. Détails, API et priorité : Variables d'environnement.

Paramètres du stack

Paramètres du Stack modifie le nom, la description, la couleur et les membres, et porte Supprimer le Stack.

Warning
Un stack ne peut être supprimé que vide. Tant qu'il contient des applications, des bases ou des services, la suppression est refusée et le message liste ce qui reste : supprimez-les d'abord, c'est là que les données sont réellement perdues.

Usages courants

  • Un stack par produit : le frontend, l'API et les workers qui doivent se joindre par leur nom.
  • Un stack par environnement : préproduction et production séparées, chacune avec ses variables partagées.
  • Un stack par client : grâce aux membres du stack, les applications de chaque client ne sont visibles que des personnes affectées.

Gérer les stacks par l'API

Les routes sont sous /api/v1/projects. La mise à jour se fait en PATCH ; PUT répond 405. Une requête sans /v1 n'atteint pas l'API : elle renvoie la page du tableau de bord. Les sorties ci-dessous ont été obtenues sur une instance de test :

Terminal
# Create a stack
$ curl -s -X POST https://panel.example.com/api/v1/projects \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"name":"my-staging","description":"Staging environment"}'
{"data":{"color":null,"created_at":"2026-10-02 02:53:41","description":"Staging environment","id":"b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e","member_count":1,"name":"my-staging","owner_id":"50159570-e8ad-46a8-8065-e6c9096edde6"}}

# List stacks (paginated: page, per_page)
$ curl -s https://panel.example.com/api/v1/projects -H "Authorization: Bearer $SH0_TOKEN"
{"data":[{"color":null,"created_at":"2026-10-02 02:53:41","description":"Staging environment","id":"b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e","member_count":1,"name":"my-staging","owner_id":"50159570-e8ad-46a8-8065-e6c9096edde6"}, ...],"page":1,"pages":1,"per_page":20,"total":3}

# Get one stack
$ curl -s https://panel.example.com/api/v1/projects/b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e -H "Authorization: Bearer $SH0_TOKEN"
{"data":{"color":null,"created_at":"2026-10-02 02:53:41","description":"Staging environment","id":"b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e","member_count":1,"name":"my-staging","owner_id":"50159570-e8ad-46a8-8065-e6c9096edde6"}}

# Update a stack
$ curl -s -X PATCH https://panel.example.com/api/v1/projects/b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"description":"Staging, rebuilt nightly"}'
{"data":{"color":null,"created_at":"2026-10-02 02:53:41","description":"Staging, rebuilt nightly","id":"b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e","member_count":1,"name":"my-staging","owner_id":"50159570-e8ad-46a8-8065-e6c9096edde6"}}

# Delete a stack that still holds an app: refused (HTTP 400)
$ curl -s -X DELETE https://panel.example.com/api/v1/projects/5aee8eea-9f77-4d10-ac21-2fe4a565e666 -H "Authorization: Bearer $SH0_TOKEN"
{"error":{"code":"BAD_REQUEST","key":"project_not_empty","message":"Cannot delete stack: it still has 1 app (my-api). Delete these services first.","params":{"remaining":[{"count":1,"family":"apps","names":"my-api"}]}}}

# Delete an empty stack (HTTP 204, no body)
$ curl -s -X DELETE https://panel.example.com/api/v1/projects/b9b14ce5-7aa4-4c0d-85fe-b6c4b3977e8e -H "Authorization: Bearer $SH0_TOKEN" -o /dev/null -w "%{http_code}\n"
204
Note
Pour l'ensemble des points d'accès, voir la référence de l'API.