跳轉至

Worldmonitor

Overview

Worldmonitor 係一套自我託管嘅全球事件監察服務,部署於 oracle-cloud 之上,用嚟彙合同分析多來源嘅世界實時數據。系統涵蓋海上船隻(AIS)、衝突事件(ACLED)、火點偵測(NASA FIRMS)、金融及能源指標(Finnhub、FRED、EIA),並且支援經 GROQ 或 OpenRouter 調用 AI 模型做智能分析。Worldmonitor 以容器方式運行,跟從「共用基礎設施」政策,唔會起獨立 Redis,而係使用現有嘅共用 Redis 實例,並以 DB 6 作為專屬邏輯空間。整個服務適合長時間喺雲端運行,預設時區係 Asia/Hong_Kong,方便香港營運者監察同除錯。

Architecture

Worldmonitor 嘅容器拓樸主要由三個部分組成:主程式容器、Redis REST 代理容器,以及 AIS relay 容器。

主程式容器使用 worldmonitor:latest 影像,容器名稱係 worldmonitor,執行策略係 restart: unless-stopped,並限制記憶體上限為 2GB,避免 Oracle Cloud 免費方案嘅細記憶體實例因記憶體洩漏而拖垮成個宿主。佢嘅後端數據層指向共用 Redis redis-mainREDIS_PASSWORD 用嚟直接連接 redis:6379 並使用 DB 6。由於 Docker 網路入面 host 唔一定可以直接解析到 Redis 容器,所以系統另設 worldmonitor-redis-rest 容器,呢個代理容器提供 HTTP 介面,UPSTASH_REDIS_REST_URL 指向 http://worldmonitor-redis-rest:80,令主程式可以經 REST 方式讀寫 Redis,而唔使直接暴露 Redis 埠。REDIS_TOKENUPSTASH_REDIS_REST_TOKEN 一致,用作代理認證。

實時訊息串流方面,Worldmonitor 連接 worldmonitor-ais-relay 容器,WS_RELAY_URL 設定為 http://worldmonitor-ais-relay:3004,並用 RELAY_SHARED_SECRET 做閘道認證。呢個 relay 主要用嚟轉發 AIS 船隻定位訊息或其他 WebSocket 數據流,令主程式可以專注處理業務邏輯,而唔使直接管理長連線。

主程式亦暴露內部 API,LOCAL_API_PORT=46123LOCAL_API_MODE=dockerLOCAL_API_CLOUD_FALLBACK=false,意思係 API 喺容器內提供服務,並且唔會喺本地呼叫失敗時自動轉去雲端 API;呢個設計強調數據私隱同可控性。AI 及外部數據源嘅 API key 全部係可選,假如未設定,系統只會喪失對應功能,而唔會令主程式崩潰,日後可透過 Infisical 或 .env 補齊。

Deployment

Worldmonitor 部署喺 oracle-cloud 上,建議使用 Docker Compose 管理。部署前需要準備以下嘢:

  • 一個已經運行緊嘅共用 Redis 實例,喺 Docker 網路內可經 redis:6379 到達。
  • Redis DB 6 必須可用,而且唔可以同其他服務衝突。
  • 準備 .env 檔案,填入所有密碼及 Token。
  • 如果要用 AIS 訊息,需要預先起好 worldmonitor-ais-relay 容器。
  • 如果要用 Redis REST 介面,需要預先起好 worldmonitor-redis-rest 容器。

基本部署步驟:

  1. 將 Compose 檔案放上 Oracle Cloud 實例。
  2. 建立 .env,包括 REDIS_PASSWORDREDIS_TOKENRELAY_SHARED_SECRET 以及可選外部 API key。
  3. 確認 Redis 服務仲有其他 sidecar 容器已經運行。
  4. 執行 docker compose up -d worldmonitor
  5. docker compose ps 檢查狀態,再用 docker compose logs -f worldmonitor 睇日誌。

部署可以放喺 Oracle Cloud 免費 ARM 實例(Ampere A1)上,因為 2GB 記憶體限制適合 1-2GB RAM 嘅細機。如果宿主本身有 4GB 或以上,就可以更從容咁同時運行 Redis、relay 同其他監察工具。

Configuration

Worldmonitor 嘅設定完全由環境變數驅動。以下係主要項目:

變數 用途
TZ 時區,設為 Asia/Hong_Kong,令日誌同排程以香港時間顯示。
REDIS_PASSWORD 直接連接 Redis 實例用嘅密碼,對應共用 redis-main。
REDIS_TOKEN Redis REST 代理或主程式認證用嘅 Token。
UPSTASH_REDIS_REST_URL 指向本地 worldmonitor-redis-rest 容器,令主程式經 HTTP 連 Redis。
UPSTASH_REDIS_REST_TOKEN 對應 REDIS_TOKEN,用作代理嘅 Bearer Token。
RELAY_SHARED_SECRET 同 AIS relay 之間嘅共用密鑰,確保連線受控。
WS_RELAY_URL AIS relay 嘅 WebSocket 或 HTTP 端點。
LOCAL_API_PORT 本地 API 監聽埠,容器內定為 46123
LOCAL_API_MODE 設為 docker,代表以容器模式運行。
LOCAL_API_CLOUD_FALLBACK 設為 false,禁止雲端後備。
GROQ_API_KEY 可選,Groq AI 模型存取。
OPENROUTER_API_KEY 可選,OpenRouter 統一 AI 閘道。
FINNHUB_API_KEY 可選,金融市場數據。
FRED_API_KEY 可選,聯儲局經濟數據。
EIA_API_KEY 可選,美國能源資訊署數據。
NASA_FIRMS_API_KEY 可選,NASA 火點衛星數據。
AISSTREAM_API_KEY 可選,AIS 船隻定位數據。
ACLED_EMAIL / ACLED_PASSWORD / ACLED_A 可選,ACLED 衝突事件資料庫憑證。

所有可選變數留空並唔會令容器啟動失敗,系統會自動降級,並喺日誌顯示缺失功能。呢種設計係為咗配合「之後用 Infisical 補齊」嘅營運策略。

Operations

日常操作主要圍繞 Docker 容器管理。

  • 啟動 / 停止docker compose up -d worldmonitor 或者 docker compose stop worldmonitor
  • 睇日誌docker compose logs -f worldmonitor,可以加 --tail=100 減少輸出。
  • 重啟docker compose restart worldmonitor,適用於改咗環境變數之後快速套用。
  • 進入容器docker exec -it worldmonitor sh,用嚟檢查內部網路或手動執行採集任務。
  • 監察資源docker stats --no-stream worldmonitor,確認記憶體冇超出 2GB 上限。
  • 更新影像:由於 worldmonitor:latest 係固定標籤,可以執行 docker compose pull worldmonitordocker compose up -d 更新。

Redis 方面,由於政策禁止獨立 Redis,所有資料都喺共用實例嘅 DB 6 入面。備份時要非常小心,應該用 redis-cli -a "$REDIS_PASSWORD" -n 6 --rdb /backup/worldmonitor.rdb 或者 BGSAVE,千祈唔好對整個 Redis 做 FLUSHALL,否則會影響其他共用服務。

AIS relay 如果出現斷線,可以重啟 worldmonitor-ais-relay,然後確認 WS_RELAY_URL 嘅連線狀態。大部份問題都可以靠日誌尾幾行判斷。

FAQ

點解唔用獨立 Redis? 因為項目政策係「禁獨立 Redis」,所有服務共用 redis-main,Worldmonitor 只係用 DB 6 做邏輯隔離,咁樣可以減少資源浪費,亦方便統一備份同管理。

REDIS_PASSWORD 同 REDIS_TOKEN 有咩分別? REDIS_PASSWORD 係 Redis 原生密碼,用於直接 RESP 連線;REDIS_TOKEN 係 Redis REST 代理嘅認證 Token,用於 HTTP 介面。喺 Worldmonitor 入面,兩者都指向同一個共用 Redis。

點解 UPSTASH 會指向本地代理而唔係真正 Upstash? 因為 Oracle Cloud 上冇必要用外部雲端 Redis,本地 worldmonitor-redis-rest 提供類似 Upstash 嘅 REST 介面,令 seed/host 喺同一 Docker 網路入面可以快速安全咁連線,而唔使暴露 Redis 6379 埠。

冇 API key 會點? 功能降級。例如冇 EIA_API_KEY 就冇能源數據,冇 GROQ_API_KEY 就冇 AI 摘要。系統照樣運行,日後只要喺 .env 或者 Infisical 補返 key,再重啟容器就可以啟用。

可唔可以喺香港時區以外運行? 可以,但唔建議。TZ=Asia/Hong_Kong 會影響日誌時間同新聞事件嘅時間排序,如果改做其他時區,可能令警報時間唔對。

LOCAL_API_CLOUD_FALLBACK=false 有咩好處? 確保數據處理唔會依賴外部雲端 API,避免敏感監察資料外洩。即使本地 API 出錯,都唔會自動用雲端替代,反而會留低錯誤畀管理員跟進。

docker
docker-compose
oracle-cloud
redis
litellm
Self-hosted service
AIS
ACLED
NASA FIRMS
Finnhub
FRED
EIA
香港

Source

Coverage auto (container scan)