🐳 دليل النشر الكامل عبر Docker Compose
دليل عملي وتفصيلي لنشر منظومة Loomix بجميع خدماتها العشر على خادم إنتاجي افتراضي (VPS) بنقرة واحدة وبأعلى معايير الأمان والاستقرار.
1. المتطلبات الأساسية للخادم (Prerequisites)
قبل البدء، تأكد من توفر خادم افتراضي يعمل بنظام Linux (يوصى بـ Ubuntu 22.04 LTS أو 24.04 LTS) مع المواصفات التالية:
- الحد الأدنى للذاكرة العشوائية: 4GB RAM مع تفعيل ذاكرة Swap بحجم 4GB على الأقل (أو 8GB RAM للأداء الأمثل).
- المعالج: 2 vCPU كحد أدنى (يوصى بـ 4 vCPU لعمليات البناء السريعة).
صلاحيات الوصول إلى مقبس Docker (Docker Socket)
تأكد من تثبيت Docker و Docker Compose وإضافة المستخدم الحالي إلى مجموعة docker.
sudo usermod -aG docker $USERnewgrp docker # or log out and SSH back indocker ps # should work without sudo2. نقل كود المشروع إلى الخادم
يمكنك نقل ملفات المشروع إلى الخادم بإحدى الطريقتين التاليتين:
الطريقة الأولى: الاستنساخ المباشر عبر Git (الموصى بها)
تأمين المستودع والملفات الحساسة
git clone https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>الاستنساخ من المستودع الخاص عبر مفاتيح SSH
- 1. أنشئ زوج مفاتيح SSH على الخادم: ssh-keygen -t ed25519
- 2. اعرض المفتاح العام وانسخه: cat ~/.ssh/id_ed25519.pub
- 3. أضف المفتاح العام إلى Deploy Keys في مستودع GitHub الخاص بك.
- 4. استنسخ المستودع مباشرة عبر SSH.
git clone git@github.com:<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>الاستنساخ باستخدام رمز الوصول الشخصي (Personal Access Token)
git clone https://<YOUR_GITHUB_USERNAME>:<PERSONAL_ACCESS_TOKEN>@github.com/<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>الطريقة الثانية: الرفع اليدوي لملف الأرشيف (ZIP / Tarball)
إذا قمت بتنزيل ملف الأرشيف، يمكنك نقله وفك ضغطه على الخادم:
rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.next' ./ user@your_vps_ip:/root/next-strapi-medusa3. معالج التثبيت والتهيئة التلقائي (Quick Setup Wizard)
لتسهيل عملية النشر، وفرنا سكريبت الإعداد الشامل server-setup.sh الذي يتولى تهيئة Swap، فحص المنافذ، وتثبيت الحاويات خطوة بخطوة:
chmod +x server-setup.shbash server-setup.shنصيحة احترافية:
4. اختيار ملف النشر المناسب (Deployment Profiles)
يدعم النظام 3 ملفات تعريفية للنشر (Profiles) تناسب مختلف البيئات من التطوير المحلي إلى الإنتاج الضخم:
هل تحتاج إلى اسم نطاق (Domain Name) مخصص؟
يستخدم خادماً واحداً (Single VPS) مع نطاقات فرعية تلقائية أو نطاقك الخاص، مع بوابة Caddy وشهادات SSL مجانية.
خطوات تفعيل الملف B:
- 1. عيّن سجلات DNS (A Records) لنطاقاتك لتشير إلى عنوان IP الخادم.
- 2. اختر الملف B أثناء تشغيل معالج server-setup.sh.
- 3. أدخل نطاقك الأساسي (مثل yourdomain.com).
- 4. سيتولى Caddy استخراج شهادات SSL تلقائياً لجميع الخدمات العشر.
- 5. جميع لوحات الإدارة ستكون مفعلة ومحمية ببروتوكول HTTPS.
# Profile B: VM / LAN HTTPS (.local hostnames) - Recommended ★ STOREFRONT_PUBLIC_URL=https://store.localMEDUSA_BACKEND_PUBLIC_URL=https://api.localSTRAPI_PUBLIC_URL=https://admin.localMEILISEARCH_PUBLIC_URL=https://search.localMINIO_PUBLIC_URL=https://api.local/minio/mystoreGOOGLE_CALLBACK_URL=https://store.local/ir/account/auth/callback STOREFRONT_URL=http://storefront:8000MEDUSA_NODE_ENV=productionMEDUSA_ALLOW_HTTP_COOKIES=falseCLOUDFLARE_TUNNEL_TOKEN=• المتجر:
https://yourdomain.com• Medusa:
https://api.yourdomain.com/app• Strapi:
https://admin.yourdomain.com/admin• Umami:
https://analytics.yourdomain.com• OpenObserve:
https://monitor.yourdomain.comحماية الواجهة عبر Cloudflare Edge Hardening
قبل توجيه الـ DNS إلى Cloudflare:
تأكد من ضبط SSL في Cloudflare على وضع Full (Strict) لمنع حلقات إعادة التوجيه اللانهائية (Redirect Loops) مع شهادات Caddy الداخلية.
إعدادات Cloudflare بعد تشغيل البيئة:
• وضع تشفير SSL/TLS: اضبطه على Full (Strict).
• تفعيل WebSockets: مفعّل افتراضياً في Cloudflare لضمان عمل واجهة Next.js الحية.
مصادقة HTTP الأساسية وحماية حافة Caddy:
• لوحة إدارة Strapi (admin.yourdomain.com/admin): محمية تلقائياً بمصادقة Basic Auth إضافية لمنع محاولات التسلل والتخمين.
docker run --rm caddy:latest caddy hash-password --plaintext "your_secret_password"مصفوفة العناوين والمنافذ حسب ملف النشر
| الخدمة | الملف A (محلي) | الملف B (خادم واحد) | الملف C (مؤسسي) |
|---|---|---|---|
| متجر Next.js | http://<VM_IP>:8000 | https://store.local | https://yourdomain.com |
| الواجهة الخلفية لـ Medusa | http://<VM_IP>:9000/app | https://api.local/app | https://api.yourdomain.com/app |
| لوحة إدارة Strapi CMS | http://<VM_IP>:1337/admin | https://admin.local/admin | https://admin.yourdomain.com/admin |
| تحليلات Umami | http://<VM_IP>:3005 | https://analytics.local | https://analytics.yourdomain.com |
| مراقبة OpenObserve | http://<VM_IP>:5080 | https://monitor.local | https://monitor.yourdomain.com |
| محرك البحث Meilisearch | 127.0.0.1:7700 | https://search.local | https://search.yourdomain.com |
دلالة كل رابط عام في ملف .env:
STOREFRONT_PUBLIC_URL: واجهة متجر Next.js (المنفذ 8000 أو الرابط العام).MEDUSA_BACKEND_PUBLIC_URL: واجهة برمجة Medusa ولوحة الإدارة.STRAPI_PUBLIC_URL: لوحة إدارة Strapi CMS ومعاينة الكتل.MEILISEARCH_PUBLIC_URL: رابط محرك البحث العام للواجهة.MINIO_PUBLIC_URL: الرابط العام للملفات والوسائط المرفوعة.STOREFRONT_URL: رابط داخلي فقط داخل شبكة Docker (http://storefront:3000).
المتغيرات الإلزامية قبل بدء المرحلة 1:
• المفاتيح السرية (openssl rand -hex 32): توليد مفاتيح عشوائية لكل من JWT ومفاتيح تشفير قواعد البيانات.
اترك هذه المتغيرات فارغة حتى تصل لمرحلتها المخصصة:
• المرحلة 4: STRAPI_API_TOKEN_FOR_MEDUSA و STRAPI_API_TOKEN_FOR_FRONT.
• المرحلة 6: NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY.
قاعدة لوحة تحكم Medusa: حافظ دائماً على قيمة MEDUSA_ADMIN_ONBOARDING_TYPE بالشكل الافتراضي.
5. أتمتة البناء والنشر عبر GitHub Actions CI/CD
يتضمن المشروع خطوط أنابيب GitHub Actions جاهزة لبناء صور Docker ودفعها إلى سجل الحاويات ونشرها تلقائياً على خادمك:
- أضف الأسرار التالية إلى إعدادات المستودع (Repository Secrets): SERVER_HOST و SERVER_USER و SSH_PRIVATE_KEY.
- عند الدفع إلى الفرع الرئيسي (main branch)، يتم بناء حاوية Next.js وحاوية Medusa واختبارهما تلقائياً.
- يتم إرسال إشعار تحديث للخادم وتشغيل docker compose pull و up -d لإعادة التشغيل بدون توقف (Zero-Downtime Deployment).
- 4. (مستودع خاص) قم بإنشاء رمز وصول شخصي GitHub Personal Access Token (Classic) بصلاحيات read:packages لتسجيل الدخول إلى GHCR على الخادم.
echo "<YOUR_PAT>" | docker login ghcr.io -u <YOUR_GITHUB_USERNAME> --password-stdinمراحل النشر التفصيلية (Phases 1-10)
| المرحلة | الخدمات التي يتم تشغيلها | الملف A | الملف B / C (الإنتاج والشبكة المحلية) |
|---|---|---|---|
| المرحلة 1: | قواعد البيانات والبنية الأساسية (Postgres, Redis, MinIO, Meilisearch) | ✅ | ✅ |
| المرحلة 2: | خادم Caddy العكسي والشهادات التلقائية | • تخطٍّ (غير مطلوب في الملف A) | • تشغيل فوري بعد المرحلة 1 وقبل Strapi |
| المرحلة 3: | محرك Strapi CMS (سحب الصورة من GHCR) | ✅ | ✅ |
| المرحلة 4: | توليد توكنات Stra API وحفظها في .env | ✅ | ✅ |
| المرحلة 5: | الخلفية التجارية Medusa 2.0 (سحب الصورة من GHCR) | ✅ | ✅ |
| المرحلة 6: | توليد مفتاح Medusa القابل للنشر وحفظه في .env | ✅ | ✅ |
| المرحلة 7: | استخراج مفتاح البحث العام لـ Meilisearch | ✅ | ✅ |
| المرحلة 8: | تحليلات Umami المستقلة (قبل تشغيل المتجر) | اختياري | ✅ |
| المرحلة 9: | واجهة المتجر Next.js (بناء ونشر عبر GitHub Actions) | ✅ | ✅ |
| المرحلة 10: | منظومة المراقبة وسجلات التشغيل (OpenObserve, Vector, cAdvisor) | اختياري | موصى به |
المرحلة 1: تشغيل قواعد البيانات (PostgreSQL و Redis)
تشغيل حاويات قاعدة بيانات PostgreSQL المشتركة مع قواعد بيانات منفصلة لكل من Medusa وStrapi وUmami، بالإضافة إلى خادم Redis للجلسات والتخزين المؤقت.
docker compose up -d postgres redis meilisearch minio minio-setupانتظر حتى تصبح جميع الخدمات في حالة صحية ممتازة: docker compose ps
المرحلة 2: تشغيل بوابة Caddy وإعداد شهادات SSL
تشغيل بوابة Caddy العكسية للتوجيه التلقائي واستخراج وتجديد شهادات Let's Encrypt مجاناً لجميع النطاقات.
docker compose up -d caddydocker compose logs -f caddyتكوين ملف hosts في Windows للملف B:
افتح الملف C:\Windows\System32\drivers\etc\hosts بصلاحيات مدير النظام (Administrator) وأضف النطاقات المحلية.
المرحلة 3: تشغيل Strapi CMS v5
سحب وتشغيل حاوية Strapi CMS، وانتظار اكتمال بناء الإدارة وجاهزية المنفذ الداخلي 1337.
docker compose pull strapidocker compose up -d strapidocker compose logs -f strapiانتظر حتى يستمع الخادم على المنفذ 1337 وتظهر رسالة جاهزية Strapi في السجلات.
المرحلة 4: استخراج وتعيين رموز Strapi API Tokens
توليد الرموز المميزة (API Tokens) المطلوبة للواجهة الأمامية وتعيينها تلقائياً في ملف .env ليتمكن Next.js من قراءة كتل الصفحة الرئيسية.
- يتم تشغيل سكريبت strapi-token-init.js لاستخراج التوكن عبر بيئة Node.js الداخلية.
- تُحفظ قيمة STRAPI_API_TOKEN في ملف .env ويُعاد تحميل متغيرات البيئة.
- 3. لواجهة المتجر (
STRAPI_API_TOKEN_FOR_FRONT): أنشئ توكناً بنوع Read-Only وانسخ القيمة إلى .env.
المرحلة 5: تشغيل محرك MedusaJS v2
تشغيل حاوية Medusa، وتنفيذ ترحيلات قاعدة البيانات (Database Migrations)، وإنشاء حساب المسؤول الأول.
docker compose pull medusadocker compose up -d medusadocker compose logs -f medusaخطوات التشغيل التلقائي الأول: ترحيل قواعد البيانات db:migrate (يستغرق 2 إلى 5 دقائق حسب سرعة الخادم).
المرحلة 6: إنشاء مفاتيح النشر وقنوات البيع لـ Medusa
استخراج مفتاح النشر (Publishable API Key) وربطه بقناة البيع الافتراضية (Default Sales Channel) لتمكين الواجهة من قراءة المنتجات وسلات الشراء.
- تشغيل أمر medusa user وإنشاء مستخدم المشرف بصلاحيات كاملة.
- إنشاء مفتاح publishable وتخزينه في متغير NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY.
- 3. هام جداً: افتح المفتاح وتوجه إلى Sales Channels واربط قناة المبيعات الافتراضية بالمفتاح.
المرحلة 7: تشغيل محرك البحث Meilisearch
تشغيل حاوية Meilisearch وضبط مفتاح الأمان (Master Key) وفهرسة المنتجات والتصنيفات للبحث فائق السرعة.
curl -H "Authorization: Bearer <MEILI_MASTER_KEY>" http://127.0.0.1:7700/keysانسخ Default Search API Key وضعه في متغير NEXT_PUBLIC_MEILISEARCH_SEARCH_KEY.
المرحلة 8: تشغيل تحليلات Umami
تشغيل منصة تحليلات Umami المعتمدة على الخصوصية، وإنشاء موقع المتجر وتضمين معرف الويب (Website ID) في الواجهة.
docker compose up -d umamiافتح لوحة Umami (الملف B: https://analytics.local، الملف C: نطاقك العام) وأنشئ معرف الموقع Website ID.
المرحلة 9: تشغيل واجهة Next.js 16 Storefront
سحب صورة واجهة المتجر وربطها بكافة الخدمات الجاهزة والتأكد من إمكانية الوصول إلى الصفحة الرئيسية بنجاح.
1. وسائط البناء ومفاتيح الـ API:
تضمين متغيرات البيئة العامة مثل مفتاح Medusa ومسار Strapi أثناء البناء.
1. STOREFRONT_BUILD_ARGS (متغيرات وقت البناء)
تحتوي على متغيرات بيئة Next.js العامة. انسخ القالب أعلاه وضع روابط خادمك.
MEDUSA_BACKEND_URL=http://medusa:9000NEXT_PUBLIC_MEDUSA_BACKEND_URL=https://api.yourdomain.comNEXT_PUBLIC_STRAPI_URL=https://admin.yourdomain.comNEXT_PUBLIC_BASE_URL=https://store.yourdomain.comNEXT_PUBLIC_MEILISEARCH_HOST=https://search.yourdomain.comNEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_...NEXT_PUBLIC_MEILISEARCH_SEARCH_KEY=...NEXT_PUBLIC_UMAMI_WEBSITE_ID=...NEXT_PUBLIC_DEFAULT_REGION=USDEFAULT_LOCALE=en-USNEXT_PUBLIC_MEILISEARCH_INDEX_NAME=productsNEXT_PUBLIC_ENABLE_IRAN_FEATURES=false2. رابط السجل (REGISTRY_URL)
رابط سجل الكتل المعيارية. القيمة الافتراضية: سجل Loomix Blocks العام.
3. GITHUB_PAT (اختياري)
رمز وصول شخصي على GitHub بصلاحيات repo في حال استخدام مستودع خاص.
4. مسار النشر على الخادم (DEPLOY_PATH)
المسار المطلق لمجلد المشروع على خادم Linux VPS الخاص بك (مثال: /home/ubuntu/loomix).
2. بناء الصورة بحجم فائق الصغر:
استخدام ميزة Standalone Output في Next.js لتقليل حجم الحاوية لأقل من 150MB.
3. فحص الجاهزية واستقرار الشبكة:
التحقق من استجابة المنفذ 8000 وربطه ببوابة Caddy عبر الشبكة الداخلية.
4. تشغيل الواجهة الإنتاجية:
docker compose pull storefrontdocker compose up -d storefrontالمرحلة 10: منظومة المراقبة والتحليل (OpenObserve & Vector)
تشغيل وكيل جمع السجلات Vector ومحرك OpenObserve لمراقبة أداء الحاويات، استهلاك الذاكرة، وأخطاء السيرفر لحظياً.
docker compose up -d openobserve vector cadvisor docker-stats-exporterلوحة مؤشرات OpenObserve المركزية:
افتح https://monitor.yourdomain.com (الملف C) أو https://monitor.local (الملف B).
قنوات القياس والسجلات المجمعة:
docker_logs: سجلات مجمعة لحاويات Docker العشر مع إمكانية البحث النصي الفوري.
caddy_access: حركة زيارات الويب الحية، عناوين IP، وأكواد استجابة HTTP ومعدل الطلبات.
docker_stats: استهلاك الذاكرة والمعالج لكل حاوية في الوقت الفعلي عبر cAdvisor.
host_metrics: استهلاك موارد الخادم الشاملة، مساحة التخزين، وحمل المعالج العام.
تنبيهات الأخطاء الفورية على تيليجرام:
في لوحة OpenObserve، توجه إلى Alerts وأضف Webhook بوت تيليجرام لتلقي التنبيهات الفورية عند حدوث أي خطأ 500.
6. مزامنة البيانات الأولية بين Medusa و Strapi
يتضمن النظام سكريبت مزامنة يقرأ المنتجات والتصنيفات من Medusa وينشئ الكتل المتطابقة لها في Strapi تلقائياً.
تشغيل سكريبت المزامنة الأولي:
شغّل الأمر التالي داخل حاوية Strapi لإنشاء الصفحة الرئيسية الافتراضية والكتل الجاهزة فوراً:
2. مزامنة كتل Loomix المعيارية (sync-loom-component.js)
في لوحة تحكم Strapi Storefront Management، يؤدي النقر على زر المزامنة إلى جلب أحدث الأنماط وتفعيلها.
المتغيرات البيئية لمزامنة الإنتاج:
ضع هذه المتغيرات في ملف website-admin/.env وملف .env الرئيسي للخادم.
GITHUB_DEPLOY_TOKEN=ghp_your_personal_access_token # Requires 'repo' and 'workflow' scopesGITHUB_DEPLOY_REPO=your_username/your_repo_name7. التبديل بين ملفات النشر وتحديث البيئة
إذا أردت الانتقال من الملف A إلى الملف B أو تغيير أسماء النطاقات، اتبع الجدول التالي للخطوات المطلوبة:
| نوع التغيير | الخدمات المطلوب إعادة تشغيلها |
|---|---|
| تعديل الروابط العامة في .env | إعادة تشغيل Strapi وMedusa والواجهة (إطلاق بناء GitHub Actions أولاً) |
| تغيير إعداد MEDUSA_ALLOW_HTTP_COOKIES | إعادة تشغيل حاوية Medusa فقط |
| إضافة Caddy (الانتقال من A إلى B) | تشغيل Caddy (docker compose up -d caddy) وسحب الصور الجديدة |
| تعديل ملف hosts المحلي (الملف B) | لا يتطلب أي تعديل على الخادم — تعديل ملف hosts في جهازك فقط |
# 1. Edit .env — switch to Profile B URLs, set MEDUSA_ALLOW_HTTP_COOKIES=falsenano .env # 2. Add hosts entry on Windows # 3. Start Caddydocker compose up -d caddy # 4. Pull new images:docker compose pull strapi medusa && docker compose up -d strapi medusa8. ترقية وتحديث الخدمات إلى أحدث إصدار
لتحديث جميع الحاويات إلى أحدث الصور دون فقدان أي بيانات من قواعد البيانات، شغّل سكريبت التحديث التلقائي server-update.sh.
9. الأوامر المساعدة للإدارة السريعة
أوامر Docker مفيدة لمراقبة السجلات، إعادة التشغيل، والنسخ الاحتياطي السريع:
./setup.sh # On Linux / macOS.\setup.bat # On Windows10. خريطة الشبكة الداخلية والمنافذ
المنافذ الداخلية بين الخدمات (Internal Bridge Network):
- واجهة المتجر Storefront: :8000
- خادم Medusa API ولوحة الإدارة: :9000
- نظام إدارة المحتوى Strapi CMS: :1337
- محرك البحث Meilisearch: :7700
- لوحة تحكم تخزين MinIO: :9001
- منصة التحليلات Umami: :3005
- مراقبة الأداء OpenObserve: :5080
أسماء النطاقات المعالجة بواسطة Caddy:
- https://store.local -> storefront:8000
- https://api.local -> medusa:9000
- https://admin.local -> strapi:1337
- https://analytics.local -> umami:3000
- https://monitor.local -> openobserve:5080
- https://api.local/minio/ -> minio:9000
عزل الحاويات وشبكة loomix-network الخاصة:
تتواصل الحاويات داخلياً بأسماء الخدمات المعيارية (مثل http://medusa:9000 و http://postgres:5432).
ملخص أهم أوامر الإدارة
docker compose psdocker compose logs -f medusadocker compose logs -f strapidocker compose logs -f storefrontdocker compose logs -f openobservedocker builder prune -fdocker system prune -fdocker compose downdocker compose up -d