# Design: Unify Environment Scripts ## Context Tool_OCR 是一個 OCR 處理系統,包含 FastAPI 後端和 React 前端。目前的環境設置和啟動流程分散在多個腳本中: - `setup_dev_env.sh` (341 lines) - 完整的開發環境設置 - `start_backend.sh` (60 lines) - 後端服務啟動 - `start_frontend.sh` (41 lines) - 前端服務啟動 - `download_fonts.sh` - 字體下載 (可選) **Current Pain Points:** 1. 需要開兩個終端分別啟動前後端 2. 環境變數配置分散在多個 `.env` 文件中 3. 缺少服務狀態檢查和優雅停止機制 4. GPU 配置需要手動驗證 ## Goals / Non-Goals **Goals:** - 簡化開發環境設置流程 - 統一前後端啟動為單一命令 - 改善錯誤訊息和故障排除體驗 - 確保跨平台兼容性 (Ubuntu, WSL2) **Non-Goals:** - 容器化 (Docker) - 保留為未來提案 - 生產環境部署腳本 - 自動化測試環境設置 ## Decisions ### 1. Unified Startup Script Design **Decision:** 使用單一 `start.sh` 腳本,支援多種模式 ```bash # Usage examples: ./start.sh # Start both backend and frontend ./start.sh backend # Start only backend ./start.sh frontend # Start only frontend ./start.sh --stop # Stop all services ./start.sh --status # Show service status ``` **Rationale:** 保持簡單,使用 bash 內建功能管理子進程,不引入額外依賴如 PM2 或 supervisord。 ### 2. Process Management **Decision:** 使用 PID 文件追蹤進程,支援優雅停止 - PID files stored in `.pid/` directory (gitignored) - SIGTERM for graceful shutdown - Fallback to SIGKILL after timeout ### 3. Environment Variable Strategy **Decision:** 保持分離的 `.env` 文件,但改善文檔 - Root `.env.local` - 共用配置 (database, API keys) - Frontend `.env.local` - 前端特定配置 (VITE_* variables) - `.env.example` files updated with all required variables **Rationale:** 前端 Vite 需要 `VITE_` 前綴的變數,混合會造成困擾。 ### 4. Package Dependencies **Current State:** - Python: 77 packages in requirements.txt - Node.js: 17 dependencies + 15 devDependencies **Key Dependencies to Audit:** - PaddlePaddle GPU vs CPU selection - Unused development tools - Duplicate functionality packages ## Risks / Trade-offs | Risk | Mitigation | |------|------------| | Breaking existing workflows | Keep old scripts as aliases | | Complex process management | Start simple, add features incrementally | | WSL2 compatibility issues | Test on clean WSL2 Ubuntu 22.04 | ## Migration Plan 1. Create new `start.sh` alongside existing scripts 2. Update documentation to recommend new script 3. After validation, deprecate old scripts (keep for one release) 4. Remove old scripts in future version ## Open Questions 1. Should we add systemd service files for production? 2. Should we include database migration in startup? 3. Should we add health check retries before opening browser?