Skip to main content
Each step is one command, and after them the software stays current on its own. (Already running Vexa? Upgrade is your door.) Your channel’s onboarding mail carries what step 3 needs: the channel name (acme-stable in the examples below), your registry account name, your pull-only credential, age-encrypted, the channel public key channel.pub, and the signature repository the image signatures live in — see the channel. channel.pub is what every signature on this page is checked against; keep it, and pin it.

What you need

Preflight checks four of those five rows in step 2 and fails closed, so you find out now rather than at first sync: the version floor (P9), the default StorageClass (P8), the route to the channel registry and a real pull by digest (P5, P7), and whether the delivered set fits your nodes, quotas and pod-security (P1, P2, P3, P4, P6). The LoadBalancer/ingress row is yours — no preflight check reads it, because how you expose the gateway is your cluster’s business.

Step 1 — Get the kit

That is the whole kit — read it before you run it. Every command below is relative to this directory. For a signature-verified kit instead, pinned to the version your channel expects and checked against your key before a byte lands on disk — the path for air-gapped and high-assurance clusters:
Replace acme-stable with the channel name in your onboarding mail. A bad signature writes nothing to disk. The kit unpacks to ./vexa-kit, so read vexa-kit/... for kit/... in the steps below. Also: --version vX.Y.Z (default latest), --dest, --keep-tarball.

Step 2 — Preflight

Nine checks, fails closed, every finding names its remedy. See Preflight.

Step 3 — Install

Idempotent. Installs pinned Argo CD, pinned Kyverno, your admission policy and the subscription. my-values.yaml is yours (start from kit/profiles/vexa/customer-values.example.yaml), applied over every release and never leaving your cluster. Four of those flags are the difference between an install that syncs and one that does not, so none of them is optional against a credentialed channel: Also: --registry-ca <pem> for a private CA, --registry-insecure for a self-signed test registry, --staging-ns/--prod-ns, --dry-run. No CLI access (OpenShift, shared clusters)? Merge the signed station bundle chart into your config repo instead — see OpenShift. (Station bundle here means the machinery chart Vexa publishes into your cluster; the station-report.yaml of step 5 is the return leg, travelling the other way.)

Step 4 — Smoke, with a human in a real meeting

Delivered set healthy → control plane answers → you open a real meeting, admit the bot and speak while the CLI streams the transcript back → flows tier answers. Output: a dated receipt naming chart revision, image digests, meeting id and segment count. Paste the whole meeting link: An unrecognized link fails immediately. --non-interactive rehearses without the human phase: it records S3 as SKIP and the overall verdict stays PASS — it proves the tooling, not capture.
Rung. This step is the intended procedure and the tool implements it, but no audio has reached the pipeline in any delivery run yet — bot dispatch, the pinned image and pod lifecycle are proven; capture is not. What’s proven, and where.

Step 5 — Send the station report back

This is the one step with a Python dependency: it needs pyyaml, and jsonschema as well if you use --submit. Preflight, smoke and the report writer are stdlib-only — nothing to install for steps 2 and 4. Runs steps 2 and 4; add --install for step 3 between them. Exit codes: 0 pass · 1 phase failed · 2 usage · 3 redaction leak. Writes one file, station-report.yaml — your profile, your values with secrets redacted, the contract, and the receipts, each verbatim under a plain-English comment, with the sha256 of its own text at the foot. Read all of it, then send it — by hand, or with --submit, which pushes that same file to your own path on the channel using your own credential:
Drop --submit-dry-run to actually send. Your contract.yaml must carry a report_scope — it is the clause that bounds what may leave, and a submit with no bound is refused locally. See the station gate. Next: The station gate · Operations · Isolated networks