跳轉到

部署實際值與初始拓撲

本檔角色:把規範中的 trust root 與社群服務拓撲轉成 development/private playtest/public 可檢核的值。程式端 src/deployment/deployment-values.*.json 只保存主站 base path、ledger address、genesis timestamp 與 governance signers;所有 runtime provider 都由玩家設定、已接受 session route 或 community registry 選取,不進 build profile。

1. Repo、服務與 Server 是三個不同概念

初期可把多個服務放在同一台 server,但仍維持獨立 repo、process/container、資料卷與最小權限:

Repo/元件 初期位置 必須獨立的邊界
open-4wd GitHub Pages;瀏覽器執行 純靜態、不得持有 server secret
open-4wd-pinning 初期 server A repo、container、資料卷、管理 API key
open-4wd-turn 同一台 server A 可行 repo、coturn process、UDP/TCP port range、TURN shared secret
bootstrap/libp2p peer 同一台 server A 可行 固定 PeerId、公開 multiaddr
signaling 可先用既有 provider;自架時可同機或獨立 edge repo、部署設定;若發 TURN 短期憑證,與 TURN 共用的只有 secret 值

「TURN 合併在 pinning」只代表共用機器與維運窗口,不代表合併 repo 或程式。任何一個服務升級 / 重啟都不應要求另一個一起發布。

2. Client deployment values

欄位 現在可填 正式值來源
stage 三份 profile 各自固定為 developmentprivate-playtestpublic build configuration 選取,不人工覆寫同一檔
basePath 正式 custom domain 與本機 development 固定 /;顯式 Pages preview 才用 /open-4wd/ 已知
ledgerAddress 現在留空 genesis peer 建立 open4wd-ledger 後輸出的完整 db.address
genesisTimestamp development 可為 0;private/public 的 0 只是會被 gate 阻擋的未就緒值 genesis public receipt 的正整數 UTC 毫秒,須逐字複製
governanceSigners 現在留空 key-manager 產生、由維護者安全備份的真 PeerId
initialCheckpointProof 省略(ordinary genesis) 僅鏈重生 major 使用;與新 address/目標 signers 一起出貨

禁止 example.com、假 PeerId、假 multiaddr 或只有資料庫名稱的半成品通過 public gate。 Runtime bootstrap、relay、signaling、ICE 與 pinning 不屬於 deployment values;各設定來源仍須通過 對應嚴格 schema、URL/multiaddr 正規化與有界載入。private 與 public 可使用不同 community registry snapshot,但 client 不以 build stage 推導信任、優先權或 write permission。

維護者個人保留的 signal.open4wd.orgpin.open4wd.orgbootstrap.open4wd.orgturn.open4wd.orgdmca.open4wd.orgmonitoring.open4wd.org 只可能用於其一般社群/個人 部署。只有實際公開、存活且通過相同檢核的服務 endpoint 才進 community registry;private Grafana、Admin、拓撲與存取資訊不進 registry 或公版文件。網域所有權不授予信任、優先權、 write permission、retention 承諾或 release dependency;個人部署可隨時關閉。

developmentledgerAddress 留空時,瀏覽器可建立可刪除、不可視為正式網路資料的 本機 OrbitDB island,供 ledger/Admission 與 UI 整合測試;這不代表已連上正式 ledger。 runtime 分別判定 peerMeshwebsocketSignalinggossipSignalingroomDiscoveryturnToken;某類 provider 空缺只關閉相應能力,不觸發隱性 fallback。private-playtest/public 發布 gate 只要求主專案自己的 trust root 與靜態產物,不要求任何特定社群 provider 上線。

Client 啟動時不是只驗證這份 JSON:ordinary genesis 的 genesisTimestampgovernanceSigners 必須經 app composition root 傳到 ledger genesis EconomyConfig;private/public 的 timestamp 必須為 receipt 的正安全整數,缺值、0 或本機啟動時間都 fail closed。鏈重生則要求 signers 與 initialCheckpointProof.targetGovernanceSigners 精確相同,整份 proof 經 composition root 傳至 ledger 完整驗證後才產生 genesis state。兩分支互斥,不讀裸 initialStateCid 或舊欄位。設定頁的 deployment readiness 也由 composition root 注入,只顯示模式、warning 與 error code,不顯示 TURN credential 或任何 secret。

3. LEDGER_DB_ADDRESS 不是指定名稱

  • database 名稱固定 open4wd-ledger,只用在明確 genesis
  • 正式 client 必須填 genesis 建立後 db.address 原樣輸出的完整 address,exact 形狀為 /orbitdb/<CIDv1-base58btc>;database name 不附加在 address 後面。程式會用真正 CID parser 驗證,實際值不得手寫猜測。
  • 非 genesis client 不得在 address 缺失時偷偷用名稱建立同名資料庫,否則形成隔離 ledger island。
  • private/public 階段 address 必填;development 可留空建立可重置的本機 ledger island,僅供開發 / 測試,不是正式鏈資料。

4. 初期治理者只有一人

初期只有一位真維護者時,正確做法是 1 個真 signer、quorum = 1,不是同一人偽造三個「獨立治理者」。合法 signer set 只有:

  1. N = 1:單人 bootstrap/ 早期維護;quorum 1。
  2. N >= 3:社群治理;quorum floor(2N/3) + 1

N = 2 永遠拒絕,避免 1/2 太弱或 2/2 永久僵局。由 1 人擴充到 3 人以上時,現任唯一 signer 簽署 config update,下一 epoch 起套用新 signer set;三個 PeerId 應由三位能獨立決策與保管金鑰的人持有。短期仍只有一位維護者就維持 1,不製造假去中心化。

4.1 Genesis 與第一個 replica

正式 ledger 只可由 pinning repo 的獨立 one-shot genesis command 建立;正常 service 與瀏覽器都不得代建。操作者使用專用持久 identity、專用空資料目錄、至少一個 listen address,以及本節定義的治理 signer set。成功後保存 non-secret receipt 與完整資料備份,將 receipt 的 exact address 原樣填入 client 與 replica 設定。

Genesis provider 必須保持在線,直到一個使用不同 identity、不同空資料目錄的 replica 已取得 manifest/必要 blocks,且 open 後核對 address、open4wd-ledger name、events type 與 access-controller contract 全部一致。若 receipt 已存在或 genesis 目錄含未識別資料,command 必須拒絕,不得覆寫或自動清除。詳細裁決與復原規則見 D-20260728-05

5. 初期 bootstrap 選擇

  • 主專案發布的 bootstrap 硬下限是 0;玩家未選任何節點時保持本地/既有 session 模式。
  • 玩家選取 3 個獨立故障域是抗停機、網路與區域故障的建議,不是 release gate 或可用性保證。
  • 同一 server 開三個 port 不算三個獨立故障域。
  • multiaddr 必須含 /p2p/<PeerId> 且使用瀏覽器可用的 /ws/wss;公開站建議 /wss

bootstrap 與 pinning 同機可接受。若同一部署也啟用 Circuit Relay,仍須在 community registry 分別登錄能力,且玩家分別選取;bootstrap listing 本身不授權 relay reservation。

6. TURN 與 Pinning 同機注意事項

  • DNS 可分成 pin.example.orgturn.example.org;同 IP 不等於同服務。
  • Pinning 走 HTTPS/TCP;TURN 至少需 UDP listener 與 relay port range,防火牆、rate limit、監控分開。
  • TURN 長期 credential 不得寫進 client repo。若 signaling 發 5 分鐘短期 credential,signaling 與 coturn 部署 secret 必須一致,但只讀部署環境變數。
  • signaling /turn-token 回傳的 300 秒短期 credential 只留本次執行期記憶體,不得寫入 settings、IndexedDB 或日誌。玩家手動 TURN 設定是獨立來源,仍依設定服務既有的 敏感值保存規則處理。

7. 發布順序與 gate

現行首次發布順序以 專案生命週期 為權威;粗粒度順序如下:

交錯 candidate 迭代 → Asset-ready → Pre-launch baseline → public specs+docs site → private main source baseline → pinning → signaling → turn → Ledger genesis+replica → main release public/live → remote provenance → open4wd.org activation → workflow public。

Candidate 失效條件、各 gate 證據與 main_source_baseline_shamain_release_sha 的差異見該權威檔。 任何維護者個人或社群 provider 都不是 release gate。

每次切階段至少執行:format:checklintcheck:types、unit/coverage/integration、Pages base-path E2E、buildcheck:pwacheck:seocheck:deployment -- --profile <name>。正式 public 再加 check:release-assets;在 27 個公版 GLB 尚未放入前,此 gate 應且只能回報那些缺檔。

目前不要求另建 GitHub Release:Pages artifact + Git commit 已是可追溯發布單位。需要對外提供版本化下載包、簽名 binary 或 changelog 時再增加 Release。

公開 dry-run 的合理失敗範圍只有主專案輸入:正式 /orbitdb/<CIDv1-base58btc>、真 governance signer 與 27 個正式公版 GLB。Bootstrap、relay、signaling、ICE、pinning endpoint 與 provider 法遵聯絡資訊都不是主專案發布輸入。程式、CI、base path、PWA 或 artifact 結構錯誤不可歸類為 「等待維護者填值」。