Files
egg e7a06e2b8f chore: Archive all pending OpenSpec proposals
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>
2025-12-22 08:44:04 +08:00

130 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Design: Extract Environment Variables
## Context
專案需要支援以下部署場景:
1. 開發環境:前後端在本地同時運行
2. 生產環境:後端部署於 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` 中讀取
```javascript
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
1. **Phase 1 - 後端配置**
- 更新 `config.py` 添加新配置項
- 更新各 router 使用配置
- 更新 `.env``.env.example`
2. **Phase 2 - 前端配置**
- 創建 `.env``.env.example`
- 更新 `api.js` 使用環境變數
3. **Phase 3 - 部署文件**
- 創建 1Panel 部署指南
- 創建部署腳本
4. **Rollback**
- 所有配置都有預設值,回滾只需刪除環境變數
## Open Questions
- Q: 是否需要支援 Docker 部署?
- A: 暫不包含,但環境變數配置天然支援 Docker