One shared profile puts the whole backend on your cluster
What runs
Everything lands in one Stack,moyai-observatory, in the order each part needs.
What you need
- An Ankra organisation that Moyai has shared the
moyai-observatoryprofile with. Send Moyai your organisation slug (under organisation settings); they grant the share, and the profile appears in your catalogue. See Share with specific organisations. - A cluster in that organisation, wherever you run Kubernetes:
- On-prem: Proxmox VE or HPE Morpheus (closed beta), which Ankra builds for you.
- A cluster you already run: import it with one command.
- Any cloud Ankra supports.
- About 4 vCPU and 8 GiB of memory free, and a StorageClass. For three Postgres instances, use three nodes so each replica lands on its own.
- The pull credentials and the WorkOS client ID Moyai issues you.
- The Ankra CLI, or the portal: every step below is also Stack Profiles > moyai-observatory > Use Profile.
Install
See what the profile asks for
--set, a choice, or the default. Five inputs are secrets with no default, and the dry run lists them as unset until you bind them.Write the secrets to files
REGISTRY, PULL_USER and PULL_TOKEN are the pull credentials Moyai gave you. Keep this directory: upgrades bind the same files.Apply, review, deploy
--deploy this creates a reviewable Stack draft on the cluster. Read it in the Stack builder, then deploy it there, or run the same command again with --deploy. The secrets are sealed with SOPS before they reach the cluster’s GitOps repository.Add --set for anything you want to change from the default:ankra stack-profiles apply takes --cluster more than once, so the same command installs the backend on several clusters at a time.
Choose the LLM
The analysis pipeline calls one OpenAI-compatible endpoint. Pick where it lives withllm_mode; the choice sets the model, the endpoint and whether the demo model runs.
- In-cluster CPU demo
- Your own GPU with vLLM
- An OpenAI-compatible API
Verify
Running and ready (the create-buckets and create-warehouse jobs Completed), the four health checks answer healthy, and every Prometheus target returns 1: the API database, SeaweedFS, the catalog and, when it runs, the demo LLM.
Then upload one trace end to end. With a WorkOS token in the X-Moyai-Authorization: Bearer <token> header, the API under /internal/v1/uploads takes four calls: create the upload record (POST), ask for a presigned URL (POST /{upload-id}/presigned-url), PUT the JSONL file to that URL, and start processing (POST /{upload-id}/process). GET /internal/v1/uploads/{upload-id} then reports its progress until the incident report is ready.
Upgrades
Moyai publishes new versions of the profile; you choose when each cluster takes one. A rollout replaces the Stack’s contents in place, so Kubernetes rolls the workloads and the data stays where it is.Air-gapped clusters
The profile reaches the internet for three things: container images, the embedding model the API loads at startup, and the weights of the demo LLM. Each has a local replacement.- Images. Mirror the images into your registry and configure it as a registry mirror on the nodes. Set
imageto your mirrored easterisland reference and bind your registry’s pull secret inpull-secret.json. - Model weights. Mirror
minishlab/potion-base-32MandQwen/Qwen2.5-0.5B-Instruct-GGUFinto a Hugging Face-compatible mirror inside your network and setmodel_mirror_urlto it. With an external LLM, only the embedding model is needed. - Helm charts. Add internal mirrors of the CloudNativePG and prometheus-community charts as Helm registries.
- Certificates. Keep the API internal, or publish it with
cluster_issuerset to the cert-manager issuer for your internal CA instead of Let’s Encrypt.
Troubleshooting
The easterisland pod is stuck in ImagePullBackOff
The easterisland pod is stuck in ImagePullBackOff
image. Check the registry host and credentials in pull-secret.json, then bind it again with rollout and --set-file.Postgres or SeaweedFS volumes stay Pending
Postgres or SeaweedFS volumes stay Pending
storage_class to one that exists.Authenticated calls answer 500 'No authentication provider configured'
Authenticated calls answer 500 'No authentication provider configured'
workos_client_id is empty. Set it to the client ID Moyai gave you.The fetch-model init container fails
The fetch-model init container fails
model_mirror_url. Allow egress to Hugging Face, or point it at your mirror.