Skip to content

Headless CMS 選型與 K3s 部署架構:Strapi vs. Storyblok

傳統 CMS(如 WordPress)把前台畫面和後台資料庫綁在一起;Headless CMS 則是把負責畫面的「頭」拿掉,後台只專注於資料與內容管理,並提供 API。開發者保留自己撰寫的前台(例如 Vue),讓前台透過 fetchaxios 向後台拿 JSON 資料來渲染畫面。


工具選型:Strapi vs. Storyblok

選擇的關鍵在於內容更新的方式是表單式還是視覺化拖拉。

StrapiStoryblok
類型開源自託管SaaS 託管
適合情境表單式內容管理(替換文字、上傳圖片)視覺化拖拉編輯(WYSIWYG)
後台介面直覺乾淨的表單Visual Editor,可直接在預覽畫面拖拉區塊
費用軟體免費,需自建伺服器或雲端環境免費 Starter 方案:1 個專案、每月 100GB 流量、10 萬次 API 請求
維運成本高(資料庫備份、升級、擴容)低(後台與 DB 由 Storyblok 負責)

K3s 部署架構

兩套工具在 Kubernetes 上的資源需求差異很大。

Strapi 架構(3 個 Pod)

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ frontend-pod│◄───│  strapi-pod │◄───│   db-pod    │
│  Vue + Nginx│    │  API :1337  │    │  PostgreSQL │
└─────────────┘    └─────────────┘    └──────┬──────┘
                                             │ PVC
                                       (資料持久化)
  • db-pod:PostgreSQL,必須設定 PersistentVolumeClaim(PVC),否則容器重啟後資料會消失
  • strapi-pod:提供圖形化後台與 API,預設 port 1337
  • frontend-pod:Vue 專案打包進 Nginx 映像檔

Storyblok 架構(1 個 Pod)

┌─────────────┐         Storyblok Cloud
│ frontend-pod│◄────── API + CDN + 後台 + DB
│  Vue + Nginx│         (全部託管)
└─────────────┘

只需部署前台 Pod,後台、資料庫、CDN 全由 Storyblok 負責,大幅降低維護成本。


Prototype 階段:不花錢的對外連線方式

如果 K3s 機器有公開 IP,Prototype 測試完全不需要買網域:

魔法 DNS(最推薦)

使用 nip.iosslip.io,將 Ingress host 設為 <服務名稱>.<IP>.nip.io,流量會自動解析回主機,零設定。

NodePort

繞過 Ingress,直接把 Service 設為 NodePort,透過 http://<公開IP>:<高埠號> 連線,適合快速驗證。

修改本機 hosts 檔

在 Ingress 設定假網域,請測試者在自己電腦的 /etc/hosts 加上對應關係。適合小範圍內部測試。


實作注意事項

Strapi:圖片儲存

在 K8s 環境中,建議安裝 AWS S3 或 GCS 插件來存放上傳的圖片,避免處理複雜的分散式 StorageClass。

Strapi:CORS 設定

Vue 呼叫 API 的網址(公開 IP 或 nip.io 網址)必須在 Strapi 後台加入 CORS 白名單,否則請求會被直接擋掉。

Storyblok:本地開發

Storyblok 的 Visual Editor 是透過 iframe 嵌入你的網站來實現拖拉編輯,在本地開發時需要用 ngrok 等工具把 localhost 暴露到外網,Storyblok 才能順利載入本機畫面。