Plane
Plane is an open-source project management tool designed as a self-hosted alternative to Jira, Linear, and Asana. It provides issue tracking with customizable properties, sprint cycles, project modules, custom views, and a beautiful dashboard for tracking progress. This stack deploys the Plane frontend (React-based web UI), backend API server, background worker for async tasks, beat scheduler for periodic jobs, PostgreSQL 16 for data storage, Redis 7 for caching and task queuing, and MinIO for file storage. Plane supports Kanban boards, list views, spreadsheet views, Gantt charts, custom workflows, and GitHub/GitLab integration for linking issues to code. After deployment, access the web UI on port 80 to create your workspace, set up projects, and invite team members.
Included Services
web
makeplane/plane-frontend:latest
Environment Variables:
api
makeplane/plane-backend:latest
Environment Variables:
worker
makeplane/plane-backend:latest
Environment Variables:
beat-worker
makeplane/plane-backend:latest
Environment Variables:
postgres
postgres:16-alpine
Environment Variables:
redis
redis:7-alpine
minio
minio/minio:latest
Environment Variables:
Generated YAML
# Generated by ComposeHub (composehub.dev)
name: plane
services:
web:
image: makeplane/plane-frontend:latest
restart: always
ports:
- 80:3000
environment:
NEXT_PUBLIC_API_BASE_URL: ${API_BASE_URL:-http://localhost:80}
networks:
- plane
depends_on:
api:
condition: service_healthy
healthcheck:
test:
- CMD-SHELL
- curl -f http://localhost:3000 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
deploy:
resources:
limits:
cpus: "1.00"
memory: 512M
reservations:
cpus: "0.25"
memory: 128M
labels:
com.composehub.description: Plane frontend web application
api:
image: makeplane/plane-backend:latest
restart: always
command:
- ./bin/api
volumes:
- plane_uploads:/code/uploads
environment:
SECRET_KEY: ${SECRET_KEY:-changeme-generate-a-long-random-string}
DATABASE_URL: postgresql://${POSTGRES_USER:-plane}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-plane}
REDIS_URL: redis://redis:6379/
AWS_S3_ENDPOINT_URL: http://minio:9000
AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-plane}
AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-changeme}
AWS_S3_BUCKET_NAME: ${S3_BUCKET:-plane-uploads}
AWS_REGION: ${AWS_REGION:-us-east-1}
USE_MINIO: "true"
WEB_URL: ${WEB_URL:-http://localhost:80}
networks:
- plane
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
minio:
condition: service_started
healthcheck:
test:
- CMD-SHELL
- curl -f http://localhost:8000/api/v1/ || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
deploy:
resources:
limits:
cpus: "2.00"
memory: 1024M
reservations:
cpus: "0.50"
memory: 256M
labels:
com.composehub.description: Plane backend API server
worker:
image: makeplane/plane-backend:latest
restart: always
command:
- ./bin/worker
volumes:
- plane_uploads:/code/uploads
environment:
SECRET_KEY: ${SECRET_KEY:-changeme-generate-a-long-random-string}
DATABASE_URL: postgresql://${POSTGRES_USER:-plane}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-plane}
REDIS_URL: redis://redis:6379/
AWS_S3_ENDPOINT_URL: http://minio:9000
AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-plane}
AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-changeme}
AWS_S3_BUCKET_NAME: ${S3_BUCKET:-plane-uploads}
USE_MINIO: "true"
networks:
- plane
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
deploy:
resources:
limits:
cpus: "1.00"
memory: 512M
reservations:
cpus: "0.25"
memory: 128M
labels:
com.composehub.description: Plane background worker for async tasks
beat-worker:
image: makeplane/plane-backend:latest
restart: always
command:
- ./bin/beat
environment:
SECRET_KEY: ${SECRET_KEY:-changeme-generate-a-long-random-string}
DATABASE_URL: postgresql://${POSTGRES_USER:-plane}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-plane}
REDIS_URL: redis://redis:6379/
networks:
- plane
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
deploy:
resources:
limits:
cpus: "0.50"
memory: 256M
reservations:
cpus: "0.10"
memory: 64M
labels:
com.composehub.description: Plane beat scheduler for periodic tasks
postgres:
image: postgres:16-alpine
restart: always
volumes:
- plane_db:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${POSTGRES_DB:-plane}
POSTGRES_USER: ${POSTGRES_USER:-plane}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
networks:
- plane
healthcheck:
test:
- CMD-SHELL
- pg_isready -U ${POSTGRES_USER:-plane} -d ${POSTGRES_DB:-plane}
interval: 5s
timeout: 5s
retries: 10
start_period: 30s
deploy:
resources:
limits:
cpus: "1.00"
memory: 512M
reservations:
cpus: "0.25"
memory: 128M
labels:
com.composehub.description: PostgreSQL 16 database for Plane
redis:
image: redis:7-alpine
restart: always
command:
- redis-server
- "--save"
- "20"
- "1"
- "--loglevel"
- warning
- "--maxmemory"
- 256mb
- "--maxmemory-policy"
- allkeys-lru
volumes:
- plane_redis:/data
networks:
- plane
healthcheck:
test:
- CMD-SHELL
- redis-cli ping | grep PONG
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
deploy:
resources:
limits:
cpus: "0.50"
memory: 320M
reservations:
cpus: "0.10"
memory: 64M
labels:
com.composehub.description: Redis 7 for Plane caching and task queuing
minio:
image: minio/minio:latest
restart: always
command:
- server
- /data
- "--console-address"
- ":9090"
volumes:
- plane_minio:/data
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-plane}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-changeme}
networks:
- plane
healthcheck:
test:
- CMD-SHELL
- mc ready local || exit 1
interval: 15s
timeout: 10s
retries: 5
start_period: 20s
deploy:
resources:
limits:
cpus: "1.00"
memory: 512M
reservations:
cpus: "0.10"
memory: 128M
labels:
com.composehub.description: MinIO S3-compatible object storage for file uploads
networks:
plane:
driver: bridge
volumes:
plane_db:
driver: local
plane_redis:
driver: local
plane_minio:
driver: local
plane_uploads:
driver: local
Quick Info
- Services
- 7
- Networks
- 1
- Volumes
- 4
When to Use
This template is ideal for setting up a plane environment. All services are pre-configured with healthchecks, resource limits, and sensible defaults. Customize environment variables before deploying to production.
Tips
- Change all default passwords before deploying
- Review resource limits for your hardware
- Add a reverse proxy for production HTTPS
- Configure backup strategies for data volumes