Docker로 Ackee Analytics 자체 호스팅하는 방법

발행: (2026년 3월 19일 오후 05:03 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.

Ackee란?

Ackee는 셀프‑호스팅, 프라이버시‑중심 분석 도구로, 쿠키 없이 페이지 조회수, 리퍼러, 브라우저 및 운영 체제를 추적합니다.
MongoDB에 데이터를 저장하고, GraphQL API를 제공하며, 깔끔한 싱글‑페이지 대시보드를 제공합니다.
Ackee는 Matomo의 복잡성이나 Google Analytics의 클라우드 의존성 없이 기본 트래픽 메트릭을 원하는 개발자를 위한 도구입니다.

Source:

사전 요구 사항

요구 사항세부 정보
OSLinux 서버 (Ubuntu 22.04 + 권장)
DockerDocker 및 Docker Compose 설치 – [Docker guide] 참조
Memory512 MB 사용 가능한 RAM
Disk2 GB 사용 가능한 디스크 공간
Domain도메인 이름 (CORS 및 HTTPS를 위해 권장)

Docker‑Compose 설정

Create a docker-compose.yml file:

services:
  ackee:
    image: electerious/ackee:3.5.1
    container_name: ackee
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      ACKEE_MONGODB: "mongodb://mongo:27017/ackee"
      ACKEE_USERNAME: "admin"                 # CHANGE: dashboard login username
      ACKEE_PASSWORD: "change-this-password"  # CHANGE: use a strong password
      ACKEE_ALLOW_ORIGIN: "https://example.com" # CHANGE: your website's domain (CORS)
    depends_on:
      - mongo
    networks:
      - analytics

  mongo:
    image: mongo:7.0.16
    container_name: ackee-mongo
    restart: unless-stopped
    volumes:
      - ackee-data:/data/db
    networks:
      - analytics

networks:
  analytics:
    driver: bridge

volumes:
  ackee-data:

환경 변수

변수목적
ACKEE_MONGODBMongoDB 연결 문자열
ACKEE_USERNAME대시보드 로그인 사용자 이름
ACKEE_PASSWORD대시보드 로그인 비밀번호
ACKEE_ALLOW_ORIGINCORS 출처 – 웹사이트 도메인으로 설정 (여러 개일 경우 쉼표로 구분)
ACKEE_AUTO_ORIGINtrue 로 설정하면 모든 출처를 허용 (보안에 취약함)

스택 시작하기

docker compose up -d
  • http://:3000 에서 대시보드 열기
  • 환경 변수에 정의된 사용자 이름과 비밀번호로 로그인
  • Settings → Domains → Add Domain → 사이트 이름과 도메인 입력

추적 스크립트

생성된 스니펫을 복사하여 웹사이트의 “ 안에 삽입하세요:

  • 스크립트 크기는 약 2 KB이며, 비동기 로드되고 쿠키를 전혀 설정하지 않습니다.
  • Ackee는 하나의 인스턴스에서 여러 사이트를 추적할 수 있으며, 각 사이트마다 고유한 도메인 ID와 스니펫을 가집니다.

상세 모드 활성화 (선택 사항)

상세 모드는 방문당 화면 크기, 언어, 리퍼러 정보를 수집합니다. 쿠키는 사용하지 않지만 더 세밀한 데이터를 제공합니다.

GraphQL API

{
  domains {
    id
    title
    statistics {
      views {
        id
        count
      }
    }
  }
}
  • 엔드포인트: https://your-ackee-instance.com/api
  • 인증: Bearer token (Settings → Tokens에서 영구 토큰을 생성)

Production Deployment Behind HTTPS (Reverse Proxy)

server {
    listen 443 ssl;
    server_name analytics.example.com;

    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;
    }
}

Tip: HTTPS는 강력히 권장됩니다. ACKEE_ALLOW_ORIGIN은 HTTPS 출처와 가장 잘 작동하며, 브라우저가 혼합‑콘텐츠 페이지에서 트래커를 차단할 수 있습니다. 전체 구성을 보려면 Reverse Proxy Setup 가이드를 참조하세요.

MongoDB 데이터 백업

# Dump the database inside the container
docker exec ackee-mongo mongodump --out /tmp/backup --db ackee

# Copy the dump to the host
docker cp ackee-mongo:/tmp/backup ./ackee-backup-$(date +%Y%m%d)

또는 Restic이나 BorgBackup과 같은 도구를 사용하여 전체 ackee-data Docker 볼륨을 백업할 수 있습니다. Backup Strategy 문서를 참고하세요.

일반적인 문제 및 해결 방법

증상해결 방법
Dashboard shows zero views after adding the script브라우저 콘솔에서 CORS 오류를 확인하세요. ACKEE_ALLOW_ORIGIN은 사이트의 origin(프로토콜, 서브‑도메인, 포트)과 정확히 일치해야 합니다.
Login returns 401 or dashboard is blankACKEE_USERNAMEACKEE_PASSWORD가 올바른지 확인하세요. 변경 후 컨테이너를 재시작합니다: docker compose restart ackee
Logs show MongoNetworkError: connect ECONNREFUSEDMongoDB 컨테이너가 실행 중이며 동일한 Docker 네트워크에 있는지 확인하세요: docker compose ps & docker network ls

리소스 사용량 (일반적인 경우)

리소스대략 사용량
RAM150‑300 MB (Ackee 약 50 MB + MongoDB 약 100‑200 MB)
CPU최소
Disk1‑5 GB (트래픽 양 및 보존 기간에 따라 다름)

Ackee를 언제 사용(또는 사용하지) 않을까

장점

  • 극도로 가볍고 기본적인 것만 제공: 페이지 조회수, 리퍼러, 브라우저, 화면 크기.
  • GDPR 친화적이며 기본적으로 익명 모드 제공.
  • 맞춤형 통합을 위한 GraphQL API.

단점

  • 퍼널, 목표, 맞춤 이벤트, 캠페인 추적 기능이 없음.
  • 고급 분석이 필요하면 빠르게 한계에 도달함.

대안:

  • Plausible 또는 Umami – 목표 및 맞춤 이벤트 추가.
  • Matomo – 기능이 풍부하지만 무거움.

GDPR 및 쿠키‑프리 운영

  • 익명 모드 (기본): 개인 식별 정보 없음, 쿠키 없음, 집계 메트릭만 제공. 동의 배너 필요 없음.
  • 상세 모드: 화면 크기, 언어, 리퍼러 등 약간 더 수집하지만 여전히 쿠키 없이 동작하며 지문 인식을 피함.

여러 웹사이트 추적

  1. Ackee 대시보드에서 Settings → Domains → Add Domain 로 이동합니다.
  2. 각 도메인마다 고유한 Domain ID와 추적 스니펫이 제공됩니다.
  3. 해당 스니펫을 각 사이트의 “에 삽입합니다.

Overview

단일 Ackee 인스턴스가 추적할 수 있는 도메인 수에 엄격한 제한은 없습니다—주된 제약은 트래픽 양에 따라 증가하는 MongoDB 저장소입니다.

  • Ackee – 가장 최소한의 옵션: 기본 페이지 뷰, 리퍼러, 브라우저, 화면 크기와 GraphQL API 제공.
  • Plausible – 목표, 맞춤 이벤트, 캠페인 추적을 깔끔한 대시보드에 추가.
  • Umami – 두 옵션 사이에 위치하며, Plausible보다 간단한 설정으로 맞춤 이벤트 제공.

Ackee를 선택하세요. API와 함께 정말 최소한의 분석만 필요할 때 적합합니다.

Tracker Blocking

프라이버시 중심의 광고 차단기는 알려진 분석 도메인 목록을 유지하므로 Ackee의 트래커 스크립트가 차단될 수 있습니다. 자체 호스팅을 하면 Ackee 인스턴스가 자신의 도메인에서 실행되므로 차단기가 식별하기가 어려워집니다. 트래커 스크립트를 메인 웹사이트 도메인을 통해 프록시하면 차단을 더욱 줄일 수 있습니다.

Resource Requirements

  • Ackee 자체는 약 50 MB의 RAM만 사용합니다.
  • 병목 현상은 MongoDB이며, 최소 100–200 MB가 필요합니다.

2 GB RAM을 장착한 Raspberry Pi 4는 저‑중간 트래픽 사이트에 대해 Ackee를 충분히 처리할 수 있습니다. ARM64 MongoDB 이미지를 사용하세요:

docker pull mongo:7.0.16

이 이미지는 Pi 4/5에서 네이티브로 실행됩니다.

Data Retention

Ackee에는 내장된 데이터 보존 정책이 없습니다. 데이터는 MongoDB에 무기한으로 누적됩니다. 저장소 관리를 위해 다음 방법을 사용할 수 있습니다:

  1. MongoDB 쿼리를 통해 오래된 레코드를 수동으로 삭제합니다.
  2. 오래된 항목을 삭제하는 cron 작업을 설정합니다.
  3. 해당 컬렉션에 TTL 인덱스를 설정하여 자동 만료를 구현합니다.

Topics & Guides

  • 최고의 자체 호스팅 분석
  • Plausible 자체 호스팅 방법
  • Umami 자체 호스팅 방법
  • Plausible vs Umami
  • Google Analytics 대체
  • Docker Compose 기본
  • 리버스 프록시 설정
  • 백업 전략
0 조회
Back to Blog

관련 글

더 보기 »

파일 시스템이 디버깅하기 어려운 이유

동기 부여 나는 파일 시스템을 처음부터 구축하고 있다—필요해서가 아니라, 보이지 않는 것을 디버깅하는 것이 추측에 불과하기 때문이다. 파일 시스템을 이해하는 l...

블루 틱이 표시된 메시지, 그러나 도착하지 않음

소개 WhatsApp에서 메시지가 전달 및 읽음으로 표시되지만 AI 에이전트가 해당 메시지를 전혀 확인하지 못한다면, 이는 무음 메시지 손실 문제입니다. 이 기사에서는 이러한 문제에 대한 전문적인 해결책을 제시합니다.