
Strapi نظام إدارة محتوى مفتوح المصدر يعمل بـ Node.js، يمنحك سيطرة كاملة على الـ API، وقاعدة البيانات، وبيئة النشر. بعكس المنصات المُستضافة التي تدفع فيها مقابل الوصول إلى بنية تحتية يملكها شخص آخر، يعمل Strapi على خوادمك الخاصة، ويُنشئ نقاط نهاية REST وGraphQL من مخططات المحتوى تلقائياً، ويتيح لك تخصيص كل طبقة من طبقات الواجهة الخلفية بـ JavaScript أو TypeScript.
هذا الدليل يُغطي Strapi 5 تحديداً — من أول أمر npx create-strapi حتى النشر على Railway أو Strapi Cloud. جميع أمثلة الكود جاهزة للنسخ والاستخدام ومُختبرة على Strapi 5.x.
| الحقل | القيمة |
|---|---|
| النوع | نظام إدارة محتوى headless مفتوح المصدر |
| اللغة | JavaScript / TypeScript (Node.js) |
| الإصدار الحالي | Strapi 5 |
| الرخصة | MIT (مجتمعية) / خاصة (مؤسسية) |
| قواعد البيانات المدعومة | PostgreSQL، MySQL، MariaDB، SQLite |
| أنواع الـ API | REST + GraphQL (كلاهما مدمج) |
| الاستضافة | ذاتية أو Strapi Cloud |
| تسعير السحابة | طبقة مجانية، ثم 18$/شهر+ |
| نجوم GitHub | +65,000 |
| الأنسب لـ | الفرق التي تريد ملكية كاملة للكود وتخصيص الـ API |
ما هو Strapi وكيف يعمل؟
Strapi نظام إدارة محتوى مُستضاف ذاتياً يضع الـ API في مقدمة أولوياته، ويفصل الواجهة الخلفية للمحتوى عن الواجهة الأمامية. تُعرّف مخططات المحتوى من خلال منشئ بصري أو بالكود، وينشئ Strapi تلقائياً نقاط نهاية CRUD لكل من REST وGraphQL يمكن لأي إطار عمل للواجهة الأمامية استهلاكها. لوحة الإدارة هي واجهة React يُنشئ فيها محررو المحتوى المدخلات ويديرونها دون لمس الكود، وفق ما تنص عليه توثيق Strapi الرسمي.
نظام إدارة المحتوى Headless مقابل التقليدي
نظام إدارة المحتوى التقليدي كـ WordPress يربط محتواك بطبقة العرض. تعيش مشاركات مدونتك وصفحاتك وملفاتك الإعلامية في نفس النظام الذي يُصيّر HTML للزوار. يسير هذا بشكل جيد حتى تحتاج إلى نفس المحتوى في تطبيق جوال وموقع تسويقي مصغّر وبوابة توثيق في الوقت ذاته.
نظام إدارة المحتوى الـ headless يتخلى تماماً عن الواجهة الأمامية. يخزّن Strapi محتواك ويُقدّمه بصيغة JSON عبر نقاط نهاية API. موقعك Next.js وتطبيق React Native وداشبورد إنترنت الأشياء — كلها تسحب من نفس الواجهة الخلفية Strapi. مصدر حقيقة واحد، مستهلكون متعددون.
إن كنت تُقيّم خيارات غير Strapi، تجدها في مقارنتنا لأنظمة إدارة المحتوى الـ headless جنباً إلى جنب.
معمارية Strapi
مكدّس Strapi واضح: خادم Node.js يقع بين قاعدة بياناتك (PostgreSQL أو MySQL أو SQLite) وتطبيقات واجهتك الأمامية. لوحة الإدارة — تطبيق React وحيد الصفحة — تتصل بنفس الـ API الذي تستخدمه الواجهات الأمامية، لكن بصلاحيات أعلى.
إليك التدفق: قاعدة بياناتك تحتضن المحتوى. طبقة ORM في Strapi (المبنية على Knex.js) تستعلم منها. طبقة الـ API تكشف نقاط نهاية REST وGraphQL. واجهاتك الأمامية — سواء كانت Next.js أو Nuxt أو Astro أو Gatsby أو تطبيق جوال — تجلب JSON من تلك النقاط. Strapi نفسه لا يُصيّر HTML للمستخدمين النهائيين قط.
يمتلك مستودع Strapi على GitHub أكثر من 65,000 نجمة، مما يجعله من أكثر مشاريع CMS مفتوح المصدر شعبية على المنصة.
ما الجديد في Strapi 5؟
Strapi 5 إعادة كتابة جذرية تستبدل Entity Service API بـ Document Service API الجديدة، وتنتقل من Webpack إلى Vite لبناء لوحة الإدارة، وتُدخل TypeScript كلغة افتراضية للمشاريع الجديدة. هذه ليست تحديثات تدريجية — تغيّرت المعمارية الداخلية بشكل كبير، كما يوضح صفحة نظرة عامة على Strapi 5.
إليك التغييرات الأكثر أهمية للمطورين، وفق سجل تغييرات Strapi 5 للمطورين:
- Document Service API تحلّ محل Entity Service API — توقيعات وظائف أنظف، أنواع TypeScript أفضل، واجهة موحدة لعمليات CRUD
- إعادة تصميم Draft & Publish — نظام ذو تبويبين في لوحة الإدارة يفصل بين حالتَي المسودة والمنشور
- Content History — عرض الإصدارات السابقة لأي مدخل واستعادتها مباشرة من لوحة الإدارة
- ميزة المعاينة — معاينة المحتوى في واجهتك الأمامية الفعلية قبل النشر، تُضبط لكل نوع محتوى
- Vite يحل محل Webpack — بناءات لوحة الإدارة أسرع ملحوظاً (شهدنا تحسناً ~60% في أوقات البناء)
- نهج TypeScript أولاً — المشاريع الجديدة تُنشأ بـ TypeScript افتراضياً
- AI Content-Type Builder — توليد مخططات المحتوى من أوصاف باللغة الطبيعية أو تصاميم Figma. هذا جديد في 2026 ولا يُقدّمه أي نظام CMS headless آخر حتى الآن
- استجابات API مبسّطة — بنية JSON أكثر تسطيحاً لكل من REST وGraphQL
- Plugin SDK الجديد — واجهة برمجية مُبسّطة لبناء إضافات Strapi وتوزيعها
| الميزة | Strapi 4 | Strapi 5 |
|---|---|---|
| خدمة الـ API | Entity Service | Document Service |
| أداة البناء | Webpack | Vite |
| اللغة الافتراضية | JavaScript | TypeScript |
| نظام المسودة | مفتاح تبديل واحد | تبويبان (مسودة/منشور) |
| سجل المحتوى | يحتاج إضافة | مدمج |
| معاينة الواجهة الأمامية | غير متاح | واجهة برمجة معاينة أصلية |
| تنسيق استجابة الـ API | متداخل بعمق | بنية مسطّحة |
| توليد المخطط | يدوي فقط | AI + يدوي |
كيفية تثبيت Strapi 5 وإعداده
إعداد مشروع Strapi 5 يستغرق دقيقتين تقريباً. تحتاج Node.js 18 أو أحدث، وأحد هذه: npm أو yarn أو pnpm. يُنشئ Strapi مشروعاً كاملاً بلوحة إدارة واتصال بقاعدة بيانات وطبقة API من أمر واحد، وفق دليل البدء السريع لـ Strapi.
المتطلبات الأساسية
- Node.js 18+ (يُوصى بـ 20 LTS)
- npm 6+، yarn، أو pnpm
- قاعدة بيانات: SQLite تعمل خارج الصندوق للتطوير؛ PostgreSQL للإنتاج
إنشاء مشروعك الأول
npx create-strapi@latest my-project
# الخيارات التفاعلية:
# ? 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 developيبدأ Strapi على http://localhost:1337. زيارتك الأولى تطلب منك إنشاء حساب مدير. بعدها، أنت في لوحة الإدارة — جاهز لبناء أنواع المحتوى.
نظرة عامة على بنية المشروع
my-project/
├── config/
│ ├── database.ts # اتصال قاعدة البيانات
│ ├── server.ts # المضيف، المنفذ، مفاتيح التطبيق
│ ├── admin.ts # ضبط لوحة الإدارة
│ └── plugins.ts # ضبط الإضافات
├── src/
│ ├── api/ # أنواع المحتوى تعيش هنا
│ │ └── article/
│ │ ├── content-types/
│ │ │ └── article/schema.json
│ │ ├── controllers/article.ts
│ │ ├── routes/article.ts
│ │ └── services/article.ts
│ ├── plugins/ # الإضافات المخصصة
│ └── index.ts # تهيئة التطبيق/دورة حياته
├── public/ # الملفات الثابتة
├── .env # متغيرات البيئة
└── package.jsonكل نوع محتوى يحصل على مجلده الخاص تحت src/api/ مع ملف مخطط ووحدة تحكم ومسار وخدمة. يُنشئها Strapi تلقائياً حين تُنشئ نوع محتوى عبر لوحة الإدارة، لكن يمكنك أيضاً إنشاؤها يدوياً.
بناء أنواع المحتوى وإدارة المحتوى
أنواع المحتوى هي قلب Strapi — تُعرّف مخطط بياناتك وتُنشئ تلقائياً نقاط نهاية API ونماذج لوحة الإدارة وجداول قاعدة البيانات. يدعم Strapi نوعين رئيسيين: أنواع المجموعة (كمشاركات المدونة أو المنتجات، حيث توجد مدخلات متعددة) وأنواع المفرد (كالصفحة الرئيسية أو إعدادات الموقع، حيث توجد مدخلة واحدة فقط).
جولة في Content-Type Builder
يُتيح لك Content-Type Builder في لوحة إدارة Strapi تعريف المخططات بصرياً. تختار أنواع الحقول — نص، نص غني، وسائط، رقم، منطقي، علاقة، مكوّن، منطقة ديناميكية، JSON، وغيرها — ويكتب Strapi ملف المخطط عنك.
إليك ما يبدو عليه مخطط نوع محتوى Article تحت الغطاء:
{
"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"
}
}
}يمكنك أيضاً استخدام AI Content-Type Builder الجديد لتوليد المخططات من وصف باللغة العادية مثل "أحتاج مدونة بمقالات لها عناوين وـ slugs ومحتوى نص غني وصور غلاف وفئات." يُنشئ Strapi مخطط JSON ويُنشئ جدول قاعدة البيانات. مفيد فعلاً للنمذجة السريعة.
المكوّنات والمناطق الديناميكية
المكوّنات مجموعات حقول قابلة لإعادة الاستخدام. فكّر فيها كمكوّنات React لكن لبنية المحتوى. مكوّن "SEO" يحتوي حقول metaTitle وmetaDescription وcanonicalUrl يمكن إرفاقه بأي نوع محتوى.
المناطق الديناميكية تأخذ هذا أبعد — تُتيح لمحرري المحتوى الاختيار من قائمة مكوّنات لبناء تخطيطات صفحات مرنة. قد تحتوي صفحة هبوط على مكوّن Hero، ثم شبكة ميزات، ثم شريط شهادات، كلها تُختار وتُرتّب من قِبل المحرر. هذا النمط شائع في مواقع التسويق حيث لكل صفحة بنية مختلفة.
إدارة المحتوى مع Draft & Publish
أعاد Strapi 5 تصميم نظام Draft & Publish. بدلاً من مفتاح تبديل واحد، الآن لديك تبويبان منفصلان في Content Manager — أحدهما لإصدار المسودة والآخر للمنشور. يمكن للمحررين تعديل المسودة بحرية دون التأثير على المحتوى المباشر. حين يكونون جاهزين، ينشرون، وتصبح المسودة الإصدار المنشور الجديد. Content History يتيح لك الرجوع لأي حالة سابقة إن أخطأت.
العمل مع Strapi API (REST وGraphQL)
يُنشئ Strapi تلقائياً نقاط نهاية REST وGraphQL لكل نوع محتوى تُنشئه. REST API متاح فوراً — لا حاجة لأي ضبط. GraphQL يتطلب تفعيل الإضافة المدمجة لكنه يستغرق 30 ثانية للإعداد. كلا الـ API يدعم التصفية والترتيب والترقيم واختيار الحقول وتعبئة العلاقات، وفق توثيق Strapi REST API.
استعلامات REST API
كل نوع مجموعة يحصل على نقاط نهاية عند /api/{pluralName}. إليك كيفية جلب المقالات مع فلاتر وتعبئة علاقات:
// جلب المقالات المنشورة، مرتبة حسب التاريخ، مع تعبئة الفئة
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: مصفوفة من المقالات
// meta.pagination: { page, pageSize, pageCount, total }Strapi 5 سطّح تنسيق الاستجابة. في الإصدار 4، كنت تحفر عبر data.attributes.title. في الإصدار 5، هو ببساطة data.title. تغيير صغير، تحسين كبير في جودة الحياة.
إعداد GraphQL والاستعلامات
فعّل GraphQL بتثبيت الإضافة:
npm run strapi install graphqlثم استعلم عند /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 مفيد بشكل خاص حين تحتاج واجهتك الأمامية إلى علاقات متداخلة عميقاً. بدلاً من استدعاءات REST متعددة بمعاملات populate مختلفة، استعلام GraphQL واحد يجلب ما تحتاجه بالضبط.
جلب محتوى Strapi في Next.js
إليك مثالاً عملياً لجلب محتوى Strapi في صفحة Next.js App Router — هذا أحد أكثر أزواج Strapi وإطار العمل للواجهة الأمامية شيوعاً:
// 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: إعادة التحقق كل 60 ثانية
}
);
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>
);
}لاحظ documentId في الإصدار 5 — يحلّ محل الرقمي id من الإصدار 4. هذه إحدى تفاصيل الترحيل التي ستُعاني منها إن أغفلتها.
وحدات التحكم والخدمات والمسارات المخصصة في Strapi
وحدات التحكم المخصصة هي المكان الذي يُميّز Strapi فعلاً عن منصات CMS headless كـ Contentful أو Sanity. لأن Strapi يعمل على خادمك كتطبيق Node.js، يمكنك تجاوز أي نقطة نهاية مُولَّدة تلقائياً بمنطق عملك الخاص — التحقق من المدخلات، تحويل البيانات، استدعاءات API خارجية، مشغّلات الإشعارات، أي شيء تفعله في تطبيق Express.js. وجدت أن هذه هي الميزة التي تجعل الفرق تختار Strapi على البدائل المُستضافة.
يُغطي توثيق Strapi Controllers الـ API الكامل. إليك الأنماط التي أستخدمها أكثر، استناداً لـ أمثلة الخدمات ووحدات التحكم الرسمية.
توسيع وحدات التحكم الأساسية
يُوفّر Strapi مصنع createCoreController. تُوسّعه بتجاوز إجراءات محددة (find وfindOne وcreate وupdate وdelete) مع الإبقاء على بقية السلوك المُولَّد تلقائياً:
// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreController(
'api::article.article',
({ strapi }) => ({
// تجاوز find الافتراضي لإضافة تصفية مخصصة
async find(ctx) {
// التحقق من الاستعلام الوارد وتطهيره
const sanitizedQuery = await this.sanitizeQuery(ctx);
// أضف منطقك المخصص — مثلاً، إرجاع المقالات
// المنتمية لمنظمة المستخدم المصادق عليه فقط
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 });
},
})
);كتابة خدمات مخصصة
الخدمات تحتضن منطق العمل القابل لإعادة الاستخدام الذي يمكن لوحدات التحكم (والخدمات الأخرى) استدعاؤه. اجعل وحدات التحكم نحيلة وخدماتك سمينة:
// src/api/article/services/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreService(
'api::article.article',
({ strapi }) => ({
// وظيفة مخصصة: نشر المقال وإشعار المشتركين
async publishAndNotify(documentId: string) {
const article = await strapi.documents('api::article.article').update({
documentId,
data: { publishedAt: new Date() },
status: 'published',
});
// استدعاء خدمة إشعار خارجية
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;
},
})
);إضافة مسارات مخصصة
سجّل مسارات مخصصة جنباً إلى جنب مع مسارات CRUD المُولَّدة تلقائياً:
// src/api/article/routes/custom-article.ts
export default {
routes: [
{
method: 'POST',
path: '/articles/:id/publish-notify',
handler: 'article.publishAndNotify',
config: {
policies: ['admin::isAuthenticatedAdmin'],
},
},
],
};ثم أضف المعالج إلى وحدة التحكم:
async publishAndNotify(ctx) {
const { id } = ctx.params;
const article = await strapi
.service('api::article.article')
.publishAndNotify(id);
return this.transformResponse(article);
}هذا النوع من تخصيص الواجهة الخلفية ببساطة مستحيل مع Contentful أو Sanity — ستحتاج دالة serverless منفصلة أو طبقة وسيطة. مع Strapi، كل شيء في قاعدة كود واحدة.
منظومة الإضافات وبناء إضافتك الخاصة
سوق إضافات Strapi يحتوي على 500+ إضافة تغطي كل شيء من بيانات وصفية SEO إلى مدفوعات Stripe. بعضها رسمي (تُصونه فريق Strapi)، والبعض الآخر من بناء المجتمع. الجودة تتفاوت — تماماً كحزم npm — لذا تحقق من نجوم GitHub والـ commits الأخيرة وتوافق Strapi 5 قبل التثبيت.
الإضافات الأساسية
هذه تأتي مع Strapi أو على بُعد أمر تثبيت واحد:
- GraphQL — يضيف نقطة نهاية
/graphqlوـ GraphQL Playground - i18n — دعم التدويل مع متغيرات المحتوى حسب اللغة
- Users & Permissions — المصادقة والأدوار والوصول العام/المصادق عليه للـ API
- Upload — مكتبة الوسائط مع مزودي التخزين المحلي أو AWS S3 أو Cloudinary
- Email — البريد الإلكتروني عبر SendGrid أو Mailgun أو Amazon SES أو SMTP
إضافات مجتمعية تستحق المتابعة: @strapi/plugin-seo (علامات meta والبطاقات الاجتماعية)، strapi-plugin-sitemap (خرائط XML المُولَّدة تلقائياً)، وstrapi-plugin-content-versioning (التحكم الدقيق في الإصدارات ما وراء Content History المدمج).
بناء إضافة مخصصة (Strapi 5 SDK)
قدّم Strapi 5 Plugin SDK جديداً يُبسّط تطوير الإضافات. درس تعليمي رسمي للإضافات يستعرض العملية الكاملة، لكن الخلاصة:
- نفّذ
npx @strapi/sdk-plugin init my-pluginللبناء الهيكلي - عرّف أنواع محتوى إضافتك ووحدات التحكم وواجهة لوحة الإدارة
- ابنِ باستخدام
npm run buildوانشر على npm
القرار بين بناء إضافة مقابل كتابة وحدة تحكم مخصصة يعود إلى إمكانية إعادة الاستخدام. إن كان المنطق خاصاً بالمشروع، استخدم وحدة تحكم. إن أردت مشاركته عبر المشاريع أو مع المجتمع، عبّئه كإضافة.
ضبط قاعدة البيانات: PostgreSQL أم MySQL أم SQLite؟
يدعم Strapi PostgreSQL وMySQL وMariaDB وSQLite خارج الصندوق. SQLite هي الافتراضية للمشاريع الجديدة لأنها لا تحتاج إعداداً — ممتازة للتطوير والنمذجة السريعة. للإنتاج، PostgreSQL هو الاختيار الموصى به والذي يختبر فريق Strapi ضده بأكثر كثافة.
إليك ضبط PostgreSQL جاهز للإنتاج:
// 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),
},
},
});إن كنت تُقيّم خياراتك لقاعدة البيانات، تجد مقارنتنا بين PostgreSQL وMySQL الفروق مُغطّاة بعمق.
| قاعدة البيانات | الأنسب لـ | دعم Strapi | جاهزة للإنتاج؟ |
|---|---|---|---|
| PostgreSQL | أحمال عمل الإنتاج، الاستعلامات المعقدة، حقول JSON | أساسي (الأكثر اختباراً) | نعم |
| MySQL 8+ | الفرق التي تعمل بالفعل على بنية MySQL | دعم كامل | نعم |
| MariaDB | بديل متوافق مع MySQL | دعم كامل | نعم |
| SQLite | التطوير المحلي، النمذجة السريعة، CI/CD | دعم كامل | لا (كاتب واحد، لا وصول متزامن) |
للتطبيقات الغنية بالمحتوى مع 10,000+ مدخلة، تتعامل PostgreSQL مع الضغط مع connection pooling (PgBouncer). تبدأ SQLite في إظهار مشاكل تنازع الكتابة عند بضع مئات من الطلبات المتزامنة — مقبولة لمدير مدونة، إشكالية لـ API عالي الحركة.
نشر Strapi على بيئة الإنتاج
النشر على الإنتاج هو المكان الذي تتوقف فيه معظم أدلة Strapi — وحيث يتعثر معظم المطورين. يحتاج Strapi خادم Node.js مستمراً (ليس موقعاً ثابتاً)، وقاعدة بيانات، وتخزيناً للوسائط، وضبطاً صحيحاً للبيئة. لديك مساران: Strapi Cloud (مُدار) أو الاستضافة الذاتية على منصات مثل Railway أو Render أو DigitalOcean، كما هو موضح في توثيق نشر Strapi.
Strapi Cloud (مُدار)
Strapi Cloud هو خيار الاستضافة الرسمي. يتولى توفير الخوادم وإدارة قاعدة البيانات وشبكة CDN والنسخ الاحتياطية. إليك الطبقات:
| الطبقة | السعر | المشاريع | استدعاءات API | المقاعد | التخزين |
|---|---|---|---|---|---|
| مجاني | 0$/شهر | 1 | 10 آلاف/شهر | 1 | 500 ميغابايت |
| أساسي | 18$/شهر | 1 | 500 آلاف/شهر | 3 | 25 جيجابايت |
| احترافي | 90$/شهر | غير محدود | 2 مليون/شهر | 10 | 100 جيجابايت |
| موسّع | 450$/شهر | غير محدود | 10 ملايين/شهر | 25 | 500 جيجابايت |
Strapi Cloud هو أسرع مسار للإنتاج. لكنه لا يزال يكتسب النضج مقارنة باستضافة Contentful وSanity — مناطق أقل، وضوابط وصول أقل دقة، والطبقة المجانية مقيّدة جداً. للمشاريع الجانبية أو MVPs، الطبقة المجانية تفي بالغرض. للتطبيقات الإنتاجية التي تخدم حركة مرور حقيقية، ستحتاج على الأرجح الطبقة الأساسية أو الاحترافية.
الاستضافة الذاتية على Railway أو Render
من تجربتنا، Railway هو أسرع مسار لنسخة Strapi إنتاجية مُستضافة ذاتياً. تربط مستودع GitHub الخاص بك، تُعيّن متغيرات البيئة، ويتولى Railway الباقي. لمقارنة تفصيلية للمنصات، راجع مقارنتنا بين Railway وRender.
إليك ضبط بيئة الإنتاج:
# .env.production
NODE_ENV=production
HOST=0.0.0.0
PORT=1337
# مفاتيح التطبيق (أنشئ قيماً فريدة!)
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
# قاعدة البيانات (Railway يوفر DATABASE_URL تلقائياً)
DATABASE_CLIENT=postgres
DATABASE_HOST=${PGHOST}
DATABASE_PORT=${PGPORT}
DATABASE_NAME=${PGDATABASE}
DATABASE_USERNAME=${PGUSER}
DATABASE_PASSWORD=${PGPASSWORD}
DATABASE_SSL=true
# تخزين الوسائط (متوافق مع S3)
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_REGION=us-east-1
AWS_BUCKET=your-strapi-uploadsإن كنت تُفضّل الحاويات، يمكنك إنشاء Docker image لـ Strapi ونشره في أي مكان — راجع دليلنا حول خيارات الحاويات. Railway يدعم أيضاً Nixpacks للبناء التلقائي بدون Dockerfile.
قائمة تحقق ما قبل الإنتاج
قبل الإطلاق المباشر، تحقق من هذه النقاط:
- ابنِ لوحة الإدارة: نفّذ
npm run build— هذا يُصرّف لوحة الإدارة React للإنتاج - مدير العمليات: استخدم PM2 للإبقاء على Strapi يعمل وإعادة التشغيل تلقائياً عند الأعطال
- فحص الصحة: Strapi يكشف
/_health(يُعيد HTTP 204) — اجعل موازن الحمل يشير إليه - تخزين الوسائط: انتقل من التحميلات المحلية إلى S3 أو Cloudinary — التخزين المحلي لا يستمر على معظم منصات PaaS
- الوكيل العكسي: ضع Nginx أو Caddy أمام Strapi لإنهاء SSL وتخزين الملفات الثابتة
- متغيرات البيئة: لا تُودع الأسرار في الكود أبداً. استخدم إدارة متغيرات البيئة الأصلية للمنصة
Strapi مقابل Sanity مقابل Contentful: أيها تختار؟
الاختيار بين Strapi وSanity وContentful يعتمد على ثلاثة أشياء: هل تحتاج استضافة ذاتية، كيف تتعاون فرقك على المحتوى، وقيود ميزانيتك. الثلاثة منصات CMS headless جاهزة للإنتاج، لكنها تُجري مقايضات جذرياً مختلفة. لتغطية أعمق، راجع دليلنا لـ Sanity ودليلنا لـ Contentful.
| المعيار | Strapi | Sanity | Contentful |
|---|---|---|---|
| مفتوح المصدر | نعم (MIT) | لا (خاص) | لا (خاص) |
| الاستضافة الذاتية | نعم (مطلوبة أو Cloud) | لا (مُستضاف فقط) | لا (مُستضاف فقط) |
| التعاون الفوري | لا | نعم (على طراز Google Docs) | محدود |
| لغة الاستعلام | REST + GraphQL | GROQ + GraphQL | REST + GraphQL |
| الطبقة المجانية | الإصدار المجتمعي (غير محدود) | 500 ألف طلب API/شهر | 5 مستخدمين، 25 ألف سجل |
| منطق الواجهة الخلفية المخصص | وصول Node.js كامل | دوال serverless فقط | Webhooks فقط |
| حوكمة المؤسسات | في تنامٍ | قوية | الأقوى |
| منحنى التعلم | متوسط (معرفة Node.js مفيدة) | متوسط (GROQ فريد) | منخفض-متوسط |
إطار القرار — اختر بناءً على قيدك الفعلي:
| إن احتجت... | اختر | لأن |
|---|---|---|
| ملكية كاملة للكود + استضافة ذاتية | Strapi | الخيار مفتوح المصدر الوحيد مع وصول كامل للواجهة الخلفية |
| تعاون تحريري فوري | Sanity | تحرير متعدد اللاعبين على طراز Google Docs |
| امتثال مؤسسي (SOC2، HIPAA) | Contentful | أنضج أدوات حوكمة وتدقيق |
| أضيق ميزانية (فريق صغير) | Strapi Community | مجاني للأبد، مُستضاف ذاتياً |
| إدارة محتوى بلا كود | WordPress | الأسهل للمستخدمين غير التقنيين |
| منطق API مخصص بدون خدمات خارجية | Strapi | وحدات التحكم والخدمات والمسارات في قاعدة كود واحدة |
في Techsy، نبني معماريات CMS headless باستخدام Strapi وSanity وContentful. إن احتجت مساعدة في اختيار نظام CMS المناسب لمشروعك أو تريد إعداد Strapi جاهزاً للإنتاج، احصل على استشارة مجانية.
المزايا والعيوب الصريحة ومتى لا تستخدم Strapi
بعد اختبار Strapi 5 في ثلاثة مشاريع عملاء، إليك التقييم الصريح. Strapi ممتاز للفرق التي تريد سيطرة كاملة على الواجهة الخلفية، لكنه ليس الأداة المناسبة للجميع.
المزايا:
- ملكية كاملة للكود — بياناتك، خادمك، قواعدك
- رخصة MIT بدون تبعية لمورّد
- TypeScript أولاً في الإصدار 5 مع استنتاج قوي للأنواع
- نقاط نهاية REST وGraphQL مُولَّدة تلقائياً من مخططات المحتوى
- مجتمع نشط: أكثر من 65,000 نجمة GitHub، Discord مع أكثر من 20,000 عضو
- 500+ إضافة في السوق
- وحدات التحكم المخصصة تمنحك مرونة الواجهة الخلفية بمستوى Express.js
- Strapi Cloud يُقدّم خياراً مُداراً إن لم تُرد الاستضافة الذاتية
العيوب:
- الاستضافة الذاتية تتطلب عمل تشغيلي — توقع 10-20 ساعة/شهر للتحديثات والمراقبة والنسخ الاحتياطية
- لا تعاون فوري (يمكن لمحررَين الكتابة فوق تغييرات بعضهما)
- الترحيل من Strapi 4 إلى 5 به احتكاك: Entity Service إلى Document Service، تنسيقات استجابة جديدة، فجوات توافق الإضافات
- Strapi Cloud لا يزال يكتسب النضج مقارنة بمنصتَي Contentful وSanity المُستضافتين
- تبني مؤسسي أضعف من Contentful — شهادات امتثال أقل
- تخصيص لوحة الإدارة، رغم إمكانيته، يتطلب معرفة عميقة بـ APIs الداخلية لـ Strapi
متى لا تستخدم Strapi:
- تحتاج تعاوناً فورياً — فريقك التحريري يعمل على المحتوى بالتزامن؟ استخدم Sanity. لا يوجد تحرير متعدد اللاعبين في Strapi.
- تحتاج حوكمة مؤسسية وSOC2 — منظمة مشددة على الامتثال؟ Contentful لديها سبقة عقد في أدوات الحوكمة.
- فريق غير تقني، بدون دعم مطور — Strapi يحتاج مطوراً للإعداد والنشر والصيانة. إن كان فريقك كله مسوّقين، فكّر في CMS SaaS أو WordPress.
- معمارية serverless أولاً — Strapi يحتاج خادماً مستمراً. إن كنت تبني كلياً على edge functions وـ serverless، Sanity أو Contentful يناسبان أكثر.
الأسئلة الشائعة
ما هو Strapi وكيف يعمل؟
Strapi نظام إدارة محتوى مفتوح المصدر مبني على Node.js. تُعرّف أنواع المحتوى عبر منشئ بصري أو بالكود، وينشئ Strapi نقاط نهاية API لكل من REST وGraphQL تلقائياً. تطبيقات الواجهة الأمامية تجلب المحتوى بصيغة JSON من هذه النقاط. توفر لوحة الإدارة واجهة React لمحرري المحتوى لإدارة المدخلات دون كتابة كود.
هل Strapi مجاني للاستخدام؟
نعم. Strapi Community Edition مجاني ومفتوح المصدر برخصة MIT. يمكنك استضافته ذاتياً على خادمك الخاص بدون حدود للاستخدام ولا قيود على المقاعد ولا سقف لاستدعاءات API. Strapi Cloud (خيار الاستضافة المُدارة) لديه طبقة مجانية بـ 10,000 استدعاء API شهرياً، مع خطط مدفوعة تبدأ من 18$/شهر لحدود أعلى.
ما الفرق بين Strapi وContentful؟
Strapi مفتوح المصدر ومُستضاف ذاتياً، يمنحك وصولاً كاملاً للكود وملكية البيانات. Contentful منصة SaaS خاصة ذات حوكمة مؤسسية أقوى وشهادات امتثال ومجموعة أدوات تحريرية أكبر. اختر Strapi للسيطرة على الكود والمرونة في الميزانية. اختر Contentful لاحتياجات الامتثال المؤسسي والفرق التحريرية الكبيرة التي تحتاج بنية تحتية مُدارة.
هل Strapi مناسب للمبتدئين؟
Strapi مناسب للمبتدئين إن كانت لديك معرفة أساسية بـ Node.js وJavaScript. لوحة الإدارة وContent-Type Builder بصريان وبديهيان — لا يحتاجان كوداً لنمذجة المحتوى. النشر ومنطق الواجهة الخلفية المخصص يتطلبان خبرة مطور. للمبتدئين المطلقين بلا خلفية برمجية، WordPress أو CMS SaaS مُدار بالكامل سيكونان نقاط بداية أسهل.
ما قاعدة البيانات التي يستخدمها Strapi؟
يدعم Strapi PostgreSQL وMySQL وMariaDB وSQLite. المشاريع الجديدة تفترض SQLite للتطوير بدون إعداد. PostgreSQL موصى بها لأحمال عمل الإنتاج — إنها قاعدة البيانات الأكثر اختباراً مع Strapi وتتعامل جيداً مع الوصول المتزامن والاستعلامات المعقدة وأنواع حقول JSON. تُضبط اتصال قاعدة البيانات في config/database.ts.
كيف تنشر Strapi على الإنتاج؟
يمكنك نشر Strapi على Strapi Cloud (استضافة مُدارة تبدأ من 18$/شهر)، أو الاستضافة الذاتية على منصات مثل Railway وRender وDigitalOcean وAWS. الاستضافة الذاتية تتطلب ضبط خادم Node.js وقاعدة بيانات PostgreSQL ومتغيرات البيئة وتخزين الوسائط (S3 أو Cloudinary) ومدير عمليات مثل PM2. نفّذ npm run build قبل النشر لتصريف لوحة الإدارة.
هل Strapi أفضل من WordPress؟
Strapi وWordPress يحلّان مشاكل مختلفة. Strapi نظام CMS headless يُقدّم JSON APIs لأي واجهة أمامية — مثالي للمطورين الذين يبنون تطبيقات مخصصة أو توصيل محتوى متعدد المنصات أو مواقع ثقيلة JavaScript. WordPress نظام CMS تقليدي يُصيّر صفحات HTML — أفضل للمستخدمين غير التقنيين الذين يريدون قوالب وبنّائين بالسحب والإفلات ومنظومة إضافات ضخمة بدون كتابة كود.
ما عيوب Strapi؟
العيوب الرئيسية هي التكلفة التشغيلية من الاستضافة الذاتية (التحديثات والمراقبة والنسخ الاحتياطية)، وغياب التعاون الفوري للفرق التحريرية، واحتكاك الترحيل بين الإصدارات الرئيسية (من v4 إلى v5 تطلّب تغييرات في الكود)، وعرض مؤسسي أقل نضجاً من Contentful. Strapi Cloud يعالج عبء الاستضافة لكنه لا يزال في مرحلة اللحاق في الميزات والتوافر العالمي.
هل يمكن لـ Strapi التعامل مع التطبيقات الكبيرة الحجم؟
نعم. يمكن لـ Strapi التعامل مع التطبيقات الكبيرة الحجم مع البنية التحتية المناسبة: PostgreSQL مع connection pooling، توسّع أفقي خلف موازن حمل، شبكة CDN للوسائط، وRedis للتخزين المؤقت. تستخدم شركات مثل IBM وNASA وToyota Strapi في الإنتاج. الاختناق عادةً في أداء قاعدة البيانات وضبط الاستضافة، لا في Strapi نفسه.
ما هو Strapi Cloud وكم يكلف؟
Strapi Cloud هو منصة الاستضافة المُدارة الرسمية لمشاريع Strapi. تتولى توفير الخوادم وإدارة قاعدة البيانات وشبكة CDN والنسخ الاحتياطية التلقائية. التسعير يبدأ بطبقة مجانية (مشروع واحد، 10 آلاف استدعاء API/شهر)، ثم أساسي بـ 18$/شهر، احترافي بـ 90$/شهر، وموسّع بـ 450$/شهر. كل طبقة تزيد حدود استدعاءات API ومقاعد الفريق وسعة التخزين.