Aller au contenu principal

sng app

Bêta

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​

sng app list

Liste les Apps du tenant courant avec leur état déployé.

Aucun argument, aucun flag propre.

sng app list
NAME STATUS SERVICES URL
shop prête 4/4 https://api-shop.<tenant>.dev.stackngo.app/
web en attente - -
ColonneContenu
STATUSen attente (état pas encore remonté), prête, en cours, ou la raison du blocage (QuotaExceeded, SecretNotFound…)
SERVICESservices prêts / total, - si inconnu
URLURL 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.

ArgumentDescription
NAMEnom de l'App et de son service
FlagTypeDéfautDescription
--imagechaîne—image du conteneur (requis)
--portliste—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
--sizechaînexxstaille : xxxs xxs xs s m l xl xxl xxxl
--replicasentier1nombre de réplicas (écrit seulement si le flag est donné)
--userchaîne—uid numérique non root, "uid" ou "uid:gid"
--envK=V—variable d'environnement ; répétable (pas de découpage sur la virgule)
--env-secretK=SECRET:CLÉ—variable tirée d'une clé de Secret ; répétable
--env-fromliste—Secret dont toutes les clés deviennent des variables ; répétable
--image-pull-secretliste—Secret docker-registry ; répétable
--egress-internetbooléenfalseautorise la sortie vers Internet
--allow-fromliste—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).

ErreurCause
--image requisflag absent
nom d'App invalide "Shop" : minuscules, chiffres et '-', 24 caractères au plusnom hors format
--ingress="x" : port attenduvaleur non numérique
--env "FOO" : forme K=V attenduepas de =
--env-secret "DB=db" : forme K=SECRET:CLÉ attenduepas 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.

ArgumentDescription
NAMEnom de l'App
FlagTypeDéfautDescription
--manifestbooléenfalseaffiche 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).

ErreurCause
shopaucune 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.

ArgumentDescription
NAMEnom de l'App
FlagTypeDéfautDescription
--servicechaînele service uniqueservice visé ; requis si l'App en a plusieurs
--imagechaîne—nouvelle image
--sizechaîne—nouvelle taille
--replicasentier—nombre de réplicas (écrit seulement si le flag est donné)
--portliste—remplace la liste des ports ; répétable
--ingress-portentier—port d'ingress ; 0 retire l'ingress
--envK=V—ajoute ou modifie une variable ; répétable
--env-secretK=SECRET:CLÉ—ajoute une variable tirée d'un Secret ; répétable
--unset-envliste—retire une variable ; répétable
--egress-internetbooléen—true ouvre, false ferme la sortie Internet (écrit seulement si donné)
--allow-fromliste—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
ErreurCause
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
shopApp inconnue

sng app scale​

sng app scale NAME REPLICAS [--service SERVICE]

Fixe le nombre de réplicas d'un service deployment.

ArgumentDescription
NAMEnom de l'App
REPLICASentier de 0 à 100 ; 0 arrête les instances sans supprimer le service
FlagTypeDéfautDescription
--servicechaînele service uniqueservice visé
sng app scale web 2
sng app scale shop 3 --service api
App "shop" : 3 réplica(s) demandé(s)
ErreurCause
REPLICAS "abc" : entier positif attenduargument non numérique ou négatif
replicas 150 hors de 0-100hors 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 replicasservice avec autoscale
un service avec volume tourne en un seul exemplaireREPLICAS > 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.

ArgumentDescription
NAMEnom de l'App
FlagTypeDéfautDescription
--servicechaînetous les deploymentsservice visé
sng app restart shop
sng app restart shop --service api
App "shop" : redémarrage demandé
ErreurCause
restart ne s'applique qu'à un deployment (kind job)--service sur un job ou un cronjob
aucun deployment à redémarrerl'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).

ArgumentDescription
NAMEnom de l'App
FlagTypeDéfautDescription
--servicechaînetousne lire que les instances de ce service
--tailentier200dernières lignes par conteneur ; plafonné à 5000
--sincedurée—ne lire que depuis cette durée (10m, 2h) ; plafonnée à 24h
-f, --followbooléenfalsesuit 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.

ErreurCause
shopApp inconnue
service "Api" invalidenom 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.

ArgumentDescription
NAMEnom de l'App
FlagTypeDéfautDescription
-y, --yesbooléenfalseconfirme 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.

ErreurCause
confirmation requise : relancez avec --yes ou depuis un terminal interactifentrée standard non interactive sans --yes
opération annuléeréponse autre que oui/o/yes/y
webApp inconnue

Commandes liées​

CommandeRôle
sng template gen App [NAME]écrit un manifeste App d'exemple (<name>.yml) à compléter
sng apply FICHIERapplique un manifeste App (création ou mise à jour complète)
sng validate FICHIER, sng plan FICHIERcontrôle et prévisualisation avant apply
sng kind get App NAMEmanifeste brut tel qu'enregistré
sng kind list AppApps du tenant, sans état déployé
sng kind delete App NAMEmême effet que sng app delete

Erreurs communes à toutes les commandes​

ErreurCause
tenant session required: run sng tenant use NAMEaucun 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 configuredla 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​