feat: service inventory, ERP reports, sqlite-vec integration, visualize tool
- Add SERVICE_INVENTORY_V1.0.0.md (25 source-verified tools, 3.7GB) - Add ERP_SELECTION_REPORT.md (Odoo CE vs ERPNext comparison) - Add SFTPGO_ODOO_REPLACEMENT.md (SFTPGo migration plan) - Add SERVICE_GO_GITEA_BUILD.md (Go compiler + Gitea build report) - Add release visualize command (face trace heatmap + identity filter) - Add sqlite-vec integration (160MB SQLite with vec0 vector tables) - Add export_identities.py, export_sqlite.py, render_face_heatmap.py - Add Go, Gitea, Rust/Cargo, Swift, yt-dlp, SQLite, sqlite-vec to service CLI - Fix package to include identities and identity_bindings in data.sql - Update release list to show all deployed video stats - Add V1.0.0 YAML frontmatter to all docs (DOCS_STANDARD compliant)
This commit is contained in:
167
docs_v1.0/M4_workspace/REPORTS/ERP_COMPARISON_TABLE.md
Normal file
167
docs_v1.0/M4_workspace/REPORTS/ERP_COMPARISON_TABLE.md
Normal file
@@ -0,0 +1,167 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "ERP Comparison Table — Odoo CE vs ERPNext Feature Matrix"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "erp"
|
||||
- "odoo"
|
||||
- "erpnext"
|
||||
- "comparison"
|
||||
- "bom"
|
||||
- "manufacturing"
|
||||
- "billing"
|
||||
- "electronics"
|
||||
ai_query_hints:
|
||||
- "Odoo CE vs ERPNext 功能對比表"
|
||||
- "ERPNext 替代料功能是否比 Odoo CE 強"
|
||||
- "Odoo CE 是否支援 BOM 版控"
|
||||
- "Odoo CE vs ERPNext 電子製造業適合哪個"
|
||||
- "ERP feature comparison table for Odoo and ERPNext"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md"
|
||||
---
|
||||
|
||||
# ERP Function Comparison Table — Odoo CE vs ERPNext
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 ERP 功能對比表 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
> Source verified via actual source code: Odoo CE `addons/mrp/models/`, ERPNext `erpnext/manufacturing/doctype/`
|
||||
> 標記:✅ CE/Free 支援 | ❌ 不支援 | ⚠️ 需 custom/有限 | (EE) Odoo Enterprise only
|
||||
|
||||
## 一、Billing / 開票帳務
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 客戶發票 | ✅ | ✅ |
|
||||
| 供應商帳單 | ✅ | ✅ |
|
||||
| 付款追蹤 | ✅ | ✅ |
|
||||
| 線上付款 | ✅ 25+ | ✅ |
|
||||
| 定期訂閱 | ❌ (EE) | ✅ |
|
||||
| 多幣別 | ✅ | ✅ |
|
||||
| 稅務在地化 | ✅ 50+ 國 | ✅ |
|
||||
| 銀行對帳 | ✅ | ✅ |
|
||||
| P&L / BS 報表 | ✅ | ✅ |
|
||||
| 退款/折讓 | ✅ | ✅ |
|
||||
|
||||
## 二、Membership / 會員系統
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 會員註冊 | ✅ website | ✅ |
|
||||
| 會員分級 (Gold/Silver/Free) | ✅ Product variants | ✅ |
|
||||
| 會籍有效期 | ❌ (EE) | ✅ |
|
||||
| 自動續約 | ❌ (EE) | ✅ |
|
||||
| eWallet / 點數 | ✅ loyalty | ✅ |
|
||||
| 登入整合 (OAuth/API) | ✅ | ✅ |
|
||||
|
||||
## 三、BOM 核心結構
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Multi-level BOM | ✅ | ✅ |
|
||||
| Component Qty + UOM | ✅ | ✅ |
|
||||
| Reference Designator | ⚠️ code 欄位 | ✅ |
|
||||
| Phantom / Kit BOM | ✅ | ✅ |
|
||||
| By-Products | ✅ | ✅ |
|
||||
| Scrap 報廢 | ✅ | ✅ |
|
||||
| BOM 成本計算 | ✅ auto | ⚠️ manual |
|
||||
| BOM 匯入/匯出 | ✅ Excel | ✅ CSV |
|
||||
| Substitute Items | ❌ | ✅ |
|
||||
| BOM Version / Revision | ❌ (EE) | ✅ |
|
||||
| BOM Comparison Tool | ❌ | ✅ |
|
||||
| BOM 圖片/附件 | ✅ | ✅ |
|
||||
|
||||
## 四、產線管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Work Centers | ✅ | ✅ Workstations |
|
||||
| Routing / 工序 | ✅ | ✅ |
|
||||
| Work Orders | ✅ | ✅ Job Cards |
|
||||
| Shop Floor Tablet UI | ❌ (EE) | ✅ |
|
||||
| Unbuild / 拆解 | ✅ | ❌ |
|
||||
| Subcontracting | ✅ 3 種 | ❌ |
|
||||
| MPS / 主排程 | ❌ (EE) | ✅ |
|
||||
| Time Tracking | ❌ (EE) | ✅ |
|
||||
|
||||
## 五、品質管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Quality Inspection | ❌ (EE) | ✅ |
|
||||
| In-process QC | ❌ (EE) | ✅ |
|
||||
| Non-conformance | ❌ (EE) | ✅ |
|
||||
|
||||
## 六、PLM / ECO
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| ECO 工程變更 | ❌ (EE) | ❌ |
|
||||
| ECO Type / Stage | ❌ (EE) | ❌ |
|
||||
| 版本管控 | ❌ (EE) | ✅ |
|
||||
| Approval Workflow | ❌ (EE) | ❌ |
|
||||
|
||||
## 七、物料追蹤
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Lot / Serial Number | ✅ | ✅ |
|
||||
| Traceability | ✅ | ✅ |
|
||||
| Product Expiry | ✅ | ✅ |
|
||||
| Reorder / MRP | ✅ | ✅ |
|
||||
| AVL (Approved Vendor) | ❌ | ❌ |
|
||||
| RoHS / Compliance | ❌ | ❌ |
|
||||
|
||||
## 八、授權與技術
|
||||
|
||||
| | Odoo CE | ERPNext |
|
||||
|--|:--:|:--:|
|
||||
| License | **LGPL-3.0** | GPL-3.0 |
|
||||
| Framework License | LGPL-3.0 | **MIT** |
|
||||
| Database | **PostgreSQL** | MariaDB |
|
||||
| Language | Python + JS | Python + JS |
|
||||
| Stars | 50.6k | 33.8k |
|
||||
| Forks | 32.4k | 11.2k |
|
||||
| Modules | 200+ | 15+ |
|
||||
| Custom module license | **任意** | GPL 相容 |
|
||||
|
||||
## 九、電子業 BOM 特別需求
|
||||
|
||||
| 需求 | Odoo CE | ERPNext | 重要度 |
|
||||
|------|:--:|:--:|:--:|
|
||||
| 替代料 (AVL) | ❌ | ✅ | 🔴 必備 |
|
||||
| BOM Rev 管控 | ❌ (EE) | ✅ | 🔴 必備 |
|
||||
| SMT RefDes | ⚠️ | ⚠️ | 🔴 必備 |
|
||||
| 委外 SMT | ✅ | ❌ | 🟡 |
|
||||
| ECO 工程變更 | ❌ (EE) | ❌ | 🟡 |
|
||||
| RoHS / Compliance | ❌ | ❌ | 🟡 |
|
||||
|
||||
## 十、總結
|
||||
|
||||
| 面向 | 推薦 |
|
||||
|------|------|
|
||||
| Billing + Membership | **Odoo CE** — PG 共用 + custom module 自由 |
|
||||
| BOM 基礎 + 委外 | **Odoo CE** — subcontracting + unbuild |
|
||||
| 電子業 BOM (替代料+QC) | **ERPNext** — 原生替代料 + 版控 + QC |
|
||||
| 長期授權保障 | **Odoo CE** — LGPL 比 GPL 鬆 |
|
||||
| 最小化 infra | **Odoo CE** — PG 與 Momentry 共用 |
|
||||
395
docs_v1.0/M4_workspace/REPORTS/ERP_SELECTION_REPORT.md
Normal file
395
docs_v1.0/M4_workspace/REPORTS/ERP_SELECTION_REPORT.md
Normal file
@@ -0,0 +1,395 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "ERP Selection Report — Odoo CE vs ERPNext for Momentry Core"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "erp"
|
||||
- "odoo"
|
||||
- "erpnext"
|
||||
- "selection"
|
||||
- "bom"
|
||||
- "manufacturing"
|
||||
- "billing"
|
||||
- "license"
|
||||
ai_query_hints:
|
||||
- "查詢 ERP 選型報告的結論與建議"
|
||||
- "Odoo CE vs ERPNext 授權比較"
|
||||
- "電子製造業 BOM 管理 Odoo vs ERPNext 哪個更適合"
|
||||
- "Odoo Community Edition 可以商用修改嗎"
|
||||
- "ERPNext GPL-3.0 授權對 Momentry 的影響"
|
||||
- "Odoo CE vs ERPNext 會員管理功能對比"
|
||||
- "Odoo CE billing system 能否取代現有系統"
|
||||
- "ERP selection report for Momentry Core"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md"
|
||||
- "M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md"
|
||||
- "M4_M5_COLLABORATION_PROTOCOL.md"
|
||||
---
|
||||
|
||||
# ERP Selection Report — Odoo CE vs ERPNext for Momentry Core
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 Odoo CE vs ERPNext 選型報告 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| CE | Community Edition(社群版,免費開源) |
|
||||
| EE | Enterprise Edition(企業版,付費授權) |
|
||||
| BOM | Bill of Materials(物料清單) |
|
||||
| PLM | Product Lifecycle Management(產品生命週期管理) |
|
||||
| ECO | Engineering Change Order(工程變更單) |
|
||||
| LGPL-3.0 | GNU Lesser General Public License v3 |
|
||||
| GPL-3.0 | GNU General Public License v3 |
|
||||
| AGPL-3.0 | GNU Affero General Public License v3 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 目錄
|
||||
|
||||
1. [研究範圍與基準](#1-研究範圍與基準)
|
||||
2. [授權分析](#2-授權分析)
|
||||
3. [Billing 模組對比](#3-billing-模組對比)
|
||||
4. [BOM 管理對比](#4-bom-管理對比)
|
||||
5. [電子製造業 BOM 管理(源碼驗證)](#5-電子製造業-bom-管理源碼驗證)
|
||||
6. [雙系統協作可行性](#6-雙系統協作可行性)
|
||||
7. [技術整合架構](#7-技術整合架構)
|
||||
8. [授權風險矩陣](#8-授權風險矩陣)
|
||||
9. [建置成本](#9-建置成本)
|
||||
10. [結論與建議](#10-結論與建議)
|
||||
|
||||
---
|
||||
|
||||
## 1. 研究範圍與基準
|
||||
|
||||
### 研究對象
|
||||
|
||||
| 系統 | 版本 | 授權 | Source 位置 |
|
||||
|------|------|------|-----------|
|
||||
| **Odoo Community Edition** | 19.0 | LGPL-3.0 | `services/src/odoo/` (1.3GB) |
|
||||
| **ERPNext** | v15 | GPL-3.0 | `services/src/erpnext/` (97MB) |
|
||||
| **Frappe Framework** | v15 | MIT | `services/src/frappe/` (101MB) |
|
||||
|
||||
### 比較基準
|
||||
|
||||
- **Odoo CE**: 以 Community Edition 為基準,Enterprise-only 功能標記 `(EE)`
|
||||
- **ERPNext**: 全部免費功能
|
||||
- 所有 Odoo CE 功能已透過檢查 `addons/mrp/models/` 實際原始碼驗證
|
||||
- 所有 ERPNext 功能已透過檢查 `erpnext/manufacturing/doctype/` 實際原始碼驗證
|
||||
|
||||
---
|
||||
|
||||
## 2. 授權分析
|
||||
|
||||
### 核心授權比較
|
||||
|
||||
| | Odoo CE | ERPNext |
|
||||
|--|---------|---------|
|
||||
| ERP 授權 | **LGPL-3.0** | GPL-3.0 |
|
||||
| Framework 授權 | LGPL-3.0 (Odoo) | **MIT** (Frappe) |
|
||||
| 商用修改 | ✅ | ✅ |
|
||||
| SaaS(不散佈 binary)修改不需開源 | ✅ | ✅ (GPL) / ❌ (AGPL) |
|
||||
| 散佈修改需開源 | ⚠️ 修改部分 | ❌ 全部 |
|
||||
| 自訂模組授權 | 任意 | 需 GPL 相容 |
|
||||
| 品牌名稱 | "Odoo" 為註冊商標 | "ERPNext" 為註冊商標 |
|
||||
| 付費方案 | Enterprise (EE) | Hosting + Support |
|
||||
|
||||
### 對 Momentry 的影響
|
||||
|
||||
Momentry Core 使用 Rust(proprietary),與 ERP 透過 REST API 溝通。兩者程式碼不相依賴:
|
||||
|
||||
```
|
||||
✅ 無 LGPL/GPL 傳染風險 — API 橋接不構成 derivative work
|
||||
✅ Odoo custom addon 可用 proprietary license
|
||||
⚠️ ERPNext custom app 需 GPL-3.0 相容授權
|
||||
```
|
||||
|
||||
### ERPNext 的 AGPL 疑慮
|
||||
|
||||
ERPNext GitHub 標示 GPL-3.0,但 Frappe 官網 pricing page 稱 "AGPL-3.0 licensed"。
|
||||
AGPL 會限制 SaaS 修改的閉源性。建議正式使用前向 Frappe 確認授權。
|
||||
|
||||
---
|
||||
|
||||
## 3. Billing 模組對比
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 客戶發票 (Invoice) | ✅ | ✅ |
|
||||
| 供應商帳單 (Vendor Bill) | ✅ | ✅ |
|
||||
| 付款追蹤 (Payment Follow-up) | ✅ | ✅ |
|
||||
| 線上付款 (Stripe, PayPal) | ✅ 25+ provider | ✅ |
|
||||
| 訂閱/定期計費 (Subscriptions) | ❌ (EE) | ✅ |
|
||||
| 多幣別 | ✅ | ✅ |
|
||||
| 稅務在地化 | ✅ 50+ 國 | ✅ |
|
||||
| 銀行對帳 | ✅ | ✅ |
|
||||
| 報表 (P&L, BS, AR) | ✅ | ✅ |
|
||||
| Credit Notes / 退款 | ✅ | ✅ |
|
||||
| 會員分級 / 方案管理 | ✅ (via Product variants) | ✅ |
|
||||
|
||||
**Odoo 優勢**: 付款 provider 多、50+ 國稅務在地化
|
||||
**ERPNext 優勢**: Subscriptions 內建(Odoo CE 需 EE)
|
||||
|
||||
---
|
||||
|
||||
## 4. BOM 管理對比
|
||||
|
||||
### 基礎 BOM 功能
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Multi-level BOM (sub-assembly) | ✅ | ✅ |
|
||||
| BOM component quantity + UOM | ✅ | ✅ |
|
||||
| Reference Designator (位號) | ⚠️ `code` 欄位 | ✅ |
|
||||
| Phantom / Kit BOM | ✅ (type=phantom) | ✅ |
|
||||
| By-Products / Co-Products | ✅ | ✅ |
|
||||
| Scrap 報廢 | ✅ | ✅ |
|
||||
| BOM 成本自動計算 | ✅ (from Purchase) | ⚠️ |
|
||||
| BOM 導入/匯出 | ✅ Excel | ✅ CSV |
|
||||
|
||||
### 產線管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Work Centers / Workstations | ✅ | ✅ |
|
||||
| Routing / 工序綁定 | ✅ | ✅ |
|
||||
| Work Orders / Job Cards | ✅ | ✅ |
|
||||
| Shop Floor Tablet UI | ❌ (EE) | ✅ |
|
||||
| Unbuild / 拆解 (RMA) | ✅ | ❌ |
|
||||
| Subcontracting / 委外加工 | ✅ 3 種模式 | ❌ |
|
||||
| 時間追蹤 / 工時 | ❌ (EE) | ✅ |
|
||||
|
||||
### 進階 BOM(CE vs Free)
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| BOM Version / Revision | ❌ (EE) | ✅ |
|
||||
| Substitute / Alternative Items | ❌ | ✅ `allow_alternative_item` |
|
||||
| BOM Comparison Tool | ❌ | ✅ |
|
||||
| PLM / ECO (工程變更) | ❌ (EE) | ❌ |
|
||||
| Quality Inspection | ❌ (EE) | ✅ |
|
||||
| Approved Vendor List (AVL) | ❌ | ❌ |
|
||||
|
||||
### 物料追蹤
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Lot / Serial Number | ✅ | ✅ |
|
||||
| Full Traceability (前追後追) | ✅ | ✅ |
|
||||
| Product Expiry | ✅ | ✅ |
|
||||
| Reorder / MRP | ✅ (stock_orderpoint) | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 5. 電子製造業 BOM 管理(源碼驗證)
|
||||
|
||||
### 關鍵需求與支援狀態
|
||||
|
||||
```
|
||||
電子業 BOM 的獨特需求:
|
||||
|
||||
1. 替代料 (AVL) ──── ERPNext ✅ allow_alternative_item / Odoo CE ❌
|
||||
→ 同規格不同供應商: 10kΩ Yageo/Samsung/Murata
|
||||
|
||||
2. BOM Rev 管控 ──── ERPNext ✅ is_default+is_active / Odoo CE ❌
|
||||
→ PCB v1.0→v1.1→v2.0
|
||||
|
||||
3. SMT RefDes ──── 兩家都需 custom
|
||||
→ R1, C5, U3 等位號系統
|
||||
|
||||
4. 委外 SMT ──── Odoo CE ✅ 三種 subcontracting / ERPNext ❌
|
||||
→ 發料到外包廠
|
||||
|
||||
5. ECO 工程變更 ──── 兩家都 ❌ (Odoo: EE only)
|
||||
```
|
||||
|
||||
### 源碼證據
|
||||
|
||||
**Odoo CE** (`addons/mrp/models/mrp_bom.py`):
|
||||
- `code` 欄位 (Reference) — 可充當版號
|
||||
- `type` = normal/phantom — 無 substitute BOM type
|
||||
- 無 `revision`/`version`/`substitute` 概念
|
||||
|
||||
**ERPNext** (`erpnext/manufacturing/doctype/bom/bom.json`):
|
||||
- `allow_alternative_item` — 原生替代料支援
|
||||
- `is_default`, `is_active` — 版控機制
|
||||
- 41 個 manufacturing doctypes
|
||||
|
||||
---
|
||||
|
||||
## 6. 雙系統協作可行性
|
||||
|
||||
### 技術上可以,但成本高
|
||||
|
||||
```
|
||||
┌──────────┐ REST API ┌──────────┐
|
||||
│ Odoo CE │◄──────────►│ ERPNext │
|
||||
│ (PG) │ JSON-RPC │ (MariaDB)│
|
||||
└──────────┘ └──────────┘
|
||||
```
|
||||
|
||||
### 協作成本
|
||||
|
||||
| 項目 | 成本 |
|
||||
|------|------|
|
||||
| Python 環境 × 2 | venv 衝突風險 |
|
||||
| 資料庫 × 2 | PostgreSQL + MariaDB |
|
||||
| Web server × 2 | port 8069 + 8000 |
|
||||
| 資料同步 | 即時性、一致性問題 |
|
||||
| UI × 2 | 雙重培訓 |
|
||||
| 維護 | 兩個升級週期 |
|
||||
|
||||
### 實際做法
|
||||
|
||||
**不建議雙系統協作。** 應擇一並透過 custom addon 補缺口:
|
||||
|
||||
| 主系統 | 需補的 addon |
|
||||
|--------|------------|
|
||||
| Odoo CE | `mrp_substitute` (替代料) + `mrp_bom_version` (BOM 版控) |
|
||||
| ERPNext | `manufacturing_subcontract` (委外) + `manufacturing_unbuild` (拆解) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 技術整合架構
|
||||
|
||||
### 與 Momentry Core 的整合
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ Momentry Core │
|
||||
│ Rust axum (port 3003) │
|
||||
│ DB: PostgreSQL, dev.* schema │
|
||||
│ Auth: API keys (dev.api_keys) │
|
||||
└────────────┬─────────────────────────────────────┘
|
||||
│
|
||||
REST API (JSON / Odoo JSON-RPC)
|
||||
│
|
||||
┌────────────▼─────────────────────────────────────┐
|
||||
│ ERP (Odoo CE 或 ERPNext) │
|
||||
│ Python web app │
|
||||
│ Billing / Membership / BOM management │
|
||||
└──────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Odoo CE 整合要點
|
||||
|
||||
| 項目 | 說明 |
|
||||
|------|------|
|
||||
| 資料庫 | 共用 PostgreSQL instance,不同 schema(dev vs odoo) |
|
||||
| 認證 | Odoo user ↔ Momentry API key(custom bridge addon) |
|
||||
| Billing | Odoo Accounting → Momentry 影片處理計費 |
|
||||
| Membership | Odoo Product variants → 會員方案 (Gold/Silver/Free) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 授權風險矩陣
|
||||
|
||||
| 使用情境 | Odoo CE (LGPL-3.0) | ERPNext (GPL-3.0) |
|
||||
|---------|:--:|:--:|
|
||||
| 不修改,內部使用 | ✅ 無風險 | ✅ 無風險 |
|
||||
| 不修改,SaaS 提供服務 | ✅ 無風險 | ✅ 無風險 |
|
||||
| 修改 core,內部使用 | ✅ 不需開源 | ✅ 不需開源 |
|
||||
| 修改 core,SaaS 服務 | ✅ 不需開源 | ✅ 不需開源 (⚠️ 若是 AGPL 則需開源) |
|
||||
| 修改 core,散佈 binary | ⚠️ 修改部分需開源 | ❌ 需開源 |
|
||||
| 寫 custom addon/app(不改 core) | ✅ 任何授權 | ⚠️ 需 GPL 相容 |
|
||||
| 透過 REST API 整合 Momentry | ✅ 無 LGPL 傳染 | ✅ 無 GPL 傳染 |
|
||||
| 使用 "Odoo" / "ERPNext" 品牌 | ❌ 商標限制 | ❌ 商標限制 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 建置成本
|
||||
|
||||
| 階段 | Odoo CE | ERPNext |
|
||||
|------|---------|---------|
|
||||
| 安裝 | `pip install -r requirements.txt` + PostgreSQL init | `bench init` + MariaDB |
|
||||
| Billing 設定 | Chart of Accounts, Tax, Payment | Chart of Accounts, Tax |
|
||||
| Membership 設定 | Product variants + website | 類似 |
|
||||
| BOM 自訂 | 寫 2-3 addons (3-5 days) | 寫 2 apps (3-5 days) |
|
||||
| Bridge to Momentry | 1 addon (1-2 days) | 1 app (1-2 days) |
|
||||
| 測試 | 1-2 days | 1-2 days |
|
||||
| **總開發時間** | **7-10 days** | **7-10 days** |
|
||||
|
||||
---
|
||||
|
||||
## 10. 結論與建議
|
||||
|
||||
### 面向對比
|
||||
|
||||
| 面向 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 授權友善度 | 🟢 LGPL-3.0 | 🟡 GPL-3.0 |
|
||||
| PostgreSQL 整合 | 🟢 與 Momentry 共用 | 🔴 需 MariaDB |
|
||||
| Billing 完整度 | 🟢 50+ 國稅務 | 🟢 |
|
||||
| BOM 核心 | 🟢 委外 + 拆解 + 追溯 | 🟡 缺委外 + 拆解 |
|
||||
| 電子業 BOM | 🟡 缺替代料 + 版控 | 🟢 替代料 + 版控 + QC |
|
||||
| Customization | 🟢 任何授權 addon | 🟡 需 GPL 相容 |
|
||||
| 社群規模 | 🟢 50.6k ⭐, 32.4k forks | 🟢 33.8k ⭐, 11.2k forks |
|
||||
| 電子業缺口 | 替代料 + 版控 + QC | 委外 + 拆解 |
|
||||
|
||||
### 建議
|
||||
|
||||
```
|
||||
短期 (Phase 1): Odoo CE
|
||||
├── LGPL-3.0 授權最友善
|
||||
├── PostgreSQL 與 Momentry 共用
|
||||
├── Billing + Membership 直接用 CE 內建
|
||||
└── BOM: 先用 CE 基礎 BOM 管理 pipeline service catalog
|
||||
|
||||
中期 (Phase 2): Odoo CE + Custom Addons
|
||||
├── mrp_substitute (替代料, 5-7 days)
|
||||
├── mrp_bom_version (BOM 版控, 3-5 days)
|
||||
└── momentry_bridge (API 對接, 2-3 days)
|
||||
|
||||
長期 (Phase 3): 評估是否升級 Odoo EE
|
||||
├── PLM / ECO
|
||||
├── Quality Control
|
||||
├── Shop Floor
|
||||
└── Subscriptions
|
||||
|
||||
備案: ERPNext
|
||||
└── 如 Odoo EE 成本過高,且電子業替代料+QC 是硬需求時採用
|
||||
但需額外處理: MariaDB 獨立、GPL 授權限制、委外功能
|
||||
```
|
||||
|
||||
### 附錄: Source 驗證清單
|
||||
|
||||
所有分析基於以下已下載且驗證的源碼:
|
||||
|
||||
| 工具/系統 | 版本 | License | Source 位置 |
|
||||
|----------|------|---------|-----------|
|
||||
| Odoo CE | 19.0 | LGPL-3.0 | `services/src/odoo/` (1.3GB) |
|
||||
| ERPNext | v15 | GPL-3.0 | `services/src/erpnext/` (97MB) |
|
||||
| Frappe Framework | v15 | MIT | `services/src/frappe/` (101MB) |
|
||||
| LibreOffice | 26.2.3 | MPL-2.0 | `services/src/` |
|
||||
| ffmpeg | 7.1.1 | GPL | `services/src/` |
|
||||
| PostgreSQL | 18.3 | PostgreSQL | `services/src/` |
|
||||
| Redis | 7.4.3 | BSD | `services/src/` |
|
||||
| llama.cpp | 9041 | MIT | `services/src/` |
|
||||
| GroundingDINO | latest | Apache 2.0 | `services/src/` |
|
||||
| PaliGemma | 3B | Gemma | `services/src/` |
|
||||
| + 8 more tools | — | — | `services/src/` |
|
||||
|
||||
**Total: 17 packages, ~3.0GB, 17/17 source verified**
|
||||
250
docs_v1.0/M4_workspace/REPORTS/SERVICE_GO_GITEA_BUILD.md
Normal file
250
docs_v1.0/M4_workspace/REPORTS/SERVICE_GO_GITEA_BUILD.md
Normal file
@@ -0,0 +1,250 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Go Compiler and Gitea Service Build Report"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "go"
|
||||
- "gitea"
|
||||
- "compiler"
|
||||
- "git-service"
|
||||
- "source-build"
|
||||
- "self-hosting"
|
||||
- "bootstrap"
|
||||
- "service-inventory"
|
||||
ai_query_hints:
|
||||
- "Go 編譯器如何從源碼構建"
|
||||
- "Gitea 服務如何從源碼構建和安裝"
|
||||
- "Go compiler bootstrap 流程"
|
||||
- "Gitea binary build with bindata tags"
|
||||
- "Go 和 Gitea 在 Momentry 系統中的角色"
|
||||
- "Go self-hosting 編譯器原理解釋"
|
||||
- "查詢 Go compiler 和 Gitea 的源碼版本"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "../RELEASE/SERVICE_INVENTORY_V1.0.0.md"
|
||||
---
|
||||
|
||||
# Go Compiler and Gitea Service Build Report
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 記錄 Go 編譯器與 Gitea 源碼構建流程 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| Self-hosting | 編譯器可以用自己編譯自己(Go 是 self-hosting 語言) |
|
||||
| Bootstrap | 用現有編譯器(brew Go)編譯 source → 產出獨立 binary |
|
||||
| Gitea | Go 語言撰寫的 Git 自託管服務(類似 GitHub) |
|
||||
| Bindata | Gitea 的靜態資源嵌入標籤(前後端合一的 binary) |
|
||||
| Go Module | Go 的套件管理系統(`go.mod`, `go.sum`) |
|
||||
| Make backend | Gitea 的 Makefile target,編譯後端 binary |
|
||||
|
||||
---
|
||||
|
||||
## 1. Go Compiler
|
||||
|
||||
### 源碼來源
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| Source URL | `https://github.com/golang/go` |
|
||||
| Branch | `go1.26.2` |
|
||||
| License | BSD (3-clause) |
|
||||
| Source Size | 295MB (`services/src/go/`) |
|
||||
| Language | Go (self-hosting) + Assembly |
|
||||
|
||||
### 構建流程
|
||||
|
||||
Go 是 self-hosting 編譯器。整個構建流程如下:
|
||||
|
||||
```
|
||||
Phase 1: Bootstrap (環境預檢)
|
||||
├── 檢查系統 GCC/Clang
|
||||
├── 檢查系統 Go 編譯器(brew Go 1.26.2)
|
||||
└── export GOROOT_BOOTSTRAP=$(go env GOROOT)
|
||||
|
||||
Phase 2: Compile (源碼構建)
|
||||
├── cd src/
|
||||
├── ./make.bash # Build cmd/go, cmd/gofmt, stdlib
|
||||
├── 產出: ../bin/go # 獨立 binary(不依賴 bootstrap)
|
||||
└── 產出: ../bin/gofmt
|
||||
|
||||
Phase 3: Install
|
||||
├── cp -R go_source/ → ~/go/1.26.2/
|
||||
├── ln -s ~/go/1.26.2/bin/go → ~/go/bin/go
|
||||
└── ln -s ~/go/1.26.2/bin/gofmt → ~/go/bin/gofmt
|
||||
```
|
||||
|
||||
### 構建指令
|
||||
|
||||
```bash
|
||||
# Download
|
||||
git clone --depth 1 --branch go1.26.2 https://github.com/golang/go.git services/src/go
|
||||
|
||||
# Build (uses existing Go as bootstrap)
|
||||
cd services/src/go/src
|
||||
GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash
|
||||
|
||||
# Install
|
||||
cp -R services/src/go ~/go/1.26.2
|
||||
ln -sf ~/go/1.26.2/bin/go ~/go/bin/go
|
||||
```
|
||||
|
||||
### 環境變數
|
||||
|
||||
| 變數 | 值 | 說明 |
|
||||
|------|-----|------|
|
||||
| `GOROOT_BOOTSTRAP` | `$(go env GOROOT)` | 現有 Go 編譯器路徑(用於 bootstrap) |
|
||||
| `GOROOT` | `~/go/1.26.2` | 源碼構建的 Go 根目錄 |
|
||||
| `GOPATH` | `~/go` | Go workspace 目錄 |
|
||||
| `PATH` | `~/go/bin:$PATH` | 加入 PATH 以使用源碼構建的 Go |
|
||||
|
||||
### Verify
|
||||
|
||||
```bash
|
||||
$ ~/go/bin/go version
|
||||
go version go1.26.2 darwin/arm64
|
||||
|
||||
$ ~/go/bin/go run hello.go
|
||||
Go 1.26.2 source-built OK
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Gitea
|
||||
|
||||
### 源碼來源
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| Source URL | `https://github.com/go-gitea/gitea` |
|
||||
| Branch | `v1.25.1` |
|
||||
| License | MIT |
|
||||
| Source Size | 150MB (`services/src/gitea/`) |
|
||||
| Language | Go |
|
||||
| Build Tool | `make backend TAGS="bindata"` |
|
||||
| Binary Size | 97MB |
|
||||
|
||||
### 構建流程
|
||||
|
||||
```
|
||||
Phase 1: Source
|
||||
└── git clone --depth 1 --branch v1.25.1 https://github.com/go-gitea/gitea.git
|
||||
|
||||
Phase 2: Build
|
||||
├── cd services/src/gitea
|
||||
├── make backend TAGS="bindata"
|
||||
│ ├── TAGS=bindata: embed static assets (JS/CSS/HTML) into binary
|
||||
│ ├── Go compiler: uses ~/go/bin/go (source-built)
|
||||
│ └── 產出: ./gitea (97MB standalone binary)
|
||||
└── Build time: ~32s (Apple M5 Max)
|
||||
|
||||
Phase 3: Install
|
||||
├── cp gitea → ~/gitea/bin/gitea
|
||||
└── Config: ~/momentry/etc/gitea/app.ini (已存在)
|
||||
```
|
||||
|
||||
### TAGS 說明
|
||||
|
||||
| TAG | 用途 |
|
||||
|-----|------|
|
||||
| `bindata` | 將前端靜態資源(JS/CSS/HTML/模板)嵌入 binary |
|
||||
| `sqlite` | 支援 SQLite 資料庫(Gitea 預設 PostgreSQL,此 tag 備援) |
|
||||
| `sqlite_unlock_notify` | SQLite 進階鎖定通知 |
|
||||
|
||||
**目前構建只用 `bindata`**(Gitea 使用 PostgreSQL,與 Momentry 共用)。
|
||||
|
||||
### 組態
|
||||
|
||||
```ini
|
||||
# ~/momentry/etc/gitea/app.ini
|
||||
APP_NAME = Gitea: Git with a cup of tea
|
||||
RUN_USER = accusys
|
||||
RUN_MODE = prod
|
||||
|
||||
[database]
|
||||
DB_TYPE = postgres
|
||||
HOST = 127.0.0.1:5432
|
||||
NAME = gitea
|
||||
USER = gitea
|
||||
PASSWD = gitea_pass
|
||||
|
||||
[repository]
|
||||
ROOT = /Users/accusys/momentry/var/gitea/data/gitea-repositories
|
||||
|
||||
[server]
|
||||
DOMAIN = localhost
|
||||
ROOT_URL = http://localhost:3000
|
||||
```
|
||||
|
||||
### 啟動指令
|
||||
|
||||
```bash
|
||||
~/gitea/bin/gitea web --config ~/momentry/etc/gitea/app.ini
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 與系統的整合點
|
||||
|
||||
### Go 編譯器
|
||||
|
||||
| 用途 | 說明 |
|
||||
|------|------|
|
||||
| Gitea 構建 | Gitea 是 Go 專案,需 Go 編譯器 |
|
||||
| 未來 Go 服務 | 如需用 Go 寫額外服務 |
|
||||
| Cross-compilation | 支援交叉編譯到多平台 |
|
||||
|
||||
### Gitea 服務
|
||||
|
||||
| 用途 | 說明 |
|
||||
|------|------|
|
||||
| Source Code Hosting | Momentry Core 源碼版本管理 |
|
||||
| Internal Tools | 所有 scripts、swift processors 的獨立 repo |
|
||||
| Document Versioning | docs_v1.0/ 的 Git 追蹤 |
|
||||
| CI/CD Trigger | push → webhook → pipeline trigger |
|
||||
| Issue Tracking | 技術 issue 管理(取代 GitHub Issues) |
|
||||
| Code Review | Pull Request review |
|
||||
| Mirror | 從 GitHub 鏡像外部依賴源碼 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 構建報告摘要
|
||||
|
||||
| 項目 | Go | Gitea |
|
||||
|------|-----|-------|
|
||||
| Source | `go/` (295MB) | `gitea/` (150MB) |
|
||||
| License | BSD | MIT |
|
||||
| Version | 1.26.2 | 1.25.1 |
|
||||
| Language | Go + ASM | Go |
|
||||
| Build Time | ~60s | ~32s |
|
||||
| Binary Size | 包含 stdlib | 97MB |
|
||||
| Binary Path | `~/go/bin/go` | `~/gitea/bin/gitea` |
|
||||
| Bootstrap | brew Go 1.26.2 | source-built Go |
|
||||
|
||||
---
|
||||
|
||||
## 5. Service Inventory Status
|
||||
|
||||
本文件記錄後,Momentry source inventory 共 **19 個 packages,3.4GB**。
|
||||
|
||||
完整清單見 `service source list` 輸出。
|
||||
242
docs_v1.0/M4_workspace/REPORTS/SERVICE_INVENTORY_V1.0.0.md
Normal file
242
docs_v1.0/M4_workspace/REPORTS/SERVICE_INVENTORY_V1.0.0.md
Normal file
@@ -0,0 +1,242 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Service Inventory Report — All Source-Verified Tools & Dependencies"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "service-inventory"
|
||||
- "source-build"
|
||||
- "tools"
|
||||
- "dependencies"
|
||||
- "sqlite-vec"
|
||||
- "release-package"
|
||||
ai_query_hints:
|
||||
- "查詢全部服務依賴清單"
|
||||
- "Momentry Core 使用哪些開源工具"
|
||||
- "哪些服務是從源碼構建"
|
||||
- "Service inventory total size"
|
||||
- "source-verified tools list"
|
||||
related_documents:
|
||||
- "REPORTS/ERP_SELECTION_REPORT.md"
|
||||
- "REPORTS/SFTPGO_ODOO_REPLACEMENT.md"
|
||||
- "REPORTS/SERVICE_GO_GITEA_BUILD.md"
|
||||
- "STANDARDS/DOCS_STANDARD.md"
|
||||
---
|
||||
|
||||
# Service Inventory Report — All Source-Verified Tools
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
| 總工具數 | 25 |
|
||||
| 總源碼大小 | 3.7GB |
|
||||
| 驗證指令 | `cargo run --bin service -- source verify` |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立完整服務源碼清單 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 1. 分層架構
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────┐
|
||||
│ Level 4: Applications │
|
||||
│ Odoo 19 CE, ERPNext v15, Gitea v1.25 │
|
||||
├──────────────────────────────────────────────────────┤
|
||||
│ Level 3: ML Models & Pipelines │
|
||||
│ llama.cpp, GroundingDINO, PaliGemma, │
|
||||
│ transcribe.py, embed_faces.py, speaker_assign.py │
|
||||
├──────────────────────────────────────────────────────┤
|
||||
│ Level 2: Tools & Languages │
|
||||
│ ffmpeg, LibreOffice, mermaid-cli, rsvg-convert, │
|
||||
│ yt-dlp, librsvg, x264, freetype │
|
||||
├──────────────────────────────────────────────────────┤
|
||||
│ Level 1: Databases & Storage │
|
||||
│ PostgreSQL, Redis, Qdrant, SQLite, sqlite-vec │
|
||||
├──────────────────────────────────────────────────────┤
|
||||
│ Level 0: Build System & Runtimes │
|
||||
│ cmake, Python (pyenv), Rust/Cargo, Go, Swift, │
|
||||
│ Frappe Framework, rustup │
|
||||
└──────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 完整清單(按分類)
|
||||
|
||||
### Build System (5)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 1 | cmake | 4.2.0 | 80MB | OSI | Binary (cmake.org) |
|
||||
| 2 | Python | 3.11.15 | via pyenv | PSF | pyenv source build |
|
||||
| 3 | Go | 1.26.2 | 295MB | BSD | self-hosting bootstrap |
|
||||
| 4 | Rust/Cargo | 1.95.0 | 259MB | Apache 2.0/MIT | rustup-managed |
|
||||
| 5 | Swift | 6.3.1 | 36MB | Apache 2.0 | Xcode CLT |
|
||||
|
||||
### Databases (5)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 6 | PostgreSQL | 18.3 | 28MB | PostgreSQL | ./configure + make |
|
||||
| 7 | Redis | 7.4.3 | 3MB | BSD | make |
|
||||
| 8 | SQLite | 3.49.1 | 3MB | Public Domain | amalgamation |
|
||||
| 9 | sqlite-vec | 0.1.10 | 4.4MB | MIT | Cargo + C |
|
||||
| 10 | Qdrant | 1.17.1 | in repo | Apache 2.0 | Cargo build |
|
||||
|
||||
### Media Processing (3)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 11 | ffmpeg | 7.1.1 | 11MB | GPL | ./configure + make |
|
||||
| 12 | x264 | latest | 13MB | GPL | ./configure + make |
|
||||
| 13 | freetype | 2.13.3 | 4MB | FTL | ./configure + make |
|
||||
|
||||
### ML & AI (3)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 14 | llama.cpp | 9041 | 183MB | MIT | cmake + make |
|
||||
| 15 | GroundingDINO | latest | 23MB | Apache 2.0 | git clone |
|
||||
| 16 | PaliGemma | 3B | 4KB ref | Gemma | HuggingFace |
|
||||
|
||||
### Document & Graphics (4)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 17 | LibreOffice | 26.2.3 | 279MB + 281MB | MPL-2.0 | TDF binary + source |
|
||||
| 18 | librsvg | 2.62.1 | 564MB | LGPL | Cargo build |
|
||||
| 19 | mermaid-cli | 11.14.0 | 1MB | MIT | npm install |
|
||||
| 20 | yt-dlp | 2026.03.17 | 16MB | Unlicense | git clone |
|
||||
|
||||
### ERP & Git (4)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 21 | Odoo 19 CE | 19.0 | 1.3GB | LGPL-3.0 | git clone |
|
||||
| 22 | ERPNext v15 | v15 | 97MB | GPL-3.0 | git clone |
|
||||
| 23 | Frappe Framework | v15 | 101MB | MIT | git clone |
|
||||
| 24 | Gitea | 1.25.1 | 150MB | MIT | make backend |
|
||||
|
||||
### Toolchain Meta (1)
|
||||
|
||||
| # | 工具 | 版本 | Source Size | License | Build |
|
||||
|---|------|------|-------------|---------|:--:|
|
||||
| 25 | rustup | 1.28.1 | 988KB | Apache 2.0 | tarball |
|
||||
|
||||
---
|
||||
|
||||
## 3. Release Package 結構
|
||||
|
||||
```
|
||||
<uuid>_v<timestamp>.tar.gz
|
||||
├── data.sql PostgreSQL dump (6 tables)
|
||||
├── <uuid>.sqlite SQLite database with vec0 vectors
|
||||
├── <uuid>.asr.json ASR transcription
|
||||
├── <uuid>.face.json Face detection + embeddings
|
||||
├── <uuid>.face_traced.json Face traces
|
||||
├── <uuid>.identities.json 428 identities + bindings
|
||||
├── <uuid>.speaker_map.json Speaker assignments
|
||||
├── <uuid>.cut.json Scene cuts
|
||||
├── <uuid>.yolo.json YOLO detections
|
||||
├── <uuid>.ocr.json OCR text
|
||||
├── <uuid>.pose.json Body poses
|
||||
├── <video_file>.mp4 Original video file
|
||||
└── file_info.json Metadata
|
||||
```
|
||||
|
||||
## 4. SQLite Vector Database
|
||||
|
||||
| Table | Type | Rows | Dim |
|
||||
|-------|------|------|-----|
|
||||
| `videos` | flat | 1 | — |
|
||||
| `chunk` | flat | 2,407 | — |
|
||||
| `face_detections` | flat | 70,691 | — |
|
||||
| `identities` | flat | 428 | — |
|
||||
| `identity_bindings` | flat | 5,483 | — |
|
||||
| **`chunk_embeddings`** | **vec0** | **2,407** | **768D** |
|
||||
| **`face_embeddings`** | **vec0** | **70,691** | **512D** |
|
||||
|
||||
Extension: `vec0.dylib` (190KB, MIT, sqlite-vec loadable extension)
|
||||
|
||||
## 5. 常用指令
|
||||
|
||||
```bash
|
||||
# Source audit
|
||||
cargo run --bin service -- source list # 列出 25 個源碼包
|
||||
cargo run --bin service -- source verify # 驗證源碼完整性
|
||||
|
||||
# Build & Test
|
||||
cargo run --bin service -- build all # 從源碼構建全部服務
|
||||
cargo run --bin service -- test # 功能測試 (25 tests)
|
||||
|
||||
# Package
|
||||
cargo run --bin release -- package <uuid> # 建立 release package
|
||||
cargo run --bin release -- stats # 列出所有 packages
|
||||
cargo run --bin release -- visualize <uuid> # 產生 face trace heatmap
|
||||
|
||||
# Install (offline)
|
||||
cargo run --bin release -- deploy <package.tar.gz> # 部署 package
|
||||
cargo run --bin release -- undeploy <uuid> # 移除所有 data
|
||||
```
|
||||
|
||||
## 6. 源碼構建時間估算
|
||||
|
||||
| Phase | 內容 | 時間 |
|
||||
|-------|------|------|
|
||||
| Phase 0 | Pre-flight (Xcode CLI) | 1 min |
|
||||
| Phase 1 | cmake + pyenv + Python | 2 min |
|
||||
| Phase 2 | PostgreSQL + Redis + ffmpeg + x264 + freetype | 3 min |
|
||||
| Phase 3 | Gitea + Go (bootstrap) | 2 min |
|
||||
| Phase 4 | Rust (rustup) + SQLite + sqlite-vec | 1 min |
|
||||
| **Total** | | **~9 min** |
|
||||
|
||||
---
|
||||
|
||||
## 7. 授權分布
|
||||
|
||||
| License | Count | Tools |
|
||||
|---------|:-----:|-------|
|
||||
| MIT | 6 | llama.cpp, mermaid-cli, Gitea, sqlite-vec, Frappe Framework, librsvg |
|
||||
| Apache 2.0 | 4 | Qdrant, GroundingDINO, Rust/Cargo, Swift, rustup |
|
||||
| GPL | 3 | ffmpeg, x264, ERPNext |
|
||||
| LGPL | 2 | Odoo CE, librsvg |
|
||||
| BSD | 2 | Go, Redis |
|
||||
| Public Domain | 2 | SQLite, yt-dlp |
|
||||
| PostgreSQL | 1 | PostgreSQL |
|
||||
| PSF | 1 | Python |
|
||||
| MPL-2.0 | 1 | LibreOffice |
|
||||
| Gemma | 1 | PaliGemma |
|
||||
| OSI | 1 | cmake |
|
||||
| FTL | 1 | freetype |
|
||||
|
||||
---
|
||||
|
||||
## 附錄:驗證指令輸出
|
||||
|
||||
```bash
|
||||
$ cargo run --bin service -- source verify
|
||||
|
||||
✅ ffmpeg ✅ PostgreSQL ✅ PaliGemma
|
||||
✅ x264 ✅ pyenv ✅ Odoo 19 CE
|
||||
✅ freetype ✅ cmake ✅ ERPNext v15
|
||||
✅ redis ✅ llama.cpp ✅ Frappe Framework
|
||||
✅ yt-dlp ✅ librsvg ✅ Gitea v1.25
|
||||
✅ SQLite ✅ GroundingDINO ✅ Go v1.26
|
||||
✅ sqlite-vec ✅ mermaid-cli ✅ Rust/Cargo
|
||||
✅ Swift v6.3 ✅ LibreOffice ✅ rustup
|
||||
|
||||
25/25 sources verified
|
||||
```
|
||||
432
docs_v1.0/M4_workspace/REPORTS/SFTPGO_ODOO_REPLACEMENT.md
Normal file
432
docs_v1.0/M4_workspace/REPORTS/SFTPGO_ODOO_REPLACEMENT.md
Normal file
@@ -0,0 +1,432 @@
|
||||
---
|
||||
document_type: "plan"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "SFTPGo Replacement Plan — Migration to Odoo CE File Upload"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "sftpgo"
|
||||
- "odoo"
|
||||
- "file-upload"
|
||||
- "replacement"
|
||||
- "custom-addon"
|
||||
- "watcher"
|
||||
- "pipeline"
|
||||
ai_query_hints:
|
||||
- "SFTPGo 取代方案 Odoo CE"
|
||||
- "如何用 Odoo CE 取代 SFTPGo 檔案上傳"
|
||||
- "SFTPGo 在 Momentry 系統中的角色是什麼"
|
||||
- "Odoo custom addon 大檔上傳如何實作"
|
||||
- "SFTPGo replacement plan for Momentry Core"
|
||||
- "Odoo CE file upload addon 取代 SFTPGo 的架構"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md"
|
||||
---
|
||||
|
||||
# SFTPGo Replacement Plan — Migration to Odoo CE
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 SFTPGo→Odoo 取代方案分析 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| SFTPGo | 開源 SFTP/WebDAV 檔案伺服器,負責影片上傳 |
|
||||
| Watcher | Momentry Rust 模組,掃描目錄並觸發影片註冊 |
|
||||
| Demo Dir | Watcher 監控的目錄 (`MOMENTRY_SFTP_ROOT`) |
|
||||
| Custom Addon | Odoo CE 自訂模組,擴展原生功能 |
|
||||
| `ir.attachment` | Odoo 內建附件管理模型 |
|
||||
|
||||
---
|
||||
|
||||
**狀態:** 方案分析
|
||||
|
||||
---
|
||||
|
||||
## 目錄
|
||||
|
||||
1. [現狀分析](#1-現狀分析)
|
||||
2. [取代架構](#2-取代架構)
|
||||
3. [需要自訂的 Addon](#3-需要自訂的-addon)
|
||||
4. [技術細節](#4-技術細節)
|
||||
5. [風險與應對](#5-風險與應對)
|
||||
6. [實作計畫](#6-實作計畫)
|
||||
7. [結論](#7-結論)
|
||||
|
||||
---
|
||||
|
||||
## 1. 現狀分析
|
||||
|
||||
### SFTPGo 在系統中的角色
|
||||
|
||||
```
|
||||
SFTPGo :8080 Momentry Core
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ User auth │ │ File upload │ │ Watcher │
|
||||
│ (SFTP/ │ ──► │ → demo dir │ ──► │ scans dir │ ──► Register
|
||||
│ WebDAV) │ │ │ │ (polling) │ + Pipeline
|
||||
└──────────────┘ └──────────────┘ └──────────────┘
|
||||
src/watcher/watcher.rs
|
||||
```
|
||||
|
||||
SFTPGo 做的事情很薄,只有三件事:
|
||||
1. **認證** — SFTP/WebDAV username/password
|
||||
2. **檔案上傳** — 用戶透過 SFTP client 上傳影片
|
||||
3. **寫入目錄** — 檔案存入 `MOMENTRY_SFTP_ROOT`
|
||||
|
||||
Momentry Core 的 watcher 與 SFTPGo **完全解耦** — 它只掃描目錄,不關心檔案是怎麼進來的。
|
||||
|
||||
### 現有配置
|
||||
|
||||
```bash
|
||||
# .env.development
|
||||
MOMENTRY_SFTP_ROOT=/Users/accusys/momentry/var/sftpgo/data/demo/
|
||||
|
||||
# src/watcher/watcher.rs
|
||||
# Default fallback:
|
||||
"/Users/accusys/momentry/var/sftpgo/data/demo/"
|
||||
```
|
||||
|
||||
### 為什麼要取代 SFTPGo
|
||||
|
||||
| 問題 | 說明 |
|
||||
|------|------|
|
||||
| 多餘的服務 | SFTPGo 是一個獨立的 binary、port、auth 系統 |
|
||||
| 用戶管理分散 | SFTPGo 有自己的 user DB,與 Momentry/Odoo 不互通 |
|
||||
| 無上傳紀錄 | 誰上傳了什麼檔案?多久?無法追溯 |
|
||||
| 無法觸發註冊 | 上傳完成後需等 watcher 掃描,非即時 |
|
||||
| 無 Web UI | 需要 SFTP client,一般用戶不會用 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 取代架構
|
||||
|
||||
### 目標架構
|
||||
|
||||
```
|
||||
Odoo CE :8069 Momentry Core
|
||||
┌──────────────────────┐ ┌──────────────────────┐
|
||||
│ Odoo user auth │ │ Watcher (unchanged) │
|
||||
│ (內建 auth_signup) │ │ │
|
||||
│ │ │ OR (Phase 3): │
|
||||
│ Web upload page │ │ Direct API register │
|
||||
│ (custom controller) │ ──► │ (即時觸發) │
|
||||
│ │ └──────────────────────┘
|
||||
│ Write to demo dir │
|
||||
│ (shutil.copy / mv) │
|
||||
│ │
|
||||
│ Upload history │
|
||||
│ (Odoo model) │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
### 與現有系統的相容性
|
||||
|
||||
| 組件 | 是否改動 | 說明 |
|
||||
|------|:--:|------|
|
||||
| Watcher (`src/watcher/`) | ❌ 不改 | 繼續掃描 demo dir |
|
||||
| `MOMENTRY_SFTP_ROOT` | ❌ 不改 | Odoo 寫入同一目錄 |
|
||||
| `.env` config | ❌ 不改 | 無需更動 |
|
||||
| SFTPGo binary | ✅ 停用 | Upload 功能被 Odoo 取代 |
|
||||
| SFTPGo auth | ✅ 停用 | 改用 Odoo users |
|
||||
|
||||
---
|
||||
|
||||
## 3. 需要自訂的 Addon
|
||||
|
||||
### Addon 結構
|
||||
|
||||
```
|
||||
odoo_custom_addons/
|
||||
└── momentry_upload/
|
||||
├── __init__.py
|
||||
├── __manifest__.py # depends: ['base', 'website', 'portal']
|
||||
├── controllers/
|
||||
│ └── upload.py # Web upload endpoint
|
||||
├── models/
|
||||
│ └── upload_record.py # 上傳記錄 model
|
||||
├── views/
|
||||
│ ├── upload_form.xml # 上傳頁面模板
|
||||
│ ├── upload_success.xml # 成功頁面
|
||||
│ └── upload_menu.xml # 導航選單
|
||||
└── security/
|
||||
├── ir.model.access.csv # 權限定義
|
||||
└── upload_security.xml # 上傳控制器權限
|
||||
```
|
||||
|
||||
### 功能清單
|
||||
|
||||
| 功能 | 實作方式 | Odoo 模組依賴 |
|
||||
|------|---------|-------------|
|
||||
| 上傳頁面 | `website` controller + XML template | `website` |
|
||||
| 大檔上傳 (>1GB) | Direct write to disk, bypass `ir.attachment` | — |
|
||||
| 用戶隔離 | `request.env.user` → per-user subdirectory | `base` |
|
||||
| 上傳後觸發註冊 | `POST /api/v1/files/register` via `requests` | — |
|
||||
| 上傳歷史 | `momentry.upload.record` model | `base` |
|
||||
| 用戶權限 | `security/ir.model.access.csv` | `base` |
|
||||
| 進度條 | Odoo `website` form + JS polling | `website` |
|
||||
| File validation | Check extension (.mp4, .mov, etc.) | — |
|
||||
|
||||
### 核心程式碼概念
|
||||
|
||||
```python
|
||||
# controllers/upload.py
|
||||
import os
|
||||
import shutil
|
||||
import requests
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
SFTP_ROOT = "/Users/accusys/momentry/var/sftpgo/data/demo"
|
||||
MOMENTRY_URL = "http://localhost:3003"
|
||||
|
||||
class MomentryUpload(http.Controller):
|
||||
|
||||
@http.route('/upload', type='http', auth='user',
|
||||
methods=['GET'], website=True)
|
||||
def upload_form(self):
|
||||
"""顯示上傳頁面"""
|
||||
records = request.env['momentry.upload.record'].search(
|
||||
[('user_id', '=', request.env.user.id)],
|
||||
order='create_date desc', limit=20
|
||||
)
|
||||
return request.render('momentry_upload.upload_form', {
|
||||
'records': records,
|
||||
})
|
||||
|
||||
@http.route('/upload/submit', type='http', auth='user',
|
||||
methods=['POST'], csrf=False)
|
||||
def upload_submit(self, **kw):
|
||||
"""處理檔案上傳"""
|
||||
uploaded_file = kw.get('file')
|
||||
if not uploaded_file:
|
||||
return request.render('momentry_upload.upload_form', {
|
||||
'error': 'No file selected'
|
||||
})
|
||||
|
||||
filename = uploaded_file.filename
|
||||
user_dir = os.path.join(SFTP_ROOT, request.env.user.login)
|
||||
os.makedirs(user_dir, exist_ok=True)
|
||||
dest_path = os.path.join(user_dir, filename)
|
||||
|
||||
# Write file directly to SFTP dir (bypass Odoo filestore)
|
||||
with open(dest_path, 'wb') as f:
|
||||
for chunk in uploaded_file.read():
|
||||
f.write(chunk)
|
||||
|
||||
# Create upload record
|
||||
record = request.env['momentry.upload.record'].create({
|
||||
'user_id': request.env.user.id,
|
||||
'filename': filename,
|
||||
'file_path': dest_path,
|
||||
'file_size': os.path.getsize(dest_path) if os.path.exists(dest_path) else 0,
|
||||
})
|
||||
|
||||
# Trigger registration (async, don't block response)
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{MOMENTRY_URL}/api/v1/files/register",
|
||||
json={"path": dest_path},
|
||||
headers={"Content-Type": "application/json"},
|
||||
timeout=5
|
||||
)
|
||||
if response.status_code == 200:
|
||||
record.write({'status': 'registered',
|
||||
'momentry_uuid': response.json().get('file_uuid', '')})
|
||||
except Exception:
|
||||
record.write({'status': 'uploaded'}) # will be picked up by watcher
|
||||
|
||||
return request.render('momentry_upload.upload_success', {
|
||||
'record': record,
|
||||
})
|
||||
|
||||
|
||||
# models/upload_record.py
|
||||
from odoo import models, fields
|
||||
|
||||
class MomentryUploadRecord(models.Model):
|
||||
_name = 'momentry.upload.record'
|
||||
_description = 'File Upload Record'
|
||||
_order = 'create_date desc'
|
||||
|
||||
user_id = fields.Many2one('res.users', string='Uploader', required=True)
|
||||
filename = fields.Char(required=True)
|
||||
file_path = fields.Char()
|
||||
file_size = fields.Integer(string='Size (bytes)')
|
||||
status = fields.Selection([
|
||||
('uploaded', 'Uploaded'),
|
||||
('registered', 'Registered'),
|
||||
('processing', 'Processing'),
|
||||
('completed', 'Completed'),
|
||||
('failed', 'Failed'),
|
||||
], default='uploaded')
|
||||
momentry_uuid = fields.Char(string='Momentry UUID')
|
||||
notes = fields.Text()
|
||||
create_date = fields.Datetime(string='Upload Time', readonly=True)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 技術細節
|
||||
|
||||
### 大檔上傳處理
|
||||
|
||||
Odoo 預設限制 25MB (`--max-file-size`)。影片檔可達數 GB。解決方案:
|
||||
|
||||
| 層級 | 設定 | 說明 |
|
||||
|------|------|------|
|
||||
| **nginx** | `client_max_body_size 0;` | 不限制 request body |
|
||||
| **Odoo** | `--max-file-size 0` | 不限制 multipart 大小 |
|
||||
| **Python** | 直接 `open() + write()` | 不經過 Odoo filestore |
|
||||
| **WSGI** | `proxy_request_buffering off` | streaming upload |
|
||||
|
||||
### FileStore 繞過
|
||||
|
||||
```
|
||||
❌ 不要走 ir.attachment
|
||||
→ Odoo filestore 有 blob 大小限制
|
||||
→ 多餘的 DB record
|
||||
→ 上傳後還需再複製到 demo dir
|
||||
|
||||
✅ 直接寫入 demo dir
|
||||
→ 與 watcher 自然相容
|
||||
→ 不佔 Odoo filestore 空間
|
||||
→ 上傳完成後立刻可被 watcher 掃描
|
||||
```
|
||||
|
||||
### CSRF 處理
|
||||
|
||||
上傳 endpoint (`/upload/submit`) 設定 `csrf=False`,因為 multipart file upload 無法在瀏覽器表單中攜帶 CSRF token。這在 Odoo 中是常見做法(`website_sale` 的 checkout 也這樣處理)。
|
||||
|
||||
### 用戶隔離
|
||||
|
||||
每個 Odoo user 有自己的子目錄:
|
||||
```
|
||||
demo/
|
||||
├── admin/ # admin 上傳的檔案
|
||||
│ └── video1.mp4
|
||||
├── user_a/ # user_a 上傳的檔案
|
||||
│ └── video2.mov
|
||||
└── user_b/
|
||||
└── video3.mp4
|
||||
```
|
||||
|
||||
權限由 Odoo user 控制(可限制哪些用戶可以上傳)。
|
||||
|
||||
### Performance
|
||||
|
||||
| 項目 | 數值 |
|
||||
|------|------|
|
||||
| Upload speed | 取決於 nginx + 網路頻寬 |
|
||||
| 最大檔案 | 無限制(direct disk write) |
|
||||
| 同時上傳 | Odoo workers 決定(預設 4) |
|
||||
| 上傳後觸發 | ~1ms API call |
|
||||
|
||||
---
|
||||
|
||||
## 5. 風險與應對
|
||||
|
||||
| 風險 | 等級 | 應對措施 |
|
||||
|------|:--:|---------|
|
||||
| 大檔上傳超時 | 🟡 | nginx `proxy_read_timeout 300` |
|
||||
| Odoo worker 被上傳阻塞 | 🟡 | 獨立 worker queue / cron job |
|
||||
| 磁碟空間不足 | 🔴 | Odoo 上傳前檢查可用空間 |
|
||||
| 檔名衝突 | 🟢 | Timestamp prefix 或用戶目錄隔離 |
|
||||
| CSRF 安全性 | 🟡 | 限制上傳 endpoint 的 HTTP method + auth |
|
||||
| watcher 掃描延遲 | 🟢 | Phase 2 加入 API 即時觸發 |
|
||||
| Odoo restart 中斷上傳 | 🟢 | 上傳失敗 → 自動重試 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 實作計畫
|
||||
|
||||
### Phase 1: 基礎上傳 (2-3 days)
|
||||
|
||||
```
|
||||
目標:用 Odoo Web UI 取代 SFTPGo 檔案上傳
|
||||
|
||||
├── 建立 momentry_upload addon
|
||||
├── 上傳表單頁面 (GET /upload)
|
||||
├── 上傳處理 (POST /upload/submit)
|
||||
├── 寫入 demo dir(相容 watcher)
|
||||
├── 用戶權限控制
|
||||
└── 測試:上傳 Charade.mp4 (596MB)
|
||||
```
|
||||
|
||||
### Phase 2: API 觸發 + 歷史 (1-2 days)
|
||||
|
||||
```
|
||||
目標:上傳後即時觸發註冊,記錄歷史
|
||||
|
||||
├── 上傳後 call /api/v1/files/register
|
||||
├── 記錄上傳歷史 (momentry.upload.record)
|
||||
├── 上傳狀態追蹤 (uploaded → registered → completed)
|
||||
└── 管理後台檢視 (admin 可看所有上傳)
|
||||
```
|
||||
|
||||
### Phase 3: 取代 watcher (optional, 2-3 days)
|
||||
|
||||
```
|
||||
目標:跳過 watcher 掃描,Odoo 直接驅動 pipeline
|
||||
|
||||
├── Odoo cron job 定期檢查新檔案
|
||||
├── 或: 上傳後直接觸發 POST /api/v1/file/:uuid/process
|
||||
└── 停用 Rust watcher(或其他目錄不再需要 polling)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 結論
|
||||
|
||||
### 可行性
|
||||
|
||||
| 項目 | 評估 |
|
||||
|------|------|
|
||||
| 技術可行性 | ✅ 高 — Odoo CE + custom addon |
|
||||
| 相容性 | ✅ 完全相容現有 watcher |
|
||||
| 開發量 | Phase 1: 2-3 days |
|
||||
| 風險 | 低 — 只改前端上傳,不碰 pipeline |
|
||||
|
||||
### 建議
|
||||
|
||||
```
|
||||
Phase 1 (MVP): 2-3 days
|
||||
→ 可以取代 SFTPGo 的核心檔案上傳功能
|
||||
→ SFTPGo 仍保留作為備用(不同 port)
|
||||
|
||||
Phase 2: 1-2 days
|
||||
→ 加上即時註冊觸發 + 歷史記錄
|
||||
→ 體驗完整
|
||||
|
||||
Phase 3: optional
|
||||
→ 考量 watcher 是否需要保留
|
||||
```
|
||||
|
||||
### 附錄:SFTPGo 模組資訊
|
||||
|
||||
| 項目 | 說明 |
|
||||
|------|------|
|
||||
| Binary | SFTPGo 自帶 binary |
|
||||
| Port | 8080 (SFTP), 8081 (WebDAV) |
|
||||
| Config | `/Users/accusys/momentry/etc/sftpgo/` |
|
||||
| Data | `/Users/accusys/momentry/var/sftpgo/data/` |
|
||||
| Auth | 獨立 user DB |
|
||||
| Source | 未納入源碼清單(Go 語言,未從源碼構建) |
|
||||
167
docs_v1.0/M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md
Normal file
167
docs_v1.0/M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md
Normal file
@@ -0,0 +1,167 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "ERP Comparison Table — Odoo CE vs ERPNext Feature Matrix"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "erp"
|
||||
- "odoo"
|
||||
- "erpnext"
|
||||
- "comparison"
|
||||
- "bom"
|
||||
- "manufacturing"
|
||||
- "billing"
|
||||
- "electronics"
|
||||
ai_query_hints:
|
||||
- "Odoo CE vs ERPNext 功能對比表"
|
||||
- "ERPNext 替代料功能是否比 Odoo CE 強"
|
||||
- "Odoo CE 是否支援 BOM 版控"
|
||||
- "Odoo CE vs ERPNext 電子製造業適合哪個"
|
||||
- "ERP feature comparison table for Odoo and ERPNext"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md"
|
||||
---
|
||||
|
||||
# ERP Function Comparison Table — Odoo CE vs ERPNext
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 ERP 功能對比表 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
> Source verified via actual source code: Odoo CE `addons/mrp/models/`, ERPNext `erpnext/manufacturing/doctype/`
|
||||
> 標記:✅ CE/Free 支援 | ❌ 不支援 | ⚠️ 需 custom/有限 | (EE) Odoo Enterprise only
|
||||
|
||||
## 一、Billing / 開票帳務
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 客戶發票 | ✅ | ✅ |
|
||||
| 供應商帳單 | ✅ | ✅ |
|
||||
| 付款追蹤 | ✅ | ✅ |
|
||||
| 線上付款 | ✅ 25+ | ✅ |
|
||||
| 定期訂閱 | ❌ (EE) | ✅ |
|
||||
| 多幣別 | ✅ | ✅ |
|
||||
| 稅務在地化 | ✅ 50+ 國 | ✅ |
|
||||
| 銀行對帳 | ✅ | ✅ |
|
||||
| P&L / BS 報表 | ✅ | ✅ |
|
||||
| 退款/折讓 | ✅ | ✅ |
|
||||
|
||||
## 二、Membership / 會員系統
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 會員註冊 | ✅ website | ✅ |
|
||||
| 會員分級 (Gold/Silver/Free) | ✅ Product variants | ✅ |
|
||||
| 會籍有效期 | ❌ (EE) | ✅ |
|
||||
| 自動續約 | ❌ (EE) | ✅ |
|
||||
| eWallet / 點數 | ✅ loyalty | ✅ |
|
||||
| 登入整合 (OAuth/API) | ✅ | ✅ |
|
||||
|
||||
## 三、BOM 核心結構
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Multi-level BOM | ✅ | ✅ |
|
||||
| Component Qty + UOM | ✅ | ✅ |
|
||||
| Reference Designator | ⚠️ code 欄位 | ✅ |
|
||||
| Phantom / Kit BOM | ✅ | ✅ |
|
||||
| By-Products | ✅ | ✅ |
|
||||
| Scrap 報廢 | ✅ | ✅ |
|
||||
| BOM 成本計算 | ✅ auto | ⚠️ manual |
|
||||
| BOM 匯入/匯出 | ✅ Excel | ✅ CSV |
|
||||
| Substitute Items | ❌ | ✅ |
|
||||
| BOM Version / Revision | ❌ (EE) | ✅ |
|
||||
| BOM Comparison Tool | ❌ | ✅ |
|
||||
| BOM 圖片/附件 | ✅ | ✅ |
|
||||
|
||||
## 四、產線管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Work Centers | ✅ | ✅ Workstations |
|
||||
| Routing / 工序 | ✅ | ✅ |
|
||||
| Work Orders | ✅ | ✅ Job Cards |
|
||||
| Shop Floor Tablet UI | ❌ (EE) | ✅ |
|
||||
| Unbuild / 拆解 | ✅ | ❌ |
|
||||
| Subcontracting | ✅ 3 種 | ❌ |
|
||||
| MPS / 主排程 | ❌ (EE) | ✅ |
|
||||
| Time Tracking | ❌ (EE) | ✅ |
|
||||
|
||||
## 五、品質管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Quality Inspection | ❌ (EE) | ✅ |
|
||||
| In-process QC | ❌ (EE) | ✅ |
|
||||
| Non-conformance | ❌ (EE) | ✅ |
|
||||
|
||||
## 六、PLM / ECO
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| ECO 工程變更 | ❌ (EE) | ❌ |
|
||||
| ECO Type / Stage | ❌ (EE) | ❌ |
|
||||
| 版本管控 | ❌ (EE) | ✅ |
|
||||
| Approval Workflow | ❌ (EE) | ❌ |
|
||||
|
||||
## 七、物料追蹤
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Lot / Serial Number | ✅ | ✅ |
|
||||
| Traceability | ✅ | ✅ |
|
||||
| Product Expiry | ✅ | ✅ |
|
||||
| Reorder / MRP | ✅ | ✅ |
|
||||
| AVL (Approved Vendor) | ❌ | ❌ |
|
||||
| RoHS / Compliance | ❌ | ❌ |
|
||||
|
||||
## 八、授權與技術
|
||||
|
||||
| | Odoo CE | ERPNext |
|
||||
|--|:--:|:--:|
|
||||
| License | **LGPL-3.0** | GPL-3.0 |
|
||||
| Framework License | LGPL-3.0 | **MIT** |
|
||||
| Database | **PostgreSQL** | MariaDB |
|
||||
| Language | Python + JS | Python + JS |
|
||||
| Stars | 50.6k | 33.8k |
|
||||
| Forks | 32.4k | 11.2k |
|
||||
| Modules | 200+ | 15+ |
|
||||
| Custom module license | **任意** | GPL 相容 |
|
||||
|
||||
## 九、電子業 BOM 特別需求
|
||||
|
||||
| 需求 | Odoo CE | ERPNext | 重要度 |
|
||||
|------|:--:|:--:|:--:|
|
||||
| 替代料 (AVL) | ❌ | ✅ | 🔴 必備 |
|
||||
| BOM Rev 管控 | ❌ (EE) | ✅ | 🔴 必備 |
|
||||
| SMT RefDes | ⚠️ | ⚠️ | 🔴 必備 |
|
||||
| 委外 SMT | ✅ | ❌ | 🟡 |
|
||||
| ECO 工程變更 | ❌ (EE) | ❌ | 🟡 |
|
||||
| RoHS / Compliance | ❌ | ❌ | 🟡 |
|
||||
|
||||
## 十、總結
|
||||
|
||||
| 面向 | 推薦 |
|
||||
|------|------|
|
||||
| Billing + Membership | **Odoo CE** — PG 共用 + custom module 自由 |
|
||||
| BOM 基礎 + 委外 | **Odoo CE** — subcontracting + unbuild |
|
||||
| 電子業 BOM (替代料+QC) | **ERPNext** — 原生替代料 + 版控 + QC |
|
||||
| 長期授權保障 | **Odoo CE** — LGPL 比 GPL 鬆 |
|
||||
| 最小化 infra | **Odoo CE** — PG 與 Momentry 共用 |
|
||||
395
docs_v1.0/M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md
Normal file
395
docs_v1.0/M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md
Normal file
@@ -0,0 +1,395 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "ERP Selection Report — Odoo CE vs ERPNext for Momentry Core"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "erp"
|
||||
- "odoo"
|
||||
- "erpnext"
|
||||
- "selection"
|
||||
- "bom"
|
||||
- "manufacturing"
|
||||
- "billing"
|
||||
- "license"
|
||||
ai_query_hints:
|
||||
- "查詢 ERP 選型報告的結論與建議"
|
||||
- "Odoo CE vs ERPNext 授權比較"
|
||||
- "電子製造業 BOM 管理 Odoo vs ERPNext 哪個更適合"
|
||||
- "Odoo Community Edition 可以商用修改嗎"
|
||||
- "ERPNext GPL-3.0 授權對 Momentry 的影響"
|
||||
- "Odoo CE vs ERPNext 會員管理功能對比"
|
||||
- "Odoo CE billing system 能否取代現有系統"
|
||||
- "ERP selection report for Momentry Core"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md"
|
||||
- "M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md"
|
||||
- "M4_M5_COLLABORATION_PROTOCOL.md"
|
||||
---
|
||||
|
||||
# ERP Selection Report — Odoo CE vs ERPNext for Momentry Core
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 Odoo CE vs ERPNext 選型報告 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| CE | Community Edition(社群版,免費開源) |
|
||||
| EE | Enterprise Edition(企業版,付費授權) |
|
||||
| BOM | Bill of Materials(物料清單) |
|
||||
| PLM | Product Lifecycle Management(產品生命週期管理) |
|
||||
| ECO | Engineering Change Order(工程變更單) |
|
||||
| LGPL-3.0 | GNU Lesser General Public License v3 |
|
||||
| GPL-3.0 | GNU General Public License v3 |
|
||||
| AGPL-3.0 | GNU Affero General Public License v3 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 目錄
|
||||
|
||||
1. [研究範圍與基準](#1-研究範圍與基準)
|
||||
2. [授權分析](#2-授權分析)
|
||||
3. [Billing 模組對比](#3-billing-模組對比)
|
||||
4. [BOM 管理對比](#4-bom-管理對比)
|
||||
5. [電子製造業 BOM 管理(源碼驗證)](#5-電子製造業-bom-管理源碼驗證)
|
||||
6. [雙系統協作可行性](#6-雙系統協作可行性)
|
||||
7. [技術整合架構](#7-技術整合架構)
|
||||
8. [授權風險矩陣](#8-授權風險矩陣)
|
||||
9. [建置成本](#9-建置成本)
|
||||
10. [結論與建議](#10-結論與建議)
|
||||
|
||||
---
|
||||
|
||||
## 1. 研究範圍與基準
|
||||
|
||||
### 研究對象
|
||||
|
||||
| 系統 | 版本 | 授權 | Source 位置 |
|
||||
|------|------|------|-----------|
|
||||
| **Odoo Community Edition** | 19.0 | LGPL-3.0 | `services/src/odoo/` (1.3GB) |
|
||||
| **ERPNext** | v15 | GPL-3.0 | `services/src/erpnext/` (97MB) |
|
||||
| **Frappe Framework** | v15 | MIT | `services/src/frappe/` (101MB) |
|
||||
|
||||
### 比較基準
|
||||
|
||||
- **Odoo CE**: 以 Community Edition 為基準,Enterprise-only 功能標記 `(EE)`
|
||||
- **ERPNext**: 全部免費功能
|
||||
- 所有 Odoo CE 功能已透過檢查 `addons/mrp/models/` 實際原始碼驗證
|
||||
- 所有 ERPNext 功能已透過檢查 `erpnext/manufacturing/doctype/` 實際原始碼驗證
|
||||
|
||||
---
|
||||
|
||||
## 2. 授權分析
|
||||
|
||||
### 核心授權比較
|
||||
|
||||
| | Odoo CE | ERPNext |
|
||||
|--|---------|---------|
|
||||
| ERP 授權 | **LGPL-3.0** | GPL-3.0 |
|
||||
| Framework 授權 | LGPL-3.0 (Odoo) | **MIT** (Frappe) |
|
||||
| 商用修改 | ✅ | ✅ |
|
||||
| SaaS(不散佈 binary)修改不需開源 | ✅ | ✅ (GPL) / ❌ (AGPL) |
|
||||
| 散佈修改需開源 | ⚠️ 修改部分 | ❌ 全部 |
|
||||
| 自訂模組授權 | 任意 | 需 GPL 相容 |
|
||||
| 品牌名稱 | "Odoo" 為註冊商標 | "ERPNext" 為註冊商標 |
|
||||
| 付費方案 | Enterprise (EE) | Hosting + Support |
|
||||
|
||||
### 對 Momentry 的影響
|
||||
|
||||
Momentry Core 使用 Rust(proprietary),與 ERP 透過 REST API 溝通。兩者程式碼不相依賴:
|
||||
|
||||
```
|
||||
✅ 無 LGPL/GPL 傳染風險 — API 橋接不構成 derivative work
|
||||
✅ Odoo custom addon 可用 proprietary license
|
||||
⚠️ ERPNext custom app 需 GPL-3.0 相容授權
|
||||
```
|
||||
|
||||
### ERPNext 的 AGPL 疑慮
|
||||
|
||||
ERPNext GitHub 標示 GPL-3.0,但 Frappe 官網 pricing page 稱 "AGPL-3.0 licensed"。
|
||||
AGPL 會限制 SaaS 修改的閉源性。建議正式使用前向 Frappe 確認授權。
|
||||
|
||||
---
|
||||
|
||||
## 3. Billing 模組對比
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 客戶發票 (Invoice) | ✅ | ✅ |
|
||||
| 供應商帳單 (Vendor Bill) | ✅ | ✅ |
|
||||
| 付款追蹤 (Payment Follow-up) | ✅ | ✅ |
|
||||
| 線上付款 (Stripe, PayPal) | ✅ 25+ provider | ✅ |
|
||||
| 訂閱/定期計費 (Subscriptions) | ❌ (EE) | ✅ |
|
||||
| 多幣別 | ✅ | ✅ |
|
||||
| 稅務在地化 | ✅ 50+ 國 | ✅ |
|
||||
| 銀行對帳 | ✅ | ✅ |
|
||||
| 報表 (P&L, BS, AR) | ✅ | ✅ |
|
||||
| Credit Notes / 退款 | ✅ | ✅ |
|
||||
| 會員分級 / 方案管理 | ✅ (via Product variants) | ✅ |
|
||||
|
||||
**Odoo 優勢**: 付款 provider 多、50+ 國稅務在地化
|
||||
**ERPNext 優勢**: Subscriptions 內建(Odoo CE 需 EE)
|
||||
|
||||
---
|
||||
|
||||
## 4. BOM 管理對比
|
||||
|
||||
### 基礎 BOM 功能
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Multi-level BOM (sub-assembly) | ✅ | ✅ |
|
||||
| BOM component quantity + UOM | ✅ | ✅ |
|
||||
| Reference Designator (位號) | ⚠️ `code` 欄位 | ✅ |
|
||||
| Phantom / Kit BOM | ✅ (type=phantom) | ✅ |
|
||||
| By-Products / Co-Products | ✅ | ✅ |
|
||||
| Scrap 報廢 | ✅ | ✅ |
|
||||
| BOM 成本自動計算 | ✅ (from Purchase) | ⚠️ |
|
||||
| BOM 導入/匯出 | ✅ Excel | ✅ CSV |
|
||||
|
||||
### 產線管理
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Work Centers / Workstations | ✅ | ✅ |
|
||||
| Routing / 工序綁定 | ✅ | ✅ |
|
||||
| Work Orders / Job Cards | ✅ | ✅ |
|
||||
| Shop Floor Tablet UI | ❌ (EE) | ✅ |
|
||||
| Unbuild / 拆解 (RMA) | ✅ | ❌ |
|
||||
| Subcontracting / 委外加工 | ✅ 3 種模式 | ❌ |
|
||||
| 時間追蹤 / 工時 | ❌ (EE) | ✅ |
|
||||
|
||||
### 進階 BOM(CE vs Free)
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| BOM Version / Revision | ❌ (EE) | ✅ |
|
||||
| Substitute / Alternative Items | ❌ | ✅ `allow_alternative_item` |
|
||||
| BOM Comparison Tool | ❌ | ✅ |
|
||||
| PLM / ECO (工程變更) | ❌ (EE) | ❌ |
|
||||
| Quality Inspection | ❌ (EE) | ✅ |
|
||||
| Approved Vendor List (AVL) | ❌ | ❌ |
|
||||
|
||||
### 物料追蹤
|
||||
|
||||
| 功能 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| Lot / Serial Number | ✅ | ✅ |
|
||||
| Full Traceability (前追後追) | ✅ | ✅ |
|
||||
| Product Expiry | ✅ | ✅ |
|
||||
| Reorder / MRP | ✅ (stock_orderpoint) | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 5. 電子製造業 BOM 管理(源碼驗證)
|
||||
|
||||
### 關鍵需求與支援狀態
|
||||
|
||||
```
|
||||
電子業 BOM 的獨特需求:
|
||||
|
||||
1. 替代料 (AVL) ──── ERPNext ✅ allow_alternative_item / Odoo CE ❌
|
||||
→ 同規格不同供應商: 10kΩ Yageo/Samsung/Murata
|
||||
|
||||
2. BOM Rev 管控 ──── ERPNext ✅ is_default+is_active / Odoo CE ❌
|
||||
→ PCB v1.0→v1.1→v2.0
|
||||
|
||||
3. SMT RefDes ──── 兩家都需 custom
|
||||
→ R1, C5, U3 等位號系統
|
||||
|
||||
4. 委外 SMT ──── Odoo CE ✅ 三種 subcontracting / ERPNext ❌
|
||||
→ 發料到外包廠
|
||||
|
||||
5. ECO 工程變更 ──── 兩家都 ❌ (Odoo: EE only)
|
||||
```
|
||||
|
||||
### 源碼證據
|
||||
|
||||
**Odoo CE** (`addons/mrp/models/mrp_bom.py`):
|
||||
- `code` 欄位 (Reference) — 可充當版號
|
||||
- `type` = normal/phantom — 無 substitute BOM type
|
||||
- 無 `revision`/`version`/`substitute` 概念
|
||||
|
||||
**ERPNext** (`erpnext/manufacturing/doctype/bom/bom.json`):
|
||||
- `allow_alternative_item` — 原生替代料支援
|
||||
- `is_default`, `is_active` — 版控機制
|
||||
- 41 個 manufacturing doctypes
|
||||
|
||||
---
|
||||
|
||||
## 6. 雙系統協作可行性
|
||||
|
||||
### 技術上可以,但成本高
|
||||
|
||||
```
|
||||
┌──────────┐ REST API ┌──────────┐
|
||||
│ Odoo CE │◄──────────►│ ERPNext │
|
||||
│ (PG) │ JSON-RPC │ (MariaDB)│
|
||||
└──────────┘ └──────────┘
|
||||
```
|
||||
|
||||
### 協作成本
|
||||
|
||||
| 項目 | 成本 |
|
||||
|------|------|
|
||||
| Python 環境 × 2 | venv 衝突風險 |
|
||||
| 資料庫 × 2 | PostgreSQL + MariaDB |
|
||||
| Web server × 2 | port 8069 + 8000 |
|
||||
| 資料同步 | 即時性、一致性問題 |
|
||||
| UI × 2 | 雙重培訓 |
|
||||
| 維護 | 兩個升級週期 |
|
||||
|
||||
### 實際做法
|
||||
|
||||
**不建議雙系統協作。** 應擇一並透過 custom addon 補缺口:
|
||||
|
||||
| 主系統 | 需補的 addon |
|
||||
|--------|------------|
|
||||
| Odoo CE | `mrp_substitute` (替代料) + `mrp_bom_version` (BOM 版控) |
|
||||
| ERPNext | `manufacturing_subcontract` (委外) + `manufacturing_unbuild` (拆解) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 技術整合架構
|
||||
|
||||
### 與 Momentry Core 的整合
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ Momentry Core │
|
||||
│ Rust axum (port 3003) │
|
||||
│ DB: PostgreSQL, dev.* schema │
|
||||
│ Auth: API keys (dev.api_keys) │
|
||||
└────────────┬─────────────────────────────────────┘
|
||||
│
|
||||
REST API (JSON / Odoo JSON-RPC)
|
||||
│
|
||||
┌────────────▼─────────────────────────────────────┐
|
||||
│ ERP (Odoo CE 或 ERPNext) │
|
||||
│ Python web app │
|
||||
│ Billing / Membership / BOM management │
|
||||
└──────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Odoo CE 整合要點
|
||||
|
||||
| 項目 | 說明 |
|
||||
|------|------|
|
||||
| 資料庫 | 共用 PostgreSQL instance,不同 schema(dev vs odoo) |
|
||||
| 認證 | Odoo user ↔ Momentry API key(custom bridge addon) |
|
||||
| Billing | Odoo Accounting → Momentry 影片處理計費 |
|
||||
| Membership | Odoo Product variants → 會員方案 (Gold/Silver/Free) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 授權風險矩陣
|
||||
|
||||
| 使用情境 | Odoo CE (LGPL-3.0) | ERPNext (GPL-3.0) |
|
||||
|---------|:--:|:--:|
|
||||
| 不修改,內部使用 | ✅ 無風險 | ✅ 無風險 |
|
||||
| 不修改,SaaS 提供服務 | ✅ 無風險 | ✅ 無風險 |
|
||||
| 修改 core,內部使用 | ✅ 不需開源 | ✅ 不需開源 |
|
||||
| 修改 core,SaaS 服務 | ✅ 不需開源 | ✅ 不需開源 (⚠️ 若是 AGPL 則需開源) |
|
||||
| 修改 core,散佈 binary | ⚠️ 修改部分需開源 | ❌ 需開源 |
|
||||
| 寫 custom addon/app(不改 core) | ✅ 任何授權 | ⚠️ 需 GPL 相容 |
|
||||
| 透過 REST API 整合 Momentry | ✅ 無 LGPL 傳染 | ✅ 無 GPL 傳染 |
|
||||
| 使用 "Odoo" / "ERPNext" 品牌 | ❌ 商標限制 | ❌ 商標限制 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 建置成本
|
||||
|
||||
| 階段 | Odoo CE | ERPNext |
|
||||
|------|---------|---------|
|
||||
| 安裝 | `pip install -r requirements.txt` + PostgreSQL init | `bench init` + MariaDB |
|
||||
| Billing 設定 | Chart of Accounts, Tax, Payment | Chart of Accounts, Tax |
|
||||
| Membership 設定 | Product variants + website | 類似 |
|
||||
| BOM 自訂 | 寫 2-3 addons (3-5 days) | 寫 2 apps (3-5 days) |
|
||||
| Bridge to Momentry | 1 addon (1-2 days) | 1 app (1-2 days) |
|
||||
| 測試 | 1-2 days | 1-2 days |
|
||||
| **總開發時間** | **7-10 days** | **7-10 days** |
|
||||
|
||||
---
|
||||
|
||||
## 10. 結論與建議
|
||||
|
||||
### 面向對比
|
||||
|
||||
| 面向 | Odoo CE | ERPNext |
|
||||
|------|:--:|:--:|
|
||||
| 授權友善度 | 🟢 LGPL-3.0 | 🟡 GPL-3.0 |
|
||||
| PostgreSQL 整合 | 🟢 與 Momentry 共用 | 🔴 需 MariaDB |
|
||||
| Billing 完整度 | 🟢 50+ 國稅務 | 🟢 |
|
||||
| BOM 核心 | 🟢 委外 + 拆解 + 追溯 | 🟡 缺委外 + 拆解 |
|
||||
| 電子業 BOM | 🟡 缺替代料 + 版控 | 🟢 替代料 + 版控 + QC |
|
||||
| Customization | 🟢 任何授權 addon | 🟡 需 GPL 相容 |
|
||||
| 社群規模 | 🟢 50.6k ⭐, 32.4k forks | 🟢 33.8k ⭐, 11.2k forks |
|
||||
| 電子業缺口 | 替代料 + 版控 + QC | 委外 + 拆解 |
|
||||
|
||||
### 建議
|
||||
|
||||
```
|
||||
短期 (Phase 1): Odoo CE
|
||||
├── LGPL-3.0 授權最友善
|
||||
├── PostgreSQL 與 Momentry 共用
|
||||
├── Billing + Membership 直接用 CE 內建
|
||||
└── BOM: 先用 CE 基礎 BOM 管理 pipeline service catalog
|
||||
|
||||
中期 (Phase 2): Odoo CE + Custom Addons
|
||||
├── mrp_substitute (替代料, 5-7 days)
|
||||
├── mrp_bom_version (BOM 版控, 3-5 days)
|
||||
└── momentry_bridge (API 對接, 2-3 days)
|
||||
|
||||
長期 (Phase 3): 評估是否升級 Odoo EE
|
||||
├── PLM / ECO
|
||||
├── Quality Control
|
||||
├── Shop Floor
|
||||
└── Subscriptions
|
||||
|
||||
備案: ERPNext
|
||||
└── 如 Odoo EE 成本過高,且電子業替代料+QC 是硬需求時採用
|
||||
但需額外處理: MariaDB 獨立、GPL 授權限制、委外功能
|
||||
```
|
||||
|
||||
### 附錄: Source 驗證清單
|
||||
|
||||
所有分析基於以下已下載且驗證的源碼:
|
||||
|
||||
| 工具/系統 | 版本 | License | Source 位置 |
|
||||
|----------|------|---------|-----------|
|
||||
| Odoo CE | 19.0 | LGPL-3.0 | `services/src/odoo/` (1.3GB) |
|
||||
| ERPNext | v15 | GPL-3.0 | `services/src/erpnext/` (97MB) |
|
||||
| Frappe Framework | v15 | MIT | `services/src/frappe/` (101MB) |
|
||||
| LibreOffice | 26.2.3 | MPL-2.0 | `services/src/` |
|
||||
| ffmpeg | 7.1.1 | GPL | `services/src/` |
|
||||
| PostgreSQL | 18.3 | PostgreSQL | `services/src/` |
|
||||
| Redis | 7.4.3 | BSD | `services/src/` |
|
||||
| llama.cpp | 9041 | MIT | `services/src/` |
|
||||
| GroundingDINO | latest | Apache 2.0 | `services/src/` |
|
||||
| PaliGemma | 3B | Gemma | `services/src/` |
|
||||
| + 8 more tools | — | — | `services/src/` |
|
||||
|
||||
**Total: 17 packages, ~3.0GB, 17/17 source verified**
|
||||
432
docs_v1.0/M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md
Normal file
432
docs_v1.0/M5_workspace/RESEARCH/SFTPGO_ODOO_REPLACEMENT.md
Normal file
@@ -0,0 +1,432 @@
|
||||
---
|
||||
document_type: "plan"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "SFTPGo Replacement Plan — Migration to Odoo CE File Upload"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "sftpgo"
|
||||
- "odoo"
|
||||
- "file-upload"
|
||||
- "replacement"
|
||||
- "custom-addon"
|
||||
- "watcher"
|
||||
- "pipeline"
|
||||
ai_query_hints:
|
||||
- "SFTPGo 取代方案 Odoo CE"
|
||||
- "如何用 Odoo CE 取代 SFTPGo 檔案上傳"
|
||||
- "SFTPGo 在 Momentry 系統中的角色是什麼"
|
||||
- "Odoo custom addon 大檔上傳如何實作"
|
||||
- "SFTPGo replacement plan for Momentry Core"
|
||||
- "Odoo CE file upload addon 取代 SFTPGo 的架構"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "M5_workspace/RESEARCH/ERP_COMPARISON_TABLE.md"
|
||||
---
|
||||
|
||||
# SFTPGo Replacement Plan — Migration to Odoo CE
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 建立 SFTPGo→Odoo 取代方案分析 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| SFTPGo | 開源 SFTP/WebDAV 檔案伺服器,負責影片上傳 |
|
||||
| Watcher | Momentry Rust 模組,掃描目錄並觸發影片註冊 |
|
||||
| Demo Dir | Watcher 監控的目錄 (`MOMENTRY_SFTP_ROOT`) |
|
||||
| Custom Addon | Odoo CE 自訂模組,擴展原生功能 |
|
||||
| `ir.attachment` | Odoo 內建附件管理模型 |
|
||||
|
||||
---
|
||||
|
||||
**狀態:** 方案分析
|
||||
|
||||
---
|
||||
|
||||
## 目錄
|
||||
|
||||
1. [現狀分析](#1-現狀分析)
|
||||
2. [取代架構](#2-取代架構)
|
||||
3. [需要自訂的 Addon](#3-需要自訂的-addon)
|
||||
4. [技術細節](#4-技術細節)
|
||||
5. [風險與應對](#5-風險與應對)
|
||||
6. [實作計畫](#6-實作計畫)
|
||||
7. [結論](#7-結論)
|
||||
|
||||
---
|
||||
|
||||
## 1. 現狀分析
|
||||
|
||||
### SFTPGo 在系統中的角色
|
||||
|
||||
```
|
||||
SFTPGo :8080 Momentry Core
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ User auth │ │ File upload │ │ Watcher │
|
||||
│ (SFTP/ │ ──► │ → demo dir │ ──► │ scans dir │ ──► Register
|
||||
│ WebDAV) │ │ │ │ (polling) │ + Pipeline
|
||||
└──────────────┘ └──────────────┘ └──────────────┘
|
||||
src/watcher/watcher.rs
|
||||
```
|
||||
|
||||
SFTPGo 做的事情很薄,只有三件事:
|
||||
1. **認證** — SFTP/WebDAV username/password
|
||||
2. **檔案上傳** — 用戶透過 SFTP client 上傳影片
|
||||
3. **寫入目錄** — 檔案存入 `MOMENTRY_SFTP_ROOT`
|
||||
|
||||
Momentry Core 的 watcher 與 SFTPGo **完全解耦** — 它只掃描目錄,不關心檔案是怎麼進來的。
|
||||
|
||||
### 現有配置
|
||||
|
||||
```bash
|
||||
# .env.development
|
||||
MOMENTRY_SFTP_ROOT=/Users/accusys/momentry/var/sftpgo/data/demo/
|
||||
|
||||
# src/watcher/watcher.rs
|
||||
# Default fallback:
|
||||
"/Users/accusys/momentry/var/sftpgo/data/demo/"
|
||||
```
|
||||
|
||||
### 為什麼要取代 SFTPGo
|
||||
|
||||
| 問題 | 說明 |
|
||||
|------|------|
|
||||
| 多餘的服務 | SFTPGo 是一個獨立的 binary、port、auth 系統 |
|
||||
| 用戶管理分散 | SFTPGo 有自己的 user DB,與 Momentry/Odoo 不互通 |
|
||||
| 無上傳紀錄 | 誰上傳了什麼檔案?多久?無法追溯 |
|
||||
| 無法觸發註冊 | 上傳完成後需等 watcher 掃描,非即時 |
|
||||
| 無 Web UI | 需要 SFTP client,一般用戶不會用 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 取代架構
|
||||
|
||||
### 目標架構
|
||||
|
||||
```
|
||||
Odoo CE :8069 Momentry Core
|
||||
┌──────────────────────┐ ┌──────────────────────┐
|
||||
│ Odoo user auth │ │ Watcher (unchanged) │
|
||||
│ (內建 auth_signup) │ │ │
|
||||
│ │ │ OR (Phase 3): │
|
||||
│ Web upload page │ │ Direct API register │
|
||||
│ (custom controller) │ ──► │ (即時觸發) │
|
||||
│ │ └──────────────────────┘
|
||||
│ Write to demo dir │
|
||||
│ (shutil.copy / mv) │
|
||||
│ │
|
||||
│ Upload history │
|
||||
│ (Odoo model) │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
### 與現有系統的相容性
|
||||
|
||||
| 組件 | 是否改動 | 說明 |
|
||||
|------|:--:|------|
|
||||
| Watcher (`src/watcher/`) | ❌ 不改 | 繼續掃描 demo dir |
|
||||
| `MOMENTRY_SFTP_ROOT` | ❌ 不改 | Odoo 寫入同一目錄 |
|
||||
| `.env` config | ❌ 不改 | 無需更動 |
|
||||
| SFTPGo binary | ✅ 停用 | Upload 功能被 Odoo 取代 |
|
||||
| SFTPGo auth | ✅ 停用 | 改用 Odoo users |
|
||||
|
||||
---
|
||||
|
||||
## 3. 需要自訂的 Addon
|
||||
|
||||
### Addon 結構
|
||||
|
||||
```
|
||||
odoo_custom_addons/
|
||||
└── momentry_upload/
|
||||
├── __init__.py
|
||||
├── __manifest__.py # depends: ['base', 'website', 'portal']
|
||||
├── controllers/
|
||||
│ └── upload.py # Web upload endpoint
|
||||
├── models/
|
||||
│ └── upload_record.py # 上傳記錄 model
|
||||
├── views/
|
||||
│ ├── upload_form.xml # 上傳頁面模板
|
||||
│ ├── upload_success.xml # 成功頁面
|
||||
│ └── upload_menu.xml # 導航選單
|
||||
└── security/
|
||||
├── ir.model.access.csv # 權限定義
|
||||
└── upload_security.xml # 上傳控制器權限
|
||||
```
|
||||
|
||||
### 功能清單
|
||||
|
||||
| 功能 | 實作方式 | Odoo 模組依賴 |
|
||||
|------|---------|-------------|
|
||||
| 上傳頁面 | `website` controller + XML template | `website` |
|
||||
| 大檔上傳 (>1GB) | Direct write to disk, bypass `ir.attachment` | — |
|
||||
| 用戶隔離 | `request.env.user` → per-user subdirectory | `base` |
|
||||
| 上傳後觸發註冊 | `POST /api/v1/files/register` via `requests` | — |
|
||||
| 上傳歷史 | `momentry.upload.record` model | `base` |
|
||||
| 用戶權限 | `security/ir.model.access.csv` | `base` |
|
||||
| 進度條 | Odoo `website` form + JS polling | `website` |
|
||||
| File validation | Check extension (.mp4, .mov, etc.) | — |
|
||||
|
||||
### 核心程式碼概念
|
||||
|
||||
```python
|
||||
# controllers/upload.py
|
||||
import os
|
||||
import shutil
|
||||
import requests
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
SFTP_ROOT = "/Users/accusys/momentry/var/sftpgo/data/demo"
|
||||
MOMENTRY_URL = "http://localhost:3003"
|
||||
|
||||
class MomentryUpload(http.Controller):
|
||||
|
||||
@http.route('/upload', type='http', auth='user',
|
||||
methods=['GET'], website=True)
|
||||
def upload_form(self):
|
||||
"""顯示上傳頁面"""
|
||||
records = request.env['momentry.upload.record'].search(
|
||||
[('user_id', '=', request.env.user.id)],
|
||||
order='create_date desc', limit=20
|
||||
)
|
||||
return request.render('momentry_upload.upload_form', {
|
||||
'records': records,
|
||||
})
|
||||
|
||||
@http.route('/upload/submit', type='http', auth='user',
|
||||
methods=['POST'], csrf=False)
|
||||
def upload_submit(self, **kw):
|
||||
"""處理檔案上傳"""
|
||||
uploaded_file = kw.get('file')
|
||||
if not uploaded_file:
|
||||
return request.render('momentry_upload.upload_form', {
|
||||
'error': 'No file selected'
|
||||
})
|
||||
|
||||
filename = uploaded_file.filename
|
||||
user_dir = os.path.join(SFTP_ROOT, request.env.user.login)
|
||||
os.makedirs(user_dir, exist_ok=True)
|
||||
dest_path = os.path.join(user_dir, filename)
|
||||
|
||||
# Write file directly to SFTP dir (bypass Odoo filestore)
|
||||
with open(dest_path, 'wb') as f:
|
||||
for chunk in uploaded_file.read():
|
||||
f.write(chunk)
|
||||
|
||||
# Create upload record
|
||||
record = request.env['momentry.upload.record'].create({
|
||||
'user_id': request.env.user.id,
|
||||
'filename': filename,
|
||||
'file_path': dest_path,
|
||||
'file_size': os.path.getsize(dest_path) if os.path.exists(dest_path) else 0,
|
||||
})
|
||||
|
||||
# Trigger registration (async, don't block response)
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{MOMENTRY_URL}/api/v1/files/register",
|
||||
json={"path": dest_path},
|
||||
headers={"Content-Type": "application/json"},
|
||||
timeout=5
|
||||
)
|
||||
if response.status_code == 200:
|
||||
record.write({'status': 'registered',
|
||||
'momentry_uuid': response.json().get('file_uuid', '')})
|
||||
except Exception:
|
||||
record.write({'status': 'uploaded'}) # will be picked up by watcher
|
||||
|
||||
return request.render('momentry_upload.upload_success', {
|
||||
'record': record,
|
||||
})
|
||||
|
||||
|
||||
# models/upload_record.py
|
||||
from odoo import models, fields
|
||||
|
||||
class MomentryUploadRecord(models.Model):
|
||||
_name = 'momentry.upload.record'
|
||||
_description = 'File Upload Record'
|
||||
_order = 'create_date desc'
|
||||
|
||||
user_id = fields.Many2one('res.users', string='Uploader', required=True)
|
||||
filename = fields.Char(required=True)
|
||||
file_path = fields.Char()
|
||||
file_size = fields.Integer(string='Size (bytes)')
|
||||
status = fields.Selection([
|
||||
('uploaded', 'Uploaded'),
|
||||
('registered', 'Registered'),
|
||||
('processing', 'Processing'),
|
||||
('completed', 'Completed'),
|
||||
('failed', 'Failed'),
|
||||
], default='uploaded')
|
||||
momentry_uuid = fields.Char(string='Momentry UUID')
|
||||
notes = fields.Text()
|
||||
create_date = fields.Datetime(string='Upload Time', readonly=True)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 技術細節
|
||||
|
||||
### 大檔上傳處理
|
||||
|
||||
Odoo 預設限制 25MB (`--max-file-size`)。影片檔可達數 GB。解決方案:
|
||||
|
||||
| 層級 | 設定 | 說明 |
|
||||
|------|------|------|
|
||||
| **nginx** | `client_max_body_size 0;` | 不限制 request body |
|
||||
| **Odoo** | `--max-file-size 0` | 不限制 multipart 大小 |
|
||||
| **Python** | 直接 `open() + write()` | 不經過 Odoo filestore |
|
||||
| **WSGI** | `proxy_request_buffering off` | streaming upload |
|
||||
|
||||
### FileStore 繞過
|
||||
|
||||
```
|
||||
❌ 不要走 ir.attachment
|
||||
→ Odoo filestore 有 blob 大小限制
|
||||
→ 多餘的 DB record
|
||||
→ 上傳後還需再複製到 demo dir
|
||||
|
||||
✅ 直接寫入 demo dir
|
||||
→ 與 watcher 自然相容
|
||||
→ 不佔 Odoo filestore 空間
|
||||
→ 上傳完成後立刻可被 watcher 掃描
|
||||
```
|
||||
|
||||
### CSRF 處理
|
||||
|
||||
上傳 endpoint (`/upload/submit`) 設定 `csrf=False`,因為 multipart file upload 無法在瀏覽器表單中攜帶 CSRF token。這在 Odoo 中是常見做法(`website_sale` 的 checkout 也這樣處理)。
|
||||
|
||||
### 用戶隔離
|
||||
|
||||
每個 Odoo user 有自己的子目錄:
|
||||
```
|
||||
demo/
|
||||
├── admin/ # admin 上傳的檔案
|
||||
│ └── video1.mp4
|
||||
├── user_a/ # user_a 上傳的檔案
|
||||
│ └── video2.mov
|
||||
└── user_b/
|
||||
└── video3.mp4
|
||||
```
|
||||
|
||||
權限由 Odoo user 控制(可限制哪些用戶可以上傳)。
|
||||
|
||||
### Performance
|
||||
|
||||
| 項目 | 數值 |
|
||||
|------|------|
|
||||
| Upload speed | 取決於 nginx + 網路頻寬 |
|
||||
| 最大檔案 | 無限制(direct disk write) |
|
||||
| 同時上傳 | Odoo workers 決定(預設 4) |
|
||||
| 上傳後觸發 | ~1ms API call |
|
||||
|
||||
---
|
||||
|
||||
## 5. 風險與應對
|
||||
|
||||
| 風險 | 等級 | 應對措施 |
|
||||
|------|:--:|---------|
|
||||
| 大檔上傳超時 | 🟡 | nginx `proxy_read_timeout 300` |
|
||||
| Odoo worker 被上傳阻塞 | 🟡 | 獨立 worker queue / cron job |
|
||||
| 磁碟空間不足 | 🔴 | Odoo 上傳前檢查可用空間 |
|
||||
| 檔名衝突 | 🟢 | Timestamp prefix 或用戶目錄隔離 |
|
||||
| CSRF 安全性 | 🟡 | 限制上傳 endpoint 的 HTTP method + auth |
|
||||
| watcher 掃描延遲 | 🟢 | Phase 2 加入 API 即時觸發 |
|
||||
| Odoo restart 中斷上傳 | 🟢 | 上傳失敗 → 自動重試 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 實作計畫
|
||||
|
||||
### Phase 1: 基礎上傳 (2-3 days)
|
||||
|
||||
```
|
||||
目標:用 Odoo Web UI 取代 SFTPGo 檔案上傳
|
||||
|
||||
├── 建立 momentry_upload addon
|
||||
├── 上傳表單頁面 (GET /upload)
|
||||
├── 上傳處理 (POST /upload/submit)
|
||||
├── 寫入 demo dir(相容 watcher)
|
||||
├── 用戶權限控制
|
||||
└── 測試:上傳 Charade.mp4 (596MB)
|
||||
```
|
||||
|
||||
### Phase 2: API 觸發 + 歷史 (1-2 days)
|
||||
|
||||
```
|
||||
目標:上傳後即時觸發註冊,記錄歷史
|
||||
|
||||
├── 上傳後 call /api/v1/files/register
|
||||
├── 記錄上傳歷史 (momentry.upload.record)
|
||||
├── 上傳狀態追蹤 (uploaded → registered → completed)
|
||||
└── 管理後台檢視 (admin 可看所有上傳)
|
||||
```
|
||||
|
||||
### Phase 3: 取代 watcher (optional, 2-3 days)
|
||||
|
||||
```
|
||||
目標:跳過 watcher 掃描,Odoo 直接驅動 pipeline
|
||||
|
||||
├── Odoo cron job 定期檢查新檔案
|
||||
├── 或: 上傳後直接觸發 POST /api/v1/file/:uuid/process
|
||||
└── 停用 Rust watcher(或其他目錄不再需要 polling)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 結論
|
||||
|
||||
### 可行性
|
||||
|
||||
| 項目 | 評估 |
|
||||
|------|------|
|
||||
| 技術可行性 | ✅ 高 — Odoo CE + custom addon |
|
||||
| 相容性 | ✅ 完全相容現有 watcher |
|
||||
| 開發量 | Phase 1: 2-3 days |
|
||||
| 風險 | 低 — 只改前端上傳,不碰 pipeline |
|
||||
|
||||
### 建議
|
||||
|
||||
```
|
||||
Phase 1 (MVP): 2-3 days
|
||||
→ 可以取代 SFTPGo 的核心檔案上傳功能
|
||||
→ SFTPGo 仍保留作為備用(不同 port)
|
||||
|
||||
Phase 2: 1-2 days
|
||||
→ 加上即時註冊觸發 + 歷史記錄
|
||||
→ 體驗完整
|
||||
|
||||
Phase 3: optional
|
||||
→ 考量 watcher 是否需要保留
|
||||
```
|
||||
|
||||
### 附錄:SFTPGo 模組資訊
|
||||
|
||||
| 項目 | 說明 |
|
||||
|------|------|
|
||||
| Binary | SFTPGo 自帶 binary |
|
||||
| Port | 8080 (SFTP), 8081 (WebDAV) |
|
||||
| Config | `/Users/accusys/momentry/etc/sftpgo/` |
|
||||
| Data | `/Users/accusys/momentry/var/sftpgo/data/` |
|
||||
| Auth | 獨立 user DB |
|
||||
| Source | 未納入源碼清單(Go 語言,未從源碼構建) |
|
||||
250
docs_v1.0/M5_workspace/SERVICE_GO_GITEA_BUILD.md
Normal file
250
docs_v1.0/M5_workspace/SERVICE_GO_GITEA_BUILD.md
Normal file
@@ -0,0 +1,250 @@
|
||||
---
|
||||
document_type: "reference_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Go Compiler and Gitea Service Build Report"
|
||||
date: "2026-05-13"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "M5"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "go"
|
||||
- "gitea"
|
||||
- "compiler"
|
||||
- "git-service"
|
||||
- "source-build"
|
||||
- "self-hosting"
|
||||
- "bootstrap"
|
||||
- "service-inventory"
|
||||
ai_query_hints:
|
||||
- "Go 編譯器如何從源碼構建"
|
||||
- "Gitea 服務如何從源碼構建和安裝"
|
||||
- "Go compiler bootstrap 流程"
|
||||
- "Gitea binary build with bindata tags"
|
||||
- "Go 和 Gitea 在 Momentry 系統中的角色"
|
||||
- "Go self-hosting 編譯器原理解釋"
|
||||
- "查詢 Go compiler 和 Gitea 的源碼版本"
|
||||
related_documents:
|
||||
- "M5_workspace/RESEARCH/ERP_SELECTION_REPORT.md"
|
||||
- "../RELEASE/SERVICE_INVENTORY_V1.0.0.md"
|
||||
---
|
||||
|
||||
# Go Compiler and Gitea Service Build Report
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 調查者 | M5 Team |
|
||||
| 文件版本 | V1.0 |
|
||||
| 建立日期 | 2026-05-13 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-05-13 | 記錄 Go 編譯器與 Gitea 源碼構建流程 | OpenCode | deepseek-v4-pro |
|
||||
|
||||
---
|
||||
|
||||
## 關鍵術語定義
|
||||
|
||||
| 術語 | 定義 |
|
||||
|------|------|
|
||||
| Self-hosting | 編譯器可以用自己編譯自己(Go 是 self-hosting 語言) |
|
||||
| Bootstrap | 用現有編譯器(brew Go)編譯 source → 產出獨立 binary |
|
||||
| Gitea | Go 語言撰寫的 Git 自託管服務(類似 GitHub) |
|
||||
| Bindata | Gitea 的靜態資源嵌入標籤(前後端合一的 binary) |
|
||||
| Go Module | Go 的套件管理系統(`go.mod`, `go.sum`) |
|
||||
| Make backend | Gitea 的 Makefile target,編譯後端 binary |
|
||||
|
||||
---
|
||||
|
||||
## 1. Go Compiler
|
||||
|
||||
### 源碼來源
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| Source URL | `https://github.com/golang/go` |
|
||||
| Branch | `go1.26.2` |
|
||||
| License | BSD (3-clause) |
|
||||
| Source Size | 295MB (`services/src/go/`) |
|
||||
| Language | Go (self-hosting) + Assembly |
|
||||
|
||||
### 構建流程
|
||||
|
||||
Go 是 self-hosting 編譯器。整個構建流程如下:
|
||||
|
||||
```
|
||||
Phase 1: Bootstrap (環境預檢)
|
||||
├── 檢查系統 GCC/Clang
|
||||
├── 檢查系統 Go 編譯器(brew Go 1.26.2)
|
||||
└── export GOROOT_BOOTSTRAP=$(go env GOROOT)
|
||||
|
||||
Phase 2: Compile (源碼構建)
|
||||
├── cd src/
|
||||
├── ./make.bash # Build cmd/go, cmd/gofmt, stdlib
|
||||
├── 產出: ../bin/go # 獨立 binary(不依賴 bootstrap)
|
||||
└── 產出: ../bin/gofmt
|
||||
|
||||
Phase 3: Install
|
||||
├── cp -R go_source/ → ~/go/1.26.2/
|
||||
├── ln -s ~/go/1.26.2/bin/go → ~/go/bin/go
|
||||
└── ln -s ~/go/1.26.2/bin/gofmt → ~/go/bin/gofmt
|
||||
```
|
||||
|
||||
### 構建指令
|
||||
|
||||
```bash
|
||||
# Download
|
||||
git clone --depth 1 --branch go1.26.2 https://github.com/golang/go.git services/src/go
|
||||
|
||||
# Build (uses existing Go as bootstrap)
|
||||
cd services/src/go/src
|
||||
GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash
|
||||
|
||||
# Install
|
||||
cp -R services/src/go ~/go/1.26.2
|
||||
ln -sf ~/go/1.26.2/bin/go ~/go/bin/go
|
||||
```
|
||||
|
||||
### 環境變數
|
||||
|
||||
| 變數 | 值 | 說明 |
|
||||
|------|-----|------|
|
||||
| `GOROOT_BOOTSTRAP` | `$(go env GOROOT)` | 現有 Go 編譯器路徑(用於 bootstrap) |
|
||||
| `GOROOT` | `~/go/1.26.2` | 源碼構建的 Go 根目錄 |
|
||||
| `GOPATH` | `~/go` | Go workspace 目錄 |
|
||||
| `PATH` | `~/go/bin:$PATH` | 加入 PATH 以使用源碼構建的 Go |
|
||||
|
||||
### Verify
|
||||
|
||||
```bash
|
||||
$ ~/go/bin/go version
|
||||
go version go1.26.2 darwin/arm64
|
||||
|
||||
$ ~/go/bin/go run hello.go
|
||||
Go 1.26.2 source-built OK
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Gitea
|
||||
|
||||
### 源碼來源
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| Source URL | `https://github.com/go-gitea/gitea` |
|
||||
| Branch | `v1.25.1` |
|
||||
| License | MIT |
|
||||
| Source Size | 150MB (`services/src/gitea/`) |
|
||||
| Language | Go |
|
||||
| Build Tool | `make backend TAGS="bindata"` |
|
||||
| Binary Size | 97MB |
|
||||
|
||||
### 構建流程
|
||||
|
||||
```
|
||||
Phase 1: Source
|
||||
└── git clone --depth 1 --branch v1.25.1 https://github.com/go-gitea/gitea.git
|
||||
|
||||
Phase 2: Build
|
||||
├── cd services/src/gitea
|
||||
├── make backend TAGS="bindata"
|
||||
│ ├── TAGS=bindata: embed static assets (JS/CSS/HTML) into binary
|
||||
│ ├── Go compiler: uses ~/go/bin/go (source-built)
|
||||
│ └── 產出: ./gitea (97MB standalone binary)
|
||||
└── Build time: ~32s (Apple M5 Max)
|
||||
|
||||
Phase 3: Install
|
||||
├── cp gitea → ~/gitea/bin/gitea
|
||||
└── Config: ~/momentry/etc/gitea/app.ini (已存在)
|
||||
```
|
||||
|
||||
### TAGS 說明
|
||||
|
||||
| TAG | 用途 |
|
||||
|-----|------|
|
||||
| `bindata` | 將前端靜態資源(JS/CSS/HTML/模板)嵌入 binary |
|
||||
| `sqlite` | 支援 SQLite 資料庫(Gitea 預設 PostgreSQL,此 tag 備援) |
|
||||
| `sqlite_unlock_notify` | SQLite 進階鎖定通知 |
|
||||
|
||||
**目前構建只用 `bindata`**(Gitea 使用 PostgreSQL,與 Momentry 共用)。
|
||||
|
||||
### 組態
|
||||
|
||||
```ini
|
||||
# ~/momentry/etc/gitea/app.ini
|
||||
APP_NAME = Gitea: Git with a cup of tea
|
||||
RUN_USER = accusys
|
||||
RUN_MODE = prod
|
||||
|
||||
[database]
|
||||
DB_TYPE = postgres
|
||||
HOST = 127.0.0.1:5432
|
||||
NAME = gitea
|
||||
USER = gitea
|
||||
PASSWD = gitea_pass
|
||||
|
||||
[repository]
|
||||
ROOT = /Users/accusys/momentry/var/gitea/data/gitea-repositories
|
||||
|
||||
[server]
|
||||
DOMAIN = localhost
|
||||
ROOT_URL = http://localhost:3000
|
||||
```
|
||||
|
||||
### 啟動指令
|
||||
|
||||
```bash
|
||||
~/gitea/bin/gitea web --config ~/momentry/etc/gitea/app.ini
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 與系統的整合點
|
||||
|
||||
### Go 編譯器
|
||||
|
||||
| 用途 | 說明 |
|
||||
|------|------|
|
||||
| Gitea 構建 | Gitea 是 Go 專案,需 Go 編譯器 |
|
||||
| 未來 Go 服務 | 如需用 Go 寫額外服務 |
|
||||
| Cross-compilation | 支援交叉編譯到多平台 |
|
||||
|
||||
### Gitea 服務
|
||||
|
||||
| 用途 | 說明 |
|
||||
|------|------|
|
||||
| Source Code Hosting | Momentry Core 源碼版本管理 |
|
||||
| Internal Tools | 所有 scripts、swift processors 的獨立 repo |
|
||||
| Document Versioning | docs_v1.0/ 的 Git 追蹤 |
|
||||
| CI/CD Trigger | push → webhook → pipeline trigger |
|
||||
| Issue Tracking | 技術 issue 管理(取代 GitHub Issues) |
|
||||
| Code Review | Pull Request review |
|
||||
| Mirror | 從 GitHub 鏡像外部依賴源碼 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 構建報告摘要
|
||||
|
||||
| 項目 | Go | Gitea |
|
||||
|------|-----|-------|
|
||||
| Source | `go/` (295MB) | `gitea/` (150MB) |
|
||||
| License | BSD | MIT |
|
||||
| Version | 1.26.2 | 1.25.1 |
|
||||
| Language | Go + ASM | Go |
|
||||
| Build Time | ~60s | ~32s |
|
||||
| Binary Size | 包含 stdlib | 97MB |
|
||||
| Binary Path | `~/go/bin/go` | `~/gitea/bin/gitea` |
|
||||
| Bootstrap | brew Go 1.26.2 | source-built Go |
|
||||
|
||||
---
|
||||
|
||||
## 5. Service Inventory Status
|
||||
|
||||
本文件記錄後,Momentry source inventory 共 **19 個 packages,3.4GB**。
|
||||
|
||||
完整清單見 `service source list` 輸出。
|
||||
Reference in New Issue
Block a user