📊 Công cụ Dashboard Khác: Streamlit, Dash, Bokeh và CI/CD
🧭 Mục Lục
- Tại sao nên sử dụng các công cụ này?
- Streamlit — ví dụ đơn giản + triển khai
- Dash (Plotly) — ví dụ, Docker và CI/CD lên Cloud Run
- Bokeh — ví dụ và ghi chú triển khai (websockets)
- Cấu trúc repo và requirements.txt
- GitHub Actions: pipeline (tests → build → deploy)
1) Tại sao nên sử dụng các công cụ này? 🤔
- Streamlit: cực kỳ nhanh chóng cho các nguyên mẫu và trình diễn tương tác. Thích hợp cho các nhà khoa học dữ liệu. ✅
- Dash: mạnh mẽ khi bạn cần các thành phần phức tạp và kiểm soát tốt (Plotly + Flask). 👍
- Bokeh: rất tốt cho các hình ảnh tương tác và ứng dụng cần máy chủ (Bokeh Server). 🏗️
Mỗi công cụ đều có những ưu và nhược điểm về sự dễ dàng, kiểm soát và khả năng mở rộng — trong bài viết này, bạn sẽ thấy các ví dụ tối thiểu và cách đưa chúng lên đám mây.
2) Streamlit — ví dụ đơn giản
Tệp: streamlit_app.py
python
# streamlit_app.py
import streamlit as st
import pandas as pd
import altair as alt
st.title('Demo: Streamlit - Doanh số')
df = pd.DataFrame({
'category': ['A', 'B', 'C', 'A', 'B', 'C'],
'sales': [10, 15, 7, 12, 9, 20]
})
sel = st.selectbox('Chọn danh mục', ['Tất cả'] + df['category'].unique().tolist())
if sel != 'Tất cả':
df = df[df['category'] == sel]
chart = alt.Chart(df).mark_bar().encode(
x='category',
y='sales'
)
st.altair_chart(chart, use_container_width=True)
Chạy cục bộ:
bash
pip install streamlit pandas altair
streamlit run streamlit_app.py
Mẹo triển khai: Cách nhanh nhất là sử dụng Streamlit Community Cloud (kết nối trực tiếp với GitHub: bạn tải lên repo và triển khai từ share.streamlit.io).
3) Dash (Plotly) — ví dụ + Docker + CI/CD (Cloud Run)
Tệp: app.py
python
# app.py
import os
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
# Dữ liệu ví dụ
df = pd.DataFrame({'x': [1, 2, 3, 4], 'y': [10, 5, 8, 12]})
fig = px.line(df, x='x', y='y', title='Ví dụ Dash')
app = Dash(__name__)
server = app.server # công khai ứng dụng WSGI cho Gunicorn
app.layout = html.Div([
html.H1('Dash - Demo'),
dcc.Graph(figure=fig)
])
if __name__ == '__main__':
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8050)))
requirements.txt (ví dụ):
plaintext
dash
pandas
plotly
gunicorn
Dockerfile (cho Cloud Run hoặc dịch vụ khác)
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Gunicorn chạy máy chủ WSGI được công khai trong `server`
CMD ["gunicorn", "--bind", ":$PORT", "--workers", "1", "--threads", "8", "--timeout", "0", "app:server"]
GitHub Actions → Xây dựng & Triển khai lên Google Cloud Run
Lưu workflow này vào .github/workflows/deploy-cloudrun.yml:
yaml
name: CI/CD - Cloud Run
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cấu hình GCloud
uses: google-github-actions/setup-gcloud@v1
with:
service_account_key: ${{ secrets.GCP_SA_KEY }}
project_id: ${{ secrets.GCP_PROJECT_ID }}
- name: Xây dựng và đẩy hình ảnh (Cloud Build)
run: |
gcloud builds submit --tag gcr.io/${{ secrets.GCP_PROJECT_ID }}/dash-app:$GITHUB_SHA
- name: Triển khai lên Cloud Run
uses: google-github-actions/deploy-cloudrun@v1
with:
service: dash-app
image: gcr.io/${{ secrets.GCP_PROJECT_ID }}/dash-app:$GITHUB_SHA
region: us-central1
✅ Chức năng: Mỗi lần đẩy lên main, workflow sẽ xây dựng hình ảnh, tải lên Google Container Registry và triển khai một phiên bản mới lên Cloud Run.
4) Bokeh — ví dụ đơn giản và ghi chú triển khai
Tệp: main.py (máy chủ Bokeh)
python
# main.py
from bokeh.plotting import figure
from bokeh.io import curdoc
p = figure(title='Demo Bokeh')
p.line([1, 2, 3, 4], [3, 7, 8, 5])
curdoc().add_root(p)
Chạy cục bộ (máy chủ Bokeh):
bash
pip install bokeh
bokeh serve --show main.py
Ghi chú triển khai:
- Bokeh sử dụng websockets (Máy chủ Bokeh). Khi triển khai, đảm bảo dịch vụ của bạn hỗ trợ timeout và kết nối websocket.
- Chiến lược thông thường: tạo một Dockerfile với
bokeh serve --port $PORT --allow-websocket-origin='*' main.pyvà triển khai lên Cloud Run (hoặc tương tự). - Nếu sử dụng Cloud Run, cấu hình timeout cao hơn cho các kết nối dài.
5) Cấu trúc đề xuất
plaintext
my-dashboard/
├─ streamlit_app.py
├─ app.py # dash
├─ main.py # bokeh
├─ requirements.txt
├─ Dockerfile # cho dash/bokeh nếu sử dụng container
└─ .github/
└─ workflows/
└─ deploy-cloudrun.yml
6) GitHub Actions: pipeline đề xuất (chi tiết)
- Kiểm tra → Chạy
pytesthoặc kiểm tra nhanh (flake8,mypy). - Xây dựng → Xây dựng hình ảnh Docker hoặc chạy
gcloud builds submit. - Triển khai →
gcloud run deployhoặc sử dụnggoogle-github-actions/deploy-cloudrun.
🔗 Kho Lưu Trữ GitHub
Mã nguồn đầy đủ với các ví dụ Streamlit, Dash, và Bokeh, cùng với Dockerfile và CI/CD workflows với GitHub Actions, có sẵn trong kho lưu trữ sau:
👉 Kho Lưu Trữ GitHub: my-dashboard