لماذا الاستضافة الذاتية لـ Payload CMS على خادم VPS
يتبنّى Payload CMS نهجًا يعتمد الشيفرة أوّلًا بشكل جذري: يُعرَّف مخطّط المحتوى الخاص بك بلغة TypeScript في ملفّات الإعداد، ويُصدَّر مع Git، ومنذ إصداره الثالث يُثبَّت Payload مباشرةً داخل تطبيق Next.js عبر App Router. وهذا يعني أنّ خادم VPS يتيح لك استضافة نظام إدارة المحتوى وموقع الواجهة الأمامية في عملية Node واحدة، تتشارك البناء وبيئة التشغيل. تحصل على كتابة أنواع من طرف إلى طرف، وترحيلات للمخطّط تُدار في الشيفرة، ودون أيّ اعتماد على واجهة رسومية لنمذجة محتواك. الاستضافة الذاتية هنا هي الخيار الطبيعي: صُمّم Payload لينشر مثل أيّ تطبيق Next.js، ويمنحك خادم VPS التحكّم في قاعدة البيانات (MongoDB أو PostgreSQL) والملفّات المرفوعة ومتغيّرات البيئة، دون منصّة وسيطة.
الفوائد الملموسة
- مخطّط محتوى مُعرَّف بلغة TypeScript ومُصدَّر مع Git: مراجعة شيفرة وسجلّ كاملان
- نظام إدارة المحتوى وواجهة Next.js الأمامية في بيئة تشغيل واحدة: بناء واحد وعملية واحدة للنشر
- كتابة أنواع من طرف إلى طرف بين إعداد Payload وواجهة API والواجهة الأمامية، دون توليد يدوي
- اختيار قاعدة البيانات: MongoDB أو PostgreSQL عبر المحوّلات الرسمية
- ترحيلات المخطّط مدفوعة بالشيفرة (
payload migrate)، قابلة لإعادة الإنتاج بين البيئات - Local API: وصول مباشر إلى البيانات دون استدعاء HTTP من شيفرة خادم Next.js
المتطلّبات العتادية والبرمجية
بما أنّ Payload يعتمد على Next.js، فإنّ البناء مُتطلِّب: جهّز خادم VPS بمعالجين افتراضيين (2 vCPU) و4 جيجابايت من الذاكرة لبناء التطبيق وتشغيله بارتياح، خاصّةً إذا كانت واجهة Next.js الأمامية ضخمة. ثبّت Node.js 20 LTS وDocker وDocker Compose. أمّا من جهة قاعدة البيانات، فهيّئ MongoDB 7 أو PostgreSQL 16 بحسب المحوّل المختار (@payloadcms/db-mongodb أو @payloadcms/db-postgres). وجّه نطاقك نحو عنوان IP الخاص بخادم VPS. احسب 15 جيجابايت من القرص لـ node_modules وبناء .next والملفّات المرفوعة ونسخ قاعدة البيانات الاحتياطية.
النشر خطوة بخطوة
اختيار محوّل قاعدة البيانات وإعداده
في payload.config.ts، صرّح عن المحوّل: mongooseAdapter لـ MongoDB أو postgresAdapter لـ PostgreSQL، مع قراءة عنوان URL للاتصال من DATABASE_URI. هذا الاختيار بنيوي: يفرض PostgreSQL ترحيلات، وMongoDB أكثر مرونة بشأن المخطّط.
تحديد السرّ وبناء تطبيق Next.js
أدخِل PAYLOAD_SECRET (مفتاح تشفير الرموز) في البيئة. شغّل npm run build: بما أنّ Payload 3 يعيش داخل Next.js، يُصرّف هذا الأمر لوحة إدارة Payload وواجهتك الأمامية معًا. راقب الذاكرة أثناء البناء.
الحوسبة في حاوية باستخدام Docker Compose
أنشئ ملفّ Dockerfile بصورة node:20-alpine يبني التطبيق ويُشغّل npm start، ثمّ ملفّ docker-compose.yml يربط خدمة app بخدمة mongo أو postgres. ركّب وحدة تخزين للملفّات المرفوعة ومرّر DATABASE_URI وPAYLOAD_SECRET كمتغيّرات. شغّل docker compose up -d.
تنفيذ الترحيلات (PostgreSQL)
إذا كنت تستخدم محوّل PostgreSQL، فطبّق المخطّط باستخدام npm run payload migrate بعد بدء الحاويات. مع MongoDB، يُطبَّق المخطّط تلقائيًا، ولا حاجة إلى أيّ ترحيل يدوي.
إعداد Nginx كوكيل عكسي
وجّه مضيفًا افتراضيًا نحو http://127.0.0.1:3000 (المنفذ الافتراضي لـ Next.js). ارفع client_max_body_size لرفع الوسائط وأضف ترويسات X-Forwarded-Proto كي يُولّد Payload عناوين URL بـ HTTPS صحيحة.
التأمين باستخدام SSL وتحديد عنوان URL للخادم
شغّل certbot --nginx -d mydomain.com، ثمّ عيّن serverURL: 'https://mydomain.com' في payload.config.ts. يشترط هذا العنوان روابط الوسائط ورسائل إعادة التعيين وعمل لوحة الإدارة بشكل صحيح خلف الوكيل.
Payload CMS مقابل Strapi: أيّ نظام إدارة محتوى headless تستضيف ذاتيًا؟
| المعيار | Payload CMS | Strapi |
|---|---|---|
| نهج الإعداد | يعتمد الشيفرة أوّلًا بلغة TypeScript، مُصدَّر مع Git | يعتمد الواجهة الرسومية أوّلًا عبر Content-Type Builder |
| التكامل مع الواجهة الأمامية | أصلي داخل Next.js (بيئة تشغيل واحدة) | منفصل، الواجهة الأمامية ونظام إدارة المحتوى مستقلّان |
| قواعد البيانات المدعومة | MongoDB وPostgreSQL | PostgreSQL وMySQL وSQLite |
| كتابة الأنواع | TypeScript أصلي من طرف إلى طرف | أنواع مُولَّدة، تكامل أقلّ إحكامًا |
| الوصول إلى بيانات الخادم | Local API دون استدعاء HTTP | واجهة REST/GraphQL عبر HTTP |
| نمذجة المحتوى | في الشيفرة، بواسطة المطوّرين | في الواجهة، متاحة لغير المطوّرين |
| الذاكرة اللازمة للبناء | مرتفعة (بناء Next.js) | مرتفعة (بناء لوحة إدارة React) |
| مثالي لـ | فرق التطوير ومشاريع Next.js المكتوبة الأنواع | الفرق المختلطة والنمذجة المرئية |
استغلّ Local API الخاصة بـ Payload في مكوّنات خادم Next.js: بدلًا من استدعاء واجهة API الخاصة بك عبر fetch، استورد getPayload واستعلم قاعدة البيانات مباشرةً (payload.find({ collection: 'posts' })). تزيل بذلك ذهابًا وإيابًا عبر HTTP وتكسب في زمن الكمون كما في الأمان. أمّا للوسائط، فوصّل الإضافة @payloadcms/storage-s3 لتخزين الملفّات المرفوعة خارج خادم VPS، وأتمِت نسخًا يوميًا لقاعدة بياناتك عبر cron لضمان نسخ احتياطية خارج الخادم.