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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion mint.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,14 @@
"self-hosting/methods/kubernetes",
"self-hosting/methods/coolify",
"self-hosting/methods/portainer",
"self-hosting/methods/airgapped-edition",
{
"group": "Airgapped Edition",
"pages": [
"self-hosting/methods/airgapped-edition",
"self-hosting/methods/airgapped-edition-kubernetes"
]
},

"self-hosting/methods/podman-quadlets"
]
},
Expand Down
197 changes: 197 additions & 0 deletions self-hosting/methods/airgapped-edition-kubernetes.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
---
title: Deploy Plane Commercial in an Airgapped Kubernetes Environment
sidebarTitle: For Kubernetes
---

This guide walks you through installing Plane Enterprise in a Kubernetes cluster without internet access. You'll use Helm charts and pre-packaged Docker images to deploy a fully functional Plane instance.

## What you'll need

Before starting, ensure you have:

- Helm 3.x installed
- kubectl with access to your target Kubernetes cluster

## Install Plane

1. Get the Plane Enterprise Helm chart from the official release:

```bash
# Using wget
wget https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.4.1/plane-enterprise-1.4.1.tgz

# Using curl
curl -L -O https://github.com/makeplane/helm-charts/releases/download/plane-enterprise-1.4.1/plane-enterprise-1.4.1.tgz
```
Comment on lines +21 to +25
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Hardcoded chart version — verify recency and consider bundling chart for fully air-gapped installs.

  • Confirm 1.4.1 is the latest chart.
  • For fully air-gapped workflows, consider shipping this .tgz inside the offline bundle to avoid requiring internet even on the jump host.

🌐 Web query:

Is plane-enterprise Helm chart v1.4.1 the latest release as of September 9, 2025?

💡 Result:

No. I couldn't find a plane-enterprise v1.4.1 as the latest — the makeplane/helm-charts releases show plane-enterprise up to v1.1.2, and the official Plane Helm repo/docs point to the chart at helm.plane.so (use helm repo update + helm search repo plane/plane-enterprise to confirm locally). [1][2]

Sources:

  • makeplane/helm-charts releases (plane-enterprise tags). [1]
  • Plane Helm repo / Kubernetes install docs (helm.plane.so). [2]

Update hardcoded chart version and bundle for air-gapped installs
Replace plane-enterprise-1.4.1.tgz with the actual latest chart (as of Sep 9, 2025 it’s v1.1.2—verify via helm repo update && helm search repo plane/plane-enterprise), and include that .tgz in your offline bundle so no internet access is required on the jump host.

🤖 Prompt for AI Agents
In self-hosting/methods/airgapped-edition-kubernetes.mdx around lines 21 to 25,
the docs hardcode a specific chart file name (plane-enterprise-1.4.1.tgz);
update the reference to the current chart version (verify latest with helm repo
update && helm search repo plane/plane-enterprise) and replace the hardcoded
filename with the verified latest filename (e.g., plane-enterprise-v1.1.2.tgz if
confirmed), and update the instructions to state that the matching .tgz must be
included in the offline bundle on the jump host so no internet access is
required during installation.


2. Contact [**sales@plane.so**](mailto:sales@plane.so) to get your installation download URL and license file.

2. On a machine with internet access, download the installation package:

```bash
curl -LO <asset-download-url>
```

The download may take 15 minutes. Once complete, you no longer need internet access.

3. Transfer the `airgapped-{arch}.tar.gz` file to your air-gapped machine.

4. Extract the package on your air-gapped machine:

```bash
mkdir -p airgapped
tar -xvzf airgapped-amd64.tar.gz -C airgapped
cd airgapped
```

You'll find these Docker image .tar files for your airgapped installation in this folder.

- `admin-commercial-<version>.tar` - Admin service image
- `backend-commercial-<version>.tar` - API/worker/beat-worker/migrator service image
- `email-commercial-<version>.tar` - Email service image
- `live-commercial-<version>.tar` - Live service image
- `monitor-commercial-<version>.tar` - Monitor service image
- `proxy-commercial-<version>.tar` - Plane-proxy service image
- `silo-commercial-<version>.tar` - Silo service image
- `space-commercial-<version>.tar` - Space service image
- `web-commercial-<version>.tar` - Web service image
- `minio-latest.tar` - Plane-minio service image
- `postgres-15.7-alpine.tar` - Plane-db service image
- `rabbitmq-3.13.6-management-alpine.tar` - Plane-mq service image
- `valkey-7.2.5-alpine.tar` - Plane-redis service image

<Note>
For this installation, you can ignore the extra files in this folder (e.g., `docker-compose.yml`, `install.sh`, `plane.env`, etc.).
</Note>

5. Load the images into your local Docker registry or private registry:

```bash
# Load each image into Docker
docker load -i <plane-images>.tar

# Tag and push each image to your private registry
docker tag <image-name> <your-registry>/<image-name>
docker push <your-registry>/<image-name>
```

6. Create Custom Values File

```bash
# Extract the Helm chart to access the values file
helm show values plane-enterprise-1.4.1.tgz > custom-values.yaml
```

7. Edit the `custom-values.yaml` file to point to your local/private registry images and configure important settings:

```yaml
# Example of image updates in custom-values.yaml
license:
licenseDomain: 'plane.example.com'

airgapped:
enabled: true
# if using Custom Root CA for S3 storage
s3SecretName: "s3-custom-ca"
s3SecretKey: "s3-custom-ca.crt"

services:
web:
image: <your-registry.com>/web-commercial:<PLANE_VERSION>

api:
image: <your-registry.com>/backend-commercial:<PLANE_VERSION>

space:
image: <your-registry.com>/space-commercial:<PLANE_VERSION>

admin:
image: <your-registry.com>/admin-commercial:<PLANE_VERSION>

live:
image: <your-registry.com>/live-commercial:<PLANE_VERSION>

monitor:
image: <your-registry.com>/monitor-commercial:<PLANE_VERSION>

silo:
image: <your-registry.com>/silo-commercial:<PLANE_VERSION>

iframely:
image: <your-registry.com>/iframely:v1.2.0

# Database and infrastructure images
redis:
image: <your-registry.com>/valkey:7.2.5-alpine

postgres:
image: <your-registry.com>/postgres:15.7-alpine

rabbitmq:
image: <your-registry.com>/rabbitmq:3.13.6-management-alpine

minio:
image: <your-registry.com>/minio:latest
image_mc: <your-registry.com>/mc:latest

env:
storageClass: ''
```

8. Install Plane Commercial Airgapped edition using your customized values file:

```bash
helm install plane-app plane-enterprise-1.4.1.tgz \
--create-namespace \
--namespace plane \
-f custom-values.yaml \
--timeout 10m \
--wait \
--wait-for-jobs
```

## Verify installation

Check that all components are running properly:

```bash
# Check all pods
kubectl get pods -n plane

# Check services
kubectl get services -n plane

# Check ingress
kubectl get ingress -n plane

# Check persistent volumes
kubectl get pv,pvc -n plane

# Get the ingress URL
kubectl get ingress -n plane -o wide
```

## Additional configuration

For more advanced Plane configuration options, refer to the [Kubernetes documentation](https://developers.plane.so/self-hosting/methods/kubernetes#configuration-settings).


## Activate your license

Once your air-gapped installation is running, you'll need to activate your workspace with the provided license file.
<Note>
You should have received the `license_key.json` file as part of your air-gapped package. If you don't have this file, contact our support team.
</Note>

1. Go to your [Workspace Settings](https://docs.plane.so/core-concepts/workspaces/overview#workspace-settings) in the Plane application.
2. Select **Billing and plans** on the right pane.
3. Click the **Activate this workspace** button.
![Upload license file](/images/activate-license/upload-airgapped-license-file.webp)
4. Upload the license file `license_key.json` to activate your workspace.

You now have Plane running in your air-gapped environment. If you run into any issues, check the logs using the commands above, or reach out to our support team for assistance.

<Tip>
*Optional*
Once everything is working, you can safely delete the `airgapped` folder that contains the installation script and image files to free up space.
</Tip>
4 changes: 2 additions & 2 deletions self-hosting/methods/airgapped-edition.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Deploy Plane Commercial Airgapped Edition
sidebarTitle: Airgapped Edition
title: Deploy Plane Commercial in an Airgapped Docker Environment
sidebarTitle: For Docker
---

This guide walks you through setting up the Commercial Airgapped Edition in an offline environment using our pre-packaged installation bundle.
Expand Down
16 changes: 12 additions & 4 deletions self-hosting/methods/kubernetes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Ensure you're using use **Helm chart v1.3.0**.
1. Open terminal or any other command-line app that has access to Kubernetes tools on your local system.
2. Set the following environment variables:
```bash
PLANE_VERSION=v1.13.0
PLANE_VERSION=v1.14.1
```
```bash
DOMAIN_NAME=<subdomain.domain.tld or domain.tld>
Expand Down Expand Up @@ -83,7 +83,7 @@ Ensure you're using use **Helm chart v1.3.0**.
```

Make sure you set the required environment variables listed below:
- `planeVersion: v1.13.0`
- `planeVersion: v1.14.1`
- `license.licenseDomain: <The domain you have specified to host Plane>`
- `license.licenseServer: https://prime.plane.so`
- `ingress.enabled: <true | false>`
Expand Down Expand Up @@ -113,10 +113,18 @@ If you want to upgrade to a paid plan, see [Plan upgrades](https://docs.plane.so

| Setting | Default | Required | Description |
|---|:---:|:---:|---|
| planeVersion | v1.13.0 | Yes | Specifies the version of Plane to be deployed. Copy this from `prime.plane.so.` |
| license.licenseServer | `https://prime.plane.so` | Yes | Sets the value of the `licenseServer` that gets you your license and validates it periodically. Don't change this. |
| planeVersion | v1.14.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. |

#### Airgapped settings

| Setting | Default | Required | Description |
|---|:---:|:---:|---|
| airgapped.enabled | false | No | Specifies the airgapped mode the Plane API runs in. |
| airgapped.s3SecretName | "s3-custom-ca" | No | Name of the Secret that contains the CA certificate (.crt). The Secret must include a data key whose filename matches the basename of `airgapped.s3SecretKey` (default: `s3-custom-ca.crt`). Used to override S3’s CA when `airgapped.enabled=true`. Applying this secret looks like: `kubectl -n plane create secret generic plane-s3-ca \ --from-file=s3-custom-ca.crt=/path/to/your/ca.crt` |
| airgapped.s3SecretKey | "s3-custom-ca.crt" | No | Key name of the secret to load the Custom Root CA from `airgapped.s3SecretName` |


#### Postgres

| Setting | Default | Required | Description |
Expand Down