Change platform to rocket.chat
This commit is contained in:
112
exchange.md
Normal file
112
exchange.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# 工程師交接說明
|
||||
|
||||
## 後臺方案更換建議:Streamlit
|
||||
|
||||
若未來認為 Rocket.Chat 部署過重或整合不便,可轉用 **Streamlit** 開發自定義管理後台。此方案能針對 Open WebUI 的資料結構進行 100% 客製化。
|
||||
|
||||
### 核心優勢
|
||||
|
||||
1. **極簡開發**:純 Python 即可構建前端,約 200 行程式碼可完成完整後台。
|
||||
2. **超輕量級**:單一容器(~100MB 記憶體),無需額外資料庫(直接讀取現有 Postgres)。
|
||||
3. **完全客製**:可完美呈現「用戶 → 對話 → 訊息」的三層結構,不受限於聊天軟體的頻道邏輯。
|
||||
4. **部署簡單**:標準 Docker image `python:3.11-slim` + `pip install streamlit`。
|
||||
|
||||
### 實作架構
|
||||
|
||||
* **前端**:Streamlit Web App (Port 8501)
|
||||
* **後端邏輯**:直連 PostgreSQL `reply_queue` 表格
|
||||
* **功能**:自動刷新、用戶篩選、歷史回覆查詢
|
||||
|
||||
### 程式碼範例 (admin.py)
|
||||
|
||||
```python
|
||||
import streamlit as st
|
||||
import psycopg2
|
||||
import pandas as pd
|
||||
|
||||
# 自動刷新設定 (每 5 秒)
|
||||
from streamlit_autorefresh import st_autorefresh
|
||||
st_autorefresh(interval=5000, key="msg_refresh")
|
||||
|
||||
st.set_page_config(layout="wide", page_title="TobiichiGPT Admin")
|
||||
|
||||
# 1. 連接資料庫
|
||||
conn = psycopg2.connect("postgresql://user:pass@postgres:5432/tobiichiGPT")
|
||||
|
||||
# 2. 側邊欄:用戶列表
|
||||
st.sidebar.title("用戶列表")
|
||||
users = pd.read_sql("SELECT DISTINCT user_id FROM reply_queue", conn)
|
||||
selected_user = st.sidebar.radio("選擇用戶", users['user_id'])
|
||||
|
||||
# 3. 主畫面:顯示該用戶的對話
|
||||
if selected_user:
|
||||
st.header(f"用戶: {selected_user}")
|
||||
|
||||
# 撈取該用戶訊息
|
||||
msgs = pd.read_sql(
|
||||
f"SELECT * FROM reply_queue WHERE user_id='{selected_user}' ORDER BY created_at DESC",
|
||||
conn
|
||||
)
|
||||
|
||||
for _, row in msgs.iterrows():
|
||||
with st.expander(f"對話 {row['chat_id']} ({row['status']})", expanded=True):
|
||||
st.info(f"用戶: {row['user_message']}")
|
||||
|
||||
if row['status'] == 'pending':
|
||||
with st.form(key=f"form_{row['id']}"):
|
||||
reply = st.text_area("回覆內容")
|
||||
if st.form_submit_button("送出"):
|
||||
# 更新資料庫
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"UPDATE reply_queue SET admin_reply=%s, status='replied' WHERE id=%s",
|
||||
(reply, row['id'])
|
||||
)
|
||||
conn.commit()
|
||||
st.success("已回覆")
|
||||
st.rerun()
|
||||
else:
|
||||
st.success(f"管理員: {row['admin_reply']}")
|
||||
```
|
||||
|
||||
### 部署配置 (Docker)
|
||||
|
||||
**Dockerfile**:
|
||||
```dockerfile
|
||||
FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
RUN pip install streamlit psycopg2-binary pandas streamlit-autorefresh
|
||||
COPY admin.py .
|
||||
CMD ["streamlit", "run", "admin.py", "--server.port=8501", "--server.address=0.0.0.0"]
|
||||
```
|
||||
|
||||
**docker-compose.yml**:
|
||||
```yaml
|
||||
admin-ui:
|
||||
build: ./admin-ui
|
||||
ports: ["8501:8501"]
|
||||
environment:
|
||||
- DB_HOST=postgres
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
networks:
|
||||
- tobiichiGPT-network
|
||||
```
|
||||
|
||||
### 與 Rocket.Chat/Chatwoot比較
|
||||
|
||||
| 特性 | Streamlit (自建) | Rocket.Chat | Chatwoot |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **對應 Open WebUI 結構** | ⭐⭐⭐⭐⭐ (完全貼合) | ⭐⭐⭐ (需用頻道模擬) | ⭐ (結構扁平) |
|
||||
| **即時性** | ⭐⭐ (輪詢刷新) | ⭐⭐⭐⭐⭐ (WebSocket) | ⭐⭐⭐⭐⭐ (WebSocket) |
|
||||
| **手機 App** | ⭐ (網頁版) | ⭐⭐⭐⭐⭐ (原生 App) | ⭐⭐⭐⭐⭐ (原生 App) |
|
||||
| **資源消耗** | 低 (~100MB) | 中 (~500MB) | 高 (~1GB) |
|
||||
| **適用場景** | 單人/少數管理員,追求輕量與精準管理 | 多人團隊協作,需要 App 通知 | 專業客服團隊 |
|
||||
|
||||
### 建議切換時機
|
||||
|
||||
若遇到以下情況,建議切換至 Streamlit 方案:
|
||||
1. Rocket.Chat 的頻道/執行緒管理變得混亂,難以追蹤用戶對話。
|
||||
2. 伺服器資源不足,無法負擔 Rocket.Chat + MongoDB。
|
||||
3. 需要針對特定業務邏輯(如:查看用戶餘額、審核特定關鍵字)進行客製化開發。
|
||||
|
||||
## Rocket.chat實作紀錄
|
||||
Reference in New Issue
Block a user