개요
Leantime은 스타트업과 혁신가를 위한 린(Lean) 오픈소스 프로젝트 관리 시스템입니다. AGPLv3 라이선스로 배포되며, Jira, Asana, Linear의 셀프호스팅 대안입니다. 특히 ADHD, 자폐, 난독증을 가진 사용자를 고려하여 설계된 것이 특징으로, 과도한 복잡성 없이 목표 중심의 프로젝트 관리를 제공합니다.
Leantime의 핵심 철학
Leantime은 “린(Lean)하고 직관적인 프로젝트 관리”를 추구합니다. Jira의 복잡한 설정이 필요 없고, 비개발자도 쉽게 사용할 수 있도록 설계되었습니다. 창업자인 Gloria Folaron은 ADHD를 가진 사용자로서, 신경다양성(Neurodiversity)을 고려한 워크플로우를 구현했습니다.
주요 특징
| 기능 | 설명 |
|---|---|
| 목표 관리 | OKR/목표 설정 및 추적 |
| 마일스톤 | 주요 이정표 관리 |
| Kanban 보드 | 태스크 시각화 |
| 타임시트 | 시간 추적 및 기록 |
| 로드맵 | 제품/프로젝트 로드맵 |
| 리서치 보드 | 아이디어 정리 |
| 화이트보드 | 브레인스토밍 (플러그인) |
| 레트로스펙티브 | 팀 회고 |
| 보고서 | 진행 상황 리포트 |
| 위키/노트 | 문서화 (플러그인) |
| 포모도로 | 집중 타이머 (플러그인) |
| 다국어 | 12+ 언어 지원 |
신경다양성 친화적 기능
Leantime은 ADHD, 자폐, 난독증을 가진 사용자를 위한 특별한 기능을 제공합니다:
| 기능 | 설명 |
|---|---|
| 컨텍스트 리마인더 | 적절한 타이밍에 알림 |
| 감정 기반 우선순위 | 작업의 의미와 중요성 연결 |
| 산만함 관리 | 집중을 돕는 인터페이스 |
| 지능형 어시스턴트 | 작업 패턴 학습 및 추천 |
| 목표 연결 | 작업이 왜 중요한지 이해 |
프로젝트 관리 도구 비교
| 기능 | Leantime | Jira | Asana | Monday |
|---|---|---|---|---|
| 오픈소스 | ✅ | ❌ | ❌ | ❌ |
| 셀프호스팅 | ✅ | 제한적 | ❌ | ❌ |
| Kanban 보드 | ✅ | ✅ | ✅ | ✅ |
| 시간 추적 | ✅ | 플러그인 | 유료 | ✅ |
| 로드맵 | ✅ | ✅ | 유료 | ✅ |
| 목표/OKR | ✅ | 플러그인 | 유료 | 유료 |
| 리서치 보드 | ✅ | ❌ | ❌ | ❌ |
| 레트로 | ✅ | 플러그인 | ❌ | ❌ |
| 설정 복잡도 | 낮음 | 매우 높음 | 중간 | 중간 |
| ADHD 친화 | ✅ | ❌ | ❌ | ❌ |
시스템 요구 사항
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| RAM | 1GB | 2GB 이상 |
| CPU | 1 코어 | 2 코어 이상 |
| 저장소 | 5GB | 20GB 이상 |
| PHP | 8.1+ | 8.2+ |
| MySQL/MariaDB | 8.0+ / 10.4+ | 최신 버전 |
| Docker | 20.10+ | 최신 버전 |
Docker Compose 설치
기본 설치
mkdir -p ~/leantime && cd ~/leantime
.env 파일:
# MySQL 설정
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=leantime
MYSQL_USER=leantime
MYSQL_PASSWORD=your_secure_password
# Leantime 설정
LEAN_DB_HOST=leantime-db
LEAN_DB_USER=leantime
LEAN_DB_PASSWORD=your_secure_password
LEAN_DB_DATABASE=leantime
# 세션 보안 (필수 - 랜덤 문자열)
LEAN_SESSION_PASSWORD=your-super-secure-session-password-here
# 사이트 설정
LEAN_SITENAME=My Leantime
LEAN_LANGUAGE=ko-KR
LEAN_DEFAULT_TIMEZONE=Asia/Seoul
# 이메일 설정 (선택사항)
LEAN_EMAIL_SMTP_ENABLED=true
LEAN_EMAIL_SMTP_HOST=smtp.example.com
LEAN_EMAIL_SMTP_PORT=587
LEAN_EMAIL_SMTP_USERNAME=your-email@example.com
LEAN_EMAIL_SMTP_PASSWORD=your-email-password
LEAN_EMAIL_RETURN=noreply@example.com
docker-compose.yml:
version: "3.8"
services:
leantime-db:
image: mysql:8.0
container_name: leantime-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- leantime-db-data:/var/lib/mysql
networks:
- leantime-network
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 5
leantime:
image: leantime/leantime:latest
container_name: leantime
restart: unless-stopped
ports:
- "8080:80"
environment:
LEAN_DB_HOST: ${LEAN_DB_HOST}
LEAN_DB_USER: ${LEAN_DB_USER}
LEAN_DB_PASSWORD: ${LEAN_DB_PASSWORD}
LEAN_DB_DATABASE: ${LEAN_DB_DATABASE}
LEAN_SESSION_PASSWORD: ${LEAN_SESSION_PASSWORD}
LEAN_SITENAME: ${LEAN_SITENAME:-Leantime}
LEAN_LANGUAGE: ${LEAN_LANGUAGE:-en-US}
LEAN_DEFAULT_TIMEZONE: ${LEAN_DEFAULT_TIMEZONE:-UTC}
volumes:
- leantime-userfiles:/var/www/html/userfiles
- leantime-public-userfiles:/var/www/html/public/userfiles
- leantime-logs:/var/www/html/storage/logs
- leantime-plugins:/var/www/html/app/Plugins
depends_on:
leantime-db:
condition: service_healthy
networks:
- leantime-network
volumes:
leantime-db-data:
leantime-userfiles:
leantime-public-userfiles:
leantime-logs:
leantime-plugins:
networks:
leantime-network:
driver: bridge
PUID/PGID 설정 (권한 문제 해결)
services:
leantime:
image: leantime/leantime:latest
environment:
PUID: 1000 # 호스트 사용자 ID
PGID: 1000 # 호스트 그룹 ID
# ... 기타 환경 변수
호스트 사용자 ID 확인:
id username
# uid=1000(username) gid=1000(username) ...
Traefik 리버스 프록시 설정
version: "3.8"
services:
leantime:
image: leantime/leantime:latest
container_name: leantime
restart: unless-stopped
environment:
LEAN_DB_HOST: leantime-db
LEAN_DB_USER: leantime
LEAN_DB_PASSWORD: your_secure_password
LEAN_DB_DATABASE: leantime
LEAN_SESSION_PASSWORD: your-session-password
volumes:
- leantime-userfiles:/var/www/html/userfiles
- leantime-public-userfiles:/var/www/html/public/userfiles
networks:
- leantime-network
- traefik-network
labels:
- "traefik.enable=true"
- "traefik.http.routers.leantime.rule=Host(`leantime.yourdomain.com`)"
- "traefik.http.routers.leantime.entrypoints=websecure"
- "traefik.http.routers.leantime.tls.certresolver=myresolver"
- "traefik.http.services.leantime.loadbalancer.server.port=80"
실행
docker-compose up -d
# 로그 확인
docker-compose logs -f leantime
# 상태 확인
docker-compose ps
초기 설정
1) 설치 마법사 실행
브라우저에서 http://localhost:8080/install로 접속합니다.
2) 회사 정보 입력
- 회사/조직 이름 입력
- 관리자 이메일 입력
- 관리자 비밀번호 설정
- 이름 입력
- Install 클릭
3) 로그인
설치 완료 후 생성한 관리자 계정으로 로그인합니다.
주요 기능 활용
프로젝트 구조
Organization (조직)
├── Client (클라이언트/고객)
│ └── Project (프로젝트)
│ ├── Goals (목표)
│ ├── Milestones (마일스톤)
│ ├── To-Dos (태스크)
│ ├── Ideas (아이디어)
│ ├── Research (리서치)
│ └── Retrospectives (회고)
목표 설정 (OKR)
Goal (목표):
├── Objective: 분기 매출 20% 증가
├── Key Result 1: 신규 고객 100명 확보
├── Key Result 2: 이탈률 5% 감소
└── Key Result 3: 평균 객단가 15% 상승
Kanban 보드 활용
기본 컬럼:
- Backlog: 대기 중인 작업
- To Do: 이번 스프린트 작업
- In Progress: 진행 중
- In Review: 검토 중
- Done: 완료
타임시트
- 태스크 상세 > Log Time 클릭
- 작업 시간 입력
- 설명 추가 (선택사항)
- 저장
리포트에서 프로젝트별/사용자별 시간 확인 가능
로드맵
- 프로젝트 > Roadmap 메뉴
- 마일스톤 추가
- 마일스톤에 태스크 연결
- 타임라인 시각화
리서치 보드
아이디어 수집 및 정리:
- 프로젝트 > Research 메뉴
- New Canvas 생성
- 아이디어 카드 추가
- 카테고리별 그룹화
레트로스펙티브
팀 회고 진행:
- 프로젝트 > Retrospectives 메뉴
- New Retro 생성
- 카테고리 설정 (Keep, Stop, Start 등)
- 팀원들이 의견 추가
- 논의 및 액션 아이템 도출
플러그인 설치
Leantime은 플러그인으로 기능을 확장할 수 있습니다:
# 플러그인 디렉토리 확인
docker exec leantime ls /var/www/html/app/Plugins
# GitHub에서 플러그인 다운로드 후 복사
docker cp ./my-plugin leantime:/var/www/html/app/Plugins/
사용 가능한 플러그인:
- Whiteboards: 화이트보드 기능
- Notes: 노트/문서 기능
- Pomodoro: 포모도로 타이머
- Custom Fields: 사용자 정의 필드
트러블슈팅
데이터베이스 연결 실패
# MySQL 상태 확인
docker-compose exec leantime-db mysql -u root -p -e "SHOW DATABASES;"
# 연결 테스트
docker-compose exec leantime-db mysql -u leantime -p leantime -e "SELECT 1"
권한 오류 (파일 업로드 등)
# 컨테이너 내부 권한 확인
docker exec leantime ls -la /var/www/html/userfiles
# 권한 수정
docker exec leantime chown -R www-data:www-data /var/www/html/userfiles
docker exec leantime chown -R www-data:www-data /var/www/html/public/userfiles
docker exec leantime chown -R www-data:www-data /var/www/html/storage/logs
docker exec leantime chmod -R 775 /var/www/html/userfiles
docker exec leantime chmod -R 775 /var/www/html/public/userfiles
docker exec leantime chmod -R 775 /var/www/html/storage/logs
설치 페이지가 계속 나타남
# 설치 완료 확인
docker exec leantime-db mysql -u leantime -p leantime -e "SELECT * FROM zp_settings WHERE key='installed';"
# 수동으로 설치 완료 표시
docker exec leantime-db mysql -u leantime -p leantime -e "INSERT INTO zp_settings (key, value) VALUES ('installed', 'true') ON DUPLICATE KEY UPDATE value='true';"
느린 성능
# PHP 설정 최적화
services:
leantime:
environment:
PHP_MEMORY_LIMIT: 256M
PHP_MAX_EXECUTION_TIME: 300
백업 및 복원
데이터베이스 백업
# MySQL 덤프
docker-compose exec leantime-db mysqldump -u root -p leantime > leantime_backup_$(date +%Y%m%d).sql
# 복원
cat leantime_backup.sql | docker-compose exec -T leantime-db mysql -u root -p leantime
파일 백업
# 사용자 파일 백업
docker run --rm \
-v leantime_leantime-userfiles:/userfiles \
-v leantime_leantime-public-userfiles:/public-userfiles \
-v $(pwd):/backup \
alpine tar czf /backup/leantime_files_$(date +%Y%m%d).tar.gz /userfiles /public-userfiles
전체 백업 스크립트
#!/bin/bash
BACKUP_DIR="/backups/leantime/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 데이터베이스
docker-compose exec -T leantime-db mysqldump -u root -p${MYSQL_ROOT_PASSWORD} leantime > $BACKUP_DIR/database.sql
# 사용자 파일
docker run --rm \
-v leantime_leantime-userfiles:/userfiles \
-v leantime_leantime-public-userfiles:/public-userfiles \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/files.tar.gz /userfiles /public-userfiles
# 플러그인
docker run --rm \
-v leantime_leantime-plugins:/plugins \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/plugins.tar.gz /plugins
echo "Backup completed: $BACKUP_DIR"
업그레이드
# 백업 먼저 수행
./backup.sh
# 최신 이미지 가져오기
docker-compose pull
# 서비스 재시작
docker-compose down
docker-compose up -d
# 업데이트 확인
docker-compose logs leantime | grep -i "update\|migration"
환경 변수 전체 목록
| 변수 | 설명 | 기본값 |
|---|---|---|
| LEAN_DB_HOST | DB 호스트 | localhost |
| LEAN_DB_USER | DB 사용자 | – |
| LEAN_DB_PASSWORD | DB 비밀번호 | – |
| LEAN_DB_DATABASE | DB 이름 | leantime |
| LEAN_SESSION_PASSWORD | 세션 암호화 키 (필수) | – |
| LEAN_SITENAME | 사이트 이름 | Leantime |
| LEAN_LANGUAGE | 기본 언어 | en-US |
| LEAN_DEFAULT_TIMEZONE | 기본 시간대 | UTC |
| LEAN_EMAIL_SMTP_ENABLED | SMTP 활성화 | false |
| LEAN_EMAIL_SMTP_HOST | SMTP 서버 | – |
| LEAN_EMAIL_SMTP_PORT | SMTP 포트 | 587 |