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.
Services Inclus
web
makeplane/plane-frontend:latest
Variables d'Environnement :
api
makeplane/plane-backend:latest
Variables d'Environnement :
worker
makeplane/plane-backend:latest
Variables d'Environnement :
beat-worker
makeplane/plane-backend:latest
Variables d'Environnement :
postgres
postgres:16-alpine
Variables d'Environnement :
redis
redis:7-alpine
minio
minio/minio:latest
Variables d'Environnement :
YAML Généré
# 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
Informations Rapides
- Services
- 7
- Réseaux
- 1
- Volumes
- 4
Quand l'Utiliser
Ce modèle est idéal pour mettre en place un environnement plane Tous les services sont préconfigurés avec des healthchecks, des limites de ressources et des valeurs par défaut raisonnables. Personnalisez les variables d'environnement avant de déployer en production.
Conseils
- Changez tous les mots de passe par défaut avant le déploiement
- Vérifiez les limites de ressources pour votre matériel
- Ajoutez un reverse proxy pour le HTTPS en production
- Configurez des stratégies de sauvegarde pour les volumes de données