Helm
Référence complète du chart Helm Scrydon — une installation condensée ainsi que toutes les valeurs exposées par le chart, avec leur rôle, leur justification et leur configuration.
Voici la référence de configuration du chart Helm Scrydon. Ce document présente une installation condensée, puis les groupes de valeurs importants pour l'exploitation — ce que fait chaque clé, pourquoi la modifier et comment procéder. Si vous souhaitez simplement démarrer un cluster le plus rapidement possible, commencez par la page Localisation (On-Premise, Azure (AKS), Air-Gapped) et revenez ici pour les options.
Pour un cluster air-gapped (sans internet sortant), consultez le Déploiement Air-Gapped — le même chart est livré dans un bundle Zarf.
Fonctionnement de la configuration
Trois couches, de la priorité la plus basse à la plus haute :
- Valeurs par défaut du chart — le chart fournit des valeurs de production sensées pour tout. La liste de référence est le
values.yamldu chart lui-même (voir Inspecter le chart localement). - Votre
values.customer.yaml— le fichier que vous passez avec-f. Ne surchargez que ce dont vous avez besoin ; tout le reste hérite de la valeur par défaut. - Flags
--set— priorité maximale, utile pour injecter des secrets au moment de l'installation depuis un gestionnaire de secrets.
helm install scrydon oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> -n scrydon-platform \
-f values.customer.yaml \
--set apiTable.secrets.STARROCKS_PASSWORD="$(vault kv get -field=password kv/scrydon/starrocks)"Les secrets vivent dans votre fichier de valeurs.
values.customer.yamlethelm get values <release>reproduisent toutes les valeurs fournies par l'utilisateur. Ne placez pas ce fichier dans un dépôt de code source, ou gérez-le via Sealed Secrets / SOPS / External Secrets Operator, et restreignez le RBAC du cluster sur le Secret de la release.
Inspecter le chart localement
Le chart est un artefact OCI dans scrydonops.azurecr.io — il n'existe pas de miroir Git public. Téléchargez-le pour lire chaque template et le values.yaml par défaut complet :
helm pull oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> --untar
less scrydon/values.yaml # la valeur par défaut de référence pour chaque clé ci-dessousValider votre configuration
Le chart embarque un schéma de valeurs (values.schema.json). Il rejette les
clés inconnues ou mal orthographiées au niveau racine et dans les groupes
stricts à haut risque tels que routing, gateway, license, les namespaces,
Pod Security et NetworkPolicy. Certains blocs applicatifs — notamment les clés
imbriquées de runtimePlane dans les charts actuels — restent permissifs : la
validation du schéma est nécessaire, mais pas suffisante. Une faute comme
routing.mdoe échoue immédiatement :
Error: values don't meet the specifications of the schema(s) in the following chart(s):
scrydon:
- routing: Additional property mdoe is not allowedAvant une installation ou une mise à niveau, exécutez un contrôle préalable avec vos valeurs et votre version de Kubernetes :
# 1. Schéma + lint — détecte les clés mal orthographiées et les erreurs de structure
helm lint ./scrydon -f your-values.yaml
# 2. Rendre et valider contre votre version de Kubernetes
# (kubeconform : https://github.com/yannh/kubeconform)
helm template scrydon ./scrydon -f your-values.yaml \
| kubeconform --strict --ignore-missing-schemas \
--kubernetes-version "$(kubectl version -o json | jq -r '.serverVersion.gitVersion' | tr -d v)"
# 3. Simulation d'installation contre le cluster réel (validation côté serveur)
helm install scrydon ./scrydon -f your-values.yaml --dry-run=serverLe chart exige Kubernetes 1.28 ou ultérieur (kubeVersion: ">=1.28.0-0") — helm install refuse les clusters plus anciens avec une
erreur claire plutôt que d'échouer en cours de déploiement.
Installation rapide
Le minimum pour obtenir un cluster opérationnel. Chaque étape est développée avec des notes spécifiques à l'environnement sur les pages Localisation.
# 1. Se connecter au registre (nom d'utilisateur = nom du token ACR fourni par votre équipe)
helm registry login scrydonops.azurecr.io --username <acr-token-name>
# 2. Créer le namespace de la release + un secret d'extraction d'image dans ce namespace.
# Le chart cible par défaut scrydon-platform pour chaque service ; la séparation en
# namespaces est optionnelle via namespaces.* (créer le secret dans chaque namespace ciblé).
kubectl create namespace scrydon-platform 2>/dev/null || true
kubectl create secret docker-registry scrydon-registry --namespace scrydon-platform \
--docker-server=scrydonops.azurecr.io \
--docker-username=<acr-token-name> --docker-password=<acr-token-password># 3. values.customer.yaml — l'installation minimale complète.
global:
imageRegistry: scrydonops.azurecr.io # récupérer les images depuis l'ACR connecté
imagePullSecrets:
- scrydon-registry
storageClass: <your-storage-class> # nom de classe cloud par défaut, ou votre provisionneur on-prem
routing:
host: app.example.com # le nom d'hôte vers lequel pointe votre DNS
gateway:
tls:
enabled: true # le navigateur accède à Scrydon via HTTPS — voir Gateway ci-dessous
infra:
db:
credentials:
password: REPLACE-WITH-DB-PASSWORD # openssl rand -hex 16
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET # openssl rand -hex 32
apiTable:
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PW # openssl rand -hex 24# 4. Installer
helm install scrydon oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> --namespace scrydon-platform \
-f values.customer.yaml --waitLancer l'assistant de configuration
Ouvrez https://app.example.com/platform/setup (ou /setup si vous avez monté platform à la racine). Cinq étapes :
| # | Étape | Ce qu'elle fait |
|---|---|---|
| 1 | Licence | Collez ou déposez le bundle JSON { jwt, publicKey }. L'assistant vérifie la signature JWT par rapport à la clé publique incluse, contrôle l'expiration et affiche le niveau / CPU / RAM / VRAM. Stocké dans platform_config à l'étape suivante. Le format du bundle est affiché dans le Vérificateur de licence. Les fichiers .jwt seuls sont rejetés — la clé publique doit accompagner le JWT. |
| 2 | Compte administrateur | Créez le premier administrateur (e-mail + mot de passe). À la validation, la licence est persistée et l'utilisateur administrateur créé. |
| 3 | Organisation | Nommez votre organisation — le tenant racine. |
| 4 | Configurez la livraison (Resend, SendGrid, SMTP, ou ignorer — configurable ultérieurement sous Paramètres → Plateforme → E-mail). Sans fournisseur réel, les nouvelles inscriptions ignorent la vérification par e-mail ; une fois un fournisseur configuré, elles reçoivent un OTP. | |
| 5 | Terminer | Marque setup_completed = true et redirige vers l'accueil de la plateforme. |
Pré-injecter la licence
Évitez l'étape licence de l'assistant en injectant le bundle lors de la première installation. Les valeurs sont lues une seule fois pour initialiser la base de données ; ensuite la licence vit dans platform_config et est gérée depuis l'interface :
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET
LICENSE: | # le champ `jwt` du bundle (une ligne)
eyJhbGciOiJSUzI1NiIs...
LICENSE_PUBLIC_KEY: | # le champ `publicKey` du bundle (PEM)
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFA...
-----END PUBLIC KEY-----Lorsque les deux valeurs sont définies, l'étape Licence de l'assistant s'ouvre déjà vérifiée.
Référence de configuration
Chaque groupe ci-dessous correspond à une clé de premier niveau dans le values.yaml du chart, dans l'ordre du fichier. Les valeurs par défaut indiquées sont celles du chart ; ne surchargez que ce dont vous avez besoin.
global — registre, images, stockage
Paramètres à l'échelle du cluster, hérités par chaque service.
| Clé | Défaut | Rôle / justification |
|---|---|---|
global.imageRegistry | "" | Racine du registre d'images de conteneurs (ex. scrydonops.azurecr.io, un Harbor interne, un host:port de homelab). Vide génère des références non préfixées scrydon/<name>:<tag>. À définir par environnement. |
global.imagePullSecrets | [] | Noms des secrets d'extraction ajoutés à chaque pod. Indiquer le secret créé à l'étape 2. |
global.imagePullPolicy | Always | Politique standard de récupération Kubernetes. |
global.storageClass | "" | Le provisionneur pour chaque PVC. Pas de valeur cloud par défaut — définir la classe de votre cloud (managed-csi, gp3, standard-rwo) ou votre provisionneur on-prem (ceph-rbd, vsphere-csi, local-path). |
global.nfs.enabled | false | Utiliser des PV statiques NFS à la place du provisionnement dynamique. Pour les clusters homelab / NFS — définir aussi server + basePath. |
global.scheduling.spreadAcrossNodes | true | Attacher une anti-affinité de pods souple à chaque charge de travail durable (les applications et le socle infra gourmand en mémoire : Postgres, StarRocks, SeaweedFS, Valkey) afin qu'elles préfèrent des nœuds distincts. Sans cela, l'ordonnanceur peut empiler plusieurs pods de plusieurs Gio sur un même nœud, que le kubelet évince ensuite sous pression mémoire. « Souple » signifie que l'ordonnancement n'est jamais bloqué : les clusters mono-nœud et de petite taille démarrent donc normalement — à laisser activé. Passer à false uniquement pour regrouper délibérément sur un seul nœud. |
global.azure.enabled | false | Mode Azure Marketplace : les images sont résolues depuis MCR via global.azure.images.* et les composants tiers du data-plane (StarRocks/SeaweedFS) sont désactivés automatiquement. Défini par le package Marketplace, pas manuellement. |
global:
imageRegistry: scrydonops.azurecr.io
imagePullSecrets:
- name: scrydon-registry
storageClass: managed-csinamespaces — placement des charges de travail
Chaque service cible par défaut scrydon-platform. Surchargez par service pour un isolement multi-namespace ; le chart aligne automatiquement les politiques ACL Dapr et le RBAC de lecture des secrets.
namespaces:
infra: scrydon-infra
platform: scrydon-platform
agentic: scrydon-agentic
analytics: scrydon-platform
cortex: scrydon-platformgateway — exposition et schéma TLS
La périphérie repose sur la Gateway API de Kubernetes (Gateway + HTTPRoute), et non
sur Ingress. Ingress est gelée : elle reste GA, conserve ses garanties de stabilité et
Kubernetes ne prévoit pas de la supprimer — mais elle ne reçoit plus aucun développement, et
Kubernetes recommande la Gateway API à sa place. Le chart suit cette recommandation.
Le chart génère une Gateway nommée gateway-frontdoor dans l'espace de noms de la
plateforme, et une HTTPRoute par application activée dans l'espace de noms de cette
application, rattachée à l'unique Gateway par-delà les espaces de noms.
La Gateway API n'est pas présente dans un cluster standard. Avant l'installation, le cluster
a besoin des CRD gateway.networking.k8s.io et d'une GatewayClass dont le nom correspond
à gateway.className. Définissez traefik.enabled: true pour que le chart installe une
release Traefik qui fournit les deux, ou pointez gateway.className vers une classe déjà
exploitée par votre équipe plateforme. Voir Prérequis Kubernetes.
| Clé | Défaut | Rôle / justification |
|---|---|---|
gateway.enabled | true | Générer la Gateway et ses HTTPRoutes. Désactivez si vous placez votre propre périphérie devant le cluster. |
gateway.className | traefik | Le nom de la GatewayClass (et non d'une IngressClass). N'importe quelle implémentation conforme achemine le trafic du chart ; le seul contrôle non portable est gateway.publicAuthRateLimit ci-dessous. |
gateway.listenerPorts.http | 8000 | Le port sur lequel votre contrôleur écoute, et non le port public — voir Ports des listeners. |
gateway.listenerPorts.https | 8443 | Idem, pour le listener HTTPS. |
gateway.tls.enabled | true | Critique. Signifie « Scrydon est-il accessible via HTTPS par le navigateur ? » — pilote le schéma des URL publiques, les origines CORS, les cookies sécurisés et l'origine de callback Better-Auth, et décide si un listener HTTPS et la route de redirection sont générés. Par défaut true (sécurisé par défaut), y compris derrière un équilibreur de charge qui termine le TLS (App Gateway / ALB) et transmet du HTTP brut à Traefik — le navigateur reste en HTTPS, donc laisser true. Mettre à false uniquement pour les déploiements HTTP seul (dev local / smoke kind). Mettre false sur une installation frontée HTTPS casse silencieusement la connexion (Mixed Content + origine de callback incompatible). |
gateway.tls.existingSecret | "" | Apporter votre propre certificat au lieu des noms tls-frontdoor / tls-<app> du chart. Obligatoire pour les installations air-gap et on-prem avec un certificat d'AC d'entreprise. Un seul Secret, un seul espace de noms : la Gateway possède tous les listeners, le Secret n'est donc lu que depuis l'espace de noms de la plateforme — même en installation répartie. |
gateway.tls.certManager.enabled | true | Ajouter cert-manager.io/cluster-issuer sur la Gateway (une seule annotation pour toute la porte d'entrée ; cert-manager regroupe les listeners par Secret de certificat). Nécessite la prise en charge Gateway API de cert-manager — config.enableGatewayAPI=true, voir Prérequis TLS. Définir false lorsque vous fournissez vous-même le certificat et que cert-manager est installé. |
gateway.tls.clusterIssuer | letsencrypt-prod | Émetteur utilisé lorsque certManager.enabled est activé. |
gateway.publicAuthRateLimit.enabled | false | Limitation de débit grossière en périphérie publique sur la règle routing.paths.apiAuth, appliquée avant que la requête n'atteigne api-platform et distincte des limites par endpoint de Better Auth. Traefik uniquement — la limitation de débit ne fait pas partie du canal standard de la Gateway API, elle est donc attachée comme Middleware Traefik via un filtre ExtensionRef et le rendu échoue si gateway.className vaut autre chose que traefik. |
gateway.publicAuthRateLimit.average / .period / .burst | 10 / 1m / 10 | Le seau lui-même. |
gateway.annotations | {} | Annotations fusionnées sur la Gateway. Le point d'accroche des réglages propres à l'implémentation (ajustements d'équilibreur cloud, références de frontend). Les routes n'en ont besoin d'aucune. |
traefik.enabled | false | Installer Traefik comme dépendance intégrée du chart, avec le provider Gateway activé, sa propre Gateway par défaut désactivée et la GatewayClass traefik publiée. Désactivé par défaut : un cluster disposant déjà d'une implémentation conforme doit la conserver et se contenter de définir gateway.className. |
Trois contrôles qui étaient auparavant des annotations propres au contrôleur relèvent désormais du cœur de la Gateway API et sont générés sans condition ; ils existent donc sur toute implémentation conforme et non plus seulement sur Traefik :
- Le retrait des en-têtes Dapr / on-behalf-of. Chaque règle de route porte un filtre
RequestHeaderModifierqui supprimedapr-caller-app-id,dapr-api-token,x-scrydon-self-call, les en-têtes d'identitéx-on-behalf-of-*etx-scrydon-storage-scopedes requêtes externes. Il n'y a plus ni branche par classe ni mode pouvant silencieusement ne rien produire :ingress.stripDaprHeaders.*— et l'avertissement d'installation qui l'accompagnait — disparaît sans remplacement. - La redirection HTTP → HTTPS. Un filtre
RequestRedirectsur le listener HTTP, généré dès quegateway.tls.enabledest actif.ingress.middleware.forceHttps.*disparaît sans remplacement. - La précédence des chemins. La spécification impose le préfixe correspondant le plus long
d'abord, sur toutes les routes d'un listener : l'ordre de déclaration n'a donc plus
d'importance et la règle racine
/est simplement la moins prioritaire.
Ports des listeners : 8000 / 8443, et non 80 / 443
gateway.listenerPorts.* est le port sur lequel votre contrôleur écoute, pas celui auquel
vos utilisateurs se connectent. C'est la seule valeur propre à l'implémentation dans toute la
périphérie.
Traefik associe un listener de Gateway à l'un de ses entryPoints par le port, et ces
entryPoints écoutent sur :8000 (web) et :8443 (websecure) dans le conteneur tandis que son
Service publie 80/443. Un listener déclaré sur le port 80 est rejeté d'emblée (vérifié sur
Traefik v3.6.10, le 2026-09-12) :
Accepted=False reason=PortUnavailable
"Cannot find entryPoint for Gateway: no matching entryPoint for port 80 and protocol HTTP"Une implémentation managée qui écoute sur le port public — Application Gateway for
Containers, un ALB cloud — attend au contraire 80 / 443 ici :
gateway:
className: <votre-gatewayclass>
listenerPorts:
http: 80
https: 443Autres implémentations Gateway API
Définissez gateway.className sur votre GatewayClass et le routage fonctionne sans
changement : le chart n'émet que des ressources Gateway et HTTPRoute du cœur de la
spécification, sans aucune annotation de contrôleur sur les routes. Deux points à vérifier
avant de changer :
| Contrôle | Portable ? |
|---|---|
Retrait des en-têtes Dapr / on-behalf-of (RequestHeaderModifier) | Cœur. Fonctionne sur toute implémentation conforme. |
Redirection HTTP → HTTPS (RequestRedirect) | Cœur. |
| Précédence des chemins (préfixe le plus long) | Cœur, imposé par la spécification. |
Terminaison TLS via les certificateRefs du listener | Cœur. |
gateway.listenerPorts.* | Propre à l'implémentation — voir Ports des listeners. |
gateway.publicAuthRateLimit | Traefik uniquement. Attaché comme Middleware Traefik via un filtre ExtensionRef ; le rendu échoue sur toute autre classe. Laissez la valeur à false et appliquez la limite sur votre propre périphérie. |
Tout ce que le chart n'exprime pas — limites de taille de corps de requête, délais de lecture,
comportement d'inactivité WebSocket sur la route routing.paths.agenticRealtime — se configure
sur votre implémentation elle-même et non via ce chart ; gateway.annotations est le seul point
d'accroche d'annotations et il s'applique à la Gateway, pas aux routes. Dimensionnez la limite
de taille de corps au moins à hauteur du plafond d'upload de 100 Mo de la plateforme.
Une remarque portable : les implémentations dont la sonde de santé du backend vise / par
défaut reçoivent une chaîne de redirections des applications SSR. Pointez la sonde vers le
/api/healthz de chaque application, avec le mécanisme de health check fourni par votre
implémentation.
ingress-nginx est retiré — le projet a été archivé le 2026-03-24 et ne publie plus
aucune version, correction de bug ou correctif de sécurité. Ne l'installez pas, et ne pointez
pas gateway.className vers une classe Ingress nginx : le chart ne génère plus du tout
d'objets Ingress.
routing — sous-chemin vs sous-domaine
Choisit comment les applications sont exposées. Discussion complète : Modes de routage.
| Clé | Défaut | Rôle / justification |
|---|---|---|
routing.mode | subpath | subpath place toutes les applications sous un même nom d'hôte avec un préfixe de chemin (un enregistrement DNS, un certificat — recommandé pour l'auto-hébergement). subdomain place chaque application sur son propre nom d'hôte (DNS wildcard + certificat — utilisé par notre SaaS). |
routing.host | — | Le nom d'hôte unique vers lequel pointe votre DNS, ex. app.example.com. |
routing.paths.* | /cortex, /agentic, … | Préfixes de chemin par application en mode sous-chemin. Mettre une valeur à "" pour monter cette application à la racine. Les applications consomment le préfixe résolu via BASE_PATH. |
routing.annotations a disparu. Cette clé n'existait que parce qu'une installation en
sous-chemin comportait exactement un Ingress et aucun autre moyen de l'annoter ; les deux modes
de routage génèrent désormais une seule Gateway, et gateway.annotations est cet endroit —
voir Autres implémentations Gateway API.
routing:
mode: subpath
host: app.example.com
paths:
cortex: /scrydon/cortex # personnaliser les préfixes si nécessaire
platform: /scrydon/platformdapr — maillage de services et identité
Les appels de service à service utilisent Dapr avec mTLS ; les politiques ACL du chart sont basées sur le domaine de confiance SPIFFE.
| Clé | Défaut | Rôle / justification |
|---|---|---|
dapr.enabled | true | Injection de sidecar + composants crypto + comptes de service. |
dapr.installControlPlane | true | Installer le plan de contrôle Dapr comme sous-chart dans le namespace de la release. Mettre false si Dapr est déjà installé à l'échelle du cluster. |
dapr.controlPlaneNamespace | "" | Quand installControlPlane: false et que Dapr est ailleurs (ex. dapr-system), pointer le binding de lecture des secrets du chart sur ce namespace. |
dapr.trustDomain | scrydon | Domaine de confiance SPIFFE. Toutes les ACL générées en dépendent. Ne surchargez que pour correspondre à un CA Dapr existant — mais cela désactive l'isolation d'identité inter-clusters. |
dapr.global.tag | 1.18.1 | Tag d'image du plan de contrôle Dapr + sidecar, synchronisé avec la dépendance de Chart.yaml. Utilisez cette version testée avec un plan de contrôle externe. |
dapr.crypto.masterKey | "" | Clé maître AES-256. Générée automatiquement à la première installation et préservée lors des mises à jour. BYO : openssl rand -base64 32. |
dapr.secretStore.enabled | true | Créer le composant Dapr SecretStore adossé aux secrets Kubernetes. |
Apporter votre propre Dapr requiert la version testée 1.18.1, le domaine de confiance
scrydonsurdapr-sentry(ou faire correspondre viadapr.trustDomain) et un injecteur de sidecar opérationnel. Voir Installations Dapr existantes.
Base de données — Postgres intégré ou BYO
infra.db contrôle le Postgres intégré (pgvector). Pour une instance externe/managée, la recette complète — notes par fournisseur, clés infra.db.external.*, pré-création des bases — est sur BYO Database.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.db.enabled | true | Exécuter le Postgres intégré dans le cluster. Mettre false pour utiliser une instance managée via infra.db.external.*. |
infra.db.credentials.password | postgres | À modifier. openssl rand -hex 16. |
infra.db.storage.size | 5Gi | Taille du PVC pour la base intégrée. |
infra.db.postgres.maxConnections | 250 | max_connections pour Postgres intégré. Gardez cette valeur au-dessus de la somme des pools applicatifs générés, avec une marge pour les migrations et l'administration. |
infra.db.resources.limits.memory | 4Gi | Plafond mémoire du Postgres intégré, dimensionné pour maxConnections: 250 (requête 2Gi). Le réduire sans abaisser aussi le plafond de connexions expose le postmaster à un arrêt OOM par le noyau sous charge. |
infra.db.tls.enabled | true | TLS intra-cluster (certificat auto-signé automatique, ISO 27001 A.8.24). Laisser activé pour la base intégrée ; les utilisateurs Postgres managé désactivent et utilisent le TLS du fournisseur. |
infra.db.backup.enabled | false | CronJob pg_dump optionnel (A.8.13). Définir schedule, retentionDays, databases. Les utilisateurs Postgres managé utilisent la sauvegarde du fournisseur. |
infra.db.external.existingSecrets.* | "" | Mode BYO A (recommandé) — noms de Secrets par application contenant DATABASE_URL (auth/agentic), DATABASE_URL_ANALYTICS, etc. |
infra.db.external.<app>Url | "" | Mode BYO B — DSN applicatifs en ligne (apparaissent dans helm get values). sslMode ajouté comme ?sslmode=. |
infra.db.external.lakekeeperUrl | "" | DSN Postgres de Lakekeeper. Requis lorsque infra.db.enabled=false et que Lakekeeper est activé ; utilisé pour les connexions en lecture et en écriture et stocké dans secrets-lakekeeper. |
# Intégré (défaut) — définir juste un mot de passe fort :
infra:
db:
credentials:
password: REPLACE-WITH-DB-PASSWORD
# Postgres managé BYO :
infra:
db:
enabled: false
external:
existingSecrets:
auth: scrydon-auth-db
agentic: scrydon-agentic-db
lakekeeperUrl: "postgres://scrydon:REDACTED@pg.example.com:5432/lakekeeper"
sslMode: requireStarRocks — Tables managées (OLAP)
Pod unique allin1-ubuntu. Alimente l'interface Tables et le fallback d'inférence de schéma agentique. Associé à apiTable.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.starrocks.enabled | true | Exécuter StarRocks intégré. Mettre false (avec apiTable.enabled: false, ou pointer apiTable.starrocks.host vers un cluster externe) pour l'ignorer. Désactivé automatiquement en mode Azure. |
infra.starrocks.storage.size | 20Gi | Taille du PVC. |
infra.starrocks.resources | 2–8Gi / 0.5–2 CPU | Le composant data-plane intégré le plus lourd — voir Réduction. |
L'image intégrée livre root sans mot de passe. Définissez apiTable.secrets.STARROCKS_PASSWORD dans les valeurs, puis appliquez-le dans StarRocks après l'installation — voir Identifiants StarRocks. Pour une production multi-AZ, passez à l'starrocks-kubernetes-operator (séparation FE/BE) et pointez apiTable.starrocks.host vers son Service FE.
SeaweedFS — stockage objet
Stockage compatible S3 en pod unique pour les téléversements.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.seaweedfs.enabled | true | Exécuter le stockage intégré. Désactivez si vous placez un S3 managé devant la plateforme (AWS S3, Azure Blob via API S3, GCS, MinIO) configuré sous https://<host>/settings/platform/storage. Désactivé automatiquement en mode Azure. |
infra.seaweedfs.s3.existingSecret | "" | Vide → le chart gère des clés d'accès/secret aléatoires (préservées lors des mises à jour, conservées à la désinstallation). Indiquer un Secret pré-créé avec accessKey/secretKey pour BYO. |
infra.seaweedfs.storage.size | 20Gi | Taille du PVC. |
Services applicatifs
Les applications produit — auth (api-platform), platform, cortex, analytics, apiOntology, apiTable, agentic (app + realtime). Chaque bloc partage une forme commune :
| Clé (par application) | Rôle / justification |
|---|---|
<app>.enabled | Générer l'application. La plupart restent activées ; analytics.enabled: false supprime l'interface analytique + marimo (charge de travail optionnelle la plus lourde). |
<app>.replicas | Échelle horizontale. |
<app>.image.tag | Par défaut Chart.AppVersion — laisser vide pour suivre le chart. |
<app>.resources | Requêtes/limites. Les valeurs par défaut sont ajustées d'après les incidents OOM en production (limite agentic : 4Gi, applications SSR : 2Gi) ; ne réduire que sur des clusters d'évaluation. |
<app>.databasePool.max | Limite de pool postgres-js par pod, rendue comme la variable d'environnement générique DATABASE_POOL_MAX. Chaque pool du pod la respecte ; les pods multi-bases (auth, platform, apiTable) ajoutent des clés spécifiques (authMax, agenticMax) rendues comme les surcharges AUTH_DATABASE_POOL_MAX / AGENTIC_DATABASE_POOL_MAX — platform ouvre directement la base auth, donc elle définit authMax en plus de max. Réduisez-les pour les petits tiers Postgres managés ; augmentez-les seulement si max_connections dispose de la marge correspondante. |
<app>.gateway.{enabled,hostname} | Nom d'hôte par application (mode sous-domaine uniquement — ignoré en sous-chemin). Les annotations et blocs TLS par application ont disparu : une seule Gateway possède tous les listeners, et les noms de Secret par application conservent leurs valeurs par défaut tls-<app>. |
<app>.corsOrigins | Origines navigateur autorisées. |
<app>.secrets | Secrets par application (voir ci-dessous). |
<app>.dapr.appApiToken | Token sidecar-vers-application par application, unique par application. Vide → généré automatiquement et préservé lors des mises à jour. BYO : openssl rand -base64 32. |
Clés notables spécifiques aux applications :
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET # signature de session — openssl rand -hex 32
auditLog:
enabled: true # transfert SIEM + crons de rétention (ADR 2026-04-16)
chain:
enabled: false # chaîne de hachage infalsifiable — optionnel, coût de signature
analytics:
marimoDocument:
enabled: true # rendu privé de documents sans calcul
marimoRuntime:
startupDeadlineMs: 300000 # délai de préparation Connect/Run
secrets:
MARIMO_RUNTIME_HMAC_SECRET: "" # vide → généré et réutilisé entre les mises à niveau
apiTable:
starrocks:
host: "" # vide → Service FE intégré ; indiquer pour StarRocks externe
user: root
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PW
agentic:
realtime:
gateway:
hostname: ws-agentic.example.com # mode sous-domaine uniquement
passkey:
rpId: app.example.com # DOIT correspondre à routing.host sinon l'enregistrement passkey échoue
origin: https://app.example.comLes annotations de cookie sticky du temps réel ont disparu. Elles ne s'appliquaient qu'en mode sous-domaine, et l'affinité de session pour les backends Gateway API ne fait pas partie du canal standard —
agentic-realtimen'a donc aucune affinité si vous l'exécutez avec plus d'un réplica en mode sous-domaine. Il est livré avecreplicas: 1.
auth.secrets.SERVICE_ADMIN_TOKENest déprécié — la production utilise Dapr mTLS (SPIFFE). Ne le définir que pour le développement local sans sidecars. Quand les clés avec underscore sont interdites (paramètres protégés Azure Marketplace), utiliserauth.authSecretà la place deauth.secrets.AUTH_SECRET.
executionFabric et runtimePlane
Le plan d'exécution est opt-in jusqu'à qualification de Kata/KVM et des contrôles réseau.
Il possède les pods Agent éphémères, les sessions Marimo de longue durée protégées par
génération et les jobs de notebooks neufs à usage unique. L'ouverture d'un notebook utilise
toujours le moteur de rendu sans calcul ; Connect, Run hors connexion et les jobs refusent si
le plan est indisponible. Aucun workload ne revient à une exécution dans le processus ou dans
un service produit. Les backends déployés et leur disponibilité authentifiée par profil
déterminent les niveaux disponibles. Le résolveur essaie toujours microvm d'abord, puis
managed_process uniquement si l'organisation l'autorise. L'hôte d'acteur géré est généré
par défaut (niveau normal) ; l'activation d'un Runtime Plane qualifié ajoute le niveau
isolé sans autre liste ni préférence. Un administrateur d'organisation active Exiger l'exécution isolée dans
Paramètres → Plateforme → Compute pour imposer la microVM comme plancher strict : les
exécutions de cette organisation refusent alors au lieu d'utiliser le niveau processus géré.
Une exécution liée ne descend jamais de niveau après son démarrage.
Le chart refuse de générer si aucun backend d'exécution n'est déployé. Cette
combinaison s'installait silencieusement et toute exécution échouait ensuite à l'exécution
avec « No permitted … execution tier is currently ready » ; elle échoue désormais dès
helm install en nommant le chemin de valeurs à corriger. Une posture de production stricte
qui veut uniquement la microVM définit explicitement managedProcess.enabled: false —
voir values.production.example.yaml.
Le niveau géré utilise un unique Deployment et une unique image d'hôte d'acteur Dapr. Dapr gère le placement et le routage horizontal ; chaque invocation reçoit un nouveau processus enfant et un espace de travail, tout en réutilisant les mêmes runners Agent, implémentation et notebook. Ce niveau partage le noyau du pod et reste explicitement plus faible qu'une microVM.
Les Agents standard utilisent toujours AgentCapabilityContract avec le
protocole fixe agent-capability-contract. Aucun mode de broker d'outils
d'intégration n'est à activer pendant une installation ou une mise à niveau,
et aucune valeur opérateur ne sélectionne une autre architecture Agent. Le
chart épingle le protocole nommé dans Runtime Plane ; une image runner
incompatible est refusée avant la création d'un workload Agent.
Le chart réplique vos global.imagePullSecrets du namespace de la release vers les deux namespaces runtime au moment de l'installation/mise à niveau, donc les registres privés fonctionnent sans étape supplémentaire. (Les pipelines helm template puis apply n'ont pas de cluster à lire — pré-créez les secrets de pull dans les deux namespaces runtime dans ce mode de travail.)
| Clé | Défaut | Rôle / justification |
|---|---|---|
executionFabric.managedProcess.enabled | true | Déploie l'unique hôte d'acteur Dapr générique (niveau normal). Effectif seulement si dapr, agentic et agentic.app.dapr.workflows sont activés (son actor state store). Désactivez-le pour un déploiement physiquement microVM-only. |
executionFabric.managedProcess.replicas | 2 | Réplicas fixes quand HPA est désactivé ; Dapr répartit les acteurs d'exécution. |
executionFabric.managedProcess.enabledProfiles | trois profils | Profils fixes agent_turn, implementation et notebook, dans la même application et image. |
executionFabric.managedProcess.maxConcurrentInvocations | 4 | Nombre maximal d'arbres de processus frais supervisés simultanément par réplique. La saturation produit une erreur de capacité typée ; Dapr et le HPA assurent la mise à l'échelle horizontale. |
executionFabric.managedProcess.autoscaling.* | désactivé, 2–10 réplicas | HPA CPU facultatif de l'hôte générique. |
runtimePlane.enabled | false | Déploie le backend microvm après qualification. Le contrôleur découvre lui-même la RuntimeClass et les nœuds compatibles. Marimo interactif l'exige ; Agent, implémentation et jobs notebook peuvent utiliser managed_process uniquement si la politique d'organisation l'autorise. |
runtimePlane.namespace | scrydon-runtimes | Namespace du contrôleur. Il doit différer du namespace des charges non fiables. |
runtimePlane.workloadNamespace | scrydon-runtime-workloads | Namespace des charges non fiables. Le RBAC du contrôleur y gère les pods exec et les pods/Services/NetworkPolicies Marimo possédés. Les deux ServiceAccounts de workload ne reçoivent aucun jeton API. |
runtimePlane.replicas | 1 | Topologie à contrôleur unique imposée ; les mises à jour Recreate préservent la propriété exclusive du PVC. |
runtimePlane.persistence.* | 1Gi, classe du cluster | Stockage durable obligatoire des revendications et résultats. Un stockage corrompu ou non inscriptible bloque le démarrage ou la répartition. |
runtimePlane.dapr.enabled | true | Le chemin de contrôle authentifié du plan. Désactiver cette valeur ou dapr.enabled global désactive le plan en échec fermé (rien n'est généré ; les tours Agent refusent avec une erreur typée). |
runtimePlane.image.* | version applicative de la release | Image du contrôleur. Épinglez le tag publié ; n'utilisez pas latest. |
runtimePlane.runnerImage | vide | Vide résout scrydon/bundle-runner à la version applicative du chart (même registre que chaque image d'application). Si défini, la valeur doit être un tag ou un digest épinglé — les profils production épinglent registry/repo@sha256:<digest> ; le schéma rejette latest. |
runtimePlane.enforcerImage | vide | Vide résout scrydon/egress-enforcer à la version applicative du chart. Si défini, épinglez le digest examiné ; le schéma rejette latest. |
runtimePlane.marimoRuntimeImage | vide | Le profil Marimo immuable du contrôleur exige une référence par digest sha256 (registry/repo@sha256:<digest>) — une valeur par tag seul (y compris le tag par défaut de la version applicative) fait refuser le démarrage du contrôleur (Marimo runtime image must be pinned by sha256 digest). Toujours définir le digest quand runtimePlane.enabled: true. |
runtimePlane.marimo.* | TTL d'inactivité de 30 minutes, cull de 30 secondes, délai de provisioning de 180 secondes | Borne l'inactivité du runtime interactif, le polling de nettoyage et le provisioning du contrôleur. Analytics possède un délai de préparation de bout en bout distinct. |
runtimePlane.blockedCidrs | plages RFC1918 | Plancher réseau du déploiement inclus dans chaque instantané de sortie des workloads isolés. Configurez les CIDR des pods/services, les plages de métadonnées et les réseaux de contrôle privés ; la politique d'organisation ne peut pas les retirer. |
runtimePlane.upstreamDns | 10.0.0.10:53 | Adresse réelle de kube-dns/CoreDNS. Une valeur erronée casse toute sortie par nom d'hôte. |
runtimePlane.execution.maxConcurrentPerTenant | 8 | Nombre maximal d'exécutions en attente/en cours pour un locataire avant une réponse HTTP 429 typée. |
runtimePlane.execution.maxConcurrentGlobal | 128 | Plafond global de surcharge du contrôleur unique ; doit être supérieur ou égal au plafond par locataire. |
runtimePlane.isolation.microvm.renderRuntimeClass | false | Génère un RuntimeClass Kata autogéré. Laissez false sur AKS Pod Sandboxing, où AKS en est propriétaire. La disponibilité microVM est inférée d'une découverte RuntimeClass réussie et d'un nœud Ready, non cordonné et compatible. |
networkPolicies.enabled | false | Génère les NetworkPolicies du contrôleur et des charges non fiables. Définissez true avec un CNI qui les applique ; sinon la frontière réseau Kubernetes est absente. |
Les deux niveaux produit sont microvm et managed_process. Les anciens champs du protocole
Runtime Plane (require_true_vm, fallback, mediated, hardened) ne sont plus des contrôles
Helm ou d'organisation. Après sélection de microvm, l'adaptateur envoie une valeur interne
fixe uniquement pour la compatibilité des mises à niveau.
networkPolicies:
enabled: true
executionFabric:
managedProcess:
enabled: true
runtimePlane:
enabled: true
namespace: scrydon-runtimes
workloadNamespace: scrydon-runtime-workloads
persistence:
size: 1Gi
runnerImage: registry.example.com/scrydon/bundle-runner@sha256:<digest>
enforcerImage: registry.example.com/scrydon/egress-enforcer@sha256:<digest>
marimoRuntimeImage: registry.example.com/scrydon/marimo-runtime@sha256:<digest>
blockedCidrs:
- "10.0.0.0/8" # remplacer/étendre avec les CIDR réels des pods et services
- "172.16.0.0/12"
- "192.168.0.0/16"
upstreamDns: "10.0.0.10:53"
isolation:
microvm:
renderRuntimeClass: false # AKS possède kata-vm-isolationLe Deployment du contrôleur et les deux identités de workload consomment
global.imagePullSecrets. Les pods Agent/job de notebook à usage unique utilisent
sa-runtime-exec ; les pods Marimo interactifs utilisent sa-runtime-workload. Les deux
définissent automountServiceAccountToken: false : le code non fiable ne reçoit aucun jeton
d'API Kubernetes, tandis que kubelet peut toujours utiliser l'identifiant de registre
configuré. Ne modifiez pas le ServiceAccount default du namespace. Si le registre exige un
secret d'extraction, créez le Secret portant le même nom dans runtimePlane.namespace,
runtimePlane.workloadNamespace et chaque namespace applicatif activé avant l'installation,
ou fournissez un accès au registre équivalent au niveau des nœuds.
L'enforcer s'exécute avec l'UID 0 et uniquement NET_ADMIN/NET_BIND_SERVICE ; l'application non fiable reste sans root et abandonne toutes les capacités. Un profil Pod Security restricted global rejette l'enforcer. Configurez une exception examinée pour le namespace runtime et validez les pods rendus avec kubectl apply --dry-run=server. Ne désactivez pas l'admission à l'échelle du cluster.
networkPolicies.enabled: true est requis pour la frontière d'entrée entre contrôleur et charges générée par le chart, et ne fonctionne qu'avec un CNI qui applique Kubernetes NetworkPolicy. Une politique rendue sur un CNI qui ne l'applique pas n'est pas un contrôle de sécurité ; prouvez son enforcement pendant la validation du déploiement.
Après le déploiement, vérifiez le rapport de capacités au démarrage et prouvez séparément le niveau choisi pour les profils Agent exec, Marimo interactif et job de notebook. Prouvez également que l'ouverture d'un notebook ne crée aucun runtime, que Connect n'exécute aucune cellule et que Run hors connexion exécute une seule fois la cellule sélectionnée. Un contrôleur Ready ne prouve pas à lui seul Kata, l'extraction des images, les callbacks, le DNS, l'installation des dépendances, le nettoyage ou l'enforcement de sortie.
Valkey managé partagé — événements, cache de modèles et limites Agentic
Le chart fournit un backbone d'événements durable, un cache de découverte de modèles et des limites durables pour les webhooks et formulaires Agentic. Ces fonctions partagent une seule instance Valkey persistante ; le limiteur ne déploie pas une seconde base de données.
| Clé | Défaut | Rôle / justification |
|---|---|---|
eventBackbone.enabled | true | Backbone d'événements durable de la plateforme. |
eventBackbone.broker.managedValkey | true | StatefulSet Valkey persistant fourni par le chart. |
eventBackbone.valkey.password | "" | Généré lors d'une nouvelle installation puis préservé depuis le Secret actif. Les rendus GitOps/hors ligne doivent le fournir explicitement. |
eventBackbone.valkey.storage.size | 2Gi | Taille du PVC Valkey. |
modelDiscoveryCache.enabled | true | Snapshots durables des modèles ; stateStore.managedValkey: true réutilise le même Valkey. |
agentic.rateLimit.stateStore.managedValkey | true | Compartiments durables et sûrs entre réplicas pour les webhooks/formulaires. Mettre à false pour un composant state.redis géré par l'opérateur. |
agentic.rateLimit.stateStore.metadata | [] | Métadonnées Dapr state.redis, obligatoires et transmises telles quelles lorsque managedValkey: false. |
Lors de la première mise à niveau qui active Valkey managé, définissez explicitement
eventBackbone.valkey.password si aucun Secret event-backbone-valkey n'existe encore.
Le chart refuse de générer un mot de passe au milieu d'une mise à niveau afin d'éviter une
rotation silencieuse. Une seule valeur couvre les événements, le cache de modèles et les
limites Agentic.
opa — point de décision d'autorisation
Chaque décision d'autorisation sur les espaces de travail, workflows et ontologies est évaluée par OPA.
| Clé | Défaut | Rôle / justification |
|---|---|---|
opa.enabled | true | Garder activé. Désactivé (et sans opa.url), ces décisions échouent en mode fermé. |
opa.url | "" | Vide → DNS du Service intra-cluster. Surcharger pour un OPA externe ou un Service non standard. |
opa.logLevel | error | Seuls debug/info/error sont valides — warn fait crashlooper le pod. |
license — posture de validation
| Clé | Défaut | Rôle / justification |
|---|---|---|
license.enabled | true | Flux de licence en ligne — contacte license.scrydon.com toutes les 24h. Les overlays air-gapped mettent false / mode: offline. |
license.mode | online | online contacte le serveur ; offline vérifie uniquement le JWT local. |
license.gracePeriod | 2592000 | Secondes de grâce en cas d'échec du contact (30 jours). |
license.diagnostics.enabled | true | Envoie la version Scrydon installée. Désactivez pour refuser les métadonnées facultatives ; la capacité contractuelle reste transmise. |
license.capacity.acceleratorResources | [] | Mappings indépendants du fournisseur entre ressources étendues et VRAM, utilisés par la mesure horaire. Requis lorsque de la VRAM sous licence est déployée. |
license.publicKeys | {} | Clés publiques supplémentaires pour la rotation de clé sans interruption. |
auth.secrets.LICENSE_PUBLIC_KEY doit être défini chaque fois que license.enabled: true pour qu'api-platform puisse vérifier les signatures JWT. Scrydon doit s'exécuter sur un cluster dédié, car la capacité inclut tous les nœuds workers planifiables. Voir Licences et Rapport de capacité de licence.
Lorsque networkPolicies.enabled=true, définissez networkPolicies.kubernetesApiEgress.enabled=true et son cidr sur la destination étroite de l'API Kubernetes observée par votre CNI, avec un masque /32. Sur AKS avec Calico, il s'agit de l'adresse prête de l'EndpointSlice kubernetes, et non du ClusterIP du Service, car la politique est évaluée après le DNAT du Service. Deux politiques sélectionnées par pod réutilisent cette destination : le RBAC limite api-platform à get/list sur les nœuds, tandis que le labeler PSS est limité à get/patch sur l'unique espace de noms de la release Helm.
packSources — distribution de packs gérée par le chart
| Clé | Défaut | Rôle / justification |
|---|---|---|
packSources.enabled | false | Initialiser les sources de packs depuis les valeurs du chart à chaque mise à jour. |
packSources.sources[] | [] | Liste d'entrées (organization, name, kind, url, …). Les lignes gérées par Helm sont en lecture seule dans l'interface. Les identifiants sont référencés par authSecretRef et provisionnés séparément. Voir Sources de packs. |
Ordonnancement des pods
Les nodeSelector, tolerations et affinity à l'échelle du chart s'appliquent à chaque Deployment, StatefulSet et Job de migration — les pods peuvent ainsi atterrir sur des nœuds dédiés ou marqués avec des teints. Les surcharges par composant ne sont pas exposées.
tolerations:
- { key: workload, operator: Equal, value: scrydon, effect: NoSchedule }
nodeSelector:
workload: scrydon
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- { key: node-role.kubernetes.io/scrydon, operator: Exists }Réduction pour les installations à ressources limitées
Les valeurs par défaut présupposent un cluster de forme production (≥ 8 vCPU / ≥ 32 Gio sur les nœuds). Sur des clusters d'évaluation (4 vCPU / 16 Gio), désactivez les composants optionnels les plus lourds :
infra:
starrocks:
enabled: false # ~2–8 Gio RAM, 20 Gio PVC — seules les Tables managées + l'inférence de schéma agentique sont affectées
apiTable:
enabled: false
analytics:
enabled: false # supprime l'interface analytique + le sidecar marimo (~2 Gio)Recettes de configuration courantes
Personnaliser les chemins de routage
Montez les applications sous des préfixes différents (ex. tout sous /scrydon/...) via routing.paths.* — voir le tableau routing ci-dessus et Modes de routage.
Installations Dapr existantes
Si le cluster exécute déjà Dapr, mettez dapr.installControlPlane: false pour que le chart ne tente pas de le gérer, et pointez dapr.controlPlaneNamespace vers l'emplacement de Dapr :
dapr:
installControlPlane: false
controlPlaneNamespace: dapr-systemVotre Dapr doit satisfaire trois prérequis, faute de quoi la connexion fonctionne mais la création de compte / les appels inter-services échouent avec PermissionDenied :
| Prérequis | Pourquoi |
|---|---|
| Dapr 1.18.1 (version épinglée et testée par le chart) | Les anciennes versions 1.17.3–1.17.6 émettaient un domaine SPIFFE incorrect ; faire correspondre la version évite la dérive du plan de contrôle. |
Domaine de confiance scrydon sur dapr-sentry (ou définir dapr.trustDomain en conséquence) | Toutes les ACL en dépendent. |
| Injecteur de sidecar opérationnel | Sans lui, les pods démarrent 1/1 (sans daprd) et l'invocation de service court-circuite. |
kubectl -n <dapr-ns> get deploy dapr-sentry \
-o jsonpath='{.spec.template.spec.containers[0].image}' # attendre sentry:1.18.1Périphérie avancée : derrière un équilibreur de charge qui termine le TLS
Les configurations App Gateway / ALB / GCP LB / F5 nécessitent un ajustement du contrôleur Traefik (trustedIPs, externalTrafficPolicy: Local, la règle de schéma public gateway.tls.enabled, périphérie privée, dépannage 502). Guide complet : TLS Offloading.
Identifiants StarRocks
Le StarRocks intégré est livré avec root sans mot de passe. Après helm install, appliquez le mot de passe défini dans apiTable.secrets.STARROCKS_PASSWORD :
NEW_PW="<your-starrocks-password>" # même valeur que apiTable.secrets.STARROCKS_PASSWORD
# StarRocks est dans le namespace de la release par défaut (namespaces.infra → scrydon-platform).
kubectl -n scrydon-platform exec -it deploy/starrocks-fe -- \
mysql -h127.0.0.1 -P9030 -uroot -e "SET PASSWORD FOR 'root' = PASSWORD('${NEW_PW}');"
kubectl -n scrydon-platform rollout restart deployment/svc-api-tableapi-table entre en CrashLoop entre l'installation et cette étape — c'est attendu ; il se stabilise après le redémarrage. Pour apporter votre propre StarRocks :
infra:
starrocks:
enabled: false
apiTable:
starrocks:
host: starrocks-fe.starrocks.svc.cluster.local
user: scrydon
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PASSWORDVérifier le déploiement
kubectl get pods -n scrydon-platform # tous Running, 2/2 avec le sidecar Dapr
kubectl get gatewayclass traefik # ACCEPTED=True
kubectl get gateway -n scrydon-platform # PROGRAMMED=True, avec une ADDRESS
kubectl get httproute -A # une par application activée, acceptée par la Gateway
kubectl get certificates -A # Certificats cert-manager READY=TrueLe cas à examiner de près est une Gateway Programmed dont les listeners ne sont pas
Accepted — kubectl describe gateway gateway-frontdoor -n scrydon-platform affiche un bloc
de conditions par listener.
Les données de licence (niveau, droits, jours avant expiration) apparaissent sous Paramètres de la plateforme → Licence après /setup. Connectez-vous sur https://app.example.com/ et passez d'une application à l'autre via le sélecteur de produit sans vous reconnecter.
Dépannage
| Symptôme | Cause / solution |
|---|---|
Pods 1/1 (pas 2/2) | L'injecteur Dapr ne tourne pas — voir Installations Dapr existantes. |
L'inscription échoue avec PermissionDenied depuis agentic | Mauvais domaine de confiance ou versions Dapr mixtes. kubectl logs deploy/agentic -n scrydon-platform -c daprd | grep spiffe (ou votre surcharge namespaces.agentic) — les ID doivent être spiffe://scrydon/..., pas spiffe://public/.... Alignez le plan de contrôle et les sidecars sur la version testée 1.18.1. |
Job de migration CrashLoopBackOff | Sur Postgres BYO, une base de données n'a pas été pré-créée — voir BYO Database → Pré-créer les bases. |
Init:ImagePullBackOff avec insufficient_scope (403) | La carte de portée de votre token ACR manque un dépôt miroir tiers (scrydon/busybox, scrydon/pgvector, scrydon/opa). Envoyez à votre équipe l'erreur exacte + le chemin du dépôt — seule la carte de portée est mise à jour, pas le token. |
| Connexion silencieusement cassée derrière un équilibreur de charge | gateway.tls.enabled laissé à false — mettre à true (voir Gateway). |
Listener de Gateway Accepted=False, reason=PortUnavailable | gateway.listenerPorts.* ne correspond à aucun entryPoint réellement écouté par votre contrôleur. Traefik écoute sur :8000/:8443 dans le conteneur alors que son Service publie 80/443 : le chart utilise donc 8000/8443 par défaut, et un listener sur le port 80 est refusé avec no matching entryPoint for port 80 and protocol HTTP. Une implémentation managée qui écoute sur le port public attend 80/443. Voir Ports des listeners. |
helm install échoue avec gateway.publicAuthRateLimit.enabled=true requires gateway.className=traefik | La limitation de débit ne fait pas partie du canal standard de la Gateway API : elle est attachée comme Middleware Traefik. Mettez la valeur à false et appliquez la limite sur votre propre périphérie, ou utilisez la classe traefik. |
kubectl get gatewayclass ne renvoie rien, ou la Gateway n'obtient jamais d'ADDRESS | Le cluster n'a aucune implémentation Gateway API. Installez-en une (traefik.enabled: true fournit les CRD et la GatewayClass traefik), ou pointez gateway.className vers la classe exploitée par votre équipe plateforme. |
L'HTTPRoute d'une application n'est pas Accepted par la Gateway | L'espace de noms de la route n'est pas dans le sélecteur allowedRoutes de la Gateway — que le chart dérive des espaces de noms des applications activées. Relancez helm upgrade après tout changement de namespaces.* pour que le sélecteur et les routes bougent ensemble. |
Opérations de jour 2
- Renouveler la licence — collez le bundle renouvelé sous Paramètres → Licence → Mettre à jour la licence ; pas de redémarrage. Licences.
- Sauvegarde & restauration — CronJob Postgres intégré (
infra.db.backup) ou votre fournisseur managé. Sauvegarde & Restauration. - Mises à jour — Mises à jour.
- Observabilité — Observabilité.