The deployment follows a strict order. Each phase produces outputs the next phase depends on. Skipping ahead is the most common cause of stuck rollouts.Documentation Index
Fetch the complete documentation index at: https://docs.aperium.apps.hillspire.com/llms.txt
Use this file to discover all available pages before exploring further.
Phase 0 — Prerequisites
Confirm the items in Prerequisites are in place: GCP project, Terraform Cloud workspaces, Terraform credentials for GCP, your deployment repo, the GitHub App for ArgoCD, and authority to delegate parent DNS.Phase 1 — Prepare your deployment repo
Replace the repo URL
Replace the placeholder
https://github.com/YOUR_ORG/YOUR_REPO.git everywhere it appears.Copy and edit Terraform inputs
Start from:
envs/aperium-apps-prod/tf/vars.auto.tfvars.exampleapps/aperium/envs/prod/tf/vars.auto.tfvars.example
Replace placeholders
Replace remaining placeholders in values and Terraform files (for example
YOUR_GCP_PROJECT_ID, YOUR_GCP_REGION, YOUR_DOMAIN, YOUR_CLUSTER_SECRET_STORE_NAME, YOUR_TFC_ORG).Phase 2 — Bootstrap the shared environment
Applyenvs/aperium-apps-prod/tf. This creates the shared network and cluster substrate plus ArgoCD bootstrap dependencies.
Expected outputs include:
- DNS delegation NS records
- GKE cluster name
- Network self link
- NAT IPs
- Cloud Armor policy names
- The
tfc-agent-configsecret container
Phase 3 — Delegate DNS
Use thedelegation_ns_records output from the shared env stack to delegate the managed subdomain from the parent DNS provider. Without this, public hostnames such as www.apps.YOUR_DOMAIN will not resolve correctly.
Phase 4 — Seed Secret Manager payloads
Load the payloads listed in Secrets. Sequence notes:- The shared env stack creates the
tfc-agent-configcontainer, but you still need to add theteam_tokenpayload. external-secretscannot materialize Kubernetes secrets until the backing GCP Secret Manager payloads exist.prefect-admin-credentialsshould exist before syncing the Prefect app.phoenix-authandqdrant-api-keysshould exist before validating those services.aperium-backend-ymlandaperium-mcp-auth-tokenmust exist before the Aperium stack becomes healthy.
Phase 5 — Wait for ArgoCD platform prerequisites
ArgoCD should reconcile these foundational apps:cert-managerexternal-secretsexternal-dnsgke-gatewaygateway-smokekedakyvernostakater-reloaderterraform-operator
- ArgoCD applications report Healthy / Synced.
ClusterSecretStoreexists and is Ready.- The gateway namespace and the public gateway exist.
- The DNS controller is reconciling records.
Phase 6 — Apply Aperium app-specific Terraform
Applyapps/aperium/envs/prod/tf. This stack creates the app-owned dependency layer.
Minimum commonly-needed resources
- Runtime GSA and Workload Identity bindings
- Artifact Registry repo
- GCS bucket
- Secret Manager secret containers
- BigQuery dataset
- Cloud SQL
- PostgreSQL grants
- Redis
- Generated KEDA DB secret version
Phase 7 — Sync Prefect and create aperium-pool
The Prefect app is intentionally minimal. It includes:
prefect-serverprefect-worker-aperium- The local
prefect-resourceschart
- A Prefect backing Cloud SQL instance (
YOUR_PREFECT_CLOUDSQL_INSTANCE). - A Prefect runtime GSA, for example
prefect@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com. - The
prefect-admin-credentialssecret in your external secret store.
- Prefect server is healthy.
prefect-worker-aperiumis healthy.aperium-poolexists.
Phase 8 — Validate supporting runtime services
Before enabling or debugging the core app, verify:prefectis healthy andaperium-poolexists.qdrantis healthy and has API key secrets.phoenixis healthy and has auth secrets.
Phase 9 — Roll out Aperium and the MCP services
Theaperium ArgoCD application deploys:
- Core Aperium frontend, backend, worker, and migrations.
- A dedicated background scheduler when enabled in values.
- Cleanup cronjobs for invoice export, file cache, and PostgreSQL tabular cleanup when enabled in values.
- In-cluster MCP services built from
charts/aperium-mcp-common.
aperium-mcp-common.yamlaperium-mcp-prefect.yamlaperium-mcp-salesforce.yamlaperium-mcp-malbek.yamlaperium-mcp-arena.yamlaperium-mcp-netsuite.yamlaperium-mcp-odoo.yamlaperium-mcp-google-workspace.yamlaperium-mcp-slack-workspace.yamlaperium-mcp-atlassian.yamlaperium-mcp-epic.yamlaperium-mcp-gcs-datalake.yaml
aperium.yaml directly references in-cluster URLs for these MCP services plus aperium-retrieval.
Phase 10 — Final verification
At minimum verify:- ArgoCD apps are Healthy / Synced.
prefect-serverandprefect-worker-aperiumpods are healthy.aperium-poolexists in Prefect.- The
qdrantservice responds and its secrets are mounted. - The
phoenixpods are healthy andphoenix-secretexists. aperiumbackend, worker, and frontend pods are Ready.- The background scheduler and any enabled cleanup cronjobs are healthy.
- ExternalSecret-generated Kubernetes secrets exist in the expected namespaces.
- Public routes resolve after DNS propagation.
- BigQuery, GCS, and Cloud SQL access works from the workload identity.