Skip to content

chore(plane): update template to v1.3.1 with healthchecks and bug fixes#912

Open
leogomide wants to merge 3 commits into
Dokploy:canaryfrom
leogomide:update-plane-v1.3.1
Open

chore(plane): update template to v1.3.1 with healthchecks and bug fixes#912
leogomide wants to merge 3 commits into
Dokploy:canaryfrom
leogomide:update-plane-v1.3.1

Conversation

@leogomide
Copy link
Copy Markdown

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.1v1.3.1
  • valkey/valkey: 7.2.5-alpine7.2.11-alpine
  • minio/minio: latestRELEASE.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)

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.

- Bump makeplane/* images v0.27.1 -> v1.3.1
- Pin minio to RELEASE.2025-04-22T22-12-26Z (last release with full admin
  console before community-edition feature removal)
- Add YAML anchors (x-*-env) for env reuse across backend services
- Add healthchecks for postgres, valkey, rabbitmq
- api/worker/beat-worker wait for migrator via service_completed_successfully
  (fixes race where backend booted before schema was migrated)
- Add restart policies (unless-stopped for long-running, on-failure for migrator)
- Migrate env_file -> inline environment (matches repo convention)
- Expose APP_RELEASE in template.toml [variables] for UI override

Bug fixes in template.toml:
- RABBITMQ_DEFAULT_USER was the literal string "rabbitmq_user" instead of
  a variable reference; AMQP_URL was inconsistent with the broker user
- WEB_URL was missing the https:// scheme (broke OAuth/email links)
- DATABASE_URL/AMQP_URL referenced inline vars that Dokploy does not
  resolve inside [config.env]; now use [variables] directly
- Remove dead vars: NGINX_PORT (Plane v1.x uses Caddy), SENTRY_DSN,
  SENTRY_ENVIRONMENT
- Add WEBHOOK_ALLOWED_IPS/WEBHOOK_ALLOWED_HOSTS (SSRF guard default
  introduced in Plane v1.x)
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. version-bump labels May 28, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 28, 2026

built with Refined Cloudflare Pages Action

⚡ Cloudflare Pages Deployment

Name Status Preview Last Commit
templates ✅ Ready (View Log) Visit Preview 11bc16e

The plane-proxy image has hardcoded `reverse_proxy web:3000`/`api:8000`
in its Caddyfile with generic service names. In multi-stack Dokploy
deployments, those names collide with other stacks' containers (Next.js
apps frequently have a `web` service) on the shared dokploy-network —
the Plane domain ends up serving content from unrelated stacks.

Two-step fix:
  1. Rename internal services with `plane-*` prefix (unique cluster-wide):
     web/space/admin/live/api/worker/beat-worker/migrator → plane-*
  2. Add `links:` block to the `proxy` service mapping the new names back
     to the generic ones the Caddyfile expects (`plane-web:web` etc.).
     Docker injects these into /etc/hosts, which has absolute priority
     over DNS — Caddy resolves `web`/`api`/etc. directly to our renamed
     containers, ignoring any collision on dokploy-network.

Also updates `API_BASE_URL` in template.toml and the `x-live-env` anchor
from `http://api:8000` → `http://plane-api:8000`.

No `networks:` declarations added (repo validator rejects them; Dokploy
manages networking automatically).
@leogomide
Copy link
Copy Markdown
Author

Pushed a fix for a DNS collision bug in the internal proxy (commits 9c29df4 + 11bc16e).

Problem: the makeplane/plane-proxy image has reverse_proxy web:3000/api:8000 hardcoded in its Caddyfile. In multi-stack Dokploy deployments, those generic names collide with other stacks' containers on the shared dokploy-network (Next.js apps frequently have a web service) — the Plane domain ends up serving content from unrelated stacks.

Fix (two layers):

  1. Renamed the 8 internal services with a plane-* prefix (unique cluster-wide): web→plane-web, space→plane-space, admin→plane-admin, live→plane-live, api→plane-api, worker→plane-worker, beat-worker→plane-beat-worker, migrator→plane-migrator. Updated all depends_on cascades and the API_BASE_URL in template.toml + the x-live-env anchor to point at plane-api.
  2. Added a links: block on the proxy service mapping the new names back to the generic ones the Caddyfile expects (plane-web:web, plane-api:api, etc.). Docker injects these into /etc/hosts, which takes absolute priority over DNS — Caddy resolves web/api/etc. straight to our renamed containers, ignoring any collision.

No networks: declarations added — the repo validator (build-scripts/validate-docker-compose.ts:116-163) explicitly rejects them, and Dokploy manages networking automatically. The /etc/hosts approach solves the collision without needing network isolation.

Local validation (all 0 errors):

  • docker compose -f blueprints/plane/docker-compose.yml config → exit 0
  • tsx build-scripts/validate-docker-compose.ts -f blueprints/plane/docker-compose.yml → 13 services, valid
  • tsx build-scripts/validate-template.ts -d blueprints/plane → 7 vars, 1 domain, valid

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

Labels

size:M This PR changes 30-99 lines, ignoring generated files. version-bump

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant