Tự host Apache Superset với Docker: Giải pháp BI ‘ngon – bổ – rẻ’ cho MySQL và PostgreSQL

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Vấn đề thực tế: Khi dữ liệu ‘ngủ quên’ trong Database và sếp cần báo cáo gấp

Vận hành hệ thống cho một startup thương mại điện tử hơn 6 tháng, mình mới thấm cảnh dữ liệu bị phân mảnh. Thông tin giao dịch nằm ở PostgreSQL, còn user profile lại ở MySQL. Mỗi lần bên Business cần báo cáo tăng trưởng, team Tech lại phải tạm dừng code để hì hục viết SQL rồi xuất Excel.

Cái vòng lặp này cực kỳ tốn thời gian. Khi nhu cầu xem dữ liệu real-time tăng lên, việc chi hơn $2.000/năm cho license Tableau hay Power BI là một con số quá xa xỉ với startup. Mình cần một nền tảng Business Intelligence (BI) mã nguồn mở, tự host được để bảo mật và quan trọng là phải dễ mở rộng.

Tại sao việc tự xây dựng Dashboard lại là ‘cực hình’?

Nhiều anh em hay nghĩ: “Viết đại cái dashboard bằng React hay Vue, gọi API lên DB là xong”. Thực tế không đơn giản vậy. Khi dữ liệu chạm mốc 10-20 triệu dòng, query trực tiếp vào DB production sẽ làm CPU nhảy vọt lên 90%, gây lag toàn hệ thống.

  • Thiếu linh hoạt: Chỉ cần đổi màu biểu đồ hay thêm một cột dữ liệu, bạn lại phải code, build và deploy lại từ đầu.
  • Ác mộng phân quyền: Việc xử lý logic “User A chỉ được xem data chi nhánh X” tốn rất nhiều công sức nếu làm thủ công.
  • Gộp dữ liệu: Join dữ liệu từ hai server khác nhau (MySQL và Postgres) vào cùng một biểu đồ là bài toán cực khó nếu không có công cụ chuyên dụng.

So sánh nhanh các giải pháp phổ biến

Trước khi chọn Apache Superset, mình đã dùng thử qua vài cái tên:

  1. Metabase: Giao diện cực đẹp, dễ cài. Tuy nhiên, khi cần tùy biến sâu hoặc vẽ các biểu đồ phức tạp, nó bắt đầu bộc lộ hạn chế.
  2. Grafana: Vô đối trong việc monitor server và log. Nhưng để làm báo cáo kinh doanh chuyên sâu thì giao diện hơi “cứng” và khó dùng cho dân non-tech.
  3. Redash: Mạnh về viết SQL thuần. Điểm trừ là giao diện Dashboard hơi cũ, không mượt mà bằng các đối thủ mới.

Apache Superset: ‘Trùm’ phân khúc mã nguồn mở

Sau nửa năm chạy thực tế, mình khẳng định Superset là lựa chọn cân bằng nhất. Nó hỗ trợ hầu hết database qua SQLAlchemy. Giao diện kéo thả (No-code) giúp các bạn Marketing cũng có thể tự tạo biểu đồ mà không cần phiền đến Developer. Đặc biệt, hệ thống phân quyền (RBAC) của nó chi tiết đến từng dòng dữ liệu.

Nếu bạn cần xử lý nhanh dữ liệu từ các file báo cáo cũ, hãy thử dùng converter tại toolcraft.app/vi/tools/data/csv-to-json. Công cụ này giúp chuyển CSV sang JSON ngay trên trình duyệt để import thử nghiệm cực kỳ an toàn.

Hướng dẫn cài đặt Apache Superset với Docker

Dùng Docker Compose là cách nhanh nhất để có một môi trường ổn định. Nó quản lý luôn cả Redis (để cache) và PostgreSQL (lưu metadata cho Superset).

Bước 1: Chuẩn bị môi trường

Bạn nên dùng server có tối thiểu 4GB RAM. Nếu Dashboard có nhiều biểu đồ nặng, 8GB RAM sẽ là mức an toàn hơn.

# Clone repository chính thức
git clone --depth=1 https://github.com/apache/superset.git
cd superset

Bước 2: Cấu hình bảo mật

Đừng bao giờ dùng cấu hình mặc định khi lên Production. Bạn cần tạo một Secret Key riêng để mã hóa session.

# Tạo chuỗi secret ngẫu nhiên
openssl rand -base64 42

Copy key này vào file .env-non-dev. Sau đó, khởi chạy hệ thống bằng lệnh:

docker-compose -f docker-compose-non-dev.yml up -d

Bước 3: Thiết lập tài khoản Admin

Khi các container đã chạy ổn định, hãy khởi tạo tài khoản quản trị và database nội bộ:

# Tạo user admin
docker exec -it superset_app superset fab create-admin \
              --username admin \
              --firstname Superset \
              --lastname Admin \
              --email [email protected] \
              --password admin

# Cập nhật database và khởi tạo quyền
docker exec -it superset_app superset db upgrade
docker exec -it superset_app superset init

Kết nối MySQL và PostgreSQL

Truy cập vào port 8088, chọn Settings -> Database Connections.

Với PostgreSQL, chuỗi kết nối thường có dạng: postgresql://user:pass@host:5432/db_name.

Với MySQL, bạn nên dùng driver mysql+mysqlconnector để tránh lỗi font chữ: mysql://user:pass@host:3306/db_name?charset=utf8mb4.

Lưu ý: Nếu DB nằm cùng server với Docker, hãy dùng IP 172.17.0.1 thay vì localhost.

Kinh nghiệm ‘xương máu’ để hệ thống chạy mượt

Đừng bỏ qua việc cấu hình Redis làm lớp Caching. Trong thực tế, một Dashboard có 10 biểu đồ nếu không cache sẽ bắt DB thực thi 10 query cùng lúc mỗi khi tải trang. Với Redis, thời gian load dashboard giảm từ 5 giây xuống còn dưới 1 giây ở lần xem thứ hai.

Thứ hai, hãy tận dụng Row Level Security (RLS). Đây là tính năng giúp mình giải quyết bài toán: Sale team miền Bắc chỉ thấy data miền Bắc, dù tất cả dùng chung một Dashboard duy nhất.

Cuối cùng, hãy giới hạn tài nguyên cho Docker container. Superset khá ngốn RAM khi xử lý các biểu đồ Heatmap lớn. Việc set limit giúp đảm bảo các service khác trên cùng server không bị “văng” khi có người dùng query nặng.

Triển khai xong Superset, team Tech của mình gần như thoát khỏi cảnh xuất báo cáo dạo. Dữ liệu giờ đây nằm trực tiếp trong tay những người cần nó, giúp mọi quyết định kinh doanh đều dựa trên con số thực tế thay vì cảm tính.

Share: