From f3ab722a9c0e9f8ab6b082aeef4be3e416672e38 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 16 Jul 2026 17:14:44 +0530 Subject: [PATCH 1/2] feat(plane-enterprise): add DBOS worker service configuration and deployment --- charts/plane-enterprise/Chart.yaml | 2 +- charts/plane-enterprise/README.md | 20 +++++ charts/plane-enterprise/questions.yml | 44 ++++++++++ .../templates/config-secrets/dbos-worker.yaml | 14 ++++ .../workloads/dbos-worker.deployment.yaml | 80 +++++++++++++++++++ charts/plane-enterprise/values.yaml | 19 +++++ 6 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml create mode 100644 charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml diff --git a/charts/plane-enterprise/Chart.yaml b/charts/plane-enterprise/Chart.yaml index 32f8330..e1eb826 100644 --- a/charts/plane-enterprise/Chart.yaml +++ b/charts/plane-enterprise/Chart.yaml @@ -5,7 +5,7 @@ description: Meet Plane. An Enterprise software development tool to manage issue type: application -version: 3.0.0 +version: 3.1.0 appVersion: "3.0.0" home: https://plane.so/ diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index 1fa17fe..ebbef44 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -793,6 +793,26 @@ Note: When the email service is enabled, the cert-issuer will be automatically c | env.webhook_consumer_envs.queue_name | "plane.webhook" | | RabbitMQ queue name the webhook consumer reads from | | env.webhook_consumer_envs.prefetch_count | 10 | | Prefetch count for the webhook consumer | +### DBOS Worker Deployment + +| Setting | Default | Required | Description | +| ------------------------------------------------- | :------------: | :------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| services.dbos_worker.enabled | false | | Set to `true` to enable the DBOS worker service deployment | +| services.dbos_worker.replicas | 1 | | Number of replicas for the DBOS worker service deployment | +| services.dbos_worker.memoryLimit | 1000Mi | | Memory limit for the DBOS worker service deployment | +| services.dbos_worker.cpuLimit | 500m | | CPU limit for the DBOS worker service deployment | +| services.dbos_worker.memoryRequest | 500Mi | | Memory request for the DBOS worker service deployment | +| services.dbos_worker.cpuRequest | 250m | | CPU request for the DBOS worker service deployment | +| services.dbos_worker.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service | +| services.dbos_worker.nodeSelector | {} | | This key allows you to set the node selector for the deployment of `dbos_worker`. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. | +| services.dbos_worker.tolerations | [] | | This key allows you to set the tolerations for the deployment of `dbos_worker`. This is useful when you want to run the deployment on nodes with specific taints in your Kubernetes cluster. | +| services.dbos_worker.affinity | {} | | This key allows you to set the affinity rules for the deployment of `dbos_worker`. This is useful when you want to control how pods are scheduled on nodes in your Kubernetes cluster. | +| services.dbos_worker.labels | {} | | Custom labels to add to the DBOS worker deployment | +| services.dbos_worker.annotations | {} | | Custom annotations to add to the DBOS worker deployment | +| env.dbos_worker_envs.system_database_url | | | DBOS system database URL (`DBOS_SYSTEM_DATABASE_URL`). Leave empty to use the default | +| env.dbos_worker_envs.sys_db_pool_size | 10 | | DBOS system database connection pool size (`DBOS_SYS_DB_POOL_SIZE`) | +| env.dbos_worker_envs.app_version | "v1.0.0" | | DBOS application version (`DBOS_APP_VERSION`) | + ### Iframely Deployment | Setting | Default | Required | Description | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 12241b8..7608ac4 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -883,6 +883,50 @@ questions: type: int default: 10 +- variable: services.dbos_worker.enabled + label: "Enable DBOS Worker" + type: boolean + default: false + group: "DBOS Worker Setup" + show_subquestion_if: true + subquestions: + - variable: services.dbos_worker.replicas + label: "Default Replica Count" + type: int + default: 1 + - variable: services.dbos_worker.memoryLimit + label: "Memory Limit" + type: string + default: 1000Mi + - variable: services.dbos_worker.cpuLimit + label: "CPU Limit" + type: string + default: 500m + - variable: services.dbos_worker.memoryRequest + label: "Memory Request" + type: string + default: 500Mi + - variable: services.dbos_worker.cpuRequest + label: "CPU Request" + type: string + default: 250m + - variable: services.dbos_worker.assign_cluster_ip + label: "Assign Cluster IP" + type: boolean + default: false + - variable: env.dbos_worker_envs.system_database_url + label: "DBOS System Database URL" + type: string + default: "" + - variable: env.dbos_worker_envs.sys_db_pool_size + label: "DBOS System DB Pool Size" + type: int + default: 10 + - variable: env.dbos_worker_envs.app_version + label: "DBOS App Version" + type: string + default: "v1.0.0" + - variable: services.iframely.enabled label: "Enable Iframely" type: boolean diff --git a/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml b/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml new file mode 100644 index 0000000..34543f5 --- /dev/null +++ b/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml @@ -0,0 +1,14 @@ +{{- if .Values.services.dbos_worker.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + namespace: {{ .Release.Namespace }} + name: {{ .Release.Name }}-dbos-worker-vars + labels: + {{- include "plane.commonLabels" $ | nindent 4 }} +data: + DBOS_SYSTEM_DATABASE_URL: {{ .Values.env.dbos_worker_envs.system_database_url | default "" | quote }} + DBOS_SYS_DB_POOL_SIZE: {{ .Values.env.dbos_worker_envs.sys_db_pool_size | default 10 | quote }} + DBOS_APP_VERSION: {{ .Values.env.dbos_worker_envs.app_version | default "v1.0.0" | quote }} +--- +{{- end }} diff --git a/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml b/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml new file mode 100644 index 0000000..86fa3e7 --- /dev/null +++ b/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml @@ -0,0 +1,80 @@ +{{- if .Values.services.dbos_worker.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + name: {{ .Release.Name }}-dbos-worker-wl + {{- include "plane.labelsAndAnnotations" (dict "context" $ "values" .Values.services.dbos_worker) }} +spec: + replicas: {{ .Values.services.dbos_worker.replicas | default 1 }} + selector: + matchLabels: + app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-dbos-worker + template: + metadata: + namespace: {{ .Release.Namespace }} + labels: + app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-dbos-worker + {{- include "plane.commonLabels" $ | nindent 8 }} + annotations: + timestamp: {{ now | quote }} + spec: + {{- include "plane.podScheduling" .Values.services.dbos_worker }} + {{- include "plane.podSecurityContext" . }} + containers: + - name: {{ .Release.Name }}-dbos-worker + {{- include "plane.containerSecurityContext" . }} + imagePullPolicy: {{ .Values.services.api.pullPolicy | default "Always" }} + image: {{ .Values.services.api.image | default "makeplane/backend-commercial" }}:{{ .Values.planeVersion }} + stdin: true + tty: true + resources: + requests: + memory: {{ .Values.services.dbos_worker.memoryRequest | default "500Mi" | quote }} + cpu: {{ .Values.services.dbos_worker.cpuRequest | default "250m" | quote }} + limits: + memory: {{ .Values.services.dbos_worker.memoryLimit | default "1000Mi" | quote }} + cpu: {{ .Values.services.dbos_worker.cpuLimit | default "500m" | quote}} + readinessProbe: + exec: + command: + - sh + - -c + - pgrep -f "python" > /dev/null + initialDelaySeconds: 10 + failureThreshold: 3 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 5 + command: + - ./bin/docker-entrypoint-dbos-worker.sh + envFrom: + - configMapRef: + name: {{ .Release.Name }}-dbos-worker-vars + optional: false + - configMapRef: + name: {{ .Release.Name }}-app-vars + optional: false + - secretRef: + name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }} + optional: false + - secretRef: + name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }} + optional: false + - secretRef: + name: {{ if not (empty .Values.external_secrets.opensearch_existingSecret) }}{{ .Values.external_secrets.opensearch_existingSecret }}{{ else }}{{ .Release.Name }}-opensearch-secrets{{ end }} + optional: false + {{- if .Values.services.silo.enabled }} + - secretRef: + name: {{ if not (empty .Values.external_secrets.silo_env_existingSecret) }}{{ .Values.external_secrets.silo_env_existingSecret }}{{ else }}{{ .Release.Name }}-silo-secrets{{ end }} + optional: false + {{- end }} + {{- if .Values.extraEnv }} + env: + {{- toYaml .Values.extraEnv | nindent 10 }} + {{- end }} + + serviceAccount: {{ .Release.Name }}-srv-account + serviceAccountName: {{ .Release.Name }}-srv-account +--- +{{- end }} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 8394e9a..73954c8 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -436,6 +436,20 @@ services: labels: {} annotations: {} + dbos_worker: + enabled: false + replicas: 1 + memoryLimit: 1000Mi + cpuLimit: 500m + memoryRequest: 500Mi + cpuRequest: 250m + assign_cluster_ip: false + nodeSelector: {} + tolerations: [] + affinity: {} + labels: {} + annotations: {} + pi: enabled: false replicas: 1 @@ -661,6 +675,11 @@ env: queue_name: "plane.webhook" prefetch_count: 10 + dbos_worker_envs: + system_database_url: '' + sys_db_pool_size: 10 + app_version: "v1.0.0" + runner_envs: execution_timeout_ms: "10000" init_timeout_ms: "5000" From af0f2e54ab9a00a964d7e06db758b8864cc2f661 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Mon, 20 Jul 2026 14:59:52 +0530 Subject: [PATCH 2/2] refactor(plane-enterprise): dbos-worker uses a secret for the DB URL; drop non-app env sources - Move DBOS_SYSTEM_DATABASE_URL out of the ConfigMap into a dedicated -dbos-worker-secrets Secret, defaulting to the Plane database URL and overridable via external_secrets.dbos_worker_existingSecret. - dbos-worker ConfigMap now holds only DBOS_SYS_DB_POOL_SIZE and DBOS_APP_VERSION. - Deployment envFrom limited to dbos-worker-secrets, dbos-worker-vars, app-vars, and app-secrets; drop doc-store, opensearch, and silo secret references. - values.yaml: add external_secrets.dbos_worker_existingSecret. - README: document DBOS_SYSTEM_DATABASE_URL under dbos_worker_existingSecret and update the values-reference note. --- charts/plane-enterprise/README.md | 3 ++- .../templates/config-secrets/dbos-worker.yaml | 22 ++++++++++++++++++- .../workloads/dbos-worker.deployment.yaml | 14 +++--------- charts/plane-enterprise/values.yaml | 1 + 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index ebbef44..d3a1fc6 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -809,7 +809,7 @@ Note: When the email service is enabled, the cert-issuer will be automatically c | services.dbos_worker.affinity | {} | | This key allows you to set the affinity rules for the deployment of `dbos_worker`. This is useful when you want to control how pods are scheduled on nodes in your Kubernetes cluster. | | services.dbos_worker.labels | {} | | Custom labels to add to the DBOS worker deployment | | services.dbos_worker.annotations | {} | | Custom annotations to add to the DBOS worker deployment | -| env.dbos_worker_envs.system_database_url | | | DBOS system database URL (`DBOS_SYSTEM_DATABASE_URL`). Leave empty to use the default | +| env.dbos_worker_envs.system_database_url | | | DBOS system database URL (`DBOS_SYSTEM_DATABASE_URL`), stored in the `-dbos-worker-secrets` Secret. Leave empty to default to the Plane database URL, or provide it via `dbos_worker_existingSecret`. | | env.dbos_worker_envs.sys_db_pool_size | 10 | | DBOS system database connection pool size (`DBOS_SYS_DB_POOL_SIZE`) | | env.dbos_worker_envs.app_version | "v1.0.0" | | DBOS application version (`DBOS_APP_VERSION`) | @@ -893,6 +893,7 @@ To configure the external secrets for your application, you need to define speci | | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` | | | `DATABASE_URL` | Yes | PostgreSQL connection URL | **k8s service example**: `postgresql://plane:plane@plane-pgdb.plane-ns.svc.cluster.local:5432/plane`

**external service example**: `postgresql://username:password@your-db-host:5432/plane` | | | `AMQP_URL` | Yes | RabbitMQ connection URL | **k8s service example**: `amqp://plane:plane@plane-rabbitmq.plane-ns.svc.cluster.local:5672/`

**external service example**: `amqp://username:password@your-rabbitmq-host:5672/` | +| dbos_worker_existingSecret | `DBOS_SYSTEM_DATABASE_URL` | Yes (if `services.dbos_worker.enabled=true`) | DBOS system database connection URL | **k8s service example**: `postgresql://plane:plane@plane-pgdb.plane-ns.svc.cluster.local:5432/plane`

**external service example**: `postgresql://username:password@your-db-host:5432/plane` | | live_env_existingSecret | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` | | silo_env_existingSecret | `SILO_HMAC_SECRET_KEY` | Yes | Silo HMAC secret Key | `` | | | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` | diff --git a/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml b/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml index 34543f5..37a478f 100644 --- a/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml +++ b/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml @@ -1,4 +1,25 @@ {{- if .Values.services.dbos_worker.enabled }} +{{- if empty .Values.external_secrets.dbos_worker_existingSecret }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + namespace: {{ .Release.Namespace }} + name: {{ .Release.Name }}-dbos-worker-secrets + labels: + {{- include "plane.commonLabels" $ | nindent 4 }} +stringData: + {{- if .Values.env.dbos_worker_envs.system_database_url }} + DBOS_SYSTEM_DATABASE_URL: {{ .Values.env.dbos_worker_envs.system_database_url | quote }} + {{- else if .Values.services.postgres.local_setup }} + DBOS_SYSTEM_DATABASE_URL: "postgresql://{{ .Values.env.pgdb_username }}:{{ .Values.env.pgdb_password }}@{{ .Release.Name }}-pgdb.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}/{{ .Values.env.pgdb_name }}" + {{- else if .Values.env.pgdb_remote_url }} + DBOS_SYSTEM_DATABASE_URL: {{ .Values.env.pgdb_remote_url | quote }} + {{- else }} + DBOS_SYSTEM_DATABASE_URL: "" + {{- end }} +--- +{{- end }} apiVersion: v1 kind: ConfigMap metadata: @@ -7,7 +28,6 @@ metadata: labels: {{- include "plane.commonLabels" $ | nindent 4 }} data: - DBOS_SYSTEM_DATABASE_URL: {{ .Values.env.dbos_worker_envs.system_database_url | default "" | quote }} DBOS_SYS_DB_POOL_SIZE: {{ .Values.env.dbos_worker_envs.sys_db_pool_size | default 10 | quote }} DBOS_APP_VERSION: {{ .Values.env.dbos_worker_envs.app_version | default "v1.0.0" | quote }} --- diff --git a/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml b/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml index 86fa3e7..3814c07 100644 --- a/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml +++ b/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml @@ -49,6 +49,9 @@ spec: command: - ./bin/docker-entrypoint-dbos-worker.sh envFrom: + - secretRef: + name: {{ if not (empty .Values.external_secrets.dbos_worker_existingSecret) }}{{ .Values.external_secrets.dbos_worker_existingSecret }}{{ else }}{{ .Release.Name }}-dbos-worker-secrets{{ end }} + optional: false - configMapRef: name: {{ .Release.Name }}-dbos-worker-vars optional: false @@ -58,17 +61,6 @@ spec: - secretRef: name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }} optional: false - - secretRef: - name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }} - optional: false - - secretRef: - name: {{ if not (empty .Values.external_secrets.opensearch_existingSecret) }}{{ .Values.external_secrets.opensearch_existingSecret }}{{ else }}{{ .Release.Name }}-opensearch-secrets{{ end }} - optional: false - {{- if .Values.services.silo.enabled }} - - secretRef: - name: {{ if not (empty .Values.external_secrets.silo_env_existingSecret) }}{{ .Values.external_secrets.silo_env_existingSecret }}{{ else }}{{ .Release.Name }}-silo-secrets{{ end }} - optional: false - {{- end }} {{- if .Values.extraEnv }} env: {{- toYaml .Values.extraEnv | nindent 10 }} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 73954c8..f4fb026 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -548,6 +548,7 @@ external_secrets: opensearch_existingSecret: '' doc_store_existingSecret: '' app_env_existingSecret: '' + dbos_worker_existingSecret: '' live_env_existingSecret: '' silo_env_existingSecret: '' pi_api_env_existingSecret: ''