Kubernetes (Helm)
Le chart Helm rikoo déploie l'api, le worker, le sidecar d'analyse de documents et le bac à sable
des outils sur un cluster, avec PostgreSQL, Redis et le stockage objet soit intégrés au chart, soit
remplacés par des services managés. Les migrations de schéma s'exécutent dans un Job à l'installation
et avant chaque mise à jour.
Le chart se trouve dans un dépôt public, Rikoo-app/rikoo-k8s,
sous licence MIT. Les images de conteneur qu'il déploie sont dans un registre privé : il vous faut
l'adresse du registre et des identifiants fournis par l'équipe Rikoo (voir la
Vue d'ensemble).
Prérequis
- Kubernetes 1.27 ou ultérieur, et Helm 3.14 ou ultérieur.
- Un plugin réseau qui applique les NetworkPolicies, comme Cilium ou Calico. Le bac à sable s'appuie sur elles pour couper son accès au réseau, voir Isolation du bac à sable.
- Une StorageClass par défaut, si vous gardez les stockages intégrés : ils demandent 20 Gio pour PostgreSQL, 8 Gio pour Redis et 50 Gio pour MinIO.
- Pour une adresse publique : un contrôleur d'ingress et cert-manager, ou leurs équivalents.
- Capacité : avec les valeurs par défaut, les pods demandent environ 2,2 vCPU et 4 Gio de mémoire, et leurs limites de mémoire totalisent environ 11 Gio.
Installation
Les étapes suivent le dossier examples/minimal-installation du dépôt du chart : tous les stockages
intégrés, et tous les identifiants dans un seul Secret créé au préalable.
1. Récupérer le chart
git clone https://github.com/Rikoo-app/rikoo-k8s.git
cd rikoo-k8s/examples/minimal-installation
helm dependency update ../../charts/rikoo
2. Créer le namespace et le secret du registre
kubectl create namespace rikoo
kubectl -n rikoo create secret docker-registry rikoo-registry \
--docker-server=<registry> --docker-username=<user> --docker-password=<token>
3. Créer le secret de l'application
Générez la paire de clés de scellement du coffre. Le chart ne la génère jamais, et perdre la clé privée rend illisibles tous les secrets stockés.
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out sealing.private
openssl pkey -in sealing.private -pubout -out sealing.public
Modifiez ensuite secret.yaml et remplacez chaque valeur à compléter :
| Clé | Valeur |
|---|---|
widget-signing-key, totp-key, sandbox-token-secret | Des chaînes aléatoires d'au moins 32 caractères, produites par exemple par openssl rand -hex 24 |
sealing.pub, sealing.key | Le contenu de sealing.public et de sealing.private |
POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB | Les identifiants du PostgreSQL intégré |
rootUser, rootPassword | Les identifiants du MinIO intégré |
kubectl -n rikoo apply -f secret.yaml
Dans un pipeline GitOps, produisez ce Secret avec un opérateur de secrets externes au lieu de le versionner.
4. Installer le chart
helm install rikoo ../../charts/rikoo -n rikoo -f values.yaml \
--set rikoo.image.registry=<registry>/<namespace> \
--set rikoo.image.tag=v0.2.0
rikoo.image.registry et rikoo.image.tag sont tous deux obligatoires : sans eux, le chart refuse
de produire ses manifestes.
5. Vérifier
kubectl -n rikoo get pods
kubectl -n rikoo port-forward svc/rikoo-api 3000:http
curl -fsS http://localhost:3000/api/v1/health
Ouvrez http://localhost:3000 et créez le premier compte : tant qu'aucune organisation n'existe, il
peut s'inscrire et devient Propriétaire de la première organisation.
Exposer l'instance
La surcouche with-ingress.yaml du même dossier ajoute un ingress avec TLS, en supposant
ingress-nginx, cert-manager et un ClusterIssuer nommé letsencrypt. Remplacez ses hôtes d'exemple,
rikoo.example.com et s3.rikoo.example.com, par les vôtres. Cette surcouche, en outre :
- fixe
rikoo.publicUrlà l'adresse publique etrikoo.trustProxyHopsà1, puisque le contrôleur d'ingress est un proxy placé devant l'api ; - donne au MinIO intégré une route publique, car les navigateurs envoient les pièces jointes
directement au stockage objet, à l'adresse indiquée dans
s3.browserEndpoint; - désactive la mise en mémoire tampon du proxy et porte les délais d'expiration à une heure, car les réponses arrivent en flux, sous forme de server-sent events. Avec un autre contrôleur d'ingress, appliquez les mêmes réglages.
helm upgrade --install rikoo ../../charts/rikoo -n rikoo \
-f values.yaml -f with-ingress.yaml \
--set rikoo.image.registry=<registry>/<namespace> --set rikoo.image.tag=v0.2.0
Utiliser des stockages managés
Chaque stockage intégré peut être remplacé par un service managé. Le dossier
examples/external-components contient une surcouche par stockage.
| Stockage | Valeurs | Exigences |
|---|---|---|
| PostgreSQL | postgresql.deploy: false, puis postgresql.url, ou host, port et auth.* | Les extensions vector (pgvector) et citext. Le rôle qui exécute les migrations doit avoir le droit de créer des extensions et des rôles. |
| Redis | redis.deploy: false, puis redis.url, ou host, port et database | maxmemory-policy noeviction : évincer une clé fait perdre des jobs en file d'attente. |
| Stockage objet | s3.deploy: false, puis endpoint, browserEndpoint, region, bucket, forcePathStyle et la paire de clés | N'importe quel service compatible S3. |
Pour que la sécurité au niveau des lignes (RLS) de PostgreSQL filtre les requêtes sur les données des
organisations, donnez à l'application un second rôle, non propriétaire, via postgresql.appUrl.
Sans lui, ces requêtes passent par la connexion du propriétaire.
Configurer
Le chart définit ce qu'il peut à partir de ses propres valeurs. Tout autre réglage du produit va dans
un dictionnaire contrôlé : rikoo.settings (lu par l'api et le worker), rikoo.api.settings ou
rikoo.worker.settings. Le chart confronte chaque nom à la liste des variables que lit le produit,
et refuse de produire ses manifestes pour un nom que le produit ne connaît pas, un secret écrit en
clair ou une valeur au mauvais format.
La liste complète des variables, avec leur format et le service qui les lit, se trouve dans
charts/rikoo/VARIABLES.md.
Édition Enterprise
Déployez les images Enterprise (demandez le tag avec votre licence), puis stockez la licence dans un
Secret et faites-y pointer rikoo.license.deploymentLicense :
kubectl -n rikoo create secret generic rikoo-license \
--from-literal=RIKOO_DEPLOYMENT_LICENSE='<license>'
rikoo:
license:
deploymentLicense:
secretKeyRef:
name: rikoo-license
key: RIKOO_DEPLOYMENT_LICENSE
Voir Licence Enterprise pour ce que débloque la licence.
Isolation du bac à sable
Les outils embarqués s'exécutent dans les pods mcp-sandbox, confinés par trois NetworkPolicies :
l'espace de travail ne joint que le navigateur, le navigateur ne sort que par le proxy mcp-egress,
qui applique la même garde anti-SSRF que le worker, et l'api n'en joint aucun. Le conteneur de
l'espace de travail abandonne toutes les capabilities sauf les quatre dont il a besoin pour prendre
l'identité système de la conversation (SETUID, SETGID, CHOWN, DAC_OVERRIDE), avec un système
de fichiers racine en lecture seule et le profil seccomp RuntimeDefault.
Les NetworkPolicies ne sont appliquées que par un plugin réseau qui les prend en charge. Sur un
cluster qui n'en a pas, l'espace de travail du bac à sable peut joindre le réseau : installez un tel
plugin, ou désactivez le bac à sable avec rikoo.sandbox.enabled: false. Les exécutions fonctionnent
toujours sans lui, et les outils embarqués renvoient une erreur.
La pile Docker Compose ajoute un profil seccomp dédié et prend en charge gVisor. Le chart ne propose encore ni l'un ni l'autre.
Mise à jour
Sauvegardez la base de données, puis relancez la même commande avec le nouveau tag :
helm upgrade --install rikoo ../../charts/rikoo -n rikoo -f values.yaml \
--set rikoo.image.registry=<registry>/<namespace> --set rikoo.image.tag=<new tag>
Le Job de migration s'exécute avant les nouveaux pods. S'il échoue, la nouvelle version n'est pas
déployée : consultez kubectl -n rikoo logs job/rikoo-migrations. helm rollback revient aux
images précédentes mais n'annule pas les migrations. Restaurez la sauvegarde de la base quand une
version doit être annulée.
Désinstallation
helm uninstall rikoo -n rikoo
Le chart conserve ce qui ne peut pas être recréé : ses Secrets portent l'annotation
helm.sh/resource-policy: keep, et le volume du PostgreSQL intégré est conservé. Supprimez-les à la
main, avec le namespace, seulement si vous acceptez de perdre les données.
Essayer sur un ordinateur portable
Le dossier examples/local-kind fait tourner le chart sur un cluster kind
local, avec des images construites depuis le dépôt source de Rikoo. Son README détaille les étapes
et inclut une vérification que le réseau du bac à sable est réellement coupé.