Aller au contenu

AKKO Cockpit

Aperçu

Le Cockpit AKKO est le point d'entrée unique de la plateforme : une application web monopage (SPA) React qui offre à chaque utilisateur une vue adaptée à son rôle, limitée aux couches qu'il a le droit d'utiliser. Il est servi sur demo.<domaine> derrière le SSO de la plateforme, et chaque lien de service ou page embarquée est filtré par la même source de politique que celle qui garde l'outil sous-jacent.

Le cockpit est bâti comme un ensemble d'îlots React (ADR-074, migration strangler-fig) vivant dans branding/cockpit-react/. Il remplace l'ancien portail nginx + JavaScript vanilla : il n'y a plus de proxy de santé ni de fichiers statiques index.html/app.js à éditer.

Architecture

  Navigateur ──→ Traefik (:443, hôte demo.<domaine>)
                     │  middleware ForwardAuth
             oauth2-proxy ──→ /auth-check ──→ Keycloak (SSO)
                     │  (200 = authentifié, en-têtes d'identité injectés)
             SPA React du Cockpit (nginx sert le build statique)
              ├── src/platform/catalog.ts   (couches + capacités + rôles)
              ├── src/features/<x>/          (un dossier par page)
              ├── src/session/SessionProvider  (gating canSeeCap)
              └── src/app/App.tsx            (routes hash /x/<slug>)

Le nginx du pod cockpit ne fait que servir le build statique et exposer le pont /auth-check qui convertit un 401 d'oauth2-proxy en redirection 302. Il ne relaie plus les points de santé des services : la santé par tuile est récupérée depuis le backend du cockpit, et l'accès à chaque service est appliqué par le ForwardAuth de Traefik plus le moteur de politique propre au service.

Accès

Accédez au cockpit sur https://demo.<domaine> (par exemple https://demo.akko-ai.com). L'hôte d'ingress est dérivé de global.domain via le helper akko.fqdn.cockpitReact (demo.<domaine>) et peut être surchargé avec akko-cockpit-react.ingress.host.

Filtrage adapté au rôle

Chaque couche et capacité est déclarée dans src/platform/catalog.ts avec une liste roles et un kind (integrated = une page dans la SPA, external = une UI dédiée ouverte dans un nouvel onglet). La visibilité est dérivée par canSeeCap(cap, role, toolAccess) dans src/session/SessionProvider, qui lit la même matrice d'accès aux outils que celle qui pilote la porte OPA (ADR-075). La barre latérale (src/shell/Sidebar.tsx) et la grille d'accueil (src/features/home) filtrent toutes deux leurs tuiles via canSeeCap : l'utilisateur ne voit jamais un lien vers un outil auquel il n'a pas droit. Il n'y a pas de sélecteur de rôle côté client : le rôle provient de la session SSO vérifiée.

Fonctionnalités clés

  • Accueil par couche : services groupés par couche (Calcul, Requêtage, Stockage, Analyse & restitution, IA, Gouvernance, ...), chaque tuile portant un statut de santé et un lien direct, filtré par rôle
  • Pages intégrées : fonctionnalités gouvernées rendues dans le cockpit comme routes React : ADEN (/x/aden), NORA (/x/nora), RAG (/x/rag), modèles IA (/x/litellm), supervision (/x/monitoring), audit (/x/audit), usage (/x/usage), DevHub (/x/devhub), sources (/x/sources), rôles data (/x/data-roles), rôles plateforme (/admin/platform-roles)
  • Bilingue (FR/EN) : chaque fonctionnalité fournit un dictionnaire i18n.ts ; les chaînes vivent à côté de la fonctionnalité, jamais codées en dur dans le JSX
  • Deux thèmes : clair et sombre, pilotés par les jetons du design-system sous src/design-system et src/theme

Chart Helm

Le cockpit est déployé via le sous-chart akko-cockpit-react :

helm/akko/charts/akko-cockpit-react/
├── Chart.yaml
├── values.yaml
├── Dockerfile           # multi-étage : build vite → image nginx statique
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── configmap-nginx.yaml    # service statique + pont /auth-check
    ├── ingress.yaml            # hôte demo.<domaine>
    ├── ingress-oauth2.yaml     # routes oauth2-proxy (évite les boucles)
    └── networkpolicy.yaml      # aller-retour ForwardAuth + appels backend

Valeurs clés

values.yaml
akko-cockpit-react:
  image:
    repository: akko-cockpit-react
    tag: "2026.06"
  ingress:
    enabled: true
    host: ""   # vide → demo.<global.domain>

Dépannage

Problèmes courants

  • Boucle de redirection après connexion/déconnexion : le cockpit porte le ForwardAuth de la plateforme. Vérifiez que les routes de ingress-oauth2.yaml sont appliquées et que le client Identité (Keycloak) akko-oauth2-proxy a la bonne URI de redirection (https://demo.<domaine>/oauth2/callback).
  • Tuiles absentes pour un utilisateur : attendu quand le rôle de l'utilisateur n'a pas accès à cet outil. La visibilité est dérivée de la matrice d'accès aux outils (canSeeCap, ADR-075) ; vérifiez le mapping groupe→rôle de l'utilisateur plutôt que l'UI.
  • Page blanche : vérifiez que le build statique a bien été produit (Dockerfile multi-étage) et que la ConfigMap nginx est montée ; la SPA utilise un HashRouter, donc aucune règle de réécriture nginx n'est nécessaire.