Metabase는 누구나 SQL 없이도 데이터를 시각화하고 대시보드를 만들 수 있는 오픈소스 BI(Business Intelligence) 도구입니다. 드래그 앤 드롭으로 차트를 생성하고, 복잡한 쿼리도 시각적 에디터로 작성할 수 있습니다. PostgreSQL, MySQL, MongoDB, BigQuery 등 다양한 데이터베이스를 연결하여 실시간 대시보드를 구축할 수 있습니다. GitHub Stars 40K+로 가장 인기 있는 오픈소스 BI 도구입니다.
Metabase 주요 특징
Metabase는 비개발자도 쉽게 사용할 수 있는 BI 도구입니다.
데이터 시각화
- 노코드 쿼리 빌더: SQL 없이 클릭으로 쿼리 작성
- 다양한 차트: 라인, 바, 파이, 지도, 퍼널 등
- 대시보드: 여러 차트를 하나의 대시보드로 구성
- 필터: 인터랙티브 필터로 실시간 데이터 탐색
- 드릴다운: 데이터 상세 분석
협업 기능
- 대시보드 공유 (링크, 임베드)
- 알림 설정 (이메일, Slack)
- 스케줄 리포트
- 권한 관리
데이터베이스 지원
- PostgreSQL, MySQL, MariaDB
- MongoDB, BigQuery, Snowflake
- Redshift, Presto, Druid
- SQLite, SQL Server 등 20+ 지원
사전 요구 사항
- Docker 및 Docker Compose 설치
- 최소 2GB RAM (4GB 권장)
- 10GB 이상 저장 공간
Docker Compose로 Metabase 설치
기본 설치
# docker-compose.yml
services:
metabase:
image: metabase/metabase:latest
container_name: metabase
restart: unless-stopped
ports:
- "3000:3000"
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_HOST: metabase-db
MB_DB_PORT: 5432
MB_DB_USER: metabase
MB_DB_PASS: ${DB_PASSWORD}
volumes:
- metabase-data:/metabase-data
depends_on:
- metabase-db
metabase-db:
image: postgres:16-alpine
container_name: metabase-db
restart: unless-stopped
environment:
POSTGRES_DB: metabase
POSTGRES_USER: metabase
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- metabase-postgres:/var/lib/postgresql/data
volumes:
metabase-data:
metabase-postgres:
환경 변수 파일
# .env
DB_PASSWORD=your_secure_password
설치 및 실행
# 디렉토리 생성
mkdir metabase && cd metabase
# docker-compose.yml 및 .env 생성
# 컨테이너 실행
docker compose up -d
# 로그 확인 (첫 실행 시 초기화에 1-2분 소요)
docker compose logs -f metabase
# 브라우저에서 접속
# http://localhost:3000
초기 설정
http://localhost:3000접속- “Let’s get started” 클릭
- 언어 선택 (영어/한국어 지원)
- 관리자 계정 생성 (이메일, 비밀번호)
- 데이터베이스 연결 (나중에 설정 가능)
- 설정 완료!
데이터베이스 연결
내부 PostgreSQL 연결 (Docker 네트워크)
Metabase와 같은 Docker 네트워크에 있는 DB 연결:
Host: your-db-container-name
Port: 5432
Database name: your_database
Username: your_user
Password: your_password
외부 데이터베이스 연결
Settings → Admin → Databases → Add database에서:
Database type: PostgreSQL
Display name: Production DB
Host: your-db-host.example.com
Port: 5432
Database name: analytics
Username: readonly_user
Password: ****
권장: 분석용 읽기 전용(Read-Only) 사용자 생성
고급 설정
프로덕션 환경 (Traefik 연동)
# docker-compose.yml
services:
metabase:
image: metabase/metabase:v0.50.0
container_name: metabase
restart: always
expose:
- "3000"
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_HOST: metabase-db
MB_DB_PORT: 5432
MB_DB_USER: metabase
MB_DB_PASS: ${DB_PASSWORD}
MB_SITE_URL: https://metabase.yourdomain.com
JAVA_OPTS: "-Xmx2g -Xms1g"
depends_on:
metabase-db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.metabase.rule=Host(`metabase.yourdomain.com`)"
- "traefik.http.routers.metabase.entrypoints=websecure"
- "traefik.http.routers.metabase.tls.certresolver=letsencrypt"
- "traefik.http.services.metabase.loadbalancer.server.port=3000"
networks:
- metabase-net
- traefik-public
metabase-db:
image: postgres:16-alpine
container_name: metabase-db
restart: always
environment:
POSTGRES_DB: metabase
POSTGRES_USER: metabase
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- metabase-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U metabase"]
interval: 10s
retries: 5
networks:
- metabase-net
volumes:
metabase-postgres:
networks:
metabase-net:
driver: bridge
traefik-public:
external: true
Nginx 리버스 프록시
server {
listen 443 ssl http2;
server_name metabase.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/metabase.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/metabase.yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
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;
}
}
관리 명령어
# 로그 확인
docker compose logs -f metabase
# 데이터베이스 백업
docker compose exec metabase-db pg_dump -U metabase metabase > backup_$(date +%Y%m%d).sql
# 업데이트
docker compose pull
docker compose up -d
# 재시작
docker compose restart metabase
# 메모리 사용량 확인
docker stats metabase
주요 환경 변수
| 변수 | 설명 | 기본값 |
|---|---|---|
| MB_DB_TYPE | 앱 DB 타입 | h2 |
| MB_DB_HOST | DB 호스트 | – |
| MB_DB_PORT | DB 포트 | – |
| MB_DB_DBNAME | DB 이름 | – |
| MB_DB_USER | DB 사용자 | – |
| MB_DB_PASS | DB 비밀번호 | – |
| MB_SITE_URL | 외부 URL | – |
| JAVA_OPTS | JVM 옵션 | – |
문제 해결
OutOfMemory 오류
environment:
JAVA_OPTS: "-Xmx4g -Xms2g"
대시보드 로딩 느림
- Metabase Admin → Settings → Caching 활성화
- 자주 사용하는 쿼리에 캐시 설정
H2 데이터베이스 경고
프로덕션에서는 반드시 PostgreSQL 사용:
⚠️ H2 is not recommended for production use
마무리
Metabase는 비개발자도 쉽게 사용할 수 있는 강력한 BI 도구입니다. SQL을 몰라도 클릭 몇 번으로 데이터를 시각화하고 대시보드를 만들 수 있습니다. Docker로 쉽게 설치하고, 다양한 데이터베이스를 연결하여 조직 전체가 데이터 기반 의사결정을 할 수 있습니다.
참고 링크
- 공식 사이트: https://www.metabase.com
- GitHub: https://github.com/metabase/metabase
- Docker Hub: https://hub.docker.com/r/metabase/metabase
- 문서: https://www.metabase.com/docs