VPS Murah Nevacloud

Yuk, Self-Host Umami di VPS: Analitik Website Sendiri Tanpa Google Analytics

Halo Sobat Online! Kalau kamu punya website atau blog sendiri, pasti penasaran dong: berapa orang yang datang hari ini, halaman mana yang paling banyak dibaca, dan dari mana saja mereka berasal? Selama ini jawabannya identik dengan Google Analytics. Padahal ada jalan lain yang lebih rapi: self-host Umami di VPS milikmu sendiri, sehingga data pengunjung tidak perlu menyeberang ke server pihak ketiga.

Umami adalah platform analitik web open-source yang ringan, tanpa cookie, dan tidak menyimpan data pribadi pengunjung. Sejak versi 3, Umami hanya mendukung PostgreSQL sebagai basis data (MySQL dihapus), dan rilis terbarunya — v3.4.0 yang terbit September 2026 — sudah membawa heatmap, session replay, sampai pelacakan Core Web Vitals. Menariknya, memasangnya cuma butuh satu file docker-compose.yml.

Di panduan ini kita akan jalan bareng dari nol: menyiapkan VPS, menulis konfigurasi Docker, memasang Nginx reverse proxy plus HTTPS gratis, sampai menempel kode pelacak di website. Yuk, mulai!

Kenapa Self-Host Umami di VPS Lebih Masuk Akal?

Sebelum ngoprek, mari pahami dulu alasan orang pindah dari Google Analytics ke Umami:

  • Data sepenuhnya milikmu. Semua statistik tersimpan di database PostgreSQL di VPS sendiri. Tidak ada pihak lain yang bisa membaca, menjual, atau menyetel ulang data itu.
  • Tanpa cookie dan tanpa data pribadi. Umami tidak memasang cookie pelacak dan tidak menyimpan identitas pengunjung, jadi umumnya tidak memicu permintaan izin cookie hanya untuk keperluan analitik.
  • Sangat ringan. Skrip pelacaknya berukuran di bawah 2 KB, jauh lebih kecil daripada skrip analitik bawaan platform besar. Ini penting untuk Performa Website dan skor Core Web Vitals.
  • Biaya tetap dan murah. Kamu hanya membayar VPS. Tidak ada batas pageview, tidak ada tagihan per event, dan tidak ada kejutan di akhir bulan.
  • Tetap punya fitur analitik modern. Funnel, segment, cohort, event kustom, heatmap, dan laporan Web Vitals tersedia tanpa langganan.

Singkatnya, kalau kamu serius mengurus website, memiliki analitik website sendiri memberi kamu kontrol penuh sekaligus ketenangan soal privasi.

Apa Saja yang Dibutuhkan?

Siapkan bahan-bahan berikut sebelum mulai:

  1. VPS dengan minimal 1 GB RAM (2 GB lebih nyaman), Ubuntu 22.04 atau 24.04 LTS.
  2. Docker Engine dan Docker Compose plugin (kita pasang di langkah pertama).
  3. Domain atau subdomain, misalnya stats.namadomain.com, yang sudah diarahkan ke IP VPS.
  4. Akses root atau user dengan hak sudo lewat SSH.

Satu tips penamaan: hindari subdomain analytics.namadomain.com karena sebagian pemblokir iklan memblokirnya. Pakai stats. atau insight. supaya skrip pelacak lebih jarang diblokir.

Langkah 1 — Siapkan Docker dan Folder Kerja

Masuk ke VPS lewat SSH, perbarui sistem, lalu pasang Docker:


sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Keluar dari sesi SSH lalu masuk kembali supaya keanggotaan grup docker aktif (sudo tidak akan diminta lagi untuk perintah Docker). Setelah itu buat folder kerja:


sudo mkdir -p /opt/umami
sudo chown $USER:$USER /opt/umami
cd /opt/umami

Semua file konfigurasi kita taruh di /opt/umami supaya rapi dan mudah di-backup nanti.

Langkah 2 — Isi File .env dengan Kredensial

Umami butuh tiga rahasia utama. Buatlah password database dan dua kunci acak dulu:


openssl rand -hex 16   # untuk POSTGRES_PASSWORD
openssl rand -hex 32   # untuk APP_SECRET
openssl rand -hex 32   # untuk TWO_FACTOR_ENCRYPTION_KEY

Perhatikan: TWO_FACTOR_ENCRYPTION_KEY wajib berupa 64 karakter hex (persis hasil openssl rand -hex 32), karena kunci ini dipakai untuk mengenkripsi rahasia autentikasi dua faktor. Kalau nanti kamu ingin mengaktifkan 2FA, kunci ini harus sudah terpasang sejak awal.

Selanjutnya buat file /opt/umami/.env berisi:


POSTGRES_DB=umami
POSTGRES_USER=umami
POSTGRES_PASSWORD=tempel-hasil-openssl-hex-16
DATABASE_URL=postgresql://umami:tempel-hasil-openssl-hex-16@db:5432/umami
APP_SECRET=tempel-hasil-openssl-hex-32
TWO_FACTOR_ENCRYPTION_KEY=tempel-hasil-openssl-hex-32-satunya
DISABLE_TELEMETRY=1

Perhatikan bahwa DATABASE_URL memakai hostname db, bukan localhost. Nama itu adalah nama service di Compose yang segera kita buat, dan Docker akan menerjemahkannya otomatis di dalam jaringan internal.

Langkah 3 — Susun docker-compose.yml

Buat file /opt/umami/docker-compose.yml seperti ini:


services:
  umami:
    image: ghcr.io/umami-software/umami:3.4.0
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      DATABASE_URL: ${DATABASE_URL}
      APP_SECRET: ${APP_SECRET}
      TWO_FACTOR_ENCRYPTION_KEY: ${TWO_FACTOR_ENCRYPTION_KEY}
      DISABLE_TELEMETRY: ${DISABLE_TELEMETRY}
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://localhost:3000/api/heartbeat || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 6
      start_period: 30s
    init: true
    restart: always

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: UTC
    volumes:
      - umami-db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always

volumes:
  umami-db-data:

Ada tiga keputusan penting di sini, dan ketiganya sengaja:

  1. Port dibind ke 127.0.0.1. Aplikasi hanya bisa diakses dari dalam VPS, lalu dibuka ke internet lewat Nginx dengan HTTPS. Tidak ada port 3000 yang menganga.
  2. Image ditulis dengan tag versi (3.4.0), bukan latest. Dengan begitu kamu tahu persis versi apa yang jalan, dan upgrade dilakukan sadar, bukan karena kebetulan.
  3. Timezone database disetel UTC. Umami menyarankan UTC agar cap waktu konsisten dan tidak meleset karena perbedaan zona waktu.

Langkah 4 — Jalankan dan Cek Kesehatannya

Nyalakan tumpukan container:


cd /opt/umami
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:3000/api/heartbeat

Kalau endpoint /api/heartbeat menjawab dengan status sehat, artinya aplikasi dan database sudah terhubung. Proses pertama kali memang agak lama karena Umami menjalankan migrasi skema database secara otomatis.

Langkah 5 — Pasang Nginx Reverse Proxy dan HTTPS Gratis

Sekarang kita buka akses dari luar. Pasang Nginx dan Certbot:


sudo apt install -y nginx certbot python3-certbot-nginx

Buat file /etc/nginx/sites-available/umami:


server {
    listen 80;
    server_name stats.namadomain.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Aktifkan lalu uji konfigurasinya:


sudo ln -s /etc/nginx/sites-available/umami /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Terakhir, minta sertifikat SSL gratis dan biarkan Certbot mengurus perpanjangannya:


sudo certbot --nginx -d stats.namadomain.com

Pola reverse proxy ini persis seperti yang kita bahas di panduan Nginx reverse proxy plus Certbot sebelumnya. Satu catatan penting kalau domainmu berada di belakang Cloudflare: tambahkan CLIENT_IP_HEADER: cf-connecting-ip pada environment Umami agar alamat IP pengunjung dibaca dari header Cloudflare, bukan dari IP proxy. proxy_set_header Upgrade dan Connection di atas juga berguna kalau kamu memakai fitur realtime.

Langkah 6 — Login, Ganti Password, dan Ambil Website ID

Buka https://stats.namadomain.com di browser. Umami membuat akun bawaan dengan username admin dan password umami. Ganti password itu di menit pertama — jangan pernah biarkan kredensial bawaan hidup lebih lama dari yang diperlukan.

Setelah masuk:

  1. Buka halaman Settings → Websites.
  2. Tambahkan website baru, isi nama dan domainnya.
  3. Buka kembali detail website tersebut, lalu salin nilai data-website-id — bentuknya UUID seperti 94db1cb1-74f4-4a40-ad6c-962362670409.

Simpan UUID itu; kita pakai di langkah berikutnya.

Langkah 7 — Tempel Kode Pelacak di Website

Website HTML biasa

Tambahkan skrip ini di dalam <head> setiap halaman:


<script defer src="https://stats.namadomain.com/script.js"
  data-website-id="TEMPEL-UUID-KAMU"></script>

Atribut data-auto-track mengikuti perilaku bawaan, jadi pageview, klik, dan deteksi perpindahan halaman langsung aktif tanpa konfigurasi tambahan.

Aplikasi Next.js

Kalau website-mu dibangun dengan Next.js seperti pada panduan deploy Next.js di VPS pakai PM2, pakai komponen Script bawaan agar tidak bentrok dengan optimasi framework:


import Script from "next/script";

export default function RootLayout({ children }) {
  return (
    <html lang="id">
      <body>
        {children}
        <Script
          defer
          src="https://stats.namadomain.com/script.js"
          data-website-id="TEMPEL-UUID-KAMU"
          strategy="afterInteractive"
        />
      </body>
    </html>
  );
}

Strategi afterInteractive membuat skrip dimuat setelah halaman utama siap, sehingga tidak menahan render. Kalau aplikasimu berupa SPA dan kamu ingin mengirim pageview secara manual, gunakan data-auto-pageview="false" — fitur ini hadir sejak Umami v3.2.0 dan tetap membiarkan fitur lain seperti pelacakan performa berjalan.

Akali Ad Blocker dan Pantau Core Web Vitals

Dua penyesuaian kecil yang cukup berdampak:

  • Ganti nama skrip lewat variabel TRACKER_SCRIPT_NAME (misalnya getinfo) supaya tidak ikut diblokir pemblokir iklan yang menandai nama script.js. Jangan lupa sesuaikan src di kode pelacak.
  • Aktifkan pelacakan performa dengan menambahkan data-performance="true" agar Umami mengumpulkan Core Web Vitals (LCP, INP, CLS) dari browser pengunjung. Ini pasangan yang bagus untuk audit performa manual.

Langkah 8 — Backup Database dan Update dengan Aman

Analitik adalah data historis: kehilangannya tidak bisa dikembalikan. Jadi biasakan membuat dump rutin:


docker compose exec -T db pg_dump -U umami umami > backup-umami-$(date +%F).sql

Simpan hasilnya ke luar VPS (misalnya ke object storage atau VPS lain), dan jadwalkan lewat cron kalau perlu. Untuk memperbarui Umami, ubah tag versi di docker-compose.yml, lalu jalankan:


docker compose pull
docker compose up -d

Migrasi skema berjalan sendiri saat container naik, tapi tetap baca catatan rilis dan ambil backup lebih dulu setiap kali berpindah versi besar.

Kesimpulan: Analitik Website Sendiri Itu Investasi Kecil

Sobat Online, dalam beberapa langkah kita sudah membangun analitik pribadi yang ringan, tanpa cookie, dan sepenuhnya di bawah kendali sendiri. Kamu tidak perlu lagi menitipkan data pengunjung ke platform pihak ketiga, dan tidak ada biaya bulanan tambahan selain VPS yang sudah kamu sewa.

Kalau mau, lanjutkan dengan mengaktifkan autentikasi dua faktor (kunci TWO_FACTOR_ENCRYPTION_KEY sudah kamu siapkan di langkah kedua), membuat funnel untuk memantau alur pendaftaran, atau menempelkan pixel di email agar ketahuan berapa banyak yang membuka newsletter. Server yang rapi hari ini adalah modal tenang besok. Selamat mencoba, dan jangan ragu bereksperimen!

Baca juga

Nevacloud VPS Indonesia

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *