diff --git a/argocd-apps/plane.yaml b/argocd-apps/plane.yaml
new file mode 100644
index 0000000..754c7c7
--- /dev/null
+++ b/argocd-apps/plane.yaml
@@ -0,0 +1,21 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: plane
+ namespace: argocd
+spec:
+ project: dev-tools
+ source:
+ repoURL: 'https://git.dvirlabs.com/dvirlabs/dev-tools.git'
+ targetRevision: HEAD
+ path: charts/plane
+ helm:
+ valueFiles:
+ - ../../manifests/plane/values.yaml
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: dev-tools
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
diff --git a/charts/plane-ce/.helmignore b/charts/plane-ce/.helmignore
new file mode 100644
index 0000000..2d4a744
--- /dev/null
+++ b/charts/plane-ce/.helmignore
@@ -0,0 +1,24 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
+test-*.yaml
\ No newline at end of file
diff --git a/charts/plane-ce/Chart.yaml b/charts/plane-ce/Chart.yaml
new file mode 100644
index 0000000..58f03a0
--- /dev/null
+++ b/charts/plane-ce/Chart.yaml
@@ -0,0 +1,13 @@
+annotations:
+ artifacthub.io/license: AGPL-3.0
+apiVersion: v2
+appVersion: 0.26.1
+description: Meet Plane. An open-source software development tool to manage issues,
+ sprints, and product roadmaps with peace of mind.
+home: https://plane.so
+icon: https://plane.so/favicon/favicon-32x32.png
+name: plane-ce
+sources:
+- https://github.com/makeplane/plane
+type: application
+version: 1.1.3
diff --git a/charts/plane-ce/README.md b/charts/plane-ce/README.md
new file mode 100644
index 0000000..c09656a
--- /dev/null
+++ b/charts/plane-ce/README.md
@@ -0,0 +1,305 @@
+## Pre-requisite
+
+- A working Kubernetes cluster
+- `kubectl` and `helm` on the client system that you will use to install our Helm charts
+
+## Installing Plane
+
+ 1. Open Terminal or any other command-line app that has access to Kubernetes tools on your local system.
+ 1. Add Helm Repo
+
+ ```bash
+ helm repo add makeplane https://helm.plane.so/
+ ```
+
+ 1. Set-up and customization
+
+ - Quick set-up
+ This is the fastest way to deploy Plane with default settings. This will create stateful deployments for Postgres, Rabbitmq, Redis, and Minio with a persistent volume claim using the default storage class. This also sets up the ingress routes for you using `nginx` ingress class.
+ > To customize this, see `Custom ingress routes` below.
+
+ Continue to be on the same Terminal window as you have so far, copy the code below, and paste it on your Terminal screen.
+
+ ```bash
+ helm upgrade --install plane-app makeplane/plane-ce \
+ --create-namespace \
+ --namespace plane-ce \
+ --set planeVersion=stable \
+ --set ingress.appHost="plane.example.com" \
+ --set ingress.minioHost="plane-minio.example.com" \
+ --set ingress.rabbitmqHost="plane-mq.example.com" \
+ --set ingress.ingressClass=nginx \
+ --timeout 10m \
+ --wait \
+ --wait-for-jobs
+ ```
+
+ > This is the basic setup required for Plane-CE. You can customize the default values for namespace and appname as needed. Additional settings can be configured by referring to the Configuration Settings section.
+
+ Using a Custom StorageClass
+
+ To specify a custom StorageClass for Plane-CE components, add the following options to the above `helm upgrade --install` command:
+ ```bash
+ --set postgres.storageClass=
+ --set redis.storageClass=
+ --set minio.storageClass=
+ --set rabbitmq.storageClass=
+ ```
+ - Advance set-up
+ For more control over your set-up, run the script below to download the `values.yaml` file and and edit using any editor like Vim or Nano.
+
+ ```bash
+ helm show values makeplane/plane-ce > values.yaml
+ vi values.yaml
+ ```
+
+ > See `Available customizations` for more details.
+
+ After saving the `values.yaml` file, continue to be on the same Terminal window as on the previous steps, copy the code below, and paste it on your Terminal screen.
+
+ ```bash
+ helm upgrade --install plane-app makeplane/plane-ce \
+ --create-namespace \
+ --namespace plane-ce \
+ -f values.yaml \
+ --timeout 10m \
+ --wait \
+ --wait-for-jobs
+ ```
+
+## Configuration Settings Available
+
+### Plane Version
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| planeVersion | stable | Yes | |
+
+### Postgress DB Setup
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| postgres.local_setup | true | | Plane uses `postgres` as the primary database to store all the transactional data. This database can be hosted within kubernetes as part of helm chart deployment or can be used as hosted service remotely (e.g. aws rds or similar services). Set this to `true` when you choose to setup stateful deployment of `postgres`. Mark it as `false` when using a remotely hosted database |
+| postgres.image | postgres:15.7-alpine | | Using this key, user must provide the docker image name to setup the stateful deployment of `postgres`. (must be set when `postgres.local_setup=true`)|
+| postgres.pullPolicy | IfNotPresent | | Using this key, user can set the pull policy for the stateful deployment of `postgres`. (must be set when `postgres.local_setup=true`)|
+| postgres.servicePort | 5432 | | This key sets the default port number to be used while setting up stateful deployment of `postgres`. |
+| postgres.volumeSize | 5Gi | | While setting up the stateful deployment, while creating the persistant volume, volume allocation size need to be provided. This key helps you set the volume allocation size. Unit of this value must be in Mi (megabyte) or Gi (gigabyte) |
+| env.pgdb_username | plane | | Database credentials are requried to access the hosted stateful deployment of `postgres`. Use this key to set the username for the stateful deployment. |
+| env.pgdb_password | plane | | Database credentials are requried to access the hosted stateful deployment of `postgres`. Use this key to set the password for the stateful deployment. |
+| env.pgdb_name | plane | | Database name to be used while setting up stateful deployment of `Postgres`|
+| env.pgdb_remote_url | | | Users can also decide to use the remote hosted database and link to Plane deployment. Ignoring all the above keys, set `postgres.local_setup` to `false` and set this key with remote connection url. |
+| postgres.storageClass | <k8s-default-storage-class> | | Creating the persitant volumes for the stateful deployments needs the `storageClass` name. Set the correct value as per your kubernetes cluster configuration. |
+| postgres.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Redis/Valkey Setup
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| redis.local_setup | true | | Plane uses `redis` to cache the session authentication and other static data. This database can be hosted within kubernetes as part of helm chart deployment or can be used as hosted service remotely (e.g. aws rds or similar services). Set this to `true` when you choose to setup stateful deployment of `redis`. Mark it as `false` when using a remotely hosted database |
+| redis.image | valkey/valkey:7.2.5-alpine | | Using this key, user must provide the docker image name to setup the stateful deployment of `redis`. (must be set when `redis.local_setup=true`)|
+| redis.pullPolicy | IfNotPresent | | Using this key, user can set the pull policy for the stateful deployment of `redis`. (must be set when `redis.local_setup=true`)|
+| redis.servicePort | 6379 | | This key sets the default port number to be used while setting up stateful deployment of `redis`. |
+| redis.volumeSize | 1Gi | | While setting up the stateful deployment, while creating the persistant volume, volume allocation size need to be provided. This key helps you set the volume allocation size. Unit of this value must be in Mi (megabyte) or Gi (gigabyte) |
+| env.remote_redis_url | | | Users can also decide to use the remote hosted database and link to Plane deployment. Ignoring all the above keys, set `redis.local_setup` to `false` and set this key with remote connection url. |
+| redis.storageClass | <k8s-default-storage-class> | | Creating the persitant volumes for the stateful deployments needs the `storageClass` name. Set the correct value as per your kubernetes cluster configuration. |
+| redis.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+
+### RabbitMQ Setup
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| rabbitmq.local_setup | true | | Plane uses `rabbitmq` as message queuing system. This can be hosted within kubernetes as part of helm chart deployment or can be used as hosted service remotely (e.g. aws mq or similar services). Set this to `true` when you choose to setup stateful deployment of `rabbitmq`. Mark it as `false` when using a remotely hosted service |
+| rabbitmq.image | rabbitmq:3.13.6-management-alpine | | Using this key, user must provide the docker image name to setup the stateful deployment of `rabbitmq`. (must be set when `rabbitmq.local_setup=true`)|
+| rabbitmq.pullPolicy | IfNotPresent | | Using this key, user can set the pull policy for the stateful deployment of `rabbitmq`. (must be set when `rabbitmq.local_setup=true`)|
+| rabbitmq.servicePort | 5672 | | This key sets the default port number to be used while setting up stateful deployment of `rabbitmq`. |
+| rabbitmq.managementPort | 15672 | | This key sets the default management port number to be used while setting up stateful deployment of `rabbitmq`. |
+| rabbitmq.volumeSize | 100Mi | | While setting up the stateful deployment, while creating the persistant volume, volume allocation size need to be provided. This key helps you set the volume allocation size. Unit of this value must be in Mi (megabyte) or Gi (gigabyte) |
+| rabbitmq.storageClass | <k8s-default-storage-class> | | Creating the persitant volumes for the stateful deployments needs the `storageClass` name. Set the correct value as per your kubernetes cluster configuration. |
+| rabbitmq.default_user | plane | | Credentials are requried to access the hosted stateful deployment of `rabbitmq`. Use this key to set the username for the stateful deployment. |
+| rabbitmq.default_password | plane | | Credentials are requried to access the hosted stateful deployment of `rabbitmq`. Use this key to set the password for the stateful deployment. |
+| rabbitmq.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+| rabbitmq.external_rabbitmq_url | | | Users can also decide to use the remote hosted service and link to Plane deployment. Ignoring all the above keys, set `rabbitmq.local_setup` to `false` and set this key with remote connection url. |
+
+### Doc Store (Minio/S3) Setup
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| minio.local_setup | true | | Plane uses `minio` as the default file storage drive. This storage can be hosted within kubernetes as part of helm chart deployment or can be used as hosted service remotely (e.g. aws S3 or similar services). Set this to `true` when you choose to setup stateful deployment of `postgres`. Mark it as `false` when using a remotely hosted database |
+| minio.image | minio/minio:latest | | Using this key, user must provide the docker image name to setup the stateful deployment of `minio`. (must be set when `minio.local_setup=true`)|
+| minio.image_mc | minio/mc:latest | | Using this key, user must provide the docker image name to setup the job deployment of `minio client`. (must be set when `services.minio.local_setup=true`)|
+| minio.pullPolicy | IfNotPresent | | Using this key, user can set the pull policy for the stateful deployment of `minio`. (must be set when `minio.local_setup=true`)|
+| minio.volumeSize | 5Gi | | While setting up the stateful deployment, while creating the persistant volume, volume allocation size need to be provided. This key helps you set the volume allocation size. Unit of this value must be in Mi (megabyte) or Gi (gigabyte) |
+| minio.root_user | admin | | Storage credentials are requried to access the hosted stateful deployment of `minio`. Use this key to set the username for the stateful deployment. |
+| minio.root_password | password | | Storage credentials are requried to access the hosted stateful deployment of `minio`. Use this key to set the password for the stateful deployment. |
+| minio.env.minio_endpoint_ssl | false | | (Optional) Env to enforce HTTPS when connecting to minio uploads bucket |
+| env.docstore_bucket | uploads | Yes | Storage bucket name is required as part of configuration. This is where files will be uploaded irrespective of if you are using `Minio` or external `S3` (or compatible) storage service |
+| env.doc_upload_size_limit | 5242880 | Yes | Document Upload Size Limit (default to 5Mb) |
+| env.aws_access_key | | | External `S3` (or compatible) storage service provides `access key` for the application to connect and do the necessary upload/download operations. To be provided when `minio.local_setup=false` |
+| env.aws_secret_access_key | | | External `S3` (or compatible) storage service provides `secret access key` for the application to connect and do the necessary upload/download operations. To be provided when `minio.local_setup=false` |
+| env.aws_region | | | External `S3` (or compatible) storage service providers creates any buckets in user selected region. This is also shared with the user as `region` for the application to connect and do the necessary upload/download operations. To be provided when `minio.local_setup=false` |
+| env.aws_s3_endpoint_url | | | External `S3` (or compatible) storage service providers shares a `endpoint_url` for the integration purpose for the application to connect and do the necessary upload/download operations. To be provided when `minio.local_setup=false` |
+| minio.storageClass | <k8s-default-storage-class> | | Creating the persitant volumes for the stateful deployments needs the `storageClass` name. Set the correct value as per your kubernetes cluster configuration. |
+| minio.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Web Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| web.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| web.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| web.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| web.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| web.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| web.image| artifacts.plane.so/makeplane/plane-frontend | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+| web.pullPolicy | Always | | Using this key, user can set the pull policy for the deployment of `web`. |
+| web.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Space Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| space.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| space.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| space.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| space.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| space.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| space.image| artifacts.plane.so/makeplane/plane-space| | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+| space.pullPolicy | Always | | Using this key, user can set the pull policy for the deployment of `space`. |
+| space.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Admin Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| admin.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| admin.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| admin.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| admin.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| admin.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| admin.image| artifacts.plane.so/makeplane/plane-admin | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+| admin.pullPolicy | Always | | Using this key, user can set the pull policy for the deployment of `admin`. |
+| admin.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Live Service Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| live.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| live.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| live.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| live.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| live.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| live.image| artifacts.plane.so/makeplane/plane-live | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+| live.pullPolicy | Always | | Using this key, user can set the pull policy for the deployment of `live`. |
+| env.live_sentry_dsn | | | (optional) Live service deployment comes with some of the preconfigured integration. Sentry is one among those. Here user can set the Sentry provided DSN for this integration.|
+| 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.|
+| live.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### API Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| api.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| api.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| api.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| api.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| api.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| api.image| artifacts.plane.so/makeplane/plane-backend | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+| api.pullPolicy | Always | | Using this key, user can set the pull policy for the deployment of `api`. |
+| env.sentry_dsn | | | (optional) API service deployment comes with some of the preconfigured integration. Sentry is one among those. Here user can set the Sentry provided DSN for this integration.|
+| env.sentry_environment | | | (optional) API 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.api_key_rate_limit | 60/minute | | (optional) User can set the maximum number of requests the API can handle in a given time frame.|
+| api.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
+
+### Worker Deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| worker.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| worker.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| worker.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| worker.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| worker.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| worker.image| artifacts.plane.so/makeplane/plane-backend | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+
+### Beat-Worker deployment
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| beatworker.replicas | 1 | Yes | Kubernetes helps you with scaling up/down the deployments. You can run 1 or more pods for each deployment. This key helps you setting up number of replicas you want to run for this deployment. It must be >=1 |
+| beatworker.memoryLimit | 1000Mi | | Every deployment in kubernetes can be set to use maximum memory they are allowed to use. This key sets the memory limit for this deployment to use.|
+| beatworker.cpuLimit | 500m | | Every deployment in kubernetes can be set to use maximum cpu they are allowed to use. This key sets the cpu limit for this deployment to use.|
+| beatworker.memoryRequest | 50Mi | | Every deployment in kubernetes can be set to use minimum memory they are allowed to use. This key sets the memory request for this deployment to use.|
+| beatworker.cpuRequest | 50m | | Every deployment in kubernetes can be set to use minimum cpu they are allowed to use. This key sets the cpu request for this deployment to use.|
+| beatworker.image| artifacts.plane.so/makeplane/plane-backend | | This deployment needs a preconfigured docker image to function. Docker image name is provided by the owner and must not be changed for this deployment |
+
+### Ingress and SSL Setup
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| ingress.enabled | true | | Ingress setup in kubernetes is a common practice to expose application to the intended audience. Set it to `false` if you are using external ingress providers like `Cloudflare` |
+| ingress.appHost | 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. |
+| ingress.minioHost | | | Based on above configuration, if you want to expose the `minio` web console to set of users, use this key to set the `host` mapping or leave it as `EMPTY` to not expose interface. |
+| ingress.rabbitmqHost | | | Based on above configuration, if you want to expose the `rabbitmq` web console to set of users, use this key to set the `host` mapping or leave it as `EMPTY` to not expose interface. |
+| ingress.ingressClass | nginx | Yes | Kubernetes cluster setup comes with various options of `ingressClass`. Based on your setup, set this value to the right one (eg. nginx, traefik, etc). Leave it to default in case you are using external ingress provider.|
+| ingress.ingress_annotations | `{ "nginx.ingress.kubernetes.io/proxy-body-size": "5m" }` | | Ingress controllers comes with various configuration options which can be passed as annotations. Setting this value lets you change the default value to user required. |
+| ssl.createIssuer | false | | Kubernets cluster setup supports creating `issuer` type resource. After deployment, this is step towards creating secure access to the ingress url. Issuer is required for you generate SSL certifiate. Kubernetes can be configured to use any of the certificate authority to generate SSL (depending on CertManager configuration). Set it to `true` to create the issuer. Applicable only when `ingress.enabled=true`|
+| ssl.issuer | http | | CertManager configuration allows user to create issuers using `http` or any of the other DNS Providers like `cloudflare`, `digitalocean`, etc. As of now Plane supports `http`, `cloudflare`, `digitalocean`|
+| ssl.token | | | To create issuers using DNS challenge, set the issuer api token of dns provider like cloudflare` or `digitalocean`(not required for http) |
+| ssl.server | | | Issuer creation configuration need the certificate generation authority server url. Default URL is the `Let's Encrypt` server|
+| ssl.email | | | Certificate generation authority needs a valid email id before generating certificate. Required when `ssl.createIssuer=true` |
+| ssl.generateCerts | false | | After creating the issuers, user can still not create the certificate untill sure of configuration. Setting this to `true` will try to generate SSL certificate and associate with ingress. Applicable only when `ingress.enabled=true` and `ssl.createIssuer=true` |
+| ssl.tls_secret_name | | | If you have a custom TLS secret name, set this to the name of the secret. Applicable only when `ingress.enabled=true` and `ssl.createIssuer=false` |
+
+### Common Environment Settings
+
+| Setting | Default | Required | Description |
+|---|:---:|:---:|---|
+| env.secret_key | 60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5 | Yes | This must a random string which is used for hashing/encrypting the sensitive data within the application. Once set, changing this might impact the already hashed/encrypted data|
+| env.default_cluster_domain | cluster.local | Yes | Set this value as configured in your kubernetes cluster. `cluster.local` is usally the default in most cases. |
+
+
+## External Secrets Config
+
+To configure the external secrets for your application, you need to define specific environment variables for each secret category. Below is a list of the required secrets and their respective environment variables.
+
+| Secret Name | Env Var Name | Required | Description | Example Value |
+|--- |:---|:---|:---|:---|
+| rabbitmq_existingSecret | `RABBITMQ_DEFAULT_USER` | Required if `rabbitmq.local_setup=true` | The default RabbitMQ user | `plane` |
+| | `RABBITMQ_DEFAULT_PASS` | Required if `rabbitmq.local_setup=true` | The default RabbitMQ password | `plane` |
+| pgdb_existingSecret | `POSTGRES_PASSWORD` | Required if `postgres.local_setup=true` | Password for PostgreSQL database | `plane` |
+| | `POSTGRES_DB` | Required if `postgres.local_setup=true` | Name of the PostgreSQL database | `plane` |
+| | `POSTGRES_USER` | Required if `postgres.local_setup=true` | PostgreSQL user | `plane` |
+| doc_store_existingSecret | `USE_MINIO` | Yes | Flag to enable MinIO as the storage backend | `1` |
+| | `MINIO_ROOT_USER` | Yes | MinIO root user | `admin` |
+| | `MINIO_ROOT_PASSWORD` | Yes | MinIO root password | `password` |
+| | `AWS_ACCESS_KEY_ID` | Yes | AWS Access Key ID | `your_aws_key` |
+| | `AWS_SECRET_ACCESS_KEY` | Yes | AWS Secret Access Key | `your_aws_secret` |
+| | `AWS_S3_BUCKET_NAME` | Yes | AWS S3 Bucket Name | `your_bucket_name` |
+| | `AWS_S3_ENDPOINT_URL` | Yes | Endpoint URL for AWS S3 or MinIO | `http://plane-minio.plane-ns.svc.cluster.local:9000` |
+| | `AWS_REGION` | Optional | AWS region where your S3 bucket is located | `your_aws_region` |
+| | `FILE_SIZE_LIMIT` | Yes | Limit for file uploads in your system | `5MB` |
+| app_env_existingSecret | `SECRET_KEY` | Yes | Random secret key | `60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5` |
+| | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` |
+| | `DATABASE_URL` | Yes | PostgreSQL connection URL | **k8s service example**: `postgresql://plane:plane@plane-pgdb.plane-ns.svc.cluster.local:5432/plane`
**external service example**: `postgresql://username:password@your-db-host:5432/plane` |
+| | `AMQP_URL` | Yes | RabbitMQ connection URL | **k8s service example**: `amqp://plane:plane@plane-rabbitmq.plane-ns.svc.cluster.local:5672/`
**external service example**: `amqp://username:password@your-rabbitmq-host:5672/` |
+| live_env_existingSecret | `REDIS_URL` | Yes | Redis URL | `redis://plane-redis.plane-ns.svc.cluster.local:6379/` |
+
+
+## Custom Ingress Routes
+
+If you are planning to use 3rd party ingress providers, here is the available route configuration
+
+| Host | Path | Service | Required |
+|--- |:---:|---|:--- |
+| plane.example.com | / | | Yes |
+| plane.example.com | /spaces/* | | Yes |
+| plane.example.com | /god-mode/* | | Yes |
+| plane.example.com | /live/* | | Yes |
+| plane.example.com | /api/* | | Yes |
+| plane.example.com | /auth/* | | Yes |
+| plane.example.com | /uploads/* | | Yes (Only if using local setup) |
+| plane-minio.example.com | / | | (Optional) if using local setup, this will enable minio console access |
+| plane-mq.example.com | / | | (Optional) if using local setup, this will enable management console access |
diff --git a/charts/plane-ce/questions.yml b/charts/plane-ce/questions.yml
new file mode 100644
index 0000000..330d44a
--- /dev/null
+++ b/charts/plane-ce/questions.yml
@@ -0,0 +1,638 @@
+questions:
+
+- variable: dockerRegistry.enabled
+ label: Docker Registry Enabled
+ type: boolean
+ default: false
+ group: "Docker Registry"
+ show_subquestion_if: true
+ subquestions:
+ - variable: dockerRegistry.host
+ label: "Registry Host"
+ type: string
+ - variable: dockerRegistry.loginid
+ label: "Login ID"
+ type: string
+ - variable: dockerRegistry.password
+ label: "Password/Token"
+ type: password
+
+- variable: planeVersion
+ label: Plane Version (Docker Image Tag)
+ type: string
+ default: stable
+ required: true
+ group: "Docker Registry"
+
+- variable: web.image
+ label: Frontend Docker Image
+ type: string
+ required: true
+ default: "artifacts.plane.so/makeplane/plane-frontend"
+ group: "Web Setup"
+ subquestions:
+ - variable: web.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "Always"
+ - variable: web.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ - variable: web.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: web.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: web.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ - variable: web.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: web.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+
+- variable: space.image
+ label: Space Docker Image
+ type: string
+ required: true
+ default: "artifacts.plane.so/makeplane/plane-space"
+ group: "Spaces Setup"
+ subquestions:
+ - variable: space.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "Always"
+ - variable: space.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ - variable: space.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: space.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: space.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: space.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+ - variable: space.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+
+- variable: admin.image
+ label: Admin Docker Image
+ type: string
+ required: true
+ default: "artifacts.plane.so/makeplane/plane-admin"
+ group: "Admin Setup"
+ subquestions:
+ - variable: admin.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "Always"
+ - variable: admin.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ - variable: admin.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: admin.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: admin.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: true
+ - variable: admin.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: admin.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+- variable: live.image
+ label: Live Docker Image
+ type: string
+ required: true
+ default: "artifacts.plane.so/makeplane/plane-live"
+ description: "Live Server Setup"
+ group: "Live Setup"
+ subquestions:
+ - variable: live.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "Always"
+ - variable: live.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ - variable: live.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: live.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: live.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ - variable: live.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: live.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+ - variable: env.live_sentry_dsn
+ label: "Live Sentry DSN"
+ type: string
+ default: ""
+ - variable: env.live_sentry_environment
+ label: "Live Sentry Environment"
+ type: string
+ default: ""
+ - variable: env.live_sentry_traces_sample_rate
+ label: "Live Sentry Traces Sample Rate"
+ type: string
+ default: ""
+
+- variable: api.image
+ label: Backend Docker Image
+ type: string
+ required: true
+ default: "artifacts.plane.so/makeplane/plane-backend"
+ description: "Used by API, Worker, Beat-Worker"
+ group: "API Setup"
+ subquestions:
+ - variable: api.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "Always"
+ - variable: api.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ - variable: api.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: api.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: api.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ - variable: api.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: api.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+ - variable: env.cors_allowed_origins
+ label: "CORS Allowed Origins"
+ type: string
+ default: ""
+ - variable: env.sentry_dsn
+ label: "Sentry DSN"
+ type: string
+ default: ""
+ - variable: env.sentry_environment
+ label: "Sentry Environment"
+ type: string
+ default: "Development"
+ - variable: env.secret_key
+ label: "Random Secret Key"
+ type: string
+ required: true
+ default: "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5"
+ - variable: env.api_key_rate_limit
+ label: "API Key Rate Limit"
+ type: string
+ default: "60/minute"
+
+- variable: worker.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ group: "Worker Setup"
+ subquestions:
+ - variable: worker.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: worker.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: worker.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: worker.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+- variable: beatworker.replicas
+ label: "Default Replica Count"
+ type: int
+ default: 1
+ group: "Beat Worker Setup"
+ subquestions:
+ - variable: beatworker.memoryLimit
+ label: "Memory Limit"
+ type: string
+ default: 1000Mi
+ - variable: beatworker.cpuLimit
+ label: "CPU Limit"
+ type: string
+ default: 500m
+ - variable: beatworker.memoryRequest
+ label: "Memory Request"
+ type: string
+ default: 50Mi
+ - variable: beatworker.cpuRequest
+ label: "CPU Request"
+ type: string
+ default: 50m
+- variable: redis.local_setup
+ label: "Install Redis"
+ type: boolean
+ default: true
+ group: "Redis Setup"
+ subquestions:
+ - variable: redis.pullPolicy
+ label: "Redis Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "IfNotPresent"
+ - variable: redis.image
+ label: "Docker Image"
+ type: string
+ default: "valkey/valkey:7.2.5-alpine"
+ show_if: "redis.local_setup=true"
+ - variable: redis.servicePort
+ label: Port
+ type: int
+ default: 6379
+ show_if: "redis.local_setup=true"
+ - variable: redis.storageClass
+ label: "Storage Class"
+ type: storageclass
+ show_if: "redis.local_setup=true"
+ - variable: redis.volumeSize
+ label: "Volume Size"
+ type: string
+ default: "100Mi"
+ show_if: "redis.local_setup=true"
+ - variable: redis.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ show_if: "redis.local_setup=true"
+ - variable: env.remote_redis_url
+ label: "Remote Redis URL"
+ type: string
+ default: "redis://"
+ show_if: "redis.local_setup=false"
+
+- variable: postgres.local_setup
+ label: "Install Postgres"
+ type: boolean
+ default: true
+ group: "Postgres Setup"
+ # show_subquestion_if: true
+ subquestions:
+ - variable: postgres.pullPolicy
+ label: "Postgres Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "IfNotPresent"
+ - variable: postgres.image
+ label: "Docker Image"
+ type: string
+ default: "postgres:15.7-alpine"
+ show_if: "postgres.local_setup=true"
+ - variable: postgres.servicePort
+ label: Service Port
+ type: int
+ default: 5432
+ show_if: "postgres.local_setup=true"
+ - variable: postgres.storageClass
+ label: "Storage Class"
+ type: storageclass
+ show_if: "postgres.local_setup=true"
+ - variable: postgres.volumeSize
+ label: "Volume Size"
+ type: string
+ default: "1Gi"
+ show_if: "postgres.local_setup=true"
+ - variable: env.pgdb_username
+ label: "Username"
+ type: string
+ default: "plane"
+ show_if: "postgres.local_setup=true"
+ - variable: env.pgdb_password
+ label: "Password"
+ type: password
+ default: "plane"
+ show_if: "postgres.local_setup=true"
+ - variable: env.pgdb_name
+ label: "DB Name"
+ type: string
+ default: "plane"
+ show_if: "postgres.local_setup=true"
+ - variable: postgres.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ show_if: "postgres.local_setup=true"
+ - variable: env.pgdb_remote_url
+ label: "Remote URL"
+ type: string
+ default: "postrgres://"
+ show_if: "postgres.local_setup=false"
+
+- variable: rabbitmq.local_setup
+ label: "Install RabbitMQ"
+ type: boolean
+ default: true
+ group: "RabbitMQ Setup"
+ subquestions:
+ - variable: rabbitmq.image
+ label: "Docker Image"
+ type: string
+ default: "rabbitmq:3.13.6-management-alpine"
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.pullPolicy
+ label: "Image Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "IfNotPresent"
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.servicePort
+ label: Service Port
+ type: int
+ default: 5672
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.managementPort
+ label: Management Port
+ type: int
+ default: 15672
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.assign_cluster_ip
+ label: "Assign ClusterIP"
+ type: boolean
+ default: false
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.storageClass
+ label: "Storage Class"
+ type: storageclass
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.volumeSize
+ label: "Volume Size"
+ type: string
+ default: "100Mi"
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.default_user
+ label: "Username"
+ type: string
+ default: "plane"
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.default_password
+ label: "Password"
+ type: password
+ default: "plane"
+ show_if: "rabbitmq.local_setup=true"
+ - variable: rabbitmq.external_rabbitmq_url
+ label: "Remote URL"
+ type: string
+ show_if: "rabbitmq.local_setup=false"
+
+- variable: minio.local_setup
+ label: "Install Minio"
+ type: boolean
+ default: true
+ group: "Storage Setup"
+ subquestions:
+ - variable: minio.pullPolicy
+ label: "Minio Pull Policy"
+ type: enum
+ options:
+ - "Always"
+ - "IfNotPresent"
+ - "Never"
+ default: "IfNotPresent"
+ - variable: minio.image
+ label: "Docker Image"
+ type: string
+ default: "minio/minio:latest"
+ show_if: "minio.local_setup=true"
+ - variable: minio.image_mc
+ label: "MinIO Client Docker Image"
+ type: string
+ default: "minio/mc:latest"
+ show_if: "minio.local_setup=true"
+ - variable: minio.root_user
+ label: "Root User"
+ type: string
+ default: "admin"
+ show_if: "minio.local_setup=true"
+ - variable: minio.root_password
+ label: "Root Password"
+ type: password
+ default: "password"
+ show_if: "minio.local_setup=true"
+ - variable: minio.storageClass
+ label: "Storage Class"
+ type: storageclass
+ show_if: "minio.local_setup=true"
+ - variable: minio.volumeSize
+ label: "Volume Size"
+ type: string
+ default: "1Gi"
+ show_if: "minio.local_setup=true"
+ - variable: minio.assign_cluster_ip
+ label: "Assign Cluster IP"
+ type: boolean
+ default: false
+ show_if: "minio.local_setup=true"
+ - variable: env.aws_access_key
+ label: "AWS Access Key"
+ type: string
+ default: ""
+ show_if: "minio.local_setup=false"
+ - variable: env.aws_secret_access_key
+ label: "AWS Secret Key"
+ type: password
+ default: ""
+ show_if: "minio.local_setup=false"
+ - variable: env.aws_region
+ label: "AWS Region"
+ type: string
+ default: ""
+ show_if: "minio.local_setup=false"
+ - variable: env.aws_s3_endpoint_url
+ label: "AWS S3 Endpoint URL"
+ type: string
+ default: ""
+ show_if: "minio.local_setup=false"
+ - variable: env.docstore_bucket
+ label: "Bucket Name"
+ type: string
+ default: "uploads"
+ - variable: env.doc_upload_size_limit
+ label: "FIle Upload Size Limit"
+ type: string
+ default: "5242880"
+ - variable: minio.env.minio_endpoint_ssl
+ label: "Minio Endpoint SSL"
+ type: boolean
+ default: false
+
+- variable: ingress.enabled
+ label: "Install Ingress"
+ type: boolean
+ default: true
+ required: true
+ group: "Ingress"
+ subquestions:
+ - variable: ingress.appHost
+ label: "App. Host"
+ type: string
+ default: "plane.example.com"
+ required: true
+ - variable: ingress.minioHost
+ label: "Minio Host"
+ type: string
+ default: ""
+ show_if: "minio.local_setup=true"
+ - variable: ingress.rabbitmqHost
+ label: "Rabbitmq Host"
+ type: string
+ default: ""
+ show_if: "rabbitmq.local_setup=true"
+ - variable: ingress.ingressClass
+ label: "Ingress Classname"
+ type: string
+ default: "nginx"
+ show_if: "ingress.enabled=true"
+
+- variable: ssl.createIssuer
+ label: "Create Issuer"
+ type: boolean
+ default: false
+ group: "Ingress"
+ show_if: "ingress.enabled=true"
+ show_subquestion_if: true
+ subquestions:
+ - variable: ssl.issuer
+ label: "SSL Issuer"
+ type: enum
+ options:
+ - "http"
+ - "cloudflare"
+ - "digitalocean"
+ default: "http"
+ - variable: ssl.server
+ label: "Let's Encrypt Server URL"
+ type: string
+ default: "https://acme-staging-v02.api.letsencrypt.org/directory"
+ - variable: ssl.email
+ label: "Let's Encrypt Reg. Email"
+ type: string
+ default: "plane@example.com"
+ - variable: ssl.token
+ label: "Provider API Token"
+ type: password
+ default: ""
+ description: "Not required for 'http' issuer"
+ show_if: "ssl.issuer=cloudflare || ssl.issuer=digitalocean"
+ - variable: ssl.generateCerts
+ label: "Enable to generate certificates"
+ type: boolean
+ default: false
+
+- variable: ssl.tls_secret_name
+ label: "Custom TLS Secret Name"
+ type: string
+ default: ""
+ group: "Ingress"
+ show_if: "ssl.createIssuer=false"
+
+- variable: external_secrets.rabbitmq_existingSecret
+ label: "RabbitMQ Secrets File Name"
+ type: string
+ default: ""
+ group: "External Secrets"
+- variable: external_secrets.pgdb_existingSecret
+ label: "Postgres Secrets File Name"
+ type: string
+ default: ""
+ group: "External Secrets"
+- variable: external_secrets.doc_store_existingSecret
+ label: "Doc Store and Minio Secrets File Name"
+ type: string
+ default: ""
+ group: "External Secrets"
+- variable: external_secrets.app_env_existingSecret
+ label: "App Envs Secrets File Name"
+ type: string
+ default: ""
+ group: "External Secrets"
diff --git a/charts/plane-ce/templates/_helpers.tpl b/charts/plane-ce/templates/_helpers.tpl
new file mode 100644
index 0000000..b33a371
--- /dev/null
+++ b/charts/plane-ce/templates/_helpers.tpl
@@ -0,0 +1,3 @@
+{{- define "imagePullSecret" }}
+{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\"}}}" .Values.dockerRegistry.host .Values.dockerRegistry.loginid .Values.dockerRegistry.password | b64enc }}
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/certs/cert-issuers.yaml b/charts/plane-ce/templates/certs/cert-issuers.yaml
new file mode 100644
index 0000000..b5266c9
--- /dev/null
+++ b/charts/plane-ce/templates/certs/cert-issuers.yaml
@@ -0,0 +1,46 @@
+{{- if and .Values.ingress.enabled .Values.ssl.createIssuer (empty .Values.ssl.tls_secret_name) }}
+
+apiVersion: v1
+kind: Secret
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-issuer-api-token-secret
+type: Opaque
+stringData:
+ api-token: {{ .Values.ssl.token | default "default-api-token" | quote }}
+
+---
+apiVersion: cert-manager.io/v1
+kind: Issuer
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-cert-issuer
+spec:
+ acme:
+ email: {{ .Values.ssl.email }}
+ server: {{ .Values.ssl.server }}
+ privateKeySecretRef:
+ name: {{ .Release.Name }}-cert-issuer-key
+ solvers:
+ {{- if eq .Values.ssl.issuer "cloudflare" }}
+ - dns01:
+ cloudflare:
+ apiTokenSecretRef:
+ name: {{ .Release.Name }}-issuer-api-token-secret
+ key: api-token
+ {{- end }}
+ {{- if eq .Values.ssl.issuer "digitalocean" }}
+ - dns01:
+ digitalocean:
+ tokenSecretRef:
+ name: {{ .Release.Name }}-issuer-api-token-secret
+ key: api-token
+ {{- end }}
+ {{- if eq .Values.ssl.issuer "http" }}
+ - http01:
+ ingress:
+ ingressClassName: {{ .Values.ingress.ingressClass }}
+ {{- end }}
+
+---
+{{- end}}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/certs/certs.yaml b/charts/plane-ce/templates/certs/certs.yaml
new file mode 100644
index 0000000..48ab964
--- /dev/null
+++ b/charts/plane-ce/templates/certs/certs.yaml
@@ -0,0 +1,21 @@
+{{- if and .Values.ingress.enabled .Values.ssl.createIssuer .Values.ssl.generateCerts (empty .Values.ssl.tls_secret_name) }}
+
+apiVersion: cert-manager.io/v1
+kind: Certificate
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-ssl-cert
+spec:
+ dnsNames:
+ - {{ .Values.ingress.appHost | quote }}
+ {{- if and .Values.minio.local_setup .Values.ingress.minioHost }}
+ - {{ .Values.ingress.minioHost | quote }}
+ {{- end }}
+ {{- if and .Values.rabbitmq.local_setup .Values.ingress.rabbitmqHost }}
+ - {{ .Values.ingress.rabbitmqHost | quote }}
+ {{- end }}
+ issuerRef:
+ name: {{ .Release.Name }}-cert-issuer
+ secretName: {{ .Release.Name }}-ssl-cert
+
+{{- end}}
diff --git a/charts/plane-ce/templates/config-secrets/app-env.yaml b/charts/plane-ce/templates/config-secrets/app-env.yaml
new file mode 100644
index 0000000..8a2915d
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/app-env.yaml
@@ -0,0 +1,66 @@
+{{- if empty .Values.external_secrets.app_env_existingSecret}}
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-app-secrets
+stringData:
+ SECRET_KEY: {{ .Values.env.secret_key | default "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5" | quote }}
+ {{- if .Values.redis.local_setup }}
+ REDIS_URL: "redis://{{ .Release.Name }}-redis.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:6379/"
+ {{- else }}
+ REDIS_URL: {{ .Values.env.remote_redis_url | default "" | quote }}
+ {{- end }}
+
+ {{- if .Values.postgres.local_setup }}
+ DATABASE_URL: "postgresql://{{ .Values.env.pgdb_username }}:{{ .Values.env.pgdb_password }}@{{ .Release.Name }}-pgdb.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}/{{ .Values.env.pgdb_name }}"
+ {{- else if .Values.env.pgdb_remote_url }}
+ DATABASE_URL: {{ .Values.env.pgdb_remote_url}}
+ {{- else }}
+ DATABASE_URL: ""
+ {{ end }}
+
+ {{- if .Values.rabbitmq.local_setup }}
+ AMQP_URL: "amqp://{{ .Values.rabbitmq.default_user}}:{{ .Values.rabbitmq.default_password}}@{{ .Release.Name }}-rabbitmq.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}/"
+ {{- else if .Values.rabbitmq.external_rabbitmq_url }}
+ AMQP_URL: {{ .Values.rabbitmq.external_rabbitmq_url}}
+ {{- else }}
+ AMQP_URL: ""
+ {{ end }}
+---
+{{- end }}
+
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-app-vars
+data:
+ SENTRY_DSN: {{ .Values.env.sentry_dsn | default "" | quote}}
+ SENTRY_ENVIRONMENT: {{ .Values.env.sentry_environment | default "" | quote}}
+ DEBUG: "0"
+ DOCKERIZED: "1"
+ GUNICORN_WORKERS: "1"
+ MINIO_ENDPOINT_SSL: {{ .Values.minio.env.minio_endpoint_ssl | default false | ternary "1" "0" | quote }}
+ API_KEY_RATE_LIMIT: {{ .Values.env.api_key_rate_limit | default "60/minute" | quote }}
+
+ {{- if .Values.ingress.appHost }}
+ WEB_URL: "http://{{ .Values.ingress.appHost }}"
+ {{- else }}
+ WEB_URL: ""
+ {{- end }}
+
+
+ {{- if eq .Values.env.cors_allowed_origins "*"}}
+ CORS_ALLOWED_ORIGINS: "*"
+ {{- else if and .Values.ingress.appHost .Values.env.cors_allowed_origins }}
+ CORS_ALLOWED_ORIGINS: "http://{{ .Values.ingress.appHost }},https://{{ .Values.ingress.appHost }},{{ .Values.env.cors_allowed_origins }}"
+ {{- else if .Values.env.cors_allowed_origins }}
+ CORS_ALLOWED_ORIGINS: "{{ .Values.env.cors_allowed_origins }}"
+ {{- else if .Values.ingress.appHost}}
+ CORS_ALLOWED_ORIGINS: "http://{{ .Values.ingress.appHost }},https://{{ .Values.ingress.appHost }}"
+ {{- else }}
+ CORS_ALLOWED_ORIGINS: ""
+ {{- end }}
diff --git a/charts/plane-ce/templates/config-secrets/doc-store.yaml b/charts/plane-ce/templates/config-secrets/doc-store.yaml
new file mode 100644
index 0000000..68f8703
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/doc-store.yaml
@@ -0,0 +1,26 @@
+{{- if empty .Values.external_secrets.doc_store_existingSecret }}
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-doc-store-secrets
+stringData:
+ FILE_SIZE_LIMIT: {{ .Values.env.doc_upload_size_limit | default 5242880 | quote }}
+ AWS_S3_BUCKET_NAME: {{ .Values.env.docstore_bucket | default "" | quote }}
+ {{- if .Values.minio.local_setup }}
+ USE_MINIO: "1"
+ MINIO_ROOT_USER: {{ .Values.minio.root_user | default "admin" | quote }}
+ MINIO_ROOT_PASSWORD: {{ .Values.minio.root_password | default "password" | quote}}
+ AWS_ACCESS_KEY_ID: {{ .Values.minio.root_user | default "admin" | quote }}
+ AWS_SECRET_ACCESS_KEY: {{ .Values.minio.root_password | default "password" | quote }}
+ AWS_S3_ENDPOINT_URL: http://{{ .Release.Name }}-minio:9000
+ {{- else }}
+ USE_MINIO: "0"
+ AWS_ACCESS_KEY_ID: {{ .Values.env.aws_access_key | default "" | quote }}
+ AWS_SECRET_ACCESS_KEY: {{ .Values.env.aws_secret_access_key | default "" | quote }}
+ AWS_S3_ENDPOINT_URL: {{ .Values.env.aws_s3_endpoint_url | quote }}
+ AWS_REGION: {{ .Values.env.aws_region | default "" | quote }}
+ {{- end }}
+---
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/config-secrets/docker-registry.yaml b/charts/plane-ce/templates/config-secrets/docker-registry.yaml
new file mode 100644
index 0000000..14e6b3d
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/docker-registry.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.dockerRegistry.enabled }}
+
+apiVersion: v1
+kind: Secret
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-docker-registry-credentials
+data:
+ .dockerconfigjson: {{ include "imagePullSecret" .}}
+type: kubernetes.io/dockerconfigjson
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/config-secrets/live-env.yaml b/charts/plane-ce/templates/config-secrets/live-env.yaml
new file mode 100644
index 0000000..33842e8
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/live-env.yaml
@@ -0,0 +1,28 @@
+{{- if empty .Values.external_secrets.live_env_existingSecret}}
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-live-secrets
+stringData:
+ {{- if .Values.redis.local_setup }}
+ REDIS_URL: "redis://{{ .Release.Name }}-redis.{{ .Release.Namespace }}.svc.cluster.local:6379/"
+ {{- else }}
+ REDIS_URL: {{ .Values.env.remote_redis_url | default "" | quote }}
+ {{- end }}
+---
+{{- end }}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-live-vars
+data:
+ API_BASE_URL: "http://{{ .Release.Name }}-api.{{ .Release.Namespace }}.svc.cluster.local:8000/"
+ LIVE_SENTRY_DSN: {{ .Values.env.live_sentry_dsn | default "" | quote }}
+ LIVE_SENTRY_ENVIRONMENT: {{ .Values.env.live_sentry_environment | default "" | quote }}
+ LIVE_SENTRY_TRACES_SAMPLE_RATE: {{ .Values.env.live_sentry_traces_sample_rate | default "" | quote }}
+ LIVE_BASE_PATH: "/live"
+---
diff --git a/charts/plane-ce/templates/config-secrets/pgdb.yaml b/charts/plane-ce/templates/config-secrets/pgdb.yaml
new file mode 100644
index 0000000..2871d5a
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/pgdb.yaml
@@ -0,0 +1,14 @@
+{{- if and .Values.postgres.local_setup (empty .Values.external_secrets.pgdb_existingSecret) }}
+
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-pgdb-secrets
+stringData:
+ POSTGRES_PASSWORD: {{ .Values.env.pgdb_password | default "plane" | quote }}
+ POSTGRES_DB: {{ .Values.env.pgdb_name | default "plane" | quote }}
+ POSTGRES_USER: {{ .Values.env.pgdb_username | default "plane" | quote }}
+---
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/config-secrets/rabbitmqdb.yaml b/charts/plane-ce/templates/config-secrets/rabbitmqdb.yaml
new file mode 100644
index 0000000..1c159cb
--- /dev/null
+++ b/charts/plane-ce/templates/config-secrets/rabbitmqdb.yaml
@@ -0,0 +1,14 @@
+{{- if and .Values.rabbitmq.local_setup (empty .Values.external_secrets.rabbitmq_existingSecret) }}
+
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-rabbitmq-secrets
+stringData:
+ RABBITMQ_DEFAULT_USER: {{ .Values.rabbitmq.default_user | default "plane" | quote }}
+ RABBITMQ_DEFAULT_PASS: {{ .Values.rabbitmq.default_password | default "plane" |quote }}
+---
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/ingress.yaml b/charts/plane-ce/templates/ingress.yaml
new file mode 100644
index 0000000..2e36ddc
--- /dev/null
+++ b/charts/plane-ce/templates/ingress.yaml
@@ -0,0 +1,121 @@
+{{- if and .Values.ingress.enabled .Values.ingress.appHost }}
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-ingress
+ {{- if gt (len .Values.ingress.ingress_annotations) 0 }}
+ annotations:
+ {{- range $key, $value := .Values.ingress.ingress_annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ {{- end }}
+spec:
+ ingressClassName: {{ .Values.ingress.ingressClass | quote }}
+ rules:
+ - host: {{ .Values.ingress.appHost }}
+ http:
+ paths:
+ - backend:
+ service:
+ port:
+ number: 3000
+ name: {{ .Release.Name }}-web
+ path: /
+ pathType: Prefix
+ - backend:
+ service:
+ port:
+ number: 8000
+ name: {{ .Release.Name }}-api
+ path: /api
+ pathType: Prefix
+ - backend:
+ service:
+ port:
+ number: 8000
+ name: {{ .Release.Name }}-api
+ path: /auth
+ pathType: Prefix
+ - backend:
+ service:
+ port:
+ number: 3000
+ name: {{ .Release.Name }}-live
+ path: /live/
+ pathType: Prefix
+ - backend:
+ service:
+ port:
+ number: 3000
+ name: {{ .Release.Name }}-space
+ path: /spaces
+ pathType: Prefix
+ - backend:
+ service:
+ port:
+ number: 3000
+ name: {{ .Release.Name }}-admin
+ path: /god-mode
+ pathType: Prefix
+ {{- if and .Values.minio.local_setup .Values.env.docstore_bucket }}
+ - backend:
+ service:
+ port:
+ number: 9000
+ name: {{ .Release.Name }}-minio
+ path: /{{ .Values.env.docstore_bucket }}
+ pathType: Prefix
+ {{- end }}
+
+ {{- if and .Values.minio.local_setup .Values.ingress.minioHost }}
+ - host: {{ .Values.ingress.minioHost }}
+ http:
+ paths:
+ - backend:
+ service:
+ port:
+ number: 9090
+ name: {{ .Release.Name }}-minio
+ path: /
+ pathType: Prefix
+ {{- end }}
+ {{- if and .Values.rabbitmq.local_setup .Values.ingress.rabbitmqHost }}
+ - host: {{ .Values.ingress.rabbitmqHost }}
+ http:
+ paths:
+ - backend:
+ service:
+ port:
+ number: 15672
+ name: {{ .Release.Name }}-rabbitmq
+ path: /
+ pathType: Prefix
+ {{- end }}
+
+ {{- if .Values.ssl.tls_secret_name }}
+ tls:
+ - hosts:
+ - {{ .Values.ingress.appHost | quote }}
+ {{- if and .Values.minio.local_setup .Values.ingress.minioHost }}
+ - {{ .Values.ingress.minioHost | quote }}
+ {{- end }}
+ {{- if and .Values.rabbitmq.local_setup .Values.ingress.rabbitmqHost }}
+ - {{ .Values.ingress.rabbitmqHost | quote }}
+ {{- end }}
+ secretName: {{ .Values.ssl.tls_secret_name }}
+ {{- else if and .Values.ssl.generateCerts .Values.ssl.createIssuer }}
+ tls:
+ - hosts:
+ - {{ .Values.ingress.appHost | quote }}
+ {{- if and .Values.minio.local_setup .Values.ingress.minioHost }}
+ - {{ .Values.ingress.minioHost | quote }}
+ {{- end }}
+ {{- if and .Values.rabbitmq.local_setup .Values.ingress.rabbitmqHost }}
+ - {{ .Values.ingress.rabbitmqHost | quote }}
+ {{- end }}
+ secretName: {{ .Release.Name }}-ssl-cert
+ {{- end }}
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/service-account.yaml b/charts/plane-ce/templates/service-account.yaml
new file mode 100644
index 0000000..6eed2f5
--- /dev/null
+++ b/charts/plane-ce/templates/service-account.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+automountServiceAccountToken: true
+kind: ServiceAccount
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-srv-account
+{{- if .Values.dockerRegistry.enabled }}
+imagePullSecrets:
+ - name: {{ .Release.Name }}-docker-registry-credentials
+{{- end}}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/admin.deployment.yaml b/charts/plane-ce/templates/workloads/admin.deployment.yaml
new file mode 100644
index 0000000..01722d1
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/admin.deployment.yaml
@@ -0,0 +1,62 @@
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-admin
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
+spec:
+ {{- if not .Values.admin.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: admin-3000
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-admin-wl
+spec:
+ replicas: {{ .Values.admin.replicas | default 1 }}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-admin
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-admin
+ imagePullPolicy: {{ .Values.admin.pullPolicy | default "Always" }}
+ image: {{ .Values.admin.image | default "artifacts.plane.so/makeplane/plane-frontend" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.admin.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.admin.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.admin.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.admin.cpuLimit | default "500m" | quote}}
+ command:
+ - node
+ args:
+ - admin/server.js
+ - admin
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/api.deployment.yaml b/charts/plane-ce/templates/workloads/api.deployment.yaml
new file mode 100644
index 0000000..0eb76c6
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/api.deployment.yaml
@@ -0,0 +1,79 @@
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-api
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
+spec:
+ {{- if not .Values.api.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: api-8000
+ port: 8000
+ protocol: TCP
+ targetPort: 8000
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-api-wl
+spec:
+ replicas: {{ .Values.api.replicas | default 1}}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-api
+ imagePullPolicy: {{ .Values.api.pullPolicy | default "Always" }}
+ image: {{ .Values.api.image | default "artifacts.plane.so/makeplane/plane-backend" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.api.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.api.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.api.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.api.cpuLimit | default "500m" | quote}}
+ command:
+ - ./bin/docker-entrypoint-api.sh
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-app-vars
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }}
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+ readinessProbe:
+ failureThreshold: 30
+ httpGet:
+ path: /
+ port: 8000
+ scheme: HTTP
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/beat-worker.deployment.yaml b/charts/plane-ce/templates/workloads/beat-worker.deployment.yaml
new file mode 100644
index 0000000..396d8b5
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/beat-worker.deployment.yaml
@@ -0,0 +1,49 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-beat-worker-wl
+spec:
+ replicas: {{ .Values.beatworker.replicas | default 1 }}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-beat-worker
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-beat-worker
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-beat-worker
+ imagePullPolicy: {{ .Values.beatworker.pullPolicy | default "Always" }}
+ image: {{ .Values.beatworker.image | default "artifacts.plane.so/makeplane/plane-backend" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.beatworker.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.beatworker.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.beatworker.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.beatworker.cpuLimit | default "500m" | quote}}
+ command:
+ - ./bin/docker-entrypoint-beat.sh
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-app-vars
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }}
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+
+
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/live.deployment.yaml b/charts/plane-ce/templates/workloads/live.deployment.yaml
new file mode 100644
index 0000000..a86f263
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/live.deployment.yaml
@@ -0,0 +1,68 @@
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-live
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
+spec:
+ {{- if not .Values.live.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: live-3000
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-live-wl
+spec:
+ replicas: {{ .Values.live.replicas | default 1}}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-live
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-live
+ imagePullPolicy: {{ .Values.live.pullPolicy | default "Always" }}
+ image: {{ .Values.live.image | default "artifacts.plane.so/makeplane/plane-live" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.live.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.live.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.live.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.live.cpuLimit | default "500m" | quote}}
+ command:
+ - node
+ args:
+ - live/dist/server.js
+ 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
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
diff --git a/charts/plane-ce/templates/workloads/migrator.job.yaml b/charts/plane-ce/templates/workloads/migrator.job.yaml
new file mode 100644
index 0000000..3f0afff
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/migrator.job.yaml
@@ -0,0 +1,35 @@
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-api-migrate-{{ .Release.Revision }}
+spec:
+ backoffLimit: 3
+ template:
+ metadata:
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-api-migrate
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-api-migrate
+ image: {{ .Values.api.image | default "artifacts.plane.so/makeplane/plane-backend" }}:{{ .Values.planeVersion }}
+ command:
+ - ./bin/docker-entrypoint-migrator.sh
+ imagePullPolicy: {{ .Values.api.pullPolicy | default "Always" }}
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-app-vars
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }}
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+ restartPolicy: OnFailure
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+---
diff --git a/charts/plane-ce/templates/workloads/minio.stateful.yaml b/charts/plane-ce/templates/workloads/minio.stateful.yaml
new file mode 100644
index 0000000..a95b82c
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/minio.stateful.yaml
@@ -0,0 +1,118 @@
+{{- if .Values.minio.local_setup }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-minio
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
+spec:
+ {{- if not .Values.minio.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: minio-api-9000
+ port: 9000
+ protocol: TCP
+ targetPort: 9000
+ - name: minio-console-9090
+ port: 9090
+ protocol: TCP
+ targetPort: 9090
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-minio-wl
+spec:
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
+ serviceName: {{ .Release.Name }}-minio
+ template:
+ metadata:
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-minio
+ spec:
+ containers:
+ - image: {{ .Values.minio.image }}
+ imagePullPolicy: {{ .Values.minio.pullPolicy | default "IfNotPresent" }}
+ name: {{ .Release.Name }}-minio
+ stdin: true
+ tty: true
+ # command:
+ args:
+ - server
+ - /data
+ - --console-address
+ - :9090
+ envFrom:
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+ volumeMounts:
+ - mountPath: /data
+ name: pvc-{{ .Release.Name }}-minio-vol
+ subPath: ''
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+ volumeClaimTemplates:
+ - apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ creationTimestamp: null
+ namespace: {{ .Release.Namespace }}
+ name: pvc-{{ .Release.Name }}-minio-vol
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.minio.volumeSize | default "1Gi" | quote }}
+ storageClassName: {{ .Values.minio.storageClass }}
+ volumeMode: Filesystem
+
+---
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-minio-bucket-{{ .Release.Revision }}
+spec:
+ backoffLimit: 6
+ completionMode: NonIndexed
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ spec:
+ restartPolicy: OnFailure
+ initContainers:
+ - name: init
+ image: busybox
+ command: ['sh', '-c', "until nslookup {{ .Release.Name }}-minio.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}; do echo waiting for {{ .Release.Name }}-minio; sleep 2; done"]
+ containers:
+ - command:
+ - /bin/sh
+ args:
+ - '-c'
+ - >-
+ /usr/bin/mc config host add plane-app-minio
+ http://{{ .Release.Name }}-minio.{{ .Release.Namespace }}.svc.{{ .Values.env.default_cluster_domain | default "cluster.local" }}:9000 "$AWS_ACCESS_KEY_ID" "$AWS_SECRET_ACCESS_KEY";
+ /usr/bin/mc mb plane-app-minio/$AWS_S3_BUCKET_NAME;
+ /usr/bin/mc anonymous set download plane-app-minio/$AWS_S3_BUCKET_NAME; exit 0;
+ envFrom:
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+ image: {{ .Values.minio.image_mc }}
+ imagePullPolicy: {{ .Values.minio.pullPolicy }}
+ name: {{ .Release.Name }}-minio-bucket
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+ terminationGracePeriodSeconds: 120
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/postgres.stateful.yaml b/charts/plane-ce/templates/workloads/postgres.stateful.yaml
new file mode 100644
index 0000000..b2d7790
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/postgres.stateful.yaml
@@ -0,0 +1,72 @@
+{{- if .Values.postgres.local_setup }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-pgdb
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
+spec:
+ {{- if not .Values.postgres.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: pg-{{ .Values.postgres.servicePort }}
+ port: {{ .Values.postgres.servicePort }}
+ protocol: TCP
+ targetPort: 5432
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
+---
+
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-pgdb-wl
+spec:
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
+ serviceName: {{ .Release.Name }}-pgdb
+ template:
+ metadata:
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-pgdb
+ spec:
+ containers:
+ - image: {{ .Values.postgres.image }}
+ imagePullPolicy: {{ .Values.postgres.pullPolicy | default "IfNotPresent" }}
+ name: {{ .Release.Name }}-pgdb
+ stdin: true
+ tty: true
+ env:
+ - name: PGDATA
+ value: /var/lib/postgresql/data/plane
+ envFrom:
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.pgdb_existingSecret) }}{{ .Values.external_secrets.pgdb_existingSecret }}{{ else }}{{ .Release.Name }}-pgdb-secrets{{ end }}
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: pvc-{{ .Release.Name }}-pgdb-vol
+ subPath: ''
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+ volumeClaimTemplates:
+ - apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ creationTimestamp: null
+ namespace: {{ .Release.Namespace }}
+ name: pvc-{{ .Release.Name }}-pgdb-vol
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.postgres.volumeSize | default "1Gi" | quote }}
+ storageClassName: {{ .Values.postgres.storageClass }}
+ volumeMode: Filesystem
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/rabbitmq.stateful.yaml b/charts/plane-ce/templates/workloads/rabbitmq.stateful.yaml
new file mode 100644
index 0000000..1450b5f
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/rabbitmq.stateful.yaml
@@ -0,0 +1,73 @@
+{{- if .Values.rabbitmq.local_setup }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-rabbitmq
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
+spec:
+ {{- if not .Values.rabbitmq.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: rabbitmq-{{ .Values.rabbitmq.servicePort }}
+ port: {{ .Values.rabbitmq.servicePort }}
+ protocol: TCP
+ targetPort: 5672
+ - name: rabbitmq-mgmt-{{ .Values.rabbitmq.managementPort }}
+ port: {{ .Values.rabbitmq.managementPort }}
+ protocol: TCP
+ targetPort: 15672
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-rabbitmq-wl
+spec:
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
+ serviceName: {{ .Release.Name }}-rabbitmq
+ template:
+ metadata:
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-rabbitmq
+ spec:
+ containers:
+ - image: {{ .Values.rabbitmq.image }}
+ imagePullPolicy: {{ .Values.rabbitmq.pullPolicy | default "IfNotPresent" | quote }}
+ name: {{ .Release.Name }}-rabbitmq
+ stdin: true
+ tty: true
+ envFrom:
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.rabbitmq_existingSecret) }}{{ .Values.external_secrets.rabbitmq_existingSecret }}{{ else }}{{ .Release.Name }}-rabbitmq-secrets{{ end }}
+ optional: false
+ volumeMounts:
+ - mountPath: /var/lib/rabbitmq
+ name: pvc-{{ .Release.Name }}-rabbitmq-vol
+ subPath: ''
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+ volumeClaimTemplates:
+ - apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ creationTimestamp: null
+ namespace: {{ .Release.Namespace }}
+ name: pvc-{{ .Release.Name }}-rabbitmq-vol
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.rabbitmq.volumeSize | default "100Mi" | quote }}
+ storageClassName: {{ .Values.rabbitmq.storageClass }}
+ volumeMode: Filesystem
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/redis.stateful.yaml b/charts/plane-ce/templates/workloads/redis.stateful.yaml
new file mode 100644
index 0000000..c242bc5
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/redis.stateful.yaml
@@ -0,0 +1,68 @@
+{{- if .Values.redis.local_setup }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-redis
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
+spec:
+ {{- if not .Values.redis.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: redis-{{ .Values.redis.servicePort }}
+ port: {{ .Values.redis.servicePort }}
+ protocol: TCP
+ targetPort: 6379
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
+---
+
+# REDIS WORKLOAD
+
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-redis-wl
+spec:
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
+ serviceName: {{ .Release.Name }}-redis
+ template:
+ metadata:
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-redis
+ spec:
+ containers:
+ - image: {{ .Values.redis.image }}
+ imagePullPolicy: {{ .Values.redis.pullPolicy | default "IfNotPresent" }}
+ name: {{ .Release.Name }}-redis
+ stdin: true
+ tty: true
+ volumeMounts:
+ - mountPath: /data
+ name: pvc-{{ .Release.Name }}-redis-vol
+ subPath: ''
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+ volumeClaimTemplates:
+ - apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ creationTimestamp: null
+ namespace: {{ .Release.Namespace }}
+ name: pvc-{{ .Release.Name }}-redis-vol
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.redis.volumeSize | default "100Mi" | quote }}
+ storageClassName: {{ .Values.redis.storageClass }}
+ volumeMode: Filesystem
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/space.deployment.yaml b/charts/plane-ce/templates/workloads/space.deployment.yaml
new file mode 100644
index 0000000..4f5bc21
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/space.deployment.yaml
@@ -0,0 +1,62 @@
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-space
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
+spec:
+ {{- if not .Values.space.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: space-3000
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-space-wl
+spec:
+ replicas: {{ .Values.space.replicas | default 1 }}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-space
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-space
+ imagePullPolicy: {{ .Values.space.pullPolicy | default "Always" }}
+ image: {{ .Values.space.image | default "artifacts.plane.so/makeplane/plane-space" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.space.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.space.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.space.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.space.cpuLimit | default "500m" | quote}}
+ command:
+ - node
+ args:
+ - space/server.js
+ - space
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/web.deployment.yaml b/charts/plane-ce/templates/workloads/web.deployment.yaml
new file mode 100644
index 0000000..1b302ea
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/web.deployment.yaml
@@ -0,0 +1,62 @@
+
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-web
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-web
+spec:
+ {{- if not .Values.web.assign_cluster_ip }}
+ clusterIP: None
+ {{- end }}
+ ports:
+ - name: web-3000
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ selector:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-web
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-web-wl
+spec:
+ replicas: {{ .Values.web.replicas | default 1 }}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-web
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-web
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-web
+ imagePullPolicy: {{ .Values.web.pullPolicy | default "Always" }}
+ image: {{ .Values.web.image | default "artifacts.plane.so/makeplane/plane-frontend" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.web.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.web.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.web.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.web.cpuLimit | default "500m" | quote}}
+ command:
+ - node
+ args:
+ - web/server.js
+ - web
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/templates/workloads/worker.deployment.yaml b/charts/plane-ce/templates/workloads/worker.deployment.yaml
new file mode 100644
index 0000000..5d46201
--- /dev/null
+++ b/charts/plane-ce/templates/workloads/worker.deployment.yaml
@@ -0,0 +1,48 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ .Release.Namespace }}
+ name: {{ .Release.Name }}-worker-wl
+spec:
+ replicas: {{ .Values.worker.replicas | default 1 }}
+ selector:
+ matchLabels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-worker
+ template:
+ metadata:
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app.name: {{ .Release.Namespace }}-{{ .Release.Name }}-worker
+ annotations:
+ timestamp: {{ now | quote }}
+ spec:
+ containers:
+ - name: {{ .Release.Name }}-worker
+ imagePullPolicy: {{ .Values.worker.pullPolicy | default "Always" }}
+ image: {{ .Values.worker.image | default "artifacts.plane.so/makeplane/plane-backend" }}:{{ .Values.planeVersion }}
+ stdin: true
+ tty: true
+ resources:
+ requests:
+ memory: {{ .Values.worker.memoryRequest | default "50Mi" | quote }}
+ cpu: {{ .Values.worker.cpuRequest | default "50m" | quote }}
+ limits:
+ memory: {{ .Values.worker.memoryLimit | default "1000Mi" | quote }}
+ cpu: {{ .Values.worker.cpuLimit | default "500m" | quote}}
+ command:
+ - ./bin/docker-entrypoint-worker.sh
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-app-vars
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.app_env_existingSecret) }}{{ .Values.external_secrets.app_env_existingSecret }}{{ else }}{{ .Release.Name }}-app-secrets{{ end }}
+ optional: false
+ - secretRef:
+ name: {{ if not (empty .Values.external_secrets.doc_store_existingSecret) }}{{ .Values.external_secrets.doc_store_existingSecret }}{{ else }}{{ .Release.Name }}-doc-store-secrets{{ end }}
+ optional: false
+
+ serviceAccount: {{ .Release.Name }}-srv-account
+ serviceAccountName: {{ .Release.Name }}-srv-account
+
+---
\ No newline at end of file
diff --git a/charts/plane-ce/values.yaml b/charts/plane-ce/values.yaml
new file mode 100644
index 0000000..b35bc8a
--- /dev/null
+++ b/charts/plane-ce/values.yaml
@@ -0,0 +1,182 @@
+planeVersion: stable
+
+dockerRegistry:
+ enabled: false
+ host: "index.docker.io/v1/"
+ loginid: ""
+ password: ""
+
+ingress:
+ enabled: true
+ appHost: "plane.example.com"
+ minioHost: ""
+ rabbitmqHost: ""
+ ingressClass: "nginx"
+ ingress_annotations: {"nginx.ingress.kubernetes.io/proxy-body-size": "5m"}
+
+# SSL Configuration - Valid only if ingress.enabled is true
+ssl:
+ tls_secret_name: "" # If you have a custom TLS secret name
+ # If you want to use Let's Encrypt, set createIssuer and generateCerts to true
+ createIssuer: false
+ issuer: "http" # Allowed : cloudflare, digitalocean, http
+ token: "" # not required for http
+ server: https://acme-v02.api.letsencrypt.org/directory
+ email: plane@example.com
+ generateCerts: false
+
+redis:
+ local_setup: true
+ image: valkey/valkey:7.2.5-alpine
+ servicePort: 6379
+ storageClass: ""
+ volumeSize: 100Mi
+ pullPolicy: IfNotPresent
+ assign_cluster_ip: false
+
+postgres:
+ local_setup: true
+ image: postgres:15.7-alpine
+ servicePort: 5432
+ storageClass: ""
+ volumeSize: 1Gi
+ pullPolicy: IfNotPresent
+ assign_cluster_ip: false
+
+rabbitmq:
+ local_setup: true
+ image: rabbitmq:3.13.6-management-alpine
+ pullPolicy: IfNotPresent
+ servicePort: 5672
+ managementPort: 15672
+ storageClass: ""
+ volumeSize: 100Mi
+ default_user: plane
+ default_password: plane
+ external_rabbitmq_url: ''
+ assign_cluster_ip: false
+
+minio:
+ image: minio/minio:latest
+ image_mc: minio/mc:latest
+ local_setup: true
+ pullPolicy: IfNotPresent
+ root_password: password
+ root_user: admin
+ storageClass: ""
+ volumeSize: 1Gi
+ assign_cluster_ip: false
+ env:
+ minio_endpoint_ssl: false
+
+web:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-frontend
+ pullPolicy: Always
+ assign_cluster_ip: false
+
+space:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-space
+ pullPolicy: Always
+ assign_cluster_ip: false
+
+admin:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-admin
+ pullPolicy: Always
+ assign_cluster_ip: false
+
+live:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-live
+ pullPolicy: Always
+ assign_cluster_ip: false
+
+api:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-backend
+ pullPolicy: Always
+ assign_cluster_ip: false
+
+worker:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-backend
+ pullPolicy: Always
+
+beatworker:
+ replicas: 1
+ memoryLimit: 1000Mi
+ cpuLimit: 500m
+ cpuRequest: 50m
+ memoryRequest: 50Mi
+ image: artifacts.plane.so/makeplane/plane-backend
+ pullPolicy: Always
+
+external_secrets:
+ # Name of the existing Kubernetes Secret resource; see README for more details
+ rabbitmq_existingSecret: ''
+ pgdb_existingSecret: ''
+ doc_store_existingSecret: ''
+ app_env_existingSecret: ''
+ live_env_existingSecret: ''
+
+env:
+
+ # NEXT_PUBLIC_DEPLOY_URL: ""
+ # REDIS
+ remote_redis_url: "" #INCASE OF REMOTE REDIS ONLY
+
+ # POSTGRES DB VALUES
+ pgdb_username: plane
+ pgdb_password: plane
+ pgdb_name: plane
+ pgdb_remote_url: "" #INCASE OF REMOTE PG DB URL ONLY
+
+ # DATA STORE
+ docstore_bucket: "uploads"
+ doc_upload_size_limit: "5242880" # 5MB
+
+ # REQUIRED IF MINIO LOCAL SETUP IS FALSE
+ aws_access_key: ""
+ aws_secret_access_key: ""
+ aws_region: ""
+ aws_s3_endpoint_url: ""
+
+ secret_key: "60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5"
+
+ sentry_dsn: ""
+ sentry_environment: ""
+
+ cors_allowed_origins: ""
+ default_cluster_domain: cluster.local
+
+ live_sentry_dsn: ""
+ live_sentry_environment: ""
+ live_sentry_traces_sample_rate: ""
+
+ api_key_rate_limit: "60/minute"
diff --git a/manifests/plane/cname.yaml b/manifests/plane/cname.yaml
new file mode 100644
index 0000000..0822dae
--- /dev/null
+++ b/manifests/plane/cname.yaml
@@ -0,0 +1,2 @@
+enabled: true
+hostname: plane.dvirlabs.com
\ No newline at end of file
diff --git a/manifests/plane/monitoring.yaml b/manifests/plane/monitoring.yaml
new file mode 100644
index 0000000..e0eaf11
--- /dev/null
+++ b/manifests/plane/monitoring.yaml
@@ -0,0 +1,20 @@
+enabled: true
+app: plane
+
+# Prometheus usage:
+# targets:
+# - plane-app.plane-ce.svc.cluster.local:80
+# scheme: http
+
+# External HTTP check:
+external_check:
+ url: https://plane.dvirlabs.com
+ expected_codes:
+ "502": critical
+ "404": warning
+ "1033": critical
+
+uptime_kuma:
+ enabled: true
+ url: https://plane.dvirlabs.com
+ tag: dev-tools
diff --git a/manifests/plane/values.yaml b/manifests/plane/values.yaml
new file mode 100644
index 0000000..244fa6b
--- /dev/null
+++ b/manifests/plane/values.yaml
@@ -0,0 +1,27 @@
+planeVersion: stable
+
+ingress:
+ ingressClass: traefik
+ appHost: plane.dvirlabs.com
+
+postgres:
+ storageClass: nfs-client
+ volumeSize: 20Gi
+
+redis:
+ storageClass: nfs-client
+ volumeSize: 1Gi
+
+rabbitmq:
+ storageClass: nfs-client
+ volumeSize: 500Mi
+
+minio:
+ storageClass: nfs-client
+ volumeSize: 10Gi
+
+env:
+ pgdb_username: plane
+ pgdb_password: plane
+ pgdb_name: plane
+ docstore_bucket: uploads