Files
nicktrn 8f9db53350 feat(supervisor): configurable tolerations for run pods (#4491)
## Summary

Self-hosted Kubernetes deployments can now add tolerations to run pods,
so runs
can schedule onto tainted nodes. Previously the only way to do this was
to patch
the supervisor.

`KUBERNETES_RUNNER_TOLERATIONS` takes a comma separated list of
`key=value:effect`, or `key:effect` to tolerate any value. It applies to
every
run pod, and for runs from a schedule tree it merges with the existing
`KUBERNETES_SCHEDULED_RUN_TOLERATIONS`. Left unset, nothing changes: no
tolerations are added and the pod spec leaves the field off entirely.

The Helm chart takes it as a list:

```yaml
supervisor:
  config:
    kubernetes:
      runnerTolerations:
        - dedicated=runs:NoSchedule
        - spot:NoExecute
```

## Naming

The issue proposed `KUBERNETES_WORKER_TOLERATIONS`. This ships as
`KUBERNETES_RUNNER_TOLERATIONS` instead, because `RUNNER_*` is already
the prefix
for run pod settings (`RUNNER_HEARTBEAT_INTERVAL_SECONDS`,
`RUNNER_ADDITIONAL_ENV_VARS`, and `DOCKER_RUNNER_NETWORKS` for the
Docker
equivalent), whereas "worker" refers to the supervisor itself throughout
this app.

## Validation

Keys and values are checked against the Kubernetes naming rules when the
supervisor starts, so `dedicated=prod runs:NoSchedule` fails immediately
with a
message naming the offending entry. Without that check a bad value is
accepted at
startup and then rejected by the API server on every pod create, which
stops all
runs with the cause buried in an API error.
`KUBERNETES_WORKER_NODETYPE_LABEL` is
trimmed and validated for the same reason: surrounding whitespace is not
valid in
a label value, so a padded value fails every pod create today.

## Node selector off switch

`KUBERNETES_WORKER_NODETYPE_LABEL` accepts an empty string to skip the
node
selector entirely, so runs schedule on any node. This already worked and
the Helm
chart has always shipped it empty, but it was not documented. It is now.

The issue also asked for general node affinity configuration. That is
not
included: the node selector off switch plus tolerations covers the
reported
problem, and a free form affinity setting is a much larger config
surface to
commit to.

Fixes #4458
2026-08-03 15:40:41 +00:00

1016 lines
30 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
global:
imageRegistry: ""
imagePullSecrets: []
storageClass: ""
security:
# Required when using bitnami legacy images
allowInsecureImages: true
nameOverride: ""
fullnameOverride: ""
# Secrets configuration
# No working defaults are shipped. Leave a secret empty and the chart generates a
# strong random value on first install, retained across upgrades (so sessions and
# encrypted data survive). Set a value explicitly to control it yourself, or use
# secrets.existingSecret / external secret management. Explicit values win.
secrets:
# Enable/disable creation of secrets
# Set to false to use external secret management (Vault, Infisical, External Secrets, etc.)
# When disabled, you can also use extraEnvVars and podAnnotations for secret injection
enabled: true
# Name of existing secret to use instead of creating one
# If empty, a secret will be created with the values below
# The secret must contain the following keys:
# - SESSION_SECRET
# - MAGIC_LINK_SECRET
# - ENCRYPTION_KEY
# - PROVIDER_SECRET
# - COORDINATOR_SECRET
# - MANAGED_WORKER_SECRET
existingSecret: ""
# Session secret for user authentication
sessionSecret: "" # Leave empty to auto-generate, or set a strong value.
# Magic link secret for passwordless login
magicLinkSecret: "" # Leave empty to auto-generate, or set a strong value.
# Encryption key for sensitive data
encryptionKey: "" # Leave empty to auto-generate, or set a strong value.
# Provider socket secret
providerSecret: "" # Leave empty to auto-generate, or set a strong value.
# Coordinator socket secret
coordinatorSecret: "" # Leave empty to auto-generate, or set a strong value.
# Worker secret for managed worker authentication
managedWorkerSecret: "" # Leave empty to auto-generate, or set a strong value.
# Object store credentials moved to s3.auth and s3.external section
# Webapp configuration
webapp:
image:
registry: ghcr.io
repository: triggerdotdev/trigger.dev
tag: "" # Defaults to Chart.appVersion when empty
pullPolicy: IfNotPresent
# Init container for shared directory setup
volumePermissions:
image:
registry: docker.io
repository: busybox
tag: "1.35"
pullPolicy: IfNotPresent
# Sidecar for token syncing
tokenSyncer:
image:
registry: docker.io
repository: bitnamilegacy/kubectl
tag: "1.28"
pullPolicy: IfNotPresent
# Origin configuration
appOrigin: "http://localhost:3040"
loginOrigin: "http://localhost:3040"
apiOrigin: "http://localhost:3040"
replicaCount: 1
service:
type: ClusterIP
port: 3030
targetPort: 3000
podAnnotations: {}
# podSecurityContext:
# fsGroup: 1000
# securityContext:
# runAsNonRoot: true
# runAsUser: 1000
nodeSelector: {}
tolerations: []
affinity: {}
# Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template
topologySpreadConstraints: []
logLevel: "info"
gracefulShutdownTimeout: 1000
# Bootstrap configuration
bootstrap:
enabled: true
workerGroupName: "bootstrap"
workerTokenPath: "/home/node/shared/worker_token"
# Limits
limits:
taskPayloadOffloadThreshold: 524288 # 512KB
taskPayloadMaximumSize: 3145728 # 3MB
batchTaskPayloadMaximumSize: 1000000 # 1MB
taskRunMetadataMaximumSize: 262144 # 256KB
defaultEnvExecutionConcurrencyLimit: 100
defaultOrgExecutionConcurrencyLimit: 300
# Resources
resources:
{}
# Example resource configuration:
# limits:
# cpu: 1000m
# memory: 2Gi
# requests:
# cpu: 500m
# memory: 1Gi
# Connectivity check configuration
connectivityCheck:
postgres: true # Set to false to disable DATABASE_HOST env var (overrides postgres.external.connectivityCheck)
# Extra environment variables for webapp
extraEnvVars:
[]
# - name: CUSTOM_VAR
# value: "custom-value"
# - name: SECRET_VAR
# valueFrom:
# secretKeyRef:
# name: my-secret
# key: secret-key
#
# Example: PostgreSQL SSL with custom CA certificate
# - name: NODE_EXTRA_CA_CERTS
# value: "/etc/ssl/certs/postgres-ca.crt"
# Extra volumes for the webapp pod
extraVolumes:
[]
# - name: config-volume
# configMap:
# name: my-config
# - name: secret-volume
# secret:
# secretName: my-secret
#
# Example: PostgreSQL SSL CA certificate volume
# - name: postgres-ca-cert
# secret:
# secretName: postgres-ca-secret
# items:
# - key: ca.crt
# path: postgres-ca.crt
# Extra volume mounts for the webapp container
extraVolumeMounts:
[]
# - name: config-volume
# mountPath: /etc/config
# readOnly: true
# - name: secret-volume
# mountPath: /etc/secrets
# readOnly: true
#
# Example: PostgreSQL SSL CA certificate mount
# - name: postgres-ca-cert
# mountPath: /etc/ssl/certs
# readOnly: true
# ServiceMonitor for Prometheus monitoring
serviceMonitor:
enabled: false
interval: "30s"
path: "/metrics"
labels: {}
basicAuth: {}
# Health probe configuration
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 5
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 5
successThreshold: 1
startupProbe:
enabled: false
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 60
successThreshold: 1
clickhouse:
logLevel: "info" # one of: log, error, warn, info, debug
runReplication:
logLevel: "info" # one of: log, error, warn, info, debug
# ServiceAccount configuration
serviceAccount:
create: true
# Name of the ServiceAccount to use. Required when create is false - otherwise
# the token-syncer RoleBinding would bind to the namespace's "default" SA.
name: ""
# Annotations to add to the ServiceAccount (e.g. eks.amazonaws.com/role-arn for IRSA)
annotations: {}
# Observability configuration (OTel)
observability:
tracing:
exporterUrl: ""
exporterAuthHeaders: ""
loggingEnabled: "0"
samplingRate: "20"
instrumentPrismaEnabled: "0"
disabled: "0"
logging:
exporterUrl: ""
# Log auth headers are currently set to tracing.exporterAuthHeaders
metrics:
exporterUrl: ""
exporterAuthHeaders: ""
exporterEnabled: "0"
exporterIntervalMs: 30000
# Webapp ingress configuration
ingress:
enabled: false
className: "traefik"
# Custom annotations for the ingress resource
# Note: The following annotation keys are reserved and will be automatically set:
# - cert-manager.io/cluster-issuer (when certManager.enabled is true)
# - external-dns.alpha.kubernetes.io/hostname (when externalDns.enabled is true)
# - external-dns.alpha.kubernetes.io/ttl (when externalDns.enabled is true)
annotations: {}
certManager:
enabled: false
clusterIssuer: "letsencrypt-prod"
externalDns:
enabled: false
hostname: ""
ttl: "300"
hosts:
- host: trigger.local
paths:
- path: /
pathType: Prefix
tls:
[]
# - secretName: trigger-tls
# hosts:
# - trigger.local
# Supervisor configuration
supervisor:
image:
registry: ghcr.io
repository: triggerdotdev/supervisor
tag: "" # Defaults to Chart.appVersion when empty
pullPolicy: IfNotPresent
podAnnotations: {}
# podSecurityContext:
# fsGroup: 1000
# securityContext:
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
ports:
workload: 3000
metrics: 9088
resources: {}
config:
kubernetes:
forceEnabled: true
namespace: "" # Default: uses release namespace
workerNodetypeLabel: "" # When set, runs will only be scheduled on nodes with "nodetype=<label>"
runnerTolerations: [] # Run pod tolerations, e.g. ["dedicated=runs:NoSchedule"]
ephemeralStorageSizeLimit: "" # Default: 10Gi
ephemeralStorageSizeRequest: "" # Default: 2Gi´
podCleaner:
enabled: true
batchSize: 100
intervalMs: 10000 # 10 seconds´
failedPodHandler:
enabled: true
reconnectIntervalMs: 1000
workloadApi:
enabled: true
protocol: "http"
portExternal: 3000
portInternal: 3000
hostInternal: "0.0.0.0"
dequeue:
enabled: true
intervalMs: 250
maxRunCount: 100
idleIntervalMs: 500
runner:
heartbeatIntervalSeconds: 30
snapshotPollIntervalSeconds: 30
metrics:
enabled: true
collectDefaults: true
host: "0.0.0.0"
port: 9088
debug: false
# RBAC configuration
serviceAccount:
create: true
name: ""
annotations: {}
rbac:
create: true
# Namespace-scoped permissions for pod management
role:
name: ""
# Extra environment variables for Supervisor
extraEnvVars:
[]
# - name: CUSTOM_VAR
# value: "custom-value"
# ServiceMonitor for Prometheus monitoring
serviceMonitor:
enabled: false
interval: "30s"
path: "/metrics"
labels: {}
basicAuth: {}
# Health probe configuration
livenessProbe:
enabled: true
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
successThreshold: 1
startupProbe:
enabled: false
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 60
successThreshold: 1
# Bootstrap configuration
# When enabled: reads token from shared file, otherwise uses workerToken config
bootstrap:
enabled: true
workerTokenPath: "/home/node/shared/worker_token"
workerToken:
# Direct value (not recommended for production)
value: ""
# Secret reference
secret:
name: ""
key: ""
nodeSelector: {}
tolerations: [] # For the supervisor pod itself, not run pods
affinity: {}
# PostgreSQL configuration
# Subchart: https://github.com/bitnami/charts/tree/main/bitnami/postgresql
postgres:
deploy: true
image:
# Use bitnami legacy repo
repository: bitnamilegacy/postgresql
# image: docker.io/bitnamilegacy/postgresql:17.5.0-debian-12-r12
# Bitnami PostgreSQL chart configuration (when deploy: true)
auth:
enablePostgresUser: true
postgresPassword: "" # Leave empty to auto-generate into the datastore secret, or set to pin.
username: "postgres"
password: "" # Leave empty to auto-generate into the datastore secret, or set to pin.
database: "main"
# Read the auto-generated password from the chart-managed datastore secret
# (templates/datastore-secret.yaml). Must equal trigger-v4.datastore.secretName.
existingSecret: "trigger-datastore"
secretKeys:
adminPasswordKey: "postgres-password"
userPasswordKey: "password"
primary:
persistence:
enabled: true
size: 10Gi
resourcesPreset: "small"
resources: {}
configuration: |
listen_addresses = '*'
wal_level = logical
# Custom connection settings
connection:
schema: "public"
sslMode: "disable" # Use "require" or "verify-full" for production with custom CA
# External PostgreSQL connection (when deploy: false)
external:
# Database URL configuration - simplified approach using URLs instead of individual parameters
databaseUrl: "" # Full PostgreSQL connection URL (e.g., postgresql://user:pass@host:port/db?schema=public&sslmode=prefer)
directUrl: "" # Optional: Direct URL for migrations (if not set, databaseUrl will be used)
#
# Optional: Connectivity check configuration during webapp startup
connectivityCheck:
host: "" # Optional: hostname:port for wait-for-it script (e.g., "postgres.example.com:5432")
#
# Secure credential management
existingSecret: "" # Name of existing secret containing DATABASE_URL
secretKeys:
databaseUrlKey: "postgres-database-url" # Key in existing secret containing complete DATABASE_URL
directUrlKey: "postgres-direct-url" # Key in existing secret containing direct URL (optional)
#
# Example: For SSL connections with custom CA (e.g., AWS RDS):
# 1. Set connection.sslMode to "require" or "verify-full"
# 2. Create a secret with your CA certificate:
# kubectl create secret generic postgres-ca-secret --from-file=ca.crt=/path/to/rds-ca-cert.pem
# 3. Configure extraVolumes, extraVolumeMounts, and extraEnvVars (see webapp section above)
# Redis configuration
# Subchart: https://github.com/bitnami/charts/tree/main/bitnami/redis
redis:
deploy: true
image:
# Use bitnami legacy repo
repository: bitnamilegacy/redis
# image: docker.io/bitnamilegacy/redis:8.0.2-debian-12-r4
# Bitnami Redis chart configuration (when deploy: true)
auth:
enabled: false
# Single-node configuration (disable replica)
architecture: standalone
master:
persistence:
enabled: true
size: 5Gi
resources: {}
# External Redis connection (when deploy: false)
external:
host: ""
port: 6379
password: "" # Optional - ignored if existingSecret is set
tls:
enabled: false # Set to true for Redis instances requiring TLS (e.g., AWS ElastiCache)
#
# Secure credential management
existingSecret: "" # Name of existing secret containing password
existingSecretPasswordKey: "redis-password" # Key in existing secret containing password
# Electric configuration
electric:
deploy: true
image:
registry: docker.io
repository: electricsql/electric
tag: "1.2.4"
pullPolicy: IfNotPresent
config:
insecure: true
usageReporting: false
podAnnotations: {}
# podSecurityContext:
# fsGroup: 1000
# securityContext:
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 3000
targetPort: 3000
resources: {}
# Health probe configuration
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
startupProbe:
enabled: false
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 60
successThreshold: 1
# External Electric connection (when deploy: false)
external:
url: "" # For example: "http://electric:3000"
# Extra environment variables for Electric
extraEnvVars:
[]
# - name: CUSTOM_VAR
# value: "custom-value"
# S2 (realtime streams v2)
# s2-lite is the open-source, self-hostable S2 server (https://s2.dev). It backs
# realtime streams v2, which power AI-agent token streaming and run streams. When
# enabled, the webapp defaults to v2; set `defaultStreamVersion: v1` to fall back
# to the Redis-backed v1 streams. Disable entirely with `deploy: false` and no
# external endpoint.
s2:
deploy: true
image:
registry: ghcr.io
repository: s2-streamstore/s2
tag: "latest"
# Pinning by digest is strongly recommended for reproducible deployments
digest: "sha256:d6ded5ca7dd619fa7c946f06e39a98f9c95c6883c8bb884e5eaa129f232c920c"
pullPolicy: IfNotPresent
# Which stream protocol version the webapp defaults to when a client doesn't pin one.
# Only takes effect while S2 is enabled (deploy: true or an external endpoint set);
# with S2 fully disabled the webapp always falls back to v1.
defaultStreamVersion: "v2"
# Basin that holds realtime streams. Created on startup from the init config.
# Must be at least 8 characters.
basin: "trigger-realtime"
# s2-lite needs no authentication; skip minting per-stream access tokens.
# Set to false when pointing at a hosted S2 that requires a token.
skipAccessTokens: true
podAnnotations: {}
# s2-lite is distroless and runs as uid 65532. fsGroup makes the persistent
# volume writable by that user without running the container as root.
podSecurityContext:
fsGroup: 65532
securityContext:
runAsNonRoot: true
runAsUser: 65532
runAsGroup: 65532
service:
type: ClusterIP
port: 80
# High container port so s2-lite can bind as the non-root image user (65532)
# without needing CAP_NET_BIND_SERVICE for a privileged port
targetPort: 8080
# Persistent storage for the SlateDB-backed stream data
persistence:
enabled: true
size: 5Gi
accessMode: ReadWriteOnce
storageClass: ""
retain: false
resources: {}
# Health probe configuration (distroless image → TCP probes, no shell/HTTP tooling)
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
# External S2 connection (when deploy: false). Point at a hosted S2 basin, e.g.
# "https://<basin>.b.aws.s2.dev/v1", set skipAccessTokens: false above, and
# supply an access token either inline or via an existing secret.
external:
endpoint: ""
accessToken: ""
existingSecret: ""
existingSecretAccessTokenKey: "access-token"
# ClickHouse configuration
# Deploys a single-node ClickHouse using the official image:
# https://hub.docker.com/r/clickhouse/clickhouse-server
# For clustered/replicated setups, use an external ClickHouse (deploy: false).
clickhouse:
deploy: true
image:
registry: docker.io
repository: clickhouse/clickhouse-server
# Trigger.dev requires ClickHouse >= 25.8
tag: "26.2"
# Pinning by digest is strongly recommended for reproducible deployments
digest: ""
pullPolicy: IfNotPresent
# TLS/Secure connection configuration
secure: false # Set to true to use HTTPS and secure connections
auth:
username: "default"
password: "" # Leave empty to auto-generate into the datastore secret, or set to pin.
# Read the auto-generated password from the chart-managed datastore secret.
existingSecret: "trigger-datastore"
existingSecretKey: "clickhouse-admin-password"
podAnnotations: {}
# The official image runs ClickHouse as uid 101. fsGroup makes the persistent
# volume writable by that user without running the container as root, and
# OnRootMismatch relabels volumes carried over from older chart versions
# (different uid) on first mount without rechecking every file on later mounts.
podSecurityContext:
fsGroup: 101
fsGroupChangePolicy: OnRootMismatch
securityContext:
runAsNonRoot: true
runAsUser: 101
runAsGroup: 101
# One-time root init container that chowns the data volume to the ClickHouse
# uid. Only needed on storage that doesn't support fsGroup ownership changes
# (e.g. NFS, hostPath); on such storage a data volume carried over from the
# Bitnami-based chart is otherwise unreadable by the non-root server.
volumePermissions:
enabled: false
image:
registry: docker.io
repository: busybox
tag: "1.35"
pullPolicy: IfNotPresent
nodeSelector: {}
tolerations: []
affinity: {}
service:
type: ClusterIP
ports:
http: 8123
native: 9000
persistence:
enabled: true
size: 10Gi
accessMode: ReadWriteOnce
storageClass: ""
retain: false
# Name of an existing PVC to use for ClickHouse data instead of creating
# one. Normally left empty: upgrades from chart versions that bundled the
# Bitnami ClickHouse subchart adopt the old data PVC automatically. Set
# this explicitly when rendering manifests without cluster access (e.g.
# GitOps tools that use `helm template`), where auto-detection can't run:
# the old PVC is named data-<release>-clickhouse-shard0-0.
existingClaim: ""
## ClickHouse resource requests and limits
## ref: http://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
## ClickHouse can be very resource intensive. The defaults below match the
## resource preset the chart previously applied; size them to your workload
## for production (see values-production-example.yaml).
resources:
requests:
cpu: 1000m
memory: 3Gi
limits:
cpu: 3000m
memory: 6Gi
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
# Generous startup window: first boot on a large adopted data volume can
# spend a while loading metadata before the HTTP listener answers.
startupProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 60
successThreshold: 1
# External ClickHouse connection (when deploy: false)
external:
host: ""
httpPort: 8123
nativePort: 9000
username: ""
password: "" # Optional - ignored if existingSecret is set
secure: false # Set to true for external secure connections
#
# Secure credential management
existingSecret: "" # Name of existing secret containing password
existingSecretKey: "clickhouse-password" # Key in existing secret containing password
# ClickHouse configuration override
# These defaults are based on official recommendations for systems with <16GB RAM:
# https://clickhouse.com/docs/operations/tips
configdFiles:
override.xml: |
<clickhouse>
<logger>
<level>warning</level>
</logger>
<!-- Official recommendations for systems with <16GB RAM -->
<mark_cache_size>524288000</mark_cache_size> <!-- 500MB -->
<concurrent_threads_soft_limit_num>1</concurrent_threads_soft_limit_num>
<profiles>
<default>
<max_block_size>8192</max_block_size>
<max_download_threads>1</max_download_threads>
<input_format_parallel_parsing>0</input_format_parallel_parsing>
<output_format_parallel_formatting>0</output_format_parallel_formatting>
</default>
</profiles>
</clickhouse>
# S3-compatible object storage configuration
# Subchart: https://github.com/bitnami/charts/tree/main/bitnami/minio
s3:
# Set to false to use external S3-compatible storage
# Set to true to deploy internal MinIO (default)
deploy: true
image:
# Use bitnami legacy repo
repository: bitnamilegacy/minio
# image: docker.io/bitnamilegacy/minio:2025.6.13-debian-12-r0
# MinIO Console (Browser UI) configuration
console:
image:
repository: bitnamilegacy/minio-object-browser
# image: docker.io/bitnamilegacy/minio-object-browser:2025.1.10-debian-12-r1
# Bitnami MinIO chart configuration (when deploy: true)
# MinIO provides S3-compatible storage when deployed internally
auth:
rootUser: "admin"
rootPassword: "" # Leave empty to auto-generate into the datastore secret, or set to pin.
# Webapp credentials for S3 access (defaults to root credentials if not specified)
accessKeyId: "" # Defaults to rootUser if empty
secretAccessKey: "" # Defaults to rootPassword if empty
# Read the auto-generated root credentials from the chart-managed datastore secret.
# The same keys serve the MinIO subchart (rootUser/rootPassword) and the webapp's
# S3 credentials, so both stay in sync. Must equal trigger-v4.datastore.secretName.
existingSecret: "trigger-datastore"
rootUserSecretKey: "minio-root-user"
rootPasswordSecretKey: "minio-root-password"
accessKeyIdSecretKey: "minio-root-user" # Key in existingSecret containing access key ID
secretAccessKeySecretKey: "minio-root-password" # Key in existingSecret containing secret access key
# The required "packets" bucket is created by default.
defaultBuckets: "packets"
persistence:
enabled: true
size: 10Gi
resources: {}
# External S3 connection (when deploy: false)
external:
endpoint: "" # e.g., "https://s3.amazonaws.com" or "https://your-minio.com:9000"
accessKeyId: "" # Required when s3.deploy=false — no default. Set explicitly or use existingSecret.
secretAccessKey: "" # Required when s3.deploy=false — no default. Set explicitly or use existingSecret.
#
# Secure credential management
existingSecret: "" # Name of existing secret containing S3 credentials
existingSecretAccessKeyIdKey: "access-key-id" # Key in existing secret containing access key ID
existingSecretSecretAccessKeyKey: "secret-access-key" # Key in existing secret containing secret access key
#
# Multi-provider support (optional)
# To use multiple S3-compatible providers (e.g., S3 + R2), set defaultProtocol and configure named providers
# via extraEnvVars. For example:
# - OBJECT_STORE_DEFAULT_PROTOCOL=s3 # Protocol to use for new uploads
# - OBJECT_STORE_S3_BASE_URL=https://s3.amazonaws.com
# - OBJECT_STORE_S3_ACCESS_KEY_ID=...
# - OBJECT_STORE_S3_SECRET_ACCESS_KEY=...
# - OBJECT_STORE_R2_BASE_URL=https://...r2.cloudflarestorage.com
# - OBJECT_STORE_R2_ACCESS_KEY_ID=...
# - OBJECT_STORE_R2_SECRET_ACCESS_KEY=...
# See documentation for migration guide: https://trigger.dev/docs/self-hosting/env/webapp
# Docker Registry configuration
registry:
# EXPERIMENTAL - requires ingress/TLS setup or additional cluster configuration. Configure `external` details instead.
deploy: false
# This will be used when deploy: true
host: "registry.example.com"
# Docker repository namespace for deployed images, will be part of the image ref
repositoryNamespace: "trigger"
image:
registry: docker.io
repository: registry
tag: "2"
pullPolicy: IfNotPresent
auth:
enabled: true
username: "registry-user"
password: "" # Required when registry.deploy=true and auth.enabled — no default. Set a strong value.
# External Registry connection (when deploy: false)
external:
host: "localhost:5001"
auth:
enabled: false
username: ""
password: ""
podAnnotations: {}
# podSecurityContext:
# fsGroup: 1000
# securityContext:
# runAsNonRoot: true
# runAsUser: 1000
# Persistence configuration (Bitnami-style)
persistence:
enabled: true
# Name to assign the volume
volumeName: "data"
# Name of an existing PVC to use
existingClaim: ""
# The path the volume will be mounted at
mountPath: "/var/lib/registry"
# The subdirectory of the volume to mount to
subPath: ""
# PVC Storage Class for Registry data volume
storageClass: ""
# PVC Access Mode for Registry volume
accessModes:
- "ReadWriteOnce"
# PVC Storage Request for Registry volume
size: 10Gi
# Annotations for the PVC
annotations: {}
# Labels for the PVC
labels: {}
# Selector to match an existing Persistent Volume
selector: {}
# Custom PVC data source
dataSource: {}
service:
type: ClusterIP
port: 5000
targetPort: 5000
resources: {}
# Health probe configuration
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
startupProbe:
enabled: false
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 60
successThreshold: 1
# Extra environment variables for Registry
extraEnvVars:
[]
# - name: CUSTOM_VAR
# value: "custom-value"
# Registry ingress configuration
ingress:
enabled: false
className: "traefik"
# Custom annotations for the ingress resource
# Note: The following annotation keys are reserved and will be automatically set:
# - cert-manager.io/cluster-issuer (when certManager.enabled is true)
# - external-dns.alpha.kubernetes.io/hostname (when externalDns.enabled is true)
# - external-dns.alpha.kubernetes.io/ttl (when externalDns.enabled is true)
annotations: {}
certManager:
enabled: false
clusterIssuer: "letsencrypt-prod"
externalDns:
enabled: false
hostname: ""
ttl: "300"
hosts:
- host: registry.local
paths:
- path: /
pathType: Prefix
tls:
[]
# - secretName: registry-tls
# hosts:
# - registry.local
# Shared persistent volumes
persistence:
# This is used for the worker token file
shared:
enabled: true
size: 5Mi
accessMode: ReadWriteOnce
# accessMode: ReadWriteMany # Use for cross-node deployment (requires compatible storage class)
storageClass: ""
retain: true # Prevents deletion on uninstall
# Telemetry configuration
telemetry:
enabled: true
# Extra Kubernetes manifests
# This allows you to add additional Kubernetes resources that will be deployed with the chart
extraManifests:
[]
# - apiVersion: v1
# kind: ConfigMap
# metadata:
# name: my-config
# data:
# key: value
# - apiVersion: apps/v1
# kind: Deployment
# metadata:
# name: my-app
# spec:
# replicas: 1
# selector:
# matchLabels:
# app: my-app
# template:
# metadata:
# labels:
# app: my-app
# spec:
# containers:
# - name: my-container
# image: nginx:latest