Helm chart for self-hosted Pydantic Logfire
This repository and the chart source it contains are licensed under the MIT License. Deploying the official self-hosted Pydantic Logfire product requires separate commercial access to private container images. Self-hosted Logfire is an Enterprise offering that requires a contract and payment. Please contact sales@pydantic.dev to discuss setting up a contract and pricing.
Use this README for the chart-level install flow and values reference. Use the Self-Hosted Production Requirements for background, architecture, and provider-specific procedures.
Choose one path:
- Local evaluation: use
values.dev.yaml. It deploys development-grade PostgreSQL, RustFS, and MailDev in the cluster. - Production: start from values.prod.yaml, replace the placeholders for your external services and routing, and adjust the sizing preset if needed.
Warning:
values.dev.yamlis only for local evaluation and testing. Do not use it for production deployments.
helm repo add pydantic https://charts.pydantic.dev/
helm repo updateLogfire images are private. Contact sales@pydantic.dev to get the key.json file for your image pull credentials.
Create the namespace before creating the secret:
kubectl create namespace logfire
kubectl -n logfire create secret docker-registry logfire-image-key \
--docker-server=us-docker.pkg.dev \
--docker-username=_json_key \
--docker-password="$(cat key.json)" \
--docker-email=YOUR-EMAIL@example.comReference the secret from your values file:
imagePullSecrets:
- logfire-image-keyIf you mirror Logfire images into your own registry, keep the chart version and mirrored image tags aligned.
By default, workload images use the chart appVersion tag unless you explicitly override tags in values.
From the chart repository package:
helm pull pydantic/logfire --untar
helm upgrade --install logfire ./logfire \
-f ./logfire/values.dev.yaml \
--namespace logfireOr from this source repository:
helm dependency build charts/logfire
helm upgrade --install logfire charts/logfire \
-f charts/logfire/values.dev.yaml \
--namespace logfireThen port-forward Logfire and MailDev in separate terminals:
kubectl -n logfire port-forward svc/logfire-service 8080:8080
kubectl -n logfire port-forward svc/logfire-maildev 1080:1080Open Logfire at http://localhost:8080 and MailDev at http://localhost:1080.
MailDev is available for testing local email flows.
Use the first-access step below to log in to the meta project.
Chart versions before 0.13.48 deployed MinIO for local evaluation. 0.13.48 and later deploy
RustFS instead. The upgrade deletes the old logfire-minio resources, including its
PersistentVolumeClaim, so local evaluation data is not carried over.
Values files that still set dev.deployMinio: true keep working: the chart deploys RustFS
behind the same logfire-minio Service name and uses the credentials from minio.auth, or
from objectStore.env.AWS_ACCESS_KEY_ID and objectStore.env.AWS_SECRET_ACCESS_KEY when
minio.auth is not set, so Logfire keeps authenticating. minio.persistence.existingClaim is
not carried over: RustFS always starts from its own claim, or from an emptyDir when persistence
is disabled.
To move to the new names, set dev.deployRustfs: true, remove dev.deployMinio, point
objectStore.env.AWS_ENDPOINT at http://logfire-rustfs:9000, and set
rustfs.auth.accessKey and rustfs.auth.secretKey to the same credentials as
objectStore.env.
When installing from this source repository, run helm dependency build charts/logfire after
pulling so the removed MinIO subchart does not linger in charts/.
A minimal production overlay is checked in at values.prod.yaml. Use it as a starting point for production installs and replace the placeholder hostnames, credentials, and provider-specific settings.
The starter uses Gateway API, but the chart supports both Gateway API and Ingress. Use whichever routing interface your cluster standardizes on. The core shape is:
imagePullSecrets:
- logfire-image-key
sizingPreset: standard
adminEmail: sre@example.com
# Optional: set a StorageClass for chart-managed PVCs:
# defaultStorageClassName: fast-storage
ingress:
enabled: false
gateway:
enabled: true
gatewayClassName: nginx
tls: true
hostnames:
- logfire.example.com
postgresDsn: postgresql://logfire_crud:PASSWORD@postgres.example.com:5432/crud
postgresFFDsn: postgresql://logfire_ff:PASSWORD@postgres.example.com:5432/ff
logfire-dex:
config:
enablePasswordDB: false
storage:
type: postgres
config:
host: postgres.example.com
port: 5432
user: logfire_dex
database: dex
password: PASSWORD
ssl:
mode: require
objectStore:
uri: s3://logfire-prod
env:
AWS_DEFAULT_REGION: us-east-1
logfire-redis:
enabled: false
redisDsn: redis://redis.example.com:6379Configure an identity provider under logfire-dex.config.connectors; see Authentication.
Before installing in production, confirm that you have:
- Image pull credentials configured through
imagePullSecrets. - Public hostname and TLS values set through
ingress.*orgateway.*, even if you expose the Service another way. - External PostgreSQL databases for
crud,ff, anddex. - Object storage using
s3://,gs://, oraz://. - A managed Redis endpoint configured through
redisDsn. - A Dex connector configured for your identity provider.
- HorizontalPodAutoscaler metrics available in the cluster when using a sizing preset.
- StorageClass behavior chosen for chart-managed PVCs: use the cluster default, or set
defaultStorageClassNamein values.prod.yaml.
Install with your production values file:
helm upgrade --install logfire pydantic/logfire \
-f values.prod.yaml \
--namespace logfireOn first install, the chart creates the logfire-meta organization and stores a frontend access token in a Kubernetes Secret:
kubectl -n logfire get secret logfire-meta-frontend-token \
-o "jsonpath={.data.logfire-meta-frontend-token}" | base64 -dOpen the meta project with your hostname and token:
https://logfire.example.com/logfire-meta/logfire-meta#token=LOGFIRE_META_FRONTEND_TOKEN
For local evaluation with the port-forward above, use http://localhost:8080/logfire-meta/logfire-meta#token=LOGFIRE_META_FRONTEND_TOKEN.
After you have access, create an invite link from Settings > Invite and assign the Admin organization role.
Set at least one public hostname so the chart can generate correct public URLs and CORS settings.
The hostname and TLS values are used by the application even when you expose logfire-service with infrastructure outside this chart.
For a standard Ingress:
ingress:
enabled: true
tls: true
hostnames:
- logfire.example.com
ingressClassName: nginxLogfire Live View requires WebSocket support. Ensure every proxy in front of
logfire-service preserves the WebSocket upgrade and Sec-WebSocket-Protocol
headers. Some ingress controllers require an explicit annotation. For the
F5 NGINX Ingress Controller:
ingress:
annotations:
nginx.org/websocket-services: logfire-serviceA successful WebSocket handshake normally returns 101 Switching Protocols.
The annotation above is specific to the F5 controller; use the configuration
required by your ingress or gateway implementation.
If you expose logfire-service directly instead of rendering an Ingress or Gateway, keep ingress.enabled: false and still set the public hostname and TLS behavior:
ingress:
enabled: false
tls: true
hostnames:
- logfire.example.comGateway API is supported through gateway.enabled.
Set gateway.create: true to create a Gateway, or gateway.create: false to attach the HTTPRoute to an existing Gateway.
Dex is used as the identity service for Logfire.
When creating an OAuth app in your provider, set the redirect URI to <logfire_url>/auth-api/callback, for example https://logfire.example.com/auth-api/callback.
Connector configuration is passed through to Dex; see the Dex connector overview for supported providers and settings.
Example GitHub connector using Kubernetes Secret references:
logfire-dex:
env:
- name: GITHUB_CLIENT_ID
valueFrom:
secretKeyRef:
name: my-github-secret
key: client-id
- name: GITHUB_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: my-github-secret
key: client-secret
config:
connectors:
- type: github
id: github
name: GitHub
config:
clientID: $GITHUB_CLIENT_ID
clientSecret: $GITHUB_CLIENT_SECRET
getUserInfo: trueUse groupOrganizationMapping to grant Logfire organization and project roles from identity-provider group IDs:
groupOrganizationMapping:
- group_id: engineering
organization_roles:
- organization_name: logfire-meta
role: member
project_roles:
- project_name: logfire-meta
role: writeThe mapping is authoritative for the organizations and projects it lists and is reconciled when a user signs in. Access in those scopes may be changed or removed; unlisted organizations and projects are left unchanged, and personal organization membership is preserved. When multiple matching groups grant roles in the same scope, the most permissive role is applied.
Setting groupOrganizationMapping overrides mappings managed through the public Group Mappings API. The API reports api_mapping_status: overridden_by_environment, and update requests return HTTP 409.
Logfire requires object storage for data. Supported URI schemes are s3://, gs://, and az://.
Provider credentials can come from objectStore.env, mounted secrets, or the Kubernetes service account used by Logfire.
For local evaluation, dev.deployRustfs (or the deprecated dev.deployMinio) deploys RustFS and
fills in any missing objectStore.uri, AWS_ENDPOINT, and AWS credential environment variables,
so the workloads reach the in-cluster bucket. An s3:// objectStore.uri also determines the
bucket RustFS creates.
Do not enable bucket versioning. Logfire manages its own data lifecycle, and bucket versioning can increase cost and interfere with lifecycle behavior.
Logfire requires three separate PostgreSQL databases: crud, ff, and dex.
They may run on the same PostgreSQL instance, but they must be separate databases to avoid schema collisions.
Each database user needs owner permissions so migrations can run.
Pydantic Logfire AI features can be enabled by setting the ai configuration in your values file:
ai:
model: provider:model-name
openAi:
apiKey: openai-api-keyStart with a sizing preset instead of hand-sizing every workload:
sizingPreset: standardUse large for higher-throughput deployments, standard for general production deployments, small for lower-traffic deployments that still need ingest and query headroom, or tiny for the smallest production footprint.
Presets apply workload resources, autoscaling, PDBs, and best-effort topology spreading for HA-sensitive workloads. FusionFire derives its execution settings from the effective resources.
They do not configure environment-specific prerequisites such as hostnames, TLS, PostgreSQL, object storage, image pull secrets, or StorageClasses.
Query API capacity is resource-oriented:
| Preset | CPU request | Memory request | Query cost capacity per pod | Scratch | Replicas |
|---|---|---|---|---|---|
tiny |
1 | 2 GiB | 1 | 1 GiB | 1–6 |
small |
2 | 4 GiB | 2 | 2 GiB | 1–8 |
standard |
4 | 8 GiB | 4 | 6 GiB | 3–8 |
large |
4 | 8 GiB | 4 | 6 GiB | 3–16 |
Query cost capacity defaults to the effective execution-worker CPU rounded up to a whole core. With separate query workers enabled, both the dispatcher and workers derive it from query-worker CPU. Advanced installations can override it with logfire-ff-query-api.maxQueryCostPerPod.
The standard preset keeps the public request path, query API, and ingest path at a minimum of three replicas.
The large preset inherits standard and increases selected FusionFire worker, ingest processor, and byte-cache capacity.
The small preset keeps ingest and the edge service more available while preserving a smaller footprint.
The tiny preset intentionally favors the smallest resource footprint over high availability.
If you do not set a sizing preset or per-workload resources, the chart does not render Kubernetes CPU/memory requests or limits.
FusionFire still needs internal execution limits, so those derived settings use the tiny preset resource baseline without rendering the preset's Kubernetes resources.
This increases some no-preset FusionFire budgets compared with earlier chart versions. Operators running constrained clusters should select a sizing preset or configure explicit workload resources.
Override individual workloads only after selecting a preset:
sizingPreset: standard
logfire-worker:
resources:
cpu: "500m"
memory: "1Gi"
ephemeralStorage: "1Gi"Nested resources.requests do not add mandatory limits, allowing workloads to use spare node capacity. The legacy flat resource shorthand continues to use the configured values for both requests and limits.
For Argo CD deployments, use the chart's existing-Secret options with an external secret controller. Updating a Kubernetes Secret does not restart pods that consume its values through environment variables, so configure a reload controller such as Reloader as well.
Add the reload controller's workload annotations to the relevant Secret values. The chart copies them only to workloads that consume that Secret and omits its Helm checksum annotations, leaving rotation to the reload controller:
postgresSecret:
enabled: true
name: logfire-postgres
annotations:
reloader.stakater.com/auto: "true"The same annotations pattern is supported by existingSecret, adminSecret, and existingGatewaySecret. The chart does not install a reload controller.
inClusterTls.enabled switches supported in-cluster service-to-service traffic to HTTPS with certificate verification.
This is independent from public ingress.tls or gateway.tls.
Certificate verification uses inClusterTls.caBundle.*, or the chart-created CA Secret when using cert-manager auto-Issuer mode.
CA bundle requirements by mode:
inClusterTls.certs.mode=certManagerwith emptyissuerRef.name: CA bundle is optional.inClusterTls.certs.mode=certManagerwith customissuerRef.name: set exactly one ofinClusterTls.caBundle.existingConfigMaporinClusterTls.caBundle.existingSecret.inClusterTls.certs.mode=existingSecrets: set exactly one ofinClusterTls.caBundle.existingConfigMaporinClusterTls.caBundle.existingSecret.
Cache consumers dial the headless logfire-ff-cache-byte-internal service directly and verify
that hostname, so the service certificate must include the bare logfire-ff-cache-byte-internal
DNS name. Keep the logfire-ff-cache-byte names and the namespace and cluster-domain variants as
well: existing certificates already carry them, and they keep the certificate valid if you roll
back to a chart that still runs the cache proxy.
The cache loads its certificate at startup, so after rotating the Secret restart
deployment/logfire-ff-cache-byte so the pods serve the new certificate, or configure a reload
controller as described in External Secrets and Automatic Reloads.
For Kind or local development, you can optionally deploy cert-manager as a Helm dependency with dev.deployCertManager.
When working from this repository, run helm dependency update charts/logfire to fetch dependency charts.
Chart-owned containers default to the controls a restricted Pod Security Standards namespace
requires: a non-root identity, no privilege escalation, all capabilities dropped, RuntimeDefault
seccomp, and a read-only root with the writable paths mounted.
Containers this chart takes from other projects (Redis, Dex, MailDev, the OTel collector, RustFS,
and the check-db-ready init container) keep the chart-wide securityContext; supply it or
per-workload values for them. HAProxy defaults to a restricted-compatible haproxy.securityContext.
ci/restricted-values.yaml is an example that the integration tests install into a namespace
labeled pod-security.kubernetes.io/enforce=restricted.
If you run Istio and see protocol or mTLS sidecar issues on HAProxy, migration, or infrastructure workloads, enable:
istio:
disableSidecarOnKnownWorkloads: trueThis sets sidecar.istio.io/inject: "false" on known-sensitive workloads.
You can still override labels per workload using <workload>.podLabels.
Once your self-hosted instance is running, configure client SDKs to send data to your endpoint:
import logfire
logfire.configure(
token='<your_logfire_token>',
advanced=logfire.AdvancedOptions(base_url="https://logfire.example.com")
)
logfire.info('Hello, {place}!', place='World')Before diving deeper, verify these common configuration issues:
-
Object Storage Permissions: Ensure the ServiceAccount (configured via
serviceAccount.annotations) has read/write access to your object storage bucket. For AWS, this means the IAM role needss3:GetObject,s3:PutObject,s3:DeleteObject, ands3:ListBucketpermissions. For GCP, the service account needs theStorage Object Adminrole on the bucket. -
StorageClass Exists: If you set
defaultStorageClassNameor any per-workloadstorageClassName, verify the StorageClass exists in your cluster:kubectl get storageclass
If omitted, Kubernetes uses the cluster's default StorageClass.
-
Image Pull Secrets: Ensure the secret exists in the same namespace as the release and is correctly referenced in
imagePullSecrets.
-
Troubleshooting Guide: If you encounter issues, your first stop should be the Troubleshooting Self-Hosted guide, which includes common issues and steps for accessing internal logs.
-
GitHub Issues: If your issue persists, please open up an issue with details about your deployment (Chart version, Kubernetes version, values file, any relevant error logs).
-
Enterprise Support: For commercial support, contact us at sales@pydantic.dev.
| Repository | Name | Version |
|---|---|---|
| https://charts.bitnami.com/bitnami | postgresql | 16.7.27 |
| https://charts.jetstack.io | cert-manager | v1.19.2 |
| Key | Type | Default | Description |
|---|---|---|---|
| adminEmail | string | "hello@example.dev" |
Starter admin email address |
| adminSecret | object | {"annotations":{},"enabled":false,"name":""} |
Existing Secret with the following keys: - logfire-admin-password - logfire-admin-totp-secret - logfire-admin-totp-recovery-codes (string containing a JSON list) |
| adminSecret.annotations | object | {} |
Optional workload annotations for external Secret reload controllers. Rendered on workloads that consume this existing Secret; not applied to Secret metadata. Per-workload annotations override duplicate keys. |
| adminSecret.enabled | bool | false |
Use an existing Secret (recommended for Argo CD users). |
| adminSecret.name | string | "" |
Name of the Kubernetes Secret resource. |
| affinity | object | {} |
Node/Pod affinity applied to all workloads |
| ai.azureOpenAi.apiKey | string | nil |
Azure OpenAI API key. Can be a plain string or a map with valueFrom (e.g., secretKeyRef). |
| ai.azureOpenAi.apiVersion | string | nil |
Azure OpenAI API version |
| ai.azureOpenAi.endpoint | string | nil |
Azure OpenAI endpoint |
| ai.chatModel | string | nil |
AI provider+model string for chat-oriented workloads. Falls back to ai.model in the application when unset. |
| ai.llmJudgeModel | string | nil |
AI provider+model string for LLM-as-a-judge evaluation workloads. Falls back to ai.model in the application when unset. |
| ai.model | string | nil |
AI provider+model string. Prefix the model with the provider (e.g., azure:gpt-4o). Use openai-chat:<model> to use the Chat Completions API for OpenAI-compatible endpoints. See https://ai.pydantic.dev/models/ for more information. |
| ai.openAi.apiKey | string | nil |
OpenAI API key. Can be a plain string or a map with valueFrom (e.g., secretKeyRef). |
| ai.openAi.baseUrl | string | nil |
OpenAI base URL for custom endpoints (e.g., Azure OpenAI proxy, local models). |
| ai.reasoningModel | string | nil |
AI provider+model string for reasoning-oriented worker workloads such as workflows. Falls back to ai.model in the chart when unset. |
| ai.vertexAi.anthropicBaseUrl | string | nil |
Anthropic Vertex partner-models API base URL. |
| ai.vertexAi.anthropicProjectId | string | nil |
GCP project ID for Anthropic Vertex models. |
| ai.vertexAi.multiRegionLocation | string | nil |
Vertex AI multi-region location for models offered only through US/EU multi-regions. Allowed values are us and eu. This is optional unless a configured model or fallback is google-cloud:gemini-3.5-flash. Do not use global as a data-residency workaround. |
| ai.vertexAi.region | string | nil |
Vertex AI region for regionally available models. Required when a configured model or fallback uses a regional google-cloud: model. |
| aiGatewayOauth | object | {"issuer":"","resourceUrl":""} |
AI gateway OAuth metadata configuration. If left empty, the chart derives self-hosted defaults from the primary Logfire URL: resourceUrl = <logfire.url>/proxy issuer = <logfire.url> |
| aiGatewayOauth.issuer | string | "" |
OAuth authorization server issuer URL used by the AI gateway. |
| aiGatewayOauth.resourceUrl | string | "" |
Public AI gateway resource URL (RFC 8707 audience). |
| cert-manager | object | {"installCRDs":true} |
cert-manager chart values (only used when dev.deployCertManager is true) |
| clusterDomain | string | "cluster.local" |
Kubernetes cluster domain for service discovery. |
| defaultStorageClassName | string | "" |
Default StorageClass for chart-managed PVCs. Set this when chart PVCs should use a specific class. Per-workload storageClassName values take precedence. Leave empty to let Kubernetes use the cluster default StorageClass. |
| dev.deployCertManager | bool | false |
Deploy cert-manager (NOT for production; includes cluster-scoped resources). |
| dev.deployMaildev | bool | false |
Deploy MailDev to test emails |
| dev.deployMinio | bool | false |
Deprecated alias for dev.deployRustfs that existing MinIO values keep working. While set, the chart keeps the logfire-minio Service name and uses the credentials from minio.auth (including minio.auth.existingSecret) or objectStore.env and the persistence from minio.persistence, so objectStore.env keeps matching the deployed object store. Remove it after moving to dev.deployRustfs and the rustfs.* values. |
| dev.deployPostgres | bool | false |
Deploy internal Postgres (NOT for production) |
| dev.deployRustfs | bool | false |
Deploy a local RustFS instance as S3-compatible object storage (NOT for production) |
| existingGatewaySecret | object | {"annotations":{},"enabled":false,"name":""} |
Existing Secret for the AI Gateway with the following keys: - key (gateway encryption key) - internalSecret (gateway internal secret) |
| existingGatewaySecret.annotations | object | {} |
Optional workload annotations for external Secret reload controllers. Rendered on workloads that consume this existing Secret; not applied to Secret metadata. Per-workload annotations override duplicate keys. |
| existingGatewaySecret.enabled | bool | false |
Use an existing Secret (recommended for Argo CD users). |
| existingGatewaySecret.name | string | "" |
Name of the Kubernetes Secret resource. |
| existingSecret | object | {"annotations":{},"enabled":false,"name":""} |
Existing Secret with the following keys: - logfire-dex-client-secret - logfire-encryption-key - logfire-meta-write-token - logfire-meta-frontend-token - logfire-jwt-secret - logfire-unsubscribe-secret - logfire-mcp-oauth-client-secret |
| existingSecret.annotations | object | {} |
Optional workload annotations for external Secret reload controllers. Rendered on workloads that consume this existing Secret; not applied to Secret metadata. Per-workload annotations override duplicate keys. |
| existingSecret.enabled | bool | false |
Use an existing Secret (recommended for Argo CD users). |
| existingSecret.name | string | "" |
Name of the Kubernetes Secret resource. |
| extraObjects | list | [] |
Additional Kubernetes objects to render with this release. Templating is supported. |
| fusionfireForceConsoleLogging | bool | false |
Also write Fusionfire telemetry to the container console in addition to sending it through OTLP. |
| fusionfireMaterializedViews | object | {"initialBackfillWindow":"1d","minSourceBytes":"5gb"} |
Materialized-view creation policy shared by all Fusionfire services. |
| fusionfireMaterializedViews.initialBackfillWindow | string | "1d" |
Maximum source-history window to materialize when a new view is created. Set to 0s to opt into a full-history initial backfill. Existing views retain the floor stamped when they were created. |
| fusionfireMaterializedViews.minSourceBytes | string | "5gb" |
Minimum source data written over the trailing seven days required to materialize a new view. Set to 0 to disable the source-volume floor. |
| gateway.addresses | list | [] |
Gateway addresses (optional, only used when create is true). Used to request specific addresses for the Gateway. |
| gateway.annotations | object | {} |
HTTPRoute annotations |
| gateway.create | bool | true |
Create a Gateway resource. Set to false to use an existing Gateway. |
| gateway.enabled | bool | false |
Enable the Gateway API resources (Gateway and/or HTTPRoute). Use this as an alternative to Ingress for environments using Gateway API. |
| gateway.filters | list | [] |
Additional HTTPRoute filters (e.g., request/response header modification). |
| gateway.gatewayAnnotations | object | {} |
Gateway annotations (only used when create is true) |
| gateway.gatewayClassName | string | "" |
GatewayClass name to use (required when create is true). Common values: istio, cilium, nginx, envoy-gateway, gke-l7-rilb, gke-l7-global-external-managed |
| gateway.gatewayLabels | object | {} |
Gateway labels (only used when create is true) |
| gateway.hostnames | list | [] |
Hostname(s) for the Gateway listener and HTTPRoute. If not set, falls back to ingress.hostnames for backward compatibility. These hostnames also override the app's URL/CORS hostnames whenever set. |
| gateway.labels | object | {} |
HTTPRoute labels (in addition to standard labels) |
| gateway.listeners | list | [] |
Gateway listeners configuration. If not specified, a default HTTP/HTTPS listener will be auto-generated based on tls setting. |
| gateway.maildevHostname | string | "" |
Hostname for the maildev HTTPRoute (only used when dev.deployMaildev is true). If not set, no hostname filter is applied to the maildev HTTPRoute. |
| gateway.matches | list | [] |
Path matches for the HTTPRoute rules. Defaults to a single prefix match on "/" if not specified. |
| gateway.name | string | "" |
Name of the Gateway. Used for both created Gateway and HTTPRoute parentRef. If not set, defaults to "logfire-gateway". |
| gateway.namespace | string | "" |
Namespace of an existing Gateway (only used when create is false). Leave empty to use the same namespace as the HTTPRoute. |
| gateway.sectionName | string | "" |
Section name within the Gateway to attach the HTTPRoute to (optional). Use this when the Gateway has multiple listeners. |
| gateway.timeouts | object | {} |
Timeout settings for the HTTPRoute backend. |
| gateway.tls | string | nil (uses ingress.tls) | Enable TLS/HTTPS for the Gateway listener. If not set, falls back to ingress.tls for backward compatibility. Also overrides the app's public URL scheme/CORS behavior (http vs https URLs) whenever set. |
| gateway.tlsSecretName | string | nil (uses ingress.secretName) | TLS Secret name for the Gateway listener certificate. If not set, falls back to ingress.secretName for backward compatibility. |
| groupOrganizationMapping | list | [] |
List of mapping to automatically assign members of OIDC group to logfire roles |
| haproxy | object | {"image":{"pullPolicy":"IfNotPresent","repository":"haproxy","tag":"3.4"},"podSecurityContext":{},"securityContext":{}} |
HAProxy image configuration (used by the service and feature-flag proxies) |
| haproxy.podSecurityContext | object | {} |
Pod SecurityContext for the HAProxy pod. Defaults to the chart-wide podSecurityContext. |
| haproxy.securityContext | object | {} |
Container SecurityContext for the HAProxy proxies. The chart default pins the numeric identity the image already uses, so the kubelet can verify runAsNonRoot, applies the portable controls (no privilege escalation, all capabilities dropped, RuntimeDefault seccomp), and makes the image root read-only. The chart-wide securityContext merges over that default and this value merges over both; set a field to null to clear it. HAProxy writes no file outside its mounts, so it needs no scratch volume. |
| hooksAnnotations | string | nil |
Custom annotations for migration Jobs (uncomment as needed, e.g., with Argo CD hooks) |
| image.pullPolicy | string | "IfNotPresent" |
Image pull policy |
| imagePullSecrets | list | [] |
Image pull secrets used by all pods |
| inClusterTls | object | {"caBundle":{"existingConfigMap":{"key":"ca.crt","name":""},"existingSecret":{"key":"ca.crt","name":""}},"certs":{"certManager":{"issuerRef":{"group":"cert-manager.io","kind":"Issuer","name":""}},"mode":"existingSecrets"},"enabled":false,"httpsPort":8443,"secretNamePrefix":""} |
Enable full in-cluster HTTPS with certificate verification. This is independent from ingress.tls / gateway.tls. NOTE: Implementation is incremental; see the README's "In-cluster HTTPS" section for usage notes. |
| inClusterTls.caBundle | object | {"existingConfigMap":{"key":"ca.crt","name":""},"existingSecret":{"key":"ca.crt","name":""}} |
CA bundle used by clients (HAProxy and other workloads) to verify service certificates. Required when: - certs.mode=existingSecrets - certs.mode=certManager with a non-empty certs.certManager.issuerRef.name (custom issuer) Optional when: - certs.mode=certManager with an empty issuerRef.name (chart-managed namespaced Issuer + CA) Provide exactly one of existingConfigMap or existingSecret. The referenced resource must exist in the same namespace as this Helm release. |
| inClusterTls.certs | object | {"certManager":{"issuerRef":{"group":"cert-manager.io","kind":"Issuer","name":""}},"mode":"existingSecrets"} |
Certificate provisioning for in-cluster TLS. certs.mode=certManager requires cert-manager CRDs to be installed in the cluster. (Helm will fail fast if cert-manager.io/v1 is not available, unless dev.deployCertManager=true.) |
| inClusterTls.certs.certManager | object | {"issuerRef":{"group":"cert-manager.io","kind":"Issuer","name":""}} |
Settings only used when certs.mode=certManager |
| inClusterTls.certs.certManager.issuerRef | object | {"group":"cert-manager.io","kind":"Issuer","name":""} |
IssuerRef used to issue service certificates. If name is empty, the chart will create a namespaced Issuer + CA (dev-friendly default). |
| inClusterTls.certs.mode | string | "existingSecrets" |
Use existingSecrets for customer-provided certs, or certManager to have the chart create cert-manager Certificate resources. |
| inClusterTls.httpsPort | int | 8443 |
Port used for in-cluster HTTPS on Services. Use a non-privileged port to avoid securityContext constraints. |
| inClusterTls.secretNamePrefix | string | "" |
Convention-based certificate secret naming. When enabled, the chart expects a kubernetes.io/tls Secret per service: --tls This also controls secret names used by chart-created cert-manager Certificates. If secretNamePrefix is empty, the prefix defaults to the Helm release name. |
| ingress.annotations | object | {} |
Ingress annotations. Logfire Live View requires WebSocket support, and some controllers require an explicit annotation. For example, F5 NGINX Ingress Controller uses nginx.org/websocket-services: logfire-service. |
| ingress.enabled | bool | true |
Enable the Ingress resource. If you are NOT using an ingress resource, you still need to set tls and hostnames via either ingress.* or gateway.* so the application can generate correct URLs/CORS. |
| ingress.hostname | string | "logfire.example.com" |
DEPRECATED (kept for backward compatibility). Use hostnames (list) for all new deployments. |
| ingress.hostnames | list | ["logfire.example.com"] |
Hostname(s) for Pydantic Logfire. Preferred method. Supports one or more hostnames; put the primary domain first. |
| ingress.ingressClassName | string | "nginx" |
IngressClass to use (e.g., nginx) |
| ingress.secretName | string | "logfire-frontend-cert" |
TLS Secret name if you want to do a custom one |
| ingress.tls | bool | false |
Enable TLS/HTTPS. Required for correct CORS behavior. |
| intakeOauth | object | {"resourceUrl":""} |
OTLP intake OAuth metadata configuration. When resourceUrl is empty, the chart derives the self-hosted resource URL from the primary Logfire URL: resourceUrl = <logfire.url>/v1 |
| intakeOauth.resourceUrl | string | "" |
Public OTLP intake resource URL (RFC 8707 audience). |
| istio | object | {"disableSidecarOnKnownWorkloads":false} |
Istio compatibility options |
| istio.disableSidecarOnKnownWorkloads | bool | false |
When enabled, automatically sets sidecar.istio.io/inject: "false" on known-sensitive workloads: logfire-service, logfire-backend-migrations, logfire-ff-migrations, logfire-redis, and logfire-otel-collector. You can still override per workload via <workload>.podLabels. |
| keepAliveTimeout | string | "120s" |
Idle keep-alive timeout for the HAProxy entry point. Keep it above the idle timeout of the ingress or tunnel in front of the release; if HAProxy closes an idle connection first, the client sees a 502/520 when it reuses it. |
| logfire-ai-gateway | object | disabled | Autoscaling & resources for the logfire-ai-gateway pod |
| logfire-ai-gateway.enabled | bool | false |
Enable the AI gateway service |
| logfire-ai-gateway.proxyTimeout | string | "600s" |
HAProxy inactivity timeout for public /proxy requests to the AI gateway. |
| logfire-dex | object | {"annotations":{},"config":{"connectors":[],"enablePasswordDB":true,"storage":{"config":{"database":"dex","host":"logfire-postgres","password":"postgres","port":5432,"ssl":{"mode":"disable"},"user":"postgres"},"type":"postgres"}},"labels":{},"podAnnotations":{},"podLabels":{},"service":{"annotations":{}}} |
Configuration, autoscaling & resources for logfire-dex deployment |
| logfire-dex.annotations | object | {} |
Workload annotations |
| logfire-dex.config | object | {"connectors":[],"enablePasswordDB":true,"storage":{"config":{"database":"dex","host":"logfire-postgres","password":"postgres","port":5432,"ssl":{"mode":"disable"},"user":"postgres"},"type":"postgres"}} |
Dex configuration (see https://dexidp.io/docs/) |
| logfire-dex.config.connectors | list | [] |
Dex auth connectors (see https://dexidp.io/docs/connectors/) The redirectURI can be omitted—it will be generated automatically. If specified, the custom value will be honored. |
| logfire-dex.config.enablePasswordDB | bool | true |
Enable password authentication. Set to false if undesired, but ensure another connector is configured first. |
| logfire-dex.config.storage | object | {"config":{"database":"dex","host":"logfire-postgres","password":"postgres","port":5432,"ssl":{"mode":"disable"},"user":"postgres"},"type":"postgres"} |
Dex storage configuration (see https://dexidp.io/docs/configuration/storage/) |
| logfire-dex.labels | object | {} |
Workload labels |
| logfire-dex.podAnnotations | object | {} |
Pod annotations |
| logfire-dex.podLabels | object | {} |
Pod labels |
| logfire-dex.service.annotations | object | {} |
Service annotations |
| logfire-ff-cache-byte | object | {"clientSideRouting":{"zoneAware":false},"pdb":{},"replicas":3,"scratchVolume":{"storage":"32Gi"}} |
Autoscaling & resources for the byte cache pods |
| logfire-ff-cache-byte.clientSideRouting.zoneAware | bool | false |
Restrict direct routing to zone-local cache pods. Requires nodes/get cluster RBAC and adds soft zone/hostname spreading. Cache replicas must cover every cache-consumer zone; local misses use durable storage. |
| logfire-ff-cache-byte.replicas | int | 3 |
Number of byte-cache replicas when autoscaling is not configured. |
| logfire-ff-cache-byte.scratchVolume | object | {"storage":"32Gi"} |
Cache byte ephemeral volume. storage accepts Kubernetes quantities (e.g. 32Gi, 1.5Gi, 10G) of at least 1Mi. |
| logfire-ff-ingest | object | {"annotations":{},"env":[{"name":"RUST_LOG","value":"warn,otel::tracing=info"}],"labels":{},"podAnnotations":{},"podLabels":{},"service":{"annotations":{}},"volumeClaimTemplates":{"storage":"16Gi"}} |
Autoscaling & resources for the logfire-ff-ingest pod |
| logfire-ff-ingest-processor | object | {"annotations":{},"env":[{"name":"RUST_LOG","value":"warn"}],"labels":{},"podAnnotations":{},"podLabels":{},"service":{"annotations":{}}} |
Autoscaling & resources for the logfire-ff-ingest-processor pod |
| logfire-ff-ingest-processor.annotations | object | {} |
Workload annotations |
| logfire-ff-ingest-processor.env | list | [{"name":"RUST_LOG","value":"warn"}] |
Extra env vars for the ingest processor pod |
| logfire-ff-ingest-processor.labels | object | {} |
Workload labels |
| logfire-ff-ingest-processor.podAnnotations | object | {} |
Pod annotations |
| logfire-ff-ingest-processor.podLabels | object | {} |
Pod labels |
| logfire-ff-ingest-processor.service.annotations | object | {} |
Service annotations |
| logfire-ff-ingest.annotations | object | {} |
Workload annotations |
| logfire-ff-ingest.env | list | [{"name":"RUST_LOG","value":"warn,otel::tracing=info"}] |
Extra env vars for the ingest pod |
| logfire-ff-ingest.labels | object | {} |
Workload labels |
| logfire-ff-ingest.podAnnotations | object | {} |
Pod annotations |
| logfire-ff-ingest.podLabels | object | {} |
Pod labels |
| logfire-ff-ingest.service.annotations | object | {} |
Service annotations |
| logfire-ff-ingest.volumeClaimTemplates | object | {"storage":"16Gi"} |
Configuration for the StatefulSet PersistentVolumeClaim template |
| logfire-ff-ingest.volumeClaimTemplates.storage | string | "16Gi" |
Storage provisioned for each pod |
| logfire-ff-maintenance-scheduler | object | {"env":[]} |
Environment overrides for the maintenance scheduler pod |
| logfire-ff-query-api | object | {"env":[]} |
Environment overrides for the query API pod |
| logfire-redis.affinity | object | {} |
Affinity for the bundled Redis pod. |
| logfire-redis.enabled | bool | true |
Deploy Redis as part of this chart. Disable to use an external Redis instance. The bundled Redis is a single-node instance intended for development, evaluation, and simple self-contained installs. It is not highly available, and upgrades that change its pod template cause a brief interruption while Redis is replaced. For production, disable this and set redisDsn to a managed Redis endpoint. |
| logfire-redis.image | object | {"pullPolicy":"IfNotPresent","repository":"redis","tag":"7.2"} |
Redis image configuration |
| logfire-redis.image.pullPolicy | string | "IfNotPresent" |
Redis image pull policy |
| logfire-redis.image.repository | string | "redis" |
Redis image repository |
| logfire-redis.image.tag | string | "7.2" |
Redis image tag |
| logfire-redis.livenessProbe | object | {"initialDelaySeconds":30,"periodSeconds":10,"tcpSocket":{"port":"redis"},"timeoutSeconds":1} |
Redis liveness probe. Override or set to null to disable. |
| logfire-redis.nodeSelector | object | {} |
Node selector for the bundled Redis pod. |
| logfire-redis.pdb | object | {} |
PodDisruptionBudget override for the bundled Redis pod. Defaults to minAvailable: 1 when empty. Example: maxUnavailable: 0 |
| logfire-redis.persistence | object | {"accessModes":["ReadWriteOnce"],"annotations":{},"enabled":false,"existingClaim":"","size":"1Gi","storageClassName":""} |
Persistence for the bundled Redis data directory. This improves recovery across pod restarts but does not make Redis highly available. |
| logfire-redis.podAnnotations | object | {} |
Pod annotations for the bundled Redis pod. Example: cluster-autoscaler.kubernetes.io/safe-to-evict: "false" |
| logfire-redis.readinessProbe | object | {"initialDelaySeconds":5,"periodSeconds":10,"tcpSocket":{"port":"redis"},"timeoutSeconds":1} |
Redis readiness probe. Override or set to null to disable. |
| logfire-redis.resources | object | {} |
Resource requests/limits. Supports the chart shorthand, for example: cpu: "100m" memory: "128Mi" or native requests/limits. |
| logfire-redis.startupProbe | object | {"failureThreshold":30,"periodSeconds":10,"tcpSocket":{"port":"redis"},"timeoutSeconds":1} |
Redis startup probe. Override or set to null to disable. |
| logfire-redis.tolerations | list | [] |
Tolerations for the bundled Redis pod. |
| logfire-redis.topologySpreadConstraints | list | [] |
Topology spread constraints for the bundled Redis pod. |
| logfire-remote-mcp | object | {"enabled":true} |
Autoscaling & resources for the logfire-remote-mcp pod |
| logfire-remote-mcp.enabled | bool | true |
Enable the remote MCP service. When disabled, the deployment is not rendered and the /mcp and /.well-known/oauth-protected-resource/mcp haproxy routes are removed. |
| maildev | object | {"image":{"pullPolicy":"IfNotPresent","repository":"maildev/maildev","tag":"latest"},"podSecurityContext":{},"securityContext":{}} |
MailDev configuration (only used when dev.deployMaildev is true) |
| maildev.podSecurityContext | object | {} |
Pod SecurityContext for the MailDev pod. Defaults to the chart-wide podSecurityContext when unset. |
| maildev.securityContext | object | {} |
Container SecurityContext for the MailDev container. Merged over the chart-wide securityContext, so set fields here to override it. Set this when running under a restricted PodSecurity policy, e.g.: runAsNonRoot: true runAsUser: 1000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] seccompProfile: type: RuntimeDefault |
| nodeSelector | object | {} |
Node selector applied to all workloads |
| objectStore | object | {"env":{},"sseCKeyB64":null,"uri":null,"volumeMounts":[],"volumes":[]} |
Object storage details |
| objectStore.env | object | {} |
Additional environment variables for the object store connection. String values support Helm templating. When the in-cluster RustFS store is enabled, missing AWS_ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_ALLOW_HTTP values are filled in from the in-cluster store. |
| objectStore.sseCKeyB64 | string | nil |
Opt-in S3 Server-Side Encryption with Customer-provided Keys (SSE-C). Base64-encoded 256-bit key applied to all S3 PUT/GET/HEAD/multipart/copy requests. Only used when the object store is S3. Can be a plain string or a map with valueFrom (e.g., secretKeyRef). IMPORTANT: this MUST be set from day one on an empty bucket. Enabling it on a bucket that already contains FusionFire data will break all reads of the pre-existing objects. losing the key means losing the data — AWS does not store it. |
| objectStore.uri | string | nil |
URI for object storage (e.g., s3://bucket). Supports Helm templating, e.g. s3://logfire-{{ .Release.Name }} to derive a bucket per release. When dev.deployRustfs (or the deprecated dev.deployMinio) is enabled and this is empty, it defaults to s3://<rustfs.bucket>. |
| objectStore.volumeMounts | list | [] |
Volume mounts for object store credentials. The chart reserves the mount paths /tmp, /scratch, and /fusionfire/ingest-data for its own Fusionfire volumes, and adds /etc/tls and /etc/logfire/incluster-ca when in-cluster TLS is enabled. |
| objectStore.volumes | list | [] |
Volumes for object store credentials. The chart reserves the volume names tmp, scratch-data, and ingest-data for its own Fusionfire volumes, and adds logfire-incluster-tls and logfire-incluster-ca-bundle when in-cluster TLS is enabled. |
| otelResourceAttributes | object | {} |
Additional OTEL resource attributes to stamp onto internal telemetry emitted by Logfire workloads. These are merged on top of the chart defaults and can override them. Example: deployment.environment.name: prod service.namespace: logfire |
| otel_collector | object | {"exporter":{"endpoint":"http://logfire-ff-ingest:8012","headers":{},"tls":{"insecure":true}},"image":{"pullPolicy":"IfNotPresent","repository":"ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib","tag":"0.160.0"},"prometheus":{"add_metric_suffixes":false,"enable_open_metrics":true,"enabled":false,"endpoint":"0.0.0.0","metric_expiration":"180m","port":9090,"resource_to_telemetry_conversion":{"enabled":true},"send_timestamp":true},"sendingQueueBytes":67108864} |
otel-collector configuration |
| otel_collector.exporter | object | {"endpoint":"http://logfire-ff-ingest:8012","headers":{},"tls":{"insecure":true}} |
exporter configuration for the otlp_http exporter Override these to send telemetry data to a different OTLP-compatible destination. |
| otel_collector.sendingQueueBytes | int | 67108864 |
Byte size of the OTLP/HTTP exporter sending queue. The sizing presets set this per profile; this value applies when no sizing preset is used. |
| podSecurityContext | object | {} |
Pod SecurityContext (https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod) See: https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context for details Fusionfire and bcache pods merge this context over their default fsGroup: 1000 and fsGroupChangePolicy: OnRootMismatch, which let their uid 1000 images write chart-managed scratch and ingest volumes. A per-service podSecurityContext wins over both. |
| postgresDsn | string | "postgresql://postgres:postgres@logfire-postgres:5432/crud" |
Postgres DSN used for the crud database |
| postgresFFDsn | string | "postgresql://postgres:postgres@logfire-postgres:5432/ff" |
Postgres DSN used for the ff database |
| postgresSecret | object | {"annotations":{},"enabled":false,"name":""} |
User-provided Secret containing database credentials Must include postgresDsn and postgresFFDsn keys. |
| postgresSecret.annotations | object | {} |
Optional workload annotations for external Secret reload controllers. Rendered on workloads that consume this existing Secret; not applied to Secret metadata. Per-workload annotations override duplicate keys. |
| postgresSecret.enabled | bool | false |
Set to true to use an existing Secret (recommended for Argo CD users). |
| postgresSecret.name | string | "" |
Name of the Kubernetes Secret resource. |
| postgresql.auth.postgresPassword | string | "postgres" |
|
| postgresql.fullnameOverride | string | "logfire-postgres" |
|
| postgresql.image.registry | string | "docker.io" |
|
| postgresql.image.repository | string | "bitnamilegacy/postgresql" |
|
| postgresql.postgresqlDataDir | string | "/var/lib/postgresql/data/pgdata" |
|
| postgresql.primary.initdb.scripts."create_databases.sql" | string | "CREATE DATABASE crud;\nCREATE DATABASE dex;\nCREATE DATABASE ff;\n" |
|
| postgresql.primary.persistence.mountPath | string | "/var/lib/postgresql" |
|
| postgresql.primary.persistence.size | string | "10Gi" |
|
| postgresql.primary.resourcesPreset | string | "small" |
|
| priorityClassName | string | "" |
Pod priority class See: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority). |
| rateLimits | object | {} |
Configure Rate Limiting rules for Logfire endpoints |
| redisDsn | string | "redis://logfire-redis:6379" |
Redis DSN. Change if using an external Redis instance. |
| releaseVersion | string | "v2026-09-23.01" |
Platform release tag reported to API clients in the Logfire-Version response header, for example v2026-09-15.01. Set this when releasing a chart built from a platform release so clients can tell which release an instance runs. When empty, workloads report their image identity, which clients treat as an unknown version. |
| revisionHistoryLimit | int | 2 |
Number of deployment revisions to keep. See: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#clean-up-policy) May be set to 0 when using a GitOps workflow. |
| rustfs | object | {"auth":{"accessKey":"logfire-rustfs","secretKey":"logfire-rustfs"},"bucket":"logfire","image":{"pullPolicy":"","repository":"rustfs/rustfs","tag":"1.0.0"},"persistence":{"enabled":true,"existingClaim":"","size":"32Gi","storageClassName":""},"podSecurityContext":{},"resources":{"limits":{"memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"securityContext":{}} |
RustFS configuration (only used when dev.deployRustfs is true) |
| rustfs.auth | object | {"accessKey":"logfire-rustfs","secretKey":"logfire-rustfs"} |
Root credentials. Ignored while dev.deployMinio is set. Set objectStore.env.AWS_ACCESS_KEY_ID and objectStore.env.AWS_SECRET_ACCESS_KEY to the same values. |
| rustfs.bucket | string | "logfire" |
Bucket that RustFS creates at startup when objectStore.uri is not an s3:// URI. With an s3:// objectStore.uri, the bucket in the URI is used. |
| rustfs.image.pullPolicy | string | "" |
RustFS image pull policy. Defaults to image.pullPolicy when unset. |
| rustfs.image.repository | string | "rustfs/rustfs" |
RustFS image repository |
| rustfs.image.tag | string | "1.0.0" |
RustFS image tag |
| rustfs.persistence.enabled | bool | true |
Store data on a PersistentVolumeClaim. Set false to use an emptyDir. Ignored while dev.deployMinio is set and minio.persistence is present. |
| rustfs.persistence.existingClaim | string | "" |
Existing PersistentVolumeClaim to use in place of a chart-managed claim |
| rustfs.persistence.size | string | "32Gi" |
Size of the chart-managed claim |
| rustfs.persistence.storageClassName | string | "" |
Storage class for the chart-managed claim. Defaults to defaultStorageClassName. |
| rustfs.podSecurityContext | object | {} |
Pod SecurityContext for the RustFS pod. Merged over the chart-wide podSecurityContext and a default of fsGroup: 10001. |
| rustfs.resources | object | {"limits":{"memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}} |
Resource requests and limits for the RustFS container |
| rustfs.securityContext | object | {} |
Container SecurityContext for the RustFS container. Merged over the chart-wide securityContext, so set fields here to override it. |
| securityContext | object | {} |
Container SecurityContext (https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container) See: https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1 for details Chart-owned containers (the Python, Fusionfire, gateway, and frontend images) and HAProxy merge this context over chart defaults: the image's verified identity, allowPrivilegeEscalation: false, all capabilities dropped, the RuntimeDefault seccomp profile, and a read-only root. A per-workload <workload>.securityContext merges over both layers, for example logfire-backend.securityContext or haproxy.securityContext. Maildev and RustFS merge it under their own securityContext values. Set a field to null to clear it, for example runAsUser: null for OpenShift, or set readOnlyRootFilesystem: false to restore a writable root. |
| serviceAccount | object | {"annotations":{},"create":false,"name":""} |
ServiceAccount configuration |
| serviceAccount.annotations | object | {} |
Annotations to add to the ServiceAccount (e.g., for IAM roles) Example for AWS IRSA: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-role Example for GCP Workload Identity: annotations: iam.gke.io/gcp-service-account: my-sa@my-project.iam.gserviceaccount.com |
| serviceAccount.create | bool | false |
Create a ServiceAccount |
| serviceAccount.name | string | "" |
Name of the ServiceAccount. If not set and create is true, a name is generated using the fullname template. If create is false and this is not set, the default ServiceAccount is used. |
| serviceAccountName | string | "default" |
DEPRECATED: Use serviceAccount.name instead. Kept for backward compatibility. @deprecated |
| sizingPreset | string | "" |
Workload sizing preset. Leave empty to skip preset sizing, or set to large, standard, small, or tiny to apply built-in customer sizing defaults. |
| smtp.host | string | nil |
SMTP server hostname |
| smtp.password | string | nil |
SMTP password. Can be a plain string or a map with valueFrom (e.g., secretKeyRef). |
| smtp.port | int | 25 |
SMTP server port |
| smtp.use_tls | bool | false |
Use TLS for SMTP |
| smtp.username | string | nil |
SMTP username. Can be a plain string or a map with valueFrom (e.g., secretKeyRef). |
| tokenRedis | object | {"dsn":"","prefix":""} |
Redis settings for auth token caches. Empty DSN falls back to redisDsn. Use a prefix only when sharing one Redis instance with other data. |
| tokenRedis.dsn | string | "" |
Redis DSN for auth token caches. |
| tokenRedis.prefix | string | "" |
Key prefix for auth token cache keys. |
| tolerations | list | [] |
Tolerations applied to all workloads |
| topologySpreadConstraints | list | [] |
topologySpreadConstraints applied to all workloads |
| usageRedis | object | {"dsn":"","prefix":""} |
Redis settings for usage, autocomplete, and rate limiting data. Empty DSN falls back to redisDsn. Use a prefix only when sharing one Redis instance with other data. |
| usageRedis.dsn | string | "" |
Redis DSN for usage, autocomplete, and rate limiting data. |
| usageRedis.prefix | string | "" |
Key prefix for usage keys. |
| variablesApiKey | string | "" |
Client-safe API key used by the frontend to evaluate external managed variables through OFREP. The key is written to the public runtime configuration, so it must only have the project:read_external_variables scope. |
Autogenerated from chart metadata using helm-docs v1.14.2