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"