docs

Vault install

Install Sieve Vault, the self-hosted Sieve container, in your own Kubernetes cluster. Air-gapped, signed images, offline licence.

Vault runs Sieve models inside your own cloud account or data centre. Your content, logs and metrics never leave your environment. Vault makes no outbound calls: no telemetry, no licence server, no usage upload. It serves the same System One and /v1/decisions API as the hosted service.

What you receive

A bundle sieve-vault-<version>/ with:

FileWhat it is
images/gateway.tar, images/engine.tarThe two container images (Docker archives)
chart/The Helm chart, sieve-vault
sbom/A software bill of materials for each image, in SPDX and CycloneDX
cosign.pubOur public signing key. Compare its fingerprint with the one in your contract.
SHA256SUMS, SHA256SUMS.sigChecksums of every file, and our signature over them
INSTALL.mdThis guide, as a file

Separately you receive your licence file licence.json and the model weights archive.

Before you start

  • Kubernetes 1.27 or newer with the NVIDIA device plugin, and a private container registry.
  • kubectl, helm 3.12 or newer, cosign 2 or newer (used offline), and sha256sum.
  • A GPU large enough for your model. From the model cards: Sieve-31B needs about 83 GB in bf16; Sieve-27B-v2 about 52 GB; Sieve-4B about 10 GB. For other models, ask us for sizing.
  • A namespace with the restricted Pod Security level:
kubectl label ns sieve pod-security.kubernetes.io/enforce=restricted

Verify the bundle offline

sha256sum -c SHA256SUMS
cosign verify-blob --key cosign.pub --signature SHA256SUMS.sig SHA256SUMS

The first command checks integrity of every file. The second checks that we signed the list. Confirm the key fingerprint out of band.

Load the images and verify their signatures

docker load -i images/gateway.tar && docker load -i images/engine.tar
# tag and push to your registry as registry.corp/sieve-vault-gateway:<version> and ...-engine:<version>
cosign verify --key cosign.pub --offline --insecure-ignore-tlog \
  registry.corp/sieve-vault-gateway@sha256:<digest>

Transparency-log checks need internet, so offline verification trusts the key. SBOMs are in sbom/. Build provenance (SLSA) is attached as an attestation: cosign verify-attestation --key cosign.pub --type slsaprovenance .... Pin the digests in your values file under image.*.digest.

Weights, licence and secrets

# Models PVC: populate from the weights archive, then mount read-only. LoRA adapters likewise.
kubectl -n sieve create secret generic sieve-licence --from-file=licence.json
kubectl -n sieve create secret generic sieve-api-keys --from-file=keys.json   # hashed keys, auth.mode=static
kubectl -n sieve create secret tls sieve-tls --cert=tls.crt --key=tls.key      # optional; required for mTLS

For customer-managed keys, use a storage class on your own KMS or HSM key for the volumes. Vault holds no encryption key of its own.

Install the chart

helm install vault ./chart -n sieve -f my-values.yaml

The smallest values file sets:

ValueMeaning
environmentIdMust equal the environment ID in your licence
models[]The models to load, each with its base-model licence text (the files ship in the image under /licenses)
networkPolicy.ingressFromWho may call the gateway
auth.modestatic (hashed keys in a Secret), oidc or mtls

The chart refuses to render if the environment ID, a base-model licence for each model, or a consistent auth and TLS setup is missing.

Verify the install

kubectl -n sieve logs deploy/vault-sieve-vault -c licence-check   # expect: OK L-... status=valid
kubectl -n sieve rollout status deploy/vault-sieve-vault
curl -sk https://<service>/healthz
curl -sk -H "Authorization: Bearer <key>" https://<service>/v1/models

Licence errors

The licence-check init container reads the licence before anything starts. The pod stays in Init until the problem is fixed. Pods that are already running keep serving until they restart, plus the grace period you set in licence.graceDays (default 0).

ErrorMeaning
expiredThe licence term has ended
not_yet_validThe start date is in the future
wrong_environmentThe licence is for a different environmentId
unknown_key_idThe image is too old for this licence. Install the newer image.
bad_signatureThe licence file was changed or damaged
model_not_licensedA model in models[] is not in the licence
adapter_not_licensedAn adapter is not in the licence

While the gateway runs it re-checks the licence every hour. If the licence becomes invalid, every route returns 503 licence_invalid and /readyz fails.

Renewal and key rotation

To renew, replace the Secret with the new licence.json and run kubectl rollout restart. Images embed two public keys. Roughly every two to three years we ship an image with the new key in the second slot while licences are still signed with the old one, so there is no cut-over day.

Network posture

The chart installs a default-deny NetworkPolicy with no egress at all, not even DNS. With auth.mode=oidc, give the chart a jwksConfigMap to stay fully offline; otherwise add one networkPolicy.egress rule to your identity provider only. Logs and the per-decision audit log stay in your cluster. See Assurance.

What reaches Sieve

Nothing. Vault sends no content, logs, metrics or usage counts to Sieve. Sieve does not see your content or logs.

Next steps

Last updated