Focalboard: Trello와 Notion의 오픈소스 대안 Docker 설치 가이드




개요

Focalboard는 Mattermost에서 개발한 오픈소스, 다국어 지원, 셀프호스팅 가능한 프로젝트 관리 도구입니다. Trello, Notion, Asana의 대안으로 설계되었으며, 개인 및 팀의 작업을 정의, 구성, 추적, 관리하는 데 도움을 줍니다. 가볍고 빠른 UI로 심플한 환경에서도 원활하게 동작합니다.

Focalboard의 핵심 철학

Focalboard는 “데이터 주권과 커스터마이제이션”을 핵심 가치로, SaaS 도구에 의존하지 않고 자체 서버에서 완전한 제어권을 가질 수 있도록 설계되었습니다. Trello의 직관성과 Notion의 유연성을 결합했습니다.

에디션 종류

에디션설명
Personal Desktop단독 사용자용 macOS/Windows/Linux 데스크톱 앱
Personal Server개발/개인용 멀티유저 서버
Mattermost BoardsMattermost 플랫폼 내장 버전 (채팅 통합)

주요 특징

기능설명
Kanban 보드카드 기반 작업 관리, 드래그 앤 드롭
테이블 뷰스프레드시트 스타일 대량 편집
캘린더 뷰날짜 기반 작업 시각화
갤러리 뷰이미지 중심 시각적 레이아웃
커스텀 속성날짜, 텍스트, 숫자, 선택 필드 등
필터 & 뷰 저장무제한 필터 뷰 생성 및 저장
템플릿프로젝트 시작을 위한 사전 정의 템플릿
공유 보드링크로 읽기 전용 보드 공유
멀티보드여러 보드 동시 관리
실시간 협업팀원과 실시간 동기화

뷰 타입 상세

용도적합한 상황
Board (Kanban)워크플로우 시각화상태별 작업 추적
Table상세 데이터 관리대량 편집, 모든 속성 확인
Calendar일정 관리마감일 기반 계획
Gallery비주얼 프로젝트디자인, 무드보드

프로젝트 관리 도구 비교

기능FocalboardTrelloNotionAsana
오픈소스
셀프호스팅
무료 사용제한적제한적제한적
Kanban 보드
테이블 뷰
캘린더 뷰유료
갤러리 뷰
커스텀 필드유료
가벼움

시스템 요구 사항

항목최소 사양권장 사양
RAM512MB1GB 이상
CPU1 코어2 코어 이상
저장소1GB5GB 이상
Docker20.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) 계정 생성

  1. Sign up 클릭
  2. 이메일, 사용자명, 비밀번호 입력
  3. 계정 생성 완료

3) 첫 보드 생성

  1. + Add board 클릭
  2. 템플릿 선택 또는 빈 보드 생성
  3. 보드 이름 입력

주요 기능 활용

커스텀 속성 추가

카드 열기 > + 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. 뷰 저장

팀 협업

  1. Share board 클릭
  2. 팀원 이메일로 초대 또는
  3. 공유 링크 생성 (읽기 전용 옵션)

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

보드 내보내기/가져오기

  1. 보드 메뉴 > Export board archive
  2. .boardarchive 파일 다운로드
  3. 다른 인스턴스에서 Import archive로 복원

업그레이드

# 백업 먼저 수행
./backup.sh

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

# 재시작
docker-compose down
docker-compose up -d

# 로그 확인
docker-compose logs -f focalboard

2026년 지원 상태

Focalboard는 2026년 현재 커뮤니티에 의해 계속 유지보수되고 있습니다. Mattermost 에코시스템의 일부로 안정적이고 신뢰할 수 있으며, 주로 보안 패치와 성능 개선에 초점을 맞추고 있습니다.




댓글 남기기