Plane: Jira를 대체하는 현대적인 오픈소스 프로젝트 관리 도구 Docker 설치 가이드




개요

Plane은 Jira, Linear, Monday, ClickUp의 오픈소스 대안으로, 현대적이고 직관적인 프로젝트 관리 플랫폼입니다. GitHub Stars 38.6K+ 이상을 보유한 활발한 프로젝트로, 스타트업부터 엔터프라이즈까지 다양한 규모의 팀에서 사용할 수 있습니다. 깔끔한 UI와 빠른 성능을 자랑하며, 셀프호스팅을 통해 데이터 주권을 완벽하게 확보할 수 있습니다.

Plane의 핵심 철학

Plane은 “프로세스에 도구를 맞추는 것이 아니라, 도구를 프로세스에 맞추자”는 철학으로 설계되었습니다. Jira의 복잡함과 과도한 설정 없이도 강력한 프로젝트 관리 기능을 제공합니다.

핵심 개념

개념설명
Work Items (작업 항목)이슈/태스크의 기본 단위, 리치 텍스트 편집기 지원
Cycles (사이클)스프린트 관리, 번다운 차트로 진행 상황 추적
Modules (모듈)복잡한 프로젝트를 작은 단위로 분할 관리
Views (뷰)필터링된 커스텀 뷰 생성 및 공유
Pages (페이지)AI 기능이 탑재된 문서/위키 관리

주요 특징

기능설명
다중 뷰 지원Kanban, List, Calendar, Gantt, Spreadsheet
이슈 추적하위 이슈, 관계 설정, 사용자 정의 속성
스프린트 관리Cycles로 스프린트 계획 및 번다운 차트
로드맵제품 로드맵 시각화 및 공유
AI 기능프로젝트 계획 생성, 지식 검색, 작업 자동화 (Pro)
GitHub 연동PR/커밋과 이슈 연결 (Pro)
God Mode인스턴스 관리자용 전역 설정
다국어다양한 언어 지원

프로젝트 관리 도구 비교

기능PlaneJiraLinearTrello
오픈소스
셀프호스팅제한적
무료 사용제한적제한적제한적
Kanban 보드
스프린트/사이클
로드맵
Gantt 차트
문서/위키Confluence
AI 기능✅ (Pro)
학습 곡선낮음높음낮음매우 낮음

시스템 요구 사항

항목최소 사양권장 사양
RAM4GB8GB 이상
CPU2 코어4 코어 이상
저장소20GB50GB 이상
Docker20.10+최신 버전
Docker Compose2.0+최신 버전

Docker Compose 설치

방법 1: 공식 설치 스크립트 (권장)

# 저장소 클론
git clone https://github.com/makeplane/plane.git
cd plane

# 설치 스크립트 실행
./setup.sh

설치 스크립트가 대화형으로 설정을 안내합니다.

방법 2: Docker Compose 직접 구성

1) 디렉토리 및 환경 변수 설정

mkdir -p ~/plane && cd ~/plane

.env 파일 생성:

# 기본 설정
WEB_URL=http://localhost
CORS_ALLOWED_ORIGINS=http://localhost

# 데이터베이스
POSTGRES_USER=plane
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=plane
DATABASE_URL=postgresql://plane:your_secure_password@plane-db:5432/plane

# Redis
REDIS_URL=redis://plane-redis:6379/

# Secret Key (랜덤 생성 권장)
SECRET_KEY=your_super_secret_key_change_this

# MinIO (파일 스토리지)
AWS_ACCESS_KEY_ID=access-key
AWS_SECRET_ACCESS_KEY=secret-key
AWS_S3_BUCKET_NAME=uploads
AWS_S3_ENDPOINT_URL=http://plane-minio:9000
FILE_SIZE_LIMIT=5242880

# 이메일 설정 (선택사항)
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_HOST_USER=your-email@example.com
EMAIL_HOST_PASSWORD=your-email-password
EMAIL_USE_TLS=1
DEFAULT_EMAIL=your-email@example.com

2) docker-compose.yml

version: "3.8"

services:
  # PostgreSQL 데이터베이스
  plane-db:
    image: postgres:15-alpine
    container_name: plane-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - plane-db-data:/var/lib/postgresql/data
    networks:
      - plane-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Redis
  plane-redis:
    image: redis:7-alpine
    container_name: plane-redis
    restart: unless-stopped
    networks:
      - plane-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  # MinIO (S3 호환 스토리지)
  plane-minio:
    image: minio/minio
    container_name: plane-minio
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID}
      MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY}
    volumes:
      - plane-minio-data:/data
    networks:
      - plane-network

  # API 서버
  plane-api:
    image: makeplane/plane-backend:latest
    container_name: plane-api
    restart: unless-stopped
    command: ./bin/takeoff
    env_file:
      - .env
    depends_on:
      plane-db:
        condition: service_healthy
      plane-redis:
        condition: service_healthy
    networks:
      - plane-network

  # Worker (백그라운드 작업)
  plane-worker:
    image: makeplane/plane-backend:latest
    container_name: plane-worker
    restart: unless-stopped
    command: ./bin/worker
    env_file:
      - .env
    depends_on:
      - plane-api
    networks:
      - plane-network

  # Beat Worker (스케줄러)
  plane-beat-worker:
    image: makeplane/plane-backend:latest
    container_name: plane-beat-worker
    restart: unless-stopped
    command: ./bin/beat
    env_file:
      - .env
    depends_on:
      - plane-api
    networks:
      - plane-network

  # 프론트엔드
  plane-web:
    image: makeplane/plane-frontend:latest
    container_name: plane-web
    restart: unless-stopped
    networks:
      - plane-network

  # Space (공개 페이지)
  plane-space:
    image: makeplane/plane-space:latest
    container_name: plane-space
    restart: unless-stopped
    networks:
      - plane-network

  # Proxy (Nginx)
  plane-proxy:
    image: makeplane/plane-proxy:latest
    container_name: plane-proxy
    restart: unless-stopped
    ports:
      - "8080:80"
    depends_on:
      - plane-web
      - plane-api
      - plane-space
    networks:
      - plane-network

volumes:
  plane-db-data:
  plane-minio-data:

networks:
  plane-network:
    driver: bridge

3) 실행

docker-compose up -d

# 로그 확인
docker-compose logs -f

# 상태 확인
docker-compose ps

Traefik 리버스 프록시 설정

version: "3.8"

services:
  plane-proxy:
    image: makeplane/plane-proxy:latest
    container_name: plane-proxy
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.plane.rule=Host(`plane.yourdomain.com`)"
      - "traefik.http.routers.plane.entrypoints=websecure"
      - "traefik.http.routers.plane.tls.certresolver=myresolver"
      - "traefik.http.services.plane.loadbalancer.server.port=80"
    networks:
      - plane-network
      - traefik-network

networks:
  plane-network:
    driver: bridge
  traefik-network:
    external: true

초기 설정

1) 웹 접속

브라우저에서 http://localhost:8080 또는 설정한 도메인으로 접속합니다.

2) 관리자 계정 생성

  1. 첫 접속 시 회원가입 페이지가 표시됩니다
  2. 이메일, 비밀번호 입력하여 관리자 계정 생성
  3. 워크스페이스 생성

3) God Mode 설정 (인스턴스 관리)

관리자는 God Mode를 통해 전역 설정을 관리할 수 있습니다:

  • 사용자 등록 허용/제한
  • 이메일 설정
  • AI 기능 설정
  • 인증 방식 설정

주요 기능 활용

프로젝트 구조 설정

Workspace (워크스페이스)
├── Project 1 (프로젝트)
│   ├── Modules (모듈)
│   │   ├── Frontend
│   │   └── Backend
│   ├── Cycles (스프린트)
│   │   ├── Sprint 1
│   │   └── Sprint 2
│   └── Pages (문서)
│       ├── PRD
│       └── Technical Spec
└── Project 2

뷰 활용

뷰 타입용도
Kanban상태별 작업 현황 시각화
List상세 정보와 함께 목록 보기
Calendar일정 기반 작업 관리
Gantt타임라인 및 의존성 시각화
Spreadsheet대량 데이터 편집

자동화 및 통합

  • GitHub 연동: PR/커밋과 이슈 자동 연결
  • Slack 통합: 알림 및 업데이트 수신
  • Webhook: 외부 서비스 연동
  • API: REST API로 커스텀 통합

트러블슈팅

서비스 시작 실패

# 모든 컨테이너 상태 확인
docker-compose ps

# 특정 서비스 로그 확인
docker-compose logs plane-api

# 데이터베이스 연결 확인
docker-compose exec plane-db psql -U plane -d plane -c "SELECT 1"

마이그레이션 실행

docker-compose exec plane-api python manage.py migrate

메모리 부족

# docker-compose.yml에서 리소스 제한 조정
services:
  plane-api:
    deploy:
      resources:
        limits:
          memory: 2G

MinIO 버킷 초기화

# MinIO 컨테이너 접속
docker-compose exec plane-minio mc alias set local http://localhost:9000 access-key secret-key
docker-compose exec plane-minio mc mb local/uploads

백업 및 복원

데이터베이스 백업

# PostgreSQL 백업
docker-compose exec plane-db pg_dump -U plane plane > plane_backup_$(date +%Y%m%d).sql

# 복원
cat plane_backup_20240101.sql | docker-compose exec -T plane-db psql -U plane plane

MinIO 데이터 백업

# 볼륨 백업
docker run --rm -v plane_plane-minio-data:/data -v $(pwd):/backup alpine tar czf /backup/minio_backup.tar.gz /data

전체 백업 스크립트

#!/bin/bash
BACKUP_DIR="/backups/plane/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 데이터베이스 백업
docker-compose exec -T plane-db pg_dump -U plane plane > $BACKUP_DIR/database.sql

# MinIO 볼륨 백업
docker run --rm -v plane_plane-minio-data:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/minio.tar.gz /data

echo "Backup completed: $BACKUP_DIR"

업그레이드

# 최신 이미지 가져오기
docker-compose pull

# 서비스 재시작
docker-compose down
docker-compose up -d

# 마이그레이션 실행 (필요 시)
docker-compose exec plane-api python manage.py migrate

라이선스 및 제한사항

Plane은 AGPL-3.0 라이선스로 배포되며, 셀프호스팅 시 일부 기능 제한이 있습니다:

기능Community (무료)ProBusiness
기본 이슈 관리
Kanban/List 뷰
Cycles/Modules
Pages
GitHub 연동
AI 기능
고급 분석
SSO/SAML



댓글 남기기