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..d3a1fc6 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`), 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`) |
+
### Iframely Deployment
| Setting | Default | Required | Description |
@@ -873,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/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..37a478f
--- /dev/null
+++ b/charts/plane-enterprise/templates/config-secrets/dbos-worker.yaml
@@ -0,0 +1,34 @@
+{{- 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:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-dbos-worker-vars
+ labels:
+ {{- include "plane.commonLabels" $ | nindent 4 }}
+data:
+ 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..3814c07
--- /dev/null
+++ b/charts/plane-enterprise/templates/workloads/dbos-worker.deployment.yaml
@@ -0,0 +1,72 @@
+{{- 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:
+ - 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
+ - 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
+ {{- 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..f4fb026 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
@@ -534,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: ''
@@ -661,6 +676,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"