VPS & Hosting cho người Việt

Self-Hosted Analytics Trên VPS 2026: Thay Google Analytics Bằng Plausible & Umami — Privacy-First, Nhanh Hơn, Không Cookie Banner

Tháng 4/2024, Google gửi email: "Your Universal Analytics property will stop processing data on July 1." Tôi migrate sang GA4, và ngay lập tức thấy traffic "biến mất" 40% — không phải vì ít người ghé, mà vì GA4 không đếm được adblock users (35% traffic Việt Nam dùng adblock). Cộng thêm GDPR compliance, cookie banner nhảy um sùm, JS bundle 45KB làm chậm cả website.

Tôi quyết định tìm giải pháp thay thế. Sau 2 tháng test 5 nền tảng analytics khác nhau, tôi chốt Umami cho blog cá nhân và Plausible cho project khách hàng. Cả 2 tự host trên VPS, JS script chỉ 1-2KB (so với 45KB của GA4), không cần cookie banner, hoàn toàn GDPR-compliant, và dashboard load trong 0.3 giây.

Bài này là hành trình "cai nghiện Google Analytics" của tôi: so sánh các lựa chọn, hướng dẫn setup, chi phí thực tế, và những thứ GA4 không bao giờ cho bạn.

💡 TL;DR: Umami (free, JS 1KB) hoặc Plausible (open-source, JS 1.4KB) chạy trên VPS 1GB RAM. Setup Docker 5 phút. Dashboard real-time, privacy-first, không adblock block. Chi phí: VPS 100K/tháng + 0đ license. So với GA4: cắt được 90% JS bundle, không mất traffic vì adblock, không cần cookie banner.

Vấn Đề Với Google Analytics Mà Ai Cũng Gặp Nhưng Ít Nói Ra

GA4 có 4 vấn đề nghiêm trọng mà Google không quảng cáo:

1. Adblock & Privacy Blockers "Ăn" 30-45% Traffic

uBlock Origin, AdGuard, Brave browser — tất cả chặn GA4 theo mặc định. Ở Việt Nam, theo thống kê từ server của tôi, 35.2% visitors dùng adblock. GA4 không đếm được họ. Umami thì có — vì script của nó nhẹ, self-hosted domain, không bị blocklist.

2. JS Bundle 45KB — Nặng Gấp 4 Lần Trang HTML Của Bạn

GA4 script (gtag.js + analytics.js) nặng ~45KB gzipped. Với blog tĩnh HTML 12KB, thêm GA4 là tăng 375% payload. Umami script: 1KB. Plausible: 1.4KB. Sự khác biệt là 40 lần.

3. Cookie Banner Phá Hỏng UX

GA4 dùng cookie để tracking → bạn phải có cookie consent banner. Cái banner nhảy lên mỗi khi user vào site — phiền phức và làm hỏng First Contentful Paint. Umami/Plausible: không dùng cookie → không cần banner → UX sạch.

4. Dữ Liệu Là Của Google, Không Phải Của Bạn

GA4 lưu data trên server Google. Bạn không có raw data, không export được raw events, không biết Google dùng data của bạn để làm gì. Self-hosted analytics: data là của bạn, trên server của bạn, bạn có thể query SQL trực tiếp.

So Sánh 3 Nền Tảng Self-Hosted Analytics Hàng Đầu

Tiêu ChíUmamiPlausibleMatomo
LicenseMIT (free)AGPL (self-host free)GPL (free)
JS Script Size1KB1.4KB22KB
RAM Usage150-200MB250-400MB500MB-1GB
DatabasePostgreSQL / MySQLPostgreSQL / ClickHouseMySQL
Real-time Dashboard
Event Tracking✅ Custom events✅ Custom events + goals✅ Events + Goals + Funnels
UTM / Campaign
API✅ REST API✅ Stats API✅ Full API
Email Reports❌ (WIP)✅ Weekly/Monthly✅ Scheduled Reports
Heatmaps / Session Recording✅ (plugin)
Cookie Banner Required❌ No❌ No⚠️ Yes (có cookie)
VPS Tối Thiểu512MB1GB2GB
Phù HợpBlog, site cá nhânSaaS, business siteE-commerce, enterprise

Tôi dùng Umami cho 5 site cá nhân (blog, portfolio, docs) — nhẹ, free, đủ dùng. Plausible cho 2 site khách hàng — dashboard đẹp hơn, có email report, có goals tracking. Matomo chỉ dùng cho 1 site e-commerce cần funnel + heatmap.

Setup Umami Trên VPS — 5 Phút Với Docker

# 1. Clone Umami
git clone https://github.com/umami-software/umami.git
cd umami

# 2. Docker Compose
cat > docker-compose.yml << 'EOF'
version: '3'
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    ports: ["3000:3000"]
    environment:
      DATABASE_URL: postgresql://umami:password@db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: $(openssl rand -hex 32)
    depends_on: [db]
    restart: unless-stopped
    mem_limit: 256M
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: password
    volumes: [pgdata:/var/lib/postgresql/data]
    restart: unless-stopped
    mem_limit: 256M
volumes:
  pgdata:
EOF

docker compose up -d

# 3. Login: http://your-vps-ip:3000
# Default: admin / umami

# 4. Add website → lấy tracking code
# Thêm 1 dòng này vào <head> của site:
# <script defer src="https://stats.yourdomain.com/script.js"
#   data-website-id="YOUR-ID"></script>

Setup Plausible — Analytics "Xịn" Cho Doanh Nghiệp

# 1. Clone Plausible Community Edition
git clone https://github.com/plausible/community-edition.git
cd community-edition

# 2. Generate secret key
echo "SECRET_KEY_BASE=$(openssl rand -hex 64)" > .env

# 3. Docker Compose (đã có sẵn trong repo)
docker compose up -d

# 4. Truy cập http://your-vps-ip:8000
# Tạo account → add site → lấy tracking script

# 5. Nginx reverse proxy với domain riêng
# Giúp script không bị adblock chặn (same-domain)
cat > /etc/nginx/sites-available/stats << 'NGX'
server {
    listen 443 ssl http2;
    server_name stats.yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/stats.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/stats.yourdomain.com/privkey.pem;
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}
NGX
ln -s /etc/nginx/sites-available/stats /etc/nginx/sites-enabled/
certbot --nginx -d stats.yourdomain.com
nginx -t && systemctl reload nginx
💡 Mẹo quan trọng: Dùng subdomain CÙNG domain chính cho analytics script (ví dụ: stats.yourdomain.com cho site yourdomain.com). Như vậy script là first-party, không bị adblock chặn. Nếu dùng domain khác (umami.is), script bị chặn như GA4.

Migration Từ GA4: Những Gì Bạn Mất & Những Gì Bạn Được

Bạn sẽ MẤT:

Bạn sẽ ĐƯỢC:

Chi Phí: Self-Hosted vs GA4 360 vs SaaS

Phương ÁnChi Phí/ThángGiới HạnPrivacy
Umami self-hosted (VPS 1GB)100K VNĐUnlimited✅ Data của bạn
Plausible self-hosted (VPS 2GB)150K VNĐUnlimited✅ Data của bạn
Plausible Cloud$9/tháng (~225K)10K pageviews/tháng✅ GDPR
Umami Cloud$20/tháng (~500K)100K events/tháng✅ GDPR
GA4 (Free)500K sessions/tháng❌ Google's data
GA4 360$50,000/nămUnlimited❌ Google's data

Self-hosted trên VPS 100-150K/tháng cho unlimited traffic. Plausible Cloud bắt đầu rẻ nhưng scale lên đắt nhanh (10M pageviews = $69/tháng). Tự host là rẻ nhất về lâu dài nếu bạn có nhiều site.

⚠️ Bẫy #1: "Để analytics DB chung ổ cứng với web server" — Tôi từng làm thế. Sau 6 tháng, Umami DB chiếm 30GB cho 5 site trung bình. PostgreSQL ăn hết IOPS của WordPress → web chậm như rùa. Tách analytics sang VPS riêng (hoặc ít nhất volume riêng). VPS 1GB cho Umami, VPS khác cho web — không chung đụng.

Custom Event Tracking — Những Thứ GA4 Cho Là "Phức Tạp"

Với Umami, track event chỉ là 1 dòng JS:

// Track button click
document.getElementById('signup-btn').onclick = () => {
  umami.track('signup-click', { plan: 'pro', source: 'hero' });
};

// Track form submission
document.getElementById('contact-form').onsubmit = () => {
  umami.track('contact-submit', { page: window.location.pathname });
};

// Track scroll depth
let tracked25 = false, tracked50 = false, tracked75 = false, tracked100 = false;
window.addEventListener('scroll', () => {
  const pct = Math.round(window.scrollY / (document.body.scrollHeight - window.innerHeight) * 100);
  if (pct >= 25 && !tracked25) { umami.track('scroll-25'); tracked25 = true; }
  if (pct >= 50 && !tracked50) { umami.track('scroll-50'); tracked50 = true; }
  if (pct >= 75 && !tracked75) { umami.track('scroll-75'); tracked75 = true; }
  if (pct >= 100 && !tracked100) { umami.track('scroll-100'); tracked100 = true; }
});

Tất cả hiện lên dashboard real-time, có filter, có chart. Không cần Google Tag Manager, không cần dataLayer push, không debug 3 lớp.

Backup Analytics Data — Đừng Mất Dữ Liệu 2 Năm Như Tôi

🔴 Bẫy #2: Tháng 1/2026, tôi lỡ tay docker compose down -v — xóa luôn PostgreSQL volume của Umami. Mất 18 tháng analytics data. Không khôi phục được vì không có backup. Đừng lặp lại sai lầm này.
# Backup script cho analytics
#!/bin/bash
# /root/backup-analytics.sh — chạy cron hàng ngày

BACKUP_DIR=/root/backups/analytics
mkdir -p $BACKUP_DIR

# Umami backup
docker exec umami-db-1 pg_dump -U umami umami | gzip > $BACKUP_DIR/umami-$(date +%Y%m%d).sql.gz

# Plausible backup
docker exec plausible-db-1 pg_dump -U plausible plausible | gzip > $BACKUP_DIR/plausible-$(date +%Y%m%d).sql.gz

# Upload lên Cloudflare R2 (10GB free)
# Dùng rclone hoặc aws cli với S3-compatible API

# Xóa backup > 30 ngày
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

Xem thêm: Backup VPS tự động với Restic + Backblaze B2.

Câu Hỏi Thường Gặp

Umami có đếm được unique visitors không?

Có. Umami dùng fingerprint (hash của IP + User-Agent + browser) để đếm unique visitors — không cần cookie. Độ chính xác ~95% so với cookie-based tracking. Plausible dùng similar approach. Đủ dùng cho 99% use case.

Nếu VPS chết thì analytics data có mất không?

Nếu không backup thì có. Luôn backup database analytics hàng ngày ra ngoài server (Cloudflare R2 miễn phí 10GB). Một file backup Umami nặng ~50-200MB/tháng với 500K pageviews — rất nhẹ.

Có import được data từ GA4 không?

Không trực tiếp. GA4 không cho export raw event data (chỉ aggregate report). Bạn có thể export GA4 reports ra CSV rồi import vào Umami API, nhưng mất granularity. Tốt nhất là chạy song song 2 tháng để có baseline, rồi cắt GA4.

Self-hosted analytics có SEO value không?

Có. Page speed là ranking factor — bỏ 45KB GA4 JS giúp site nhanh hơn. Ngoài ra, Google không dùng GA data để rank (theo official statement), nên không mất SEO value khi rời GA.

Tổng Kết

Sau 14 tháng dùng self-hosted analytics, tôi không hề hối hận. Đúng là mất vài tính năng (GSC integration, Google Ads conversion), nhưng đổi lại: data đầy đủ hơn (không bị adblock chặn), web nhanh hơn (JS nhẹ hơn 40 lần), không cần cookie banner, và data là của tôi — tôi có thể query, export, backup, migrate bất kỳ lúc nào.

Công thức: VPS 1GB (100K/tháng) + Umami (free) + backup daily (free on R2) = 100K/tháng. Cho unlimited sites, unlimited traffic. So với GA4 360 giá $50K/năm — đây là deal của thế kỷ.

Bắt đầu ngay: Cài Docker trên VPS, Setup Nginx reverse proxy, Cài SSL Let's Encrypt miễn phí.

📊 VPS Cho Self-Hosted Analytics — Từ 100K/Tháng

VPS 1GB RAM, 20GB NVMe, cài Umami/Plausible trong 5 phút. Analytics privacy-first, không adblock, không cookie banner.

VPS Netihot — 100K/Tháng Tino Group — Snapshot Auto

Kinh nghiệm thực tế sau 14 tháng dùng Umami + Plausible. Số liệu adblock dựa trên thống kê từ 5 website cá nhân tại Việt Nam. Check umami.is và plausible.io để có pricing cloud mới nhất.