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.
Servicios Incluidos
web
makeplane/plane-frontend:latest
Variables de Entorno:
api
makeplane/plane-backend:latest
Variables de Entorno:
worker
makeplane/plane-backend:latest
Variables de Entorno:
beat-worker
makeplane/plane-backend:latest
Variables de Entorno:
postgres
postgres:16-alpine
Variables de Entorno:
redis
redis:7-alpine
minio
minio/minio:latest
Variables de Entorno:
YAML Generado
# 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
Información Rápida
- Servicios
- 7
- Redes
- 1
- Volúmenes
- 4
Cuándo Usar
Esta plantilla es ideal para configurar un entorno de plane Todos los servicios vienen preconfigurados con healthchecks, límites de recursos y valores por defecto sensatos. Personaliza las variables de entorno antes de desplegar en producción.
Consejos
- Cambia todas las contraseñas por defecto antes de desplegar
- Revisa los límites de recursos para tu hardware
- Añade un proxy inverso para HTTPS en producción
- Configura estrategias de respaldo para los volúmenes de datos