Tools Review

GoAccess: Monitor Traffic Website Real-Time Langsung dari Terminal Linux

GoAccess: Monitor Traffic Website Real-Time Langsung dari Terminal Linux

Google Analytics itu overkill untuk 90% website personal dan blog. Serius. Kamu butuh script tracking 45KB yang memperlambat page load, cookie consent banner yang bikin user experience jelek, dan dashboard kompleks yang pada akhirnya cuma kamu buka untuk liat pageviews.

Ada alternatif yang sudah saya pakai selama 8 bulan: GoAccess. Tool command-line yang analisis log server kamu secara real-time dan tampilkan data yang benar-benar kamu butuhkan — siapa yang mengunjungi, dari mana, halaman apa yang populer, dan berapa bandwidth yang terpakai. Tanpa JavaScript, tanpa cookie, tanpa tracking.

Artikel ini bukan tutorial instalasi dangkal. Ini panduan lengkap setup GoAccess di production, termasuk konfigurasi advanced, integrasi dengan Nginx/Caddy, dan cara bikin dashboard publik yang bisa kamu share ke client.

Apa Itu GoAccess?

GoAccess adalah open-source real-time web log analyzer dan interactive viewer yang berjalan di terminal. Dia bisa parse log dari hampir semua web server: Nginx, Apache, Caddy, Lighttpd, bahkan custom log format.

Fitur yang bikin saya jatuh cinta:

  • Real-time dashboard — data update setiap detik di terminal, mirip htop tapi untuk web traffic.
  • HTML report — generate static HTML dashboard yang bisa diakses dari browser.
  • Zero overhead — tidak ada JavaScript injection, tidak memperlambat website.
  • Accurate — data dari server log, bukan client-side. Tidak ter-block ad blocker.
  • Support semua log format — Nginx combined, Apache, AWS CloudFront, bahkan custom regex.

Install GoAccess

Di Ubuntu/Debian:

sudo apt update
sudo apt install goaccess

Atau kalau mau versi terbaru dengan GeoIP support:

sudo apt install build-essential libncursesw5-dev libgeoip-dev libtokyocabinet-dev
wget https://tar.goaccess.io/goaccess-1.9.2.tar.gz
tar -xzvf goaccess-1.9.2.tar.gz
cd goaccess-1.9.2/
./configure --enable-utf8 --enable-geoip=mmdb --enable-tokyocabinet
make && sudo make install

Kenapa compile dari source? Karena versi apt sering outdated dan tidak include GeoIP support. GeoIP memungkinkan kamu lihat asal negara/region dari setiap visitor — data yang sangat berharga untuk SEO dan content strategy.

Konfigurasi untuk Nginx

Nginx default pakai "combined" log format. GoAccess sudah support ini out-of-the-box:

goaccess /var/log/nginx/access.log --log-format=COMBINED

Ini langsung buka dashboard interaktif di terminal. Kamu bisa navigate dengan arrow keys, TAB, dan shortcut lainnya. Data yang ditampilkan:

  • Unique visitors per hari
  • Requested files/URLs (paling populer)
  • Static files (CSS, JS, images)
  • Referring sites
  • 404 errors
  • Operating systems dan browsers
  • Visitor hosts/IPs
  • Geographic location (kalau GeoIP aktif)

Konfigurasi untuk Caddy

Caddy default pakai log format yang berbeda dari Nginx. Tambahkan ini di Caddyfile:

yourdomain.com {
    # ... existing config ...
    
    log {
        output file /var/log/caddy/access.log
        format console
    }
}

Kemudian di GoAccess:

goaccess /var/log/caddy/access.log --log-format=CADDY

Kalau kamu pakai Caddy sebagai reverse proxy, baca panduan Caddy auto-HTTPS untuk konfigurasi logging yang lebih lengkap. Perbandingan Caddy vs Nginx untuk use case ini ada di artikel Caddy vs Nginx.

Real-Time HTML Dashboard

Ini fitur yang paling sering saya pakai. Generate HTML dashboard yang auto-refresh:

goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  -o /var/www/html/dashboard.html \
  --real-time-html \
  --ws-url=wss://monitor.yourdomain.com

Parameter --real-time-html bikin GoAccess tetap jalan sebagai daemon dan push update ke HTML file via WebSocket. --ws-url set WebSocket URL yang client browser akan connect ke.

Untuk serve WebSocket, kamu perlu proxy WebSocket traffic di Nginx:

server {
    listen 443 ssl;
    server_name monitor.yourdomain.com;
    
    ssl_certificate /etc/letsencrypt/live/monitor.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monitor.yourdomain.com/privkey.pem;
    
    location / {
        root /var/www/html;
        index dashboard.html;
    }
    
    location /ws {
        proxy_pass http://127.0.0.1:7890;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
}

Buka https://monitor.yourdomain.com dan kamu punya live dashboard yang update setiap detik. Tidak perlu Google Analytics, tidak perlu Matomo, tidak perlu Plausible. Data 100% di servermu.

Untuk setup Nginx yang lebih detail, baca install Nginx di Ubuntu dan Nginx reverse proxy untuk Docker.

Konfigurasi Advanced

Custom Log Format

Kalau kamu pakai log format custom (misalnya JSON), GoAccess bisa handle itu juga:

goaccess access.log --log-format='^h { ^ }^ ~^s" ~R ~m "^U" "^q" ~a' --date-format=%%d/%%b/%%Y --time-format=%%H:%%M:%%S

Atau kalau Nginx log dalam format JSON (recommended untuk pipeline):

# Di nginx.conf
log_format json_combined escape=json
  '{"time":"$time_iso8601",'
   '"remote_addr":"$remote_addr",'
   '"request":"$request",'
   '"status":"$status",'
   '"body_bytes_sent":"$body_bytes_sent",'
   '"http_referer":"$http_referer",'
   '"http_user_agent":"$http_user_agent"}';

Ini sangat berguna kalau kamu juga pakai tool seperti Prometheus dan Grafana untuk monitoring — format JSON bisa di-parse oleh kedua tool.

Filter by Date

goaccess access.log --log-format=COMBINED --date-spec=hr

Ini breakdown data per jam, bukan per hari. Sangat useful untuk analisis traffic pattern — kapan peak hours, kapan sepi.

Filter by Status Code

Untuk audit 404 errors:

grep " 404 " /var/log/nginx/access.log | goaccess - --log-format=COMBINED

Saya pakai ini setiap minggu untuk identify broken links dan redirect yang perlu diperbaiki. Cepat, efektif, tanpa perlu tool pihak ketiga.

Exclude Bots

Traffic bot bikin data tidak akurat. Exclude dengan panel config:

goaccess access.log --log-format=COMBINED --exclude-ip=66.249.64.0/19

Atau lebih comprehensif, filter berdasarkan User-Agent:

cat /var/log/nginx/access.log | grep -viE '(bot|crawler|spider|uptime|monitor)' | goaccess - --log-format=COMBINED

GeoIP: Tahu Asal Visitor

Download MaxMind GeoLite2 database (gratis, perlu registrasi):

# Download dan extract
wget https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=YOUR_KEY&suffix=tar.gz -O geolite2.tar.gz
tar -xzf geolite2.tar.gz
sudo cp GeoLite2-Country_*/GeoLite2-Country.mmdb /usr/share/GeoIP/

Jalankan GoAccess dengan GeoIP:

goaccess access.log --log-format=COMBINED --geoip-database=/usr/share/GeoIP/GeoLite2-Country.mmdb

Sekarang dashboard akan menampilkan visitor breakdown per negara. Data ini berguna untuk:

  • Targeting konten regional
  • Deciding CDN/edge server location
  • Mendeteksi serangan dari region tertentu

Automate dengan Cron Job

Saya generate HTML report setiap malam dan simpan untuk historical tracking:

# /etc/cron.d/goaccess-report
0 2 * * * root goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/reports/report-$(date +\%Y\%m\%d).html --geoip-database=/usr/share/GeoIP/GeoLite2-Country.mmdb

Ini bikin arsip report harian. Kalau kamu perlu data 3 bulan lalu, tinggal buka file report-nya. Tidak ada data yang hilang karena log rotation.

Integrasi dengan Log Rotation

Nginx rotate log secara default (harian). GoAccess perlu tahu supaya tidak double-count. Solusi:

# Bikin named pipe
mkfifo /var/log/nginx/access.pipe

# Cron: setiap tengah malam, compress log lama dan restart pipe
0 0 * * * root mv /var/log/nginx/access.log /var/log/nginx/access-$(date +\%Y\%m\%d).log && kill -USR1 $(cat /var/run/nginx.pid)

# GoAccess terus-menerus baca dari named pipe
goaccess /var/log/nginx/access.pipe --log-format=COMBINED -o /var/www/html/dashboard.html --real-time-html &

Setup ini memastikan GoAccess selalu punya data terbaru tanpa kehilangan data saat log rotation.

GoAccess vs Alternatif

  • vs Google Analytics — GoAccess lebih ringan, privacy-friendly, dan tidak ter-block ad blocker. Tapi tidak punya conversion tracking, funnel analysis, atau user behavior mapping.
  • vs Plausible/Fathom — GoAccess gratis dan self-hosted tanpa dependency. Plausible lebih polished UI-nya tapi bayar $9+/bulan.
  • vs AWStats/Webalizer — GoAccess lebih modern, real-time, dan UI lebih bagus. AWStats terakhir update signifikan tahun 2010.

Kapan GoAccess Tidak Cukup?

GoAccess punya keterbatasan:

  • Tidak track user journey — kamu tahu halaman X di-visit 1000 kali, tapi tidak tahu path navigasi user.
  • Tidak ada conversion tracking — tidak bisa setup goal/funnel.
  • Tidak ada real-time user count — data aggregate, bukan live user count per halaman.

Untuk blog, portfolio, dan website informasi — GoAccess lebih dari cukup. Untuk e-commerce atau SaaS yang butuh analytics mendalam, tetap perlu Plausible, Matomo, atau Mixpanel.

Kesimpulan

GoAccess adalah tool yang seharusnya ada di setiap server Linux. Install-nya 1 menit, konfigurasinya 5 menit, dan hasilnya: dashboard traffic yang real-time, accurate, dan privacy-friendly.

Saya sudah deploy di 6 server production. Setiap kali ada yang tanya "traffic website-nya berapa?", saya tinggal share URL dashboard HTML. Tidak perlu screenshot Google Analytics, tidak perlu export CSV. Simple, clean, dan data ada di tangan sendiri.

Mulai dengan goaccess /var/log/nginx/access.log --log-format=COMBINED dan lihat sendiri. Butuh 5 detik untuk setup dan kamu langsung tahu apa yang terjadi di servermu.

Bandwidth Analysis: Fitur yang Sering Dilupakan

Salah satu panel di GoAccess yang paling sering saya buka adalah bandwidth report. Di sini kamu bisa lihat total bandwidth yang consumed per URL, per visitor, dan per time period. Data ini krusial untuk beberapa hal.

Pertama, identify hotlinking. Kalau kamu lihat URL gambar atau video yang consume bandwidth tinggi tapi bukan dari halaman website kamu sendiri, kemungkinan besar ada yang embed resource kamu di situs mereka. Solusinya: tambah referer check di Nginx atau pakai signed URLs untuk asset besar.

Kedua, capacity planning. Dengan data bandwidth trend per bulan, kamu bisa predict kapan perlu upgrade VPS atau tambah CDN. Saya pakai data GoAccess 6 bulan terakhir untuk project traffic growth. Dari situ saya tahu kalau bulan depan kemungkinan butuh upgrade bandwidth — sebelum user complain soal lambat.

Ketiga, cost estimation. Kalau kamu pakai VPS yang charge per bandwidth (seperti Hetzner atau DigitalOcean), data GoAccess membantu estimate tagihan bulanan. Tidak ada kejutan di invoice akhir bulan.

GoAccess dalam Docker

Untuk yang semua infrastrukturnya sudah Docker-based, GoAccess juga bisa jalan sebagai container. Ini approach yang saya pakai di beberapa server supaya tidak perlu install dependency di host:

docker run -d --name goaccess \
  -v /var/log/nginx:/var/log/nginx:ro \
  -v /var/www/html/dashboard:/srv/dashboard \
  -p 7890:7890 \
  allinurl/goaccess \
  --log-file=/var/log/nginx/access.log \
  --log-format=COMBINED \
  -o /srv/dashboard/index.html \
  --real-time-html \
  --ws-url=wss://monitor.yourdomain.com

Dengan Docker, kamu bisa pin versi GoAccess, mudah update (docker pull), dan isolasi dari host system. Volume mount read-only ke log directory memastikan GoAccess tidak bisa modify log apapun.

Integrasinya dengan setup Docker lain sangat natural. Kamu bisa tambahkan service GoAccess ke docker-compose.yml yang sama dengan web server kamu. Baca panduan Docker Compose untuk best practice multi-container setup.

Custom Dashboards dan Reporting

Selain terminal UI dan HTML real-time dashboard, GoAccess bisa generate berbagai format output. Yang paling berguna untuk saya:

JSON report — untuk integrasi dengan tool lain. Saya export JSON weekly dan import ke spreadsheet untuk client reporting. Command: goaccess access.log -o report.json --log-format=COMBINED

CSV export — untuk analisis lanjutan di Excel atau Google Sheets. Sangat berguna kalau kamu perlu pivot data atau bikin custom chart yang tidak tersedia di GoAccess.

Built-in terminal dashboard customization — kamu bisa pilih panel mana yang ditampilkan di terminal. Cukup edit file config ~/.goaccessrc dan set panel order sesuai kebutuhan. Saya biasanya prioritize: visitors, requests, referrers, 404s, dan status codes.

Tips Production: yang Saya Pelajari Setelah 8 Bulan

Kompresi log lama. Log Nginx bisa memakan disk sangat cepat di server high-traffic. Setup logrotate untuk compress log yang lebih dari 3 hari. GoAccess bisa baca file .gz secara langsung kalau kamu compile dengan zlib support: zcat /var/log/nginx/access-*.gz | goaccess - --log-format=COMBINED.

Exclude internal traffic. IP kantor dan tim kamu sendiri akan skew data. Tambahkan filter: --exclude-ip=YOUR_OFFICE_IP atau buat Nginx filter yang tidak log request dari IP internal.

Monitor 404 patterns. Setiap minggu saya cek 404 report. Dari sini saya nemu broken internal links, URL yang pernah valid tapi sudah dihapus, dan bot yang coba exploit path random. Fix internal links, redirect URL lama, dan blok aggressive bot — semua dari data GoAccess.

Bandwidth alerts. Saya bikin cron script sederhana yang cek total bandwidth harian dari GoAccess JSON output. Kalau exceed threshold (biasanya 2x dari average), kirim alert ke Telegram. Ini pernah detect DDoS attack kecil yang lolos dari Cloudflare — terlihat dari spike bandwidth 10x normal di jam 3 pagi.

💬 Kolom komentar sedang dimuat...