GoAccess Dashboard — theo dõi traffic nhiều site tự động
GoAccess Dashboard là một hệ thống tự động, chạy hằng ngày, tổng hợp
traffic của nhiều site khác nhau (bắt đầu với obiz-solution.com, mở
rộng dần sang các site khác như vuecs.com), và cho xem dashboard tại 1
chỗ duy nhất — goaccess.obiz-solution.com — có bảo vệ bằng mật khẩu,
không cần đăng nhập AWS Console mỗi lần muốn xem số liệu.
Kiến trúc
- Mỗi site nguồn (
obiz-solution.com,vuecs.com…) đã tự bật CloudFront access logs ghi ra bucket S3 riêng của nó. - GitHub Actions trong repo
goaccess-dashboardchạy theo lịch (cron, 1 lần/ngày) — không trigger bởi push code, vì mục đích là lấy dữ liệu mới, không phải deploy code mới. - Với mỗi site khai trong
systems.json, workflowsynclog mới nhất từ bucket S3 tương ứng, chạygoaccesssinh report HTML riêng, rồi build 1 trangindex.htmlliệt kê tất cả site. - Toàn bộ output được
synclên 1 S3 bucket private khác (goaccess.obiz-solution.com), qua đúng Role OIDC như site chính — không lưu access key. - CloudFront đứng trước bucket đó, gắn 1 CloudFront Function chạy
ở bước Viewer Request để kiểm tra HTTP Basic Auth — sai hoặc thiếu
thông tin đăng nhập thì trả
401ngay tại edge, chưa từng chạm tới S3.
Basic Auth không cần server
Vì toàn bộ hạ tầng vẫn là site tĩnh (S3 + CloudFront), không có server nào
chạy để check mật khẩu theo cách truyền thống. Giải pháp: CloudFront
Function — đoạn JS cực nhẹ chạy trực tiếp ở edge location, so sánh header
Authorization của request với giá trị mong đợi. Giá trị đó (dạng
Basic <base64>) được lưu trong CloudFront KeyValueStore — set qua AWS
Console, không bao giờ commit vào git — nên credential tách hoàn toàn khỏi
source code.
systems.json — cấu hình mở rộng được
[
{ "name": "obiz-solution.com", "logBucket": "obiz-solution.com-logs", "logPrefix": "cf-logs/" },
{ "name": "vuecs.com", "logBucket": "vuecs.com-logs", "logPrefix": "cf-logs/" }
]
Thêm site mới chỉ cần thêm 1 dòng (miễn site đó cũng bật CloudFront log theo đúng format 33-field đã thống nhất) — không cần sửa gì trong workflow hay script.
Vì sao chạy 1 lần/ngày, không real-time
CloudFront tự giao log theo batch (không tức thời), và mục đích ở đây là xem xu hướng traffic chứ không phải giám sát real-time — chạy 1 lần/ngày đủ cập nhật, chi phí Athena/GoAccess gần như bằng 0, tránh phải trả thêm cho CloudFront real-time logs (dùng Kinesis, tốn phí liên tục).