World Monitor 是開源的世界情勢儀表板:一張地圖疊著地震、衝突、航班、船舶等圖層,旁邊是市場、能源、央行政策這類面板,用 TypeScript 寫,前端是 Vite 建置的單頁應用,後端是一組 API 處理函式,資料快取在 Redis。授權是 AGPL-3.0-only。上游同時經營一個有帳號和付費方案的託管版本。我 fork 了一份在本機跑,接自己收的資料,以下是這個過程裡值得知道的事。
執行形式:不一定要 Docker
上游建議的部署是 Docker Compose。如果你的機器不方便跑 Docker,另一條路是把 API 處理函式建置成一個 Node 伺服器,前端建成靜態檔,加一個 Redis REST 代理,讓它們在同一個 Node 程序裡跑,全部只綁本機迴路位址。Redis 那一層任何講 RESP 協定的東西都行,我用的是 Garnet。上游附的 Redis REST 代理需要多裝一個 npm 套件而且監聽所有介面,自己寫一個零依賴、只聽本機、每個請求都要權杖的版本不難。
哪些模組要換掉
上游的產品有登入、帳務、結帳、推播、使用分析、推薦這些跟它的雲端服務綁在一起的模組。自架而且離線的話,這些東西一個都連不到,建置時用同名的空殼取代它們,順便把對上游主機的 preconnect、登入按鈕和付費橫幅拿掉,伺服器端只保留真的會用到的路由。改完之後用幾個關鍵字掃建置產物,確認上游雲端服務的名字出現零次。剩下會連外的只有地圖圖磚和新聞面板直接讀的 RSS。
資料從哪裡來
面板讀的是 Redis 裡特定格式的鍵。上游有自己的抓取腳本,你也可以用自己的資料源照同樣的格式寫進去。我把這段橋接程式放在自己的專案裡而不是 fork 裡,因為 fork 沒有我需要的資料庫用戶端,加進去就要改它的 package.json 和 lockfile,跟進上游時一定衝突。兩邊只靠 Redis 的 HTTP 介面交換資料。
AGPL 的邊界
AGPL 跟 GPL 的差別在第十三條:透過網路提供服務也算散布,使用者有權拿到修改後的原始碼。只在本機迴路位址上自己用,這條實務上不會被觸發;修改後的原始碼完整留在 repository 裡,本來就會。但哪一天要把它放到任何公開網址,就必須向使用者提供完整的修改版原始碼,或取得商業授權,沒有第三個選項。把自己的收集器和分析程式放在不同的 repository、不同的程序裡,只靠資料庫和 HTTP 溝通,它們就能保留自己的授權。
上游跑得很快
這個專案的上游一個月可以有幾百個提交。fork 的時候要釘一個基底提交,把自己的改動疊在上面,並且接受「要不要跟進、什麼時候跟進」這個問題會反覆出現。改動越集中在少數幾個檔案,跟進越容易。
Windows 上的幾件小事
Vite 的命令列在 Windows 上建置完可能不會結束,建置腳本改成呼叫它的 API 然後明確退出。上游的測試有兩萬多項,在 Windows 上會有一批失敗,原因是 CRLF 的 checkout、npm 找不到 git、Windows 路徑和時間敏感的測試。判斷自己的改動有沒有弄壞東西,只看那些只在 fork 上失敗的測試,其餘先對照未修改的上游跑一次。
官方網站:worldmonitor.app
留言(0)
還沒有留言。讀完有想法,歡迎留下第一則。