Dashboard Dibuang, Dipanggil Balik
Buang stack GoAccess DIY, pindah ke admin bawaan 3proxy mode counters-only, lalu sadar pertanyaan berubah: GoAccess dipanggil balik di belakang nginx.
Ringkasan
Penulis sempat hapus GoAccess dan ganti pakai admin service bawaan 3proxy, cuma tiga baris config. Ternyata counter bawaan cuma jawab "berapa traffic", nggak bisa nunjukin URL mana yang paling boros bandwidth. Jadi GoAccess balik lagi buat breakdown per-URL, sekarang dua-duanya dipakai sesuai kebutuhan masing-masing.
Sabtu sore saya buka Compose file net-cap, dan di situ ada stack GoAccess buatan sendiri: satu container allinurl/goaccess, script tail -F plus awk, config log-format hasil coba-coba, nginx di depannya. Waktu itu jalan. Tapi ada config pair day/night yang ditukar cron plus kill -HUP buat reset bandlimit. Sempat sempatnya saya bikin itu, dan hasilnya dua jalur config yang harus dijaga sinkron. Rasanya kayak rawat aquarium dua ekor ikan yang sama-sama mau keluar.
Jadi saya hapus. Stack yang kupikir rumahannya berat ternyata penggantinya cuma tiga baris config. Satu commit: remove goaccess dashboard, pakai admin service bawaan 3proxy.
Counters Dulu, Dashboard Belakangan
Yang saya butuhkan sebenarnya cuma jawab "berapa traffic lewat proxy hari ini". Buat pertanyaan segitu, GoAccess terasa overkill. 3proxy punya service admin bawaan, web interface dengan default port 80 yang bisa dipindah [1]. Tiga baris config:
counter /var/log/3proxy/3proxy.count
countall 1 H 1000000 * * * * * *
admin -p3224 -i0.0.0.0 -s
counter menunjuk file tempat data trafik disimpan permanen [5]. countall 1 H 1000000 * * * * * *: counter nomor 1, rotasi per jam (type H), limit praktis mustahil tercapai, sisanya match-all. Dan admin -s itu mode secure: cuma lihat counters, nggak bisa reset apa pun [1].
Deploy, buka port 3224 di browser, counters jalan. Nggak ada nginx, nggak ada container tambahan, nggak ada cron. Hemat satu container. Satu catatan kecil: file counter itu ditulis 3proxy terus-menerus, jadi dia nggak bisa tidur di path yang di-mount read-only seperti config; dia butuh volume writable, dan di compose saya volume log yang sama yang dipakai ulang.
Dua commit berikutnya, pertanyaan berubah. Bukan lagi "berapa", tapi "URL mana yang makan bandwidth?" Counter bawaan jawab "berapa". Host mana, path mana, request mana yang paling boros, nggak ada [1]. Secure mode emang cuma counters view, titik.
Salah tebak saya: mengira counters cukup buat semua kebutuhan monitoring. Ternyata pertanyaan "berapa" dan "mana" butuh tool beda.
GoAccess Balik, Tapi yang Benar
GoAccess harus balik. Kali ini bukan copas config lama. Tiga hal yang dulu saya remehkan:
ENTRYPOINT image. Image allinurl/goaccess jalankan goaccess langsung sebagai entrypoint. Script saya nggak akan pernah jalan kecuali entrypoint-nya di-override ke /bin/sh /dashboard.sh.
Format timestamp. Log 3proxy diawali epoch dengan pecahan mikrodetik, dan GoAccess butuh time-format %f untuk timestamp mikrodetik [2]. Saya pilih buang pecahannya sebelum masuk parser, via awk, sisanya lewat config GoAccess:
time-format %s
date-format %s
log-format %x %^ %^ %^ %h:%^ %^ %b %^ %^ %U
Hasilnya 0 invalid lines. Baris ADMIN di port 3224 (sembilan field tanpa request) ikut difilter biar parser nggak pusing.
GoAccess -o file itu WS-only. Di mode realtime, GoAccess cuma melayani WebSocket di port 7890; GET / dapat 400. Jadi nginx:alpine di depan: serve report.html statis, proxy /ws ke GoAccess. Header Upgrade dan Connection harus di-set eksplisit karena itu hop-by-hop header yang nggak diteruskan nginx secara default [3]. Lalu proxy_read_timeout dinaikkan ke 86400 detik. Default 60 detik bakal memutus koneksi idle [3]. GoAccess 1.11 (rilis 2026-07-19) punya reconnect exponential backoff 1 detik, maksimal 20 attempt [4], tapi mending nggak usah mengandalkan itu tiap menit.
Satu detail yang bikin stack ini rapi: volume threeproxy-log dipakai bareng. 3proxy nulis access.log dan file counter ke situ, GoAccess baca log yang sama dari mount /log, nginx serve report.html dari volume itu juga. Nggak ada copy log antar container. Di nginx, blok map $http_upgrade $connection_upgrade dari dokumentasi resmi saya salin apa adanya, karena nilainya harus dinamis: koneksi WebSocket dapat upgrade, request biasa dapat close [3].
Verifikasi akhir: GET di port 3225 return 200, total_requests=68, failed=0. Dua tool, satu pertanyaan masing-masing.
Opini saya sekarang: pakai dua-duanya. Admin bawaan buat quick check: buka 3224, lihat angka, tutup. GoAccess buat breakdown per-URL dan per-host. Dulu saya pakai GoAccess buat pertanyaan yang seharusnya dijawab counters dua baris; sekarang counters nggak saya paksa jawab "mana".
Dua-duanya punya tempat. Yang satu jawab "berapa", yang satu jawab "mana".