From 1556320abd104512ee3a4bd9b41607db09e5910a Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 23 Jul 2026 15:47:49 +0530 Subject: [PATCH 01/17] feat(plane-enterprise): expose gunicorn rotation and celery broker env vars Add GUNICORN_MAX_REQUESTS, GUNICORN_MAX_REQUESTS_JITTER, CELERY_TASK_PUBLISH_RETRY, and CELERY_BROKER_POOL_LIMIT to the app-vars ConfigMap so operators can tune worker rotation and broker pool behaviour without rebuilding the image. Defaults set to Kubernetes-friendly values (rotation disabled, publish retry enabled, pool bounded to 10) to eliminate the silent task-dispatch failures reported in issue #261. Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/Chart.yaml | 2 +- charts/plane-enterprise/README.md | 4 ++++ charts/plane-enterprise/questions.yml | 20 +++++++++++++++++++ .../templates/config-secrets/app-env.yaml | 4 ++++ charts/plane-enterprise/values.yaml | 11 ++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/charts/plane-enterprise/Chart.yaml b/charts/plane-enterprise/Chart.yaml index 32f83301..db7b1e63 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.0.1 appVersion: "3.0.0" home: https://plane.so/ diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index 1fa17fe0..c8211e42 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -498,6 +498,10 @@ securityContext: | env.web_url | | | (optional) Custom Web URL for the application. If not set, it will be auto-generated based on the license domain and SSL settings | | env.webhook_allowed_ips | | | (optional) Comma-separated list of IPs/CIDRs that webhooks are allowed to target. Leave empty to allow all. | | env.webhook_allowed_hosts | | | (optional) Comma-separated list of hostnames that webhooks are allowed to target. Leave empty to allow all. | +| env.gunicorn_max_requests | 0 | | Maximum requests a gunicorn worker handles before restart. Default `0` disables rotation — recommended for Kubernetes where pod lifecycle is managed by the orchestrator. Set to a positive integer (e.g. `1200`) to re-enable periodic rotation. | +| env.gunicorn_max_requests_jitter | 0 | | Random jitter added to `GUNICORN_MAX_REQUESTS` to stagger worker restarts across replicas. Set to `0` when rotation is disabled. | +| env.celery_task_publish_retry | true | | When `true`, Celery retries task publishing on transient AMQP failures instead of silently dropping tasks. Prevents stuck export/import records caused by brief broker reconnect windows. | +| env.celery_broker_pool_limit | 10 | | Bounds the Celery broker connection pool. Prevents stale connections from accumulating without bound; tune relative to worker concurrency. | | services.api.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service | | services.api.nodeSelector | {} | | This key allows you to set the node selector for the deployment of `api`. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. | | services.api.tolerations | [] | | This key allows you to set the tolerations for the deployment of `api`. This is useful when you want to run the deployment on nodes with specific taints in your Kubernetes cluster. | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 12241b87..ca390113 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -550,6 +550,26 @@ questions: label: "Webhook Allowed Hosts" type: string default: "" + - variable: env.gunicorn_max_requests + label: "Gunicorn Max Requests" + description: "Maximum number of requests a gunicorn worker handles before being restarted. Set to 0 to disable rotation (recommended for Kubernetes)." + type: int + default: 0 + - variable: env.gunicorn_max_requests_jitter + label: "Gunicorn Max Requests Jitter" + description: "Random jitter added to GUNICORN_MAX_REQUESTS to stagger worker restarts. Set to 0 when rotation is disabled." + type: int + default: 0 + - variable: env.celery_task_publish_retry + label: "Celery Task Publish Retry" + description: "Retry task publishing on transient AMQP failures instead of silently dropping tasks." + type: boolean + default: true + - variable: env.celery_broker_pool_limit + label: "Celery Broker Pool Limit" + description: "Maximum number of connections in the Celery broker connection pool. Limits stale connection accumulation." + type: int + default: 10 - variable: services.external_api.enabled label: "Enable External API" type: boolean diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index 269e639a..f0cfe4d8 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -76,6 +76,10 @@ data: DEBUG: "0" DOCKERIZED: "1" GUNICORN_WORKERS: "1" + GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | default 0 | quote }} + GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | default 0 | quote }} + CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | default true | ternary "True" "False" | quote }} + CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | default 10 | quote }} {{- if .Values.env.web_url}} WEB_URL: {{ .Values.env.web_url | default "" | quote }} {{- else if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 8394e9af..a1012d55 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -598,6 +598,17 @@ env: secret_key: "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5" api_key_rate_limit: "60/minute" + # Gunicorn worker rotation settings. Set to 0 to disable rotation (recommended for Kubernetes, + # where pod lifecycle is managed by the orchestrator rather than the worker process itself). + gunicorn_max_requests: 0 + gunicorn_max_requests_jitter: 0 + + # Celery broker settings. + # celery_task_publish_retry: retry task publishing on transient AMQP failures instead of silently dropping. + # celery_broker_pool_limit: bound the connection pool to prevent stale connections accumulating. + celery_task_publish_retry: true + celery_broker_pool_limit: 10 + sentry_dsn: '' sentry_environment: '' From 30ac77ab807bef0f43b192b82557f5d911410613 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 23 Jul 2026 15:50:07 +0530 Subject: [PATCH 02/17] feat(plane-enterprise): expose gunicorn/celery envs and add PLANE_INTERNAL_API_HOST to pi-api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add to app-vars ConfigMap (configurable via values.yaml): - GUNICORN_MAX_REQUESTS (default 0 — rotation disabled, recommended for K8s) - GUNICORN_MAX_REQUESTS_JITTER (default 0) - CELERY_TASK_PUBLISH_RETRY (default True — prevent silent task drops on AMQP reconnect) - CELERY_BROKER_POOL_LIMIT (default 10 — bound connection pool to avoid stale accumulation) Add to pi-api-vars ConfigMap (hardcoded internal cluster URL): - PLANE_INTERNAL_API_HOST — points directly to the in-cluster API service Fixes the silent CSV export failures reported in issue #261 where gunicorn worker rotation caused stale AMQP connections to silently discard published tasks. Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml index 6305673e..a5f8297d 100644 --- a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml @@ -109,6 +109,7 @@ data: FEATURE_FLAG_SERVER_BASE_URL: "http://{{ .Release.Name }}-monitor.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8080" PI_BASE_PATH: "/pi" + PLANE_INTERNAL_API_HOST: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000" {{- if eq .Values.env.pi_envs.cors_allowed_origins "*"}} From dfa566f74af7ccd6a2248d2721b51911e9e67f77 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 23 Jul 2026 15:53:47 +0530 Subject: [PATCH 03/17] fix(plane-enterprise): use ternary directly for CELERY_TASK_PUBLISH_RETRY Align with existing boolean pattern (ternary without default) so that setting celery_task_publish_retry: false in values.yaml is respected. Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/templates/config-secrets/app-env.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index f0cfe4d8..c1af44f5 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -78,7 +78,7 @@ data: GUNICORN_WORKERS: "1" GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | default 0 | quote }} GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | default 0 | quote }} - CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | default true | ternary "True" "False" | quote }} + CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | ternary "True" "False" | quote }} CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | default 10 | quote }} {{- if .Values.env.web_url}} WEB_URL: {{ .Values.env.web_url | default "" | quote }} From 8f619382f4abbc71f5879ec49f9f1db7dba54849 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 23 Jul 2026 17:23:52 +0530 Subject: [PATCH 04/17] feat(plane-enterprise): update gunicorn and celery environment variables for improved configuration --- charts/plane-enterprise/README.md | 4 ++-- charts/plane-enterprise/questions.yml | 6 +++--- .../plane-enterprise/templates/config-secrets/app-env.yaml | 4 ++-- charts/plane-enterprise/values.yaml | 7 +++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index c8211e42..3c90d31c 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -498,8 +498,8 @@ securityContext: | env.web_url | | | (optional) Custom Web URL for the application. If not set, it will be auto-generated based on the license domain and SSL settings | | env.webhook_allowed_ips | | | (optional) Comma-separated list of IPs/CIDRs that webhooks are allowed to target. Leave empty to allow all. | | env.webhook_allowed_hosts | | | (optional) Comma-separated list of hostnames that webhooks are allowed to target. Leave empty to allow all. | -| env.gunicorn_max_requests | 0 | | Maximum requests a gunicorn worker handles before restart. Default `0` disables rotation — recommended for Kubernetes where pod lifecycle is managed by the orchestrator. Set to a positive integer (e.g. `1200`) to re-enable periodic rotation. | -| env.gunicorn_max_requests_jitter | 0 | | Random jitter added to `GUNICORN_MAX_REQUESTS` to stagger worker restarts across replicas. Set to `0` when rotation is disabled. | +| env.gunicorn_max_requests | 1000 | | Maximum requests a gunicorn worker handles before restart. Set to `0` to disable rotation. | +| env.gunicorn_max_requests_jitter | 150 | | Random jitter added to `GUNICORN_MAX_REQUESTS` to stagger worker restarts across replicas. Set to `0` when rotation is disabled. | | env.celery_task_publish_retry | true | | When `true`, Celery retries task publishing on transient AMQP failures instead of silently dropping tasks. Prevents stuck export/import records caused by brief broker reconnect windows. | | env.celery_broker_pool_limit | 10 | | Bounds the Celery broker connection pool. Prevents stale connections from accumulating without bound; tune relative to worker concurrency. | | services.api.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index ca390113..05a87bb9 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -552,14 +552,14 @@ questions: default: "" - variable: env.gunicorn_max_requests label: "Gunicorn Max Requests" - description: "Maximum number of requests a gunicorn worker handles before being restarted. Set to 0 to disable rotation (recommended for Kubernetes)." + description: "Maximum number of requests a gunicorn worker handles before being restarted. Set to 0 to disable rotation." type: int - default: 0 + default: 1000 - variable: env.gunicorn_max_requests_jitter label: "Gunicorn Max Requests Jitter" description: "Random jitter added to GUNICORN_MAX_REQUESTS to stagger worker restarts. Set to 0 when rotation is disabled." type: int - default: 0 + default: 150 - variable: env.celery_task_publish_retry label: "Celery Task Publish Retry" description: "Retry task publishing on transient AMQP failures instead of silently dropping tasks." diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index c1af44f5..a88762e2 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -76,8 +76,8 @@ data: DEBUG: "0" DOCKERIZED: "1" GUNICORN_WORKERS: "1" - GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | default 0 | quote }} - GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | default 0 | quote }} + GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | default 1000 | quote }} + GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | default 150 | quote }} CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | ternary "True" "False" | quote }} CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | default 10 | quote }} {{- if .Values.env.web_url}} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index a1012d55..ca113d40 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -598,10 +598,9 @@ env: secret_key: "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5" api_key_rate_limit: "60/minute" - # Gunicorn worker rotation settings. Set to 0 to disable rotation (recommended for Kubernetes, - # where pod lifecycle is managed by the orchestrator rather than the worker process itself). - gunicorn_max_requests: 0 - gunicorn_max_requests_jitter: 0 + # Gunicorn worker rotation settings. + gunicorn_max_requests: 1000 + gunicorn_max_requests_jitter: 150 # Celery broker settings. # celery_task_publish_retry: retry task publishing on transient AMQP failures instead of silently dropping. From f7a672ecf22738645d476b05c777478fd8401b3e Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Fri, 24 Jul 2026 13:42:00 +0530 Subject: [PATCH 05/17] feat(plane-enterprise): quote gunicorn and celery environment variable values for consistency --- .../plane-enterprise/templates/config-secrets/app-env.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index a88762e2..5abd6da4 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -76,10 +76,10 @@ data: DEBUG: "0" DOCKERIZED: "1" GUNICORN_WORKERS: "1" - GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | default 1000 | quote }} - GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | default 150 | quote }} + GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | quote }} + GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | quote }} CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | ternary "True" "False" | quote }} - CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | default 10 | quote }} + CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | quote }} {{- if .Values.env.web_url}} WEB_URL: {{ .Values.env.web_url | default "" | quote }} {{- else if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} From da96e4f2eb98ebcfbc2301f88d763146e630c94b Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 30 Jul 2026 13:45:51 +0530 Subject: [PATCH 06/17] chore(plane-enterprise): add IS_SELF_MANAGED and AI usage env vars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IS_SELF_MANAGED hardcoded to "0" in app-vars and pi-api-vars ConfigMaps - AI_USAGE_AGENT_MAX_TOKENS_BUDGET added to api and pi containers (default: empty) - AI_USAGE_ENFORCEMENT_ENABLED added to pi containers only (default: 1) - Bump chart version 3.0.0 → 3.0.1 Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/Chart.yaml | 2 +- charts/plane-enterprise/questions.yml | 8 ++++++++ .../templates/config-secrets/app-env.yaml | 2 ++ .../templates/config-secrets/pi-api-env.yaml | 4 ++++ charts/plane-enterprise/values.yaml | 3 +++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/charts/plane-enterprise/Chart.yaml b/charts/plane-enterprise/Chart.yaml index 32f83301..db7b1e63 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.0.1 appVersion: "3.0.0" home: https://plane.so/ diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 12241b87..d9b2b807 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -970,6 +970,14 @@ questions: label: "CORS Allowed Origins" type: string default: "" + - variable: env.pi_envs.ai_usage_agent_max_tokens_budget + label: "AI Usage Agent Max Tokens Budget" + type: string + default: "" + - variable: env.pi_envs.ai_usage_enforcement_enabled + label: "AI Usage Enforcement Enabled" + type: boolean + default: true - variable: env.pi_envs.celery.vector_sync_enabled label: "Vector Sync Enabled" type: boolean diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index 269e639a..81a00efd 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -111,3 +111,5 @@ data: WEBHOOK_ALLOWED_IPS: {{ .Values.env.webhook_allowed_ips | default "" | quote }} WEBHOOK_ALLOWED_HOSTS: {{ .Values.env.webhook_allowed_hosts | default "" | quote }} + IS_SELF_MANAGED: "0" + AI_USAGE_AGENT_MAX_TOKENS_BUDGET: {{ .Values.env.pi_envs.ai_usage_agent_max_tokens_budget | default "" | quote }} diff --git a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml index 6305673e..6c4f7b9a 100644 --- a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml @@ -157,6 +157,10 @@ data: BR_AWS_REGION: {{ .Values.services.pi.ai_providers.embedding_model.aws_region | default "us-east-1" | quote }} {{- end }} + IS_SELF_MANAGED: "0" + AI_USAGE_AGENT_MAX_TOKENS_BUDGET: {{ .Values.env.pi_envs.ai_usage_agent_max_tokens_budget | default "" | quote }} + AI_USAGE_ENFORCEMENT_ENABLED: {{ .Values.env.pi_envs.ai_usage_enforcement_enabled | default true | ternary "1" "0" | quote }} + CELERY_VECTOR_SYNC_ENABLED: {{ .Values.env.pi_envs.celery.vector_sync_enabled | ternary "1" "0" | quote }} CELERY_VECTOR_SYNC_INTERVAL: {{ .Values.env.pi_envs.celery.vector_sync_interval | default 3 | quote }} CELERY_WORKSPACE_PLAN_SYNC_ENABLED: {{ .Values.env.pi_envs.celery.workspace_plan_sync_enabled | ternary "1" "0" | quote }} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 8394e9af..de92e779 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -677,6 +677,9 @@ env: internal_secret: 'tyfvfqvBJAgpm9bzvf3r4urJer0Ehfdubk' log_level: 'DEBUG' + ai_usage_agent_max_tokens_budget: '' + ai_usage_enforcement_enabled: true + celery: vector_sync_enabled: false vector_sync_interval: 3 From cbb7d5ab480b823edc08743acbde174eb87e8304 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 30 Jul 2026 14:02:43 +0530 Subject: [PATCH 07/17] feat(plane-enterprise): update AI usage enforcement variable handling in pi-api-env.yaml --- .../plane-enterprise/templates/config-secrets/pi-api-env.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml index 6c4f7b9a..39e3ed58 100644 --- a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml @@ -159,7 +159,7 @@ data: IS_SELF_MANAGED: "0" AI_USAGE_AGENT_MAX_TOKENS_BUDGET: {{ .Values.env.pi_envs.ai_usage_agent_max_tokens_budget | default "" | quote }} - AI_USAGE_ENFORCEMENT_ENABLED: {{ .Values.env.pi_envs.ai_usage_enforcement_enabled | default true | ternary "1" "0" | quote }} + AI_USAGE_ENFORCEMENT_ENABLED: {{ .Values.env.pi_envs.ai_usage_enforcement_enabled | ternary "1" "0" | quote }} CELERY_VECTOR_SYNC_ENABLED: {{ .Values.env.pi_envs.celery.vector_sync_enabled | ternary "1" "0" | quote }} CELERY_VECTOR_SYNC_INTERVAL: {{ .Values.env.pi_envs.celery.vector_sync_interval | default 3 | quote }} From 221759332cbfab9ed922d48e36594c0262d01919 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Thu, 30 Jul 2026 14:21:26 +0530 Subject: [PATCH 08/17] chore(plane-enterprise): remove IS_SELF_MANAGED from ConfigMaps Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/templates/config-secrets/app-env.yaml | 1 - charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index 81a00efd..74808275 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -111,5 +111,4 @@ data: WEBHOOK_ALLOWED_IPS: {{ .Values.env.webhook_allowed_ips | default "" | quote }} WEBHOOK_ALLOWED_HOSTS: {{ .Values.env.webhook_allowed_hosts | default "" | quote }} - IS_SELF_MANAGED: "0" AI_USAGE_AGENT_MAX_TOKENS_BUDGET: {{ .Values.env.pi_envs.ai_usage_agent_max_tokens_budget | default "" | quote }} diff --git a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml index 39e3ed58..862742ee 100644 --- a/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml @@ -157,7 +157,6 @@ data: BR_AWS_REGION: {{ .Values.services.pi.ai_providers.embedding_model.aws_region | default "us-east-1" | quote }} {{- end }} - IS_SELF_MANAGED: "0" AI_USAGE_AGENT_MAX_TOKENS_BUDGET: {{ .Values.env.pi_envs.ai_usage_agent_max_tokens_budget | default "" | quote }} AI_USAGE_ENFORCEMENT_ENABLED: {{ .Values.env.pi_envs.ai_usage_enforcement_enabled | ternary "1" "0" | quote }} From a76f629a95a6133909c7d8438a00b18f946fc34c Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Mon, 3 Aug 2026 13:28:46 +0530 Subject: [PATCH 09/17] fix(app-env): update CELERY_TASK_PUBLISH_RETRY to use integer values --- charts/plane-enterprise/templates/config-secrets/app-env.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/plane-enterprise/templates/config-secrets/app-env.yaml b/charts/plane-enterprise/templates/config-secrets/app-env.yaml index aad53902..7675020d 100644 --- a/charts/plane-enterprise/templates/config-secrets/app-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/app-env.yaml @@ -78,7 +78,7 @@ data: GUNICORN_WORKERS: "1" GUNICORN_MAX_REQUESTS: {{ .Values.env.gunicorn_max_requests | quote }} GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | quote }} - CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | ternary "True" "False" | quote }} + CELERY_TASK_PUBLISH_RETRY: {{ .Values.env.celery_task_publish_retry | ternary "1" "0" | quote }} CELERY_BROKER_POOL_LIMIT: {{ .Values.env.celery_broker_pool_limit | quote }} {{- if .Values.env.web_url}} WEB_URL: {{ .Values.env.web_url | default "" | quote }} From 1b1a28a570a3a966eefc2aa59c182cd51302211e Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Mon, 3 Aug 2026 13:58:52 +0530 Subject: [PATCH 10/17] chore(plane-enterprise): add missing silo connector and routing envs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires env vars defined in silo's env.ts schema that were absent from the plane-enterprise Helm chart: **Secrets (connector blocks):** - SLACK_SIGNING_SECRET — added to the slack connector conditional block - GITHUB_WEBHOOK_SECRET — added to the github connector conditional block - Bitbucket connector block (BITBUCKET_CLIENT_ID/SECRET/WEBHOOK_SECRET) - Flatfile connector block (FLATFILE_API_KEY) - HubSpot connector block (HUBSPOT_CLIENT_ID/SECRET) **ConfigMap:** - API_INTERNAL_BASE_URL — defaults to the same in-cluster API service DNS as API_BASE_URL; overridable via env.silo_envs.api_internal_base_url - IS_SELF_MANAGED — hardcoded "1" (EE deployments are always self-managed) values.yaml, questions.yml, and README.md updated accordingly. Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/README.md | 11 ++++ charts/plane-enterprise/questions.yml | 61 +++++++++++++++++++ .../templates/config-secrets/silo.yaml | 20 ++++++ charts/plane-enterprise/values.yaml | 15 +++++ 4 files changed, 107 insertions(+) diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index 3c90d31c..d7bb0a47 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -547,12 +547,14 @@ securityContext: | services.silo.connectors.slack.client_id | "" | required if `services.silo.connectors.slack.enabled` is `true` | Slack Client ID | | services.silo.connectors.slack.client_secret | "" | required if `services.silo.connectors.slack.enabled` is `true` | Slack Client Secret | | services.silo.connectors.slack.base_url | "" | | Base URL for the Slack API (`SLACK_BASE_URL`, e.g. `https://slack.com`), stored in the silo Secret; used when the Slack connector is enabled | +| services.silo.connectors.slack.signing_secret | "" | | Slack Signing Secret (`SLACK_SIGNING_SECRET`) used to verify webhook request authenticity; stored in the silo Secret | | services.silo.connectors.github.enabled | false | | Github App Integration | | services.silo.connectors.github.client_id | "" | required if `services.silo.connectors.github.enabled` is `true` | Github Client ID | | services.silo.connectors.github.client_secret | "" | required if `services.silo.connectors.github.enabled` is `true` | Github Client Secret | | services.silo.connectors.github.app_name | "" | required if `services.silo.connectors.github.enabled` is `true` | Github App Name | | services.silo.connectors.github.app_id | "" | required if `services.silo.connectors.github.enabled` is `true` | Github App ID | | services.silo.connectors.github.private_key | "" | required if `services.silo.connectors.github.enabled` is `true` | Github Private Key | +| services.silo.connectors.github.webhook_secret | "" | | GitHub Webhook Secret (`GITHUB_WEBHOOK_SECRET`) used to verify webhook payload signatures; stored in the silo Secret | | services.silo.connectors.gitlab.enabled | false | | Gitlab App Integration | | services.silo.connectors.gitlab.client_id | "" | required if `services.silo.connectors.gitlab.enabled` is `true` | Gitlab Client ID | | services.silo.connectors.gitlab.client_secret | "" | required if `services.silo.connectors.gitlab.enabled` is `true` | Gitlab Client Secret | @@ -561,6 +563,15 @@ securityContext: | services.silo.connectors.sentry.client_id | "" | required if `services.silo.connectors.sentry.enabled` is `true` | Sentry Client ID | | services.silo.connectors.sentry.client_secret | "" | required if `services.silo.connectors.sentry.enabled` is `true` | Sentry Client Secret | | services.silo.connectors.sentry.integration_slug | "" | required if `services.silo.connectors.sentry.enabled` is `true` | Sentry Integration Slug | +| services.silo.connectors.bitbucket.enabled | false | | Bitbucket Integration | +| services.silo.connectors.bitbucket.client_id | "" | required if `services.silo.connectors.bitbucket.enabled` is `true` | Bitbucket OAuth Client ID | +| services.silo.connectors.bitbucket.client_secret | "" | required if `services.silo.connectors.bitbucket.enabled` is `true` | Bitbucket OAuth Client Secret | +| services.silo.connectors.bitbucket.webhook_secret | "" | | Bitbucket Webhook Secret (`BITBUCKET_WEBHOOK_SECRET`) for verifying incoming webhook payloads | +| services.silo.connectors.flatfile.enabled | false | | Flatfile Integration | +| services.silo.connectors.flatfile.api_key | "" | required if `services.silo.connectors.flatfile.enabled` is `true` | Flatfile API Key | +| services.silo.connectors.hubspot.enabled | false | | HubSpot Integration | +| services.silo.connectors.hubspot.client_id | "" | required if `services.silo.connectors.hubspot.enabled` is `true` | HubSpot OAuth Client ID | +| services.silo.connectors.hubspot.client_secret | "" | required if `services.silo.connectors.hubspot.enabled` is `true` | HubSpot OAuth Client Secret | | env.silo_envs.mq_prefetch_count | 10 | | Prefetch count for RabbitMQ | | env.silo_envs.batch_size | 60 | | Batch size for Silo | | env.silo_envs.request_interval | 400 | | Request interval for Silo | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 3be96094..804a8628 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -351,6 +351,11 @@ questions: label: "Cursor Webhook Secret" type: string default: "TTqazTcoBajYKzIAeIKFZeTX9czAoUsG" + - variable: env.silo_envs.api_internal_base_url + label: "API Internal Base URL" + description: "Internal cluster URL for the API service. Defaults to the in-cluster service DNS when left empty." + type: string + default: "" - variable: services.silo.connectors.slack.enabled label: "Slack Integration" @@ -371,6 +376,10 @@ questions: label: "Slack Base URL" type: string default: "" + - variable: services.silo.connectors.slack.signing_secret + label: "Slack Signing Secret" + type: string + default: "" - variable: services.silo.connectors.github.enabled label: "Github App Integration" @@ -399,6 +408,10 @@ questions: label: "Github Private Key" type: string default: "" + - variable: services.silo.connectors.github.webhook_secret + label: "Github Webhook Secret" + type: string + default: "" - variable: services.silo.connectors.gitlab.enabled label: "Gitlab App Integration" @@ -440,6 +453,54 @@ questions: type: string default: "" +- variable: services.silo.connectors.bitbucket.enabled + label: "Bitbucket Integration" + type: boolean + default: false + group: "Silo Connectors" + show_subquestion_if: true + subquestions: + - variable: services.silo.connectors.bitbucket.client_id + label: "Bitbucket Client ID" + type: string + default: "" + - variable: services.silo.connectors.bitbucket.client_secret + label: "Bitbucket Client Secret" + type: string + default: "" + - variable: services.silo.connectors.bitbucket.webhook_secret + label: "Bitbucket Webhook Secret" + type: string + default: "" + +- variable: services.silo.connectors.flatfile.enabled + label: "Flatfile Integration" + type: boolean + default: false + group: "Silo Connectors" + show_subquestion_if: true + subquestions: + - variable: services.silo.connectors.flatfile.api_key + label: "Flatfile API Key" + type: string + default: "" + +- variable: services.silo.connectors.hubspot.enabled + label: "HubSpot Integration" + type: boolean + default: false + group: "Silo Connectors" + show_subquestion_if: true + subquestions: + - variable: services.silo.connectors.hubspot.client_id + label: "HubSpot Client ID" + type: string + default: "" + - variable: services.silo.connectors.hubspot.client_secret + label: "HubSpot Client Secret" + type: string + default: "" + - variable: services.monitor.pullPolicy label: "Monitor Pull Policy" type: enum diff --git a/charts/plane-enterprise/templates/config-secrets/silo.yaml b/charts/plane-enterprise/templates/config-secrets/silo.yaml index a201f686..de8686e6 100644 --- a/charts/plane-enterprise/templates/config-secrets/silo.yaml +++ b/charts/plane-enterprise/templates/config-secrets/silo.yaml @@ -39,6 +39,7 @@ stringData: SLACK_CLIENT_SECRET: {{ .Values.services.silo.connectors.slack.client_secret | default "" | quote }} SLACK_CLIENT_ID: {{ .Values.services.silo.connectors.slack.client_id | default "" | quote }} SLACK_BASE_URL: {{ .Values.services.silo.connectors.slack.base_url | default "" | quote }} + SLACK_SIGNING_SECRET: {{ .Values.services.silo.connectors.slack.signing_secret | default "" | quote }} {{- end }} {{- if .Values.services.silo.connectors.github.enabled }} GITHUB_CLIENT_SECRET: {{ .Values.services.silo.connectors.github.client_secret | default "" | quote }} @@ -46,6 +47,7 @@ stringData: GITHUB_CLIENT_ID: {{ .Values.services.silo.connectors.github.client_id | default "" | quote }} GITHUB_APP_NAME: {{ .Values.services.silo.connectors.github.app_name | default "" | quote }} GITHUB_APP_ID: {{ .Values.services.silo.connectors.github.app_id | default "" | quote }} + GITHUB_WEBHOOK_SECRET: {{ .Values.services.silo.connectors.github.webhook_secret | default "" | quote }} {{- end }} {{- if .Values.services.silo.connectors.gitlab.enabled }} GITLAB_CLIENT_SECRET: {{ .Values.services.silo.connectors.gitlab.client_secret | default "" | quote }} @@ -57,6 +59,18 @@ stringData: SENTRY_CLIENT_SECRET: {{ .Values.services.silo.connectors.sentry.client_secret | default "" | quote }} SENTRY_INTEGRATION_SLUG: {{ .Values.services.silo.connectors.sentry.integration_slug | default "" | quote }} {{- end }} + {{- if .Values.services.silo.connectors.bitbucket.enabled }} + BITBUCKET_CLIENT_ID: {{ .Values.services.silo.connectors.bitbucket.client_id | default "" | quote }} + BITBUCKET_CLIENT_SECRET: {{ .Values.services.silo.connectors.bitbucket.client_secret | default "" | quote }} + BITBUCKET_WEBHOOK_SECRET: {{ .Values.services.silo.connectors.bitbucket.webhook_secret | default "" | quote }} + {{- end }} + {{- if .Values.services.silo.connectors.flatfile.enabled }} + FLATFILE_API_KEY: {{ .Values.services.silo.connectors.flatfile.api_key | default "" | quote }} + {{- end }} + {{- if .Values.services.silo.connectors.hubspot.enabled }} + HUBSPOT_CLIENT_ID: {{ .Values.services.silo.connectors.hubspot.client_id | default "" | quote }} + HUBSPOT_CLIENT_SECRET: {{ .Values.services.silo.connectors.hubspot.client_secret | default "" | quote }} + {{- end }} {{- end }} --- {{- if .Values.services.silo.enabled }} @@ -90,6 +104,11 @@ data: {{- end }} API_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" + {{- if .Values.env.silo_envs.api_internal_base_url }} + API_INTERNAL_BASE_URL: {{ .Values.env.silo_envs.api_internal_base_url | quote }} + {{- else }} + API_INTERNAL_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" + {{- end }} {{- if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} SILO_API_BASE_URL: "https://{{ .Values.license.licenseDomain }}" @@ -109,5 +128,6 @@ data: SENTRY_ENVIRONMENT: {{ .Values.env.silo_envs.sentry_environment | default "development" | quote }} SENTRY_TRACES_SAMPLE_RATE: {{ .Values.env.silo_envs.sentry_traces_sample_rate | default "0.1" | quote }} + {{- end }} --- \ No newline at end of file diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 12a5a746..40570b1d 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -360,6 +360,7 @@ services: client_id: '' client_secret: '' base_url: '' + signing_secret: '' github: enabled: false client_id: '' @@ -367,6 +368,7 @@ services: app_name: '' app_id: '' private_key: '' + webhook_secret: '' gitlab: enabled: false client_id: '' @@ -377,6 +379,18 @@ services: client_id: '' client_secret: '' integration_slug: '' + bitbucket: + enabled: false + client_id: '' + client_secret: '' + webhook_secret: '' + flatfile: + enabled: false + api_key: '' + hubspot: + enabled: false + client_id: '' + client_secret: '' email_service: enabled: false @@ -640,6 +654,7 @@ env: jira_server_issues_page_size: 50 jira_server_issues_parallel_pages: 1 cursor_webhook_secret: 'TTqazTcoBajYKzIAeIKFZeTX9czAoUsG' + api_internal_base_url: '' email_service_envs: smtp_domain: '' From 4dfd37a96ac7d82c01ad8bd6c30d4f1b2f67f921 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Mon, 3 Aug 2026 16:07:14 +0530 Subject: [PATCH 11/17] [INFRA-473] feat(plane-enterprise): add live-exporter service and EXPORT_QUEUE_NAME env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add live-exporter Deployment (same image as live, LIVE_MODE=exporter, no HTTP port) - Add AMQP_URL to live-secrets (Secret) for live and live-exporter - Add EXPORT_QUEUE_NAME to live-vars ConfigMap (default: plane-exports) - Declare services.live_exporter and env.export_queue_name in values.yaml - Add Rancher form entries in questions.yml - Document in README under Live Exporter and live_env_existingSecret sections - Bump chart version 3.0.0 → 3.1.0 Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/Chart.yaml | 2 +- charts/plane-enterprise/README.md | 18 +++++++ charts/plane-enterprise/questions.yml | 33 ++++++++++++ .../templates/config-secrets/live-env.yaml | 9 ++++ .../workloads/live-exporter.deployment.yaml | 54 +++++++++++++++++++ charts/plane-enterprise/values.yaml | 19 +++++++ 6 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml diff --git a/charts/plane-enterprise/Chart.yaml b/charts/plane-enterprise/Chart.yaml index 32f83301..e1eb826e 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 1fa17fe0..8e9c9572 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -455,6 +455,7 @@ securityContext: | env.live_sentry_environment | | | (optional) Live service deployment comes with some of the preconfigured integration. Sentry is one among those. Here user can set the Sentry environment name (as configured in Sentry) for this integration. | | env.live_sentry_traces_sample_rate | | | (optional) Live service deployment comes with some of the preconfigured integration. Sentry is one among those. Here user can set the Sentry trace sample rate (as configured in Sentry) for this integration. | | env.live_server_secret_key | htbqvBJAgpm9bzvf3r4urJer0ENReatceh | | Live Server Secret Key | +| env.export_queue_name | plane-exports | | RabbitMQ queue name for background PDF/DOCX export jobs consumed by the `live-exporter` service. | | env.external_iframely_url | "" | | External Iframely service URL. If provided, the local Iframely deployment will be skipped and the live service will use this external URL | | services.live.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service | | services.live.nodeSelector | {} | | This key allows you to set the node selector for the deployment of `live`. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. | @@ -463,6 +464,21 @@ securityContext: | services.live.labels | {} | | Custom labels to add to the live deployment | | services.live.annotations | {} | | Custom annotations to add to the live deployment | +### Live Exporter Deployment + +| Setting | Default | Required | Description | +| ----------------------------------------- | :------------------------: | :------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| services.live_exporter.enabled | true | | Enable or disable the background PDF/DOCX export worker. Reuses the `live` image but boots in `exporter` mode (pure queue consumer, no HTTP port). | +| services.live_exporter.replicas | 1 | Yes | Number of exporter pods. PDF render footprint is 500MB–2GB per job; scale horizontally rather than increasing concurrency per pod. | +| services.live_exporter.memoryLimit | 2000Mi | | Memory limit for the exporter pod. Set higher if rendering large documents. | +| services.live_exporter.cpuLimit | 1000m | | CPU limit for the exporter pod. | +| services.live_exporter.memoryRequest | 50Mi | | Memory request for the exporter pod. | +| services.live_exporter.cpuRequest | 50m | | CPU request for the exporter pod. | +| services.live_exporter.image | makeplane/live-commercial | | Docker image for the exporter. Must match the `live` service image. | +| services.live_exporter.nodeSelector | {} | | Node selector for the exporter pod. | +| services.live_exporter.tolerations | [] | | Tolerations for the exporter pod. | +| services.live_exporter.affinity | {} | | Affinity rules for the exporter pod. | + ### Monitor Deployment | Setting | Default | Required | Description | @@ -874,6 +890,8 @@ To configure the external secrets for your application, you need to define speci | | `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/` | | live_env_existingSecret | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` | +| | `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/` | +| | `LIVE_SERVER_SECRET_KEY` | Yes | Live server secret key | `htbqvBJAgpm9bzvf3r4urJer0ENReatceh` | | 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/` | | | `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` | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 12241b87..4c11f66e 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -267,6 +267,39 @@ questions: label: "Live Server Secret Key" type: string default: "htbqvBJAgpm9bzvf3r4urJer0ENReatceh" + - variable: env.export_queue_name + label: "Export Queue Name" + description: "RabbitMQ queue name for background PDF/DOCX export jobs consumed by the live-exporter service." + type: string + default: "plane-exports" + +- variable: services.live_exporter.enabled + label: "Install Live Exporter Service" + type: boolean + default: true + group: "Live Exporter Setup" + show_subquestion_if: true + subquestions: + - variable: services.live_exporter.replicas + label: "Default Replica Count" + type: int + default: 1 + - variable: services.live_exporter.memoryLimit + label: "Memory Limit" + type: string + default: 2000Mi + - variable: services.live_exporter.cpuLimit + label: "CPU Limit" + type: string + default: 1000m + - variable: services.live_exporter.memoryRequest + label: "Memory Request" + type: string + default: 50Mi + - variable: services.live_exporter.cpuRequest + label: "CPU Request" + type: string + default: 50m - variable: services.silo.enabled label: "Install Silo Service" diff --git a/charts/plane-enterprise/templates/config-secrets/live-env.yaml b/charts/plane-enterprise/templates/config-secrets/live-env.yaml index 16855c46..05470869 100644 --- a/charts/plane-enterprise/templates/config-secrets/live-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/live-env.yaml @@ -14,6 +14,13 @@ stringData: {{- else }} REDIS_URL: {{ .Values.env.remote_redis_url | default "" | quote }} {{- end }} + {{- if .Values.services.rabbitmq.local_setup }} + AMQP_URL: "amqp://{{ .Values.services.rabbitmq.default_user }}:{{ .Values.services.rabbitmq.default_password }}@{{ .Release.Name }}-rabbitmq.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}/" + {{- else if .Values.services.rabbitmq.external_rabbitmq_url }} + AMQP_URL: {{ .Values.services.rabbitmq.external_rabbitmq_url | quote }} + {{- else }} + AMQP_URL: "" + {{- end }} {{- end }} --- apiVersion: v1 @@ -41,4 +48,6 @@ data: {{- else }} IFRAMELY_URL: http://{{ .Release.Name }}-iframely.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8061/ {{- end }} + + EXPORT_QUEUE_NAME: {{ .Values.env.export_queue_name | default "plane-exports" | quote }} --- diff --git a/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml new file mode 100644 index 00000000..eb781a73 --- /dev/null +++ b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml @@ -0,0 +1,54 @@ + +{{- if .Values.services.live_exporter.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + name: {{ .Release.Name }}-live-exporter-wl + {{- include "plane.labelsAndAnnotations" (dict "context" $ "values" .Values.services.live_exporter) }} +spec: + replicas: {{ .Values.services.live_exporter.replicas | default 1 }} + selector: + matchLabels: + app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live-exporter + template: + metadata: + namespace: {{ .Release.Namespace }} + labels: + app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live-exporter + {{- include "plane.commonLabels" $ | nindent 8 }} + annotations: + timestamp: {{ now | quote }} + spec: + {{- include "plane.podScheduling" .Values.services.live_exporter }} + {{- include "plane.podSecurityContext" . }} + containers: + - name: {{ .Release.Name }}-live-exporter + {{- include "plane.containerSecurityContext" . }} + imagePullPolicy: {{ .Values.services.live_exporter.pullPolicy | default "Always" }} + image: {{ .Values.services.live_exporter.image | default "makeplane/live-commercial" }}:{{ .Values.planeVersion }} + stdin: true + tty: true + resources: + requests: + memory: {{ .Values.services.live_exporter.memoryRequest | default "50Mi" | quote }} + cpu: {{ .Values.services.live_exporter.cpuRequest | default "50m" | quote }} + limits: + memory: {{ .Values.services.live_exporter.memoryLimit | default "2000Mi" | quote }} + cpu: {{ .Values.services.live_exporter.cpuLimit | default "1000m" | quote }} + envFrom: + - configMapRef: + name: {{ .Release.Name }}-live-vars + optional: false + - secretRef: + name: {{ if not (empty .Values.external_secrets.live_env_existingSecret) }}{{ .Values.external_secrets.live_env_existingSecret }}{{ else }}{{ .Release.Name }}-live-secrets{{ end }} + optional: false + env: + - name: LIVE_MODE + value: "exporter" + {{- if .Values.extraEnv }} + {{- 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 8394e9af..23482b8e 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -273,6 +273,22 @@ services: labels: {} annotations: {} + live_exporter: + enabled: true + replicas: 1 + # PDF render footprint is 500MB-2GB; default limits reflect that. + memoryLimit: 2000Mi + cpuLimit: 1000m + memoryRequest: 50Mi + cpuRequest: 50m + image: makeplane/live-commercial + pullPolicy: Always + nodeSelector: {} + tolerations: [] + affinity: {} + labels: {} + annotations: {} + api: replicas: 1 memoryLimit: 1000Mi @@ -614,6 +630,9 @@ env: live_sentry_environment: "" live_sentry_traces_sample_rate: "" live_server_secret_key: "htbqvBJAgpm9bzvf3r4urJer0ENReatceh" + + # Background PDF/DOCX export worker queue. + export_queue_name: "plane-exports" external_iframely_url: "" silo_envs: From c0ce8571e29fb30186659359e0893f9a016dbaf0 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Tue, 4 Aug 2026 12:50:42 +0530 Subject: [PATCH 12/17] feat(live-exporter): remove LIVE_MODE environment variable from deployment --- .../templates/workloads/live-exporter.deployment.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml index eb781a73..71d9108f 100644 --- a/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml +++ b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml @@ -44,8 +44,6 @@ spec: name: {{ if not (empty .Values.external_secrets.live_env_existingSecret) }}{{ .Values.external_secrets.live_env_existingSecret }}{{ else }}{{ .Release.Name }}-live-secrets{{ end }} optional: false env: - - name: LIVE_MODE - value: "exporter" {{- if .Values.extraEnv }} {{- toYaml .Values.extraEnv | nindent 10 }} {{- end }} From 0c6ed120972cf7f6de50ad686e847959e91defb8 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Tue, 4 Aug 2026 13:05:26 +0530 Subject: [PATCH 13/17] feat(live-exporter): add pull policy configuration for Live Exporter service --- charts/plane-enterprise/questions.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 4c11f66e..aaa85cb5 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -284,6 +284,14 @@ questions: label: "Default Replica Count" type: int default: 1 + - variable: services.live_exporter.pullPolicy + label: "Live Exporter Pull Policy" + type: enum + options: + - "Always" + - "IfNotPresent" + - "Never" + default: "Always" - variable: services.live_exporter.memoryLimit label: "Memory Limit" type: string From 97a7496dd8816ed52158e143c2b27b8ca95b15cc Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Wed, 5 Aug 2026 14:00:30 +0530 Subject: [PATCH 14/17] fix(plane-enterprise): add LIVE_MODE=exporter env to live-exporter deployment Co-Authored-By: Claude Sonnet 4.6 --- .../templates/workloads/live-exporter.deployment.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml index 71d9108f..eb781a73 100644 --- a/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml +++ b/charts/plane-enterprise/templates/workloads/live-exporter.deployment.yaml @@ -44,6 +44,8 @@ spec: name: {{ if not (empty .Values.external_secrets.live_env_existingSecret) }}{{ .Values.external_secrets.live_env_existingSecret }}{{ else }}{{ .Release.Name }}-live-secrets{{ end }} optional: false env: + - name: LIVE_MODE + value: "exporter" {{- if .Values.extraEnv }} {{- toYaml .Values.extraEnv | nindent 10 }} {{- end }} From 01296050c5f49593fc7ab80aef6c3617bd4324be Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Wed, 5 Aug 2026 17:12:35 +0530 Subject: [PATCH 15/17] feat(plane-enterprise): add EXPORT_DOWNLOAD_BASE_URL env to live-vars Defaults to licenseDomain with protocol inferred from SSL settings. Configurable via env.export_download_base_url. Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/questions.yml | 5 +++++ .../templates/config-secrets/live-env.yaml | 7 +++++++ charts/plane-enterprise/values.yaml | 2 ++ 3 files changed, 14 insertions(+) diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index aaa85cb5..209d627d 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -272,6 +272,11 @@ questions: description: "RabbitMQ queue name for background PDF/DOCX export jobs consumed by the live-exporter service." type: string default: "plane-exports" + - variable: env.export_download_base_url + label: "Export Download Base URL" + description: "Base URL for export download redirects. Defaults to licenseDomain with protocol inferred from SSL settings." + type: string + default: "" - variable: services.live_exporter.enabled label: "Install Live Exporter Service" diff --git a/charts/plane-enterprise/templates/config-secrets/live-env.yaml b/charts/plane-enterprise/templates/config-secrets/live-env.yaml index 05470869..5f249ce6 100644 --- a/charts/plane-enterprise/templates/config-secrets/live-env.yaml +++ b/charts/plane-enterprise/templates/config-secrets/live-env.yaml @@ -49,5 +49,12 @@ data: IFRAMELY_URL: http://{{ .Release.Name }}-iframely.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8061/ {{- end }} + {{- if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} + EXPORT_DOWNLOAD_BASE_URL: {{ .Values.env.export_download_base_url | default (printf "https://%s" .Values.license.licenseDomain) | quote }} + {{- else }} + EXPORT_DOWNLOAD_BASE_URL: {{ .Values.env.export_download_base_url | default (printf "http://%s" .Values.license.licenseDomain) | quote }} + {{- end }} + EXPORT_QUEUE_NAME: {{ .Values.env.export_queue_name | default "plane-exports" | quote }} + --- diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 23482b8e..999c8416 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -633,6 +633,8 @@ env: # Background PDF/DOCX export worker queue. export_queue_name: "plane-exports" + # Base URL for export download redirects. Defaults to licenseDomain with protocol from SSL settings. + export_download_base_url: "" external_iframely_url: "" silo_envs: From 2d2b4a9c5a94a7b76e3fb50a351755d6be144b49 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Wed, 12 Aug 2026 16:52:06 +0530 Subject: [PATCH 16/17] chore: hardcode API_INTERNAL_BASE_URL in silo, remove from user-facing config Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/questions.yml | 6 ------ charts/plane-enterprise/templates/config-secrets/silo.yaml | 4 ---- charts/plane-enterprise/values.yaml | 1 - 3 files changed, 11 deletions(-) diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 85f17a1a..078392bc 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -351,12 +351,6 @@ questions: label: "Cursor Webhook Secret" type: string default: "TTqazTcoBajYKzIAeIKFZeTX9czAoUsG" - - variable: env.silo_envs.api_internal_base_url - label: "API Internal Base URL" - description: "Internal cluster URL for the API service. Defaults to the in-cluster service DNS when left empty." - type: string - default: "" - - variable: services.silo.connectors.slack.enabled label: "Slack Integration" type: boolean diff --git a/charts/plane-enterprise/templates/config-secrets/silo.yaml b/charts/plane-enterprise/templates/config-secrets/silo.yaml index de8686e6..2e6ad83a 100644 --- a/charts/plane-enterprise/templates/config-secrets/silo.yaml +++ b/charts/plane-enterprise/templates/config-secrets/silo.yaml @@ -104,11 +104,7 @@ data: {{- end }} API_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" - {{- if .Values.env.silo_envs.api_internal_base_url }} - API_INTERNAL_BASE_URL: {{ .Values.env.silo_envs.api_internal_base_url | quote }} - {{- else }} API_INTERNAL_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" - {{- end }} {{- if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} SILO_API_BASE_URL: "https://{{ .Values.license.licenseDomain }}" diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index cb3e2ada..53965563 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -668,7 +668,6 @@ env: jira_server_issues_page_size: 50 jira_server_issues_parallel_pages: 1 cursor_webhook_secret: 'TTqazTcoBajYKzIAeIKFZeTX9czAoUsG' - api_internal_base_url: '' email_service_envs: smtp_domain: '' From 2224970b57429cb6eb9d88aa89161be41d7ad564 Mon Sep 17 00:00:00 2001 From: akshat5302 Date: Wed, 12 Aug 2026 16:56:42 +0530 Subject: [PATCH 17/17] chore: remove FLATFILE_API_KEY from plane-enterprise chart Co-Authored-By: Claude Sonnet 4.6 --- charts/plane-enterprise/README.md | 3 +-- charts/plane-enterprise/questions.yml | 12 ------------ .../templates/config-secrets/silo.yaml | 4 +--- charts/plane-enterprise/values.yaml | 4 +--- 4 files changed, 3 insertions(+), 20 deletions(-) diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index a86b6caf..c5279124 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -567,8 +567,7 @@ securityContext: | services.silo.connectors.bitbucket.client_id | "" | required if `services.silo.connectors.bitbucket.enabled` is `true` | Bitbucket OAuth Client ID | | services.silo.connectors.bitbucket.client_secret | "" | required if `services.silo.connectors.bitbucket.enabled` is `true` | Bitbucket OAuth Client Secret | | services.silo.connectors.bitbucket.webhook_secret | "" | | Bitbucket Webhook Secret (`BITBUCKET_WEBHOOK_SECRET`) for verifying incoming webhook payloads | -| services.silo.connectors.flatfile.enabled | false | | Flatfile Integration | -| services.silo.connectors.flatfile.api_key | "" | required if `services.silo.connectors.flatfile.enabled` is `true` | Flatfile API Key | + | services.silo.connectors.hubspot.enabled | false | | HubSpot Integration | | services.silo.connectors.hubspot.client_id | "" | required if `services.silo.connectors.hubspot.enabled` is `true` | HubSpot OAuth Client ID | | services.silo.connectors.hubspot.client_secret | "" | required if `services.silo.connectors.hubspot.enabled` is `true` | HubSpot OAuth Client Secret | diff --git a/charts/plane-enterprise/questions.yml b/charts/plane-enterprise/questions.yml index 078392bc..a3624fbd 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -467,18 +467,6 @@ questions: type: string default: "" -- variable: services.silo.connectors.flatfile.enabled - label: "Flatfile Integration" - type: boolean - default: false - group: "Silo Connectors" - show_subquestion_if: true - subquestions: - - variable: services.silo.connectors.flatfile.api_key - label: "Flatfile API Key" - type: string - default: "" - - variable: services.silo.connectors.hubspot.enabled label: "HubSpot Integration" type: boolean diff --git a/charts/plane-enterprise/templates/config-secrets/silo.yaml b/charts/plane-enterprise/templates/config-secrets/silo.yaml index 2e6ad83a..7fdfc50a 100644 --- a/charts/plane-enterprise/templates/config-secrets/silo.yaml +++ b/charts/plane-enterprise/templates/config-secrets/silo.yaml @@ -64,9 +64,7 @@ stringData: BITBUCKET_CLIENT_SECRET: {{ .Values.services.silo.connectors.bitbucket.client_secret | default "" | quote }} BITBUCKET_WEBHOOK_SECRET: {{ .Values.services.silo.connectors.bitbucket.webhook_secret | default "" | quote }} {{- end }} - {{- if .Values.services.silo.connectors.flatfile.enabled }} - FLATFILE_API_KEY: {{ .Values.services.silo.connectors.flatfile.api_key | default "" | quote }} - {{- end }} + {{- if .Values.services.silo.connectors.hubspot.enabled }} HUBSPOT_CLIENT_ID: {{ .Values.services.silo.connectors.hubspot.client_id | default "" | quote }} HUBSPOT_CLIENT_SECRET: {{ .Values.services.silo.connectors.hubspot.client_secret | default "" | quote }} diff --git a/charts/plane-enterprise/values.yaml b/charts/plane-enterprise/values.yaml index 53965563..05705314 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -384,9 +384,7 @@ services: client_id: '' client_secret: '' webhook_secret: '' - flatfile: - enabled: false - api_key: '' + hubspot: enabled: false client_id: ''