部署實際值與初始拓撲¶
本檔角色:把規範中的 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 各自固定為 development/private-playtest/public |
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.org、pin.open4wd.org、bootstrap.open4wd.org、
turn.open4wd.org、dmca.open4wd.org、monitoring.open4wd.org 只可能用於其一般社群/個人
部署。只有實際公開、存活且通過相同檢核的服務 endpoint 才進 community registry;private
Grafana、Admin、拓撲與存取資訊不進 registry 或公版文件。網域所有權不授予信任、優先權、
write permission、retention 承諾或 release dependency;個人部署可隨時關閉。
development 的 ledgerAddress 留空時,瀏覽器可建立可刪除、不可視為正式網路資料的
本機 OrbitDB island,供 ledger/Admission 與 UI 整合測試;這不代表已連上正式 ledger。
runtime 分別判定 peerMesh、websocketSignaling、gossipSignaling、roomDiscovery 與
turnToken;某類 provider 空缺只關閉相應能力,不觸發隱性 fallback。private-playtest/public
發布 gate 只要求主專案自己的 trust root 與靜態產物,不要求任何特定社群 provider 上線。
Client 啟動時不是只驗證這份 JSON:ordinary genesis 的 genesisTimestamp 與 governanceSigners 必須經 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 只有:
N = 1:單人 bootstrap/ 早期維護;quorum 1。N >= 3:社群治理;quorumfloor(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.org與turn.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_sha/main_release_sha 的差異見該權威檔。
任何維護者個人或社群 provider 都不是 release gate。
每次切階段至少執行:format:check、lint、check:types、unit/coverage/integration、Pages base-path E2E、build、check:pwa、check:seo、check: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 結構錯誤不可歸類為
「等待維護者填值」。