Obiz Solutions

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

Kiến trúc GoAccess Dashboard: CloudFront log nhiều site → GitHub Actions (cron hằng ngày) → GoAccess → S3 → CloudFront có Basic Auth → trình duyệt

  1. 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ó.
  2. GitHub Actions trong repo goaccess-dashboard chạ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.
  3. Với mỗi site khai trong systems.json, workflow sync log mới nhất từ bucket S3 tương ứng, chạy goaccess sinh report HTML riêng, rồi build 1 trang index.html liệt kê tất cả site.
  4. Toàn bộ output được sync lê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.
  5. 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ả 401 ngay 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).