The Helm chart and deployment docs live in the akupara repo in
/deploy/kubernetes.How it fits together
The Greptile chart deploys application workloads only:- Services: web, auth, api, chunker, summarizer, worker, webhook, jobs, llmproxy
- Optional: jackson (for SAML SSO)
- Bundled by default: PostgreSQL and PgBouncer (transaction pooling)
- Ingress controller: the chart creates
Ingressresources but does not install a controller. You installingress-nginxyourself, once per cluster. - Hatchet: Greptile’s workflow orchestration runs as a separate Helm release, connected through the
hatchet.*values and aHATCHET_CLIENT_TOKEN.
Prerequisites
Cluster:- Kubernetes 1.21+ (1.25+ recommended)
kubectlconfiguredhelm3.0+
- Container registry credentials and an image tag
- License (contact sales@greptile.com)
- LLM provider API keys (see requirements)
- GitHub App or GitLab OAuth configured
Setup
Install the ingress controller (required, once per cluster)
nginx ingress class and a controller service exist:Install Hatchet
Hatchet is the workflow orchestration system. Install it before bootstrapping Greptile so the next step can mint a client token automatically:Verify Hatchet is healthy before continuing:
Create the registry secret
Greptile’s images are pulled from a private registry. Create the pull secret referenced by
global.imagePullSecrets (defaults to regcred):Validate the chart
helm dependency update, helm lint, and helm template against the bundled profiles to catch problems before you deploy.Bootstrap your values file
./charts/profiles/values.user.yaml from the example and auto-generates the secrets you’d otherwise set by hand:JWT_SECRETTOKEN_ENCRYPTION_KEY(32 characters)LITELLM_MASTER_KEYHATCHET_CLIENT_TOKEN(pulled from the runninghatchet-stackrelease)
Hatchet must already be deployed and reachable for automatic
HATCHET_CLIENT_TOKEN generation to succeed.Configure values.user.yaml
Open See
./charts/profiles/values.user.yaml and set the values the bootstrap script can’t infer:values.user.example.yaml for the annotated template and values.yaml for every available key. See Configuration below for the schema.Verify the rollout
greptile-postgres · greptile-pgbouncer · greptile-api · greptile-auth · greptile-web · greptile-webhook · greptile-worker · greptile-summarizer · greptile-chunker · greptile-jobs · greptile-llmproxyReach the web UI through your ingress host (network.appUrl), or port-forward for a quick check:Configuration
values.user.yaml overrides the chart defaults in charts/greptile/values.yaml. The top-level keys:
| Key | Purpose |
|---|---|
global | Image registry/tag, pull secrets, pod security context, scheduling (nodeSelector/tolerations/affinity) |
network | appUrl and webhookUrl — the public URLs for the app and webhook receiver |
hatchet | apiUrl, grpcUrl, tlsStrategy for the external Hatchet release |
github | GitHub App / GitHub Enterprise IDs and URLs |
secrets | mode (native or external) plus the secret values themselves |
postgres | Bundled PostgreSQL (enabled by default) |
externalDatabase | Connection details when using managed Postgres instead |
pgbouncer | Connection pooling (enabled by default, transaction mode) |
ingress | Ingress class and per-service (web, webhook) host/path/TLS |
components | Per-service replicas, image repo/tag, ports, and env |
storage | Shared workdir PVC (sharedWorkdir) |
email, integrations, saml, llm | Optional features and LLM base URLs |
Bundled vs. managed database
Postgres is bundled and enabled by default. To use a managed database (e.g. RDS, Cloud SQL) instead:pgvector extension available (CREATE EXTENSION IF NOT EXISTS vector;).
Secret modes
native(default) — values live insecrets.native.*. Best filled byinit-values.sh.external— setsecrets.mode: externaland configuresecrets.external.secretStoreRef/secrets.external.data. The chart renders anExternalSecret(via the External Secrets Operator) targeting the secret all workloads consume.
AWS (EKS) with Terraform
If you don’t already have a cluster, the akupara repo ships a Terraform stack that provisions a full EKS environment and installs Greptile for you. It’s consumed from a customer-owned root module — start from the copy/paste example atterraform/examples/aws-eks-module.
The aws-eks stack provisions:
- EKS Auto Mode cluster + OIDC provider for IRSA
- RDS PostgreSQL and ElastiCache Redis
- AWS Load Balancer Controller
- External Secrets Operator, with secrets stored in SSM Parameter Store (
/${name_prefix}/config/*,/${name_prefix}/secrets/*) and a KMS key for SecureString params - Hatchet stack + a token-generation Job
- The Greptile services + DB migration Job
- An optional CloudWatch log group + agent (see Monitoring)
helm and kubernetes providers — there is no separate helm install step.
Terraform stores these secret values in Terraform state. Treat your state backend (local or remote) as sensitive. Pin the module
source to a tag/commit (?ref=v0.1.0) for production rather than main.terraform.tfvars — region, kubernetes_version, db_instance_class (default db.m5.large), CloudWatch retention, and Hatchet ingress exposure. See the stack README for the full variables reference.
Other environments
There is no GCP or Azure Terraform in the repo today. For GKE, AKS, on-prem, k3s, Rancher, or OpenShift, bring your own Kubernetes cluster and use the genericdeploy/kubernetes chart in Setup above:
- Kubernetes 1.21+ required
- The chart deploys PostgreSQL and PgBouncer by default (or point at a managed database via
externalDatabase) - Install an ingress controller and a Hatchet release first
- Allow the privileged
workerpod (SYS_ADMIN+/sys/fs/cgroup)
Operations
Scaling
Each component defaults toreplicas: 1. Scale via chart values:
Updating
Validating workers
After deploy, confirm the worker deployments (chunker, summarizer, worker) appear as registered workers in the Hatchet UI. If they don’t, reviews won’t run — check HATCHET_CLIENT_TOKEN and the Hatchet endpoints.
Monitoring and observability
The chart’s operational visibility is Kubernetes-native — there is no bundled metrics or dashboard stack. Built-in:- Rollout and log inspection via
kubectl: - Worker health via the Hatchet dashboard — workflow status, queue depth, and registered workers (
chunker,summarizer,worker).
deploy/kubernetes Helm chart does not ship Prometheus scraping (no ServiceMonitor or PodMonitor), Grafana, bundled dashboards, or Fluentd/Elasticsearch log forwarding. If you want metrics scraping or dashboards, deploy and wire up Prometheus/Grafana yourself as a separate operator concern.
Optional log shipping (AWS EKS only):
The aws-eks Terraform stack — and only that stack — can ship container logs to CloudWatch. It runs a CloudWatch-agent DaemonSet against a Terraform-managed log group (/greptile/<name_prefix>/application), toggled by cloudwatch_logs_enabled (default true). This is not part of the generic deploy/kubernetes chart.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
ImagePullBackOff | Bad registry/tag/pull secret | Verify global.registry, global.tag, and the regcred secret |
CrashLoopBackOff | App/env error | Inspect container env and secret keys: kubectl logs <pod> |
DB migration job failed | DB unreachable or bad credentials | Validate DB connectivity and credentials |
| Worker review sandbox failed | Pod security blocks privileged mode | Allow the greptile-worker pod to run privileged with SYS_ADMIN and mount /sys/fs/cgroup |
| No reviews generated | Hatchet not connected | Verify HATCHET_CLIENT_TOKEN and Hatchet endpoints; check workers in the Hatchet UI |
Pods stuck in Init: | DB not ready (EKS wait-for-db init container) | kubectl logs deploy/api -c wait-for-db; confirm RDS endpoint + security groups |
network.webhookUrl is publicly reachable and matches the URL in your GitHub App / GitLab webhook.
LLM errors: check the proxy logs and verify keys/model names:
Resources
- Deployment docs — install, secrets, ingress, operations, troubleshooting
- Helm chart and
values.yaml values.user.example.yaml- AWS EKS Terraform stack