thread-master/docs/product/haixun-deployment/requirements.md

109 lines
5.9 KiB
Markdown
Raw 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.

# Requirements: 設定驅動的多主機正式部署
> Status: `draft-for-review`
> Slug: `haixun-deployment`
> Last updated: `2026-07-18`
> Implementation: not started
## 1. 一句話
營運者只需在本機設定檔填寫主機 IP、網域與加密機密就能把全新的 Ubuntu 24.04 VM 初始化並部署成可分開更新、重啟與擴充的 frontend、backend、worker、Redis、MinIO、Registry 與 Edge 環境。
## 2. 目標
### R-01 設定檔是部署真相來源
- 非機密拓撲集中在 `deploy/prod/deployment.yml`
- 機密集中在 Ansible Vault 加密的 `deploy/prod/secrets.vault.yml`
- 遠端不得成為設定真相來源,不要求登入遠端手動編輯 env 或 YAML。
- 每台主機最低只需填可 SSH 的 IPSSH user/port/key 可設全域預設並允許單機覆寫。
- WireGuard IP 預設自動分配,必要時才手動覆寫。
### R-02 空 VM 可自動初始化
- 支援全新 Ubuntu 24.04 LTS VM。
- 初始前提僅為SSH 可達、指定使用者可 `sudo`、DNS 已按設定指向 Edge 與 Registry。
- bootstrap 必須安裝 Python、Docker Engine、Compose plugin、WireGuard、UFW、chrony、fail2ban 與安全更新工具。
- bootstrap 必須建立服務帳號、目錄、權限、Docker log rotation、TLS 與防火牆規則。
- bootstrap 必須可重複執行且不得刪除既有資料。
### R-03 元件可獨立部署
- frontend、backend、worker、Redis、MinIO、Registry、Edge 可個別 bootstrap、deploy、restart、status 與 rollback資料層 rollback 另定義)。
- frontend、backend、worker 不得綁在同一 release artifact。
- 本機 build image 並 push 至自架 Registry遠端不得執行 Go/npm build。
- 遠端在舊服務仍運作時先 pull image再以 Compose recreate/restart。
- 設定變更可不 rebuild image單獨同步並 recreate 指定角色。
### R-04 可從設定動態增加節點
- frontend、backend、worker host list 可有任意多台。
- 新增 worker 後不需流量註冊即可開始 claim job且每台 worker ID 必須唯一。
- 新增 frontend/backend 後,自動重建 Edge upstream健康檢查通過後才加入流量。
- 同一部署指令只處理設定中指定的角色或 host其他節點不得被意外重啟。
### R-05 資料與狀態
- MongoDB 使用 Atlas不再於 production Compose 自架 MongoDB。
- Redis 第一版為獨立單機、啟用密碼與 AOF接受單點故障。
- MinIO 第一版為獨立單機與持久 volume接受單點故障。
- frontend/backend/worker container 應可替換;媒體物件持久化於 MinIO業務資料持久化於 MongoDBcache/lock 位於 Redis。
- worker 的 Playwright、Node script 與 Chromium 必須封裝在 image解密 session 暫存檔只可位於 ephemeral storage 並限制權限。
- gateway 使用的 extension ZIP 必須封裝在固定 image path不能依賴開發者本機絕對路徑。
### R-06 MongoDB Atlas 初始資料庫流程
- first deploy 必須先驗證 Atlas DNS、TLS、帳密、database name 與來源 allowlist。
- 依序執行 forward migration、`cmd/init`、`cmd/seeder`。
- migration 失敗不得切換 backend。
- `cmd/init` 必須保持 idempotent僅建立 operational indexes。
- seeder 的管理員 email、display name、password 必須由 Vault 設定。
- 重跑 seeder 不得覆寫既有管理員密碼;改密碼必須是獨立明確操作。
- 一般 deploy 可執行 migration但不得每次自動 seed。
### R-07 網路與安全
- 主機間服務流量走 WireGuard不直接暴露 Redis、MinIO、backend 或 crawler 到公網。
- Edge 僅公開網站需要的 `80/443`Registry 只以 TLS 提供服務並要求認證。
- Edge 與 Registry 使用 DNS + Let's Encrypt憑證自動續期。
- Atlas 只 allowlist 固定出口 IPbackend/worker 的 Atlas 流量必須符合此出口設計。
- frontend 與 API 使用同網域Edge 將 `/api` 轉送 backend`/haixun-assets` 轉送 MinIO。
- crawler 只能在 worker Docker private network 內被存取,不 publish host port。
- Vault 明文、生成的 env、Registry 密碼與私鑰不得提交 Git 或寫入 image。
### R-08 維運與防呆
- 提供 preflight、doctor、status、logs、restart、deploy-config 與 rollback 指令。
- 所有設定先寫暫存檔並驗證,再原子替換。
- backend/frontend 採健康節點逐台更新,不可一次停止所有副本。
- destructive reset/wipe 不得包含在一般 deploy且必須有環境名稱與二次確認。
- Redis、MinIO 與 Registry 必須具備備份與還原文件Atlas 備份使用 Atlas Backup/PITR。
- 單機 Redis、MinIO、Registry、Edge 的單點風險必須在 status 與文件中明示。
## 3. 不在第一版範圍
- Kubernetes。
- Docker Swarm。
- Redis Sentinel/Cluster。
- 分散式 MinIO。
- 多 Edge 高可用與自動 failover。
- 在遠端 VM 進行應用程式編譯。
- 自動建立 MongoDB Atlas project/cluster第一版只連接已建立的 Atlas cluster。
- 自動修改 Atlas allowlist固定出口 IP 先由營運者配置到 Atlas。
## 4. 已知限制
- 增加 worker 可提高一般 Mongo job 吞吐量,但目前 Outbox 仍被全域 Redis lock 序列化。
- Outbox 查詢目前最多掃描 500 筆且不適合作為大規模 worker pool 的最終方案。
- Redis、MinIO、Registry、Edge 第一版各一台時仍有單點故障。
- gateway 現有 health endpoint 只檢查 Redis正式 rolling deployment 前需補足 Mongo readiness。
## 5. 驗收摘要
- 從全新 Ubuntu 24.04 VM 開始,除 DNS/Atlas/SSH 外不需登入遠端手動操作。
- 修改一份 host 設定加入 worker IP 後,可只部署新 worker。
- 修改設定但不 build遠端 recreate 後能讀到新設定。
- backend/frontend 多節點更新期間至少保留一個健康節點。
- migration/init/seed 的順序、失敗停止與重跑安全性可驗證。
- 公網不能直連 Redis、MinIO private API、backend private port 或 crawler。