Skip to content

Conversation

@danciaclara
Copy link
Collaborator

@danciaclara danciaclara commented Feb 2, 2026

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • Feature (non-breaking change which adds functionality)
  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring
  • Performance improvements
  • Documentation update

Screenshots and Media (if applicable)

Test Scenarios

References

Summary by CodeRabbit

  • Documentation
    • Added Docker Compose deployment guide for self-hosted Plane instances, including prerequisites and step-by-step setup instructions
    • Added comprehensive Kubernetes/Helm deployment guide for production self-hosted deployments with detailed environment configuration and ingress setup

@vercel
Copy link

vercel bot commented Feb 2, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
developer-docs Ready Ready Preview, Comment Feb 2, 2026 5:08pm

Request Review

@coderabbitai
Copy link

coderabbitai bot commented Feb 2, 2026

📝 Walkthrough

Walkthrough

Two new self-hosting deployment documentation files are added: a Docker Compose guide covering prerequisites and installation steps, and a comprehensive Kubernetes Helm chart guide with detailed configuration, environment variables, and component deployment instructions for enterprise deployments.

Changes

Cohort / File(s) Summary
Self-Hosting Deployment Documentation
docs/self-hosting/methods/install-methods-commercial/docker-compose.md, docs/self-hosting/methods/install-methods-commercial/kubernetes.md
Added Docker Compose deployment guide (45 lines) with prerequisites and installation flow, and Kubernetes Helm chart deployment guide (568 lines) covering prerequisites, environment setup, advanced configuration, multiple service components, ingress/SSL, and enterprise considerations.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Two guides hop onto the stage so bright,
Docker Compose and Kubernetes in sight,
With Helm charts dancing and configs aligned,
Self-hosting magic—deployment refined!
Our servers now soar where instructions shine,
Ready to serve at your scale divine ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Title check ⚠️ Warning The PR title 'Added pages for Prime portal' is vague and does not accurately reflect the actual changes. The PR adds two detailed deployment documentation files for Docker Compose and Kubernetes self-hosting methods, not 'Prime portal' pages. Update the title to reflect the actual content, such as 'Add Docker Compose and Kubernetes deployment guides for self-hosted Plane' or similar, which accurately describes the documentation being added.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch prime-portal-pages

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 Fix all issues with AI agents
In `@docs/self-hosting/methods/install-methods-commercial/docker-compose.md`:
- Around line 33-35: Update the fenced code block that contains the curl command
"curl -fsSL https://prime.plane.so/install/ | sh -" to include a language
identifier by changing the opening fence from ``` to ```bash so markdownlint
passes and syntax highlighting is enabled.

In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md`:
- Line 20: Fix the duplicated word in the sentence shown in the diff: replace
"Ensure you use use the latest Helm chart version." with "Ensure you use the
latest Helm chart version." so the duplicated "use" is removed; locate the exact
phrase "Ensure you use use the latest Helm chart version." in the Kubernetes
install docs and update it to the corrected wording.
- Around line 110-116: The "License" section uses an H4 heading (#### License)
which causes a heading-level jump; change it to an H3 (### License) so it
follows the previous H2/H3 hierarchy consistently, and ensure the surrounding
heading levels remain sequential (adjust any neighboring headings if needed) so
the table under the "License" heading stays nested correctly.
- Line 410: The table row for env.email_service_envs.smtp_domain has too many
cells causing an extra empty columns; edit the Markdown table row containing
"env.email_service_envs.smtp_domain" so it has exactly 4 pipe-separated columns
(e.g., Parameter | Type | Required | Description) by removing the trailing empty
pipe cells and ensuring the description ("The SMTP Domain to be used with email
service") occupies the fourth column; verify the header matches 4 columns and
adjust any neighboring rows if needed.
- Line 567: The ingress table row for "plane-mq.example.com | `/` |
`<http://plane-app-rabbitmq.plane:15672>` | (Optional) if using local setup,
this will enable management console access" has an extra column; remove the
fourth column and either append the optional note to the Service column (the
cell containing `<http://plane-app-rabbitmq.plane:15672>`) or place that
optional sentence in a separate paragraph immediately after the table so the
table only includes Host, Path, and Service columns and the note remains
visible.
- Line 157: The table entry for services.redis.nodeSelector currently shows a
default of "0" but should be an empty map "{}"; update the documentation row for
services.redis.nodeSelector to use {} as the default value (matching other
nodeSelector fields and the Kubernetes map type) and verify consistency across
the same configuration table so all nodeSelector defaults use {} rather than
numeric zeros.
- Around line 138-143: The table has a duplicated services.postgres.nodeSelector
row and several swapped/mismatched descriptions; remove the duplicate
nodeSelector entry and correct the descriptions so:
services.postgres.assign_cluster_ip -> "Set it to `true` if you want to assign
`ClusterIP` to the service", services.postgres.nodeSelector -> "This key allows
you to set the node selector for the stateful deployment of postgres. Useful to
run the deployment on specific nodes", services.postgres.labels -> "This key
allows you to set custom labels for the stateful deployment of postgres. Useful
for organizing and selecting resources", and keep services.postgres.tolerations
and services.postgres.affinity as their current descriptions.
🧹 Nitpick comments (1)
docs/self-hosting/methods/install-methods-commercial/kubernetes.md (1)

26-33: Consider simpler placeholders instead of env vars in the quickstart.

Docs in this repo have leaned toward inline placeholder values for readability. You could replace the env-var setup with placeholders in the helm command (or provide both).

Based on learnings: “In documentation files for makeplane/developer-docs, the maintainers prefer to keep code examples simple with placeholder values (like hardcoded credentials) rather than using environment variables or complex setup, as it makes the documentation more readable and easier to understand for users learning the API.”

Comment on lines +33 to +35
```
curl -fsSL https://prime.plane.so/install/ | sh -
```
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add a language identifier to the fenced code block.

This keeps markdownlint happy and improves syntax highlighting.

Suggested fix
-      ```
+      ```bash
       curl -fsSL https://prime.plane.so/install/ | sh -
       ```
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 33-33: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/docker-compose.md`
around lines 33 - 35, Update the fenced code block that contains the curl
command "curl -fsSL https://prime.plane.so/install/ | sh -" to include a
language identifier by changing the opening fence from ``` to ```bash so
markdownlint passes and syntax highlighting is enabled.

- `kubectl` and `helm` on the client system that you will use to install our Helm charts

::: info
Ensure you use use the latest Helm chart version.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix the duplicated word.

“use use” should be “use”.

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` at line
20, Fix the duplicated word in the sentence shown in the diff: replace "Ensure
you use use the latest Helm chart version." with "Ensure you use the latest Helm
chart version." so the duplicated "use" is removed; locate the exact phrase
"Ensure you use use the latest Helm chart version." in the Kubernetes install
docs and update it to the corrected wording.

Comment on lines +110 to +116
#### License

| Setting | Default | Required | Description |
|---|:---:|:---:|---|
| planeVersion | v2.2.1 | Yes | Specifies the version of Plane to be deployed. Copy this from `prime.plane.so.` |
| license.licenseDomain | 'plane.example.com' | Yes | The fully-qualified domain name (FQDN) in the format `sudomain.domain.tld` or `domain.tld` that the license is bound to. It is also attached to your `ingress` host to access Plane. |

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Heading level jumps from H2 to H4.

Use ### for “License” to keep the hierarchy consistent.

Suggested fix
-#### License
+### License
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 110-110: Heading levels should only increment by one level at a time
Expected: h3; Actual: h4

(MD001, heading-increment)

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` around
lines 110 - 116, The "License" section uses an H4 heading (#### License) which
causes a heading-level jump; change it to an H3 (### License) so it follows the
previous H2/H3 hierarchy consistently, and ensure the surrounding heading levels
remain sequential (adjust any neighboring headings if needed) so the table under
the "License" heading stays nested correctly.

Comment on lines +138 to +143
| services.postgres.assign_cluster_ip | false | | This key allows you to set the node selector for the stateful deployment of postgres. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster.|
| services.postgres.nodeSelector | {} | | Set it to `true` if you want to assign `ClusterIP` to the service |
| services.postgres.tolerations | [] | | This key allows you to set the tolerations for the stateful deployment of postgres. This is useful when you want to run the deployment on nodes with specific taints in your Kubernetes cluster.|
| services.postgres.affinity | {} | | This key allows you to set the affinity rules for the stateful deployment of postgres. This is useful when you want to control how pods are scheduled on nodes in your Kubernetes cluster. |
| services.postgres.labels | {} | | Set it to `true` if you want to assign `ClusterIP` to the service |
| services.postgres.nodeSelector | {} | | This key allows you to set custom labels for the stateful deployment of postgres. This is useful for organizing and selecting resources in your Kubernetes cluster.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cd /tmp && find . -name "kubernetes.md" -type f 2>/dev/null | head -5

Repository: makeplane/developer-docs

Length of output: 50


🏁 Script executed:

git ls-files | grep -i kubernetes | head -20

Repository: makeplane/developer-docs

Length of output: 279


🏁 Script executed:

git ls-files | grep -E "(values|helm)" | head -20

Repository: makeplane/developer-docs

Length of output: 301


🏁 Script executed:

cat -n docs/self-hosting/methods/install-methods-commercial/kubernetes.md | sed -n '130,150p'

Repository: makeplane/developer-docs

Length of output: 3624


🏁 Script executed:

# Search for any Helm values files that might contain the correct postgres configuration
find . -name "values.yaml" -o -name "values*.yaml" | grep -v node_modules | head -20

Repository: makeplane/developer-docs

Length of output: 50


Fix duplicate services.postgres.nodeSelector key and mismatched descriptions in postgres configuration table.

Lines 138–143 contain a duplicated services.postgres.nodeSelector key (lines 139 and 143) and the descriptions for assign_cluster_ip, nodeSelector, and labels are incorrectly swapped. This will mislead operators configuring the Helm chart.

Suggested fix
-| services.postgres.assign_cluster_ip | false |  | This key allows you to set the node selector for the stateful deployment of postgres. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster.|
-| services.postgres.nodeSelector | {} |  | Set it to `true` if you want to assign `ClusterIP` to the service |
+| services.postgres.assign_cluster_ip | false |  | Set it to `true` if you want to assign `ClusterIP` to the service |
+| services.postgres.nodeSelector | {} |  | This key allows you to set the node selector for the stateful deployment of postgres. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
 ...
-| services.postgres.labels | {} |  | Set it to `true` if you want to assign `ClusterIP` to the service |
-| services.postgres.nodeSelector | {} |  | This key allows you to set custom labels for the stateful deployment of postgres. This is useful for organizing and selecting resources in your Kubernetes cluster.
+| services.postgres.labels | {} |  | This key allows you to set custom labels for the stateful deployment of postgres. This is useful for organizing and selecting resources in your Kubernetes cluster. |
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 143-143: Table pipe style
Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe

(MD055, table-pipe-style)

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` around
lines 138 - 143, The table has a duplicated services.postgres.nodeSelector row
and several swapped/mismatched descriptions; remove the duplicate nodeSelector
entry and correct the descriptions so: services.postgres.assign_cluster_ip ->
"Set it to `true` if you want to assign `ClusterIP` to the service",
services.postgres.nodeSelector -> "This key allows you to set the node selector
for the stateful deployment of postgres. Useful to run the deployment on
specific nodes", services.postgres.labels -> "This key allows you to set custom
labels for the stateful deployment of postgres. Useful for organizing and
selecting resources", and keep services.postgres.tolerations and
services.postgres.affinity as their current descriptions.

| services.redis.servicePort | 6379 | | This key sets the default port number to be used while setting up stateful deployment of `redis`. |
| services.redis.volumeSize | 500Mi | | 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) |
| services.redis.assign_cluster_ip | false | | Set it to `true` if you want to assign `ClusterIP` to the service |
| services.redis.nodeSelector | 0 | | This key allows you to set the node selector for the stateful deployment of redis. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

find . -name "values.yaml" -o -name "values.yml" | head -20

Repository: makeplane/developer-docs

Length of output: 50


🏁 Script executed:

rg "services\.redis" . --context 5

Repository: makeplane/developer-docs

Length of output: 10427


🏁 Script executed:

rg -i "helm|chart|github\.com|plane" docs/self-hosting/methods/install-methods-commercial/kubernetes.md -B 5 -A 5

Repository: makeplane/developer-docs

Length of output: 42814


Fix services.redis.nodeSelector default from 0 to {}.

The value is listed as 0 but should be {} to match all other nodeSelector fields in the configuration table and align with Kubernetes conventions (nodeSelector is a map type, not an integer).

Suggested fix
-| services.redis.nodeSelector | 0 |  | This key allows you to set the node selector for the stateful deployment of redis. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
+| services.redis.nodeSelector | {} |  | This key allows you to set the node selector for the stateful deployment of redis. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| services.redis.nodeSelector | 0 | | This key allows you to set the node selector for the stateful deployment of redis. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
| services.redis.nodeSelector | {} | | This key allows you to set the node selector for the stateful deployment of redis. This is useful when you want to run the deployment on specific nodes in your Kubernetes cluster. |
🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` at line
157, The table entry for services.redis.nodeSelector currently shows a default
of "0" but should be an empty map "{}"; update the documentation row for
services.redis.nodeSelector to use {} as the default value (matching other
nodeSelector fields and the Kubernetes map type) and verify consistency across
the same configuration table so all nodeSelector defaults use {} rather than
numeric zeros.

| services.email_service.affinity | {} | | This key allows you to set the affinity rules for the deployment of `email_service`. This is useful when you want to control how pods are scheduled on nodes in your Kubernetes cluster. |
| services.email_service.labels | {} | | Custom labels to add to the email service deployment |
| services.email_service.annotations | {} | | Custom annotations to add to the email service deployment |
| env.email_service_envs.smtp_domain | | Yes | The SMTP Domain to be used with email service | | | |
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix table column count in the email service row.

There are extra cells at the end of the row; keep it to 4 columns.

Suggested fix
-| env.email_service_envs.smtp_domain | | Yes | The SMTP Domain to be used with email service |                                         |          |                                                          |
+| env.email_service_envs.smtp_domain |  | Yes | The SMTP Domain to be used with email service |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| env.email_service_envs.smtp_domain | | Yes | The SMTP Domain to be used with email service | | | |
| env.email_service_envs.smtp_domain | | Yes | The SMTP Domain to be used with email service |
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 410-410: Table column count
Expected: 4; Actual: 7; Too many cells, extra data will be missing

(MD056, table-column-count)

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` at line
410, The table row for env.email_service_envs.smtp_domain has too many cells
causing an extra empty columns; edit the Markdown table row containing
"env.email_service_envs.smtp_domain" so it has exactly 4 pipe-separated columns
(e.g., Parameter | Type | Required | Description) by removing the trailing empty
pipe cells and ensuring the description ("The SMTP Domain to be used with email
service") occupies the fourth column; verify the header matches 4 columns and
adjust any neighboring rows if needed.

| plane.example.com | `/auth/*` | `<http://plane-app-api.plane:8000>` |
| plane.example.com | `/uploads/*` | `<http://plane-app-minio.plane:9000>` |
| plane-minio.example.com | `/` | `<http://plane-app-minio.plane:9090>` |
| plane-mq.example.com | `/` | `<http://plane-app-rabbitmq.plane:15672>` | (Optional) if using local setup, this will enable management console access |
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Ingress routes table has an extra column.

Move the optional note into the Service column or a separate paragraph.

Suggested fix
-| plane-mq.example.com | `/` | `<http://plane-app-rabbitmq.plane:15672>` | (Optional) if using local setup, this will enable management console access |
+| plane-mq.example.com | `/` | `<http://plane-app-rabbitmq.plane:15672>` (Optional: enables management console access for local setup) |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| plane-mq.example.com | `/` | `<http://plane-app-rabbitmq.plane:15672>` | (Optional) if using local setup, this will enable management console access |
| plane-mq.example.com | `/` | `<http://plane-app-rabbitmq.plane:15672>` (Optional: enables management console access for local setup) |
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 567-567: Table column count
Expected: 3; Actual: 4; Too many cells, extra data will be missing

(MD056, table-column-count)

🤖 Prompt for AI Agents
In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` at line
567, The ingress table row for "plane-mq.example.com | `/` |
`<http://plane-app-rabbitmq.plane:15672>` | (Optional) if using local setup,
this will enable management console access" has an extra column; remove the
fourth column and either append the optional note to the Service column (the
cell containing `<http://plane-app-rabbitmq.plane:15672>`) or place that
optional sentence in a separate paragraph immediately after the table so the
table only includes Host, Path, and Service columns and the note remains
visible.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants