diff --git a/hosting/k8s/helm/.gitignore b/hosting/k8s/helm/.gitignore index eb389199c..40134ee19 100644 --- a/hosting/k8s/helm/.gitignore +++ b/hosting/k8s/helm/.gitignore @@ -1,3 +1,4 @@ values-*.yaml !values-production-example.yaml -*.tgz \ No newline at end of file +*.tgz +/charts \ No newline at end of file diff --git a/hosting/k8s/helm/Chart.lock b/hosting/k8s/helm/Chart.lock index 90c895c29..1018132e0 100644 --- a/hosting/k8s/helm/Chart.lock +++ b/hosting/k8s/helm/Chart.lock @@ -11,5 +11,5 @@ dependencies: - name: minio repository: oci://registry-1.docker.io/bitnamicharts version: 17.0.9 -digest: sha256:5b89e6afafb1387f83282c3469e3b6403b4eb1118246e08799839c529e4ae8c7 -generated: "2025-06-27T11:25:34.615756375+01:00" +digest: sha256:681c9b5ed742a35fac108d40c32dab069320b1c22f0681c6ce354c0898274e22 +generated: "2025-06-27T14:01:55.514480271+01:00" diff --git a/hosting/k8s/helm/Chart.yaml b/hosting/k8s/helm/Chart.yaml index 998e0e2b8..064d59c1f 100644 --- a/hosting/k8s/helm/Chart.yaml +++ b/hosting/k8s/helm/Chart.yaml @@ -20,17 +20,17 @@ dependencies: - name: postgresql version: "16.7.14" repository: "oci://registry-1.docker.io/bitnamicharts" - condition: postgres.enabled + condition: postgres.deploy alias: postgres - name: redis version: "21.2.6" repository: "oci://registry-1.docker.io/bitnamicharts" - condition: redis.enabled + condition: redis.deploy - name: clickhouse version: "9.3.7" repository: "oci://registry-1.docker.io/bitnamicharts" - condition: clickhouse.enabled + condition: clickhouse.deploy - name: minio version: "17.0.9" repository: "oci://registry-1.docker.io/bitnamicharts" - condition: minio.enabled + condition: minio.deploy diff --git a/hosting/k8s/helm/README.md b/hosting/k8s/helm/README.md index 5d9a8ff5e..ac10bfc55 100644 --- a/hosting/k8s/helm/README.md +++ b/hosting/k8s/helm/README.md @@ -4,6 +4,19 @@ This Helm chart deploys Trigger.dev v4 self-hosting stack to Kubernetes. ## Quick Start +### Prerequisites + +```bash +# Build Helm dependencies (required for Bitnami charts) +helm dependency build + +# Extract dependency charts for local template testing +for file in ./charts/*.tgz; do echo "Extracting $file"; tar -xzf "$file" -C ./charts; done + +# Alternative: Use --dependency-update flag for template testing +helm template trigger . --dependency-update +``` + ### Installation ```bash @@ -122,7 +135,7 @@ Use external managed services instead of bundled components: postgres: enabled: false external: true - externalConnection: + external: host: "your-postgres.rds.amazonaws.com" port: 5432 database: "trigger" @@ -133,7 +146,7 @@ postgres: redis: enabled: false external: true - externalConnection: + external: host: "your-redis.cache.amazonaws.com" port: 6379 password: "your-password" @@ -142,7 +155,7 @@ redis: registry: enabled: true external: true - externalConnection: + external: host: "localhost" port: 5001 username: "" diff --git a/hosting/k8s/helm/templates/NOTES.txt b/hosting/k8s/helm/templates/NOTES.txt index abac12926..1de6a5003 100644 --- a/hosting/k8s/helm/templates/NOTES.txt +++ b/hosting/k8s/helm/templates/NOTES.txt @@ -58,25 +58,39 @@ Bootstrap Mode is enabled: {{- end }} Configuration: -{{- if .Values.postgres.external }} -- Using external PostgreSQL at {{ .Values.postgres.externalConnection.host }}:{{ .Values.postgres.externalConnection.port }} -{{- else }} +{{- if .Values.postgres.deploy }} - Using internal PostgreSQL -{{- end }} -{{- if .Values.redis.external }} -- Using external Redis at {{ .Values.redis.externalConnection.host }}:{{ .Values.redis.externalConnection.port }} {{- else }} +- Using external PostgreSQL at {{ .Values.postgres.external.host }}:{{ .Values.postgres.external.port | default 5432 }} +{{- end }} +{{- if .Values.redis.deploy }} - Using internal Redis +{{- else }} +- Using external Redis at {{ .Values.redis.external.host }}:{{ .Values.redis.external.port | default 6379 }} {{- end }} -{{- if .Values.electric.enabled }} -- Electric sync service enabled +{{- if .Values.electric.deploy }} +- Using internal Electric sync service +{{- else }} +- Using external Electric sync service at {{ .Values.electric.external.url }} {{- end }} -{{- if .Values.clickhouse.enabled }} -- ClickHouse analytics database enabled +{{- if .Values.clickhouse.deploy }} +- Using internal ClickHouse +{{- else }} +- Using external ClickHouse at {{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }} {{- end }} -{{- if .Values.minio.enabled }} -- MinIO object storage enabled +{{- if .Values.minio.deploy }} +- Using internal MinIO object storage +{{- else }} +- Using external MinIO object storage at {{ .Values.minio.external.endpoint }} +{{- end }} +{{- if .Values.registry.deploy }} +- Using internal Docker registry +{{- else }} +- Using external Docker registry at {{ .Values.registry.external.host }}:{{ .Values.registry.external.port }} +{{- if eq .Values.registry.external.host "localhost" }} + +⚠️ Registry Warning: + Using localhost for registry. Deployments will only work when testing locally in kind or minikube. + Please ensure registry.external is properly configured to point at an external registry. {{- end }} -{{- if .Values.registry.enabled }} -- Docker registry enabled {{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/_helpers.tpl b/hosting/k8s/helm/templates/_helpers.tpl index 96dfc767d..6113dcd93 100644 --- a/hosting/k8s/helm/templates/_helpers.tpl +++ b/hosting/k8s/helm/templates/_helpers.tpl @@ -95,33 +95,51 @@ Get the full image name for supervisor {{- end }} {{- end }} +{{/* +PostgreSQL hostname +*/}} +{{- define "trigger-v4.postgres.hostname" -}} +{{- if .Values.postgres.host }} +{{- .Values.postgres.host }} +{{- else if .Values.postgres.deploy }} +{{- printf "%s-postgres" .Release.Name }} +{{- end }} +{{- end }} + {{/* PostgreSQL connection string */}} {{- define "trigger-v4.postgres.connectionString" -}} -{{- if .Values.postgres.external -}} -postgresql://{{ .Values.postgres.externalConnection.username }}:{{ .Values.postgres.externalConnection.password }}@{{ .Values.postgres.externalConnection.host }}:{{ .Values.postgres.externalConnection.port }}/{{ .Values.postgres.externalConnection.database }}?schema={{ .Values.postgres.externalConnection.schema | default "public" }}&sslmode={{ .Values.postgres.externalConnection.sslMode | default "prefer" }} -{{- else -}} -postgresql://{{ .Values.postgres.auth.username }}:{{ .Values.postgres.auth.password }}@{{ include "trigger-v4.fullname" . }}-postgres:{{ .Values.postgres.primary.service.ports.postgres }}/{{ .Values.postgres.auth.database }}?schema={{ .Values.postgres.connection.schema | default "public" }}&sslmode={{ .Values.postgres.connection.sslMode | default "prefer" }} +{{- if .Values.postgres.host -}} +postgresql://{{ .Values.postgres.username }}:{{ .Values.postgres.password }}@{{ .Values.postgres.host }}:{{ .Values.postgres.port | default 5432 }}/{{ .Values.postgres.database }}?schema={{ .Values.postgres.schema | default "public" }}&sslmode={{ .Values.postgres.sslMode | default "prefer" }} +{{- else if .Values.postgres.deploy -}} +postgresql://{{ .Values.postgres.auth.username }}:{{ .Values.postgres.auth.password }}@{{ include "trigger-v4.postgres.hostname" . }}:5432/{{ .Values.postgres.auth.database }}?schema={{ .Values.postgres.connection.schema | default "public" }}&sslmode={{ .Values.postgres.connection.sslMode | default "prefer" }} {{- end -}} {{- end }} +{{/* +Redis hostname +*/}} +{{- define "trigger-v4.redis.hostname" -}} +{{- if .Values.redis.host }} +{{- .Values.redis.host }} +{{- else if .Values.redis.deploy }} +{{- printf "%s-redis-master" .Release.Name }} +{{- end }} +{{- end }} + {{/* Redis connection details */}} {{- define "trigger-v4.redis.host" -}} -{{- if .Values.redis.external -}} -{{ .Values.redis.externalConnection.host }} -{{- else -}} -{{ include "trigger-v4.fullname" . }}-redis-master -{{- end -}} +{{- include "trigger-v4.redis.hostname" . }} {{- end }} {{- define "trigger-v4.redis.port" -}} -{{- if .Values.redis.external -}} -{{ .Values.redis.externalConnection.port }} -{{- else -}} -{{ .Values.redis.master.service.ports.redis }} +{{- if .Values.redis.host -}} +{{ .Values.redis.port | default 6379 }} +{{- else if .Values.redis.deploy -}} +6379 {{- end -}} {{- end }} @@ -129,24 +147,51 @@ Redis connection details Electric service URL */}} {{- define "trigger-v4.electric.url" -}} -{{- if .Values.electric.enabled -}} +{{- if .Values.electric.deploy -}} http://{{ include "trigger-v4.fullname" . }}-electric:{{ .Values.electric.service.port }} {{- else -}} -{{ .Values.config.electricOrigin }} +{{ .Values.electric.external.url }} {{- end -}} {{- end }} +{{/* +ClickHouse hostname +*/}} +{{- define "trigger-v4.clickhouse.hostname" -}} +{{- if .Values.clickhouse.host }} +{{- .Values.clickhouse.host }} +{{- else if .Values.clickhouse.deploy }} +{{- printf "%s-clickhouse" .Release.Name }} +{{- end }} +{{- end }} + +{{/* +ClickHouse URL +*/}} +{{- define "trigger-v4.clickhouse.url" -}} +{{- if .Values.clickhouse.host -}} +http://{{ .Values.clickhouse.username }}:{{ .Values.clickhouse.password }}@{{ .Values.clickhouse.host }}:{{ .Values.clickhouse.httpPort | default 8123 }} +{{- else if .Values.clickhouse.deploy -}} +http://{{ .Values.clickhouse.auth.username }}:{{ .Values.clickhouse.auth.password }}@{{ include "trigger-v4.clickhouse.hostname" . }}:8123 +{{- end -}} +{{- end }} + +{{/* +MinIO hostname +*/}} +{{- define "trigger-v4.minio.hostname" -}} +{{- if .Values.minio.endpoint }} +{{- .Values.minio.endpoint }} +{{- else if .Values.minio.deploy }} +{{- printf "http://%s-minio:9000" .Release.Name }} +{{- end }} +{{- end }} + {{/* MinIO connection details */}} {{- define "trigger-v4.minio.url" -}} -{{- if .Values.minio.enabled -}} -http://{{ include "trigger-v4.fullname" . }}-minio:{{ .Values.minio.service.ports.api }} -{{- else if .Values.minio.external -}} -{{ .Values.minio.externalConnection.url }} -{{- else -}} -"" -{{- end -}} +{{- include "trigger-v4.minio.hostname" . }} {{- end }} {{/* @@ -164,12 +209,10 @@ Get the secrets name - either existing secret or generated name Registry connection details */}} {{- define "trigger-v4.registry.host" -}} -{{- if .Values.registry.external -}} -{{ .Values.registry.externalConnection.host }}:{{ .Values.registry.externalConnection.port }} -{{- else if .Values.registry.enabled -}} +{{- if .Values.registry.deploy -}} {{ include "trigger-v4.fullname" . }}-registry:{{ .Values.registry.service.port }} {{- else -}} -localhost:5000 +{{ .Values.registry.external.host }}:{{ .Values.registry.external.port }} {{- end -}} {{- end }} @@ -177,10 +220,10 @@ localhost:5000 PostgreSQL host (for wait-for-it script) */}} {{- define "trigger-v4.postgres.host" -}} -{{- if .Values.postgres.external -}} -{{ .Values.postgres.externalConnection.host }}:{{ .Values.postgres.externalConnection.port }} -{{- else -}} -{{ include "trigger-v4.fullname" . }}-postgres:{{ .Values.postgres.primary.service.ports.postgres }} +{{- if .Values.postgres.host -}} +{{ .Values.postgres.host }}:{{ .Values.postgres.port | default 5432 }} +{{- else if .Values.postgres.deploy -}} +{{ include "trigger-v4.postgres.hostname" . }}:5432 {{- end -}} {{- end }} @@ -217,17 +260,17 @@ Create the name of the supervisor cluster role to use Generate docker config for image pull secret */}} {{- define "trigger-v4.imagePullSecret" }} -{{- if and .Values.registry.enabled .Values.registry.auth.enabled }} +{{- if and .Values.registry.deploy .Values.registry.auth.enabled }} {{- $registryHost := include "trigger-v4.registry.host" . }} {{- $username := .Values.registry.auth.username }} {{- $password := .Values.registry.auth.password }} {{- $auth := printf "%s:%s" $username $password | b64enc }} {{- $config := dict "auths" (dict $registryHost (dict "username" $username "password" $password "auth" $auth)) }} {{- $config | toJson }} -{{- else if and .Values.registry.external .Values.registry.externalConnection.auth.enabled }} -{{- $registryHost := .Values.registry.externalConnection.host }} -{{- $username := .Values.registry.externalConnection.auth.username }} -{{- $password := .Values.registry.externalConnection.auth.password }} +{{- else if and (not .Values.registry.deploy) .Values.registry.external.auth.enabled }} +{{- $registryHost := .Values.registry.external.host }} +{{- $username := .Values.registry.external.auth.username }} +{{- $password := .Values.registry.external.auth.password }} {{- $auth := printf "%s:%s" $username $password | b64enc }} {{- $config := dict "auths" (dict $registryHost (dict "username" $username "password" $password "auth" $auth)) }} {{- $config | toJson }} diff --git a/hosting/k8s/helm/templates/clickhouse.yaml b/hosting/k8s/helm/templates/clickhouse.yaml deleted file mode 100644 index bd9097e54..000000000 --- a/hosting/k8s/helm/templates/clickhouse.yaml +++ /dev/null @@ -1,165 +0,0 @@ -{{- if and .Values.clickhouse.enabled (not .Values.clickhouse.external) }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "trigger-v4.fullname" . }}-clickhouse - labels: - {{- $component := "clickhouse" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - replicas: 1 - serviceName: {{ include "trigger-v4.fullname" . }}-clickhouse-headless - selector: - matchLabels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 6 }} - template: - metadata: - {{- with .Values.clickhouse.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 8 }} - spec: - {{- with .Values.clickhouse.podSecurityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: clickhouse - {{- with .Values.clickhouse.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: "{{ .Values.clickhouse.image.registry }}/{{ .Values.clickhouse.image.repository }}:{{ .Values.clickhouse.image.tag }}" - imagePullPolicy: {{ .Values.clickhouse.image.pullPolicy }} - ports: - - name: native - containerPort: {{ .Values.clickhouse.service.ports.native }} - protocol: TCP - - name: http - containerPort: {{ .Values.clickhouse.service.ports.http }} - protocol: TCP - env: - - name: CLICKHOUSE_ADMIN_USER - value: {{ .Values.clickhouse.auth.adminUser | quote }} - - name: CLICKHOUSE_ADMIN_PASSWORD - value: {{ .Values.clickhouse.auth.adminPassword | quote }} - {{- with .Values.clickhouse.extraEnv }} - {{- toYaml . | nindent 12 }} - {{- end }} - livenessProbe: - exec: - command: - - clickhouse-client - - --host - - localhost - - --port - - {{ .Values.clickhouse.service.ports.native | quote }} - - --user - - {{ .Values.clickhouse.auth.adminUser }} - - --password - - {{ .Values.clickhouse.auth.adminPassword }} - - --query - - "SELECT 1" - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 15 - failureThreshold: 5 - readinessProbe: - exec: - command: - - clickhouse-client - - --host - - localhost - - --port - - {{ .Values.clickhouse.service.ports.native | quote }} - - --user - - {{ .Values.clickhouse.auth.adminUser }} - - --password - - {{ .Values.clickhouse.auth.adminPassword }} - - --query - - "SELECT 1" - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 15 - failureThreshold: 5 - resources: - {{- toYaml .Values.clickhouse.resources | nindent 12 }} - volumeMounts: - - name: clickhouse-data - mountPath: /bitnami/clickhouse - - name: clickhouse-config - mountPath: /bitnami/clickhouse/etc/config.d/override.xml - subPath: override.xml - readOnly: true - volumes: - - name: clickhouse-config - configMap: - name: {{ include "trigger-v4.fullname" . }}-clickhouse-config - {{- if not .Values.clickhouse.persistence.enabled }} - - name: clickhouse-data - emptyDir: {} - {{- end }} - {{- if .Values.clickhouse.persistence.enabled }} - volumeClaimTemplates: - - metadata: - name: clickhouse-data - labels: - {{- $component := "clickhouse" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 10 }} - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.clickhouse.persistence.size }} - {{- $storageClass := .Values.clickhouse.persistence.storageClass | default .Values.global.storageClass }} - {{- if $storageClass }} - storageClassName: {{ $storageClass | quote }} - {{- end }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-clickhouse-headless - labels: - {{- $component := "clickhouse" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: native - port: {{ .Values.clickhouse.service.ports.native }} - targetPort: native - protocol: TCP - - name: http - port: {{ .Values.clickhouse.service.ports.http }} - targetPort: http - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-clickhouse - labels: - {{- $component := "clickhouse" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: {{ .Values.clickhouse.service.type }} - ports: - - name: native - port: {{ .Values.clickhouse.service.ports.native }} - targetPort: native - protocol: TCP - - name: http - port: {{ .Values.clickhouse.service.ports.http }} - targetPort: http - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -{{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/configmap.yaml b/hosting/k8s/helm/templates/configmap.yaml deleted file mode 100644 index b3bd8230c..000000000 --- a/hosting/k8s/helm/templates/configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{- if and .Values.clickhouse.enabled (not .Values.clickhouse.external) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "trigger-v4.fullname" . }}-clickhouse-config - labels: - {{- include "trigger-v4.labels" . | nindent 4 }} -data: - override.xml: | -{{ .Values.clickhouse.config.override | indent 4 }} -{{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/electric.yaml b/hosting/k8s/helm/templates/electric.yaml index 35320916b..11ade0dcb 100644 --- a/hosting/k8s/helm/templates/electric.yaml +++ b/hosting/k8s/helm/templates/electric.yaml @@ -1,4 +1,4 @@ -{{- if .Values.electric.enabled }} +{{- if .Values.electric.deploy }} apiVersion: apps/v1 kind: Deployment metadata: diff --git a/hosting/k8s/helm/templates/minio.yaml b/hosting/k8s/helm/templates/minio.yaml deleted file mode 100644 index 3fcfb319b..000000000 --- a/hosting/k8s/helm/templates/minio.yaml +++ /dev/null @@ -1,143 +0,0 @@ -{{- if .Values.minio.enabled }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "trigger-v4.fullname" . }}-minio - labels: - {{- $component := "minio" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - replicas: 1 - serviceName: {{ include "trigger-v4.fullname" . }}-minio-headless - selector: - matchLabels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 6 }} - template: - metadata: - {{- with .Values.minio.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 8 }} - spec: - {{- with .Values.minio.podSecurityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: minio - {{- with .Values.minio.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: "{{ .Values.minio.image.registry }}/{{ .Values.minio.image.repository }}:{{ .Values.minio.image.tag }}" - imagePullPolicy: {{ .Values.minio.image.pullPolicy }} - args: - - server - - --console-address - - ":9001" - - /data - ports: - - name: api - containerPort: {{ .Values.minio.service.ports.api }} - protocol: TCP - - name: console - containerPort: {{ .Values.minio.service.ports.console }} - protocol: TCP - env: - - name: MINIO_ROOT_USER - value: {{ .Values.minio.auth.rootUser | quote }} - - name: MINIO_ROOT_PASSWORD - value: {{ .Values.minio.auth.rootPassword | quote }} - {{- with .Values.minio.extraEnv }} - {{- toYaml . | nindent 12 }} - {{- end }} - livenessProbe: - httpGet: - path: /minio/health/live - port: api - initialDelaySeconds: 10 - periodSeconds: 5 - timeoutSeconds: 10 - failureThreshold: 5 - readinessProbe: - httpGet: - path: /minio/health/live - port: api - initialDelaySeconds: 10 - periodSeconds: 5 - timeoutSeconds: 10 - failureThreshold: 5 - resources: - {{- toYaml .Values.minio.resources | nindent 12 }} - volumeMounts: - - name: minio-data - mountPath: /data - {{- if not .Values.minio.persistence.enabled }} - volumes: - - name: minio-data - emptyDir: {} - {{- end }} - {{- if .Values.minio.persistence.enabled }} - volumeClaimTemplates: - - metadata: - name: minio-data - labels: - {{- $component := "minio" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 10 }} - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.minio.persistence.size }} - {{- $storageClass := .Values.minio.persistence.storageClass | default .Values.global.storageClass }} - {{- if $storageClass }} - storageClassName: {{ $storageClass | quote }} - {{- end }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-minio-headless - labels: - {{- $component := "minio" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: api - port: {{ .Values.minio.service.ports.api }} - targetPort: api - protocol: TCP - - name: console - port: {{ .Values.minio.service.ports.console }} - targetPort: console - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-minio - labels: - {{- $component := "minio" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: {{ .Values.minio.service.type }} - ports: - - name: api - port: {{ .Values.minio.service.ports.api }} - targetPort: api - protocol: TCP - - name: console - port: {{ .Values.minio.service.ports.console }} - targetPort: console - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -{{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/postgresql.yaml b/hosting/k8s/helm/templates/postgresql.yaml deleted file mode 100644 index 5252a0466..000000000 --- a/hosting/k8s/helm/templates/postgresql.yaml +++ /dev/null @@ -1,138 +0,0 @@ -{{- if and .Values.postgres.enabled (not .Values.postgres.external) }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "trigger-v4.fullname" . }}-postgres - labels: - {{- $component := "postgres" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - replicas: 1 - serviceName: {{ include "trigger-v4.fullname" . }}-postgres-headless - selector: - matchLabels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 6 }} - template: - metadata: - {{- with .Values.postgres.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 8 }} - spec: - {{- with .Values.postgres.podSecurityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: postgres - {{- with .Values.postgres.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: "{{ .Values.postgres.image.registry }}/{{ .Values.postgres.image.repository }}:{{ .Values.postgres.image.tag }}" - imagePullPolicy: {{ .Values.postgres.image.pullPolicy }} - ports: - - name: postgres - containerPort: {{ .Values.postgres.primary.service.ports.postgres }} - protocol: TCP - env: - - name: POSTGRES_USER - value: {{ .Values.postgres.auth.username | quote }} - - name: POSTGRES_PASSWORD - value: {{ .Values.postgres.auth.password | quote }} - - name: POSTGRES_DB - value: {{ .Values.postgres.auth.database | quote }} - {{- with .Values.postgres.extraEnv }} - {{- toYaml . | nindent 12 }} - {{- end }} - args: - - "-c" - - "wal_level=logical" - {{- with .Values.postgres.extraArgs }} - {{- toYaml . | nindent 12 }} - {{- end }} - livenessProbe: - exec: - command: - - pg_isready - - -U - - {{ .Values.postgres.auth.username }} - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - readinessProbe: - exec: - command: - - pg_isready - - -U - - {{ .Values.postgres.auth.username }} - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - resources: - {{- toYaml .Values.postgres.primary.resources | nindent 12 }} - volumeMounts: - - name: postgres-data - mountPath: /var/lib/postgresql/data - {{- if .Values.postgres.primary.persistence.enabled }} - volumeClaimTemplates: - - metadata: - name: postgres-data - labels: - {{- $component := "postgres" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 10 }} - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.postgres.primary.persistence.size }} - {{- $storageClass := .Values.postgres.primary.persistence.storageClass | default .Values.global.storageClass }} - {{- if $storageClass }} - storageClassName: {{ $storageClass | quote }} - {{- end }} - {{- else }} - volumes: - - name: postgres-data - emptyDir: {} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-postgres-headless - labels: - {{- $component := "postgres" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: postgres - port: {{ .Values.postgres.primary.service.ports.postgres }} - targetPort: postgres - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-postgres - labels: - {{- $component := "postgres" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - ports: - - name: postgres - port: {{ .Values.postgres.primary.service.ports.postgres }} - targetPort: postgres - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -{{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/redis.yaml b/hosting/k8s/helm/templates/redis.yaml deleted file mode 100644 index f037bbc86..000000000 --- a/hosting/k8s/helm/templates/redis.yaml +++ /dev/null @@ -1,125 +0,0 @@ -{{- if and .Values.redis.enabled (not .Values.redis.external) }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "trigger-v4.fullname" . }}-redis-master - labels: - {{- $component := "redis" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - replicas: 1 - serviceName: {{ include "trigger-v4.fullname" . }}-redis-headless - selector: - matchLabels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 6 }} - template: - metadata: - {{- with .Values.redis.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 8 }} - spec: - {{- with .Values.redis.podSecurityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: redis - {{- with .Values.redis.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: "{{ .Values.redis.image.registry }}/{{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }}" - imagePullPolicy: {{ .Values.redis.image.pullPolicy }} - ports: - - name: redis - containerPort: {{ .Values.redis.master.service.ports.redis }} - protocol: TCP - {{- with .Values.redis.extraEnv }} - env: - {{- toYaml . | nindent 12 }} - {{- end }} - livenessProbe: - exec: - command: - - redis-cli - - ping - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - readinessProbe: - exec: - command: - - redis-cli - - ping - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - resources: - {{- toYaml .Values.redis.master.resources | nindent 12 }} - volumeMounts: - - name: redis-data - mountPath: /data - {{- if not .Values.redis.master.persistence.enabled }} - volumes: - - name: redis-data - emptyDir: {} - {{- end }} - {{- if .Values.redis.master.persistence.enabled }} - volumeClaimTemplates: - - metadata: - name: redis-data - labels: - {{- $component := "redis" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 10 }} - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.redis.master.persistence.size }} - {{- $storageClass := .Values.redis.master.persistence.storageClass | default .Values.global.storageClass }} - {{- if $storageClass }} - storageClassName: {{ $storageClass | quote }} - {{- end }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-redis-headless - labels: - {{- $component := "redis" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: redis - port: {{ .Values.redis.master.service.ports.redis }} - targetPort: redis - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "trigger-v4.fullname" . }}-redis-master - labels: - {{- $component := "redis" }} - {{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -spec: - type: ClusterIP - ports: - - name: redis - port: {{ .Values.redis.master.service.ports.redis }} - targetPort: redis - protocol: TCP - selector: - {{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }} -{{- end }} \ No newline at end of file diff --git a/hosting/k8s/helm/templates/registry.yaml b/hosting/k8s/helm/templates/registry.yaml index 528b361a6..3ad4ab611 100644 --- a/hosting/k8s/helm/templates/registry.yaml +++ b/hosting/k8s/helm/templates/registry.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.registry.enabled (not .Values.registry.external) }} +{{- if .Values.registry.deploy }} apiVersion: apps/v1 kind: StatefulSet metadata: diff --git a/hosting/k8s/helm/templates/secrets.yaml b/hosting/k8s/helm/templates/secrets.yaml index e93702cf9..3f88eaab9 100644 --- a/hosting/k8s/helm/templates/secrets.yaml +++ b/hosting/k8s/helm/templates/secrets.yaml @@ -15,7 +15,7 @@ data: OBJECT_STORE_SECRET_ACCESS_KEY: {{ .Values.secrets.objectStore.secretAccessKey | b64enc | quote }} {{- end }} --- -{{- if and .Values.registry.enabled .Values.registry.auth.enabled }} +{{- if and .Values.registry.deploy .Values.registry.auth.enabled }} apiVersion: v1 kind: Secret metadata: @@ -35,7 +35,7 @@ metadata: type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: {{ include "trigger-v4.imagePullSecret" . | b64enc }} -{{- else if and .Values.registry.external .Values.registry.externalConnection.auth.enabled }} +{{- else if and (not .Values.registry.deploy) .Values.registry.external.auth.enabled }} apiVersion: v1 kind: Secret metadata: diff --git a/hosting/k8s/helm/templates/supervisor.yaml b/hosting/k8s/helm/templates/supervisor.yaml index 0aba0e206..2882d08c7 100644 --- a/hosting/k8s/helm/templates/supervisor.yaml +++ b/hosting/k8s/helm/templates/supervisor.yaml @@ -1,4 +1,4 @@ -{{- if .Values.supervisor.enabled }} +{{- if .Values.supervisor.deploy }} {{- if .Values.supervisor.serviceAccount.create }} apiVersion: v1 kind: ServiceAccount @@ -147,7 +147,13 @@ spec: value: {{ .Values.supervisor.config.kubernetes.forceEnabled | quote }} - name: KUBERNETES_WORKER_NODETYPE_LABEL value: {{ .Values.supervisor.config.kubernetes.workerNodetypeLabel | quote }} - {{- if or (and .Values.registry.enabled .Values.registry.auth.enabled) (and .Values.registry.external .Values.registry.externalConnection.auth.enabled) }} + {{- $registryAuthEnabled := false }} + {{- if .Values.registry.deploy }} + {{- $registryAuthEnabled = .Values.registry.auth.enabled }} + {{- else }} + {{- $registryAuthEnabled = .Values.registry.external.auth.enabled }} + {{- end }} + {{- if $registryAuthEnabled }} - name: KUBERNETES_IMAGE_PULL_SECRETS value: "{{ include "trigger-v4.fullname" . }}-registry-secret" {{- end }} diff --git a/hosting/k8s/helm/templates/tests/test-clickhouse.yaml b/hosting/k8s/helm/templates/tests/test-clickhouse.yaml index 814255b71..9bde62c2a 100644 --- a/hosting/k8s/helm/templates/tests/test-clickhouse.yaml +++ b/hosting/k8s/helm/templates/tests/test-clickhouse.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.clickhouse.enabled (not .Values.clickhouse.external) }} +{{- if .Values.clickhouse.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/tests/test-electric.yaml b/hosting/k8s/helm/templates/tests/test-electric.yaml index 0e6c657e9..8d7c6c812 100644 --- a/hosting/k8s/helm/templates/tests/test-electric.yaml +++ b/hosting/k8s/helm/templates/tests/test-electric.yaml @@ -1,4 +1,4 @@ -{{- if .Values.electric.enabled }} +{{- if .Values.electric.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/tests/test-minio.yaml b/hosting/k8s/helm/templates/tests/test-minio.yaml index 605d35690..2916819d7 100644 --- a/hosting/k8s/helm/templates/tests/test-minio.yaml +++ b/hosting/k8s/helm/templates/tests/test-minio.yaml @@ -1,4 +1,4 @@ -{{- if .Values.minio.enabled }} +{{- if .Values.minio.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/tests/test-postgresql.yaml b/hosting/k8s/helm/templates/tests/test-postgresql.yaml index 2e6028bea..8200d1024 100644 --- a/hosting/k8s/helm/templates/tests/test-postgresql.yaml +++ b/hosting/k8s/helm/templates/tests/test-postgresql.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.postgres.enabled (not .Values.postgres.external) }} +{{- if .Values.postgres.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/tests/test-redis.yaml b/hosting/k8s/helm/templates/tests/test-redis.yaml index 4ba2c46c3..308516419 100644 --- a/hosting/k8s/helm/templates/tests/test-redis.yaml +++ b/hosting/k8s/helm/templates/tests/test-redis.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.redis.enabled (not .Values.redis.external) }} +{{- if .Values.redis.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/tests/test-supervisor.yaml b/hosting/k8s/helm/templates/tests/test-supervisor.yaml index 71ab36d90..7ebc49b73 100644 --- a/hosting/k8s/helm/templates/tests/test-supervisor.yaml +++ b/hosting/k8s/helm/templates/tests/test-supervisor.yaml @@ -1,4 +1,4 @@ -{{- if .Values.supervisor.enabled }} +{{- if .Values.supervisor.deploy }} apiVersion: v1 kind: Pod metadata: diff --git a/hosting/k8s/helm/templates/validate-external-config.yaml b/hosting/k8s/helm/templates/validate-external-config.yaml new file mode 100644 index 000000000..55bcc4f56 --- /dev/null +++ b/hosting/k8s/helm/templates/validate-external-config.yaml @@ -0,0 +1,56 @@ +{{/* +Validation template to ensure external service configurations are provided when deploy: false +This template will fail the Helm deployment if external config is missing for required services +*/}} +{{- if not .Values.postgres.deploy }} +{{- if or (not .Values.postgres.external.host) (not .Values.postgres.external.database) (not .Values.postgres.external.username) }} +{{- fail "PostgreSQL external configuration is required when postgres.deploy=false. Please provide postgres.external.host, postgres.external.database, and postgres.external.username" }} +{{- end }} +{{- end }} + +{{- if not .Values.redis.deploy }} +{{- if not .Values.redis.external.host }} +{{- fail "Redis external configuration is required when redis.deploy=false. Please provide redis.external.host" }} +{{- end }} +{{- end }} + +{{- if not .Values.clickhouse.deploy }} +{{- if or (not .Values.clickhouse.external.host) (not .Values.clickhouse.external.username) }} +{{- fail "ClickHouse external configuration is required when clickhouse.deploy=false. Please provide clickhouse.external.host and clickhouse.external.username" }} +{{- end }} +{{- end }} + +{{- if not .Values.minio.deploy }} +{{- if or (not .Values.minio.external.endpoint) (not .Values.minio.external.accessKeyId) }} +{{- fail "MinIO external configuration is required when minio.deploy=false. Please provide minio.external.endpoint and minio.external.accessKeyId" }} +{{- end }} +{{- end }} + +{{- if not .Values.electric.deploy }} +{{- if not .Values.electric.external.url }} +{{- fail "Electric external configuration is required when electric.deploy=false. Please provide electric.external.url" }} +{{- end }} +{{- end }} + +{{- if not .Values.registry.deploy }} +{{- if or (not .Values.registry.external.host) (not .Values.registry.external.port) }} +{{- fail "Registry external configuration is required when registry.deploy=false. Please provide registry.external.host and registry.external.port" }} +{{- end }} +{{- end }} + +{{/* +This template produces no output but will fail the deployment if validation fails +*/}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "trigger-v4.fullname" . }}-external-config-validation + labels: + {{- include "trigger-v4.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-10" + helm.sh/hook-delete-policy: before-hook-creation +data: + validation: "completed" \ No newline at end of file diff --git a/hosting/k8s/helm/templates/webapp.yaml b/hosting/k8s/helm/templates/webapp.yaml index dbcfadea4..c813acc1f 100644 --- a/hosting/k8s/helm/templates/webapp.yaml +++ b/hosting/k8s/helm/templates/webapp.yaml @@ -198,20 +198,16 @@ spec: - name: INTERNAL_OTEL_METRIC_EXPORTER_INTERVAL_MS value: {{ .Values.webapp.observability.metrics.exporterIntervalMs | quote }} {{- end }} - {{- if .Values.webapp.clickhouse.enabled }} - name: CLICKHOUSE_URL - value: {{ if .Values.clickhouse.external }}{{ .Values.clickhouse.externalConnection.httpUrl | quote }}{{ else }}"http://{{ .Values.clickhouse.auth.adminUser }}:{{ .Values.clickhouse.auth.adminPassword }}@{{ include "trigger-v4.fullname" . }}-clickhouse:{{ .Values.clickhouse.service.ports.http }}"{{ end }} + value: {{ include "trigger-v4.clickhouse.url" . | quote }} - name: CLICKHOUSE_LOG_LEVEL value: {{ .Values.webapp.clickhouse.logLevel | quote }} - {{- end }} - {{- if .Values.webapp.runReplication.enabled }} - name: RUN_REPLICATION_ENABLED value: "1" - name: RUN_REPLICATION_CLICKHOUSE_URL - value: {{ if .Values.clickhouse.external }}{{ .Values.clickhouse.externalConnection.httpUrl | quote }}{{ else }}"http://{{ .Values.clickhouse.auth.adminUser }}:{{ .Values.clickhouse.auth.adminPassword }}@{{ include "trigger-v4.fullname" . }}-clickhouse:{{ .Values.clickhouse.service.ports.http }}"{{ end }} + value: {{ include "trigger-v4.clickhouse.url" . | quote }} - name: RUN_REPLICATION_LOG_LEVEL value: {{ .Values.webapp.runReplication.logLevel | quote }} - {{- end }} {{- if not .Values.telemetry.enabled }} - name: TRIGGER_TELEMETRY_DISABLED value: "1" diff --git a/hosting/k8s/helm/values-production-example.yaml b/hosting/k8s/helm/values-production-example.yaml index fb7cee13d..ba64d8656 100644 --- a/hosting/k8s/helm/values-production-example.yaml +++ b/hosting/k8s/helm/values-production-example.yaml @@ -125,7 +125,7 @@ supervisor: # postgres: # enabled: false # external: true -# externalConnection: +# external: # host: "your-postgres-host.rds.amazonaws.com" # port: 5432 # database: "trigger" @@ -138,7 +138,7 @@ supervisor: # redis: # enabled: false # external: true -# externalConnection: +# external: # host: "your-redis-cluster.cache.amazonaws.com" # port: 6379 # password: "your-redis-password" diff --git a/hosting/k8s/helm/values.yaml b/hosting/k8s/helm/values.yaml index 61fd2c5f4..2f2d3ef8f 100644 --- a/hosting/k8s/helm/values.yaml +++ b/hosting/k8s/helm/values.yaml @@ -11,7 +11,6 @@ config: appOrigin: "http://localhost:3040" loginOrigin: "http://localhost:3040" apiOrigin: "http://localhost:3040" - electricOrigin: "http://electric:3000" # Secrets configuration # IMPORTANT: The default values below are for TESTING ONLY and should NOT be used in production @@ -125,16 +124,9 @@ webapp: labels: {} basicAuth: {} - # ClickHouse integration (experimental) - # Usage patterns: - # 1. Internal ClickHouse: Set clickhouse.enabled=true, clickhouse.external=false, webapp.clickhouse.enabled=true - # 2. External ClickHouse: Set clickhouse.enabled=true, clickhouse.external=true, configure externalConnection URLs, webapp.clickhouse.enabled=true - # 3. No ClickHouse: Leave webapp.clickhouse.enabled=false (default) clickhouse: - enabled: true logLevel: "info" # one of: log, error, warn, info, debug runReplication: - enabled: true logLevel: "info" # one of: log, error, warn, info, debug # Observability configuration (OTel) @@ -157,7 +149,6 @@ webapp: # Supervisor configuration supervisor: - enabled: true image: registry: ghcr.io repository: triggerdotdev/supervisor @@ -257,107 +248,64 @@ supervisor: # PostgreSQL configuration postgres: - enabled: true - external: false - image: - registry: docker.io - repository: postgres - tag: "14" - pullPolicy: IfNotPresent + deploy: true + + # Bitnami PostgreSQL chart configuration (when deploy: true) auth: + enablePostgresUser: true postgresPassword: "postgres" username: "postgres" password: "postgres" database: "main" - connection: - schema: "public" - sslMode: "disable" # Use "require" or "verify-full" for production - - podAnnotations: {} - - # podSecurityContext: - # fsGroup: 1000 - - # securityContext: - # runAsNonRoot: true - # runAsUser: 1000 primary: persistence: enabled: true size: 10Gi - service: - ports: - postgres: 5432 resources: {} configuration: | + listen_addresses = '*' wal_level = logical - # External PostgreSQL connection (when external: true) - externalConnection: + + # Custom connection settings + connection: + schema: "public" + sslMode: "disable" # Use "require" or "verify-full" for production + + # External PostgreSQL connection (when deploy: false) + external: host: "" port: 5432 database: "" username: "" password: "" - # Connection options - schema: "public" - sslMode: "require" # Options: disable, allow, prefer, require, verify-ca, verify-full - # Extra environment variables for PostgreSQL - extraEnv: - [] - # - name: CUSTOM_VAR - # value: "custom-value" - # Extra command line arguments for PostgreSQL - extraArgs: - [] - # - "-c" - # - "log_statement=all" - # - "-c" - # - "max_slot_wal_keep_size=1000000000" # Redis configuration redis: - enabled: true - external: false - image: - registry: docker.io - repository: redis - tag: "7" - pullPolicy: IfNotPresent + deploy: true + + # Bitnami Redis chart configuration (when deploy: true) auth: enabled: false - podAnnotations: {} - - # podSecurityContext: - # fsGroup: 1000 - - # securityContext: - # runAsNonRoot: true - # runAsUser: 1000 + # Single-node configuration (disable replica) + architecture: standalone master: persistence: enabled: true size: 5Gi - service: - ports: - redis: 6379 resources: {} - # External Redis connection (when external: true) - externalConnection: + + # External Redis connection (when deploy: false) + external: host: "" port: 6379 password: "" - # Extra environment variables for Redis - extraEnv: - [] - # - name: CUSTOM_VAR - # value: "custom-value" # Electric configuration electric: - enabled: true + deploy: true image: registry: docker.io repository: electricsql/electric @@ -381,6 +329,11 @@ electric: port: 3000 targetPort: 3000 resources: {} + + # External Electric connection (when deploy: false) + external: + url: "" # For example: "http://electric:3000" + # Extra environment variables for Electric extraEnv: [] @@ -389,51 +342,38 @@ electric: # ClickHouse configuration clickhouse: - enabled: true - external: false - image: - registry: docker.io - repository: bitnami/clickhouse - tag: "latest" - pullPolicy: IfNotPresent + deploy: true + + # Bitnami ClickHouse chart configuration (when deploy: true) auth: - adminUser: "default" - adminPassword: "password" + username: "default" + password: "password" - podAnnotations: {} + # Single-node configuration (disable clustering for dev/test) + keeper: + enabled: false - # podSecurityContext: - # fsGroup: 1000 - - # securityContext: - # runAsNonRoot: true - # runAsUser: 1000 + shards: 1 + replicaCount: 1 persistence: enabled: true size: 10Gi - service: - type: ClusterIP - ports: - native: 9000 - http: 8123 resources: {} - # External ClickHouse connection (when external: true) - externalConnection: - # HTTP interface URL (port 8123) - used by webapp for replication - httpUrl: "" - # Extra environment variables for ClickHouse - extraEnv: - [] - # - name: CUSTOM_VAR - # value: "custom-value" + + # External ClickHouse connection (when deploy: false) + external: + host: "" + httpPort: 8123 + nativePort: 9000 + username: "" + password: "" # ClickHouse configuration override - # You can provide your own override.xml content here # These defaults are based on official recommendations for systems with <16GB RAM: # https://clickhouse.com/docs/operations/tips - config: - override: | + configdFiles: + override.xml: | warning @@ -453,13 +393,9 @@ clickhouse: # MinIO configuration minio: - enabled: true - external: false # Set to true to use external S3-compatible storage - image: - registry: docker.io - repository: minio/minio - tag: "latest" - pullPolicy: IfNotPresent + deploy: true # Set to false to use external S3-compatible storage + + # Bitnami MinIO chart configuration (when deploy: true) # WARNING: This sets the root user and password on first startup and MUST be changed via the dashboard. # - Don't forget to update secrets.objectStore if you intend to use the root credentials. # - You should instead create a new non-root user and update the secrets.objectStore with the new credentials. @@ -467,37 +403,22 @@ minio: rootUser: "admin" rootPassword: "very-safe-password" - podAnnotations: {} - - # podSecurityContext: - # fsGroup: 1000 - - # securityContext: - # runAsNonRoot: true - # runAsUser: 1000 - persistence: enabled: true size: 10Gi - service: - type: ClusterIP - ports: - api: 9000 - console: 9001 resources: {} - # External MinIO/S3 connection (when external: true) - externalConnection: - url: "" # e.g., "https://s3.amazonaws.com" or "https://your-minio.com:9000" - # Extra environment variables for MinIO - extraEnv: - [] - # - name: CUSTOM_VAR - # value: "custom-value" + + # External MinIO/S3 connection (when deploy: false) + external: + endpoint: "" # e.g., "https://s3.amazonaws.com" or "https://your-minio.com:9000" + accessKeyId: "" + secretAccessKey: "" # Docker Registry configuration registry: - enabled: false # EXPERIMENTAL - requires proper TLS setup. Use external: true instead. - external: true + # EXPERIMENTAL - requires TLS setup or additional cluster configuration. Configure `external` details instead. + deploy: false + repositoryNamespace: "trigger" # Docker repository namespace for deployed images, will be part of the image ref image: registry: docker.io @@ -526,14 +447,16 @@ registry: port: 5000 targetPort: 5000 resources: {} - # External Registry connection (when external: true) - externalConnection: + + # External Registry connection (when deploy: false) + external: host: "localhost" port: 5001 auth: enabled: false username: "" password: "" + # Extra environment variables for Registry extraEnv: []