Update the Plane template from v0.27.1 to v1.3.1 (latest stable), refactor the compose file for reliability, and fix several bugs in the current template.toml.
minio/minio: latest → RELEASE.2025-04-22T22-12-26Z (pinned to the last release before MinIO removed the admin console from the community edition)
postgres, rabbitmq: kept (17-alpine, 3.13.6-management-alpine) to avoid breaking existing deployments
docker-compose.yml improvements
Add YAML anchors (x-db-env, x-redis-env, x-app-env, ...) and <<: [*anchor] merges to eliminate duplicated env across api/worker/beat-worker/migrator/live
Migrate from env_file: [.env] to inline environment: (matches the repo convention; Dokploy injects env via template.toml)
Add restart: unless-stopped to every long-running service; restart: on-failure on migrator
Add healthcheck to plane-db, plane-redis, plane-mq
api/worker/beat-worker now wait for migrator via condition: service_completed_successfully — fixes a race where the backend booted before the Django schema was migrated
proxy uses expose: ["80"] (no host port mapping, per the validator rule)
template.toml improvements (bug fixes)
RABBITMQ_DEFAULT_USER was the literal string "rabbitmq_user" instead of a variable reference, so the broker user ended up as rabbitmq_user while AMQP_URL expected something else. Now fixed to plane consistently.
WEB_URL=${Domain} was missing the https:// scheme, which broke OAuth callback URLs and email links emitted by the backend. Now WEB_URL=https://${main_domain}.
DATABASE_URL/AMQP_URL referenced inline vars (${POSTGRES_USER}, ${MINIO_ROOT_USER}) that Dokploy does not resolve inside [config.env] — only [variables] references and helpers work. Now built directly from [variables].
Remove dead vars: NGINX_PORT (Plane uses Caddy in v1.x), SENTRY_DSN, SENTRY_ENVIRONMENT.
Add WEBHOOK_ALLOWED_IPS="" and WEBHOOK_ALLOWED_HOSTS="" — Plane v1.x ships an SSRF guard for webhooks that blocks private IPs by default; exposing these as empty strings makes the intended posture explicit and discoverable.
Add APP_RELEASE to [variables] so users can pick the image tag via the Dokploy UI without editing env directly.
Logo
blueprints/plane/plane.png updated to the current Plane brand logo.
Checklist
I have read the suggestions in the README.md / CONTRIBUTING.md
I have validated the template locally (docker compose config, validate-docker-compose.ts, validate-template.ts all pass with zero errors)
meta.json processed with node build-scripts/process-meta.js (only the version bump appears in the diff)
A full end-to-end smoke test (admin signup, project + issue + MinIO upload, live WebSocket "users online") can be run from the auto-generated PR preview.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/Dokploy/templates/pull/912
**Author:** [@leogomide](https://github.com/leogomide)
**Created:** 5/28/2026
**Status:** 🔄 Open
**Base:** `canary` ← **Head:** `update-plane-v1.3.1`
---
### 📝 Commits (7)
- [`669ad4a`](https://github.com/Dokploy/templates/commit/669ad4a2577d1b4cb8ccbcbc39bd5aa0b11c1116) chore(plane): update template to v1.3.1 with healthchecks and bug fixes
- [`9c29df4`](https://github.com/Dokploy/templates/commit/9c29df415cbba65d8b3b08220cc4cb43ad3fcb83) fix(plane): rename services + add proxy links to avoid DNS collision
- [`11bc16e`](https://github.com/Dokploy/templates/commit/11bc16ea367baf4394510667913fbc8a74c9670f) docs(plane): translate top-of-file comment to English
- [`34501dd`](https://github.com/Dokploy/templates/commit/34501dd8b51b176027454127b90edbce4a32dd50) fix(plane): set proxy SITE_ADDRESS and TRUSTED_PROXIES to fix Caddyfile crash
- [`b24dbc7`](https://github.com/Dokploy/templates/commit/b24dbc761196126b9564e366ba82c8615c33bada) fix(plane): tighten proxy TRUSTED_PROXIES to private_ranges (no IP spoofing)
- [`2248627`](https://github.com/Dokploy/templates/commit/2248627c986d2b7eeb0796cdb3fad2d8b2bff23f) fix(plane): move env/mounts under [config] so template env exports correctly
- [`d651d2d`](https://github.com/Dokploy/templates/commit/d651d2d400a6796c7ae71d678657a26340827fa9) docs(plane): document each env var as inline comments in template env
### 📊 Changes
**4 files changed** (+317 additions, -125 deletions)
<details>
<summary>View changed files</summary>
📝 `blueprints/plane/docker-compose.yml` (+217 -81)
📝 `blueprints/plane/plane.png` (+0 -0)
📝 `blueprints/plane/template.toml` (+99 -43)
📝 `meta.json` (+1 -1)
</details>
### 📄 Description
## What is this PR about?
Update the Plane template from **v0.27.1** to **v1.3.1** (latest stable), refactor the compose file for reliability, and fix several bugs in the current `template.toml`.
### Image bumps
- `makeplane/plane-frontend`, `plane-space`, `plane-admin`, `plane-live`, `plane-backend`, `plane-proxy`: `v0.27.1` → `v1.3.1`
- `valkey/valkey`: `7.2.5-alpine` → `7.2.11-alpine`
- `minio/minio`: `latest` → `RELEASE.2025-04-22T22-12-26Z` (pinned to the last release before MinIO removed the admin console from the community edition)
- `postgres`, `rabbitmq`: kept (`17-alpine`, `3.13.6-management-alpine`) to avoid breaking existing deployments
### `docker-compose.yml` improvements
- Add YAML anchors (`x-db-env`, `x-redis-env`, `x-app-env`, ...) and `<<: [*anchor]` merges to eliminate duplicated env across `api`/`worker`/`beat-worker`/`migrator`/`live`
- Migrate from `env_file: [.env]` to inline `environment:` (matches the repo convention; Dokploy injects env via `template.toml`)
- Add `restart: unless-stopped` to every long-running service; `restart: on-failure` on `migrator`
- Add `healthcheck` to `plane-db`, `plane-redis`, `plane-mq`
- `api`/`worker`/`beat-worker` now wait for `migrator` via `condition: service_completed_successfully` — fixes a race where the backend booted before the Django schema was migrated
- `proxy` uses `expose: ["80"]` (no host port mapping, per the validator rule)
### `template.toml` improvements (bug fixes)
- **`RABBITMQ_DEFAULT_USER` was the literal string `"rabbitmq_user"`** instead of a variable reference, so the broker user ended up as `rabbitmq_user` while `AMQP_URL` expected something else. Now fixed to `plane` consistently.
- **`WEB_URL=${Domain}` was missing the `https://` scheme**, which broke OAuth callback URLs and email links emitted by the backend. Now `WEB_URL=https://${main_domain}`.
- **`DATABASE_URL`/`AMQP_URL` referenced inline vars (`${POSTGRES_USER}`, `${MINIO_ROOT_USER}`)** that Dokploy does not resolve inside `[config.env]` — only `[variables]` references and helpers work. Now built directly from `[variables]`.
- Remove dead vars: `NGINX_PORT` (Plane uses Caddy in v1.x), `SENTRY_DSN`, `SENTRY_ENVIRONMENT`.
- Add `WEBHOOK_ALLOWED_IPS=""` and `WEBHOOK_ALLOWED_HOSTS=""` — Plane v1.x ships an SSRF guard for webhooks that blocks private IPs by default; exposing these as empty strings makes the intended posture explicit and discoverable.
- Add `APP_RELEASE` to `[variables]` so users can pick the image tag via the Dokploy UI without editing env directly.
### Logo
- `blueprints/plane/plane.png` updated to the current Plane brand logo.
## Checklist
- [x] I have read the suggestions in the README.md / CONTRIBUTING.md
- [x] I have validated the template locally (`docker compose config`, `validate-docker-compose.ts`, `validate-template.ts` all pass with zero errors)
- [x] `meta.json` processed with `node build-scripts/process-meta.js` (only the version bump appears in the diff)
## Issues related
N/A — proactive maintenance update.
## Testing notes
Validated locally with the repo's own scripts:
- `docker compose -f blueprints/plane/docker-compose.yml config` → exit 0
- `tsx build-scripts/validate-docker-compose.ts` → 13 services detected, structure valid
- `tsx build-scripts/validate-template.ts` → 7 variables processed, structure valid
A full end-to-end smoke test (admin signup, project + issue + MinIO upload, live WebSocket "users online") can be run from the auto-generated PR preview.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/Dokploy/templates/pull/912
Author: @leogomide
Created: 5/28/2026
Status: 🔄 Open
Base:
canary← Head:update-plane-v1.3.1📝 Commits (7)
669ad4achore(plane): update template to v1.3.1 with healthchecks and bug fixes9c29df4fix(plane): rename services + add proxy links to avoid DNS collision11bc16edocs(plane): translate top-of-file comment to English34501ddfix(plane): set proxy SITE_ADDRESS and TRUSTED_PROXIES to fix Caddyfile crashb24dbc7fix(plane): tighten proxy TRUSTED_PROXIES to private_ranges (no IP spoofing)2248627fix(plane): move env/mounts under [config] so template env exports correctlyd651d2ddocs(plane): document each env var as inline comments in template env📊 Changes
4 files changed (+317 additions, -125 deletions)
View changed files
📝
blueprints/plane/docker-compose.yml(+217 -81)📝
blueprints/plane/plane.png(+0 -0)📝
blueprints/plane/template.toml(+99 -43)📝
meta.json(+1 -1)📄 Description
What is this PR about?
Update the Plane template from v0.27.1 to v1.3.1 (latest stable), refactor the compose file for reliability, and fix several bugs in the current
template.toml.Image bumps
makeplane/plane-frontend,plane-space,plane-admin,plane-live,plane-backend,plane-proxy:v0.27.1→v1.3.1valkey/valkey:7.2.5-alpine→7.2.11-alpineminio/minio:latest→RELEASE.2025-04-22T22-12-26Z(pinned to the last release before MinIO removed the admin console from the community edition)postgres,rabbitmq: kept (17-alpine,3.13.6-management-alpine) to avoid breaking existing deploymentsdocker-compose.ymlimprovementsx-db-env,x-redis-env,x-app-env, ...) and<<: [*anchor]merges to eliminate duplicated env acrossapi/worker/beat-worker/migrator/liveenv_file: [.env]to inlineenvironment:(matches the repo convention; Dokploy injects env viatemplate.toml)restart: unless-stoppedto every long-running service;restart: on-failureonmigratorhealthchecktoplane-db,plane-redis,plane-mqapi/worker/beat-workernow wait formigratorviacondition: service_completed_successfully— fixes a race where the backend booted before the Django schema was migratedproxyusesexpose: ["80"](no host port mapping, per the validator rule)template.tomlimprovements (bug fixes)RABBITMQ_DEFAULT_USERwas the literal string"rabbitmq_user"instead of a variable reference, so the broker user ended up asrabbitmq_userwhileAMQP_URLexpected something else. Now fixed toplaneconsistently.WEB_URL=${Domain}was missing thehttps://scheme, which broke OAuth callback URLs and email links emitted by the backend. NowWEB_URL=https://${main_domain}.DATABASE_URL/AMQP_URLreferenced inline vars (${POSTGRES_USER},${MINIO_ROOT_USER}) that Dokploy does not resolve inside[config.env]— only[variables]references and helpers work. Now built directly from[variables].NGINX_PORT(Plane uses Caddy in v1.x),SENTRY_DSN,SENTRY_ENVIRONMENT.WEBHOOK_ALLOWED_IPS=""andWEBHOOK_ALLOWED_HOSTS=""— Plane v1.x ships an SSRF guard for webhooks that blocks private IPs by default; exposing these as empty strings makes the intended posture explicit and discoverable.APP_RELEASEto[variables]so users can pick the image tag via the Dokploy UI without editing env directly.Logo
blueprints/plane/plane.pngupdated to the current Plane brand logo.Checklist
docker compose config,validate-docker-compose.ts,validate-template.tsall pass with zero errors)meta.jsonprocessed withnode build-scripts/process-meta.js(only the version bump appears in the diff)Issues related
N/A — proactive maintenance update.
Testing notes
Validated locally with the repo's own scripts:
docker compose -f blueprints/plane/docker-compose.yml config→ exit 0tsx build-scripts/validate-docker-compose.ts→ 13 services detected, structure validtsx build-scripts/validate-template.ts→ 7 variables processed, structure validA full end-to-end smoke test (admin signup, project + issue + MinIO upload, live WebSocket "users online") can be run from the auto-generated PR preview.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.