Manuel d'installation client (bundle de release signé)
Ce manuel décrit l'installation d'Enterprise AI à partir du bundle de release signé et reproductible, y compris sur
un site sans accès Internet. Chaque commande ci-dessous a été exécutée sur la machine de build ; les limites sont
indiquées à la fin. Version anglaise : docs/operations/en/installation-handbook.md. Notes de version de la même
version : docs/release/RELEASE_NOTES-<version>.md.
1. Outils de release (machine connectée)
bash tools/oci/fetch.sh # cosign 2.6.5, trivy, kubeconform, kyverno (sha256 vérifiés)
bash tools/components/fetch-syft.sh # syft 1.55.0
bash tools/release/fetch-tools.sh # gitea 28.2.0, act_runner 5.2.4, Tekton v1.18.0, chart Harbor 1.19.4, schémas
Toutes les versions sont épinglées et chaque fichier est vérifié par sha256 (somme publiée par le projet amont, ou empreinte figée dans le script pour les fichiers sans somme publiée).
2. Construire le bundle
bash tools/release/build.sh # /tmp/eai-release/<version>/ et release/manifests/<version>.json
bash tools/release/verify-reproducible.sh # deux constructions, comparaison de chaque sha256
bash tools/release/sign.sh # SBOM Syft par artefact, signatures Cosign, scans Trivy et verdict
Le bundle contient : chart Helm empaqueté, manifestes rendus (values, values-prod, values-onprem-gpu), manifestes plateforme (Argo CD, Kyverno, KEDA, Velero, Tekton, Harbor), migrations SQL, documentation hors ligne, wheels et sdists Python (control plane et SDK), paquets npm du SDK TypeScript, archive source du module Go, jars Java, paquets RPM et DEB de navin-manager, packs, SBOM des composants, notices de licence et manifeste de verrouillage.
Reproductibilité : SOURCE_DATE_EPOCH (1700000000 par défaut), entrées tar triées, propriétaire 0:0, dates fixes,
en-têtes gzip sans date ni nom, sources copiées dans un répertoire temporaire. verify-reproducible.sh affiche
compared 36 artefacts, 0 differences.
Signatures : sign.sh génère une paire de clés Cosign sous /tmp/eai-release-keys (variable EAI_SIGN_KEY_DIR,
jamais versionnée) et signe manifest.json, chaque artefact et chaque SBOM (cosign sign-blob, sans journal de
transparence). En production, la clé de signature est celle du client (HSM ou OpenBao), pas une clé de test.
Verdict Trivy : sign.sh s'arrête en erreur si un résultat HIGH ou CRITICAL n'est pas justifié dans
tools/release/trivy-exceptions.yaml (champs id, justification, owner). Le verdict est écrit dans
scans/gate.json.
3. Transfert et vérification sur le site isolé
Copier le répertoire du bundle (support amovible), puis :
bash tools/release/verify.sh /chemin/du/bundle # sha256, signatures, SBOM et verdict Trivy
bash tools/release/verify.sh --integrity-only /chemin/du/bundle # sha256, signatures et SBOM seulement
La clé publique utilisée par défaut est cosign.pub du bundle ; passer en second argument la clé publique reçue
par un autre canal pour une vérification indépendante.
4. Preuve d'installation sans réseau
navin-manager/server/.venv/bin/python navin-manager/packaging/offline/build-bundle.py \
--out /tmp/eai-airgap/mirror --services opa --methods binary --skip-agent --bundle /tmp/eai-airgap/bundle.tar
bash tools/release/airgap-check.sh /tmp/eai-release/1.0.0 /tmp/eai-airgap/bundle.tar release/airgap/<date>.json
airgap-check.sh se relance dans unshare -rn (espace de noms réseau vide, seule l'interface lo existe), vérifie
qu'une connexion TCP vers 1.1.1.1:443 et une résolution DNS échouent, puis vérifie le bundle signé, vérifie et
extrait le miroir navin-manager, exécute un binaire du miroir, installe les wheels avec pip --no-index, rend le
chart empaqueté et extrait les migrations SQL. La preuve est écrite dans release/airgap/<date>.json.
5. Validation hors ligne des contrôles du cluster
helm template eai deploy/helm/enterprise-ai -f deploy/helm/enterprise-ai/values-prod.yaml > /tmp/r-values-prod.yaml
KUBECONFIG=/tmp/eai-nokube/config HOME=/tmp/eai-nokube /tmp/toolchains/kyverno apply \
deploy/policies/kyverno/cluster-policies.yaml deploy/policies/kyverno/pod-network-security.yaml \
--resource /tmp/r-values-prod.yaml
/tmp/toolchains/kubeconform -strict -summary \
-schema-location '/tmp/toolchains/kube-schemas/{{.ResourceKind}}{{.KindSuffix}}.json' \
-schema-location '/tmp/toolchains/kube-schemas/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' \
/tmp/r-values-prod.yaml deploy/keda deploy/velero deploy/argocd deploy/cilium deploy/tekton
helm lint /tmp/toolchains/release-dl/harbor-1.19.4.tgz -f deploy/harbor/values.yaml
Important : lancer Kyverno avec un KUBECONFIG vide. Sans cela, la règle de vérification des signatures d'images
essaie de lire la clé publique dans le cluster du contexte courant.
6. Intégration continue locale (Gitea et act_runner)
bash tools/ci/gitea-local.sh # Gitea sur un port libre, SQLite sous /tmp, runner hôte, preuve release/ci-runs/<date>.json
Limites
- Les effets d'exécution sur un cluster (contrôleur Tekton, Harbor, envoi et récupération d'images, Kyverno en admission, Cilium, KEDA, HPA, Velero sauvegarde et restauration, synchronisation Argo CD) exigent un cluster de recette : non vérifiés ici.
- La preuve sans réseau couvre la vérification du bundle, le miroir navin-manager et l'installation des wheels sans
dépendances (
--no-deps) ; les dépendances Python tierces viennent du wheelhouse navin-manager (--methods python), non inclus dans cette preuve. - Les valeurs
values-onprem-gpu.yamlutilisent des images sans empreinte (vllm-openai:v0.33.0) refusées par la politique Kyvernoeai-verify-image-signatures.