Cara Install Umami Analytics: Self-Hosted Web Analytics

Cara Install Umami Analytics: Self-Hosted Web Analytics

Bitnesia Software Sep 2, 2026 3 EN

Memantau jumlah pengunjung website biasanya identik dengan Google Analytics karena gratis dan mudah dipakai. Namun, makin ke sini banyak pemilik website dan pengelola sistem mulai merasa lelah: tampilan navigasinya makin rumit, ada aturan hukum privasi yang bikin kita wajib memasang banner persetujuan cookie (consent banner) yang mengganggu tampilan, hingga kekhawatiran karena data pengunjung disimpan di server milik perusahaan lain. Dari sinilah muncul pencarian alternatif yang lebih simpel dan aman. Salah satu solusi terbaiknya adalah Umami Analytics, layanan pemantau trafik yang bisa kita pasang sendiri di server pribadi (self-hosted), sehingga kontrol dan data pengunjung tetap 100% berada di tangan kita.

Apa Itu Umami Analytics?

Umami adalah platform web analytics open source yang bisa kita self-hosted sendiri di server pribadi, tanpa mengirim data pengunjung ke pihak ketiga mana pun. Tools ini lahir sebagai jawaban atas dua keluhan paling umum soal Google Analytics: dashboard yang terlalu padat fitur, dan kekhawatiran privasi karena data trafik ikut diproses di infrastruktur Google.

Banyak developer dan blogger mulai pindah dari Google Analytics ke alternatif seperti Umami karena tiga alasan: regulasi privasi seperti GDPR yang makin ketat, biaya hosting yang bisa ditekan hampir ke nol karena sifat self-hosted analytics ini, dan kebutuhan dashboard yang cukup menampilkan angka penting tanpa noise berlebihan. Umami menjawab ketiganya sekaligus lewat konsep analytics tanpa tracking invasif: kita tetap dapat data agregat trafik, tapi Visitor tidak dijejaki lintas situs pakai cookie pihak ketiga. Instalasinya ringan, tracking script-nya cuma sekitar 2KB, dan datanya sepenuhnya tersimpan di server kita sendiri.

Kenapa Pilih Umami Analytics?

Kelebihan Dibanding Google Analytics

Ada empat kelebihan utama yang membuat Umami layak dipertimbangkan sebagai pengganti Google Analytics.

  • Ramah GDPR. Umami tidak menyimpan data pribadi yang mengidentifikasi Visitor secara individual, sehingga di banyak kasus kita tidak perlu memasang consent banner cookie yang mengganggu pengalaman baca.
  • Tracking script ringan. Ukurannya sekitar 2KB, jauh lebih kecil dibanding gtag.js milik Google Analytics, sehingga dampaknya ke waktu muat halaman minim.
  • Dashboard fokus. Kita hanya melihat metrik yang benar-benar penting: jumlah visitor, page views, referrer, dan lokasi, tanpa harus menggali menu berlapis-lapis.
  • Kontrol penuh atas data. Karena self-hosted, semua data trafik tersimpan di database milik kita sendiri, bukan di server pihak ketiga.

Kasus Penggunaan Ideal

Umami paling cocok dipakai pada beberapa skenario berikut.

  • Blog pribadi dan portofolio yang tidak butuh fitur enterprise seperti funnel analysis kompleks.
  • Website skala kecil sampai menengah dengan trafik belum sampai jutaan page views per bulan.
  • Proyek yang privasi Visitor jadi prioritas, misalnya layanan yang menargetkan pengguna di Uni Eropa.
  • Developer yang lelah mengurus setup consent management platform hanya untuk Google Analytics.

Prasyarat Sebelum Install

Sebelum mulai instalasi, siapkan beberapa hal berikut supaya proses tidak berhenti di tengah jalan.

  • Server dengan Docker. Umami resmi mendukung deployment lewat Docker Compose, jadi pastikan Docker Engine dan plugin Docker Compose sudah terpasang di VPS.
  • Node.js versi 18.18 atau lebih baru, kalau kita memilih instalasi manual dari source code sebagai alternatif di luar jalur Docker Compose yang dibahas di artikel ini.
  • PostgreSQL versi 12.14 ke atas sebagai database. Perlu dicatat, mulai Umami v3 dukungan MySQL sudah dihapus total, jadi PostgreSQL kini satu-satunya database resmi yang didukung.
  • Domain atau subdomain khusus untuk dashboard, misalnya analytics.namadomain.com, dengan DNS record yang sudah diarahkan (A record) ke IP publik VPS.
  • Pemahaman dasar Linux, seperti navigasi direktori dan mengedit file lewat terminal, karena seluruh proses instalasi di artikel ini berjalan lewat command line VPS.

Soal biaya, self-hosted di VPS sendiri praktis gratis di luar biaya server itu sendiri. Kombinasi container Umami dan PostgreSQL relatif ringan di RAM, jadi VPS dengan RAM 1GB biasanya sudah cukup untuk trafik kecil-menengah.

Instalasi Umami Step-by-Step

Ada dua tahap supaya Umami siap dipakai production: menjalankan Umami dan PostgreSQL lewat Docker Compose, lalu membungkusnya dengan reverse proxy Nginx supaya dashboard bisa diakses lewat HTTPS di domain sendiri.

Docker Compose di VPS

Instalasi lewat Docker Compose paling direkomendasikan karena Umami dan PostgreSQL berjalan dalam container terpisah, gampang diupgrade, dan tidak mengotori sistem operasi utama VPS.

  1. Buat direktori kerja untuk menyimpan file konfigurasi, lalu masuk ke dalamnya.
    mkdir umami && cd umami
  2. Generate dua string acak yang nanti dipakai sebagai nilai APP_SECRET dan TWO_FACTOR_ENCRYPTION_KEY. Jalankan perintah ini dua kali secara terpisah dan catat hasilnya, supaya nilai keduanya tidak sama, biar token autentikasi dan kunci enkripsi 2FA tidak mudah ditebak Attacker.
    openssl rand -hex 32
  3. Buat file docker-compose.yml berisi konfigurasi berikut. Ganti nilai APP_SECRET dan TWO_FACTOR_ENCRYPTION_KEY dengan dua hasil openssl dari langkah sebelumnya, lalu ganti juga POSTGRES_PASSWORD dan bagian password pada DATABASE_URL supaya kredensial database tidak dibiarkan default.
    services:
      umami:
        image: ghcr.io/umami-software/umami:latest
        ports:
          - "127.0.0.1:3000:3000"
        environment:
          DATABASE_URL: postgresql://umami:umami@db:5432/umami
          APP_SECRET: ganti-dengan-hasil-openssl-pertama
          TWO_FACTOR_ENCRYPTION_KEY: ganti-dengan-hasil-openssl-kedua
        depends_on:
          db:
            condition: service_healthy
        init: true
        restart: always
        healthcheck:
          test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
          interval: 5s
          timeout: 5s
          retries: 5
      db:
        image: postgres:15-alpine
        environment:
          POSTGRES_DB: umami
          POSTGRES_USER: umami
          POSTGRES_PASSWORD: umami
        volumes:
          - umami-db-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:
  4. Jalankan perintah berikut untuk membangun dan menjalankan kedua container di background.
    docker compose up -d
  5. Cek status container, pastikan kolom status kedua service menunjukkan healthy.
    docker compose ps

Baris ports: 127.0.0.1:3000:3000 di atas sengaja membatasi Umami hanya bisa diakses dari server itu sendiri, bukan langsung dari internet publik. Login pertama nanti dilakukan lewat reverse proxy di langkah berikutnya, bukan lewat IP server secara langsung.

Reverse Proxy dan HTTPS dengan Nginx

Akses langsung ke port 3000 hanya cocok untuk pengujian awal. Untuk pemakaian production, taruh Umami di belakang reverse proxy Nginx supaya dashboard bisa diakses lewat domain sendiri dengan HTTPS, sesuai domain yang sudah disiapkan di bagian prasyarat.

  1. Install Nginx dan plugin Certbot untuk Nginx.
    apt update && apt install -y nginx certbot python3-certbot-nginx
  2. Buat file konfigurasi Nginx baru untuk domain Umami.
    nano /etc/nginx/sites-available/umami
  3. Isi file tersebut dengan konfigurasi berikut, sesuaikan server_name dengan domain kita.
    server {
        listen 80;
        server_name analytics.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;
        }
    }
  4. Aktifkan konfigurasi tersebut lewat symlink ke sites-enabled, lalu tes syntax dan reload Nginx.
    ln -s /etc/nginx/sites-available/umami /etc/nginx/sites-enabled/
    nginx -t
    systemctl reload nginx
  5. Terbitkan sertifikat SSL lewat Certbot. Certbot otomatis mengubah konfigurasi Nginx ke HTTPS dan mendaftarkan jadwal perpanjangan sertifikat.
    certbot --nginx -d analytics.namadomain.com
  6. Akses dashboard lewat https://analytics.namadomain.com, lalu login pakai kredensial bawaan admin / umami.

Ganti password default itu detik itu juga setelah login pertama. Kredensial bawaan ini dikenal luas di komunitas, jadi kalau dashboard sempat terekspos sebelum password diganti, Attacker bisa saja mencoba login pakai kombinasi default tersebut. Header X-Forwarded-For dan X-Real-IP pada konfigurasi Nginx di atas penting supaya Umami mencatat IP asli Visitor, bukan IP Nginx itu sendiri.

Konfigurasi dan Integrasi Tracking

Setelah dashboard aktif, langkah berikutnya menghubungkan website ke Umami supaya data trafik mulai masuk.

  1. Login ke dashboard, klik menu Websites di sidebar.
  2. Klik tombol Add website, isi field Name (nama bebas, biasanya sama dengan domain) dan Domain (domain asli website, dipakai untuk memfilter referrer dari domain sendiri).
  3. Simpan, lalu buka kembali data website tadi dan klik Edit untuk melihat tracking code yang sudah disediakan otomatis.
  4. Salin snippet berikut, lalu tempel sebelum tag penutup </head> di website kita, atau masukkan lewat tag manager kalau website memakainya.
    <script defer src="https://analytics.namadomain.com/script.js" data-website-id="uuid-website-kita"></script>
  5. Buka website di tab baru, lalu cek tab Realtime di dashboard Umami. Kalau kunjungan kita muncul dalam beberapa detik, integrasi berhasil.

Atribut data-website-id adalah UUID unik per website, jadi jangan sampai tertukar kalau kita mengelola tracking untuk beberapa domain sekaligus.

Menggunakan Dashboard Umami

Dashboard Umami dirancang supaya informasi penting langsung terlihat tanpa perlu drill-down berlapis-lapis.

  • Real-time visitors: jumlah Visitor yang sedang aktif di website saat ini, update otomatis tanpa refresh manual.
  • Page views dan bounce rate: bounce rate menunjukkan persentase Visitor yang cuma membuka satu halaman lalu pergi, berguna untuk menilai relevansi konten. Perlu dicatat, kalkulasinya berbasis pageview, jadi untuk website dengan interaksi tinggi lewat custom events di satu halaman saja, angka bounce rate bisa terlihat lebih tinggi dari kondisi sebenarnya.
  • Traffic sources: menampilkan referrer, yaitu asal Visitor datang, entah dari mesin pencari, media sosial, atau tautan langsung.
  • Custom events: metrik non-pageview seperti klik tombol, submit form, atau checkout yang kita definisikan sendiri lewat kode.
  • UTM parameters: dashboard otomatis mengelompokkan trafik berdasarkan parameter utm_source, utm_medium, dan utm_campaign di URL kampanye.
  • Export data: fitur unduh laporan ke CSV lewat UI tersedia resmi di Umami Cloud. Untuk instance self-hosted, cara paling umum adalah query langsung ke database PostgreSQL atau memanfaatkan REST API bawaan Umami untuk menarik data mentah.

Tips dan Best Practice

Custom Events untuk Tracking Konversi

Untuk kasus seperti e-commerce atau SaaS, page views saja tidak cukup. Kita perlu tahu kapan Visitor benar-benar klik tombol checkout atau submit form. Umami menyediakan fungsi umami.track() di sisi client untuk merekam event semacam ini.

const tombolBeli = document.getElementById('checkout-button');

tombolBeli.addEventListener('click', () => {
  umami.track('checkout-click', {
    plan: 'pro',
    harga: 15,
  });
});

Event data seperti plan dan harga di atas akan muncul di tab Events pada dashboard, lengkap dengan breakdown per nilai properti.

Transparansi ke Visitor

Walau Umami tidak memakai cookie untuk tracking individual, tetap cantumkan pemberitahuan singkat di halaman privacy policy bahwa website memakai analytics self-hosted. Langkah ini bukan kewajiban hukum mutlak di semua yurisdiksi, tapi menjaga trust User tetap penting untuk reputasi jangka panjang.

Perhatikan Performa dan Backup

Ukuran script yang kecil membuat dampaknya ke waktu render nyaris tidak terasa, tapi tetap pasang atribut defer supaya loading script tidak memblokir rendering halaman utama. Selain itu, jadwalkan backup rutin untuk database PostgreSQL supaya histori trafik tidak hilang kalau server bermasalah. Buka crontab -e, lalu tambahkan baris berikut untuk menjalankan pg_dump setiap jam 3 pagi dan menyimpan hasilnya dalam bentuk terkompresi.

0 3 * * * docker exec umami-db-1 pg_dump -U umami umami | gzip > /root/backup/umami-$(date +\%F).sql.gz

Pastikan direktori /root/backup sudah dibuat lebih dulu, dan sesekali salin hasil backup ini ke penyimpanan terpisah dari VPS utama, supaya data tetap aman kalau seluruh server bermasalah.

Troubleshooting Umum

Tracking Tidak Muncul di Dashboard

Penyebab paling sering adalah ad blocker di browser Visitor yang memblokir file script.js, karena nama file itu sudah dikenali banyak blocklist. Solusinya, set environment variable TRACKER_SCRIPT_NAME ke nama custom, misalnya data-collect, lalu jalankan ulang docker compose up -d supaya perubahan diterapkan.

TRACKER_SCRIPT_NAME: data-collect

Kalau yang diblokir justru endpoint pengiriman datanya (bukan file script-nya), Umami juga menyediakan variabel COLLECT_API_ENDPOINT untuk memindahkan endpoint pengumpulan data ke path custom.

COLLECT_API_ENDPOINT: /data-endpoint

Koneksi Database Gagal

Kalau container umami terus restart, cek log lewat perintah berikut.

docker compose logs -f umami

Penyebab umum adalah format DATABASE_URL yang salah ketik, atau service db belum sempat siap saat umami mencoba connect. Compose resmi sudah menyertakan healthcheck dan depends_on: condition: service_healthy untuk mengurangi risiko ini, jadi pastikan konfigurasi itu tidak terhapus saat kita modifikasi file.

Timezone Dashboard Tidak Sesuai

Kalau timestamp di dashboard terasa geser dari jam server, cek konfigurasi timezone database. Dokumentasi resmi Umami merekomendasikan PostgreSQL dikonfigurasi memakai timezone UTC supaya timestamp konsisten di semua environment. Tambahkan variabel berikut pada service db kalau image PostgreSQL yang dipakai belum default ke UTC.

TZ: UTC

IP Visitor Salah Terbaca

Kalau Umami berjalan di belakang reverse proxy seperti Nginx yang sudah kita pasang di bagian instalasi, atau layanan seperti Cloudflare Tunnel, IP yang tercatat bisa jadi IP milik proxy, bukan IP asli Visitor. Tambahkan variabel CLIENT_IP_HEADER supaya Umami membaca IP asli dari header yang diteruskan proxy. Untuk konfigurasi Nginx yang sudah mengirim header X-Forwarded-For seperti pada bagian instalasi, gunakan nilai berikut.

CLIENT_IP_HEADER: X-Forwarded-For

Kalau Umami berjalan di belakang Cloudflare Tunnel, ganti nilainya jadi berikut.

CLIENT_IP_HEADER: cf-connecting-ip

Kesimpulan

Umami memberi tiga hal yang sulit didapat bareng-bareng di Google Analytics: privasi data yang terjaga, dashboard yang tidak bikin pusing, dan biaya operasional mendekati nol lewat instalasi self-hosted analytics sendiri. Setup lewat Docker Compose dan reverse proxy Nginx hanya butuh beberapa perintah untuk sampai ke instance production yang sepenuhnya kita kendalikan sendiri.

Pilih Umami kalau prioritas kita adalah kontrol data dan kesederhanaan, bukan fitur analytics tingkat enterprise seperti funnel analysis mendalam. Untuk kebutuhan blog pribadi, portofolio, atau proyek skala kecil-menengah, kombinasi ringan dan privacy-first ini biasanya sudah lebih dari cukup.

Dukung keberlanjutan tutorial open source Bitnesia melalui link di bawah ini.

Kirim Donasi

Related Posts