별고래 분석실 — Umami로 방문자 통계

작성자

카테고리:

별고래 분석실 — Umami로 방문자 통계

셀프호스팅 구축기 5편. 데이터 주권을 미니PC로 가져오기.


TL;DR

  • Google Analytics 무료 = 사장님 방문자 데이터를 Google 서버에 줌 + 쿠키 동의 팝업 강제
  • Umami self-hosted = 미니PC에 자체 분석. 쿠키 0, 데이터 본인 소유, GDPR 자동 면제
  • Docker Compose 5분. WP에 트래커 한 줄 자동 주입 = 끝
  • 화면: 방문자 수·인기 글·유입 경로·기기·국가·체류 시간

1. Google Analytics의 보이지 않는 비용

항목 Google Analytics 4 Umami self-hosted
비용 무료 (개인 사용) 무료 (오픈소스)
데이터 소유 Google 본인 미니PC
쿠키 동의 팝업 필수 (GDPR/CCPA) 불필요 (쿠키 0)
페이지 로딩 부하 ~50KB JS ~2KB JS
사용자 추적 크로스 사이트 (Google 광고 연계) 같은 사이트 내만
한국 PIPA 대응 까다로움 자동 면제
설정 복잡도 1시간+ 5분

Google Analytics는 진짜 비용을 사용자(방문자)에게 외부화한다. 방문자가 사장님 사이트 들어왔다고 Google이 그 데이터 다 받아가는 게 정상인가? 1인 블로그라면 우리가 직접 운영하는 게 옳다.


2. 구조



방문자 브라우저가 별고래 페이지 받으면 head의 <script defer src="https://analytics.sticknstone.org/script.js" data-website-id="..."> 가 실행 → Umami에 비동기 요청 → Umami가 Postgres에 기록. 페이지 표시는 안 막힘.


3. Docker Compose

/home/user/umami/docker-compose.yml:

services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgresql://umami:${DB_PASSWORD}@db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: ${APP_SECRET}
    ports:
      - "3001:3000"

  db:
    image: postgres:16-alpine
    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"]
      interval: 5s
      timeout: 5s
      retries: 6

volumes:
  umami_db:

.env:

APP_SECRET=$(openssl rand -hex 32)
DB_PASSWORD=$(openssl rand -hex 24)

가동:

cd /home/user/umami
docker compose up -d
curl -I http://localhost:3001  # HTTP/1.1 200

기본 로그인: admin / umami. 즉시 비밀번호 변경.


4. 별고래 등록 + 트래커 받기

Umami 대시보드 → Websites → Add Website:

필드
Name 별고래 항해일지
Domain sticknstone.org

Save → 사이트 클릭 → Edit → Tracking Code:

<script defer src="https://analytics.sticknstone.org/script.js" data-website-id="1892c870-dd4d-4ce7-9fd6-2635f8ef6220"></script>

5. WP에 자동 주입 — mu-plugin

매 글마다 사장님이 코드 박는 게 아니라 자동.

/var/www/html/wp-content/mu-plugins/umami-tracker.php:

<?php
/**
 * Plugin Name: Umami Analytics Tracker
 * Description: Injects Umami tracker into front-end pages. Excludes logged-in users.
 */
if (!defined('ABSPATH')) exit;

add_action('wp_head', function () {
    if (is_admin()) return;
    if (is_user_logged_in()) return;  // 사장님 본인 방문은 제외
    ?>
    <script defer src="https://analytics.sticknstone.org/script.js" data-website-id="1892c870-dd4d-4ce7-9fd6-2635f8ef6220"></script>
    <?php
}, 100);

is_user_logged_in() 체크 = 사장님이 자기 글 미리보기 한 횟수가 통계에 안 잡힘. 의외로 중요.


6. 대시보드에서 보이는 것

화면 데이터
Overview 일·주·월별 방문자·페이지뷰·세션·체류 시간
Pages 인기 글 순위
Referrers 유입 경로 (구글·트위터·다른 사이트)
Browsers 크롬·사파리·파이어폭스 비율
OS 윈도우·맥·iOS·안드로이드
Devices 데스크탑·모바일·태블릿
Countries 국가별 방문자
Languages 브라우저 언어
Events 사장님이 정의한 클릭·다운로드 추적

5초마다 자동 갱신. Realtime 메뉴 = 지금 이 순간 누가 어느 페이지 보고 있나.


7. 도메인 연결과 함께 처리해야 하는 이유

처음 트래커 받으면 URL이 http://192.168.0.x:3001/script.js (LAN IP). 이건:
– HTTP → 브라우저 Mixed Content 차단
– LAN IP → 외부 방문자 PC에서 해석 불가

Umami는 도메인 연결(9편) 후에 활성화. analytics.sticknstone.org로 외부 노출돼야 작동.


FAQ

Q. Umami 무료 클라우드 플랜은?
Umami Cloud는 월 $9~. self-hosted는 무제한 무료. 미니PC 있으면 self-hosted가 답.

Q. Google Analytics에서 마이그레이션 가능?
과거 데이터 import 없음. 새 시작. 단 두 도구 동시 가동도 가능 (트래커 둘 다 박음).

Q. 한국 PIPA(개인정보보호법) 신경 써야 하나?
Umami는 IP 주소를 저장하지 않음 (해시만), 쿠키 없음. PIPA 면제 대상.

Q. 모바일 앱은?
공식 앱 없음. 모바일 웹은 반응형이라 폰에서도 잘 보임.

Q. 데이터를 CSV로 추출 가능?
대시보드에서 CSV·JSON export. API도 제공.


다음 편 예고

6편 — 도메인 사기: Cloudflare Registrar. 가비아·후이즈 두고 Cloudflare에서 산 이유 (가격·관리 통합·향후 Tunnel 연결).


한 줄 정리

Google Analytics의 진짜 비용은 사용자 데이터 외부화. Umami self-hosted = 미니PC에 5분 Docker + WP mu-plugin 자동 주입 = 데이터 주권 + 쿠키 없음 + 같은 정보.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다