Fonctionnalité en cours de déploiement. L'interface décrite ici est celle de la prochaine livraison : elle peut encore évoluer, et n'est pas forcément activée sur votre tenant.
sng app pilote les Apps de conteneurs de votre tenant (kind App). Chaque commande qui
modifie quelque chose réécrit le manifeste de l'App côté plateforme ; le déploiement suit, et
sng app describe permet de l'observer. Toutes les commandes exigent une session
(sng sso login), un tenant (sng tenant use).
À ne pas confondre avec sng iam app, qui liste les applications OIDC de vos utilisateurs.
Les noms d'App sont des labels DNS de 24 caractères au plus (^[a-z](./[-a-z0-9]{0,22}[a-z0-9])?$).
Les flags globaux (--config, --json, -v, --version) sont décrits dans
la page d'accueil de la CLI.
sng app list
Liste les Apps du tenant courant avec leur état déployé.
Aucun argument, aucun flag propre.
NAME STATUS SERVICES URL
shop prête 4/4 https://api-shop.<tenant>.dev.stackngo.app/
web en attente - -
| Colonne | Contenu |
|---|
STATUS | en attente (état pas encore remonté), prête, en cours, ou la raison du blocage (QuotaExceeded, SecretNotFound…) |
SERVICES | services prêts / total, - si inconnu |
URL | URL du premier service exposé, - sinon |
Sortie --json :
{
"apps": [
{
"name": "shop",
"ready": true,
"synced": true,
"summary": "4/4",
"reason": "Reconciled",
"services": [
{ "name": "api", "kind": "deployment", "image": "registry.gitlab.com/stackngo/shop-api:1.4.2",
"size": "xs", "replicas": 2, "ready": true, "phase": "Ready", "reason": "Reconciled",
"message": "2/2 prêts", "url": "https://api-shop.<tenant>.dev.stackngo.app/" }
]
}
]
}
Sans App : aucune App.
sng app create
sng app create NAME --image IMAGE [flags]
Crée une App à un seul service, nommé comme l'App, sans écrire de manifeste. Pour plusieurs
services, écrivez le manifeste (sng template gen App) et sng apply.
| Argument | Description |
|---|
NAME | nom de l'App et de son service |
| Flag | Type | Défaut | Description |
|---|
--image | chaîne | — | image du conteneur (requis) |
--port | liste | — | port exposé, "8080" ou "80:8080" ; répétable ou séparé par des virgules |
--ingress[=PORT] | optionnel | — | expose en HTTPS sur https://NAME-NAME.<tenant>.dev.stackngo.app/ ; --ingress=8080 choisit le port |
--size | chaîne | xxs | taille : xxxs xxs xs s m l xl xxl xxxl |
--replicas | entier | 1 | nombre de réplicas (écrit seulement si le flag est donné) |
--user | chaîne | — | uid numérique non root, "uid" ou "uid:gid" |
--env | K=V | — | variable d'environnement ; répétable (pas de découpage sur la virgule) |
--env-secret | K=SECRET:CLÉ | — | variable tirée d'une clé de Secret ; répétable |
--env-from | liste | — | Secret dont toutes les clés deviennent des variables ; répétable |
--image-pull-secret | liste | — | Secret docker-registry ; répétable |
--egress-internet | booléen | false | autorise la sortie vers Internet |
--allow-from | liste | — | autre App du tenant autorisée sur les ports ; répétable |
sng app create web --image nginxinc/nginx-unprivileged:1.27 --port 8080 --ingress
sng app create api --image registry/api:1.2 --port 8080 --size s \
--env LOG=info --env-secret DB_PASSWORD=db:password --egress-internet
sng app create db --image postgres:17 --user 999 --port 5432 --env-secret POSTGRES_PASSWORD=db:password
App "web" créée ; déploiement en cours (sng app describe web)
--json renvoie l'App telle que sng app describe la montre (sans état déployé encore).
| Erreur | Cause |
|---|
--image requis | flag absent |
nom d'App invalide "Shop" : minuscules, chiffres et '-', 24 caractères au plus | nom hors format |
--ingress="x" : port attendu | valeur non numérique |
--env "FOO" : forme K=V attendue | pas de = |
--env-secret "DB=db" : forme K=SECRET:CLÉ attendue | pas de : entre le Secret et la clé |
l'App "web" existe déjà (sng app patch) | une App de ce nom existe : modifiez-la |
services.web : ingress sans port (déclarer ports) | --ingress sans --port |
spec.services.web.size: Unsupported value: "xxxxl" | valeur refusée par le schéma |
sng app describe
sng app describe NAME [--manifest]
Affiche l'état de l'App et de chacun de ses services : kind, image, phase, URL, raison et message.
| Argument | Description |
|---|
NAME | nom de l'App |
| Flag | Type | Défaut | Description |
|---|
--manifest | booléen | false | affiche aussi le manifeste courant à la suite du tableau |
sng app describe shop
sng app describe shop --manifest
App : shop
Statut : en cours
Message : api : attend : migrate
SERVICE KIND IMAGE PHASE URL DETAIL
api deployment registry.gitlab.com/stackngo/shop-api:1.4.2 Waiting - WaitingForDependency attend : migrate
db deployment postgres:17 Ready - Reconciled 1/1 prêts
migrate job registry.gitlab.com/stackngo/shop-api:1.4.2 Progressing - JobRunning job en cours
Message n'apparaît que si l'App en a un. --json renvoie l'objet App (voir list), avec en
plus le champ manifest (YAML).
| Erreur | Cause |
|---|
shop | aucune App de ce nom dans le tenant courant (le message ne contient que le nom) |
sng app patch
sng app patch NAME [--service SERVICE] [flags]
Modifie un service de l'App. Les champs non donnés restent inchangés.
| Argument | Description |
|---|
NAME | nom de l'App |
| Flag | Type | Défaut | Description |
|---|
--service | chaîne | le service unique | service visé ; requis si l'App en a plusieurs |
--image | chaîne | — | nouvelle image |
--size | chaîne | — | nouvelle taille |
--replicas | entier | — | nombre de réplicas (écrit seulement si le flag est donné) |
--port | liste | — | remplace la liste des ports ; répétable |
--ingress-port | entier | — | port d'ingress ; 0 retire l'ingress |
--env | K=V | — | ajoute ou modifie une variable ; répétable |
--env-secret | K=SECRET:CLÉ | — | ajoute une variable tirée d'un Secret ; répétable |
--unset-env | liste | — | retire une variable ; répétable |
--egress-internet | booléen | — | true ouvre, false ferme la sortie Internet (écrit seulement si donné) |
--allow-from | liste | — | remplace les Apps autorisées ; '' pour aucune |
sng app patch web --image nginxinc/nginx-unprivileged:1.27-alpine
sng app patch shop --service api --size s --env LOG=debug --unset-env OLD
sng app patch shop --service api --ingress-port 0
sng app patch shop --service db --allow-from reporting,bi
App "shop" modifiée ; déploiement en cours
| Erreur | Cause |
|---|
plusieurs services : préciser --service (api, db, migrate) | App à plusieurs services sans --service |
service "web" absent (api, db) | --service inconnu |
spec.services.db: Invalid value: … un service avec volume tourne en un seul exemplaire … | le résultat enfreint une règle du schéma (ici --replicas 2 sur un service à volume) ; rien n'est écrit |
shop | App inconnue |
sng app scale
sng app scale NAME REPLICAS [--service SERVICE]
Fixe le nombre de réplicas d'un service deployment.
| Argument | Description |
|---|
NAME | nom de l'App |
REPLICAS | entier de 0 à 100 ; 0 arrête les instances sans supprimer le service |
| Flag | Type | Défaut | Description |
|---|
--service | chaîne | le service unique | service visé |
sng app scale web 2
sng app scale shop 3 --service api
App "shop" : 3 réplica(s) demandé(s)
| Erreur | Cause |
|---|
REPLICAS "abc" : entier positif attendu | argument non numérique ou négatif |
replicas 150 hors de 0-100 | hors bornes |
scale ne s'applique qu'à un deployment (kind job) | service job ou cronjob |
le service est en autoscale : modifier autoscale.max plutôt que replicas | service avec autoscale |
un service avec volume tourne en un seul exemplaire | REPLICAS > 1 sur un service à volume |
sng app restart
sng app restart NAME [--service SERVICE]
Redémarre les instances : tous les services deployment de l'App, ou un seul avec --service. Les
instances sont remplacées selon la strategy du service ; rien d'autre ne change.
| Argument | Description |
|---|
NAME | nom de l'App |
| Flag | Type | Défaut | Description |
|---|
--service | chaîne | tous les deployments | service visé |
sng app restart shop
sng app restart shop --service api
App "shop" : redémarrage demandé
| Erreur | Cause |
|---|
restart ne s'applique qu'à un deployment (kind job) | --service sur un job ou un cronjob |
aucun deployment à redémarrer | l'App n'a que des jobs/cronjobs |
sng app logs
sng app logs NAME [--service SERVICE] [--tail N] [--since DURÉE] [-f]
Affiche les logs des instances de l'App, chaque ligne préfixée du nom de l'instance
([instance], ou [instance/conteneur] quand elle en a plusieurs, par exemple avec init).
| Argument | Description |
|---|
NAME | nom de l'App |
| Flag | Type | Défaut | Description |
|---|
--service | chaîne | tous | ne lire que les instances de ce service |
--tail | entier | 200 | dernières lignes par conteneur ; plafonné à 5000 |
--since | durée | — | ne lire que depuis cette durée (10m, 2h) ; plafonnée à 24h |
-f, --follow | booléen | false | suit le flux ; coupé après 10 minutes |
sng app logs web
sng app logs shop --service api --since 10m -f
sng app logs shop --service migrate --tail 50
[shop-api-7c9d4b8f6-x2k9q] 2026-10-07T09:12:03Z INFO listening on :8080
[shop-migrate-a1b2c3d4-zz9pq] migrate ok
La sortie est du texte brut ; --json n'a pas d'effet. Une lecture ne dépasse jamais 10 Mio.
Sans instance en cours : aucun … pour l'App shop.
| Erreur | Cause |
|---|
shop | App inconnue |
service "Api" invalide | nom de service hors format |
forbidden (no policy of this tenant allows it: see sng tenant policy list) | pas le droit deploy:logs sur cette App |
sng app delete
sng app delete NAME [-y|--yes]
Supprime l'App : ses services, ses adresses et son réseau disparaissent. Les volumes sont
conservés avec leurs données.
| Argument | Description |
|---|
NAME | nom de l'App |
| Flag | Type | Défaut | Description |
|---|
-y, --yes | booléen | false | confirme sans invite ; requis hors terminal interactif |
sng app delete web
sng app delete web --yes
Supprimer l'App "web" ?
Tapez « oui » pour confirmer : oui
App "web" supprimée (les volumes restent)
--json : {"name": "web", "deleted": true}. Équivalent : sng kind delete App web.
| Erreur | Cause |
|---|
confirmation requise : relancez avec --yes ou depuis un terminal interactif | entrée standard non interactive sans --yes |
opération annulée | réponse autre que oui/o/yes/y |
web | App inconnue |
Commandes liées
| Commande | Rôle |
|---|
sng template gen App [NAME] | écrit un manifeste App d'exemple (<name>.yml) à compléter |
sng apply FICHIER | applique un manifeste App (création ou mise à jour complète) |
sng validate FICHIER, sng plan FICHIER | contrôle et prévisualisation avant apply |
sng kind get App NAME | manifeste brut tel qu'enregistré |
sng kind list App | Apps du tenant, sans état déployé |
sng kind delete App NAME | même effet que sng app delete |
Erreurs communes à toutes les commandes
| Erreur | Cause |
|---|
tenant session required: run sng tenant use NAME | aucun tenant courant |
session expired: run sng tenant use NAME (or sng sso login if identity is expired) | session ou identité expirée : sng tenant use, sinon sng sso login |
forbidden (no policy of this tenant allows it: see sng tenant policy list) | la politique de votre tenant ne vous accorde pas l'action (deploy:list, deploy:read, deploy:write, deploy:delete, deploy:logs) sur cette App |
apps not configured | la gestion des Apps n'est pas activée sur ce cluster |
Les erreurs renvoyées par l'API s'affichent par leur seul message ; avec -v, la méthode et
l'URL appelées s'ajoutent entre parenthèses.
Voir aussi