Skip to content

Add Helm chart for Kubernetes deployment of Plane - #1

Closed
crewletbot wants to merge 2 commits into
previewfrom
claude/plane-infralet-deploy-oqfb82
Closed

Add Helm chart for Kubernetes deployment of Plane#1
crewletbot wants to merge 2 commits into
previewfrom
claude/plane-infralet-deploy-oqfb82

Conversation

@crewletbot

@crewletbot crewletbot commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR introduces a Helm chart for deploying Plane (community edition) on Kubernetes. The chart packages all Plane components (web, space, admin, live, api, worker, beat) along with the Valkey and RabbitMQ they depend on into a single, configurable release.

Key features:

  • Multi-component deployment: 8 Plane application components plus 2 supporting services (Valkey and RabbitMQ), fronted by the Caddy proxy as the single entry point
  • Flexible image configuration: image.repository is a prefix that each component completes with its own suffix, so one repository/tag pair configures all six images — which is what lets a generic GitOps Application template drive a multi-image chart
  • Cloud-native design:
    • Expects an external managed Postgres; none is bundled
    • Reaches S3 through a workload identity role (IRSA) rather than static keys or MinIO
    • Creates no Ingress — point an Ingress, a LoadBalancer Service, or an outbound tunnel at the plane-proxy Service
  • Security hardening: pod and container security contexts with capabilities dropped, and the four components that shed root themselves (nginx workers, the Valkey/RabbitMQ entrypoints) given back only the capabilities that transition needs
  • Comprehensive configuration: non-secret settings in a ConfigMap; secret material either rendered by the chart or consumed from an external store (ExternalSecrets, SealedSecrets)
  • Production-ready: health checks, resource requests/limits, beat locked to a single replica, and migrations run as a pre-install,pre-upgrade hook so the schema is current before any new pod starts

Related files:

  • deployments/helm/plane/Chart.yaml: chart metadata
  • deployments/helm/plane/values.yaml: configuration, commented key by key
  • deployments/helm/plane/README.md: user documentation
  • deployments/helm/plane/templates/: all Kubernetes resource templates
  • apps/api/plane/settings/common.py: let the AWS credential settings fall through to the role instead of defaulting to placeholder keys

Type of Change

  • Feature (new Helm chart for Kubernetes deployment)
  • Bug fix (AWS credential settings defaulted to placeholder keys, breaking the export tasks on a role)
  • Documentation update (chart README)

Test Scenarios

Validated with:

  • helm lint — clean
  • helm template with chart defaults, and with a GitOps-style values overlay; rendered manifests parsed and asserted (image references resolve per component, service account annotation lands, no static AWS credentials emitted, secret wiring correct)
  • helm template with secrets.create=true, including the guards that fail the render when a required secret value is missing

Not run here: the Django test suite, which needs Docker (unavailable in the environment this was authored in). CI covers it.

References

@crewletbot
crewletbot force-pushed the claude/plane-infralet-deploy-oqfb82 branch from c5c6c1d to 59ce6a1 Compare August 17, 2026 20:32
aliyousefiaan and others added 2 commits August 17, 2026 20:40
Upstream ships compose, swarm and AIO deployments plus a link to
makeplane's chart on Artifact Hub, but nothing that fits how this fork is
actually run: a shared RDS instance instead of a bundled Postgres, S3 with
IRSA instead of MinIO, and ingress through a Cloudflare Tunnel instead of a
load balancer.

The chart deploys all six images this repository publishes to GHCR --
proxy, web, space, admin, live and backend (as api, worker, beat and a
migration job) -- plus the Valkey and RabbitMQ they depend on. Because the
images sit side by side under one namespace, image.repository is treated as
a prefix that each component completes with its own suffix; a single
repository/tag pair then configures all six, which is what lets a generic
GitOps Application template drive a multi-image chart.

Caddy keeps the path split from apps/proxy/Caddyfile.ce but drops the MinIO
route and listens on 8080, so it needs no NET_BIND_SERVICE capability. The
migration job runs as a pre-install/pre-upgrade hook, which Argo CD maps
onto PreSync, so the schema is current before any new pod starts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY defaulted to the literal
strings "access-key" and "secret-key". Anything reading them through
django settings -- the workspace export task and the expired-export
cleanup task both build their own boto3 client that way -- therefore
handed S3 a placeholder key whenever the variables were unset, and got
InvalidAccessKeyId back instead of falling through to boto3's credential
chain.

That is exactly how a deployment on an instance profile or an EKS service
account role is configured: no keys in the environment at all. S3Storage
already got this right by reading os.environ directly with no default, so
uploads worked while exports did not.

The placeholders only ever fitted the bundled MinIO, and both compose
files set the pair explicitly, so nothing that relied on them loses it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@crewletbot
crewletbot force-pushed the claude/plane-infralet-deploy-oqfb82 branch from 59ce6a1 to 6138b3b Compare August 17, 2026 20:41
@aliyousefiaan
aliyousefiaan deleted the claude/plane-infralet-deploy-oqfb82 branch August 17, 2026 20:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants