Umami는 가장 심플하고 가벼운 Google Analytics 대안입니다. Next.js로 구축되어 빠르고, 깔끔한 UI로 필요한 지표만 보여줍니다. 쿠키를 사용하지 않아 GDPR 걱정 없이 사용할 수 있으며, 설치와 설정이 매우 간단합니다. 리소스 사용량이 적어 Raspberry Pi에서도 실행 가능합니다. GitHub Stars 25K+로 가장 인기 있는 GA 대안 중 하나입니다.
Umami 주요 특징
Umami는 심플함을 최우선으로 합니다.
핵심 기능
- 실시간 분석: 방문자 실시간 확인
- 페이지뷰 & 방문자: 기본 트래픽 지표
- 유입 경로: 레퍼러, 검색 엔진
- 지역 & 기기: 국가, 브라우저, OS, 디바이스
- 이벤트 추적: 커스텀 이벤트 수집
- UTM 파라미터: 캠페인 추적
프라이버시 & 성능
- 쿠키 사용 안 함
- GDPR/CCPA 준수
- 가벼운 스크립트 (< 2KB)
- 빠른 로딩
기술적 장점
- Next.js 기반 (빠른 UI)
- PostgreSQL/MySQL 지원
- 다중 사이트 관리
- 팀 협업 기능
- REST API
- 다크 모드
사전 요구 사항
- Docker 및 Docker Compose 설치
- 최소 512MB RAM
- PostgreSQL 또는 MySQL
Docker Compose로 Umami 설치
기본 설치 (PostgreSQL)
# docker-compose.yml
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
restart: unless-stopped
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:${DB_PASSWORD}@umami-db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
depends_on:
umami-db:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/heartbeat || exit 1"]
interval: 5s
timeout: 5s
retries: 5
umami-db:
image: postgres:16-alpine
container_name: umami-db
restart: unless-stopped
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- umami-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db:
환경 변수 파일
# .env
DB_PASSWORD=your_secure_password
APP_SECRET=your_random_secret_string
시크릿 생성:
openssl rand -hex 32
설치 및 실행
# 디렉토리 생성
mkdir umami && cd umami
# docker-compose.yml 및 .env 생성
# 컨테이너 실행
docker compose up -d
# 로그 확인
docker compose logs -f umami
# 브라우저에서 접속
# http://localhost:3000
# 기본 로그인: admin / umami
초기 설정
1. 기본 비밀번호 변경
http://localhost:3000접속admin/umami로 로그인- Settings → Profile → Change password
- 새 비밀번호 설정
2. 웹사이트 추가
- Settings → Websites → Add website
- Name: 사이트 이름
- Domain: example.com
- “Save” 클릭
- “Edit” → “Tracking code” → 코드 복사
3. 추적 코드 설치
웹사이트 <head> 태그에 추가:
<script defer src="https://umami.yourdomain.com/script.js"
data-website-id="your-website-id"></script>
고급 설정
Redis 캐시 추가 (성능 향상)
# docker-compose.yml
services:
umami:
environment:
DATABASE_URL: postgresql://umami:${DB_PASSWORD}@umami-db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
REDIS_URL: redis://umami-redis:6379
depends_on:
- umami-db
- umami-redis
umami-redis:
image: redis:alpine
container_name: umami-redis
restart: unless-stopped
umami-db:
# ... (이전과 동일)
Traefik 연동
# docker-compose.yml
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
restart: unless-stopped
expose:
- "3000"
environment:
DATABASE_URL: postgresql://umami:${DB_PASSWORD}@umami-db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
TRACKER_SCRIPT_NAME: stats # 애드블로커 우회
labels:
- "traefik.enable=true"
- "traefik.http.routers.umami.rule=Host(`stats.yourdomain.com`)"
- "traefik.http.routers.umami.entrypoints=websecure"
- "traefik.http.routers.umami.tls.certresolver=letsencrypt"
- "traefik.http.services.umami.loadbalancer.server.port=3000"
networks:
- umami-net
- traefik-public
networks:
umami-net:
driver: bridge
traefik-public:
external: true
Caddy 리버스 프록시
# Caddyfile
stats.yourdomain.com {
encode zstd gzip
reverse_proxy umami:3000 {
health_uri /api/heartbeat
health_interval 10s
health_timeout 2s
}
}
Nginx 리버스 프록시
server {
listen 443 ssl http2;
server_name stats.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/stats.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stats.yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
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;
}
}
주요 환경 변수
| 변수 | 설명 | 필수 |
|---|---|---|
| DATABASE_URL | DB 연결 문자열 | ✅ |
| DATABASE_TYPE | postgresql 또는 mysql | ✅ |
| APP_SECRET | 세션 암호화 키 | ✅ |
| REDIS_URL | Redis 연결 (캐시) | ❌ |
| TRACKER_SCRIPT_NAME | 스크립트 파일명 변경 | ❌ |
| DISABLE_TELEMETRY | 텔레메트리 비활성화 | ❌ |
커스텀 이벤트 추적
JavaScript
// 버튼 클릭 추적
umami.track('signup-button-click');
// 데이터와 함께 추적
umami.track('purchase', { product: 'T-Shirt', price: 29.99 });
HTML 속성
<button data-umami-event="signup-click">Sign Up</button>
<button data-umami-event="purchase" data-umami-event-product="T-Shirt">Buy</button>
관리 명령어
# 로그 확인
docker compose logs -f umami
# 데이터베이스 백업
docker compose exec umami-db pg_dump -U umami umami > backup_$(date +%Y%m%d).sql
# 업데이트
docker compose pull
docker compose up -d
# 재시작
docker compose restart umami
# 헬스 체크
curl http://localhost:3000/api/heartbeat
문제 해결
기본 계정으로 로그인 불가
데이터베이스가 초기화되지 않았을 수 있습니다:
docker compose down -v
docker compose up -d
애드블로커에 의해 차단됨
스크립트 이름을 analytics가 아닌 이름으로 변경:
environment:
TRACKER_SCRIPT_NAME: stats
그리고 추적 코드도 변경:
<script src="https://stats.yourdomain.com/stats.js" ...></script>
localhost 접근만 허용하기
리버스 프록시 뒤에서 실행 시:
ports:
- "127.0.0.1:3000:3000"
Plausible vs Umami 비교
| 항목 | Umami | Plausible |
|---|---|---|
| 메모리 사용량 | 낮음 (~100MB) | 높음 (~500MB+) |
| 데이터베이스 | PostgreSQL/MySQL | PostgreSQL + ClickHouse |
| 설치 복잡도 | 매우 쉬움 | 보통 |
| UI | 모던, 미니멀 | 깔끔, 단순 |
| 이벤트 추적 | ✅ | ✅ |
| 목표 전환 | 기본 | 상세 |
마무리
Umami는 가장 심플하고 가벼운 GA 대안입니다. 설치가 쉽고 리소스 사용량이 적어 소규모 사이트부터 대규모 서비스까지 사용할 수 있습니다. 깔끔한 UI와 필요한 기능만 제공하여 복잡한 분석 도구가 필요 없는 경우 최적의 선택입니다.
참고 링크
- 공식 사이트: https://umami.is
- GitHub: https://github.com/umami-software/umami
- 문서: https://umami.is/docs
- Docker: ghcr.io/umami-software/umami