EmDash CMS 自架 Node 部署參考

在你自己的基礎設施上運行 EmDash,從 SQLite 到 PostgreSQL 與物件儲存的漸進架構路徑。

何時該選自架

當限制屬於營運、法規或架構時,選擇自架:

  • 資料落地要求嚴格
  • 你已在內部運行共用平台服務
  • 需要完全掌控執行期、程序模型與網路路徑
  • 早期階段想避免受管雲端耦合

自架不會自動比較便宜,通常比較可控。

建議的漸進模型

不要從最高複雜度開始,採分階段推出:

  1. Node.js + SQLite + 本機檔案儲存
  2. PostgreSQL 以提升多實例安全與耐久性
  3. S3 相容物件儲存以提升媒體可攜性
  4. 程序監督與可觀測性強化

此順序在保留乾淨生產路徑的同時,將遷移衝擊降到最低。

基準架構(階段 1)

單節點生產或早期上線:

  • 應用執行期:Node adapter(standalone
  • 資料庫:持久磁碟上的 SQLite 檔案
  • 媒體:本機 uploads 目錄
  • 反向代理:Nginx 或 Caddy

此設定足以應付低至中等編輯負載與單一執行實例。

# Production build and run
npm install
npm run build
npm run start

階段 2 升級準則(遷移至 PostgreSQL)

當出現下列任一情況時升級資料庫:

  • 並發寫入競爭變頻繁
  • 備份/還原目標超出檔案複製策略
  • 需要更安全的多實例部署

在水平擴展應用節點之前先採用 PostgreSQL。在 SQLite 上擴展應用節點會快速帶來營運風險。

儲存策略:本機檔案 vs 物件儲存

本機檔案(由此開始)

適合單實例環境與可預測的儲存成長。

S3 相容物件儲存(規模化時遷移)

在下列情況使用:

  • 多個應用實例需要共用媒體存取
  • 備份與災難復原必須標準化
  • CDN 與邊緣快取策略依賴穩定的物件 URL

私有基礎設施可使用 MinIO 提供 S3 相容行為。

執行期程序與代理基準

程序管理

擇一使用:

  • Linux 原生的 systemd 服務控制
  • 需要程序指標與快速重啟的團隊可用 pm2

反向代理

在代理終止 TLS 並轉發至 Node 應用:

  • 保留 HostX-Forwarded-* 標頭
  • 設定健康檢查路徑
  • 依上傳政策設定 body 大小上限

備份與還原政策

將備份政策視為上線阻擋項,而非上線後任務。

最低基準:

  • 依排程建立資料庫快照
  • 媒體儲存備份或複寫
  • 公開上線前至少做一次還原演練

從未在測試中還原過的備份是傳聞,不是控制措施。

營運就緒檢查清單

生產切換前確認:

  • 冷啟動不需手動編輯即可運作
  • 應用程式日誌已集中且可搜尋
  • 5xx 告警已啟用
  • 磁碟用量與儲存成長已監控
  • 密鑰輪換流程已文件化

從 Cloudflare 取向設定的遷移備註

若專案最初假設 Cloudflare:

  • 從執行期設定移除僅雲端才有的綁定
  • 將 D1/R2 轉接器換成 Node 相容的資料庫與儲存轉接器
  • 在反向代理後重新驗證驗證與 callback URL

遷移風險多半在環境假設,而非頁面層程式碼。

團隊決策框架

使用此規則:

  • 若需要速度與最低營運負擔,偏好受管雲端路徑
  • 若需要掌控與現有基礎設施整合,偏好自架路徑

每個環境選一種預設路徑。混合部署可行,但會增加認知負載與支援負擔。