Self-host Plausible analytics trên VPS rẻ thay Google Analytics

Chia sẻ bài viết

Mục lục
Self-host Plausible analytics trên VPS rẻ thay Google Analytics
TL;DR
  • Plausible Analytics là Google Analytics nhẹ, không cookie, không tracker quảng cáo. Self-host trên VPS 2GB là đủ cho 10 site nhỏ.
  • Cài bằng Docker Compose mất 15 phút. Cần ClickHouse + Postgres + Plausible image. Tất cả docker official.
  • Script tracking 1KB, nhanh hơn Google Analytics 45KB. Không ảnh hưởng Core Web Vitals.
  • Mặc định không thu thập PII, phù hợp với GDPR và với Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15 của Việt Nam ngay từ ngày đầu, không cần cookie banner.
  • Tiết kiệm: SaaS Plausible 9-79 USD/tháng. Self-host trên Cloud VPS 50 (~25 USD) chạy được vài chục site.

Google Analytics 4 phức tạp dần qua mỗi update, mặc định bật consent mode khiến nhiều landing Việt Nam mất 30-40 phần trăm số liệu vì user click "Reject all" trên cookie banner. Vercel Analytics chỉ chạy trên Vercel, Cloudflare Web Analytics chỉ chạy sau Cloudflare proxy. Khi bạn muốn một analytics nhẹ, privacy-first, chạy độc lập trên VPS bạn sở hữu, Plausible là câu trả lời.

Bài này hướng dẫn full self-host Plausible Community Edition (CE) trên VPS Việt Nam: chuẩn bị Docker, cấu hình ClickHouse, dựng Plausible bằng compose, đặt sau Caddy HTTPS, thêm site đầu tiên, hiểu rõ event và goal tùy chỉnh, và mẹo tránh các vấn đề thường gặp. Tất cả test trên Cloud VPS 50 (4GB RAM, 60GB SSD CEPH).

Plausible CE và bản SaaS khác nhau ở đâu?

Plausible có 2 phiên bản. Cloud (SaaS) chạy ở plausible.io, bạn chỉ trả phí. Community Edition (CE) là phiên bản open source AGPLv3, có đầy đủ tính năng phân tích cơ bản: pageview, unique visitor, bounce rate, top page, top source, country, device. Một vài tính năng nâng cao (funnel, ecommerce revenue tracking, team management) chỉ có trong bản Cloud hoặc Business Edition trả phí.

Với 90 phần trăm dev solo và team nhỏ, Plausible CE đủ dùng. Chỉ khi bạn chạy ecommerce cần revenue attribution và funnel multi-step phức tạp thì cân nhắc bản Business.

Yêu cầu hệ thống

  • VPS tối thiểu 2 vCPU, 2 GB RAM, 30 GB SSD cho 5 site nhỏ.
  • Khuyến nghị 2-4 vCPU, 4-8 GB RAM, 60-80 GB SSD cho 10-30 site.
  • Docker engine >= 24.x, Docker Compose v2.
  • Domain trỏ về VPS, port 80/443 mở.
  • OS: Ubuntu 22.04/24.04 hoặc AlmaLinux 9, Debian 12 đều ổn.

ClickHouse là phần tốn RAM nhất (chiếm 60-70 phần trăm). Với traffic dưới 100k pageview/tháng, 4GB RAM là dư.

Bước 1: Chuẩn bị Docker

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version

Nếu trên AlmaLinux 9, dùng dnf install docker-ce hoặc cài qua repo của Docker.

Bước 2: Clone repo Plausible CE và config env

git clone https://github.com/plausible/community-edition ~/plausible
cd ~/plausible
cp .env.example .env

Sinh secret và sửa file .env:

openssl rand -base64 64 | tr -d 'n' ; echo

Copy kết quả vào biến SECRET_KEY_BASE trong .env. Sửa thêm:

BASE_URL=https://stats.your-domain.com
[email protected]
ADMIN_USER_NAME=Admin
ADMIN_USER_PWD=$YOUR_STRONG_PASS
DISABLE_REGISTRATION=invite_only
SMTP_HOST_ADDR=smtp.mailgun.org
SMTP_HOST_PORT=587
[email protected]
SMTP_USER_PWD=$YOUR_SMTP_PASS
[email protected]

SMTP cần cho việc gửi email xác minh, weekly report. Có thể dùng Mailgun, SendGrid, SES, hoặc bất kỳ SMTP nào.

Bước 3: Khởi động Plausible stack

cd ~/plausible
docker compose pull
docker compose up -d
docker compose ps

Stack có 3 service chính: plausible (web Elixir app), plausible_db (Postgres metadata), plausible_events_db (ClickHouse cho events). Lần đầu mất 3-5 phút pull image. Khi tất cả Up, mở http://server-ip:8000 thấy login page.

Bước 4: Đặt sau Caddy reverse proxy HTTPS

Thêm vào Caddyfile:

stats.your-domain.com {
    reverse_proxy localhost:8000
    encode gzip
}

Reload Caddy. Cert tự xin, sau 30 giây bạn truy cập https://stats.your-domain.com. Login bằng email và password đã đặt trong .env.

Bước 5: Thêm site đầu tiên

  1. Trong dashboard, click "Add a website".
  2. Nhập domain (ví dụ blog.your-domain.com) và timezone (Asia/Ho_Chi_Minh).
  3. Plausible sinh snippet JavaScript dạng <script defer data-domain="blog.your-domain.com" src="https://stats.your-domain.com/js/script.js"></script>.
  4. Copy snippet, paste vào thẻ <head> của site. WordPress dùng plugin "Insert Headers and Footers", site React/Next.js paste vào _document.tsx hoặc layout.tsx.
  5. Mở site, refresh vài lần. Vào dashboard Plausible thấy số liệu real-time trong 60 giây.

Tracking goal: event tùy chỉnh

Ngoài pageview tự động, Plausible cho phép track custom event: signup click, purchase complete, file download. Trong dashboard > Site Settings > Goals > Add goal:

  • Pageview goal: chọn URL pattern, ví dụ /thank-you cho conversion form.
  • Custom event: đặt tên event như "Signup" hoặc "DemoClick".

Trên frontend, gọi event:

<script defer data-domain="blog.your-domain.com"
    src="https://stats.your-domain.com/js/script.outbound-links.js"></script>
<script>
window.plausible = window.plausible || function() {
    (window.plausible.q = window.plausible.q || []).push(arguments)
}
function handleSignup() {
    plausible('Signup', {props: {plan: 'pro'}});
}
</script>

Mỗi click "Signup" gửi 1 event tới Plausible kèm property plan. Dashboard hiển thị breakdown theo plan, đếm conversion rate per source.

Tracking outbound link, file download, 404

Plausible có sẵn các extension qua khác script path:

  • script.outbound-links.js: tự track click ra link ngoài.
  • script.file-downloads.js: tự track click vào pdf, zip, mp3.
  • script.404.js: log mỗi 404 page với URL bị thiếu.
  • script.hash.js: track route #hash (cần cho SPA cũ).
  • script.tagged-events.js: cho phép gắn data-attr trên button để track.

Có thể kết hợp nhiều: script.outbound-links.file-downloads.js. Plausible serve sẵn các tổ hợp phổ biến.

Quyền riêng tư và tuân thủ: GDPR và Luật Bảo vệ dữ liệu cá nhân Việt Nam

Plausible mặc định không set cookie, không thu thập PII, không fingerprint device. Cách Plausible đếm unique visitor: hash của (IP + User Agent + Daily Salt). Salt rotate mỗi 24h, không có cách reverse lookup. Do đó:

  • Không cần cookie banner consent.
  • Tuân thủ GDPR, CCPA, ePrivacy.
  • Phù hợp với Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15, hiệu lực 01/01/2026, thay thế Nghị định 13/2023.
  • Có thể public hóa dashboard cho khách hàng, đối tác xem.

Trong site Settings > Visibility > Public stats, bật toggle. Plausible tạo URL public dạng stats.your-domain.com/blog.your-domain.com, ai có link đều xem được.

Backup ClickHouse và Postgres

Hai database cần backup riêng:

#!/bin/bash
# /usr/local/bin/plausible-backup.sh
DATE=$(date +%F)
BACKUP_DIR=/backup/plausible
mkdir -p $BACKUP_DIR

# Postgres metadata
docker exec plausible_db pg_dump -U postgres plausible_db 
  | gzip > $BACKUP_DIR/pg-$DATE.sql.gz

# ClickHouse events backup theo dạng partition
docker exec plausible_events_db clickhouse-backup create plausible_$DATE
docker exec plausible_events_db clickhouse-backup upload plausible_$DATE

# Rotate giữ 14 ngày
find $BACKUP_DIR -name "pg-*.sql.gz" -mtime +14 -delete

Chạy hàng ngày 3 giờ sáng qua cron. Push sang S3-compatible storage bằng rclone hoặc aws s3 cp.

Performance: Plausible script nhẹ ra sao?

Analytics toolScript sizeSố requestTác động LCP
Google Analytics 445-60 KB3-5 (gtag, config, collect)+100-300ms
Plausible1.0 KB1 (event ping)+5-15ms
Umami2.5 KB1+10-30ms
Cloudflare Web Analytics1.4 KB1+5-20ms

Plausible script nhẹ nhất nhóm. Lý do: không track cross-site, không có ads pixel, không reload script trên SPA route change.

Migrate từ Google Analytics sang Plausible

  1. Cài Plausible song song với GA trong 2 tuần để cross-check số liệu.
  2. Sau khi confirm Plausible đếm đúng (chênh 5-15 phần trăm do GA đếm cookie consent), gỡ GA.
  3. Export dữ liệu GA cũ qua BigQuery export, lưu CSV vào /backup làm tham khảo lịch sử.
  4. Update tag manager: remove GA tag, để chỉ còn Plausible.
  5. Update privacy policy: thay đoạn nói về GA cookie bằng đoạn về Plausible no-cookie.

Vận hành hàng tháng

  • Check disk usage: ClickHouse có thể tăng 1-2 GB/tháng cho mỗi triệu pageview. Cron prune partition cũ hơn 2 năm.
  • Update Plausible: docker compose pull && docker compose up -d. Test ở môi trường staging trước nếu data quan trọng.
  • Monitor: gắn Uptime Kuma ping stats.your-domain.com mỗi 5 phút, alert qua Telegram khi down.
  • Audit log SMTP: kiểm tra weekly report có gửi không, nếu fail thường do SMTP provider thay đổi quota.

So sánh chi phí với SaaS

PlanPageview/thángSố siteGiá
Plausible Cloud Growth10k109 USD
Plausible Cloud Business100k5019 USD
Plausible Cloud Enterprise1M+Unlimited79 USD+
Self-host Cloud VPS 50Unlimited theo capacityUnlimited~25 USD

Self-host rẻ hơn từ mốc 50k pageview/tháng trở lên. Đổi lại bạn quản lý server, làm backup, fix khi update fail. Với dev solo có 4-5 site thu 30-50k visitor mỗi tháng, self-host trên Cloud VPS 50 cân bằng tốt giữa chi phí và công sức.

Lỗi phổ biến

  • Dashboard trống dù site đã có visitor: kiểm tra domain trong Plausible khớp chính xác domain trong snippet (subdomain phải đúng).
  • "Connection refused" khi access: Plausible chưa start xong, đợi 60 giây. Kiểm tra docker logs plausible.
  • SMTP fail không nhận email verify: check log: docker logs plausible | grep -i smtp. Sửa SMTP_USER_PWD nếu sai.
  • ClickHouse out of memory: nâng RAM VPS hoặc giảm max_memory_usage trong cấu hình ClickHouse.
  • Stats không match Google Analytics: bình thường, GA đếm gồm bot, Plausible filter bot. Chênh 5-15 phần trăm là OK.

Có nên tự dựng công cụ phân tích không

Tình huốngNên tự dựng khôngVì sao
Một trang web nhỏ, lượt truy cập thấpKhôngDịch vụ miễn phí đủ dùng, tự dựng là thêm việc
Nhiều trang, cần gộp số liệu về một chỗCó thểChi phí phẳng, không tăng theo số trang
Cần dữ liệu truy cập nằm trên hạ tầng của bạnCóĐây là lý do chính đáng nhất
Muốn công cụ nhẹ, không cần thông báo về cookieCó thểNhưng phải kiểm kỹ điều kiện pháp lý cho trường hợp của bạn
Chưa có ai vận hành máy chủKhôngCơ sở dữ liệu phân tích cần theo dõi và sao lưu

Kiểm sau khi dựng

# Cac thanh phan da chay chua
docker compose ps

# Du lieu co vao khong: dem so su kien trong gio qua
docker compose exec -T plausible_events_db clickhouse-client \
  --query "SELECT count() FROM plausible_events_db.events_v2 WHERE timestamp > now() - INTERVAL 1 HOUR"

# Dung luong hai co so du lieu
docker system df && df -h

# Sao luu CA HAI: co so du lieu su kien va co so du lieu cau hinh
docker compose exec -T plausible_db pg_dump -U postgres plausible_db > /sao-luu/cauhinh-$(date +%F).sql
docker compose exec -T plausible_events_db clickhouse-client \
  --query "BACKUP DATABASE plausible_events_db TO Disk('backups','su-kien-$(date +%F)')"

Điểm hay bị bỏ sót: hệ thống này dùng hai cơ sở dữ liệu khác nhau. Sao lưu một cái thôi thì khôi phục xong sẽ có cấu hình mà mất số liệu, hoặc ngược lại.

Về mặt pháp lý, nói cho đúng

Công cụ không thu thập thông tin định danh và không đặt cookie thì giảm đáng kể nghĩa vụ, nhưng không tự động miễn trừ mọi nghĩa vụ. Với doanh nghiệp Việt Nam, khung áp dụng hiện nay là Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15, hiệu lực từ 01/01/2026, thay thế Nghị định 13/2023. Việc bạn có nghĩa vụ gì phụ thuộc vào loại dữ liệu thực tế thu thập, nên với hệ thống có yêu cầu tuân thủ nghiêm ngặt, hãy tham vấn tư vấn pháp lý thay vì dựa vào một dòng khẳng định chung.

Vận hành hằng tháng, ba việc

  • Kiểm dung lượng cơ sở dữ liệu sự kiện. Nó lớn dần theo lượt truy cập và là thứ làm đầy ổ trước tiên.
  • Kiểm tệp sao lưu có tồn tại và mở được không, không chỉ kiểm tác vụ đã chạy.
  • Cập nhật theo lịch cố định hằng tháng, sau khi đã sao lưu, thay vì cập nhật ngẫu hứng.

FAQ

Plausible CE có giới hạn pageview không?

Không. Bản CE open source cho phép track unlimited pageview, site, user. Giới hạn duy nhất là tài nguyên VPS bạn. Cloud VPS 50 thường xử lý tốt 500k-1M pageview/tháng.

Plausible CE thiếu tính năng gì so với Cloud paid?

Funnel analysis multi-step, ecommerce revenue tracking, team RBAC nâng cao, shared link với password và expire, weekly email summary tự động cho từng site. Hầu hết tính năng phân tích cơ bản đều có ở CE.

Plausible có hỗ trợ Single Sign-On (SSO) không?

Bản CE chưa có SSO built-in. Workaround: đặt Plausible sau Cloudflare Access hoặc Caddy với plugin caddy-security, yêu cầu OAuth Google/GitHub trước khi vào dashboard. User Plausible vẫn tạo qua invite riêng.

Plausible có nhận sự kiện qua server-side API không?

Có. Plausible có Events API endpoint POST /api/event, dùng để track event từ backend (ví dụ confirm payment, subscribe email). Header cần X-Forwarded-For đúng IP user thật để country detection chính xác.

Plausible có chạy trên ARM (Raspberry Pi) được không?

Có. Plausible CE có image multi-arch hỗ trợ arm64. Chạy ổn trên Raspberry Pi 5 8GB cho 1-3 site cá nhân. Với traffic cao thì nên VPS cloud cho ổn định và backup dễ hơn.

Cloud VPS cho vibe coder

Cloud VPS đủ RAM cho Plausible + ClickHouse + Postgres trong 1 stack

Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. Latency tracking script tới user Việt Nam dưới 20ms, không cần CDN.

Xem 8 cấu hình Cloud VPS →