0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

📊 Công cụ Dashboard Khác: Streamlit, Dash, Bokeh và CI/CD

Đăng vào 7 tháng trước

• 4 phút đọc

📊 Công cụ Dashboard Khác: Streamlit, Dash, Bokeh và CI/CD

🧭 Mục Lục

  1. Tại sao nên sử dụng các công cụ này?
  2. Streamlit — ví dụ đơn giản + triển khai
  3. Dash (Plotly) — ví dụ, Docker và CI/CD lên Cloud Run
  4. Bokeh — ví dụ và ghi chú triển khai (websockets)
  5. Cấu trúc repo và requirements.txt
  6. 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 Copy
# 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 Copy
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 Copy
# 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 Copy
dash
pandas
plotly
gunicorn

Dockerfile (cho Cloud Run hoặc dịch vụ khác)

dockerfile Copy
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 Copy
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 Copy
# 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 Copy
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.py và 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 Copy
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)

  1. Kiểm tra → Chạy pytest hoặc kiểm tra nhanh (flake8, mypy).
  2. Xây dựng → Xây dựng hình ảnh Docker hoặc chạy gcloud builds submit.
  3. Triển khaigcloud run deploy hoặc sử dụng google-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 DockerfileCI/CD workflows với GitHub Actions, có sẵn trong kho lưu trữ sau:

👉 Kho Lưu Trữ GitHub: my-dashboard

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào