Key Components
To install the complete control plane on your own infrastructure, you need to install the following components:- Truefoundry Control Plane + Gateway (Shipped as a single helm chart called
truefoundry) - PostgreSQL Database (Managed or Self-Hosted with PostgreSQL >= 13)
- Blob Storage (S3, GCS, Azure Container or any other S3 compatible storage)
Compute Requirements
Truefoundry ships as a helm chart (https://github.com/truefoundry/infra-charts/tree/main/charts/truefoundry) that has configurable options to either deploy both Deployment and AI Gateway feature or just choose the one of them according to your needs. The compute requirements change based on the set of features and the scale of the number of users and requests. Here are a few scenarios that you can choose from based on your needs.- Small (Dev)
- Medium (Prod)
- Large (Prod)
- AWS
- GCP
- Azure
| Component | CPU | Memory | Storage | Min Nodes | Remarks |
|---|---|---|---|---|---|
| Helm-Chart (AI Gateway Control Plane components) | 6 vCPU | 12GB | 60GB Persistent Volumes (Block Storage) On Kubernetes | 2 Pods should be spread over min 2 nodes | Cost: ~ $220 pm(EC2 and EC2 others) |
| Helm-Chart (AI Gateway component only) | 1 vCPU | 512Mi | - | 1 Pods should be spread over min 1 node | Cost: ~ $35 pm(EC2 and EC2 others) |
| Postgres (Deployed on Kubernetes) | 0.5 vCPU | 0.5GB | 5GB Persistent Volumes (Block Storage) On Kubernetes | Cost: ~ $15 pm (RDS compute and storage) | |
| Blob Storage (S3 Compatible) | 20GB | Cost: ~ $3 pm (S3 storage) |
Prerequisites for Installation
- Kubernetes Cluster: K8s cluster 1.27+.
- Support for dynamic provisioning of storage for PVC (for e.g AWS EBS, Azure Disk etc.) and support for ingress controller (for e.g. Nginx Ingress Controller) or istio service mesh for exposing the control plane dashboard and AI Gateway at an endpoint.
- Domain to map the ingress of the Control Plane dashboard and AI Gateway along with certificate for the domain.
This Domain will be referred as Control Plane URL in our documentation.
- Egress Access from TrueFoundry:
- https://auth.truefoundry.com - Central Authentication Server for licensing and authentication
- https://login.truefoundry.com - Login UI for the central authentication server
- https://catalogue.truefoundry.com - Central Repository for fetching catalogues for latest model, their public cost, mcp servers, etc.
- https://analytics.truefoundry.com - Analytics Server for sending usage analytics to TrueFoundry.
- Tenant Name, Licence key, and image pull secret - This will be given by TrueFoundry team. Make sure your organization is registered((https://truefoundry.com/register)) on TrueFoundry.
One Tenant Name and Licence key must only be used to setup one Control Plane. Later, switching to new tenant name and licence key would lead to complete data lose of existing control plane.
- PostgreSQL database. We usually recommend managed PostgreSQL database (For e.g. AWS RDS, or Google Cloud SQL, or Azure Database for PostgreSQL) for production environments.
- PostgreSQL version >= 13
- IOPS: Default (suitable for dev/testing).
- For PostgreSQL 17+: Disable SSL, for AWS: by setting
force_sslparameter to 0 in the parameter group, for Azure: by settingrequire_secure_transportparameter tofalsein the parameter group - For instance requirements, refer to the Compute Requirements section.
In case, you do not have a managed database just for testing purposes, set
devModeto true in the values file to spin up a local PostgreSQL database.
- Blob Storage to store the AI Gateway request logs (either S3, GCS, Azure Blob Storage, or any other S3 compatible storage). You can find the instructions in the guide below.
Installation Instructions
- AWS
- GCP
- Azure
- Openshift
- On-Prem
Create S3 Bucket
- Make sure the bucket has lifecycle configuration to abort multipart upload set for 7 days.
- Make sure CORS is applied on the bucket with the below configuration:
Setup Control Plane Platform IAM Role
Creating AWS IAM Role for Control Plane
Creating AWS IAM Role for Control Plane
- Create a new IAM role for Control Plane with a suitable name like
tfy-control-plane-platform-deps - Add the following trust policy to the Control Plane IAM Role:
<ACCOUNT_ID>, <AWS_REGION>, and <OIDC_ID> you can also give the values from your EKS cluster.
You can find the OIDC_ID from the EKS cluster. Also, here we are assuming that the service account is truefoundry and the namespace is truefoundry, you can change it as per your needs.Create Postgres RDS Database
db.t3.medium with storage size of 30GB.devMode to true in the values file belowCreate Kubernetes Secrets
- Store the License Key and DB Credentials
- Store the Image Pull Secret
Create Kubernetes Secret for License Key and DB Credentials
Create Kubernetes Secret for License Key and DB Credentials
postgresql.auth.usernameDB_PASSWORD: randompassword # You can change this to any value here.truefoundry namespace)Create Kubernetes Secret for Image Pull Secret
Create Kubernetes Secret for Image Pull Secret
truefoundry namespace)Create HelmChart Values file
- Control Plane URL: URL that you will map to the control plane dashboard (e.g.,
https://truefoundry.example.com) - Tenant Name: Tenant name provided by TrueFoundry team
- AWS S3 Bucket Name: Name of the S3 bucket you created in the previous step (e.g.,
my-truefoundry-bucket) - AWS Region: Region of the S3 bucket you created in the previous step (e.g.,
us-west-2) - Control Plane IAM Role ARN: ARN of the IAM role you created in the previous step (e.g.,
arn:aws:iam::123456789012:role/tfy-control-plane-platform-deps)
FAQ
How to add multiple gateway planes to the control plane?
How to add multiple gateway planes to the control plane?
Create Kubernetes Secret for License Key and DB Credentials
- Store the License Key
- Store the Image Pull Secret
Create Kubernetes Secret for License Key
Create Kubernetes Secret for License Key
truefoundry namespace)Create Kubernetes Secret for Image Pull Secret
Create Kubernetes Secret for Image Pull Secret
truefoundry namespace)Create Helm chart Values file for gateway plane
CONTROL_PLANE_URL: URL that you will map to the control plane dashboard.TENANT_NAME: Tenant name provided by TrueFoundry team.GATEWAY_ENDPOINT_HOST: The domain where you will expose the gateway endpoint (e.g.,gateway.example.com)
Can I use my Artifactory as a mirror to pull images?
Can I use my Artifactory as a mirror to pull images?
- URL:
https://tfy.jfrog.io/
Can I copy images to my own private registry?
Can I copy images to my own private registry?
truefoundry Helm Chart to identify and copy required images to your private registry.- Generic Registry
- AWS ECR Registry
- Skopeo
- Used to perform the image copy operation.
- Helm
- Used to get the list of images from the TrueFoundry Helm Chart.
<USERNAME> with the TrueFoundry registry username.Replace
<PASSWORD> with the TrueFoundry registry password.<USERNAME> with your registry username.Replace
<PASSWORD> with your registry password.Replace
<YOUR_REGISTRY> with the URL of your registry.Skopeo will use authentication details for a registry that was previously authenticated with docker login.Alternatively, you can use the --dest-user and --dest-password flags to provide the username and password for the destination registry.<TRUEFOUNDRY_HELM_CHART_VERSION> with the version of the Truefoundry
helm chart you want to use. You can find the latest version in the
changelog.Replace <TRUEFOUNDRY_HELM_VALUES_FILE> with the path to the values file you created in the Installation Instructions.Replace <DEST_REGISTRY> with the URL of your registry.How to install in an air-gapped / restricted network environment?
How to install in an air-gapped / restricted network environment?
truefoundry), you only need to make the container images available in your private registry and update the helm values to point to it.- Copy images to your private registry — set up a registry mirror or copy images directly using the steps described in the FAQs above
- Update helm values to point to your private registry (see the helm value overrides in the same FAQs above)
- Continue with the standard installation on this page
How to integrate with AWS bedrock models from a different AWS account?
How to integrate with AWS bedrock models from a different AWS account?
- Add the following IAM policy to the control plane IAM role so that it can assume the IAM role of the AWS account that has the bedrock models:
- In the IAM role in the destination AWS account (which has bedrock access), add the following trust policy to allow the control plane IAM role to assume it:
- Now you can use the IAM role of the destination AWS account while integrating AWS bedrock models in the TrueFoundry AI gateway.
Do we need any NFS volumes in Kubernetes for the AI Gateway or Control Plane?
Do we need any NFS volumes in Kubernetes for the AI Gateway or Control Plane?
What is the structure of access logs
What is the structure of access logs
- logfmt
- json
Log format
Standard log format structure:| Log operator | Details |
|---|---|
| START_TIME | ISO timestamp for request start. eg. 2025-08-12 13:34:50 |
| LEVEL | info|warn|error |
| IP_ADDRESS | IP address of the caller. eg. ::ffff:10.99.55.142 |
| TENANT_NAME | Name of the tenant. eg. truefoundry |
| SUBJECT_TYPE | user|virtualaccount |
| SUBJECT_SLUG | Email or virtual account name. eg. tfy-user@truefoundry.com|demo-virtualaccount |
| MODEL_ID | Model ID. eg. openai-default/gpt-5 |
| METHOD | GET|POST|PUT |
| PATH | Path of the request. eg. /api/inference/openai/chat/completions |
| STATUS_CODE | 200|400|401|403|429|500 |
| DURATION | Duration of the request. eg. 12 |
| TRACE_ID | Trace ID of the request |
How to use SSO directly without using TrueFoundry Auth Server?
How to use SSO directly without using TrueFoundry Auth Server?
Requests to the gateway are timing out after a certain duration
Requests to the gateway are timing out after a certain duration


Can I get TrueFoundry metrics in Victoria Metrics instead of Prometheus?
Can I get TrueFoundry metrics in Victoria Metrics instead of Prometheus?
truefoundry-values.yaml file and upgrade the Helm release:VMServiceScrape and related custom resources for
scraping TrueFoundry metrics. It does not deploy Victoria Metrics itself —
you are responsible for installing and managing your own Victoria Metrics
instance.How to enable SSL for PostgreSQL connections?
How to enable SSL for PostgreSQL connections?
DB_SSL_MODE environment variable in your truefoundry-values.yaml.Supported DB_SSL_MODE values:| Mode | Encryption | Certificate Validation | Use Case |
|---|---|---|---|
disable | No | No | Local development or trusted networks |
no-verify | Yes | No | Managed databases with self-signed or unverified certs |
require | Yes | Yes (system CA store) | When you have a valid CA certificate and want full verification |
verify-ca | Yes | Yes (custom CA) | Same as require but explicitly checks CA |
verify-full | Yes | Yes (CA + hostname) | Strictest mode, validates CA and hostname |
| Variable | Purpose | Required |
|---|---|---|
DB_SSL_CA_PATH | Path to the server CA certificate file | For require, verify-ca, or verify-full modes |
DB_SSL_CERT_PATH | Path to the client certificate file (for mTLS) | Only for mTLS (GCP Cloud SQL, Azure Database for PostgreSQL) |
DB_SSL_KEY_PATH | Path to the client private key file (for mTLS) | Only for mTLS (GCP Cloud SQL, Azure Database for PostgreSQL) |
DB_SSL_CA_PATH), while GCP Cloud SQL and Azure Database for PostgreSQL may require all three certificate paths when client certificate authentication (mTLS) is enabled. Refer to the cloud-specific control plane documentation for detailed examples.no-verify)This is the simplest option for managed databases. It encrypts the connection but skips server certificate validation.require)This mode encrypts the connection and validates the server certificate. You must provide the appropriate certificate files for your database provider. The example below shows the full configuration with all three certificate paths (for GCP/Azure mTLS). For AWS RDS, only DB_SSL_CA_PATH is needed.Create a Kubernetes Secret containing your certificate files:truefoundry-values.yaml to mount the certificates and set the SSL paths:How to configure custom CA certificates?
How to configure custom CA certificates?
Method 1: Pass customCA as a multiline string
You can directly provide the CA certificate content as a multiline string in yourvalues.yaml:Method 2: Use an existing ConfigMap containing CA certificate(s)
If you already have your custom CA certificates in a Kubernetes ConfigMap, you can reference it directly. An initContainer will merge the custom CA with the system CAs.Create a ConfigMap with your custom CA certificate(s)
Reference the ConfigMap in your Helm values
truefoundry-values.yaml to reference the ConfigMap:Method 2b: Use an existing ConfigMap with overrideCAList
If you want the ConfigMap to replace the system CA bundle entirely instead of merging, set overrideCAList to true. In this mode, the ConfigMap is mounted directly at /etc/ssl/certs/ (no initContainer is used), so the ConfigMap must contain the full CA bundle (system + custom CAs).Prepare your CA certificate file
custom-ca.crt:/etc/ssl/certs/ca-certificates.crt with your custom CA included (system CAs + your custom CA).Create a ConfigMap from the complete ca-certificates.crt file
Reference the ConfigMap in your Helm values with overrideCAList
truefoundry-values.yaml to reference the ConfigMap with overrideCAList enabled:How to enable and access control plane monitoring (Grafana)?
How to enable and access control plane monitoring (Grafana)?
truefoundry-values.yaml:- Replace
<your-truefoundry-control-plane-url>with your actual control plane domain (e.g.,app.example.com) and<tenant-name>with your TrueFoundry tenant name provided during onboarding. - Only users with the admin role can access this endpoint.
- Make sure to include the trailing
/at the end of the URL. - If you already have Prometheus or VictoriaLogs in your cluster, you can point the monitoring stack to them using
externalServicesinstead of installing new instances.
How do you add default metadata to all requests passing via the gateway?
How do you add default metadata to all requests passing via the gateway?
DEFAULT_GATEWAY_METADATA environment variable on the gateway. The value should be a JSON string of key-value pairs.Add the following to your gateway configuration in values file of the gateway plane:How to use HTTPRoute to route traffic using Kubernetes Gateway API?
How to use HTTPRoute to route traffic using Kubernetes Gateway API?
Ingress resources. Use HTTPRoute when your cluster uses a Gateway API-compatible controller (e.g. Envoy Gateway, Istio, NGINX Gateway Fabric, GKE Gateway).Control plane (truefoundry chart)Add the following to your truefoundry-values.yaml, setting parentRefs to point to your existing Gateway:- Only one routing method should be enabled at a time. Disable
global.ingress.enabledandglobal.virtualservice.enabledwhen usinghttpRoute. - The
sectionNamemust match a named listener on yourGatewayresource. Omit it if your Gateway has a single unnamed listener. - TLS termination is handled by the parent
Gateway— no TLS configuration is needed on theHTTPRouteitself.