Force archive the following proposals: - add-audio-device-selector (complete) - add-embedded-backend-packaging (19/26 tasks) - add-flexible-deployment-options (20/21 tasks) New specs created: - audio-device-management (7 requirements) - embedded-backend (8 requirements) Updated specs: - transcription (+2 requirements for model download progress) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
Design: Extract Environment Variables
Context
專案需要支援以下部署場景:
- 開發環境:前後端在本地同時運行
- 生產環境:後端部署於 1Panel 伺服器,前端(Electron 應用)獨立打包部署
架構說明:
- 後端:FastAPI 服務,使用兩個 Dify 服務(LLM 摘要 + STT 轉錄)
- 前端:Electron 應用,包含 Sidecar(本地 Whisper 即時轉錄服務)
目前的硬編碼配置使得部署困難,且敏感資訊(如 API 密鑰、資料庫密碼)散落在代碼中。
Goals / Non-Goals
Goals
- 將所有硬編碼配置提取到環境變數
- 提供完整的
.env.example範例檔案 - 支援前端獨立打包時指定後端 API URL
- 提供 1Panel 部署完整指南和腳本
- 確保向後相容(預設值與現有行為一致)
Non-Goals
- 不實現配置熱重載
- 不實現密鑰輪換機制
- 不實現多環境配置管理(如 .env.production, .env.staging)
Decisions
1. 環境變數命名規範
決定:使用大寫蛇形命名法,前端變數加 VITE_ 前綴
原因:
- Vite 要求客戶端環境變數必須以
VITE_開頭 - 大寫蛇形是環境變數的標準慣例
2. 前端 API URL 配置
決定:使用 VITE_API_BASE_URL 環境變數,在 api.js 中讀取
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || "http://localhost:8000/api";
替代方案:
- 使用 runtime 配置檔案(如
/config.js)- 更靈活但增加部署複雜度 - 使用相對路徑
/api- 需要 nginx 反向代理,不適合獨立部署
3. 超時配置單位
決定:統一使用毫秒(ms),與 JavaScript 一致
後端配置項:
| 變數名 | 預設值 | 用途 |
|---|---|---|
| UPLOAD_TIMEOUT | 600000 | 大檔案上傳(10分鐘) |
| DIFY_STT_TIMEOUT | 300000 | Dify STT 轉錄每個分塊(5分鐘) |
| LLM_TIMEOUT | 120000 | Dify LLM 摘要處理(2分鐘) |
| AUTH_TIMEOUT | 30000 | 認證 API 調用(30秒) |
前端/Sidecar 配置項:
| 變數名 | 預設值 | 用途 |
|---|---|---|
| WHISPER_MODEL | medium | 本地 Whisper 模型大小 |
| WHISPER_DEVICE | cpu | 執行裝置(cpu/cuda) |
| WHISPER_COMPUTE | int8 | 運算精度 |
4. 1Panel 部署架構
決定:使用 systemd 管理後端服務,nginx 反向代理
[Client] → [Nginx:443] → [Uvicorn:8000]
↓
[Static Files]
原因:
- systemd 提供進程管理、日誌、自動重啟
- nginx 處理 HTTPS、靜態檔案、反向代理
- 這是 1Panel 的標準部署模式
5. CORS 配置
決定:保持 allow_origins=["*"],不額外配置
原因:
- 前端是 Electron 桌面應用,分發到多台電腦
- Electron 主進程的 HTTP 請求不受 CORS 限制
- 簡化部署配置,IT 只需關心 HOST 和 PORT
Risks / Trade-offs
風險 1:環境變數遺漏
- 風險:部署時遺漏必要的環境變數導致服務異常
- 緩解:提供完整的
.env.example,啟動時檢查必要變數
風險 2:前端打包後無法修改 API URL
- 風險:Vite 環境變數在打包時固定
- 緩解:文件中說明需要為不同環境分別打包,或考慮未來實現 runtime 配置
風險 3:敏感資訊外洩
- 風險:
.env檔案被提交到版本控制 - 緩解:確保
.gitignore包含.env,只提交.env.example
Migration Plan
-
Phase 1 - 後端配置
- 更新
config.py添加新配置項 - 更新各 router 使用配置
- 更新
.env和.env.example
- 更新
-
Phase 2 - 前端配置
- 創建
.env和.env.example - 更新
api.js使用環境變數
- 創建
-
Phase 3 - 部署文件
- 創建 1Panel 部署指南
- 創建部署腳本
-
Rollback
- 所有配置都有預設值,回滾只需刪除環境變數
Open Questions
- Q: 是否需要支援 Docker 部署?
- A: 暫不包含,但環境變數配置天然支援 Docker