80a2a27ca9
k8s/secret.yaml held the actual PostgreSQL password, Keycloak admin
password and OIDC client secrets, and .gitignore only covered .DS_Store
and *.tmp. Untrack it and ignore it, matching what infra-librechat already
does, and extend the ignore list to TLS key material.
kustomization.yaml still references the file, so the README now documents
creating it from secret.example.yaml — whose key set is identical — before
the first apply.
This only stops future leaks. The values remain in commit 6d3431c and on
the remote, so they must still be treated as compromised and rotated.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
60 lines
2.5 KiB
Markdown
60 lines
2.5 KiB
Markdown
# 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
|
|
|
|
```text
|
|
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>` :
|
|
|
|
```bash
|
|
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.
|
|
|
|
```bash
|
|
kubectl apply -k k8s/
|
|
```
|