Cài đặt Umami - Analytics self host thay thế Google Analytics

Umami giúp bạn dễ dàng thu thập, phân tích các dữ liệu về traffic, nguồn traffic, các dữ liệu nhân khẩu học, hành vi của khách, trong khi vẫn duy trì quyền riêng tư và quyền sở hữu dữ liệu của khách truy cập (tuân thủ GDPR)

Trước đây mình hay dùng Google Analytics, sau này thì đổi sang Cloudflare Analytics …. vẫn cảm giác không quá thoải mái, Cloudflare thì quá thiếu tính năng, Google thì lại nhiều 1 cách không cần thiết, các dịch vụ Analytics tuân thủ GDPR thì đắt khủng khiếp

Tình cờ biết tới Umami, coi sơ thì thấy khá đơn giản, trực quan, đủ dùng, lại là mã nguồn mở, nên dễ dàng tự lưu trữ (self host), nhờ thế mang sự riêng tư hoàn toàn cho người dùng

2023 10 19 4 52 44

Bản thân Umami cũng có phiên bản Umami Cloud miễn phí 10.000 events mỗi tháng, khá thừa cho thèng bibica.net, dùng thử 15 phút cảm giác khá là hợp, đang còn slot VPS Oracle miễn phí để không, nên tiện thể tự cài 1 bản, tự lưu trữ (self host) luôn cho đẹp đội hình 😀

Để mọi thứ đơn giản, thông dụng, thì mình tạo mới 1 con VPS dùng OS Ubuntu 22.04 😀

Cấu hình VPS

Nếu bạn dùng VPS hãng khác, đã cài docker, docker-compose thì không cần làm bước bên dưới

# update OS
sudo apt update && sudo apt upgrade -y

# set locale
locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# Tắt Firewall
sudo apt remove iptables-persistent -y
sudo ufw disable
sudo iptables -F

# Chỉnh về múi giờ Việt Nam
timedatectl set-timezone Asia/Ho_Chi_Minh

# Tạo swap 4GB RAM
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile && echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
cat <<EOF > /etc/sysctl.d/99-xs-swappiness.conf
vm.swappiness=10
EOF

# Enable TCP BBR congestion control
cat <<EOF > /etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF

# Cài đặt docker
curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $(whoami)
sudo systemctl start docker
sudo systemctl enable docker
apt install docker-compose -y

# bypass Oralce
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/NeverIdle-Oracle/master/VM.Standard.E2.1.Micro.sh -O /usr/local/bin/bypass_oracle.sh
chmod +x /usr/local/bin/bypass_oracle.sh
nohup /usr/local/bin/bypass_oracle.sh >> ./out 2>&1 <&- &
crontab -l > bypass_oracle
echo "@reboot nohup /usr/local/bin/bypass_oracle.sh >> ./out 2>&1 <&- &" >> bypass_oracle
crontab bypass_oracle

Các bước râu ria ở trên VPS nào mình cũng làm, bao gồm cập nhập Ubuntu, tắt firewall, tạo 4G RAM ảo, bật BBR, cài đặt docker, docker-compose và bypass oracle

Cài đặt Umami

Trước đây mình dùng cấu hình docker-compose.yml như tác giả đề xuất, sau này mình dùng theo cấu hình được trang programonaut chia sẻ, cấu hình này đã tự đưa các data vào trong thư mục /umami/data, mỗi ngày tạo thêm backup 1 lần … ban đầu thì mình thấy khá hay, vì data được backup thành nhiều bản cho nhiều ngày

Mà sau khi sử dụng vài hôm, thấy cách vận hành nó khá lằng nhằng, kiểu bạn phải tạo thêm 1 database, để backup cái database đang chạy, tốn thêm dung lượng, RAM …. mà dữ liệu của Umami nó chỉ là các log khách truy cập, bạn nhìn lướt qua là hết tác dụng rồi, không phải dữ liệu quan trọng để mà phải cấu hình phức tạp tới mức thế

Nên cuối cùng mình dùng lại cấu hình mặc định từ tác giả, bổ xung tùy chọn lưu data database vào thư mục bên trong Umami là cũng luôn có data mới nhất rồi, sau này muốn chuyển VPS sang nơi khác thì chỉ cần download hết thư mục này về rồi chạy docker-compose up -d là được

Có thể cài đặt thêm Dockge để quản lý các docker cho tiện cũng được

nano docker-compose.yml

Nội dung bên trong điền vào

version: '3'
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:umami_p3JhoTAq29f9m8Cg58Fk@db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: nJprJ75pLeIQT9AXP+yPx0/gzejtX
    depends_on:
      db:
        condition: service_healthy
    restart: always
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: umami_p3JhoTAq29f9m8Cg58Fk
    volumes:
      - ./data:/var/lib/postgresql/data
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5
volumes:
  umami-db-data:
  • Đổi APP_SECRET sang 1 giá trị khác, có thể chạy lệnh bên dưới để tạo ngẫu nhiên 1 dãy kí tự
openssl rand -base64 64 | tr -d '\n' ; echo

Ra dãy số dạng C5zElMKk9JS2AwxUD9Sg0W8epYA/BB5+CcRpgoiwIdIcyZjSwKSTNkvoNYfVTDaYgtigr+Ck2CY+NKYKkbBYQg==

  • Các giá trị liên quan tới database như password nên đổi lại để hệ thống an toàn một chút (dòng 8, 20)

Tiếp theo chạy lệnh bên dưới để hoàn thành cài đặt

docker-compose up -d --build --remove-orphans --force-recreate

Cài đặt xong bạn có thể truy cập vào web UI bằng IP:3000, tài khoản quản trị

User: admin
Password: umami

Umami hoạt động qua cổng 3000, gần như không đụng chạm với bất cứ cái gì, bạn có thể cài đặt trên cùng host chính chạy website mà vẫn rất an toàn

Cấu Hình Cloudflare Tunnels

Để việc login dễ nhớ, và link analytics đẹp mắt hơn thì có thể dùng Cloudflare Tunnels làm Reverse Proxy thay thế cho dãy IP:3000

Tạo tài khoản Cloudflare Zero Trust ->Access -> Tunnel -> Create a tunnel -> đặt 1 tên cho dễ nhớ (analytics.bibica.net) -> Install and run a connector

2023 10 19 5 10 49

Sau đó tạo Public hostnames analytics.bibica.net tới IP:3000

Xong xuôi thì có thể truy cập vào Umami qua subdomain analytics.bibica.net

Trên Nginx có thể dùng cấu hình như sau

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:3000;

}

Cấu hình Websites

2023 10 19 5 16 24

  • Settings -> Add website

Đặt Name tùy ý, Domain điền dạng domain.com (không cần điền https:// đằng trước)

2023 10 19 5 18 24

  • Xong xuôi thì vào tracking code lấy code tương tự các dịch vụ analytics khác

Việc cấu hình cơ bản như thế, bạn có thể vào đổi lại tài khoản admin, mật khẩu, ngôn ngữ (Umami có hỗ trợ tiếng Việt luôn) …

Bạn cũng có thể tạo 1 trang public (tính năng Share URL) để xem các thông tin cho nhanh, đỡ phải login vào quản trị phiền hà

1 điểm theo mình khá củ chuối, Umami không có tính năng chặn track của admin 😀 nên quản trị vào cũng bị tính luôn 😀 có thể xử lý thủ công bằng cách chặn file analytics (script.js) bằng các app như AdGuard

Cách thức hoạt động của Umami cũng tương tự các dịch vụ khác, nên cũng không có gì bàn nhiều, trang quản trị của họ cũng rất đơn giản, xem tầm 5-10 phút, ấn ấn vài cái là hiểu cả thôi 😀

Hiệu quả sử dụng:

Tác giả viết rất tốt, và cách Umami cấu hình cũng siêu đơn giản, mọi thứ hoạt động đúng như mình mong đợi, không có gì phàn nàn về hiệu năng

Dpecozxong

Tuy thế, sau 1 thời gian sử dụng, khá bất ngờ vì mình thấy Umami ăn tài nguyên rất nhiều, Artalk là cả hệ thống comment chỉ dùng < 20 MB RAM, Umami dùng ~ 400 MB RAM, chưa kể nó ghi dữ liệu vào database rất nhiều, dùng thì mình không gặp bất cứ vấn đề gì, nhưng nhìn nó ăn RAM quá cũng khá thốn :]]

Theo mình thì bạn nên cài riêng nó ra 1 VPS để tránh ảnh hưởng tới server gốc, traffic ít thì có thể dùng Umami Cloud miễn phí cũng ổn

Cấu hình Umami Cloud

Nếu trang của bạn traffic < 10.000 lượt view 1 tháng, có thể dùng thẳng dịch vụ Umami Cloud miễn phí của họ, đỡ phải mất công cài đặt self host này nọ, rối rắm, phiền phức 😀

2023 10 21 1 20 09

Nếu dùng qua dịch vụ của Umami, link tracking sẽ bắt đầu bằng analytics.eu.umami.is

2023 10 21 1 20 54

Link Share URL public sẽ random thư mục bên trong

Có thể dùng các hình thức Reverse Proxy làm ngắn và đẹp các link này, giúp việc quản lý đơn giản hơn

Do mình đang dùng webserver Caddy, nên sẽ demo theo Caddy, bạn nào dùng Nginx hoặc các webserver khác thì đại khái ý tưởng cũng là như thế

analytics.bibica.net {
    tls /etc/ssl/bibica.net.pem /etc/ssl/bibica.net.key
    reverse_proxy https://analytics.eu.umami.is {
        header_up Host {http.reverse_proxy.upstream.hostport}
    }
        handle_path /monitor* {
    rewrite * /share/uGAnI6Tm9RDP56EH/BIBICA.NET{uri}
    reverse_proxy https://analytics.eu.umami.is {
    header_up Host {http.reverse_proxy.upstream.hostport}
}
}
}

Lúc này link https://analytics.eu.umami.is/script.js sẽ thành https://analytics.bibica.net/script.js

Link https://analytics.eu.umami.is/share/uGAnI6Tm9RDP56EH/BIBICA.NET sẽ thành https://analytics.bibica.net/monitor

Về cơ bản mọi thứ vận hành khá bình thường, check location chính xác, trừ vụ khi hoạt động, cảm giác cụm server EU của Umami khá là phò 😀

2023 10 21 1 24 53

Các file track ~500 byte cho tới vài kb mà TTFB toàn > 500ms 😀 Firefox cũng phải gào là các request này chậm quá 😀 trên self host tại Singapore thì TTFB ~200ms là cùng

2023 10 21 1 41 33

Có thể xử lý đơn giản nhất là delay file script.js này, nó sẽ chỉ load khi khách đã vào trang, di chuyển chuột hoặc bàn phím mới bắt đầu load, lý thuyết thì gần như bạn sẽ không thấy sự hiện diện của nó

Analytics Monitor Public

Tổng thể lúc này dù ta đang dùng Umami Cloud nhưng hiệu quả khá tương tự self host, do hiện tại mình đang dùng Umami Cloud nên bổ xung thêm 1 chút phần này

Update 29/11/2023

Do mới chuyển về VPS tại Việt Nam, đổi sang dùng lại Nginx, mình đổi từ Umami Cloud sang chạy self host tại VPS Singapore nên cập nhập lại bài

  • Cập nhập lại 1 chút các cấu hình liên quan tới database trên docker-compose.yml, giúp tăng 1 chút bảo mật
  • Cập nhập proxy_pass cho Nginx, Caddy

Update 05/12/2023

  • Cập nhập cấu hình docker-compose.yml có sẵn data và backup

Update 11/12/2023

  • Cập nhập cấu hình docker-compose.yml, chỉ lưu data mới nhất vào thư mục /data

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback.
Notes: However, those deemed to be spam or solely promotional will be deleted.

You can create a Gravatar account, add avatar, then use that email to comment here, your account will have a more beautiful Avatar, easier to recognize with other members.

Please use real emails, you can receive notifications when comments are replied