[{"data":1,"prerenderedAt":168},["ShallowReactive",2],{"seo-verification":3,"blog-نشر-تطبيق-strapi-على-خادم-vps-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":26,"intro":29,"sections":30,"ctaTitle":117,"ctaBody":118,"ctaButton":119,"ctaUrl":120,"relatedPosts":121},54,"نشر-تطبيق-strapi-على-خادم-vps",{"fr":10,"en":11,"ar":8},"deployer-strapi-vps","deploying-a-strapi-application-on-a-vps","نشر Strapi على خادم VPS: الدليل الكامل","انشر Strapi على خادم VPS مع Docker وPostgreSQL وNginx: ملفّ Dockerfile متعدد المراحل، وأسرار الإنتاج، وتخزين S3، ونسخ pg_dump، ومعالجة نفاد الذاكرة.",12,0,false,"2026-04-27T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},4,"التطوير","developpement","bg-warning\u002F10 text-warning","dev",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-strapi-vps-poster.svg","‏Strapi هو نظام إدارة المحتوى headless مفتوح المصدر المرجعي بلغة Node.js. واستضافته ذاتيًا على خادم VPS تمنحك الملكية الكاملة لمحتواك ولقاعدة بياناتك ولملفّاتك المرفوعة — دون حصص اشتراك، ودون اعتماد على Strapi Cloud، ودون منصّة طرف ثالث بين فرقك وبياناتك. يغطّي هذا الدليل النشر بالكامل: إنشاء المشروع، وملفّ Dockerfile متعدد المراحل، وملفّ docker-compose مع PostgreSQL، وأسرار الإنتاج، وNginx، وHTTPS، وتخزين S3، والنسخ الاحتياطية الآلية، والتحديثات دون أعطال.",[31,35,47,50,66,84,87,105,108,111,114],{"type":32,"title":33,"body":34},"h2","‏Strapi Cloud أو الاستضافة الذاتية: ما الذي تخسره وما الذي تكسبه","‏Strapi Cloud مريح للبدء، لكنّه يفرض قيودًا تصبح عائقًا سريعًا في الإنتاج الفعلي. تحدّ خطّة Free من أنواع المحتوى ومن المستخدمين الإداريين؛ وتحتسب الخطط المدفوعة الفاتورة على عدد طلبات API والملفّات المرفوعة. والأهمّ من ذلك أنّ بياناتك تقيم على البنية التحتية لشركة Strapi نفسها — وهو ما يتعارض مع متطلّبات توطين البيانات لدى كثير من العملاء (RGPD صارم، وعقود قطاعية، وبيانات حسّاسة). وبالاستضافة الذاتية على خادم VPS، تستعيد الملكية الكاملة لقاعدة بيانات PostgreSQL، وحرّية اختيار التخزين (قرص محلّي أو حاوية متوافقة مع S3)، وحرّية تثبيت أيّ إضافة من إضافات المجتمع، وأحجام محتوى لم تعد مرتبطة بجدول أسعار. المقابل تشغيلي — أنت من يتولّى التحديثات والنسخ الاحتياطية والمراقبة. ويريك هذا الدليل كيفية ذلك بالضبط.",{"type":36,"title":37,"items":38},"ul","فوائد الاستضافة الذاتية لـ Strapi على خادم VPS",[39,40,41,42,43,44,45,46],"**ملكية البيانات** — تبقى قاعدة بيانات PostgreSQL وملفّاتك المرفوعة على خادم VPS الخاص بك، تحت سيطرتك الحصرية","**لا حصص اشتراك** — لم يعد عدد المُدخلات وأنواع المحتوى وحسابات الإدارة محكومًا باشتراك، بل بموارد خادم VPS الخاص بك","**إضافات المجتمع** — تُثبَّت أيّ إضافة npm بحرّية، دون مصادقة من المنصّة ولا قائمة سماح","**‏API على نطاقك** — تُكشف واجهتا REST وGraphQL على `cms.your-domain.com`، دون وسيط ولا حدّ معدّل مفروض","**بنية موحّدة** — يتعايش Strapi وواجهة أمامية Nuxt أو Next.js على خادم VPS واحد، خلف وكيل عكسي وحيد","**توطين البيانات** — ضروري للامتثال لـ RGPD ولمتطلّبات عملائك التعاقدية","**تكلفة يمكن التنبّؤ بها** — للخادم VPS رسم شهري ثابت، مستقلّ عن حجم المحتوى أو حركة مرور API","**التحكّم في الترحيلات** — أنت من يختار متى وكيف تطبّق تحديثات Strapi",{"type":32,"title":48,"body":49},"المتطلّبات: العتاد والبرمجيات والنطاق","يستهلك Strapi موارد أكثر من معظم الأطر لأنّ **بناء لوحة إدارة React يستهلك وحده أكثر من 2 جيجابايت من الذاكرة**. وخادم VPS بذاكرة 1 جيجابايت سيفشل دائمًا بنفاد الذاكرة خلال مرحلة البناء — لا تختر حجمًا أقلّ ممّا يلزم. الحدّ الأدنى المستهدف: **معالجان افتراضيان و4 جيجابايت من الذاكرة**. وفي الإنتاج المستقرّ، بعد اكتمال البناء، يعمل التطبيق بارتياح بذاكرة تتراوح بين 512 ميجابايت و1 جيجابايت. على صعيد البرمجيات: Docker 24+ وDocker Compose الإصدار الثاني (`docker compose`، لا `docker-compose`)، وGit لجلب الكود على الخادم، وCertbot من أجل TLS. على صعيد قاعدة البيانات: يُنصح بـ PostgreSQL 16 في الإنتاج — فـ SQLite يؤدّي وظيفته في التطوير لكنّه محدود تحت الحمل المتزامن وغير متوافق مع بعض الإضافات. على صعيد الشبكة: وجّه `cms.your-domain.com` نحو عنوان IP الخاص بخادمك قبل البدء، وجهّز 20 جيجابايت من القرص كحدّ أدنى (node_modules، والملفّات المرفوعة، وتفريغات النسخ الاحتياطية).",{"type":51,"title":52,"steps":53},"steps","تجهيز المشروع قبل لمس الخادم",[54,57,60,63],{"title":55,"body":56},"إنشاء مشروع Strapi","على جهازك، أنشئ المشروع بالأمر الرسمي `npx create-strapi-app@latest my-cms --dbclient=postgres`. اختر TypeScript إن كان فريقك متمكّنًا منها. هيّئ مستودع Git وادفعه إلى منصّة الكود لديك، ثمّ انسخه على خادم VPS في `\u002Fsrv\u002Fmy-cms`. وكلّ ما يلي يُجهَّز في هذا المستودع لا على الخادم: يجب ألّا يتلقّى الخادم إلّا كودًا موضوعًا تحت إدارة الإصدارات.",{"title":58,"body":59},"ربط إعداد قاعدة البيانات بـ PostgreSQL","في `config\u002Fdatabase.js` — أو `config\u002Fdatabase.ts` مع TypeScript — تتلقّى الدالة المصدَّرة `env` وتُعيد كائن `connection`. صرّح بـ `client: 'postgres'`، ثمّ بستّة مفاتيح تُقرأ من البيئة داخل الكائن الفرعي `connection`: `host: env('DATABASE_HOST', '127.0.0.1')` و`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)`. والوسيط الثاني في `env()` ليس إلّا قيمة احتياطية للتطوير: لا يجوز أن ترد أيّ قيمة حقيقية في هذا الملفّ، فهو يذهب إلى Git.",{"title":61,"body":62},"إنشاء أسرار الإنتاج الخمسة","يرفض Strapi البدء في الإنتاج دون `APP_KEYS` و`API_TOKEN_SALT` و`ADMIN_JWT_SECRET` و`JWT_SECRET` و`TRANSFER_TOKEN_SALT`. أنشئ كلًّا منها بـ `openssl rand -base64 32`؛ ويتوقّع `APP_KEYS` أكثر من مفتاح، مفصولة بفواصل، فأنتج اثنين على الأقلّ. اكتبها في `\u002Fsrv\u002Fmy-cms\u002F.env` على خادم VPS — لا في Git أبدًا — مع `DATABASE_HOST` و`DATABASE_NAME` و`DATABASE_USERNAME` و`DATABASE_PASSWORD` و`NODE_ENV=production` و`URL=https:\u002F\u002Fcms.your-domain.com`. والمفتاح الناقص يُترجَم إلى رفض للبدء، لا إلى تحذير.",{"title":64,"body":65},"كتابة ملفّ Dockerfile متعدد المراحل","تكفي مرحلتان لإبقاء صورة الإنتاج خفيفة. تنطلق مرحلة `builder` من `node:20-alpine`، وتثبّت `WORKDIR \u002Fapp`، وتنسخ `package*.json`، وتشغّل `npm ci`، ثمّ تنسخ بقيّة الكود، وتصرّف لوحة الإدارة بـ `NODE_ENV=production npm run build`. وتنطلق مرحلة `runner` من الصورة الأساسية نفسها، ولا تنسخ من `builder` سوى ثلاثة أشياء: مجلّد البناء، و`node_modules`، و`package.json`. اختم بـ `EXPOSE 1337` وبتعليمة `CMD` تستدعي `npm run start` — فهو سكربت البدء الذي يثبّته Strapi، ولا تحاول تشغيل ملفّ خادم يدويًا. وإن مات البناء بنفاد الذاكرة، ضع `NODE_OPTIONS=--max-old-space-size=4096` قبل `npm run build`.",{"type":51,"title":67,"steps":68},"نشر المنظومة على خادم VPS",[69,72,75,78,81],{"title":70,"body":71},"وصف الخدمات في ملفّ docker-compose","يصرّح ملفّ `docker-compose.yml` عن خدمتين ووحدة تخزين مسمّاة. تستخدم خدمة `postgres` صورة `postgres:16-alpine`، وتتلقّى `POSTGRES_DB` و`POSTGRES_USER` و`POSTGRES_PASSWORD` في كتلة `environment` الخاصّة بها، وتركّب وحدة التخزين `pgdata` على `\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata`، وتعمل بـ `restart: unless-stopped`. أمّا خدمة `strapi` فتُبنى من ملفّ Dockerfile المحلّي بـ `build: .`، وتقرأ متغيّراتها عبر `env_file: .env`، وتصرّح بـ `depends_on: postgres`، وتركّب `.\u002Fpublic\u002Fuploads` على `\u002Fapp\u002Fpublic\u002Fuploads`، وتنشر منفذها بـ `ports: 127.0.0.1:1337:1337`. وهذا الربط على حلقة الاستدعاء المحلّية هو النقطة المهمّة: يصبح Nginx نقطة الدخول العامة الوحيدة، ولا يُكشف المنفذ 1337 إلى الخارج أبدًا. وتبقى خدمة `redis` اختيارية، لتخزين الجلسات مؤقّتًا أو لطوابير المعالجة.",{"title":73,"body":74},"بناء الصورة وتشغيل المنظومة","شغّل `docker compose build`، ثمّ `docker compose up -d`. وتابع الإقلاع بـ `docker compose logs -f strapi`. يطبّق Strapi ترحيلات المخطّط عند أوّل تشغيل ما دام `NODE_ENV=production` موضوعًا. احسب من دقيقتين إلى خمس دقائق: بناء لوحة إدارة React هو أبطأ خطوة بفارق كبير. وانتظر سطر `Strapi started successfully` قبل المتابعة.",{"title":76,"body":77},"وضع Nginx وكيلًا عكسيًا","أنشئ المضيف الافتراضي `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fcms.your-domain.com`. يستمع بـ `listen 80` على `server_name cms.your-domain.com`، ويحمل `client_max_body_size 50M` — وهو ضروري لرفع الوسائط — وكتلة `location \u002F` وحيدة تنفّذ `proxy_pass http:\u002F\u002F127.0.0.1:1337`. أضف إليه الترويسات الأربع التي يتوقّعها Strapi خلف وكيل: `Host` و`X-Real-IP` و`X-Forwarded-For` و`X-Forwarded-Proto`، كلٌّ منها موضوعة بتوجيه `proxy_set_header`. فعّل المضيف الافتراضي برابط رمزي نحو `sites-enabled`، ثمّ تحقّق وأعد التحميل بـ `nginx -t && systemctl reload nginx`.",{"title":79,"body":80},"تفعيل HTTPS وتثبيت المتغيّر URL","احصل على الشهادة بـ `certbot --nginx -d cms.your-domain.com`: يعيد Certbot كتابة المضيف الافتراضي لتحويل HTTP نحو HTTPS. وتحقّق بعد ذلك من ورود `URL=https:\u002F\u002Fcms.your-domain.com` في ملفّ `.env`، دون شرطة مائلة أخيرة. فهذا هو المتغيّر الذي يستخدمه Strapi لبناء روابط الوسائط وإعادة توجيهات لوحة الإدارة؛ ودونه تخرج الملفّات المرفوعة بعناوين خاطئة وتسيء لوحة الإدارة التصرّف خلف الوكيل. أعد تشغيل الحاوية بعد كلّ تعديل على `.env`: تُقرأ المتغيّرات عند الإقلاع.",{"title":82,"body":83},"التحقّق من أنّ النسخة تستجيب فعلًا","افتح `https:\u002F\u002Fcms.your-domain.com\u002Fadmin` وأنشئ أوّل حساب إداري — يطلبه Strapi عند أوّل وصول ولا يعود يطلبه. راقب بعد ذلك ثلاث نقاط: يُظهر `docker compose ps` الحاويتين في حالة `running`، وتستجيب الواجهة العامة على `\u002Fapi`، وينجح إرسال ملفّ تجريبي من مكتبة الوسائط. ويشير `502 Bad Gateway` في هذه المرحلة، في الغالب الأعمّ، إلى حاوية `strapi` متوقّفة أو ما تزال في طور البناء: أعد قراءة `docker compose logs strapi` قبل لمس Nginx.",{"type":32,"title":85,"body":86},"إخراج الوسائط من القرص: مزوّد S3","يضع Strapi الملفّات المرفوعة افتراضيًا في `public\u002Fuploads`، على قرص خادم VPS. ويجعلها تركيب `.\u002Fpublic\u002Fuploads` في ملفّ docker-compose تنجو من إعادة إنشاء الحاوية، لكنّها تكبر مع مكتبة الوسائط، وتدخل في كلّ نسخة احتياطية، وتختفي مع الخادم. ويحلّ المزوّد الرسمي المشكلات الثلاث: `npm install @strapi\u002Fprovider-upload-aws-s3`. صرّح به بعد ذلك في `config\u002Fplugins.js`، تحت المفتاح `upload` ثمّ `config`: `provider: 'aws-s3'` وكائن `providerOptions` يقرأ أربع قيم من البيئة — `accessKeyId: env('AWS_ACCESS_KEY_ID')` و`secretAccessKey: env('AWS_ACCESS_SECRET')` و`region: env('AWS_REGION')` و`params: { Bucket: env('AWS_BUCKET') }`. وأيّ تخزين متوافق مع S3 يفي بالغرض: Scaleway Object Storage أو Wasabi أو Cloudflare R2. وثمّة مطبّان يستحقّان المعرفة قبل التحويل. فالوسائط المرفوعة سابقًا لا تنتقل وحدها — حوّل المزوّد قبل الإطلاق، أو انسخ محتوى `public\u002Fuploads` إلى الحاوية يدويًا. وتتغيّر نطاقات روابط الوسائط: إن كانت واجهتك الأمامية تخزّنها مؤقّتًا أو تعيد كتابتها، فتحقّق من ذلك بعد التحويل.",{"type":51,"title":88,"steps":89},"أتمتة النسخ الاحتياطي لقاعدة البيانات",[90,93,96,99,102],{"title":91,"body":92},"إنشاء مجلّد الوجهة","على خادم VPS، `mkdir -p \u002Fsrv\u002Fbackups\u002Fstrapi`. أبقِ هذا المجلّد خارج مستودع Git وخارج أيّ مسار مركّب في حاوية: يجب ألّا يذهب التفريغ في صورة ولا في إصدار.",{"title":94,"body":95},"تحديد الاسم الحقيقي لحاوية PostgreSQL","يعطي `docker compose ps` الاسم الدقيق، على صيغة `my-cms-postgres-1`. وهو مشتقّ من اسم مجلّد المشروع: لا تنسخه من دليل، بل اقرأه على جهازك. وسكربت النسخ الاحتياطي الذي يستهدف حاوية غير موجودة يفشل بصمت بمجرّد وضعه في cron.",{"title":97,"body":98},"كتابة أمر التفريغ","يكفي سطر واحد: `docker exec my-cms-postgres-1 pg_dump -U strapi strapi | gzip > \u002Fsrv\u002Fbackups\u002Fstrapi\u002Fstrapi-$(date +%Y%m%d).sql.gz`. ينفَّذ `pg_dump` داخل الحاوية، ويجري الضغط والكتابة على المضيف. شغّله مرّة أولى يدويًا وتحقّق من حجم الملفّ الناتج: تفريغ بحجم بضعة بايتات يشير إلى خطأ مصادقة ابتلعته الأنبوبة.",{"title":100,"body":101},"تنظيف التفريغات القديمة","أضف بعده `find \u002Fsrv\u002Fbackups\u002Fstrapi -name '*.sql.gz' -mtime +7 -delete`. ودون هذا السطر يمتلئ القرص في أسابيع قليلة: وهو أكثر أعطال النسخ الاحتياطي اليومي شيوعًا — تسقط القاعدة لأنّ النسخ الاحتياطي أشبع وحدة التخزين.",{"title":103,"body":104},"الجدولة، ثمّ إخراج التفريغات من الخادم","ضع الأمرين في سكربت `\u002Fetc\u002Fcron.daily\u002Fstrapi-backup`، مع `#!\u002Fbin\u002Fbash` في السطر الأوّل ومع `chmod +x` لجعله قابلًا للتنفيذ. أضف إليه `rsync` نحو تخزين خارجي، أو إرسالًا نحو حاوية S3 نفسها المستعملة للوسائط. والنسخة الاحتياطية التي تبقى على الجهاز الذي تحميه لا تحمي من شيء؛ فاختبر استعادة كاملة مرّة واحدة على الأقلّ قبل الاعتماد عليها.",{"type":32,"title":106,"body":107},"تحديث Strapi دون كسر الترحيلات","يُدار التحديث من المستودع لا على الخادم: غيّر الإصدار في `package.json`، وادفع، ثمّ على خادم VPS تابع بـ `git pull` و`docker compose build && docker compose up -d`. يكتشف Strapi ترحيلات المخطّط ويطبّقها عند الإقلاع ما دام `NODE_ENV=production` موضوعًا؛ أكّد ذلك بـ `docker compose logs strapi | grep -i migrat`. وثلاثة احتياطات تستحقّ العناء. خذ `pg_dump` قبيل رفع الإصدار مباشرةً، لا نسخة الليلة السابقة فحسب — فالترحيل الفاشل يُصلَح باستعادة، لا بمحاولة ثانية. واقرأ ملاحظات إصدار الإضافات التي ثبّتها: فترقية كبرى لـ Strapi تكسر إضافة مجتمعية أكثر ممّا تكسر النواة نفسها. وأخيرًا، إن فشل ترحيل فلا تعد تشغيل المنظومة في حلقة: كلّ إعادة تشغيل تعيد تنفيذ الترحيل نفسه على قاعدة عُدّل نصفها. أوقف الحاويات، واقرأ السجلّ كاملًا، واستعد التفريغ عند اللزوم، ثمّ صحّح.",{"type":32,"title":109,"body":110},"استكشاف الأخطاء: أكثر الأعطال شيوعًا","**نفاد الذاكرة خلال البناء (`Killed` أو `JavaScript heap out of memory`)**: بناء لوحة إدارة React يتخطّى الذاكرة المتاحة. وثمّة علاجان — إضافة `NODE_OPTIONS=--max-old-space-size=4096` في مرحلة `builder` من ملفّ Dockerfile، أو زيادة مساحة التبديل في خادم VPS مؤقّتًا بـ `fallocate -l 2G \u002Fswapfile` و`chmod 600 \u002Fswapfile` و`mkswap \u002Fswapfile` ثمّ `swapon \u002Fswapfile`. وإن ظلّ الخادم عالقًا، فابنِ الصورة على جهاز أقوى وادفعها إلى سجلّ صور.\n\n**`Cannot find module @strapi\u002Fplugin-*`**: لا تشارك أبدًا مجلّد `node_modules` بين بيئة تطوير محلّية وصورة الإنتاج عبر وحدة تخزين Docker. فـ `node_modules` المحلّي مصرَّف لنظام تشغيلك، لا لنظام Alpine Linux الخاصّ بالحاوية. أزل أيّ وحدة تخزين `node_modules` من ملفّ docker-compose، ودع `npm ci` الخاصّ بملفّ Dockerfile يتولّى الأمر.\n\n**`URL mismatch` في لوحة الإدارة، أو وسائط بمسار نسبي**: يجب أن يطابق متغيّر `URL` في ملفّ `.env` عنوان Strapi العام على HTTPS تمامًا، دون شرطة مائلة أخيرة. وأيّ تباين يكسر روابط الوسائط المرفوعة ويسبّب أخطاء CORS في لوحة الإدارة.\n\n**`413 Request Entity Too Large`**: توجيه `client_max_body_size` في Nginx منخفض أكثر ممّا يجب. ارفعه إلى `50M` كحدّ أدنى، أو إلى `100M` إن كنت ترفع مقاطع فيديو، ثمّ أعد تحميل Nginx.\n\n**`password authentication failed for user` عند الإقلاع**: تغيّرت كلمة المرور في ملفّ `.env` بعد إنشاء وحدة التخزين `pgdata`. ولا يعيد PostgreSQL قراءة كلمة مروره إلّا عند تهيئة وحدة التخزين؛ فواءم ملفّ `.env` مع كلمة المرور القائمة، أو انطلق من وحدة تخزين جديدة بعد أخذ نسخة احتياطية من القاعدة.",{"type":112,"body":113},"tip","ثلاث قواعد غير قابلة للتفاوض لنسخة Strapi في الإنتاج: **‏S3 للملفّات المرفوعة** (`@strapi\u002Fprovider-upload-aws-s3`) — تبقى وسائطك بعد أيّ إعادة إنشاء للحاوية ولا تضخّم قرص خادم VPS؛ **‏`pg_dump` يومي آلي** منسوخ خارج الخادم — فالنسخة الاحتياطية المحلّية وحدها تختفي مع خادم VPS؛ **‏`NODE_ENV=production` حتمًا** — يعيد وضع التطوير تصريف لوحة الإدارة أثناء التشغيل، ويكشف Content-Type Builder، ويعطّل تحسينات التخزين المؤقّت، وهو ما يجب تجنّبه في الإنتاج.",{"type":32,"title":115,"body":116},"‏Strapi وواجهة أمامية Nuxt أو Next.js على خادم VPS واحد","من الممكن تمامًا استضافة Strapi وواجهة أمامية على خادم VPS واحد، بشرط توفّر ذاكرة كافية — احسب 8 جيجابايت لكليهما، إذ قد ينطلق البناءان في اللحظة نفسها. وتستخدم البنية الأبسط Nginx موزّعًا: تُوكَّل الطلبات المتّجهة نحو `cms.your-domain.com` إلى المنفذ `1337` (Strapi)، وتلك المتّجهة نحو `your-domain.com` إلى المنفذ `3000` (Nuxt أو Next.js). ويكشف Strapi واجهة REST الخاصّة به على `\u002Fapi` — وتستهلكها الواجهة الأمامية مباشرةً على شبكة Docker الداخلية، دون المرور من جديد بـ Nginx، ممّا يقلّل زمن الاستجابة. وإن كانت واجهتك الأمامية تولّد صفحات ساكنة (`nuxt generate`، أو `next build` بتصدير ساكن)، فبإمكان Nginx خدمة الملفّات من القرص وتوكيل المسارات الديناميكية وحدها. وهذه البنية الأحادية مثالية لمشروع متوسّط الحجم — خادم واحد، وشهادة TLS واحدة، ونقطة إشراف واحدة. وإن فضّلت فصل الواجهة الأمامية، فأدلّتنا لنشر Nuxt وNode.js تعيد المنهج نفسه على خادم VPS Cloud ثانٍ مهيّأ للبناء.","استضف نظام Strapi الخاص بك باستقلالية تامّة","يوفّر خادم VPS Cloud من ServOrbit الذاكرة اللازمة لبناء لوحة إدارة Strapi وبيئة Docker + PostgreSQL جاهزة للاستخدام، للحفاظ على الملكية الكاملة لمحتواك وبياناتك.","اكتشف خادم VPS Cloud","\u002Fvps-cloud",[122,137,153],{"id":123,"slug":124,"slugs":125,"title":128,"excerpt":129,"readTime":19,"views":15,"isPinned":16,"publishedAt":130,"category":131,"categories":132,"featuredImage":26,"bgImage":27,"posterImage":134,"relatedSolution":135},5,"نشر-laravel-على-خادم-vps-دليل-الإنتاج",{"fr":126,"en":127,"ar":124},"deployer-laravel-vps","deploying-laravel-on-a-vps-a-production-guide","نشر Laravel على خادم VPS: دليل الإنتاج","انقل Laravel إلى بيئة الإنتاج على خادم VPS: PHP وworkers والذاكرة المؤقتة وقاعدة البيانات وreverse proxy وHTTPS مُهيّأة بشكل نظيف.","2026-02-09T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[133],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fdeployer-laravel-vps-poster.svg",{"categorySlug":23,"appSlug":136},"laravel-stack",{"id":138,"slug":139,"slugs":140,"title":143,"excerpt":144,"readTime":145,"views":15,"isPinned":16,"publishedAt":146,"category":147,"categories":148,"featuredImage":26,"bgImage":27,"posterImage":150,"relatedSolution":151},43,"نشر-تطبيق-nodejs-على-vps",{"fr":141,"en":142,"ar":139},"deployer-nodejs-vps","deploy-a-nodejs-application-on-a-vps","نشر تطبيق Node.js على VPS","انشر تطبيق Node.js في بيئة الإنتاج على VPS: PM2 وبروكسي عكسي Nginx وشهادة SSL من Let's Encrypt وبدء تشغيل تلقائي عند الإقلاع.",3,"2026-05-08T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[149],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":20,"appSlug":152},"nodejs-stack",{"id":154,"slug":155,"slugs":156,"title":159,"excerpt":160,"readTime":145,"views":15,"isPinned":16,"publishedAt":161,"category":162,"categories":163,"featuredImage":26,"bgImage":27,"posterImage":165,"relatedSolution":166},44,"نشر-تطبيق-django-على-vps",{"fr":157,"en":158,"ar":155},"deployer-django-vps","deploy-a-django-application-on-a-vps","نشر تطبيق Django على VPS","انشر Django على VPS: Gunicorn وNginx وPostgreSQL وDocker وSSL. دليل كامل لمطوّري Python الراغبين في الاستضافة الذاتية.","2026-05-07T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[164],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":20,"appSlug":167},"django",1787580957431]