
Hướng dẫn Strapi 5: Cài đặt, API, Plugin và Triển khai (2026)
Strapi là một headless CMS mã nguồn mở được xây dựng trên Node.js, giúp bạn kiểm soát hoàn toàn API, cơ sở dữ liệu và quá trình triển khai của mình. Khác với các nền tảng CMS lưu trữ sẵn nơi bạn thuê quyền truy cập vào hạ tầng của người khác, Strapi chạy trên máy chủ của chính bạn, tự động tạo các endpoint REST và GraphQL từ lược đồ nội dung (content schemas), và cho phép bạn tùy chỉnh mọi lớp của backend bằng JavaScript hoặc TypeScript thuần.
Hướng dẫn này tập trung cụ thể vào Strapi 5, từ lệnh npx create-strapi đầu tiên cho đến khi triển khai lên môi trường production trên Railway hoặc Strapi Cloud. Mọi ví dụ mã nguồn đều sẵn sàng để sao chép-dán và đã được kiểm thử trên Strapi 5.x.
| Trường | Giá trị |
|---|---|
| Loại | Headless CMS mã nguồn mở |
| Ngôn ngữ | JavaScript / TypeScript (Node.js) |
| Phiên bản hiện tại | Strapi 5 |
| Giấy phép | MIT (Cộng đồng) / Độc quyền (Doanh nghiệp) |
| Hỗ trợ Cơ sở dữ liệu | PostgreSQL, MySQL, MariaDB, SQLite |
| Loại API | REST + GraphQL (tích hợp sẵn) |
| Lưu trữ | Tự lưu trữ (Self-hosted) hoặc Strapi Cloud |
| Giá Cloud | Gói miễn phí, sau đó từ $18/tháng |
| Sao GitHub | 65.000+ |
| Phù hợp nhất cho | Các đội nhóm muốn sở hữu mã nguồn hoàn toàn + tùy chỉnh API |
Strapi là gì và nó hoạt động như thế nào?
Strapi là một hệ thống quản lý nội dung (CMS) ưu tiên API, được tự lưu trữ, tách biệt backend nội dung khỏi frontend của bạn. Bạn định nghĩa các lược đồ nội dung thông qua trình xây dựng trực quan hoặc bằng mã, và Strapi sẽ tự động tạo các endpoint API CRUD, cả REST và GraphQL, mà bất kỳ framework frontend nào cũng có thể sử dụng. Bảng điều khiển admin là giao diện người dùng dựa trên React, nơi các biên tập viên nội dung có thể tạo và quản lý các mục nhập mà không cần chạm vào mã, theo tài liệu chính thức của Strapi.
Headless CMS so với CMS truyền thống
Một CMS truyền thống như WordPress gắn liền nội dung với lớp trình bày. Bài đăng blog, trang web và phương tiện truyền thông của bạn đều nằm trong cùng một hệ thống render HTML cho khách truy cập. Điều này hoạt động tốt cho đến khi bạn cần cùng một nội dung xuất hiện đồng thời trên ứng dụng di động, một microsite marketing và cổng tài liệu kỹ thuật.
Một headless CMS loại bỏ hoàn toàn phần frontend. Strapi lưu trữ nội dung của bạn và phục vụ chúng dưới dạng JSON thông qua các endpoint API. Trang web Next.js, ứng dụng React Native và bảng điều khiển IoT của bạn đều lấy dữ liệu từ cùng một backend Strapi. Bạn có một nguồn sự thật duy nhất, nhiều nơi tiêu thụ.
Nếu bạn đang đánh giá các lựa chọn khác ngoài Strapi, bài so sánh headless CMS của chúng tôi sẽ phân tích chi tiết các nền tảng hàng đầu.
Kiến trúc của Strapi
Ngăn xếp công nghệ của Strapi khá đơn giản: một máy chủ Node.js nằm giữa cơ sở dữ liệu của bạn (PostgreSQL, MySQL hoặc SQLite) và các ứng dụng frontend. Bảng điều khiển admin, một ứng dụng trang đơn (SPA) dựa trên React, kết nối với cùng API mà các frontend sử dụng, chỉ khác ở quyền hạn được cải thiện.
Quy trình diễn ra như sau: cơ sở dữ liệu lưu trữ nội dung. Lớp ORM của Strapi (xây dựng trên Knex.js) truy vấn dữ liệu đó. Lớp API phơi bày các endpoint REST và GraphQL. Các frontend của bạn, dù là Next.js, Nuxt, Astro, Gatsby hay ứng dụng di động, sẽ fetch JSON từ các endpoint đó. Bản thân Strapi không bao giờ render HTML cho người dùng cuối.
Kho lưu trữ GitHub của Strapi có hơn 65.000 sao, khiến nó trở thành một trong những dự án CMS mã nguồn mở phổ biến nhất trên nền tảng này.
Có gì mới trong Strapi 5?
Strapi 5 là một bản viết lại lớn, thay thế Entity Service API bằng Document Service API mới, chuyển từ Webpack sang Vite cho việc build bảng điều khiển admin, và đưa TypeScript trở thành ngôn ngữ mặc định cho các dự án mới. Đây không phải là các bản cập nhật tăng dần; kiến trúc nội bộ đã thay đổi đáng kể, như được mô tả chi tiết trên trang tổng quan Strapi 5.
Dưới đây là những thay đổi quan trọng nhất đối với nhà phát triển, theo nhật ký thay đổi dành cho nhà phát triển Strapi 5:
- Document Service API thay thế Entity Service API, chữ ký phương thức sạch hơn, kiểu TypeScript tốt hơn, giao diện thống nhất cho các thao tác CRUD
- Cải tiến Draft & Publish, hệ thống hai tab trong bảng điều khiển admin tách biệt trạng thái nháp và đã xuất bản
- Lịch sử nội dung (Content History), xem và khôi phục các phiên bản trước của bất kỳ mục nhập nào trực tiếp từ admin
- Tính năng xem trước (Preview), xem trước nội dung trên frontend thực tế trước khi xuất bản, cấu hình theo từng loại nội dung
- Vite thay thế Webpack, tốc độ build bảng điều khiển admin nhanh hơn đáng kể (chúng tôi thấy cải thiện ~60% thời gian build)
- Tiếp cận TypeScript-first, các dự án mới được khởi tạo với TypeScript theo mặc định
- Trình xây dựng Content-Type AI, tạo lược đồ nội dung từ mô tả ngôn ngữ tự nhiên hoặc thiết kế Figma. Tính năng này mới có trong năm 2026 và chưa có headless CMS nào khác cung cấp
- Phản hồi API đơn giản hóa, cấu trúc JSON phẳng hơn cho cả REST và GraphQL
- Plugin SDK mới, API tinh gọn để xây dựng và phân phối plugin Strapi
| Tính năng | Strapi 4 | Strapi 5 |
|---|---|---|
| Service API | Entity Service | Document Service |
| Bundler | Webpack | Vite |
| Ngôn ngữ mặc định | JavaScript | TypeScript |
| Hệ thống Nháp | Một nút bật/tắt | Hai tab (nháp/đã xuất bản) |
| Lịch sử nội dung | Cần plugin | Tích hợp sẵn |
| Xem trước Frontend | Không khả dụng | Native preview API |
| Định dạng phản hồi API | Lồng ghép sâu | Cấu trúc phẳng |
| Tạo lược đồ | Chỉ thủ công | AI + thủ công |
Cách cài đặt và thiết lập Strapi 5
Việc thiết lập một dự án Strapi 5 mất khoảng hai phút. Bạn cần Node.js 18 trở lên, và npm, yarn hoặc pnpm. Strapi khởi tạo một dự án đầy đủ với bảng điều khiển admin, kết nối cơ sở dữ liệu và lớp API chỉ từ một lệnh duy nhất, như được ghi trong hướng dẫn Bắt đầu nhanh của Strapi.
Điều kiện tiên quyết
- Node.js 18+ (khuyên dùng 20 LTS)
- npm 6+, yarn hoặc pnpm
- Cơ sở dữ liệu: SQLite hoạt động ngay lập tức cho phát triển; PostgreSQL cho production
Tạo dự án đầu tiên của bạn
npx create-strapi@latest my-project
# Interactive prompts:
# ? Choose your preferred language: TypeScript
# ? Choose your default database client: sqlite
# ? Start with an example structure?: Yes (recommended for first-timers)
cd my-project
npm run developStrapi khởi động tại http://localhost:1337. Lần truy cập đầu tiên sẽ nhắc bạn tạo tài khoản admin. Sau đó, bạn sẽ vào bảng điều khiển admin, sẵn sàng xây dựng các loại nội dung.
Tổng quan cấu trúc dự án
my-project/
├── config/
│ ├── database.ts # Database connection
│ ├── server.ts # Host, port, app keys
│ ├── admin.ts # Admin panel config
│ └── plugins.ts # Plugin configuration
├── src/
│ ├── api/ # Your content types live here
│ │ └── article/
│ │ ├── content-types/
│ │ │ └── article/schema.json
│ │ ├── controllers/article.ts
│ │ ├── routes/article.ts
│ │ └── services/article.ts
│ ├── plugins/ # Custom plugins
│ └── index.ts # App bootstrap/lifecycle
├── public/ # Static files
├── .env # Environment variables
└── package.jsonMỗi loại nội dung có thư mục riêng dưới src/api/ với các tệp schema, controller, route và service. Strapi tự động tạo các tệp này khi bạn tạo loại nội dung thông qua bảng điều khiển admin, nhưng bạn cũng có thể tạo chúng thủ công.
Xây dựng Content Types và Quản lý Nội dung
Content Types là trái tim của Strapi, chúng định nghĩa lược đồ dữ liệu và tự động tạo các endpoint API, biểu mẫu bảng điều khiển admin và bảng cơ sở dữ liệu. Strapi hỗ trợ hai loại chính: Collection Types (như bài đăng blog hoặc sản phẩm, nơi bạn có nhiều mục nhập) và Single Types (như trang chủ hoặc cài đặt trang web, nơi chỉ tồn tại một mục nhập).
Hướng dẫn sử dụng Content-Type Builder
Content-Type Builder trong bảng điều khiển admin của Strapi cho phép bạn định nghĩa lược đồ một cách trực quan. Bạn chọn các loại trường: Text, Rich Text, Media, Number, Boolean, Relation, Component, Dynamic Zone, JSON, v.v., và Strapi sẽ viết tệp schema cho bạn.
Dưới đây là giao diện của schema loại nội dung Article bên dưới:
{
"kind": "collectionType",
"collectionName": "articles",
"info": {
"singularName": "article",
"pluralName": "articles",
"displayName": "Article"
},
"attributes": {
"title": {
"type": "string",
"required": true
},
"slug": {
"type": "uid",
"targetField": "title"
},
"content": {
"type": "richtext"
},
"coverImage": {
"type": "media",
"allowedTypes": ["images"]
},
"category": {
"type": "relation",
"relation": "manyToOne",
"target": "api::category.category"
},
"publishedAt": {
"type": "datetime"
}
}
}Bạn cũng có thể sử dụng trình xây dựng Content-Type AI mới để tạo lược đồ từ mô tả tiếng Anh đơn giản như "Tôi cần một blog với các bài viết có tiêu đề, slug, nội dung rich text, ảnh bìa và danh mục." Strapi tạo JSON schema và tạo bảng cơ sở dữ liệu. Nó thực sự hữu ích cho việc tạo mẫu nhanh.
Components và Dynamic Zones
Components là các nhóm trường có thể tái sử dụng. Hãy nghĩ về chúng như các component React nhưng dành cho cấu trúc nội dung. Một component "SEO" với các trường metaTitle, metaDescription và canonicalUrl có thể được gắn vào bất kỳ loại nội dung nào.
Dynamic Zones đi xa hơn nữa, chúng cho phép biên tập viên nội dung chọn từ danh sách các component để xây dựng bố cục trang linh hoạt. Một trang landing page có thể có một component Hero, sau đó là Features Grid, rồi Testimonials Slider, tất cả đều do biên tập viên chọn và sắp xếp thứ tự. Mô hình này phổ biến cho các trang web marketing nơi mỗi trang có cấu trúc khác nhau.
Quản lý nội dung với Draft & Publish
Strapi 5 đã đại tu hệ thống Draft & Publish. Thay vì một nút bật/tắt duy nhất, giờ đây bạn có hai tab riêng biệt trong Content Manager, một cho phiên bản nháp, một cho đã xuất bản. Biên tập viên có thể tự do sửa đổi bản nháp mà không ảnh hưởng đến nội dung đang live. Khi sẵn sàng, họ xuất bản, và bản nháp trở thành phiên bản đã xuất bản mới. Content History cho phép bạn quay lại bất kỳ trạng thái trước đó nào nếu có sự cố.
Làm việc với Strapi API (REST và GraphQL)
Strapi tự động tạo cả endpoint REST và GraphQL cho mọi loại nội dung bạn tạo. REST API khả dụng ngay lập tức, không cần cấu hình. GraphQL yêu cầu kích hoạt plugin tích hợp sẵn nhưng chỉ mất khoảng 30 giây để thiết lập. Cả hai API đều hỗ trợ lọc, sắp xếp, phân trang, chọn trường và populate relation, theo tài liệu REST API của Strapi.
Truy vấn REST API
Mọi collection type đều có các endpoint tại /api/{pluralName}. Dưới đây là cách fetch các bài viết với bộ lọc và populate relations:
// Fetch published articles, sorted by date, with category populated
const response = await fetch(
'http://localhost:1337/api/articles?' + new URLSearchParams({
'filters[publishedAt][$notNull]': 'true',
'sort': 'publishedAt:desc',
'populate': 'category,coverImage',
'pagination[page]': '1',
'pagination[pageSize]': '10',
'fields[0]': 'title',
'fields[1]': 'slug',
'fields[2]': 'publishedAt'
}),
{
headers: {
'Authorization': `Bearer ${API_TOKEN}`
}
}
);
const { data, meta } = await response.json();
// data: array of articles
// meta.pagination: { page, pageSize, pageCount, total }Strapi 5 đã làm phẳng định dạng phản hồi. Trong v4, bạn phải đào sâu qua data.attributes.title. Trong v5, nó chỉ là data.title. Thay đổi nhỏ, nhưng cải thiện lớn về trải nghiệm.
Thiết lập và truy vấn GraphQL
Kích hoạt GraphQL bằng cách cài đặt plugin:
npm run strapi install graphqlSau đó truy vấn tại /graphql:
query GetArticles {
articles(
filters: { publishedAt: { notNull: true } }
sort: "publishedAt:desc"
pagination: { page: 1, pageSize: 10 }
) {
title
slug
publishedAt
category {
name
}
coverImage {
url
alternativeText
}
}
}GraphQL đặc biệt hữu ích khi frontend của bạn cần các relation lồng ghép sâu. Thay vì nhiều lệnh gọi REST với các tham số populate khác nhau, một truy vấn GraphQL duy nhất lấy chính xác những gì bạn cần.
Fetch nội dung Strapi trong Next.js
Dưới đây là ví dụ thực tế về việc fetch nội dung Strapi trong một trang Next.js App Router, đây là một trong những cặp đôi Strapi + framework frontend phổ biến nhất:
// app/blog/page.tsx
async function getArticles() {
const res = await fetch(
`${process.env.STRAPI_URL}/api/articles?populate=category,coverImage&sort=publishedAt:desc`,
{
headers: {
Authorization: `Bearer ${process.env.STRAPI_TOKEN}`,
},
next: { revalidate: 60 }, // ISR: revalidate every 60 seconds
}
);
if (!res.ok) throw new Error('Failed to fetch articles');
const { data } = await res.json();
return data;
}
export default async function BlogPage() {
const articles = await getArticles();
return (
<main>
{articles.map((article) => (
<article key={article.documentId}>
<h2>{article.title}</h2>
<span>{article.category?.name}</span>
</article>
))}
</main>
);
}Lưu ý documentId trong v5 -- nó thay thế id số từ v4. Đây là một trong những chi tiết di chuyển có thể gây lỗi nếu bạn bỏ sót.
Custom Controllers, Services và Routes trong Strapi
Custom controllers là nơi Strapi thực sự tách biệt khỏi các nền tảng headless CMS SaaS như Contentful hoặc Sanity. Vì Strapi chạy trên máy chủ của bạn dưới dạng ứng dụng Node.js, bạn có thể ghi đè bất kỳ endpoint tự động tạo nào bằng logic nghiệp vụ riêng, xác thực đầu vào, biến đổi dữ liệu, gọi API bên ngoài, kích hoạt thông báo, bất cứ điều gì bạn làm trong ứng dụng Express.js. Tôi nhận thấy đây là tính năng khiến các đội nhóm chọn Strapi thay vì các giải pháp lưu trữ sẵn.
Tài liệu về Controllers của Strapi bao gồm toàn bộ API. Dưới đây là các mẫu tôi sử dụng nhiều nhất, dựa trên các ví dụ service và controller chính thức.
Mở rộng Core Controllers
Strapi cung cấp factory createCoreController. Bạn mở rộng nó bằng cách ghi đè các hành động cụ thể (find, findOne, create, update, delete) trong khi giữ nguyên phần còn lại của hành vi tự động tạo:
// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreController(
'api::article.article',
({ strapi }) => ({
// Override the default find to add custom filtering
async find(ctx) {
// Validate and sanitize the incoming query
const sanitizedQuery = await this.sanitizeQuery(ctx);
// Add your custom logic -- e.g., only return articles
// that belong to the authenticated user's organization
const user = ctx.state.user;
if (user?.organization) {
sanitizedQuery.filters = {
...sanitizedQuery.filters,
organization: user.organization.id,
};
}
const { results, pagination } = await strapi
.service('api::article.article')
.find(sanitizedQuery);
const sanitizedResults = await this.sanitizeOutput(results, ctx);
return this.transformResponse(sanitizedResults, { pagination });
},
})
);Viết Custom Services
Services chứa logic nghiệp vụ có thể tái sử dụng mà controllers (và các services khác) có thể gọi. Hãy giữ controllers mỏng và services dày:
// src/api/article/services/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreService(
'api::article.article',
({ strapi }) => ({
// Custom method: publish article and notify subscribers
async publishAndNotify(documentId: string) {
const article = await strapi.documents('api::article.article').update({
documentId,
data: { publishedAt: new Date() },
status: 'published',
});
// Call an external notification service
const subscribers = await strapi
.service('api::subscriber.subscriber')
.find({ filters: { active: true } });
await Promise.allSettled(
subscribers.results.map((sub) =>
fetch(process.env.NOTIFICATION_WEBHOOK, {
method: 'POST',
body: JSON.stringify({
email: sub.email,
article: article.title,
}),
})
)
);
return article;
},
})
);Thêm Custom Routes
Đăng ký custom routes cùng với các CRUD routes tự động tạo:
// src/api/article/routes/custom-article.ts
export default {
routes: [
{
method: 'POST',
path: '/articles/:id/publish-notify',
handler: 'article.publishAndNotify',
config: {
policies: ['admin::isAuthenticatedAdmin'],
},
},
],
};Sau đó thêm handler vào controller của bạn:
async publishAndNotify(ctx) {
const { id } = ctx.params;
const article = await strapi
.service('api::article.article')
.publishAndNotify(id);
return this.transformResponse(article);
}Loại tùy chỉnh backend này đơn giản là không thể thực hiện với Contentful hoặc Sanity, bạn sẽ cần một hàm serverless riêng hoặc lớp middleware. Với Strapi, tất cả nằm trong một codebase.
Hệ sinh thái Plugin và Tự xây dựng Plugin
Chợ plugin của Strapi có hơn 500 plugin bao gồm mọi thứ từ metadata SEO đến thanh toán Stripe. Một số là chính thức (được duy trì bởi đội ngũ Strapi), số khác do cộng đồng xây dựng. Chất lượng khác nhau, giống như các gói npm, vì vậy hãy kiểm tra số sao GitHub, các commit gần đây và khả năng tương thích với Strapi 5 trước khi cài đặt.
Các Plugin thiết yếu
Những plugin này đi kèm với Strapi hoặc chỉ cần một lệnh cài đặt:
- GraphQL, thêm endpoint
/graphqlvà GraphQL Playground - i18n, hỗ trợ quốc tế hóa với các biến thể nội dung dựa trên locale
- Users & Permissions, xác thực, vai trò, quyền truy cập API công khai/đã xác thực
- Upload, thư viện media với lưu trữ local, AWS S3 hoặc nhà cung cấp Cloudinary
- Email, email giao dịch qua SendGrid, Mailgun, Amazon SES hoặc SMTP
Các plugin cộng đồng đáng xem: @strapi/plugin-seo (thẻ meta và social cards), strapi-plugin-sitemap (XML sitemaps tự động tạo) và strapi-plugin-content-versioning (kiểm soát phiên bản chi tiết vượt xa Content History tích hợp sẵn).
Xây dựng Plugin tùy chỉnh (Strapi 5 SDK)
Strapi 5 giới thiệu Plugin SDK mới giúp đơn giản hóa việc phát triển plugin. Hướng dẫn plugin chính thức hướng dẫn toàn bộ quy trình, nhưng tóm tắt là:
- Chạy
npx @strapi/sdk-plugin init my-pluginđể khởi tạo - Định nghĩa content types, controllers và giao diện bảng điều khiển admin của plugin
- Build với
npm run buildvà publish lên npm
Quyết định giữa việc xây dựng plugin hay viết custom controller phụ thuộc vào khả năng tái sử dụng. Nếu logic dành riêng cho dự án, hãy dùng controller. Nếu bạn muốn chia sẻ nó across các dự án hoặc với cộng đồng, hãy đóng gói nó thành plugin.
Cấu hình Cơ sở dữ liệu: PostgreSQL, MySQL hay SQLite?
Strapi hỗ trợ PostgreSQL, MySQL, MariaDB và SQLite ngay từ đầu. SQLite được mặc định cho các dự án mới vì nó không yêu cầu thiết lập, rất tuyệt cho phát triển và tạo mẫu. Cho production, PostgreSQL là lựa chọn được khuyến nghị và là cơ sở dữ liệu mà đội ngũ Strapi kiểm thử kỹ lưỡng nhất.
Dưới đây là cấu hình PostgreSQL sẵn sàng cho production:
// config/database.ts
export default ({ env }) => ({
connection: {
client: 'postgres',
connection: {
host: env('DATABASE_HOST', 'localhost'),
port: env.int('DATABASE_PORT', 5432),
database: env('DATABASE_NAME', 'strapi'),
user: env('DATABASE_USERNAME', 'strapi'),
password: env('DATABASE_PASSWORD', ''),
ssl: env.bool('DATABASE_SSL', false) && {
rejectUnauthorized: env.bool('DATABASE_SSL_REJECT', true),
},
},
pool: {
min: env.int('DATABASE_POOL_MIN', 2),
max: env.int('DATABASE_POOL_MAX', 10),
},
},
});Nếu bạn đang cân nhắc các lựa chọn cơ sở dữ liệu, bài so sánh PostgreSQL vs MySQL của chúng tôi phân tích sâu sự khác biệt.
| Cơ sở dữ liệu | Phù hợp nhất cho | Hỗ trợ Strapi | Sẵn sàng Production? |
|---|---|---|---|
| PostgreSQL | Khối lượng workloads production, truy vấn phức tạp, trường JSON | Chính (kiểm thử nhiều nhất) | Có |
| MySQL 8+ | Các đội nhóm đã có hạ tầng MySQL | Hỗ trợ đầy đủ | Có |
| MariaDB | Lựa chọn thay thế tương thích MySQL | Hỗ trợ đầy đủ | Có |
| SQLite | Phát triển local, tạo mẫu, CI/CD | Hỗ trợ đầy đủ | Không (single-writer, không truy cập đồng thời) |
Đối với các ứng dụng nặng về nội dung với hơn 10.000 mục nhập, PostgreSQL với connection pooling (PgBouncer) xử lý tải tốt. SQLite bắt đầu xuất hiện vấn đề tranh chấp ghi ở vài trăm yêu cầu đồng thời, ổn cho admin blog, nhưng có vấn đề cho API lưu lượng cao.
Triển khai Strapi lên Production
Triển khai production là nơi hầu hết các hướng dẫn Strapi dừng lại, và cũng là nơi nhiều nhà phát triển gặp khó khăn. Strapi cần một máy chủ Node.js liên tục (không phải trang tĩnh), cơ sở dữ liệu, lưu trữ media và cấu hình môi trường phù hợp. Bạn có hai con đường: Strapi Cloud (quản lý) hoặc tự lưu trữ trên các nền tảng như Railway, Render hoặc DigitalOcean, như được phác thảo trong tài liệu Triển khai Strapi.
Strapi Cloud (Quản lý)
Strapi Cloud là tùy chọn lưu trữ chính thức. Nó xử lý cung cấp máy chủ, quản lý cơ sở dữ liệu, CDN và sao lưu. Dưới đây là các gói:
| Gói | Giá | Dự án | API Calls | Ghế | Lưu trữ |
|---|---|---|---|---|---|
| Free | $0/tháng | 1 | 10K/tháng | 1 | 500MB |
| Essential | $18/tháng | 1 | 500K/tháng | 3 | 25GB |
| Pro | $90/tháng | Vô hạn | 2M/tháng | 10 | 100GB |
| Scale | $450/tháng | Vô hạn | 10M/tháng | 25 | 500GB |
Strapi Cloud là con đường nhanh nhất đến production. Nhưng nó vẫn đang trưởng thành so với hosting của Contentful và Sanity, ít region hơn, kiểm soát truy cập ít chi tiết hơn và gói miễn phí khá hạn chế. Đối với dự án phụ hoặc MVP, gói miễn phí hoạt động tốt. Đối với ứng dụng production phục vụ lưu lượng thực, bạn có thể sẽ cần Essential hoặc Pro.
Tự lưu trữ trên Railway hoặc Render
Theo kinh nghiệm của chúng tôi, Railway là con đường nhanh nhất để có một instance Strapi production tự lưu trữ. Bạn kết nối repo GitHub, đặt biến môi trường và Railway xử lý phần còn lại. Để so sánh nền tảng chi tiết, xem bài so sánh Railway vs Render.
Dưới đây là cấu hình môi trường production:
# .env.production
NODE_ENV=production
HOST=0.0.0.0
PORT=1337
# App keys (generate unique values!)
APP_KEYS=key1,key2,key3,key4
API_TOKEN_SALT=your-api-token-salt
ADMIN_JWT_SECRET=your-admin-jwt-secret
JWT_SECRET=your-jwt-secret
TRANSFER_TOKEN_SALT=your-transfer-token-salt
# Database (Railway provides DATABASE_URL automatically)
DATABASE_CLIENT=postgres
DATABASE_HOST=${PGHOST}
DATABASE_PORT=${PGPORT}
DATABASE_NAME=${PGDATABASE}
DATABASE_USERNAME=${PGUSER}
DATABASE_PASSWORD=${PGPASSWORD}
DATABASE_SSL=true
# Media storage (S3-compatible)
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_REGION=us-east-1
AWS_BUCKET=your-strapi-uploadsNếu bạn thích container, bạn có thể Dockerize Strapi và triển khai ở bất cứ đâu, xem hướng dẫn của chúng tôi về các tùy chọn containerization. Railway cũng hỗ trợ Nixpacks để build tự động mà không cần Dockerfile.
Danh sách kiểm tra Production
Trước khi go-live, hãy xác minh các điểm sau:
- Build bảng điều khiển admin: Chạy
npm run build, điều này biên dịch React admin cho production - Process manager: Sử dụng PM2 để giữ Strapi chạy và tự động khởi động lại khi crash
- Health check: Strapi phơi bày
/_health(trả về HTTP 204), trỏ load balancer của bạn vào đó - Lưu trữ media: Chuyển từ upload local sang S3 hoặc Cloudinary, lưu trữ local không tồn tại trên hầu hết các nền tảng PaaS
- Reverse proxy: Đặt Nginx hoặc Caddy trước Strapi để kết thúc SSL và cache file tĩnh
- Biến môi trường: Không bao giờ commit secrets. Sử dụng quản lý biến env gốc của nền tảng
Strapi vs Sanity vs Contentful: Nên chọn cái nào?
Việc lựa chọn giữa Strapi, Sanity và Contentful phụ thuộc vào ba yếu tố: liệu bạn có cần tự lưu trữ hay không, cách đội nhóm của bạn cộng tác trên nội dung và các ràng buộc ngân sách. Cả ba đều là nền tảng headless CMS cấp production, nhưng chúng đưa ra các đánh đổi cơ bản khác nhau. Để tìm hiểu sâu hơn, hãy xem hướng dẫn Sanity CMS và hướng dẫn Contentful.
| Tiêu chí | Strapi | Sanity | Contentful |
|---|---|---|---|
| Mã nguồn mở | Có (MIT) | Không (độc quyền) | Không (độc quyền) |
| Tự lưu trữ | Có (bắt buộc hoặc Cloud) | Không (chỉ lưu trữ) | Không (chỉ lưu trữ) |
| Cộng tác thời gian thực | Không | Có (kiểu Google Docs) | Hạn chế |
| Ngôn ngữ truy vấn | REST + GraphQL | GROQ + GraphQL | REST + GraphQL |
| Gói miễn phí | Community Edition (vô hạn) | 500K API requests/tháng | 5 người dùng, 25K records |
| Logic Backend tùy chỉnh | Truy cập Node.js đầy đủ | Chỉ hàm Serverless | Chỉ Webhooks |
| Quản trị Doanh nghiệp | Đang phát triển | Mạnh | Mạnh nhất |
| Độ khó học | Trung bình (kiến thức Node.js giúp ích) | Trung bình (GROQ độc đáo) | Thấp-Trung bình |
Khung quyết định, chọn dựa trên ràng buộc thực tế của bạn:
| Nếu bạn cần... | Chọn | Vì |
|---|---|---|
| Sở hữu mã nguồn hoàn toàn + tự lưu trữ | Strapi | Lựa chọn mã nguồn mở duy nhất với quyền truy cập backend đầy đủ |
| Cộng tác biên tập thời gian thực | Sanity | Chỉnh sửa đa người dùng kiểu Google Docs |
| Tuân thủ doanh nghiệp (SOC2, HIPAA) | Contentful | Công cụ quản trị và kiểm toán trưởng thành nhất |
| Ngân sách chặt chẽ nhất (đội nhóm nhỏ) | Strapi Community | Miễn phí mãi mãi, tự lưu trữ |
| Quản lý nội dung không cần code | WordPress | Vẫn dễ nhất cho người không phải developer |
| Logic API tùy chỉnh mà không cần dịch vụ bên ngoài | Strapi | Controllers, services và routes trong một codebase |
Tại Techsy, chúng tôi xây dựng các kiến trúc headless CMS sử dụng Strapi, Sanity và Contentful. Nếu bạn cần giúp đỡ chọn CMS phù hợp cho dự án của mình hoặc muốn thiết lập Strapi sẵn sàng cho production, nhận tư vấn miễn phí.
Ưu điểm, Nhược điểm trung thực và Khi nào KHÔNG nên dùng Strapi
Sau khi kiểm thử Strapi 5 trên ba dự án khách hàng, dưới đây là phân tích trung thực. Strapi xuất sắc cho các đội nhóm muốn kiểm soát backend hoàn toàn, nhưng nó không phải công cụ phù hợp cho tất cả mọi người.
Ưu điểm:
- Sở hữu mã nguồn hoàn toàn, dữ liệu của bạn, máy chủ của bạn, quy tắc của bạn
- Giấy phép MIT không bị khóa vào nhà cung cấp
- TypeScript-first trong v5 với suy luận kiểu mạnh mẽ
- Tự động tạo endpoint REST và GraphQL từ lược đồ nội dung
- Cộng đồng tích cực: 65.000+ sao GitHub, Discord với 20.000+ thành viên
- Hơn 500 plugin trong chợ
- Custom controllers mang lại sự linh hoạt backend cấp độ Express.js
- Strapi Cloud cung cấp tùy chọn quản lý nếu bạn không muốn tự lưu trữ
Nhược điểm:
- Tự lưu trữ đòi hỏi công việc vận hành, dự kiến 10-20 giờ/tháng cho cập nhật, giám sát và sao lưu
- Không có cộng tác thời gian thực (hai biên tập viên có thể ghi đè thay đổi của nhau)
- Di chuyển từ Strapi 4 sang 5 có ma sát: Entity Service sang Document Service, định dạng phản hồi mới, khoảng trống tương thích plugin
- Strapi Cloud vẫn đang trưởng thành so với các nền tảng lưu trữ của Contentful hoặc Sanity
- Áp dụng doanh nghiệp nhỏ hơn Contentful, ít chứng nhận tuân thủ hơn
- Tùy chỉnh bảng điều khiển admin, dù khả thi, đòi hỏi kiến thức sâu về API nội bộ của Strapi
Khi nào KHÔNG nên dùng Strapi:
- Cần cộng tác thời gian thực, đội biên tập làm việc đồng thời trên nội dung? Dùng Sanity. Strapi không có chỉnh sửa đa người dùng.
- Cần quản trị doanh nghiệp và SOC2, tổ chức nặng về tuân thủ? Contentful có lợi thế mười năm về công cụ quản trị.
- Đội nhóm không kỹ thuật, không hỗ trợ developer, Strapi yêu cầu developer để thiết lập, triển khai và bảo trì. Nếu đội nhóm toàn marketer, hãy cân nhắc CMS SaaS hoặc WordPress.
- Kiến trúc ưu tiên Serverless, Strapi cần máy chủ liên tục. Nếu bạn xây dựng hoàn toàn trên edge functions và serverless, Sanity hoặc Contentful phù hợp hơn.
FAQ
Strapi là gì và nó hoạt động như thế nào?
Strapi là một headless CMS mã nguồn mở xây dựng trên Node.js. Bạn định nghĩa các loại nội dung thông qua trình xây dựng trực quan hoặc mã, và Strapi tự động tạo các endpoint API REST và GraphQL. Các ứng dụng frontend fetch nội dung dưới dạng JSON từ các endpoint này. Bảng điều khiển admin cung cấp giao diện dựa trên React để biên tập viên nội dung quản lý các mục nhập mà không cần viết code.
Strapi có miễn phí không?
Có. Strapi Community Edition miễn phí và mã nguồn mở theo giấy phép MIT. Bạn có thể tự lưu trữ nó trên máy chủ riêng mà không giới hạn sử dụng, không giới hạn số ghế và không giới hạn API call. Strapi Cloud (tùy chọn lưu trữ quản lý) có gói miễn phí với 10.000 API calls/tháng, với các gói trả phí bắt đầu từ $18/tháng cho giới hạn cao hơn.
Sự khác biệt giữa Strapi và Contentful là gì?
Strapi là mã nguồn mở và tự lưu trữ, cho bạn quyền truy cập mã nguồn đầy đủ và sở hữu dữ liệu. Contentful là nền tảng SaaS độc quyền với khả năng quản trị doanh nghiệp mạnh hơn, chứng nhận tuân thủ và bộ công cụ biên tập lớn hơn. Chọn Strapi để kiểm soát code và linh hoạt ngân sách. Chọn Contentful cho nhu cầu tuân thủ doanh nghiệp và các đội biên tập lớn cần hạ tầng được quản lý.
Strapi có tốt cho người mới bắt đầu không?
Strapi thân thiện với người mới bắt đầu nếu bạn có kiến thức cơ bản về Node.js và JavaScript. Bảng điều khiển admin và Content-Type Builder trực quan và dễ sử dụng, không cần code để mô hình hóa nội dung. Triển khai và logic backend tùy chỉnh đòi hỏi kinh nghiệm developer. Đối với người mới hoàn toàn không có nền tảng coding, WordPress hoặc CMS SaaS được quản lý hoàn toàn sẽ là điểm khởi đầu dễ dàng hơn.
Strapi sử dụng cơ sở dữ liệu nào?
Strapi hỗ trợ PostgreSQL, MySQL, MariaDB và SQLite. Các dự án mới mặc định dùng SQLite để phát triển không cần thiết lập. PostgreSQL được khuyến nghị cho workloads production, nó là cơ sở dữ liệu được kiểm thử nhiều nhất với Strapi và xử lý tốt truy cập đồng thời, truy vấn phức tạp và các loại trường JSON. Bạn cấu hình kết nối cơ sở dữ liệu trong config/database.ts.
Làm thế nào để triển khai Strapi lên production?
Bạn có thể triển khai Strapi lên Strapi Cloud (lưu trữ quản lý bắt đầu từ $18/tháng), hoặc tự lưu trữ trên các nền tảng như Railway, Render, DigitalOcean hoặc AWS. Tự lưu trữ yêu cầu cấu hình máy chủ Node.js, cơ sở dữ liệu PostgreSQL, biến môi trường, lưu trữ media (S3 hoặc Cloudinary) và process manager như PM2. Chạy npm run build trước khi triển khai để biên dịch bảng điều khiển admin.
Strapi có tốt hơn WordPress không?
Strapi và WordPress giải quyết các vấn đề khác nhau. Strapi là headless CMS phục vụ JSON APIs cho bất kỳ frontend nào, lý tưởng cho developer xây dựng ứng dụng tùy chỉnh, phân phối nội dung đa nền tảng hoặc các trang web nặng JavaScript. WordPress là CMS truyền thống render trang HTML, tốt hơn cho người dùng không kỹ thuật muốn themes, trình xây dựng kéo-thả và hệ sinh thái plugin khổng lồ mà không cần viết code.
Nhược điểm của Strapi là gì?
Nhược điểm chính là gánh nặng vận hành từ việc tự lưu trữ (cập nhật, giám sát, sao lưu), thiếu cộng tác thời gian thực cho đội biên tập, ma sát di chuyển giữa các phiên bản lớn (v4 sang v5 yêu cầu thay đổi code) và offering doanh nghiệp kém trưởng thành hơn so với Contentful. Strapi Cloud giải quyết gánh nặng lưu trữ nhưng vẫn đang bắt kịp về tính năng và khả năng sẵn sàng toàn cầu.
Strapi có thể xử lý ứng dụng quy mô lớn không?
Có. Strapi có thể xử lý ứng dụng quy mô lớn với hạ tầng phù hợp: PostgreSQL với connection pooling, mở rộng ngang phía sau load balancer, CDN cho tài nguyên media và Redis cho caching. Các công ty như IBM, NASA và Toyota sử dụng Strapi trong production. Điểm nghẽn thường là hiệu suất cơ sở dữ liệu và cấu hình lưu trữ, không phải bản thân Strapi.
Strapi Cloud là gì và giá bao nhiêu?
Strapi Cloud là nền tảng lưu trữ quản lý chính thức cho các dự án Strapi. Nó xử lý cung cấp máy chủ, quản lý cơ sở dữ liệu, CDN và sao lưu tự động. Giá bắt đầu với gói miễn phí (1 dự án, 10K API calls/tháng), sau đó là Essential ở $18/tháng, Pro ở $90/tháng và Scale ở $450/tháng. Mỗi gói tăng giới hạn API call, số ghế đội nhóm và dung lượng lưu trữ.