TrendShift · Privacy-First Web Analytics

Plausible Analytics —
쿠키 없는 웹 분석의 표준

Google Analytics를 대체하는 오픈소스 웹 분석. 쿠키·개인정보 0개, GDPR 자동 준수, 셀프호스팅 가능.

plausible/analytics · Elixir/Phoenix · AGPL-3.0 · 24.8k★ 2026-05-21 · TrendShift #16
00 — 들어가며Context

먼저, "프라이버시 우선 분석"이 뭔가?

왜 GA의 대안이 필요해졌나.

2010년대 인터넷은 "공짜 분석 도구 = Google Analytics"가 공식이었다. 그런데 GA는 사용자 데이터를 광고에 활용한다 — 즉 방문자가 진짜 상품이다. EU의 GDPR(2018)과 미국 캘리포니아 CCPA가 등장하면서, 사이트 소유자가 GA를 쓰는 것만으로 법적 리스크를 떠안는 시대가 됐다.

여기에 2023년 Google이 Universal Analytics를 강제 종료시키고 복잡한 GA4로 옮기게 만들면서 결정타. 사이트 소유자들은 "더 단순하고, 동의 배너 필요 없고, 데이터 주권이 있는" 분석 도구를 찾기 시작했다. Plausible은 이 흐름의 한가운데에서 가장 깔끔한 대안으로 떠올랐다.

Term · 용어
GDPR (General Data Protection Regulation, EU 일반 개인정보보호법)
2018년 시행. 개인 식별 정보를 수집하려면 명시적 동의가 필요하고, 위반 시 매출의 4% 또는 €2천만 중 큰 금액의 과징금. Plausible은 애초에 개인정보를 안 모은다는 설계로 동의 절차 자체를 우회한다.
Term · 용어
OLAP DB (Online Analytical Processing, 분석용 데이터베이스)
"지난 1년 매출 평균" 같은 대규모 집계 쿼리에 특화된 DB. 컬럼 지향 저장으로 일반 PostgreSQL보다 집계가 100~1000배 빠르다. Plausible은 ClickHouse를 OLAP용으로 사용.
Term · 용어
셀프호스팅 (Self-hosting)
SaaS 제공사 서버가 아니라 자기 서버에 직접 설치해서 운영하는 방식. 운영 부담을 지는 대신 데이터 100% 통제권을 얻는다. Plausible은 docker compose up 한 줄로 셀프호스팅 가능 (Community Edition).
01 — 한 줄 요약TL;DR

이 프로젝트의 핵심 메시지

한 문장으로 줄이면.

Core Message

"GA가 사용자 데이터로 돈을 벌 동안, Plausible은 구독료로 돈을 번다 — 같은 일을 더 단순하게, 쿠키 없이, 1KB 스크립트로."

Plausible의 가치는 네 가지로 정리된다 — (1) 가벼움(GA보다 54배 작은 트래커), (2) 프라이버시(쿠키 0개, 개인 식별자 0개), (3) 단순함(모든 핵심 지표가 한 페이지), (4) 오픈소스(AGPL-3.0, 셀프호스팅 가능).

단순한 "GA 카피"가 아니라, 비즈니스 모델 자체와 결별한 도구다. 데이터가 곧 상품인 모델 대신 "분석 도구"라는 상품을 직접 판다.

02 — 왜 주목받는가Why now

2026년 5월, 트렌딩에 오른 이유

시대적 배경 + 경쟁 우위.

시대적 배경 — 4가지 변곡점

  1. GA4 마이그레이션 피로감 — 2023년 Universal Analytics 종료 이후 많은 개발자가 GA4의 복잡성·UX에 좌절. "다시 단순함으로"라는 Plausible 메시지가 그 자리를 채웠다.
  2. EU 데이터 주권 흐름 — Schrems II 판결 이후 EU 기업들은 미국 클라우드를 피하려 한다. Plausible은 독일 서버에서만 처리, 데이터가 EU 밖으로 나가지 않는다.
  3. AI 트래픽 가시화 — ChatGPT·Perplexity·Claude 같은 AI 도구에서 오는 트래픽을 별도로 추적하는 기능을 빠르게 추가. 콘텐츠 제작자에게 강력한 어필.
  4. 셀프호스팅 컬쳐의 부상 — Vaultwarden, Immich, Plausible로 이어지는 "내 서버에 다 둔다" 트렌드와 정확히 맞물려 있다.

경쟁 비교 — Plausible vs GA vs Matomo

비교 항목PlausibleGoogle AnalyticsMatomo
쿠키 사용없음있음 (배너 필수)선택 가능
스크립트 크기약 1KB약 54KB약 22KB
GDPR 준수기본 준수설정 필요설정 필요
대시보드 UX단일 페이지복잡한 메뉴GA 스타일
셀프호스팅AGPL CE불가GPL
가격(클라우드)$9~19/월무료(데이터로 결제)$23~/월
Analogy · 핵심 차별점

"우리는 당신의 사용자 데이터로 돈을 벌지 않는다." Google처럼 광고로 무료 제공하는 대신 구독료를 받는다. 데이터가 곧 상품인 GA의 비즈니스 모델 자체와 결별한 제품. 사용자 입장에선 "내가 상품이 아니라 진짜 고객"이 된다.

03 — 기술 스택Stack

전체 기술 지도

백엔드 · 프론트엔드 · 트래커 · 인프라.

백엔드 — Elixir/Phoenix 생태계 (80.8%)

웹 / 실시간

  • phoenix ~> 1.8.2 — Elixir의 Rails. 실시간 통신·동시성에 강함
  • phoenix_live_view 1.1 — JS 없이 서버에서 실시간 UI 렌더링 (WebSocket 변경분 패치)
  • finch, req — 비동기 HTTP 클라이언트 (Google API, MaxMind 호출용)

데이터 · ORM

  • ecto 3.13.5 — Elixir 표준 DB 래퍼
  • ecto_ch 0.8.6 — Ecto에서 ClickHouse를 다루는 어댑터 (듀얼 DB의 핵심)
  • oban 2.20.1 — PostgreSQL 기반 백그라운드 잡 (이메일 보고서, 데이터 export, 정리 작업)

인증 · 보안

  • bcrypt_elixir — 비밀번호 해싱
  • nimble_totp — 2FA (TOTP)
  • simple_saml — SAML SSO (엔터프라이즈용)
  • siphash — 익명 user_id 생성용 해시

이메일 · 메시징

  • bamboo (+ postmark/smtp/mua) — 다양한 메일 어댑터
  • mjml, mjml_eex — 반응형 이메일 HTML 생성

관찰가능성 · 인프라 통합

  • opentelemetry — 분산 추적 표준
  • sentry — 에러 로깅
  • prom_ex — Prometheus 메트릭 export
  • locus + MaxMind DB — IP → 국가/도시 변환 (개인 식별 X)
  • libcluster — 여러 노드 클러스터링 (멀티 서버 운영)
  • site_encrypt — Let's Encrypt TLS 인증서 자동 발급/갱신

프론트엔드 — React + Tailwind (TypeScript 13.2%)

  • React + TypeScript — 대시보드 인터랙티브 부분 담당
  • Phoenix LiveView — 실시간 통계 업데이트 (WebSocket)
  • TailwindCSS — 모든 스타일링. tailwind ~> 0.4.0 Elixir 패키지로 빌드 통합
  • esbuild — 초고속 JS 번들러 (Webpack 대체)
  • Heroicons — 아이콘 시스템

트래커 — 별도 npm 패키지 (MIT 라이선스)

  • 사용자 사이트에 삽입되는 plausible.js는 메인 앱과 분리
  • tracker/ 디렉토리에서 독립 관리
  • 약 1KB — GA(54KB)의 1/54
Term · 왜 트래커만 MIT인가?
AGPL은 "코드를 수정하면 공개해야 함" 조항이 있다. 사용자 웹사이트에 AGPL 코드를 넣으면 그 사이트 전체가 AGPL의 영향을 받을 수 있다는 우려가 있어, 트래커는 의도적으로 MIT로 풀어놨다. 메인은 AGPL로 강하게 보호, 클라이언트는 MIT로 자유롭게 — 영리한 라이선스 분리.

데이터베이스 — 듀얼 DB 전략

DB용도왜 이걸 썼나
PostgreSQL 16 사용자 계정, 사이트 설정, 팀, 구독 정보 OLTP(트랜잭션) 부하, 관계형 데이터 처리. 정합성 중요한 메타데이터용
ClickHouse 24.12 페이지뷰 이벤트, 세션 데이터 (수십억 행) 컬럼 지향 OLAP. 집계 쿼리가 PostgreSQL보다 100~1000배 빠름

인프라

  • Docker — Alpine 3.22 기반 멀티 스테이지 빌드
  • Erlang/OTP 27 — BEAM VM 위에서 동작. 무중단 핫 리로드 가능
  • Docker Compose — Community Edition의 표준 배포 방식
04 — 아키텍처Design

시스템 구조와 4가지 설계 패턴

전체 구조도 → 핵심 패턴 하나하나.

시스템 구조도 — 이벤트가 들어와서 대시보드까지

┌──────────────────────────────────────────────────────────────────┐
│                  Plausible Analytics 전체 흐름                    │
└──────────────────────────────────────────────────────────────────┘

   [당신의 웹사이트]                       [Plausible 인스턴스]
   ┌─────────────────┐                    ┌──────────────────────────┐
   │  <script        │   ① 페이지 로드     │                          │
   │   plausible.js  │ ──────────────────► │  Phoenix 웹 서버         │
   │   />           │                    │  (Elixir/Erlang VM/OTP)  │
   │                 │   ② POST /api/event│                          │
   │   방문자        │ ──── (JSON) ──────►│  ┌────────────────────┐  │
   └─────────────────┘                    │  │ /api/event 핸들러  │  │
                                          │  └─────────┬──────────┘  │
                                          │            ▼             │
                                          │  ┌────────────────────┐  │
                                          │  │ 봇/스팸 필터링     │  │
                                          │  │ User-Agent 파싱    │  │
                                          │  └─────────┬──────────┘  │
                                          │            ▼             │
                                          │  ┌────────────────────┐  │
                                          │  │ IP → 국가/도시 변환│  │
                                          │  │ (locus + MaxMind)  │  │
                                          │  └─────────┬──────────┘  │
                                          │            ▼             │
                                          │  ┌────────────────────┐  │
                                          │  │ siphash로 일일     │  │
                                          │  │ 익명 user_id 생성  │  │
                                          │  │ (IP/UA 즉시 폐기)  │  │
                                          │  └─────────┬──────────┘  │
                                          │            ▼             │
                                          │  ┌──────────────────┐    │
                                          │  │   ClickHouse     │    │
                                          │  │  (이벤트 테이블) │    │
                                          │  │  timestamp/domain│    │
                                          │  │  country/browser │    │
                                          │  └──────────────────┘    │
                                          │                          │
   [대시보드 사용자]                        │  ┌──────────────────┐   │
   ┌─────────────────┐                    │  │   PostgreSQL     │   │
   │                 │  ③ 대시보드 접속   │  │  (메타 데이터)   │   │
   │  사이트 소유자  │ ─────────────────► │  │  사용자/사이트/  │   │
   │  Phoenix        │                    │  │  팀/구독         │   │
   │  LiveView       │  ④ 통계 집계 쿼리  │  └──────────────────┘   │
   │  + React        │ ◄───────────────── │                          │
   │                 │    (실시간 푸시)   │  ┌──────────────────┐   │
   └─────────────────┘                    │  │   Oban Workers   │   │
                                          │  │ 이메일 보고서/    │   │
                                          │  │ export/정리      │   │
                                          │  └──────────────────┘   │
                                          └──────────────────────────┘

패턴 1 — 듀얼 데이터베이스 (Polyglot Persistence)

"한 DB로 다 처리하지 않는다"는 결정이 Plausible 성능의 핵심이다. 메타데이터는 PostgreSQL, 이벤트는 ClickHouse로 분리한다.

Trap · 함정
모든 걸 PostgreSQL에 넣었다면

하루 1000만 페이지뷰 사이트에서 "지난 30일간 국가별 방문자 수"를 집계하려면 3억 행을 GROUP BY해야 한다. PostgreSQL은 행 기반(row-oriented)이라 이런 쿼리에 수십 초가 걸린다.

Fix · 해결책
ClickHouse로 분석 쿼리 분리

컬럼 기반(column-oriented) ClickHouse는 같은 쿼리를 0.1초 이내에 처리한다. 컬럼이 옆에 모여 있어 디스크 I/O와 캐시 효율이 압도적이다.

패턴 2 — 비식별화 by Design

"개인정보를 저장한 적이 없으면 GDPR을 어길 일도 없다"가 Plausible의 철학. 핵심 트릭은 일일 솔트 + SipHash로 매일 다른 익명 ID를 생성하는 것.

# 일일 익명 user_id 생성 의사 코드
user_id = SipHash(daily_salt + website_domain + user_ip + user_agent)

# - daily_salt: 매일 자정에 폐기되고 새로 생성됨
#   → 다음날엔 같은 사람도 다른 user_id
# - IP/User-Agent는 ID 생성 후 즉시 폐기, DB에 저장 안 됨
# - 따라서 사용자 추적이 24시간 이내로 제한됨
Analogy · 클럽 손도장 비유

나이트클럽에서 입장 시 손등에 도장을 찍는 것과 같다. 그날 안에서는 "이 사람 들어왔다 나갔다"를 알 수 있지만, 다음 날엔 도장이 사라져서 어제 그 사람인지 알 수 없다. 24시간 단위 익명 추적이라는 GDPR-친화적 설계.

패턴 3 — Phoenix LiveView로 실시간 대시보드

전통적인 SPA는 "프론트엔드가 API 폴링" 방식이다. Plausible은 서버가 LiveView 프로세스를 유지하면서 변경분만 WebSocket으로 푸시한다. 30초 폴링이 아니라 진짜 실시간이다.

패턴 4 — OTP 슈퍼바이저 트리 (장애 격리)

Erlang/OTP의 "let it crash" 철학. 이벤트 ingestion 프로세스가 죽어도 대시보드는 멀쩡하고, Oban worker가 죽어도 웹 응답엔 영향 없다. 슈퍼바이저가 자동 재시작한다.

Analogy · 빌딩 화재 방화벽

한 층에서 불이 나도 다른 층으로 번지지 않는 방화벽처럼, OTP는 프로세스를 격리한다. 한 이벤트 처리 프로세스가 예외로 죽어도 다른 수만 개의 프로세스는 영향 없이 계속 동작. 슈퍼바이저는 "관리실 알람"처럼 죽은 프로세스를 감지해 즉시 재시작.

05 — 디렉토리Repo map

레포 구조 해부

어디에 뭐가 있는지.

plausible/analytics/
├── lib/                    # Elixir 메인 코드 (전체의 80%)
│   ├── plausible/          # 도메인 로직 (사용자, 사이트, 통계 등)
│   ├── plausible_web/      # Phoenix 컨트롤러, LiveView, 라우터
│   └── plausible_release/  # 릴리즈 빌드 로직
│
├── assets/                 # 프론트엔드 자산
│   ├── js/                 # React + TypeScript 컴포넌트
│   ├── css/                # Tailwind 설정 및 커스텀 CSS
│   └── package.json        # npm 의존성
│
├── tracker/                # 별도 npm 패키지 (MIT 라이선스)
│   └── src/                # plausible.js 트래커 소스
│
├── priv/                   # Phoenix 정적 자산
│   ├── repo/migrations/    # PostgreSQL 스키마 마이그레이션
│   ├── ingest_repo/migrations/  # ClickHouse 스키마 마이그레이션
│   └── static/             # 컴파일된 JS/CSS, 이미지
│
├── config/                 # 환경별 설정
│   ├── config.exs          # 공통 설정
│   ├── runtime.exs         # 런타임 환경 변수 처리
│   └── ce.exs              # Community Edition 전용
│
├── extra/                  # 클라우드 전용 (자체 호스팅엔 없음)
│   └── lib/                # SSO, 사이트 API, 펀넬 등 프리미엄 기능
│
├── e2e/                    # Playwright E2E 테스트
├── test/                   # ExUnit 단위/통합 테스트
├── rel/                    # Elixir 릴리즈 설정 (docker-entrypoint.sh)
│
├── Dockerfile              # 멀티 스테이지 Alpine 빌드
├── mix.exs                 # Elixir 프로젝트 정의 (package.json 격)
└── mix.lock                # 의존성 잠금 파일
Analogy · 오픈코어 모델

extra/는 "오픈코어 모델"의 실제 구현 예시다. 클라우드에만 있는 기능(SSO, 펀넬, 사이트 API)을 별도 디렉토리에 격리하고, mix.exselixirc_paths(:ce)"extra/lib"를 제외하도록 설계되어 있다. 같은 코드베이스에서 두 가지 제품을 빌드하는 영리한 방법.

06 — 학습 포인트What to learn

분야별 배울 것

기술 영역마다 무엇을 가져갈지.

Elixir / Phoenix — 액터 모델 동시성

  • 액터 모델 — 스레드가 아닌 프로세스 단위 동시성, 메시지 패싱
  • OTP 슈퍼바이저 트리 — 장애 격리 + 자동 재시작 설계
  • Phoenix LiveView — 서버 사이드 실시간 UI 패러다임
  • Ecto 멀티 리포지토리 — 한 앱에서 두 DB를 다루는 패턴

실습: 로컬에서 페이지뷰 1000개를 ingestion 해보고, BEAM 프로세스 모니터(observer_cli)로 부하 분포 관찰

ClickHouse — 컬럼 지향 OLAP

  • 컬럼 지향 DB의 작동 원리 — 같은 컬럼이 옆에 모여 있는 이유
  • MergeTree 엔진과 파티셔닝 — 시계열 데이터 최적화 전략
  • 대용량 집계 쿼리 최적화 — ORDER BY 키와 PRIMARY KEY 차이
  • OLTP vs OLAP 구분 — 어떤 워크로드를 어디에 둘지

실습: priv/ingest_repo/migrations/의 스키마를 읽고 왜 특정 컬럼을 ORDER BY 키로 잡았는지 분석

Docker 멀티 스테이지 빌드

  • 빌드와 런타임 이미지 분리
  • Alpine 기반 최소 이미지 (수십 MB로 압축)
  • OTP 릴리즈 패키징 (mix release)
  • 비루트 사용자(uid 999) 실행 — 보안 모범사례

실습: Dockerfile을 분석하고 빌더 스테이지에서만 필요한 의존성과 런타임에 필요한 것을 구분

OpenTelemetry — 분산 추적

  • 분산 추적(distributed tracing) 개념
  • 메트릭/로그/트레이스 통합 (3 pillars of observability)
  • Phoenix 자동 계측 — 어떻게 콘텍스트가 전파되는가

실습: Jaeger 컨테이너 띄우고 Plausible 트레이스 시각화

Oban — PostgreSQL 백그라운드 잡

  • Redis 없이 PostgreSQL을 큐로 활용
  • 주기적 잡(cron-like) 스케줄링
  • 유니크 잡, 재시도 정책, 우선순위

실습: 새 Oban worker 추가해서 매일 자정 통계 요약 이메일 보내기

프라이버시 엔지니어링

  • SipHash로 익명 ID 생성 — 일방향 해시의 활용
  • 일일 솔트 로테이션 — 추적 시간 한계 설정
  • IP를 저장하지 않는 지오로케이션 — 메모리상 변환

실습: 자신의 사이드 프로젝트에 익명 ID 방식 적용해보기

07 — 요구사항Setup

하드웨어·시스템 요구사항

셀프호스팅 최소/권장 사양.

리소스최소권장
CPUSSE 4.2 또는 NEON 지원 (ClickHouse 요구사항)2 vCPU 이상
RAM2 GB4 GB+ (트래픽 많으면 8 GB)
디스크10 GB50 GB SSD (이벤트 누적용)
네트워크도메인 + DNS A 레코드고정 IP + 80/443 포트 개방
OSLinux (Docker 지원)Ubuntu 22.04 LTS
Trap · ClickHouse 메모리
기본 설정은 16GB RAM을 가정한다

2GB 머신에서 돌리려면 community-edition/clickhouse/low-resources.xmldefault-profile-low-resources-overrides.xml의 설정을 그대로 사용해야 한다. low-resources.xmlmark_cache_size(524MB)를 줄이고, default-profile-low-resources-overrides.xmlmax_threads=1 등 병렬 처리 수를 제한해 메모리 사용량을 간접적으로 낮춘다. 안 그러면 OOM Killer가 ClickHouse를 죽인다.

도메인/DNS 요구사항

08 — 실습 과제Hands-on

직접 해볼 수 있는 6단계

난이도별 실습 — Easy → Hard.

실습 1 — 로컬에 Plausible CE 띄우기Easy

1) 레포 clone 2) .env 작성 (BASE_URL, SECRET_KEY_BASE) 3) compose override로 포트 8000 노출 4) docker compose up -d 5) http://localhost:8000 접속 후 첫 사용자 등록

git clone -b v3.2.0 --single-branch \
  https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
echo "BASE_URL=http://localhost:8000" > .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48)" >> .env
cat > compose.override.yml << EOF
services:
  plausible:
    ports:
      - 8000:80
EOF
docker compose up -d

배우는 것: Docker Compose의 서비스 의존성(depends_on), 헬스체크, 볼륨 영속성

실습 2 — Stats API로 통계 가져오기Easy

1) 대시보드에서 API 키 발급 2) /api/v1/stats 엔드포인트로 JSON 호출 3) Python/Node로 일일 방문자 그래프를 별도 페이지에 그려보기 4) 시계열 차트 라이브러리 (Chart.js, Recharts) 연동

배우는 것: REST API 인증, 시계열 데이터 처리, 차트 라이브러리 사용

실습 3 — SPA에 트래커 통합Medium

1) React/Next.js 사이드 프로젝트 준비 2) plausible.js 스크립트 삽입 3) history.pushState 후킹으로 라우트 변경 → 페이지뷰 전송 4) 커스텀 이벤트 (plausible('Signup')) 발송 실험 5) 대시보드에서 이벤트 확인

배우는 것: SPA 라우팅과 분석의 충돌, 커스텀 이벤트 API 설계

실습 4 — 로컬 개발 환경 구축Medium

1) Docker 컨테이너가 아니라 직접 Elixir/Phoenix 빌드 2) asdf install.tool-versions 기준 Elixir/Erlang 설치 3) mix setup으로 의존성 설치/DB 생성/마이그레이션 4) mix phx.server로 개발 서버 실행

asdf install   # .tool-versions 기준 Elixir/Erlang 설치
mix setup       # 의존성 설치, DB 생성, 마이그레이션
mix phx.server  # 개발 서버 실행

배우는 것: Mix 빌드 시스템, Phoenix 개발 워크플로우, ClickHouse 로컬 설정

실습 5 — 새 분석 차원 추가Hard

1) 예시 목표: "OS 종류별 트래픽" 그래프 2) ClickHouse 스키마에 컬럼 추가 (priv/ingest_repo/migrations/) 3) 트래커가 OS 정보를 보내도록 수정 4) 백엔드 집계 쿼리 추가 5) LiveView UI에 그래프 추가 → 풀스택 PR

배우는 것: Plausible 코드베이스 탐색, ClickHouse 마이그레이션, LiveView 컴포넌트 작성

실습 6 — Plausible 클러스터링Hard

1) 여러 노드를 libcluster로 묶기 2) 로드 밸런서 뒤에 두 개의 Plausible 인스턴스 3) ClickHouse를 replicated 모드로 설정 4) 무중단 배포 시도 (Erlang 핫 리로드)

배우는 것: Erlang 분산 시스템, ClickHouse replication, 무중단 배포

09 — 학습 로드맵8 weeks

8주 심화 학습 로드맵

주차별로 따라가면 Plausible 스택 전체 마스터.

Week 01
Elixir 기초

"Elixir School" 1-3장 / 패턴 매칭, 파이프 연산자, 모듈/함수 정의 → 간단한 CLI 계산기 만들기

Week 02
OTP & 동시성

GenServer, Supervisor, Agent / 액터 모델 vs 스레드 모델 비교 → 동시 다운로드 매니저 (10개 URL 병렬)

Week 03
Phoenix 프레임워크

라우터, 컨트롤러, 뷰 / Ecto: 스키마, 체인지셋, 쿼리 → 간단한 블로그 시스템

Week 04
Phoenix 심화

플러그(Plug) 미들웨어, 인증 / "Real-Time Phoenix" 책 참고 → 사용자 인증 추가

Week 05
Phoenix LiveView

LiveView 라이프사이클 / WebSocket 통신과 변경분 패치 → 실시간 채팅 또는 라이브 투표

Week 06
ClickHouse 깊이

MergeTree 엔진 종류 (Replicated, Aggregating 등) / 파티셔닝과 인덱싱 전략 → 100만 행 로그 데이터 적재 + 다양한 집계 쿼리

Week 07
OpenTelemetry & 관측성

트레이스/메트릭/로그의 차이 / Jaeger, Prometheus, Grafana 스택 → 자신의 앱에 OTel 계측 추가하고 분산 추적

Week 08
Plausible 컨트리뷰션

"good first issue" 라벨 이슈 찾기 / 로컬 개발 환경에서 작은 PR 작성 → 커뮤니티 코드 리뷰 받기

10 — 키워드 사전Glossary

핵심 용어 한눈에

자주 마주칠 단어들.

Elixir
Erlang VM(BEAM) 위에서 도는 함수형 언어. Ruby에서 영감을 받은 깔끔한 문법에 Erlang의 동시성/내고장성 결합. 같은 코드를 1만 명이 동시 사용해도 안정적.
Phoenix LiveView
서버에서 HTML을 다시 렌더링하고 WebSocket으로 변경분만 전송하는 기술. React + WebSocket을 서버사이드에서 자동 처리. JS 코드를 거의 안 쓰고도 실시간 UI.
ClickHouse
Yandex가 만든 컬럼 지향(column-oriented) OLAP DB. 같은 컬럼이 옆에 모여 있어 집계가 매우 빠름. 수십억 행 집계를 1초 안에 처리.
OLAP vs OLTP
OLTP는 "주문 하나 처리" 같은 짧은 트랜잭션 (PostgreSQL 강함). OLAP는 "지난 1년 매출 분석" 같은 대규모 집계 (ClickHouse 강함).
SipHash
암호학적으로 안전한 해시 함수. 입력이 같으면 출력도 같지만, 출력에서 입력을 역산하기 어렵다. Plausible은 (IP+UA+도메인+오늘날짜) → 익명 user_id 생성.
GDPR
EU 일반 개인정보보호법. 개인 식별 정보 수집 시 명시적 동의 필요. Plausible은 애초에 개인정보를 안 모으니 동의 자체가 불필요.
셀프호스팅
서비스를 제공자 서버가 아니라 자기 서버에 설치해서 쓰는 것. 데이터 100% 통제 가능, 운영 부담을 진다.
Oban
Elixir의 백그라운드 잡 라이브러리. PostgreSQL을 큐로 활용. Ruby의 Sidekiq, Python의 Celery에 해당.
AGPL-3.0
GPL을 강화한 라이선스. "수정한 코드를 네트워크 너머로 제공해도 공개해야 한다"는 조항 추가. SaaS 형태의 코드 사유화를 막기 위함.
OTP
Open Telecom Platform. Erlang의 표준 라이브러리 + 디자인 패턴. GenServer(상태 관리), Supervisor(자동 재시작 트리) 등. "let it crash" 철학의 기반.
OpenTelemetry
분산 시스템 관측 표준. 트레이스/메트릭/로그를 통합된 포맷으로 다룬다. Jaeger, Datadog, Honeycomb 등 어디로든 export 가능.
멀티 스테이지 Docker
Dockerfile에 여러 FROM을 두고, 빌더 이미지에서 컴파일한 결과물만 최종 가벼운 이미지에 복사. Plausible은 빌더에 Elixir+Node, 런타임엔 Alpine만 남김.
Ecto
Elixir의 표준 DB 래퍼. 스키마 정의, 체인지셋(검증), 쿼리 DSL을 제공. 한 앱에서 여러 리포지토리(PostgreSQL + ClickHouse)를 다룰 수 있다.
BEAM VM
Erlang/Elixir가 동작하는 가상머신. 수십만 개의 경량 프로세스(액터) 동시 실행, 메시지 패싱 기반 동시성. JVM과 비교되지만 동시성 모델이 근본적으로 다름.
libcluster
Erlang 노드 클러스터링 라이브러리. Kubernetes/DNS/Gossip 등 다양한 전략으로 노드를 자동 발견·연결. 멀티 서버 Plausible 운영의 핵심.
site_encrypt
Let's Encrypt 인증서를 Phoenix 앱 안에서 자동 발급/갱신해주는 라이브러리. nginx 같은 별도 프록시 없이도 TLS 운영 가능.
11 — 참고 링크Refs

더 깊이 파고들 자료

공식 · 학습 · 배경 글.

공식 자료

학습 자료

배경 글

Action · 이번 주에 해볼 것

Plausible을 처음 만났다면 이 순서로 5단계.

  1. Docker Compose로 CE 띄우기. community-edition 레포 clone → .env 작성 → docker compose up -d. 30분 안에 http://localhost:8000에서 첫 사용자 등록까지.
  2. 자기 블로그/사이드 프로젝트에 트래커 붙이기. <script defer data-domain="..." src="..."> 한 줄로 끝. GA 스크립트(54KB)와 Plausible 트래커(1KB)의 네트워크 탭 차이를 직접 비교.
  3. 익명화 트릭 손으로 검증. Elixir REPL에서 :siphash.hash24로 (도메인+IP+UA+날짜) 해시를 직접 만들어보고, 다음날 같은 입력이 다른 ID로 나오는지 확인. 24시간 추적 한계가 어떻게 작동하는지 체감.
  4. Stats API로 외부 대시보드 만들기. Python/Node로 /api/v1/stats를 호출해 일일 방문자 그래프를 본인의 다른 페이지에 삽입. API 인증·시계열 데이터 처리 패턴 학습.
  5. ClickHouse 쿼리 직접 날려보기. CE의 ClickHouse 컨테이너에 docker exec로 들어가 SELECT country_code, count() FROM events GROUP BY country_code. 같은 쿼리를 PostgreSQL에서 가상으로 돌렸을 때와 속도 차이 상상해보기.
원문 · plausible/analytics (GitHub) · 2026-05-21 · TrendShift #16