Project guide

Project Guide | LLM On-Prem Deployment Kit

Free private LLM deployment readiness map for Terraform, Helm, and air-gapped operations. This guide organizes the repository's original implementation notes for infrastructure architects and private AI platform teams.

Reviewed 2026-07-28. This page is derived from checked-in repository evidence and links back to its source.

Live Demo

A customer-owned deployment baseline for evaluating private, hybrid, or air-gapped LLM infrastructure. It is designed for a bounded readiness sprint and must be adapted and validated before production use.

---

System Overview

A private/hybrid LLM deployment kit for organizations that cannot send sensitive workloads to uncontrolled hosted endpoints.

AreaDetails
UsersRegulated enterprises, internal AI platform teams, security architects, and infrastructure operators.
Technical pathValidate the demo, README, architecture notes, and quality gate before deeper workflow review.
System scopeTerraform, Helm, air-gapped notes, compliance runbooks, model-routing boundaries, and infrastructure controls.
Operating boundaryCustomer owns the cloud account, cluster, registry, KMS, secrets, data, and logs. The chart supplies API-key protection and a reverse-proxy path, not end-user identity, tenant authorization, rate limiting, clustered vector state, or production evidence.
Evaluation pathInspect the infra modules, run validation commands where available, and review the operating notes.

Evaluation Path

Local Validation Tiers

make verify    # repository surface + architecture blueprint; requires Python only
make validate  # Terraform, Helm, and ShellCheck validation; requires the infra toolchain

If Terraform, Helm, or ShellCheck are installed outside PATH, pass explicit paths, for example:

make TERRAFORM=/path/to/terraform HELM=/path/to/helm SHELLCHECK=/path/to/shellcheck validate

Architecture Notes

Table of Contents

  1. Why this exists
  2. What you get
  3. Reference Architecture
  4. Quick Start
  5. Compliance Mappings
  6. Runbooks
  7. Choosing a Cloud
  8. Security Model
  9. Extending
  10. Related Projects
  11. License

---

Why this exists

Shipping large language model (LLM) applications to regulated customers is not a model problem. It is an *infrastructure* problem.

By the time a customer has decided to buy, their deployment team is asking questions that have little to do with tokens per second:

llm-onprem-deployment-kit packages infrastructure-as-code, a Helm baseline, runbooks, and control-mapping aids for a customer-owned readiness sprint. It shortens architecture review and pilot setup; it does not certify that a rendered template is a running, auditable production system.

Target audience:

If the question is "how fast can I get a demo LLM running on my laptop," this is not the right repository. If the question is "what must we validate before a private LLM pilot can run inside the customer's account," this is the intended starting point.

---

What you get

---

Reference Architecture

flowchart LR
    subgraph CustomerEdge[Customer Edge]
        IdP[Customer IdP<br/>OIDC / SAML]
        Access[Customer API Gateway<br/>Identity + Quotas + Rate Limits]
        OpsUser[Operator / SRE]
    end

    subgraph PrivateNetwork[Private Network / VNet]
        subgraph IngressTier[Ingress Tier]
            PLB[Private Load Balancer]
            TRAEFIK[Traefik Reverse Proxy<br/>TLS + Routing]
        end

        subgraph K8sCluster[Kubernetes Cluster - Private Control Plane]
            subgraph AppTier[Application Tier]
                VLLM[vLLM Inference<br/>GPU Node Pool]
                QDRANT[Qdrant Vector DB<br/>Single StatefulSet Pod]
            end
            subgraph PlatformTier[Platform Tier]
                OTEL[OpenTelemetry Collector]
                ESO[External Secrets Operator]
            end
        end

        subgraph DataPlane[Data and Secrets Plane]
            KMS[Cloud KMS /<br/>Key Vault]
            VAULT[HashiCorp Vault]
            REGISTRY[Private Container Registry]
            LOG[Loki + Prometheus]
        end
    end

    OpsUser -->|Private endpoint| Access
    IdP --> Access
    Access --> PLB
    PLB --> TRAEFIK
    TRAEFIK --> VLLM
    VLLM --> OTEL
    QDRANT -. metrics .-> OTEL
    TRAEFIK -. metrics .-> OTEL
    OTEL --> LOG
    ESO --> VAULT
    VAULT --> KMS
    VLLM -.->|Pull images| REGISTRY
    QDRANT -.->|Pull images| REGISTRY
    TRAEFIK -.->|Pull images| REGISTRY

Notable properties of this architecture:

For the long form, see `docs/architecture.md`.

---

Quick Start

The quick start assumes (a) a workstation with terraform, helm, kubectl, and the cloud CLI of your choice; (b) permissions to create a VPC/VNet, a Kubernetes cluster, and a KMS key in the target subscription/account/project; and (c) a private container registry that the cluster can pull from.

For a full airgapped install with image mirroring, see `docs/runbooks/initial-deploy.md`.

1. Pick a cloud and provision infrastructure


## Azure example
cd terraform/modules/azure-aks/examples/basic
terraform init
terraform plan  -out=tfplan -var-file=../../../../../examples/quickstart-azure/terraform.tfvars
terraform apply tfplan

Equivalent commands exist under terraform/modules/aws-eks/examples/basic and terraform/modules/gcp-gke/examples/basic.

2. Mirror container images (airgapped environments only)

export TARGET_REGISTRY=registry.customer.internal/llm-stack
scripts/airgap-mirror.sh --target "$TARGET_REGISTRY" --dry-run
scripts/airgap-mirror.sh --target "$TARGET_REGISTRY"

3. Create customer-owned pilot secrets

The baseline fails closed if its API-key or TLS secret is absent. For an evaluation cluster, create them directly; a customer pilot should use the approved secret manager and ExternalSecret path.

kubectl create namespace llm-stack
kubectl -n llm-stack create secret generic llm-stack-inference-api-key \
  --from-literal=api-key="$(openssl rand -hex 32)"
openssl req -x509 -newkey rsa:3072 -nodes -days 30 \
  -subj '/CN=llm.internal.example.com' \
  -keyout /tmp/llm-stack.key -out /tmp/llm-stack.crt
kubectl -n llm-stack create secret tls llm-stack-tls \
  --key /tmp/llm-stack.key --cert /tmp/llm-stack.crt
rm -f /tmp/llm-stack.key /tmp/llm-stack.crt

4. Install the llm-stack Helm chart

helm upgrade --install llm-stack ./helm/llm-stack \
  --namespace llm-stack \
  --values ./helm/llm-stack/values.yaml \
  --atomic --timeout 10m

values-airgap.yaml is an overlay, not a turnkey install. It requires mirrored images and model weights, an approved ClusterSecretStore, customer observability endpoints, TLS material, network sources, storage, and an acceptance plan.

5. Verify

make status
scripts/smoke-test.sh --namespace llm-stack --release llm-stack

The smoke test checks the routed vLLM health path, sends an API-key-protected inference request, and checks the single Qdrant endpoint. It does not prove identity integration, quotas, rate limiting, high availability, backup recovery, immutable audit, or an SLO.

---

Compliance Mappings

This kit is designed to produce evidence that maps directly to common enterprise control frameworks. Full mappings live under `docs/compliance/`.

FrameworkScopeMapping Document
SOC 2 Type IITrust Services Criteria (Security, Availability, Confidentiality)`soc2-type2-mapping.md`
ISO 27001:2022Annex A controls applicable to cloud-hosted AI workloads`iso27001-mapping.md`
Customer airgapCommon procurement questionnaire items for airgapped and sovereign deployments`airgap-requirements.md`

At-a-glance control summary:

Control themeSOC 2 TSCISO 27001 Annex AThis kit provides
Logical accessCC6.1, CC6.2, CC6.3A.5.15, A.5.16, A.8.2vLLM API-key baseline plus customer-owned identity and gateway acceptance work
Encryption at restCC6.7A.8.24Optional CMK/IaC controls; effective encryption must be evidenced in the customer account
Encryption in transitCC6.7A.8.24TLS at Traefik; east-west mTLS is not included
Change managementCC8.1A.8.32Terraform + Helm + GitHub Actions CI
MonitoringCC7.1, CC7.2A.8.15, A.8.16OTel collector configuration and scrape surfaces; customer alerts and retention required
Incident responseCC7.4, CC7.5A.5.24, A.5.26`incident-response.md`, diag bundle
AvailabilityA1.1, A1.2A.8.14HPA/PDB and multi-zone infrastructure options; Qdrant remains single-node and no HA claim is made

---

Runbooks

Each runbook is written to be executable by an on-call engineer with working kubectl/cloud CLI access and no prior context.

RunbookPurposeWhen to use
`initial-deploy.md`End-to-end day-1 deploymentFirst install or re-install into a new environment
`airgap-image-mirror.md`Mirror container images to a private registryAny airgapped or sovereign install
`rotate-secrets.md`Rotate JWT signing keys, Vault roots, API keysScheduled rotation or after suspected compromise
`upgrade-model.md`Upgrade the inference model with zero downtimeModel version bump
`incident-response.md`SEV levels, paging, customer handoffAny production incident
`disaster-recovery.md`Restore from backups, cross-region failoverLoss of a region / cluster

---