Skip to content

2. Install

Three ways to install. Pick one. All three end at the same place: a running platform on your cluster.

Terraform module

For teams managing infra as code. One terraform apply deploys the platform and optionally the K8s agent.

Helm chart

For teams with existing Kubernetes tooling. You bring the secrets and the values file.

Managed

Talk to a cloud partner. They run the install and the upgrades.

Use the shoehorn-dev/terraform-shoehorn-modules repo. Pin the module to a release tag.

Create a main.tf:

terraform {
required_version = ">= 1.5.0"
required_providers {
helm = { source = "hashicorp/helm", version = ">= 3.0.0" }
kubernetes = { source = "hashicorp/kubernetes", version = ">= 2.35.0" }
random = { source = "hashicorp/random", version = ">= 3.0.0" }
}
}
provider "kubernetes" { config_path = "~/.kube/config" }
provider "helm" { kubernetes = { config_path = "~/.kube/config" } }
resource "random_password" "pg_admin" { length = 32, special = false }
resource "random_password" "pg_app" { length = 32, special = false }
resource "random_password" "jwt" { length = 64, special = false }
resource "random_bytes" "auth_enc_key" { length = 32 }
resource "random_bytes" "session_key" { length = 32 }
resource "random_password" "valkey" { length = 32, special = false }
resource "random_password" "meili" { length = 32, special = false }
module "shoehorn" {
source = "github.com/shoehorn-dev/terraform-shoehorn-modules//modules/kubernetes?ref=v0.7.0"
domain = "shoehorn.acme.com"
organization_name = "Acme Corp"
organization_slug = "acme-corp"
admin_email = "platform@acme.com"
auth_provider = "okta"
auth_config = {
domain = "acme.okta.com"
clientId = "0oa..."
issuer = "https://acme.okta.com/oauth2/default"
}
credentials = {
postgres_password = random_password.pg_admin.result
db_password = random_password.pg_app.result
jwt_secret = random_password.jwt.result
auth_encryption_key = random_bytes.auth_enc_key.base64
session_encryption_key = random_bytes.session_key.base64
valkey_password = random_password.valkey.result
meilisearch_master_key = random_password.meili.result
okta_client_secret = var.okta_client_secret
}
}
variable "okta_client_secret" {
type = string
sensitive = true
}
output "url" { value = module.shoehorn.url }

Then:

Terminal window
terraform init
terraform apply

The module creates the namespace, every Kubernetes Secret the chart needs, and runs the Helm release. To deploy the K8s agent in the same apply, set deploy_agent = true and pass cluster_id / cluster_name.

Full reference, examples (Okta-only, Okta + agent, Okta + GitHub App + Forge), and gotchas: terraform-shoehorn-modules.

Whichever path you took, the pods should be Running within a few minutes:

Terminal window
kubectl get pods -n shoehorn
kubectl port-forward -n shoehorn svc/shoehorn-api 8080:8080
curl http://localhost:8080/healthz

Sign in for the first time →