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.
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í | Umami | Plausible | Matomo |
|---|---|---|---|
| License | MIT (free) | AGPL (self-host free) | GPL (free) |
| JS Script Size | 1KB | 1.4KB | 22KB |
| RAM Usage | 150-200MB | 250-400MB | 500MB-1GB |
| Database | PostgreSQL / MySQL | PostgreSQL / ClickHouse | MySQL |
| 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ểu | 512MB | 1GB | 2GB |
| Phù Hợp | Blog, site cá nhân | SaaS, business site | E-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
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:
- Google Search Console integration — không có keyword report tự động từ GSC. Phải check GSC riêng.
- Google Ads integration — không track được conversion từ Google Ads tự động. Phải dùng UTM + manual conversion event.
- Demographics data — không có age, gender, interest data (vì không dùng cookie Google).
- Attribution models phức tạp — chỉ có first-touch và last-touch attribution. Không có data-driven attribution như GA4.
Bạn sẽ ĐƯỢC:
- 100% traffic data — không bị adblock "nuốt" 35% visitors
- Real-time thực sự — dashboard cập nhật từng giây, không delay 24-48h như GA4
- Raw data ownership — query PostgreSQL trực tiếp:
SELECT * FROM pageview WHERE created_at > now() - interval '7 days' - GDPR/CCPA compliant out-of-box — không cần cookie banner, không cần lawyer review
- Page speed tăng — JS analytics giảm từ 45KB → 1KB
- Unlimited sites/sessions — không giới hạn như GA4 (500K sessions/tháng trên free tier)
Chi Phí: Self-Hosted vs GA4 360 vs SaaS
| Phương Án | Chi Phí/Tháng | Giới Hạn | Privacy |
|---|---|---|---|
| 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) | 0đ | 500K sessions/tháng | ❌ Google's data |
| GA4 360 | $50,000/năm | Unlimited | ❌ 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.
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
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 AutoKinh 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.