diff --git a/charts/plane-enterprise/Chart.yaml b/charts/plane-enterprise/Chart.yaml index f65c102c..72dbaf13 100644 --- a/charts/plane-enterprise/Chart.yaml +++ b/charts/plane-enterprise/Chart.yaml @@ -5,8 +5,8 @@ description: Meet Plane. An Enterprise software development tool to manage issue type: application -version: 3.1.0 -appVersion: "3.0.1" +version: 3.2.0 +appVersion: "3.1.0" home: https://plane.so/ icon: https://plane.so/favicon/favicon-32x32.png diff --git a/charts/plane-enterprise/README.md b/charts/plane-enterprise/README.md index 37479d3a..240b0b96 100644 --- a/charts/plane-enterprise/README.md +++ b/charts/plane-enterprise/README.md @@ -99,7 +99,7 @@ The default value is `"traefik"`. If you are switching to a standard ingress con Copy the format of constants below, paste it on Terminal to start setting environment variables, set values for each variable, and hit ENTER or RETURN. ```bash - PLANE_VERSION=v3.0.1 # or the last released version + PLANE_VERSION=v3.1.0 # or the last released version DOMAIN_NAME= ``` @@ -155,7 +155,7 @@ The default value is `"traefik"`. If you are switching to a standard ingress con Make sure you set the minimum required values as below. - - `planeVersion: v3.0.1 ` + - `planeVersion: v3.1.0 ` - `license.licenseDomain: ` - `ingress.enabled: ` - `ingress.ingressClass: ` @@ -181,7 +181,7 @@ The default value is `"traefik"`. If you are switching to a standard ingress con | Setting | Default | Required | Description | | --------------------- | :---------------: | :------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| planeVersion | v3.0.1 | Yes | Specifies the version of Plane to be deployed. Copy this from prime.plane.so. | +| planeVersion | v3.1.0 | Yes | Specifies the version of Plane to be deployed. Copy this from prime.plane.so. | | license.licenseDomain | plane.example.com | Yes | The fully-qualified domain name (FQDN) in the format `sudomain.domain.tld` or `domain.tld` that the license is bound to. It is also attached to your `ingress` host to access Plane. | ### Air-gapped Settings @@ -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 | @@ -498,6 +514,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 | 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 | | 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. | @@ -543,12 +563,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 | @@ -557,6 +579,14 @@ 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.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 | @@ -893,6 +923,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 913a0485..e7a6bafd 100644 --- a/charts/plane-enterprise/questions.yml +++ b/charts/plane-enterprise/questions.yml @@ -27,7 +27,7 @@ questions: - variable: planeVersion label: Plane Version (Docker Image Tag) type: string - default: v3.0.1 + default: v3.1.0 required: true group: "Docker Registry" subquestions: @@ -267,6 +267,52 @@ 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: 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" + 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.pullPolicy + label: "Live Exporter Pull Policy" + type: enum + options: + - "Always" + - "IfNotPresent" + - "Never" + default: "Always" + - 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" @@ -351,7 +397,6 @@ questions: label: "Cursor Webhook Secret" type: string default: "TTqazTcoBajYKzIAeIKFZeTX9czAoUsG" - - variable: services.silo.connectors.slack.enabled label: "Slack Integration" type: boolean @@ -371,6 +416,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 +448,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 +493,42 @@ 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.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 @@ -550,6 +639,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." + type: int + 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: 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." + 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 @@ -1010,6 +1119,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..7675020d 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 | quote }} + GUNICORN_MAX_REQUESTS_JITTER: {{ .Values.env.gunicorn_max_requests_jitter | 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 }} {{- else if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} @@ -111,3 +115,4 @@ data: WEBHOOK_ALLOWED_IPS: {{ .Values.env.webhook_allowed_ips | default "" | quote }} WEBHOOK_ALLOWED_HOSTS: {{ .Values.env.webhook_allowed_hosts | default "" | quote }} + 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/live-env.yaml b/charts/plane-enterprise/templates/config-secrets/live-env.yaml index 16855c46..5f249ce6 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,13 @@ data: {{- else }} 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/templates/config-secrets/pi-api-env.yaml b/charts/plane-enterprise/templates/config-secrets/pi-api-env.yaml index 6305673e..6a9fff9a 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 "*"}} @@ -157,6 +158,9 @@ data: BR_AWS_REGION: {{ .Values.services.pi.ai_providers.embedding_model.aws_region | default "us-east-1" | quote }} {{- end }} + 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 }} + 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/templates/config-secrets/silo.yaml b/charts/plane-enterprise/templates/config-secrets/silo.yaml index a201f686..7fdfc50a 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,16 @@ 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.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 +102,7 @@ data: {{- end }} API_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" + API_INTERNAL_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:8000/" {{- if or .Values.ssl.tls_secret_name (and .Values.ssl.createIssuer .Values.ssl.generateCerts) }} SILO_API_BASE_URL: "https://{{ .Values.license.licenseDomain }}" @@ -109,5 +122,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/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 d0c90674..6c76ea8f 100644 --- a/charts/plane-enterprise/values.yaml +++ b/charts/plane-enterprise/values.yaml @@ -1,4 +1,4 @@ -planeVersion: v3.0.1 +planeVersion: v3.1.0 dockerRegistry: enabled: false @@ -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 @@ -360,6 +376,7 @@ services: client_id: '' client_secret: '' base_url: '' + signing_secret: '' github: enabled: false client_id: '' @@ -367,6 +384,7 @@ services: app_name: '' app_id: '' private_key: '' + webhook_secret: '' gitlab: enabled: false client_id: '' @@ -377,6 +395,16 @@ services: client_id: '' client_secret: '' integration_slug: '' + bitbucket: + enabled: false + client_id: '' + client_secret: '' + webhook_secret: '' + + hubspot: + enabled: false + client_id: '' + client_secret: '' email_service: enabled: false @@ -612,6 +640,16 @@ env: secret_key: "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5" api_key_rate_limit: "60/minute" + # 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. + # 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: '' @@ -628,6 +666,11 @@ 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" + # Base URL for export download redirects. Defaults to licenseDomain with protocol from SSL settings. + export_download_base_url: "" external_iframely_url: "" silo_envs: @@ -695,6 +738,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