---
title: "Headless CMS - Strapi 評估筆記"
description: "評估與導入 Headless CMS Strapi 的實務筆記，涵蓋安裝、Swagger 整合、API 權限設定、圖片回傳問題排解與功能展示。"
canonical_url: "https://blog.markkulab.net/post/headless-cms-note"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2022-09-08 01:01:01 +0800"
category: "Infra"
tags: ["headless", "cms", "strapi", "swagger", "node.js", "api", "content management"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

# Headless CMS - Strapi 評估筆記

## 解決問題

老闆請我協助評估 CMS 系統，讓產品部門維護 FAQ 及產品 Knowledge Base，因為後端開發能量有些限、希望能靠友善的 UI 設定，就能快速的創造出後台維護頁面及前台Api，好讓其他前端同仁串接。

## 為何採用 strapi

![Headless CMS 平台比較及內容編輯介面](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/ONXbTAJ.jpg)  
我試用了幾套主流幾套 CMS，基於以下理由，首推 strapi 靈活輕巧，適合企業中長期發展，未來也可以移作他用。  
使用者 - 界面友善、可以自由調整位置。
管理者 - 資料欄位驗證、權限管理、流程控制。  
開發者 - 開源、串接友善，提供 swagger 文件、擴充性( 插件市集 )、提供豐富的接口、本身也是 react 及 node 寫的，對前端開發者相對很友善。  

## 原理

strapi 透過友善的後台 UI 設定，能讓程式產生程式。
![Strapi專案API資料夾結構截圖](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/M6RfjZ8.png)  

## 使用及安裝限制

* node 版本 '>=10.16.0 <=14.x.x' ( 可以透過 nvm 管理多版本 node )
* 雲端付費，地端開源永久免費

## [安裝 strapi](https://docs.strapi.io/developer-docs/latest/getting-started/quick-start.html#_1-install-strapi-and-create-a-new-project)

```
npx create-strapi-app@latest my-project --quickstart
```

## 安裝 [swagger](https://docs.strapi.io/developer-docs/latest/plugins/documentation.html#installation)

```
cd my-project
npm run strapi install documentation
n﻿pm run build // 裝完一定要按 build 才會跑出按鈕
```

## 安裝完後，即可以登入後台，但會遇到一些小問題，順便記錄了一下

## Api 沒回傳圖片

API 預設是不會傳圖片的欄位，在呼叫 api 的請求參數 populate 參數，額外填寫回傳的圖片欄位
![Strapi API 呼叫文章列表設定 populate 參數](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/6gfNF29.png)
![Strapi API 回傳圖片欄位 JSON 介面](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/eF34HEH.png)

## Api 權限

預設 api 存取是需要帶 token，如果你不需要驗證則可以，到 Setting > USERS & PERMISSIONS PLUGIN > Role > 找到你的 Collection > 並給與 find 和 findOne 權限。
![Strapi後台Public角色權限設定，findOne已勾選](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/ovdumL9.png)

## Rich Text 圖片無法即時預覽圖片

.env

```
HOST=0.0.0.0
PORT=1337
APP_KEYS=p285lmxQN6bZ90Dh870eIg==,twHIadFFnSgVKyGgzcpnIQ==,jgn83CaVHIPPnpSqsZPWGw==,s2lTboydFrhkPRHJp4omQw==
API_TOKEN_SALT=9LGnsz1zt4UpaKfCCQxEZQ==
ADMIN_JWT_SECRET=l7gG6CTUeK0502ns9FAKkw==
JWT_SECRET=mJg/1OqVkOeCiZcxiQfG5w==
WEBSITE=http://127.0.0.1:1337/
```

config/server.js

```
module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  ------
  url: env('WEBSITE', 'http://127.0.0.1'), 
  ------
  app: {
    keys: env.array('APP_KEYS'),
  },  
});
```

## 資料備份

* 資料庫 - 預設是 sql-lite ，路徑 .tmp/data.db ( 也支援 mysql 及 mongo db )
* 靜態檔案 - 靜態檔案上傳後都會在 /public/uploads 目錄

## 功能頁面展示

### 動態產生後台

![Strapi內容類型建構器顯示文章欄位設定](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/0f0BjwY.png)

### 上傳圖片可以傳多張圖

![Strapi內容類型編輯器，設定圖片欄位為多媒體](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/jXmzMbk.png)

### 上傳圖片格式限制

![Strapi後台設定圖片欄位允許的媒體格式](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/PunbK7f.png)

## 輸入畫面

![Strapi後台建立文章介面，顯示圖片上傳功能](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/lLcJ5rp.png)

### Layout 動態調整

![Strapi後台文章內容類型顯示欄位設定介面](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/hGjLnld.png)

### WebHook

![Strapi後台建立Webhook的設定介面截圖](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/DAuWE1D.png)

### 角色

![Strapi後台設定頁面中的角色列表](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/i1fy4kz.png)

## 權限

![Strapi後台編輯角色權限設定畫面](https://blog.markkulab.net/content/markku/posts/headless-cms-note/images/gEvb3eh.png)

## 相關連結
[ckeditor](https://market.strapi.io/plugins/@_sh-strapi-plugin-ckeditor)  
[strapi provider upload ftp v2](https://www.npmjs.com/package/strapi-provider-upload-ftp-v2)

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/headless-cms-note)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
