Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions charts/plane-enterprise/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,12 @@
annotations: {{ toYaml . | nindent 4 }}
{{- end }}
{{- end }}

{{- define "plane.prometheusAnnotations" -}}
{{- if and .root.Values.monitoring .root.Values.monitoring.enabled -}}
prometheus.io/scrape: {{ .root.Values.monitoring.prometheus.scrape | quote }}
prometheus.io/port: {{ .port | quote }}
prometheus.io/path: {{ .root.Values.monitoring.prometheus.path | quote }}
prometheus.io/scheme: {{ .root.Values.monitoring.prometheus.scheme | quote }}
{{- end }}
{{- end }}
89 changes: 89 additions & 0 deletions charts/plane-enterprise/templates/ingress-traefik.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{{- if and .Values.ingress.enabled (eq .Values.ingress.ingressClass "traefik-external") .Values.license.licenseDomain }}

apiVersion: traefik.io/v1alpha1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if there are any references to the old Traefik API group in the chart
rg -n "traefik.containo.us" --type yaml
rg -n "traefik.io" --type yaml

Repository: makeplane/helm-charts

Length of output: 245


🏁 Script executed:

#!/bin/bash
# Check Chart.yaml for the plane-enterprise chart
cat -n charts/plane-enterprise/Chart.yaml

# Check if there's a values.yaml
ls -la charts/plane-enterprise/values.yaml

# Search for any Traefik version references or documentation
rg -i "traefik.*version|version.*traefik" charts/plane-enterprise/ --type yaml -A 2 -B 2

Repository: makeplane/helm-charts

Length of output: 1440


🏁 Script executed:

#!/bin/bash
# Check values.yaml for Traefik-related configuration
rg -i "traefik" charts/plane-enterprise/values.yaml -B 2 -A 2

Repository: makeplane/helm-charts

Length of output: 210


🌐 Web query:

Traefik v1alpha1 API group traefik.io vs traefik.containo.us version history

💡 Result:

API group history (Kubernetes CRDs) — traefik.containo.us vs traefik.io

  • Traefik v2.0 → v2.9: Traefik’s CRDs used the API group traefik.containo.us (e.g., traefik.containo.us/v1alpha1). This is shown in the original Traefik v2 CRD examples/docs. [1] [2]

  • Traefik v2.10: Traefik introduced the new CRD API group traefik.io and deprecated traefik.containo.us (with the stated intention to remove it in v3). In v2.10, the CRD provider still supports both traefik.io/v1alpha1 and traefik.containo.us/v1alpha1 during the transition. [3] [4]

  • Traefik v3.x: The traefik.containo.us API group is removed; you must use traefik.io (e.g., traefik.io/v1alpha1). [5]

Practical takeaway:
If you’re on v2.10.x, you can run with both installed while you migrate manifests, but v3 requires traefik.io/* only. [4] [5]

Sources

[1] https://traefik.io/blog/back-to-traefik-2-0-2f9aa17be305/
[2] https://doc.traefik.io/traefik/v2.4/reference/dynamic-configuration/kubernetes-crd/
[3] https://traefik.io/blog/announcing-traefik-proxy-2-10
[4] https://doc.traefik.io/traefik/v3.3/migration/v2/
[5] https://doc.traefik.io/traefik/master/migration/v2-to-v3-details/


Document the minimum Traefik version requirement.

The chart uses traefik.io/v1alpha1, which requires Traefik v2.10+ or v3. Older versions (v2.0–v2.9) use traefik.containo.us/v1alpha1 and are incompatible. Add a documented minimum version constraint to the Helm chart (Chart.yaml or README) to prevent silent failures on unsupported Traefik installations.

🤖 Prompt for AI Agents
In `@charts/plane-enterprise/templates/ingress-traefik.yaml` at line 3, The chart
declares apiVersion: traefik.io/v1alpha1 which requires Traefik v2.10+ (or v3);
update the Helm chart metadata and docs to prevent installs on older Traefik:
add a clear minimum Traefik version statement (e.g., "Traefik >= v2.10") to
Chart.yaml and the chart README, and mention that this template uses
traefik.io/v1alpha1 so older Traefik (traefik.containo.us/v1alpha1 for
v2.0–v2.9) is incompatible; ensure the README and Chart.yaml's notes/description
reference the minimum Traefik version.

kind: IngressRoute
metadata:
name: {{ .Release.Name }}-ingress
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: plane-ingress
app.kubernetes.io/component: ingress
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
entryPoints:
- websecure

routes:

# IMPORTANT: specific paths FIRST

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/spaces/`)
kind: Rule
services:
- name: {{ .Release.Name }}-space
port: 3000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/god-mode/`)
kind: Rule
services:
- name: {{ .Release.Name }}-admin
port: 3000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/api/`)
kind: Rule
services:
- name: {{ .Release.Name }}-api
port: 8000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/auth/`)
kind: Rule
services:
- name: {{ .Release.Name }}-api
port: 8000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/graphql/`)
kind: Rule
services:
- name: {{ .Release.Name }}-api
port: 8000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/marketplace/`)
kind: Rule
services:
- name: {{ .Release.Name }}-api
port: 8000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/live/`)
kind: Rule
services:
- name: {{ .Release.Name }}-live
port: 3000

- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/silo/`)
kind: Rule
services:
- name: {{ .Release.Name }}-silo
port: 3000

{{- if and .Values.services.minio.local_setup .Values.env.docstore_bucket }}
- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/{{ .Values.env.docstore_bucket }}`)
kind: Rule
services:
- name: {{ .Release.Name }}-minio
port: 9000
{{- end }}

# LAST: catch all
- match: Host(`{{ .Values.license.licenseDomain }}`) && PathPrefix(`/`)
kind: Rule
middlewares:
- name: {{ .Release.Name }}-body-limit
services:
- name: {{ .Release.Name }}-web
port: 3000

tls:
secretName: {{ default (printf "%s-ssl-cert" .Release.Name) .Values.ssl.tls_secret_name }}

{{- end }}
2 changes: 1 addition & 1 deletion charts/plane-enterprise/templates/ingress.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and .Values.ingress.enabled .Values.license.licenseDomain }}
{{- if and .Values.ingress.enabled (eq .Values.ingress.ingressClass "nginx") .Values.license.licenseDomain }}

apiVersion: networking.k8s.io/v1
kind: Ingress
Expand Down
11 changes: 11 additions & 0 deletions charts/plane-enterprise/templates/traefik-middleware.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{{- if and .Values.ingress.enabled (eq .Values.ingress.ingressClass "traefik-external") }}
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: {{ .Release.Name }}-body-limit
namespace: {{ .Release.Namespace }}
spec:
buffering:
maxRequestBodyBytes: 5242880

{{- end }}
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/admin.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-admin
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "3000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
app.kubernetes.io/name: plane-admin
app.kubernetes.io/component: admin
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.admin.assign_cluster_ip }}
Expand Down Expand Up @@ -37,6 +45,11 @@ spec:
namespace: {{ .Release.Namespace }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
app.kubernetes.io/name: plane-admin
app.kubernetes.io/component: admin
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
annotations:
timestamp: {{ now | quote }}
spec:
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/api.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-api
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "8000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
app.kubernetes.io/name: plane-api
app.kubernetes.io/component: api
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.api.assign_cluster_ip }}
Expand Down Expand Up @@ -37,6 +45,11 @@ spec:
namespace: {{ .Release.Namespace }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
app.kubernetes.io/name: plane-api
app.kubernetes.io/component: api
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
annotations:
timestamp: {{ now | quote }}
spec:
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/live.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "3000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
app.kubernetes.io/name: plane-live
app.kubernetes.io/component: live
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.live.assign_cluster_ip }}
Expand Down Expand Up @@ -37,6 +45,11 @@ spec:
namespace: {{ .Release.Namespace }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
app.kubernetes.io/name: plane-live
app.kubernetes.io/component: live
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
annotations:
timestamp: {{ now | quote }}
spec:
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/minio.stateful.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-minio
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "9000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
app.kubernetes.io/name: plane-minio
app.kubernetes.io/component: minio
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.minio.assign_cluster_ip }}
Expand Down Expand Up @@ -39,6 +47,11 @@ spec:
metadata:
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
app.kubernetes.io/name: plane-minio
app.kubernetes.io/component: minio
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
spec:
containers:
- image: {{ .Values.services.minio.image }}
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/postgres.stateful.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-pgdb
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" (.Values.services.postgres.servicePort | toString) "root" .) | nindent 4 }}
{{- end }}
Comment on lines +8 to +11
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Prometheus scrape annotations on PostgreSQL will fail — vanilla Postgres doesn't expose /metrics.

The standard postgres:15.7-alpine image doesn't serve a /metrics endpoint on port 5432. Prometheus will continuously fail to scrape this target, generating noise in logs and alerts.

Either:

  • Remove Prometheus annotations from the Postgres Service (and similarly for Redis, which uses valkey/valkey and also doesn't expose /metrics).
  • Or add a postgres_exporter sidecar container and point the scrape port to the exporter's port (typically 9187).
🤖 Prompt for AI Agents
In `@charts/plane-enterprise/templates/workloads/postgres.stateful.yaml` around
lines 8 - 11, The Prometheus scrape annotations added by the include
"plane.prometheusAnnotations" with port (.Values.services.postgres.servicePort)
are incorrect for the vanilla postgres image (no /metrics); either remove those
annotations for the Postgres StatefulSet/Service or add a postgres_exporter
sidecar and change the scrape port to the exporter (e.g., 9187). Update the
postgres.stateful.yaml template to stop including plane.prometheusAnnotations
when targeting the database container, or add a postgres_exporter container and
expose its port, then adjust .Values.services.postgres.servicePort (or pass a
different port into plane.prometheusAnnotations) so Prometheus scrapes the
exporter's endpoint instead of 5432.

labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
app.kubernetes.io/name: plane-postgres
app.kubernetes.io/component: postgres
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.postgres.assign_cluster_ip }}
Expand Down Expand Up @@ -35,6 +43,11 @@ spec:
metadata:
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
app.kubernetes.io/name: plane-postgres
app.kubernetes.io/component: postgres
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
spec:
containers:
- image: {{ .Values.services.postgres.image }}
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/rabbitmq.stateful.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-rabbitmq
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" (.Values.services.rabbitmq.managementPort | toString) "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
app.kubernetes.io/name: plane-rabbitmq
app.kubernetes.io/component: rabbitmq
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.rabbitmq.assign_cluster_ip }}
Expand Down Expand Up @@ -39,6 +47,11 @@ spec:
metadata:
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
app.kubernetes.io/name: plane-rabbitmq
app.kubernetes.io/component: rabbitmq
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
spec:
containers:
- image: {{ .Values.services.rabbitmq.image }}
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/redis.stateful.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-redis
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" (.Values.services.redis.servicePort | toString) "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
app.kubernetes.io/name: plane-redis
app.kubernetes.io/component: redis
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.redis.assign_cluster_ip }}
Expand Down Expand Up @@ -38,6 +46,11 @@ spec:
metadata:
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
app.kubernetes.io/name: plane-redis
app.kubernetes.io/component: redis
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
Comment on lines +49 to +53
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Quote planeVersion in labels to avoid YAML type coercion.

If planeVersion ever holds a numeric-looking value (e.g., 1.0), YAML will parse it as a float and Helm will render it as 1, silently losing the intended version string. This applies to all workload templates in this PR that use {{ .Values.planeVersion }} in labels.

Proposed fix
-        app.kubernetes.io/version: {{ .Values.planeVersion }}
+        app.kubernetes.io/version: {{ .Values.planeVersion | quote }}

Apply the same change in every workload template where this label appears.

🤖 Prompt for AI Agents
In `@charts/plane-enterprise/templates/workloads/redis.stateful.yaml` around lines
49 - 53, The label value using {{ .Values.planeVersion }} is unquoted and may be
YAML-coerced to a number; update every workload template that sets the
app.kubernetes.io/version label (e.g., the redis StatefulSet label block that
currently contains app.kubernetes.io/version: {{ .Values.planeVersion }}) to use
a quoted Helm template expression (i.e., wrap the template in double quotes) so
the rendered value is preserved as a string; apply the same change anywhere else
the bare {{ .Values.planeVersion }} appears in labels across workload templates.

spec:
containers:
- image: {{ .Values.services.redis.image }}
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/silo.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-silo
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "3000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-silo
app.kubernetes.io/name: plane-silo
app.kubernetes.io/component: silo
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.silo.assign_cluster_ip }}
Expand Down Expand Up @@ -38,6 +46,11 @@ spec:
namespace: {{ .Release.Namespace }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-silo
app.kubernetes.io/name: plane-silo
app.kubernetes.io/component: silo
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
annotations:
timestamp: {{ now | quote }}
spec:
Expand Down
13 changes: 13 additions & 0 deletions charts/plane-enterprise/templates/workloads/space.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-space
{{- if and .Values.monitoring .Values.monitoring.enabled }}
annotations:
{{- include "plane.prometheusAnnotations" (dict "port" "3000" "root" .) | nindent 4 }}
{{- end }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
app.kubernetes.io/name: plane-space
app.kubernetes.io/component: space
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/managed-by: helm
spec:
type: ClusterIP
{{- if not .Values.services.space.assign_cluster_ip }}
Expand Down Expand Up @@ -37,6 +45,11 @@ spec:
namespace: {{ .Release.Namespace }}
labels:
app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
app.kubernetes.io/name: plane-space
app.kubernetes.io/component: space
app.kubernetes.io/part-of: plane-enterprise
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Values.planeVersion }}
annotations:
timestamp: {{ now | quote }}
spec:
Expand Down
Loading