개요
Focalboard는 Mattermost에서 개발한 오픈소스, 다국어 지원, 셀프호스팅 가능한 프로젝트 관리 도구입니다. Trello, Notion, Asana의 대안으로 설계되었으며, 개인 및 팀의 작업을 정의, 구성, 추적, 관리하는 데 도움을 줍니다. 가볍고 빠른 UI로 심플한 환경에서도 원활하게 동작합니다.
Focalboard의 핵심 철학
Focalboard는 “데이터 주권과 커스터마이제이션”을 핵심 가치로, SaaS 도구에 의존하지 않고 자체 서버에서 완전한 제어권을 가질 수 있도록 설계되었습니다. Trello의 직관성과 Notion의 유연성을 결합했습니다.
에디션 종류
| 에디션 | 설명 |
|---|---|
| Personal Desktop | 단독 사용자용 macOS/Windows/Linux 데스크톱 앱 |
| Personal Server | 개발/개인용 멀티유저 서버 |
| Mattermost Boards | Mattermost 플랫폼 내장 버전 (채팅 통합) |
주요 특징
| 기능 | 설명 |
|---|---|
| Kanban 보드 | 카드 기반 작업 관리, 드래그 앤 드롭 |
| 테이블 뷰 | 스프레드시트 스타일 대량 편집 |
| 캘린더 뷰 | 날짜 기반 작업 시각화 |
| 갤러리 뷰 | 이미지 중심 시각적 레이아웃 |
| 커스텀 속성 | 날짜, 텍스트, 숫자, 선택 필드 등 |
| 필터 & 뷰 저장 | 무제한 필터 뷰 생성 및 저장 |
| 템플릿 | 프로젝트 시작을 위한 사전 정의 템플릿 |
| 공유 보드 | 링크로 읽기 전용 보드 공유 |
| 멀티보드 | 여러 보드 동시 관리 |
| 실시간 협업 | 팀원과 실시간 동기화 |
뷰 타입 상세
| 뷰 | 용도 | 적합한 상황 |
|---|---|---|
| Board (Kanban) | 워크플로우 시각화 | 상태별 작업 추적 |
| Table | 상세 데이터 관리 | 대량 편집, 모든 속성 확인 |
| Calendar | 일정 관리 | 마감일 기반 계획 |
| Gallery | 비주얼 프로젝트 | 디자인, 무드보드 |
프로젝트 관리 도구 비교
| 기능 | Focalboard | Trello | Notion | Asana |
|---|---|---|---|---|
| 오픈소스 | ✅ | ❌ | ❌ | ❌ |
| 셀프호스팅 | ✅ | ❌ | ❌ | ❌ |
| 무료 사용 | ✅ | 제한적 | 제한적 | 제한적 |
| Kanban 보드 | ✅ | ✅ | ✅ | ✅ |
| 테이블 뷰 | ✅ | ❌ | ✅ | ✅ |
| 캘린더 뷰 | ✅ | 유료 | ✅ | ✅ |
| 갤러리 뷰 | ✅ | ❌ | ✅ | ❌ |
| 커스텀 필드 | ✅ | 유료 | ✅ | ✅ |
| 가벼움 | ✅ | ✅ | ❌ | ❌ |
시스템 요구 사항
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| RAM | 512MB | 1GB 이상 |
| CPU | 1 코어 | 2 코어 이상 |
| 저장소 | 1GB | 5GB 이상 |
| Docker | 20.10+ | 최신 버전 |
Focalboard는 매우 가볍기 때문에 Raspberry Pi에서도 실행 가능합니다.
Docker Compose 설치
방법 1: 기본 설치 (SQLite)
가장 간단한 설치 방법입니다:
mkdir -p ~/focalboard && cd ~/focalboard
# 데이터 디렉토리 생성
mkdir -p data
# 컨테이너 실행
docker run -d \
--name focalboard \
-p 8000:8000 \
-v $(pwd)/data:/opt/focalboard/data \
--restart unless-stopped \
mattermost/focalboard
방법 2: Docker Compose (권장)
1) 기본 구성 (SQLite)
version: "3.8"
services:
focalboard:
image: mattermost/focalboard:latest
container_name: focalboard
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- focalboard-data:/opt/focalboard/data
environment:
- FOCALBOARD_PORT=8000
volumes:
focalboard-data:
2) PostgreSQL 구성 (프로덕션 권장)
.env 파일:
# PostgreSQL
POSTGRES_USER=focalboard
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=focalboard
# Focalboard
FOCALBOARD_PORT=8000
docker-compose.yml:
version: "3.8"
services:
focalboard-db:
image: postgres:15-alpine
container_name: focalboard-db
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- focalboard-db-data:/var/lib/postgresql/data
networks:
- focalboard-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
focalboard:
image: mattermost/focalboard:latest
container_name: focalboard
restart: unless-stopped
ports:
- "8000:8000"
environment:
FOCALBOARD_PORT: ${FOCALBOARD_PORT}
volumes:
- focalboard-data:/opt/focalboard/data
- ./config.json:/opt/focalboard/config.json:ro
depends_on:
focalboard-db:
condition: service_healthy
networks:
- focalboard-network
volumes:
focalboard-db-data:
focalboard-data:
networks:
focalboard-network:
driver: bridge
config.json:
{
"serverRoot": "http://localhost:8000",
"port": 8000,
"dbtype": "postgres",
"dbconfig": "postgres://focalboard:your_secure_password@focalboard-db:5432/focalboard?sslmode=disable",
"useSSL": false,
"webpath": "./pack",
"filespath": "/opt/focalboard/data/files",
"telemetry": false,
"prometheusaddress": "",
"session_expire_time": 2592000,
"session_refresh_time": 18000,
"localOnly": false,
"enableLocalMode": true,
"localModeSocketLocation": "/var/tmp/focalboard_local.socket"
}
3) 실행
docker-compose up -d
# 로그 확인
docker-compose logs -f focalboard
# 상태 확인
docker-compose ps
Nginx 리버스 프록시 설정
version: "3.8"
services:
focalboard:
image: mattermost/focalboard:latest
container_name: focalboard
restart: unless-stopped
volumes:
- focalboard-data:/opt/focalboard/data
networks:
- focalboard-network
nginx:
image: nginx:alpine
container_name: focalboard-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs:/etc/nginx/certs:ro
depends_on:
- focalboard
networks:
- focalboard-network
volumes:
focalboard-data:
networks:
focalboard-network:
driver: bridge
nginx.conf:
server {
listen 80;
server_name focalboard.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name focalboard.yourdomain.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
location / {
proxy_pass http://focalboard:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Traefik 리버스 프록시 설정
services:
focalboard:
image: mattermost/focalboard:latest
container_name: focalboard
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.focalboard.rule=Host(`focalboard.yourdomain.com`)"
- "traefik.http.routers.focalboard.entrypoints=websecure"
- "traefik.http.routers.focalboard.tls.certresolver=myresolver"
- "traefik.http.services.focalboard.loadbalancer.server.port=8000"
volumes:
- focalboard-data:/opt/focalboard/data
networks:
- focalboard-network
- traefik-network
초기 설정
1) 웹 접속
브라우저에서 http://localhost:8000으로 접속합니다.
2) 계정 생성
- Sign up 클릭
- 이메일, 사용자명, 비밀번호 입력
- 계정 생성 완료
3) 첫 보드 생성
- + Add board 클릭
- 템플릿 선택 또는 빈 보드 생성
- 보드 이름 입력
주요 기능 활용
커스텀 속성 추가
카드 열기 > + Add a property > 속성 유형 선택:
- Text: 텍스트 필드
- Number: 숫자
- Select: 단일 선택
- Multi-Select: 다중 선택
- Date: 날짜
- Person: 담당자
- Checkbox: 체크박스
- URL: 링크
- Email: 이메일
- Phone: 전화번호
- Created Time: 생성 시간
- Updated Time: 수정 시간
커스텀 뷰 생성
1. 보드 상단 + 클릭
2. 뷰 타입 선택 (Board, Table, Calendar, Gallery)
3. 필터 설정:
- Filter > Add filter
- 속성 선택 > 조건 선택 > 값 입력
4. 정렬 설정:
- Sort > 속성 선택 > 오름차순/내림차순
5. 뷰 저장
팀 협업
- Share board 클릭
- 팀원 이메일로 초대 또는
- 공유 링크 생성 (읽기 전용 옵션)
Mattermost 통합
Mattermost와 함께 사용하면:
- 채널별 보드 연결
- 채팅에서 바로 작업 생성
- 실시간 알림
활용 사례
1. 스프린트 관리
보드 구조:
├── Sprint Backlog (백로그)
├── To Do (할 일)
├── In Progress (진행 중)
├── Review (검토)
└── Done (완료)
2. 콘텐츠 캘린더
뷰 설정:
- Kanban: 상태별 콘텐츠 관리
- Calendar: 발행 일정 시각화
- Gallery: 썸네일 미리보기
3. CRM (고객 관계 관리)
속성 설정:
- Company: 회사명
- Contact: 담당자
- Stage: 영업 단계 (Lead, Qualified, Proposal, Closed)
- Value: 거래 금액
- Next Action: 다음 조치
4. OKR 추적
구조:
├── Objective (목표)
│ ├── Key Result 1 (핵심 결과)
│ ├── Key Result 2
│ └── Key Result 3
트러블슈팅
컨테이너 시작 실패
# 로그 확인
docker logs focalboard
# 데이터 볼륨 권한 확인
docker exec focalboard ls -la /opt/focalboard/data
PostgreSQL 연결 실패
# DB 상태 확인
docker-compose exec focalboard-db psql -U focalboard -d focalboard -c "SELECT 1"
# config.json 연결 문자열 확인
cat config.json | grep dbconfig
WebSocket 연결 오류
리버스 프록시 설정에서 WebSocket 업그레이드 헤더가 올바르게 설정되었는지 확인:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
파일 업로드 실패
# 파일 디렉토리 권한 확인
docker exec focalboard ls -la /opt/focalboard/data/files
# 권한 수정
docker exec focalboard chmod 755 /opt/focalboard/data/files
백업 및 복원
SQLite 백업
# 데이터 볼륨 백업
docker run --rm -v focalboard_focalboard-data:/data -v $(pwd):/backup alpine tar czf /backup/focalboard_backup_$(date +%Y%m%d).tar.gz /data
PostgreSQL 백업
# 데이터베이스 백업
docker-compose exec focalboard-db pg_dump -U focalboard focalboard > focalboard_backup_$(date +%Y%m%d).sql
# 복원
cat focalboard_backup.sql | docker-compose exec -T focalboard-db psql -U focalboard focalboard
보드 내보내기/가져오기
- 보드 메뉴 > Export board archive
.boardarchive파일 다운로드- 다른 인스턴스에서 Import archive로 복원
업그레이드
# 백업 먼저 수행
./backup.sh
# 최신 이미지 가져오기
docker-compose pull
# 재시작
docker-compose down
docker-compose up -d
# 로그 확인
docker-compose logs -f focalboard
2026년 지원 상태
Focalboard는 2026년 현재 커뮤니티에 의해 계속 유지보수되고 있습니다. Mattermost 에코시스템의 일부로 안정적이고 신뢰할 수 있으며, 주로 보안 패치와 성능 개선에 초점을 맞추고 있습니다.