Hướng dẫn triển khai Umami Analytics với Docker Compose và PostgreSQL: Tự host giải pháp thay thế GA4

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

1. Vì sao Google Analytics 4 (GA4) không còn phù hợp với web nhỏ?

Bạn chỉ muốn kiểm tra xem hôm qua blog có bao nhiêu lượt đọc và khách đến từ đâu. Thế nhưng khi mở GA4, bạn phải bơi qua hàng chục menu con, thiết lập báo cáo rườm rà và chờ dữ liệu cập nhật trễ từ 24 đến 48 tiếng. Rõ ràng, GA4 sinh ra để phục vụ các tập đoàn lớn theo dõi phễu người dùng phức tạp, không dành cho nhu cầu tinh gọn.

Hai rào cản lớn khác là hiệu năng và quyền riêng tư:

  • Chậm website: Thư viện gtag.js của Google nặng khoảng 45KB (gần 100KB khi giải nén). Nó trực tiếp kéo tụt điểm Core Web Vitals trên di động.
  • Luật Cookie phiền toái: Quy định GDPR ép bạn phải dựng một banner xin cấp quyền cookie to đùng, che mất một phần ba màn hình khi độc giả vừa bấm vào xem bài viết.

Thứ chúng ta cần chỉ là một dashboard trực quan: Ai đang đọc? Họ đến từ link nào? Bài viết nào hot nhất? Toàn bộ dữ liệu này phải nằm trong tay bạn, tải tức thì và không làm phiền khách truy cập.

2. Kiến trúc giải pháp: Umami + Docker Compose + PostgreSQL

Umami giải quyết triệt để các vấn đề trên. Toàn bộ hệ sinh thái này hoạt động nhịp nhàng qua 3 mảnh ghép:

  • Umami Analytics: Dashboard quản trị viết bằng Next.js. Mã tracking của Umami chỉ vỏn vẹn khoảng 2KB — nhẹ hơn GA4 gần 20 lần. Umami không dùng cookie. Hệ thống nhận diện khách truy cập duy nhất bằng chuỗi băm đổi mới mỗi 24 giờ từ IP và User-Agent, hoàn toàn tuân thủ GDPR mà không cần bật popup xin phép.
  • PostgreSQL 15: Nơi lưu trữ toàn bộ lượt xem (pageview) và sự kiện (event). Dữ liệu nằm trọn trên ổ cứng máy chủ của bạn, không gửi về bất kỳ máy chủ bên thứ ba nào.
  • Docker Compose: Bộ điều phối giúp bạn không cần cài Node.js hay build code thủ công. Toàn bộ stack Umami và database được đóng gói gọn trong một file, khởi chạy sau đúng một câu lệnh.

Bộ đôi này chỉ ngốn khoảng 180MB – 250MB RAM. Một gói VPS giá rẻ 1 vCPU / 1GB RAM (tầm 100.000đ/tháng) là đủ sức gánh website vài trăm nghìn view mỗi tháng.

3. Các bước triển khai Umami trên VPS Linux

Chuẩn bị sẵn một máy chủ Ubuntu hoặc Debian đã cài Docker Engine và Docker Compose plugin (v2). Sau đó, bạn lần lượt làm theo hướng dẫn dưới đây.

Bước 1: Tạo thư mục chứa dự án

Mở terminal của VPS và tạo một thư mục riêng để lưu trữ cấu hình:

mkdir -p ~/umami-analytics && cd ~/umami-analytics

Bước 2: Viết file docker-compose.yml

Trước khi tạo file, hãy tạo ngay một chuỗi ký tự bí mật ngẫu nhiên dùng cho APP_SECRET bằng lệnh:

openssl rand -hex 32

Tiếp theo, tạo file docker-compose.yml:

nano docker-compose.yml

Dán cấu hình chuẩn dưới đây vào. Hãy nhớ thay my_strong_db_password bằng mật khẩu database của bạn và thay YOUR_GENERATED_SECRET bằng chuỗi hex vừa tạo ở trên:

services:
  umami-db:
    image: postgres:15-alpine
    container_name: umami_postgres
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami_user
      POSTGRES_PASSWORD: my_strong_db_password
    volumes:
      - umami-db-data:/var/lib/postgresql/data
    restart: always

  umami-app:
    image: ghcr.io/umami-software/umami:postgresql-latest
    container_name: umami_server
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami_user:my_strong_db_password@umami-db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: YOUR_GENERATED_SECRET
    depends_on:
      - umami-db
    restart: always

volumes:
  umami-db-data:

Bước 3: Khởi chạy và kiểm tra nhật ký log

Kéo image và bật container chạy ngầm:

docker compose up -d

Container khởi động lần đầu sẽ tự động chạy các script migration để khởi tạo bảng dữ liệu. Quá trình này mất khoảng 20 đến 40 giây. Bạn có thể theo dõi tiến độ qua log:

docker compose logs -f umami-app

Khi thấy dòng Ready in ...ms cùng thông báo lắng nghe tại cổng 3000, ứng dụng đã sẵn sàng.

Một mẹo nhỏ: Khi debug log Docker hoặc gọi API test dữ liệu JSON trả về từ Umami, bạn có thể paste nhanh vào công cụ trực tuyến như toolcraft.app/vi/tools/developer/json-formatter để format và kiểm tra cấu trúc cho tiện.

Bước 4: Đăng nhập và đổi ngay mật khẩu mặc định

Mở trình duyệt và truy cập http://IP_VPS:3000. Tài khoản mặc định hệ thống cấp sẵn là:

  • Username: admin
  • Password: umami

Đăng nhập thành công, bạn hãy vào ngay Settings > Profile để đổi password. Đừng bỏ qua bước này vì các bot tự động trên Internet quét cổng 3000 liên tục để dò mật khẩu mặc định.

Bước 5: Thêm website và gắn thẻ tracking

Vào Settings > Websites, bấm Add website rồi điền tên cùng domain trang của bạn (ví dụ: myblog.vn). Umami sẽ xuất ra đoạn mã nhúng script có dạng:

<script defer src="https://analytics.yourdomain.com/script.js" data-website-id="12345678-abcd-ef01-2345-6789abcdef01"></script>

Gắn đoạn mã trên vào trong thẻ <head> của website. Để tránh lỗi bảo mật Mixed Content khi website chính chạy HTTPS, bạn nên cấu hình Nginx hoặc Caddy làm Reverse Proxy kèm chứng chỉ SSL miễn phí từ Let’s Encrypt cho subdomain của Umami.

Bây giờ, hãy mở website trong tab ẩn danh và tải lại trang. Quay lại màn hình Umami, bạn sẽ thấy biểu đồ thời gian thực nhảy số ngay lập tức.

4. Lời kết

Tự host Umami bằng Docker Compose giúp bạn gỡ bỏ được gánh nặng banner cookie, tăng tốc độ tải trang nhờ script 2KB siêu nhẹ và nắm trọn dữ liệu truy cập của mình. Thiết lập một lần, hệ thống sẽ chạy êm ru suốt nhiều năm mà không đòi hỏi bảo trì phức tạp.

Share: