Files
infra-keycloak/k8s
Stéphane Tailland 6c89f6124d feat(realm): add the llm-proxy audience so agents can authenticate to the AI gateway
The AI gateway's openid-connect plugin requires audience ["llm-proxy"], but no
client or client scope in the realm could mint it, so every OIDC call fell
through to the anonymous consumer and was terminated with 401 "Authentication
required". Adds the bearer-only llm-proxy client, the llm-proxy-audience scope,
and grants it to the catalogue agent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 10:49:19 +02:00
..
2026-08-25 07:30:20 +02:00

Infra Keycloak (Kubernetes / CaC)

Déploiement de Keycloak 26.6.0 et PostgreSQL 16 en Configuration-as-Code (CaC) sous Kubernetes dans le namespace keycloak.

Structure du Répertoire

k8s/
├── kustomization.yaml             # Manifeste Kustomize principal
├── namespace.yaml                 # Namespace keycloak
├── secret.yaml                    # Secrets (Admin, DB, OIDC secrets)
├── secret.example.yaml            # Gabarit des secrets
├── postgresql/
│   ├── pvc.yaml                   # Stockage persistant PostgreSQL (2Gi)
│   ├── statefulset.yaml           # Base de données PostgreSQL 16
│   └── service.yaml               # Service PostgreSQL (port 5432)
├── keycloak/
│   ├── configmap-realm.yaml       # Realm classic-models (Configuration-as-Code)
│   ├── deployment.yaml            # Déploiement Keycloak 26.6.0 (--import-realm)
│   └── service.yaml               # Service Keycloak (ports 8080, 9000)
└── ingress/
    ├── tls.yaml                   # Secret TLS wildcard (*.sttlab.local)
    └── ingress.yaml               # Ingress NGINX (keycloak.sttlab.local)

Fonctionnalités Clés

  • Version Keycloak : quay.io/keycloak/keycloak:26.6.0 (Runtime Quarkus).
  • Import Automatique du Realm (CaC) : Le realm classic-models est chargé au démarrage via l'option --import-realm depuis le ConfigMap monté dans /opt/keycloak/data/import/.
  • Token Exchange RFC 8693 : Activé via KC_FEATURES: "token-exchange,admin-fine-grained-authz".
  • Clients Configurés :
    • librechat : Client OIDC pour le login et le flux OAuth MCP.
    • mcp-catalog : Audience du serveur MCP.
    • kong-token-exchange-broker : Échangeur de jetons RFC 8693 de Kong Gateway.
    • catalog-api & classic-models-api : Audiences des services backend.
  • Utilisateurs & Rôles :
    • admin-user (admin)
    • pm-user (product_manager)
    • ro-user (read_only)
    • customer-user (customer)
    • support-user (support)

Déploiement

k8s/secret.yaml n'est pas versionné : il porte les mots de passe réels (base PostgreSQL, admin Keycloak, secrets clients OIDC). Le créer une fois depuis le gabarit, puis renseigner chaque <CHANGE_ME> :

cp k8s/secret.example.yaml k8s/secret.yaml
$EDITOR k8s/secret.yaml

k8s/kustomization.yaml le référence, donc le déploiement échoue tant qu'il est absent.

kubectl apply -k k8s/