Files
ewoooc/PROJECT_CONSTITUTION.md

601 lines
18 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.
# MOMO 監控系統 - 專案憲法
**版本:** 1.3
**制定日期:** 2026-01-12
**最後更新:** 2026-01-14
---
## 📜 專案基本原則
本憲法定義了 MOMO 監控系統的開發規範、溝通原則、安全政策及技術標準。所有參與者開發人員、AI 助手、維護人員)必須遵守以下規範。
---
## 🗣️ 第一章:溝通規範
### 第 1 條:語言使用
- **所有溝通一律使用繁體中文**
- 包含但不限於:
- 程式碼註解
- 文檔說明
- Commit 訊息
- 錯誤訊息
- 日誌輸出
- 使用者介面文字
- README 和文檔
### 第 2 條:文檔規範
- 所有文檔檔案使用 Markdown 格式(`.md`
- 檔案名稱使用英文大寫加底線(例:`PROJECT_CONSTITUTION.md`
- 文檔內容必須包含版本號和最後更新日期
- 重要變更需記錄在 CHANGELOG 中
### 第 3 條:註解規範
- Python 函數必須包含繁體中文 docstring
- 複雜邏輯必須添加行內註解說明
- 註解應說明「為什麼」而非「做什麼」
---
## 🔒 第二章:安全政策
### 第 4 條:敏感資訊管理
- **禁止在程式碼中硬編碼任何敏感資訊**
- 所有憑證、API 金鑰、密碼必須使用環境變數(`.env`
- `.env` 檔案必須列入 `.gitignore`
- 提供 `.env.example` 作為範本
### 第 5 條:密碼安全
- 所有密碼必須使用 `pbkdf2:sha256` 雜湊儲存
- 禁止使用明文密碼(僅過渡期允許,需發出警告)
- 密碼長度至少 8 個字元,包含英文字母和數字
- 登入失敗 5 次後鎖定帳號 5 分鐘
### 第 6 條:輸入驗證
- **所有使用者輸入必須經過驗證**
- SQL 查詢必須使用參數化查詢或白名單驗證
- 檔案上傳必須驗證副檔名和檔案大小
- 路徑操作必須使用 `safe_join()` 防止路徑遍歷
### 第 7 條CSRF 防護
- 所有 POST/PUT/DELETE/PATCH 請求必須包含 CSRF token
- HTML 表單使用 hidden input: `<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>`
- AJAX 請求使用 header: `'X-CSRFToken': getCSRFToken()`
### 第 8 條Session 安全
- Session cookie 必須設定 `HttpOnly=True`
- Session cookie 必須設定 `SameSite=Lax`
- 生產環境必須設定 `Secure=True`HTTPS
- Session 有效期設定為 2 小時
---
## 💻 第三章:程式碼規範
### 第 9 條:檔案上傳
- 僅允許上傳:`.xlsx`, `.xls`, `.csv`
- 檔案大小限制10 MB
- 使用 `secure_filename_unicode()` 清理檔名(支援中文)
- 檢查路徑遍歷攻擊(`..`, `/`, `\`
### 第 10 條SQL 安全
- 表名驗證:僅允許英文字母、數字、底線
- 欄位名驗證:允許中文、英文字母、數字、底線
- 時間戳驗證:嚴格遵守 `YYYY-MM-DD HH:MM:SS` 格式
- 使用 `safe_read_sql()` 進行安全的 SQL 查詢
### 第 11 條:路徑安全
- 所有路徑拼接使用 `safe_join(base, *paths)`
- 檢查 Windows 反斜線、連續點、雙點模式
- 驗證最終路徑在基礎目錄內
- 偵測到攻擊時記錄安全日誌
### 第 12 條:日誌規範
- 使用結構化日誌格式:`[模組] [級別] 訊息 | 詳細資訊`
- 安全事件使用 `[Security]` 標籤
- 記錄所有失敗的驗證嘗試
- 日誌級別:
- `ERROR`: 系統錯誤
- `WARNING`: 安全警告、失敗的攻擊嘗試
- `INFO`: 重要操作成功
- `DEBUG`: 詳細除錯資訊
---
## 🕷️ 第四章:數據爬取規範
### 第 13 條:爬蟲程式碼穩定性原則
- **爬蟲程式碼屬於核心業務邏輯,修改時必須格外謹慎**
- 任何修改必須經過完整測試,確認不影響現有爬取功能
- 修改前必須備份現有可運作的版本
- 修改後必須驗證所有爬蟲任務正常執行
### 第 14 條:爬蟲選擇器維護
- **CSS 選擇器和 XPath 是脆弱的依賴**
- 修改選擇器前必須:
1. 記錄修改原因(網站改版、元素變更等)
2. 測試新選擇器是否正確抓取目標資料
3. 保留舊選擇器作為註解備份
4. 記錄網站結構變更日期
- 建議使用多層次選擇器備援(主選擇器 + 備用選擇器)
### 第 15 條:爬蟲錯誤處理
- **所有爬蟲函數必須包含完整的錯誤處理**
- 必須處理的情況:
1. 網路連線失敗
2. 頁面載入超時
3. 元素找不到(選擇器失效)
4. 資料格式異常
5. 反爬蟲機制觸發
- 錯誤發生時:
- 記錄詳細錯誤日誌(包含 URL、選擇器、錯誤訊息
- 發送通知給管理員
- 不中斷其他爬蟲任務
- 保存最後成功的資料作為備援
### 第 16 條:爬蟲測試要求
- **修改爬蟲程式碼後必須執行完整測試**
- 測試項目:
1. 單一商品資料爬取
2. 列表頁面分頁爬取
3. 多執行緒/並發爬取
4. 錯誤處理機制
5. 資料儲存完整性
- 測試環境應模擬生產環境(網路延遲、並發請求)
- 使用測試資料集驗證爬取結果準確性
### 第 17 條:爬蟲依賴管理
- **爬蟲依賴的套件版本必須固定**
- `requirements.txt` 中爬蟲相關套件必須指定版本號:
- `selenium==4.x.x` (具體版本)
- `requests==2.x.x`
- `beautifulsoup4==4.x.x`
- 升級套件前必須:
1. 在測試環境驗證相容性
2. 檢查 changelog 確認無破壞性變更
3. 執行完整爬蟲測試套件
4. 記錄升級原因和影響
### 第 18 條:網站結構變更應對
- **定期檢查目標網站結構是否變更**
- 建立網站結構監控機制:
1. 記錄關鍵元素的 HTML 結構
2. 定期比對結構變化
3. 發現變更時立即通知
4. 建立選擇器失效告警
- 保存網站結構快照HTML samples供除錯使用
### 第 19 條:爬蟲效能與禮節
- **遵守網站的 robots.txt 規範**
- 設定合理的請求間隔(建議 1-3 秒)
- 使用 User-Agent 識別身份
- 避免在網站高峰時段進行大量爬取
- 實作請求失敗的退避重試機制Exponential Backoff
### 第 20 條:資料驗證與清洗
- **爬取的資料必須經過驗證**
- 驗證項目:
1. 價格範圍合理性(不可為 0 或異常大)
2. 日期格式正確性
3. 必填欄位完整性
4. 資料型別正確性
- 發現異常資料時:
- 記錄到錯誤日誌
- 標記為「需人工審核」
- 不自動儲存到資料庫
- 發送通知給管理員
### 第 21 條:爬蟲版本控制
- **爬蟲程式碼每次修改必須建立 Git commit**
- Commit 訊息格式:
- `[Crawler] [網站名稱] 修改描述`
- 例:`[Crawler] [MOMO] 修復商品價格選擇器失效問題`
- 重大修改應建立分支,測試通過後才合併
- 保留至少最近 3 個可運作版本的備份
### 第 22 條:爬蟲文檔要求
- **每個爬蟲模組必須包含詳細文檔**
- 必須記錄:
1. 爬取目標(網站 URL、資料類型
2. 執行頻率(每小時/每日)
3. 關鍵選擇器說明
4. 已知問題和限制
5. 最後修改日期和原因
6. 聯絡人/負責人
- 文檔應隨程式碼更新
---
## 🧪 第五章:測試與品質保證
### 第 23 條:測試覆蓋
- 所有安全功能必須有對應的測試
- 測試必須包含正常情況和攻擊情境
- 使用 `test_*.py` 命名測試檔案
- 執行 `./run_security_tests.sh` 必須全部通過
### 第 24 條:安全測試項目
必須測試以下項目:
1. 環境變數與憑證管理
2. SQL 注入防護
3. 路徑遍歷防護
4. 檔案上傳驗證
5. CSRF 防護
6. 登入驗證強化
7. Flask 安全配置
### 第 25 條:爬蟲測試項目
必須測試以下項目:
1. 選擇器有效性測試
2. 資料完整性測試
3. 錯誤處理測試
4. 並發爬取測試
5. 效能壓力測試
### 第 26 條:程式碼審查
- 所有涉及安全的程式碼變更必須經過審查
- 所有涉及爬蟲的程式碼變更必須經過審查
- 檢查是否符合本憲法規範
- 驗證是否通過完整測試
- 確認日誌和錯誤處理完整
---
## 📦 第六章:部署與維運
### 第 27 條:環境管理規範
#### 27.1 環境分層
本系統採用三層環境架構:
1. **開發環境 (Development)**
- 位置:`/Users/ogt/momo_pro_system` (macOS Local)
- 用途程式碼開發、快速測試、UI/UX 調整
- 運行方式:直接執行 `python app.py`
- 特性:即時修改、快速迭代
2. **測試環境 (Testing)**
- 位置:同開發環境
- 用途:功能測試、安全測試、回歸測試
- 運行方式:執行測試腳本
3. **正式環境 (Production)**
- 位置:`/home/ogt/momo_pro_system` (GCP VM)
- 用途生產服務、24/7 運行
- 運行方式systemd service
- 網址:`https://momo.wooo.work`
#### 27.2 環境同步原則
**嚴格禁止**
- ❌ 直接在正式環境修改程式碼
- ❌ 跳過測試直接部署到正式環境
- ❌ 混用不同環境的資料庫
- ❌ 將 `.env` 檔案上傳到 Git
**必須遵守**
- ✅ 所有修改必須在開發環境完成
- ✅ 完整測試通過後才能部署
- ✅ 部署前必須備份正式環境
- ✅ 部署後必須驗證功能正常
- ✅ 監控 24 小時確保穩定
#### 27.3 標準部署流程
參照 `DEPLOYMENT_WORKFLOW.md` 文檔,嚴格遵守以下流程:
```
開發 → 測試 → 備份 → 部署 → 驗證 → 監控
```
**階段性檢查**
1. **開發階段**程式碼符合規範、Git commit 完成
2. **測試階段**:功能測試、安全測試、爬蟲測試通過
3. **部署前**:備份正式環境、確認修改檔案清單
4. **部署中**:使用標準部署腳本或手動部署
5. **部署後**:服務狀態正常、功能驗證通過
6. **監控期**:持續監控 24 小時
#### 27.4 部署方法選擇
**方法 A完整部署**(推薦用於大改動)
```bash
cd /Users/ogt/momo_pro_system
./deploy_scripts/deploy_to_gcp.sh
```
適用於:
- Python 程式碼修改
- 依賴套件更新
- 配置檔案變更
- 資料庫結構變更
**方法 B快速更新**(用於小改動)
```bash
gcloud compute scp --zone=asia-east1-a 修改的檔案 momo-server:~/momo_pro_system/
```
適用於:
- HTML/CSS/JS 檔案修改
- 模板檔案更新
- 靜態資源更新
**重要**
- HTML/CSS/JS 修改不需重啟服務Flask 自動重載模板)
- Python 檔案修改:必須重啟服務
- 配置檔案修改:必須重啟服務
### 第 28 條:變更前強制備份原則 ⚠️
**重要性:最高優先級**
**核心原則**
- **所有涉及嚴重影響的變更、修改操作,變更前必須先進行完整備份**
- **備份完成並確認無誤後,才可進行變更**
- 違反此原則的變更操作視為嚴重違規
**適用範圍**
以下操作在執行前必須完整備份:
1. **資料庫相關**
- 資料庫結構變更ALTER TABLE, DROP, CREATE
- 大量資料修改或刪除UPDATE, DELETE 影響 >100 筆)
- 資料庫升級或遷移
- 索引重建或優化
2. **系統配置**
- 系統配置檔案修改config.py, .env
- Nginx/Apache 配置變更
- Systemd service 配置修改
- 排程任務crontab, scheduler變更
3. **核心程式碼**
- 爬蟲核心邏輯修改
- 資料庫連線和 ORM 修改
- 認證和安全模組修改
- API 端點的破壞性變更
4. **部署操作**
- 生產環境程式碼更新
- Python 依賴套件升級
- 系統套件升級Python, Node.js 等)
- 伺服器遷移或重啟
5. **資料處理**
- Excel 匯入覆蓋現有資料
- 批次資料清理或轉換
- 歷史資料歸檔或刪除
**備份要求**
**必須備份的內容**
- 完整資料庫檔案momo.db 或 PostgreSQL dump
- 所有程式碼檔案Git commit + 檔案副本)
- 配置檔案config.py, .env, nginx.conf 等)
- 重要的資料檔案Excel, CSV 等)
**備份驗證**
- 檢查備份檔案完整性檔案大小、MD5 校驗)
- 確認備份可讀取(嘗試開啟資料庫)
- 記錄備份時間和檔案位置
- 確保備份檔案有足夠的磁碟空間
**備份命名規範**
```
資料庫momo_backup_YYYYMMDD_HHMMSS.db
程式碼momo_code_backup_YYYYMMDD_HHMMSS.tar.gz
配置config_backup_YYYYMMDD_HHMMSS.tar.gz
```
**復原計畫**
- 每次重大變更必須準備復原步驟文件
- 測試復原流程的可行性
- 記錄復原所需時間
- 確保有回滾機制
**違規處理**
- 未備份就執行重大變更:視為一級違規
- 備份不完整或無法復原:視為二級違規
- 必須立即停止變更,進行損害評估
- 記錄事件並更新操作規範
**例外情況**
僅以下情況可豁免備份要求:
- 純前端 HTML/CSS/JS 修改(不影響資料)
- 日誌檔案查看(唯讀操作)
- 系統監控和狀態查詢
- 測試環境的實驗性變更
### 第 29 條:環境配置
- 開發環境使用 `.env`
- 生產環境使用環境變數注入
- 不同環境使用不同的 `SECRET_KEY`
- 定期輪換敏感憑證
### 第 30 條:備份策略
- 資料庫每日自動備份
- 備份檔案加密保存
- 保留最近 7 天備份
- 使用 `safe_join()` 處理備份路徑
### 第 31 條:更新流程
1. **評估變更影響**(是否需要備份,參照第 28 條)
2. **完整備份**(若屬於重大變更,必須先備份)
3. 更新程式碼
4. 執行完整測試套件(安全測試 + 爬蟲測試)
5. 檢查安全日誌
6. 重啟服務
7. 驗證功能正常(包含爬蟲任務)
8. 監控 24 小時確保穩定
9. 確認備份可刪除或歸檔
---
## 🚨 第七章:事件處理
### 第 32 條:安全事件
發現安全漏洞時:
1. 立即記錄詳細資訊
2. 評估風險等級Critical/High/Medium/Low
3. 優先處理 Critical 和 High 級別
4. 修復後執行完整測試
5. 更新 `SECURITY_FIX_SUMMARY.md`
### 第 33 條:爬蟲異常事件
發現爬蟲異常時:
1. 記錄詳細錯誤資訊URL、選擇器、錯誤訊息
2. 檢查是否為網站結構變更
3. 若為選擇器失效,立即修復並測試
4. 發送通知給管理員
5. 記錄在爬蟲維護日誌中
### 第 34 條:錯誤處理
- 所有錯誤必須妥善處理,不得暴露敏感資訊
- 使用者看到的錯誤訊息應簡潔明確
- 詳細錯誤資訊記錄在日誌中
- 開發環境可顯示詳細錯誤,生產環境僅顯示通用訊息
---
## 🔧 第八章:開發工具與依賴
### 第 35 條Python 依賴
核心依賴套件(見 `requirements.txt`
- Flask (Web 框架)
- Flask-WTF (CSRF 防護)
- SQLAlchemy (ORM)
- pandas (資料處理)
- selenium (網頁自動化)
- werkzeug (安全工具)
### 第 36 條:版本控制
- 使用 Git 進行版本控制
- Commit 訊息使用繁體中文
- Commit 格式:`[模組] 簡短描述`
- 例:`[Security] 修復路徑遍歷漏洞`
- 例:`[Crawler] [MOMO] 更新商品價格選擇器`
### 第 37 條:開發環境
- Python 3.8+
- 使用虛擬環境 (venv)
- IDE 建議VSCode, PyCharm
- 測試環境與生產環境分離
- 爬蟲測試使用獨立環境
---
## 📊 第九章:監控與維護
### 第 38 條:系統監控
- 定期檢查安全日誌
- 監控登入失敗次數
- 追蹤異常 API 請求
- 定期執行安全測試
### 第 39 條:爬蟲監控
- 監控爬蟲執行成功率
- 追蹤選擇器失效次數
- 檢查資料品質(異常值、缺失值)
- 監控爬取耗時變化
- 定期檢查目標網站結構
### 第 40 條:效能監控
- 資料庫查詢效能
- API 回應時間
- 記憶體使用量
- 磁碟空間
- 爬蟲執行效率
---
## 📋 第十章:憲法修訂
### 第 41 條:修訂流程
- 本憲法可隨專案需求修訂
- 修訂需說明原因和影響範圍
- 更新版本號和修訂日期
- 記錄在文檔歷史中
### 第 42 條:解釋權
- 本憲法條款如有疑義,以最新版本為準
- 技術決策以穩定性和安全性優先
- 爬蟲修改以不影響現有功能為原則
- 使用者體驗和效能次之
---
## 📚 附錄:快速檢查清單
### ✅ 新功能開發檢查
- [ ] 程式碼和註解使用繁體中文
- [ ] 無硬編碼敏感資訊
- [ ] 所有輸入經過驗證
- [ ] POST 請求包含 CSRF token
- [ ] 路徑操作使用 `safe_join()`
- [ ] 檔案上傳經過驗證
- [ ] 錯誤處理完整
- [ ] 日誌記錄完整
- [ ] 通過安全測試
- [ ] 更新相關文檔
### ⚠️ 重大變更前備份檢查
- [ ] 評估變更影響範圍(資料庫/配置/核心程式碼/部署)
- [ ] 確認符合第 28 條適用範圍
- [ ] 完整備份資料庫檔案
- [ ] 備份所有程式碼Git commit + 檔案副本)
- [ ] 備份配置檔案
- [ ] 驗證備份檔案完整性(檔案大小、可讀取)
- [ ] 記錄備份時間和位置
- [ ] 準備復原計畫文件
- [ ] 測試復原流程可行性
- [ ] 確保有回滾機制
### 🔒 安全審查檢查
- [ ] SQL 查詢使用參數化或白名單
- [ ] 無明文密碼
- [ ] Session 配置正確
- [ ] CSRF 防護啟用
- [ ] 路徑遍歷防護
- [ ] 檔案上傳限制
- [ ] 登入失敗鎖定
- [ ] 敏感操作有日誌
### 🕷️ 爬蟲修改檢查
- [ ] 備份現有可運作版本
- [ ] 記錄修改原因和網站變更資訊
- [ ] 保留舊選擇器作為註解
- [ ] 測試新選擇器正確性
- [ ] 執行單一商品爬取測試
- [ ] 執行列表頁面爬取測試
- [ ] 驗證資料完整性和格式
- [ ] 檢查錯誤處理機制
- [ ] 更新爬蟲文檔
- [ ] 記錄在維護日誌中
- [ ] 建立 Git commit
- [ ] 監控 24 小時確保穩定
---
## 🎯 結語
本憲法旨在確保 MOMO 監控系統的安全性、穩定性、可維護性和一致性。所有參與者應:
1. **遵守規範**:嚴格遵守本憲法所有條款
2. **持續改進**:隨著專案發展適時修訂
3. **穩定優先**:爬蟲修改以不影響現有功能為原則
4. **安全第一**:任何決策以安全為最高優先
5. **謹慎測試**:修改後必須完整測試並監控
6. **文檔完整**:保持文檔與程式碼同步更新
**核心原則:**
- **安全不是功能,而是基礎**
- **爬蟲是核心業務,修改需格外謹慎**
- **測試是品質的保證,不可省略**
---
**版本歷史:**
- v1.3 (2026-01-14): 新增第六章第 28 條「變更前強制備份原則」⚠️,明確規定所有涉及嚴重影響的變更操作前必須完整備份,定義適用範圍、備份要求、驗證流程、復原計畫及違規處理機制
- v1.2 (2026-01-13): 擴充第六章第 27 條「環境管理規範」,明確定義開發/測試/正式三層環境架構、環境同步原則、標準部署流程,並新增 `DEPLOYMENT_WORKFLOW.md` 完整部署文檔
- v1.1 (2026-01-12): 新增第四章「數據爬取規範」(第 13-22 條),定義爬蟲程式碼穩定性、選擇器維護、錯誤處理、測試要求等 10 項規範
- v1.0 (2026-01-12): 初版發布,定義核心規範