개요
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 | 인스턴스 관리자용 전역 설정 |
| 다국어 | 다양한 언어 지원 |
프로젝트 관리 도구 비교
| 기능 | Plane | Jira | Linear | Trello |
|---|---|---|---|---|
| 오픈소스 | ✅ | ❌ | ❌ | ❌ |
| 셀프호스팅 | ✅ | 제한적 | ❌ | ❌ |
| 무료 사용 | ✅ | 제한적 | 제한적 | 제한적 |
| Kanban 보드 | ✅ | ✅ | ✅ | ✅ |
| 스프린트/사이클 | ✅ | ✅ | ✅ | ❌ |
| 로드맵 | ✅ | ✅ | ✅ | ❌ |
| Gantt 차트 | ✅ | ✅ | ❌ | ❌ |
| 문서/위키 | ✅ | Confluence | ❌ | ❌ |
| AI 기능 | ✅ (Pro) | ✅ | ✅ | ❌ |
| 학습 곡선 | 낮음 | 높음 | 낮음 | 매우 낮음 |
시스템 요구 사항
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| RAM | 4GB | 8GB 이상 |
| CPU | 2 코어 | 4 코어 이상 |
| 저장소 | 20GB | 50GB 이상 |
| Docker | 20.10+ | 최신 버전 |
| Docker Compose | 2.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) 관리자 계정 생성
- 첫 접속 시 회원가입 페이지가 표시됩니다
- 이메일, 비밀번호 입력하여 관리자 계정 생성
- 워크스페이스 생성
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 (무료) | Pro | Business |
|---|---|---|---|
| 기본 이슈 관리 | ✅ | ✅ | ✅ |
| Kanban/List 뷰 | ✅ | ✅ | ✅ |
| Cycles/Modules | ✅ | ✅ | ✅ |
| Pages | ✅ | ✅ | ✅ |
| GitHub 연동 | ❌ | ✅ | ✅ |
| AI 기능 | ❌ | ✅ | ✅ |
| 고급 분석 | ❌ | ✅ | ✅ |
| SSO/SAML | ❌ | ❌ | ✅ |